diff --git a/dist/decorators/reactive.d.ts.map b/dist/decorators/reactive.d.ts.map index 2688b82..a853d2e 100644 --- a/dist/decorators/reactive.d.ts.map +++ b/dist/decorators/reactive.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../../src/decorators/reactive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAA;AAahE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB,GAAG,SAAS,GAAG,GAAG,CA+D/F"} \ No newline at end of file +{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../../src/decorators/reactive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAA;AAOhE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB,GAAG,SAAS,GAAG,GAAG,CAkD/F"} \ No newline at end of file diff --git a/dist/decorators/reactive.js b/dist/decorators/reactive.js index 0512115..e1df740 100644 --- a/dist/decorators/reactive.js +++ b/dist/decorators/reactive.js @@ -1,12 +1,6 @@ import { getListener, $PROXY, untrack } from 'solid-js'; -import { getKey, getPropsToSignalify, resetPropsToSignalify } from './signal.js'; -import { getCreateSignalAccessor } from '../signalify.js'; - -/** - * Access key for classy-solid private internal APIs. - */ -const accessKey = getKey(); -const createSignalAccessor = getCreateSignalAccessor(); +import { __propsToSignalify, __resetPropsToSignalify } from './signal.js'; +import { __createSignalAccessor } from '../signalify.js'; const hasOwnProperty = Object.prototype.hasOwnProperty; /** @@ -39,7 +33,6 @@ export function reactive(value, context) { // context may be undefined when unsing reactive() without decorators if (typeof value !== 'function' || context && context.kind !== 'class') throw new TypeError('The @reactive decorator is only for use on classes.'); const Class = value; - const signalProps = getPropsToSignalify(accessKey); // For the current class decorated with @reactive, we reset the map, so that // for the next class decorated with @reactive we track only that next @@ -48,7 +41,8 @@ export function reactive(value, context) { // // In the future maybe we can use decorator metadata for this // (https://github.com/tc39/proposal-decorator-metadata)? - resetPropsToSignalify(accessKey); + const signalProps = __propsToSignalify; // grab the current value before we reset it. + __resetPropsToSignalify(); class ReactiveDecorator extends Class { constructor(...args) { let instance; @@ -67,18 +61,11 @@ export function reactive(value, context) { const proxy = instance[$PROXY]; if (proxy) return instance; for (const [prop, propSpec] of signalProps) { - const kind = propSpec.kind; let initialValue = propSpec.initialValue; // @prod-prune if (!(hasOwnProperty.call(instance, prop) || hasOwnProperty.call(Class.prototype, prop))) throw new PropNotFoundError(prop); - const isAccessor = kind === 'getter' || kind === 'setter'; - if (isAccessor) { - const desc = Object.getOwnPropertyDescriptor(Class.prototype, prop); - initialValue = desc.get.call(instance); - // Note, if the kind was field, then the initializer already defined the initialValue. - } - createSignalAccessor(isAccessor ? Class.prototype : instance, prop, initialValue); + __createSignalAccessor(instance, prop, initialValue); } return instance; } diff --git a/dist/decorators/reactive.js.map b/dist/decorators/reactive.js.map index 5daa687..2ea9818 100644 --- a/dist/decorators/reactive.js.map +++ b/dist/decorators/reactive.js.map @@ -1 +1 @@ -{"version":3,"file":"reactive.js","names":["getListener","$PROXY","untrack","getKey","getPropsToSignalify","resetPropsToSignalify","getCreateSignalAccessor","accessKey","createSignalAccessor","hasOwnProperty","Object","prototype","reactive","value","context","kind","TypeError","Class","signalProps","ReactiveDecorator","constructor","args","instance","Reflect","construct","new","target","proxy","prop","propSpec","initialValue","call","PropNotFoundError","isAccessor","desc","getOwnPropertyDescriptor","get","Error","String"],"sources":["../../src/decorators/reactive.ts"],"sourcesContent":["import type {AnyConstructor} from 'lowclass/dist/Constructor.js'\nimport {getListener, $PROXY, untrack} from 'solid-js'\nimport {getKey, getPropsToSignalify, resetPropsToSignalify} from './signal.js'\nimport {getCreateSignalAccessor} from '../signalify.js'\n\n/**\n * Access key for classy-solid private internal APIs.\n */\nconst accessKey = getKey()\n\nconst createSignalAccessor = getCreateSignalAccessor()\nconst hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * A decorator that makes a class reactive, allowing it have properties\n * decorated with `@signal` to make those properties reactive Solid signals.\n *\n * Example:\n *\n * ```js\n * import {reactive, signal} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * ⁣@reactive\n * class Counter {\n * ⁣@signal count = 0\n *\n * constructor() {\n * setInterval(() => this.count++, 1000)\n * }\n * }\n *\n * const counter = new Counter\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n */\nexport function reactive(value: AnyConstructor, context: ClassDecoratorContext | undefined): any {\n\t// context may be undefined when unsing reactive() without decorators\n\tif (typeof value !== 'function' || (context && context.kind !== 'class'))\n\t\tthrow new TypeError('The @reactive decorator is only for use on classes.')\n\n\tconst Class = value\n\tconst signalProps = getPropsToSignalify(accessKey)\n\n\t// For the current class decorated with @reactive, we reset the map, so that\n\t// for the next class decorated with @reactive we track only that next\n\t// class's properties that were decorated with @signal. We do this because\n\t// field decorators do not have access to the class or its prototype.\n\t//\n\t// In the future maybe we can use decorator metadata for this\n\t// (https://github.com/tc39/proposal-decorator-metadata)?\n\tresetPropsToSignalify(accessKey)\n\n\tclass ReactiveDecorator extends Class {\n\t\tconstructor(...args: any[]) {\n\t\t\tlet instance!: ReactiveDecorator\n\n\t\t\t// Ensure that if we're in an effect that `new`ing a class does not\n\t\t\t// track signal reads, otherwise we'll get into an infinite loop. If\n\t\t\t// someone want to trigger an effect based on properties of the\n\t\t\t// `new`ed instance, they can explicitly read the properties\n\t\t\t// themselves in the effect, making their intent clear.\n\t\t\tif (getListener()) untrack(() => (instance = Reflect.construct(Class, args, new.target))) // super()\n\t\t\telse super(...args), (instance = this)\n\n\t\t\t// Special case for Solid proxies: if the object is already a solid proxy,\n\t\t\t// all properties are already reactive, no need to signalify.\n\t\t\t// @ts-expect-error special indexed access\n\t\t\tconst proxy = instance[$PROXY] as T\n\t\t\tif (proxy) return instance\n\n\t\t\tfor (const [prop, propSpec] of signalProps) {\n\t\t\t\tconst kind = propSpec.kind\n\t\t\t\tlet initialValue = propSpec.initialValue\n\n\t\t\t\t// @prod-prune\n\t\t\t\tif (!(hasOwnProperty.call(instance, prop) || hasOwnProperty.call(Class.prototype, prop)))\n\t\t\t\t\tthrow new PropNotFoundError(prop)\n\n\t\t\t\tconst isAccessor = kind === 'getter' || kind === 'setter'\n\n\t\t\t\tif (isAccessor) {\n\t\t\t\t\tconst desc = Object.getOwnPropertyDescriptor(Class.prototype, prop)!\n\t\t\t\t\tinitialValue = desc.get!.call(instance)\n\t\t\t\t\t// Note, if the kind was field, then the initializer already defined the initialValue.\n\t\t\t\t}\n\n\t\t\t\tcreateSignalAccessor(\n\t\t\t\t\tisAccessor ? Class.prototype : instance,\n\t\t\t\t\tprop as Exclude,\n\t\t\t\t\tinitialValue,\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn instance\n\t\t}\n\t}\n\n\treturn ReactiveDecorator\n}\n\nclass PropNotFoundError extends Error {\n\tconstructor(prop: PropertyKey) {\n\t\tsuper(\n\t\t\t`Property \"${String(\n\t\t\t\tprop,\n\t\t\t)}\" not found on instance of class decorated with \\`@reactive\\`. Did you forget to use the \\`@reactive\\` decorator on one of your classes that has a \"${String(\n\t\t\t\tprop,\n\t\t\t)}\" property decorated with \\`@signal\\`?`,\n\t\t)\n\t}\n}\n"],"mappings":"AACA,SAAQA,WAAW,EAAEC,MAAM,EAAEC,OAAO,QAAO,UAAU;AACrD,SAAQC,MAAM,EAAEC,mBAAmB,EAAEC,qBAAqB,QAAO,aAAa;AAC9E,SAAQC,uBAAuB,QAAO,iBAAiB;;AAEvD;AACA;AACA;AACA,MAAMC,SAAS,GAAGJ,MAAM,CAAC,CAAC;AAE1B,MAAMK,oBAAoB,GAAGF,uBAAuB,CAAC,CAAC;AACtD,MAAMG,cAAc,GAAGC,MAAM,CAACC,SAAS,CAACF,cAAc;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,QAAQA,CAACC,KAAqB,EAAEC,OAA0C,EAAO;EAChG;EACA,IAAI,OAAOD,KAAK,KAAK,UAAU,IAAKC,OAAO,IAAIA,OAAO,CAACC,IAAI,KAAK,OAAQ,EACvE,MAAM,IAAIC,SAAS,CAAC,qDAAqD,CAAC;EAE3E,MAAMC,KAAK,GAAGJ,KAAK;EACnB,MAAMK,WAAW,GAAGd,mBAAmB,CAACG,SAAS,CAAC;;EAElD;EACA;EACA;EACA;EACA;EACA;EACA;EACAF,qBAAqB,CAACE,SAAS,CAAC;EAEhC,MAAMY,iBAAiB,SAASF,KAAK,CAAC;IACrCG,WAAWA,CAAC,GAAGC,IAAW,EAAE;MAC3B,IAAIC,QAA4B;;MAEhC;MACA;MACA;MACA;MACA;MACA,IAAItB,WAAW,CAAC,CAAC,EAAEE,OAAO,CAAC,MAAOoB,QAAQ,GAAGC,OAAO,CAACC,SAAS,CAACP,KAAK,EAAEI,IAAI,EAAEI,GAAG,CAACC,MAAM,CAAE,CAAC,EAAC;MAAA,KACrF,KAAK,CAAC,GAAGL,IAAI,CAAC,EAAGC,QAAQ,GAAG,IAAK;;MAEtC;MACA;MACA;MACA,MAAMK,KAAK,GAAGL,QAAQ,CAACrB,MAAM,CAAM;MACnC,IAAI0B,KAAK,EAAE,OAAOL,QAAQ;MAE1B,KAAK,MAAM,CAACM,IAAI,EAAEC,QAAQ,CAAC,IAAIX,WAAW,EAAE;QAC3C,MAAMH,IAAI,GAAGc,QAAQ,CAACd,IAAI;QAC1B,IAAIe,YAAY,GAAGD,QAAQ,CAACC,YAAY;;QAExC;QACA,IAAI,EAAErB,cAAc,CAACsB,IAAI,CAACT,QAAQ,EAAEM,IAAI,CAAC,IAAInB,cAAc,CAACsB,IAAI,CAACd,KAAK,CAACN,SAAS,EAAEiB,IAAI,CAAC,CAAC,EACvF,MAAM,IAAII,iBAAiB,CAACJ,IAAI,CAAC;QAElC,MAAMK,UAAU,GAAGlB,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,QAAQ;QAEzD,IAAIkB,UAAU,EAAE;UACf,MAAMC,IAAI,GAAGxB,MAAM,CAACyB,wBAAwB,CAAClB,KAAK,CAACN,SAAS,EAAEiB,IAAI,CAAE;UACpEE,YAAY,GAAGI,IAAI,CAACE,GAAG,CAAEL,IAAI,CAACT,QAAQ,CAAC;UACvC;QACD;QAEAd,oBAAoB,CACnByB,UAAU,GAAGhB,KAAK,CAACN,SAAS,GAAGW,QAAQ,EACvCM,IAAI,EACJE,YACD,CAAC;MACF;MAEA,OAAOR,QAAQ;IAChB;EACD;EAEA,OAAOH,iBAAiB;AACzB;AAEA,MAAMa,iBAAiB,SAASK,KAAK,CAAC;EACrCjB,WAAWA,CAACQ,IAAiB,EAAE;IAC9B,KAAK,CACJ,aAAaU,MAAM,CAClBV,IACD,CAAC,uJAAuJU,MAAM,CAC7JV,IACD,CAAC,wCACF,CAAC;EACF;AACD","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"reactive.js","names":["getListener","$PROXY","untrack","__propsToSignalify","__resetPropsToSignalify","__createSignalAccessor","hasOwnProperty","Object","prototype","reactive","value","context","kind","TypeError","Class","signalProps","ReactiveDecorator","constructor","args","instance","Reflect","construct","new","target","proxy","prop","propSpec","initialValue","call","PropNotFoundError","Error","String"],"sources":["../../src/decorators/reactive.ts"],"sourcesContent":["import type {AnyConstructor} from 'lowclass/dist/Constructor.js'\nimport {getListener, $PROXY, untrack} from 'solid-js'\nimport {__propsToSignalify, __resetPropsToSignalify} from './signal.js'\nimport {__createSignalAccessor} from '../signalify.js'\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * A decorator that makes a class reactive, allowing it have properties\n * decorated with `@signal` to make those properties reactive Solid signals.\n *\n * Example:\n *\n * ```js\n * import {reactive, signal} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * ⁣@reactive\n * class Counter {\n * ⁣@signal count = 0\n *\n * constructor() {\n * setInterval(() => this.count++, 1000)\n * }\n * }\n *\n * const counter = new Counter\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n */\nexport function reactive(value: AnyConstructor, context: ClassDecoratorContext | undefined): any {\n\t// context may be undefined when unsing reactive() without decorators\n\tif (typeof value !== 'function' || (context && context.kind !== 'class'))\n\t\tthrow new TypeError('The @reactive decorator is only for use on classes.')\n\n\tconst Class = value\n\n\t// For the current class decorated with @reactive, we reset the map, so that\n\t// for the next class decorated with @reactive we track only that next\n\t// class's properties that were decorated with @signal. We do this because\n\t// field decorators do not have access to the class or its prototype.\n\t//\n\t// In the future maybe we can use decorator metadata for this\n\t// (https://github.com/tc39/proposal-decorator-metadata)?\n\tconst signalProps = __propsToSignalify // grab the current value before we reset it.\n\t__resetPropsToSignalify()\n\n\tclass ReactiveDecorator extends Class {\n\t\tconstructor(...args: any[]) {\n\t\t\tlet instance!: ReactiveDecorator\n\n\t\t\t// Ensure that if we're in an effect that `new`ing a class does not\n\t\t\t// track signal reads, otherwise we'll get into an infinite loop. If\n\t\t\t// someone want to trigger an effect based on properties of the\n\t\t\t// `new`ed instance, they can explicitly read the properties\n\t\t\t// themselves in the effect, making their intent clear.\n\t\t\tif (getListener()) untrack(() => (instance = Reflect.construct(Class, args, new.target))) // super()\n\t\t\telse super(...args), (instance = this)\n\n\t\t\t// Special case for Solid proxies: if the object is already a solid proxy,\n\t\t\t// all properties are already reactive, no need to signalify.\n\t\t\t// @ts-expect-error special indexed access\n\t\t\tconst proxy = instance[$PROXY] as T\n\t\t\tif (proxy) return instance\n\n\t\t\tfor (const [prop, propSpec] of signalProps) {\n\t\t\t\tlet initialValue = propSpec.initialValue\n\n\t\t\t\t// @prod-prune\n\t\t\t\tif (!(hasOwnProperty.call(instance, prop) || hasOwnProperty.call(Class.prototype, prop)))\n\t\t\t\t\tthrow new PropNotFoundError(prop)\n\n\t\t\t\t__createSignalAccessor(instance, prop as Exclude, initialValue)\n\t\t\t}\n\n\t\t\treturn instance\n\t\t}\n\t}\n\n\treturn ReactiveDecorator\n}\n\nclass PropNotFoundError extends Error {\n\tconstructor(prop: PropertyKey) {\n\t\tsuper(\n\t\t\t`Property \"${String(\n\t\t\t\tprop,\n\t\t\t)}\" not found on instance of class decorated with \\`@reactive\\`. Did you forget to use the \\`@reactive\\` decorator on one of your classes that has a \"${String(\n\t\t\t\tprop,\n\t\t\t)}\" property decorated with \\`@signal\\`?`,\n\t\t)\n\t}\n}\n"],"mappings":"AACA,SAAQA,WAAW,EAAEC,MAAM,EAAEC,OAAO,QAAO,UAAU;AACrD,SAAQC,kBAAkB,EAAEC,uBAAuB,QAAO,aAAa;AACvE,SAAQC,sBAAsB,QAAO,iBAAiB;AAEtD,MAAMC,cAAc,GAAGC,MAAM,CAACC,SAAS,CAACF,cAAc;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,QAAQA,CAACC,KAAqB,EAAEC,OAA0C,EAAO;EAChG;EACA,IAAI,OAAOD,KAAK,KAAK,UAAU,IAAKC,OAAO,IAAIA,OAAO,CAACC,IAAI,KAAK,OAAQ,EACvE,MAAM,IAAIC,SAAS,CAAC,qDAAqD,CAAC;EAE3E,MAAMC,KAAK,GAAGJ,KAAK;;EAEnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMK,WAAW,GAAGZ,kBAAkB,EAAC;EACvCC,uBAAuB,CAAC,CAAC;EAEzB,MAAMY,iBAAiB,SAASF,KAAK,CAAC;IACrCG,WAAWA,CAAC,GAAGC,IAAW,EAAE;MAC3B,IAAIC,QAA4B;;MAEhC;MACA;MACA;MACA;MACA;MACA,IAAInB,WAAW,CAAC,CAAC,EAAEE,OAAO,CAAC,MAAOiB,QAAQ,GAAGC,OAAO,CAACC,SAAS,CAACP,KAAK,EAAEI,IAAI,EAAEI,GAAG,CAACC,MAAM,CAAE,CAAC,EAAC;MAAA,KACrF,KAAK,CAAC,GAAGL,IAAI,CAAC,EAAGC,QAAQ,GAAG,IAAK;;MAEtC;MACA;MACA;MACA,MAAMK,KAAK,GAAGL,QAAQ,CAAClB,MAAM,CAAM;MACnC,IAAIuB,KAAK,EAAE,OAAOL,QAAQ;MAE1B,KAAK,MAAM,CAACM,IAAI,EAAEC,QAAQ,CAAC,IAAIX,WAAW,EAAE;QAC3C,IAAIY,YAAY,GAAGD,QAAQ,CAACC,YAAY;;QAExC;QACA,IAAI,EAAErB,cAAc,CAACsB,IAAI,CAACT,QAAQ,EAAEM,IAAI,CAAC,IAAInB,cAAc,CAACsB,IAAI,CAACd,KAAK,CAACN,SAAS,EAAEiB,IAAI,CAAC,CAAC,EACvF,MAAM,IAAII,iBAAiB,CAACJ,IAAI,CAAC;QAElCpB,sBAAsB,CAACc,QAAQ,EAAEM,IAAI,EAA8CE,YAAY,CAAC;MACjG;MAEA,OAAOR,QAAQ;IAChB;EACD;EAEA,OAAOH,iBAAiB;AACzB;AAEA,MAAMa,iBAAiB,SAASC,KAAK,CAAC;EACrCb,WAAWA,CAACQ,IAAiB,EAAE;IAC9B,KAAK,CACJ,aAAaM,MAAM,CAClBN,IACD,CAAC,uJAAuJM,MAAM,CAC7JN,IACD,CAAC,wCACF,CAAC;EACF;AACD","ignoreList":[]} \ No newline at end of file diff --git a/dist/decorators/signal.d.ts b/dist/decorators/signal.d.ts index 4217bf1..0bc06ec 100644 --- a/dist/decorators/signal.d.ts +++ b/dist/decorators/signal.d.ts @@ -1,22 +1,6 @@ import type { PropKey, PropSpec } from './types.js'; -/** - * Provides a key for accessing internal APIs. If any other module tries to get - * this, an error will be thrown, and signal and reactive decorators will not - * work. - */ -export declare function getKey(): symbol; -/** - * This function provides propsToSignalify to only one external module - * (reactive.ts). The purpose of this is to keep the API private for reactive.ts - * only, otherwise an error will be thrown that breaks signal/reactive - * functionality. - */ -export declare function getPropsToSignalify(key: symbol): Map; -/** - * Only the module that first gets the key can call this function (it should be - * reactive.ts) - */ -export declare function resetPropsToSignalify(key: symbol): void; +export declare let __propsToSignalify: Map; +export declare function __resetPropsToSignalify(): void; /** * @decorator * Decorate properties of a class with `@signal` to back them with Solid @@ -47,5 +31,5 @@ export declare function resetPropsToSignalify(key: symbol): void; * }) * ``` */ -export declare function signal(_: unknown, context: ClassFieldDecoratorContext | ClassGetterDecoratorContext | ClassSetterDecoratorContext): any; +export declare function signal(value: unknown, context: ClassFieldDecoratorContext | ClassGetterDecoratorContext | ClassSetterDecoratorContext | ClassAccessorDecoratorContext): any; //# sourceMappingURL=signal.d.ts.map \ No newline at end of file diff --git a/dist/decorators/signal.d.ts.map b/dist/decorators/signal.d.ts.map index 774a59f..1447dd4 100644 --- a/dist/decorators/signal.d.ts.map +++ b/dist/decorators/signal.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/decorators/signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,YAAY,CAAA;AAKjD;;;;GAIG;AACH,wBAAgB,MAAM,WAIrB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,0BAG9C;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,QAGhD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,MAAM,CACrB,CAAC,EAAE,OAAO,EACV,OAAO,EAAE,0BAA0B,GAAG,2BAA2B,GAAG,2BAA2B,GAC7F,GAAG,CAyBL"} \ No newline at end of file +{"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/decorators/signal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,YAAY,CAAA;AAGjD,eAAO,IAAI,kBAAkB,wBAA+B,CAAA;AAE5D,wBAAgB,uBAAuB,SAEtC;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,MAAM,CACrB,KAAK,EAAE,OAAO,EACd,OAAO,EACJ,0BAA0B,GAC1B,2BAA2B,GAC3B,2BAA2B,GAC3B,6BAA6B,GAC9B,GAAG,CAqGL"} \ No newline at end of file diff --git a/dist/decorators/signal.js b/dist/decorators/signal.js index 9fad74d..a393a67 100644 --- a/dist/decorators/signal.js +++ b/dist/decorators/signal.js @@ -1,40 +1,10 @@ -let propsToSignalify = new Map(); -let accessKey = null; - -/** - * Provides a key for accessing internal APIs. If any other module tries to get - * this, an error will be thrown, and signal and reactive decorators will not - * work. - */ -export function getKey() { - if (accessKey) throw new Error('Attempted use of classy-solid internals.'); - accessKey = Symbol(); - return accessKey; +import { $PROXY } from 'solid-js'; +import { __getSignal, __trackPropSetAtLeastOnce, __createSignalAccessor } from '../signalify.js'; +export let __propsToSignalify = new Map(); +export function __resetPropsToSignalify() { + __propsToSignalify = new Map(); } - -/** - * This function provides propsToSignalify to only one external module - * (reactive.ts). The purpose of this is to keep the API private for reactive.ts - * only, otherwise an error will be thrown that breaks signal/reactive - * functionality. - */ -export function getPropsToSignalify(key) { - if (key !== accessKey) throw new Error('Attempted use of classy-solid internals.'); - return propsToSignalify; -} - -/** - * Only the module that first gets the key can call this function (it should be - * reactive.ts) - */ -export function resetPropsToSignalify(key) { - if (key !== accessKey) throw new Error('Attempted use of classy-solid internals.'); - propsToSignalify = new Map(); -} -function isMemberDecorator(context) { - return !!('private' in context); -} - +const Undefined = Symbol(); /** * @decorator * Decorate properties of a class with `@signal` to back them with Solid @@ -65,36 +35,102 @@ function isMemberDecorator(context) { * }) * ``` */ -export function signal(_, context) { +export function signal(value, context) { const { kind, - name + name, + metadata } = context; - const props = propsToSignalify; - if (isMemberDecorator(context)) { - if (context.private) throw new Error('@signal is not supported on private fields yet.'); - if (context.static) throw new Error('@signal is not supported on static fields yet.'); - } + const props = __propsToSignalify; + if (context.static) throw new Error('@signal is not supported on static fields yet.'); + + // @prod-prune + queueReactiveDecoratorChecker(props); if (kind === 'field') { - props.set(name, { + if (context.private && name !== '#finalize') throw new Error('@signal is not supported on private fields yet.'); + if (name === '#finalize') __propsToSignalify = new Map(); // reset + else props.set(name, { initialValue: undefined, kind }); return function (initialValue) { + if (name === '#finalize') { + // Special case for Solid proxies: if the object is already a solid proxy, + // all properties are already reactive, no need to signalify. + // @ts-expect-error special indexed access + const proxy = this[$PROXY]; + if (proxy) return this; + for (const [prop, propSpec] of props) { + let initialValue = propSpec.initialValue; + + // @prod-prune + if (!Object.hasOwn(this, prop)) + // continue + throw new PropNotFoundError(prop); + __createSignalAccessor(this, prop, initialValue); + // CONTINUE testing this way of finalizing signal fields + } + return; + } props.get(name).initialValue = initialValue; return initialValue; }; + } else if (kind === 'accessor') { + const { + get, + set + } = value; + const signalStorage = new WeakMap(); + let initialValue = undefined; + return { + init: function (initialVal) { + initialValue = initialVal; + return initialVal; + }, + get: function () { + __getSignal(this, signalStorage, initialValue)(); + return get.call(this); + }, + set: function (newValue) { + set.call(this, newValue); + __trackPropSetAtLeastOnce(this, name); // not needed anymore? test it + + const s = __getSignal(this, signalStorage, initialValue); + s(typeof newValue === 'function' ? () => newValue : newValue); + } + }; } else if (kind === 'getter' || kind === 'setter') { - props.set(name, { - initialValue: undefined, - kind - }); - } else { - throw new Error('The @signal decorator is only for use on fields, getters, and setters. Auto accessor support is coming next if there is demand for it.'); - } + const getOrSet = value; + const initialValue = Undefined; + if (!Object.hasOwn(metadata, 'signalStoragesPerProp')) metadata.signalStoragesPerProp = {}; + const signalsStorages = metadata.signalStoragesPerProp; + let signalStorage = signalsStorages[name]; + if (!signalStorage) signalsStorages[name] = signalStorage = new WeakMap(); + if (!Object.hasOwn(metadata, 'getterSetterPairs')) metadata.getterSetterPairs = {}; + const pairs = metadata.getterSetterPairs; - // @prod-prune - queueReactiveDecoratorChecker(props); + // Show a helpful error in case someone forgets to decorate both a getter and setter. + queueMicrotask(() => { + if (pairs[name] !== 2) throw new MissingDecoratorError(name); + }); + if (kind === 'getter') { + pairs[name] ??= 0; + pairs[name]++; + return function () { + __getSignal(this, signalStorage, initialValue)(); + return getOrSet.call(this); + }; + } else { + pairs[name] ??= 0; + pairs[name]++; + return function (newValue) { + getOrSet.call(this, newValue); + __trackPropSetAtLeastOnce(this, name); + const s = __getSignal(this, signalStorage, initialValue); + s(typeof newValue === 'function' ? () => newValue : newValue); + }; + } + } else throw new InvalidDecorationError(); } let checkerQueued = false; @@ -114,11 +150,26 @@ function queueReactiveDecoratorChecker(props) { // If the refs are still equal, it means @reactive did not run (forgot // to decorate a class that uses @signal with @reactive). - if (props === propsToSignalify) { + if (props === __propsToSignalify) { throw new Error( // Array.from(map.keys()) instead of [...map.keys()] because it breaks in Oculus browser. `Stray @signal-decorated properties detected: ${Array.from(props.keys()).join(', ')}. Did you forget to use the \`@reactive\` decorator on a class that has properties decorated with \`@signal\`?`); } }); } +class PropNotFoundError extends Error { + constructor(prop) { + super(`Property "${String(prop)}" not found on instance of class decorated with \`@reactive\`. Did you forget to use the \`@reactive\` decorator on one of your classes that has a "${String(prop)}" property decorated with \`@signal\`?`); + } +} +class MissingDecoratorError extends Error { + constructor(prop) { + super(`Missing @signal decorator on setter or getter for property "${String(prop)}". The @signal decorator will only work on a getter/setter pair with *both* getter and setter decorated with @signal.`); + } +} +class InvalidDecorationError extends Error { + constructor() { + super('The @signal decorator is only for use on fields, getters, setters, and auto accessors.'); + } +} //# sourceMappingURL=signal.js.map \ No newline at end of file diff --git a/dist/decorators/signal.js.map b/dist/decorators/signal.js.map index 79e024a..dff4d84 100644 --- a/dist/decorators/signal.js.map +++ b/dist/decorators/signal.js.map @@ -1 +1 @@ -{"version":3,"file":"signal.js","names":["propsToSignalify","Map","accessKey","getKey","Error","Symbol","getPropsToSignalify","key","resetPropsToSignalify","isMemberDecorator","context","signal","_","kind","name","props","private","static","set","initialValue","undefined","get","queueReactiveDecoratorChecker","checkerQueued","queueMicrotask","Array","from","keys","join"],"sources":["../../src/decorators/signal.ts"],"sourcesContent":["import type {PropKey, PropSpec} from './types.js'\n\nlet propsToSignalify = new Map()\nlet accessKey: symbol | null = null\n\n/**\n * Provides a key for accessing internal APIs. If any other module tries to get\n * this, an error will be thrown, and signal and reactive decorators will not\n * work.\n */\nexport function getKey() {\n\tif (accessKey) throw new Error('Attempted use of classy-solid internals.')\n\taccessKey = Symbol()\n\treturn accessKey\n}\n\n/**\n * This function provides propsToSignalify to only one external module\n * (reactive.ts). The purpose of this is to keep the API private for reactive.ts\n * only, otherwise an error will be thrown that breaks signal/reactive\n * functionality.\n */\nexport function getPropsToSignalify(key: symbol) {\n\tif (key !== accessKey) throw new Error('Attempted use of classy-solid internals.')\n\treturn propsToSignalify\n}\n\n/**\n * Only the module that first gets the key can call this function (it should be\n * reactive.ts)\n */\nexport function resetPropsToSignalify(key: symbol) {\n\tif (key !== accessKey) throw new Error('Attempted use of classy-solid internals.')\n\tpropsToSignalify = new Map()\n}\n\nfunction isMemberDecorator(context: DecoratorContext): context is ClassMemberDecoratorContext {\n\treturn !!('private' in context)\n}\n\n/**\n * @decorator\n * Decorate properties of a class with `@signal` to back them with Solid\n * signals, making them reactive. Don't forget that the class in which `@signal`\n * is used must be decorated with `@reactive`.\n *\n * Related: See the Solid.js `createSignal` API for creating signals.\n *\n * Example:\n *\n * ```js\n * import {reactive, signal} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * ⁣@reactive\n * class Counter {\n * ⁣@signal count = 0\n *\n * constructor() {\n * setInterval(() => this.count++, 1000)\n * }\n * }\n *\n * const counter = new Counter\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n */\nexport function signal(\n\t_: unknown,\n\tcontext: ClassFieldDecoratorContext | ClassGetterDecoratorContext | ClassSetterDecoratorContext,\n): any {\n\tconst {kind, name} = context\n\tconst props = propsToSignalify\n\n\tif (isMemberDecorator(context)) {\n\t\tif (context.private) throw new Error('@signal is not supported on private fields yet.')\n\t\tif (context.static) throw new Error('@signal is not supported on static fields yet.')\n\t}\n\n\tif (kind === 'field') {\n\t\tprops.set(name, {initialValue: undefined, kind})\n\t\treturn function (this: object, initialValue: unknown) {\n\t\t\tprops.get(name)!.initialValue = initialValue\n\t\t\treturn initialValue\n\t\t}\n\t} else if (kind === 'getter' || kind === 'setter') {\n\t\tprops.set(name, {initialValue: undefined, kind})\n\t} else {\n\t\tthrow new Error(\n\t\t\t'The @signal decorator is only for use on fields, getters, and setters. Auto accessor support is coming next if there is demand for it.',\n\t\t)\n\t}\n\n\t// @prod-prune\n\tqueueReactiveDecoratorChecker(props)\n}\n\nlet checkerQueued = false\n\n/**\n * This throws an error in some cases of an end dev forgetting to decorate a\n * class with `@reactive` if they used `@signal` on that class's fields.\n *\n * This doesn't work all the time, only when the very last class decorated is\n * missing @reactive, but something is better than nothing. There's another\n * similar check performed in the `@reactive` decorator.\n */\nfunction queueReactiveDecoratorChecker(props: Map) {\n\tif (checkerQueued) return\n\tcheckerQueued = true\n\n\tqueueMicrotask(() => {\n\t\tcheckerQueued = false\n\n\t\t// If the refs are still equal, it means @reactive did not run (forgot\n\t\t// to decorate a class that uses @signal with @reactive).\n\t\tif (props === propsToSignalify) {\n\t\t\tthrow new Error(\n\t\t\t\t// Array.from(map.keys()) instead of [...map.keys()] because it breaks in Oculus browser.\n\t\t\t\t`Stray @signal-decorated properties detected: ${Array.from(props.keys()).join(\n\t\t\t\t\t', ',\n\t\t\t\t)}. Did you forget to use the \\`@reactive\\` decorator on a class that has properties decorated with \\`@signal\\`?`,\n\t\t\t)\n\t\t}\n\t})\n}\n"],"mappings":"AAEA,IAAIA,gBAAgB,GAAG,IAAIC,GAAG,CAAoB,CAAC;AACnD,IAAIC,SAAwB,GAAG,IAAI;;AAEnC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAA,EAAG;EACxB,IAAID,SAAS,EAAE,MAAM,IAAIE,KAAK,CAAC,0CAA0C,CAAC;EAC1EF,SAAS,GAAGG,MAAM,CAAC,CAAC;EACpB,OAAOH,SAAS;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,mBAAmBA,CAACC,GAAW,EAAE;EAChD,IAAIA,GAAG,KAAKL,SAAS,EAAE,MAAM,IAAIE,KAAK,CAAC,0CAA0C,CAAC;EAClF,OAAOJ,gBAAgB;AACxB;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASQ,qBAAqBA,CAACD,GAAW,EAAE;EAClD,IAAIA,GAAG,KAAKL,SAAS,EAAE,MAAM,IAAIE,KAAK,CAAC,0CAA0C,CAAC;EAClFJ,gBAAgB,GAAG,IAAIC,GAAG,CAAoB,CAAC;AAChD;AAEA,SAASQ,iBAAiBA,CAACC,OAAyB,EAA0C;EAC7F,OAAO,CAAC,EAAE,SAAS,IAAIA,OAAO,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CACrBC,CAAU,EACVF,OAA+F,EACzF;EACN,MAAM;IAACG,IAAI;IAAEC;EAAI,CAAC,GAAGJ,OAAO;EAC5B,MAAMK,KAAK,GAAGf,gBAAgB;EAE9B,IAAIS,iBAAiB,CAACC,OAAO,CAAC,EAAE;IAC/B,IAAIA,OAAO,CAACM,OAAO,EAAE,MAAM,IAAIZ,KAAK,CAAC,iDAAiD,CAAC;IACvF,IAAIM,OAAO,CAACO,MAAM,EAAE,MAAM,IAAIb,KAAK,CAAC,gDAAgD,CAAC;EACtF;EAEA,IAAIS,IAAI,KAAK,OAAO,EAAE;IACrBE,KAAK,CAACG,GAAG,CAACJ,IAAI,EAAE;MAACK,YAAY,EAAEC,SAAS;MAAEP;IAAI,CAAC,CAAC;IAChD,OAAO,UAAwBM,YAAqB,EAAE;MACrDJ,KAAK,CAACM,GAAG,CAACP,IAAI,CAAC,CAAEK,YAAY,GAAGA,YAAY;MAC5C,OAAOA,YAAY;IACpB,CAAC;EACF,CAAC,MAAM,IAAIN,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,QAAQ,EAAE;IAClDE,KAAK,CAACG,GAAG,CAACJ,IAAI,EAAE;MAACK,YAAY,EAAEC,SAAS;MAAEP;IAAI,CAAC,CAAC;EACjD,CAAC,MAAM;IACN,MAAM,IAAIT,KAAK,CACd,wIACD,CAAC;EACF;;EAEA;EACAkB,6BAA6B,CAACP,KAAK,CAAC;AACrC;AAEA,IAAIQ,aAAa,GAAG,KAAK;;AAEzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASD,6BAA6BA,CAACP,KAA6B,EAAE;EACrE,IAAIQ,aAAa,EAAE;EACnBA,aAAa,GAAG,IAAI;EAEpBC,cAAc,CAAC,MAAM;IACpBD,aAAa,GAAG,KAAK;;IAErB;IACA;IACA,IAAIR,KAAK,KAAKf,gBAAgB,EAAE;MAC/B,MAAM,IAAII,KAAK;MACd;MACA,gDAAgDqB,KAAK,CAACC,IAAI,CAACX,KAAK,CAACY,IAAI,CAAC,CAAC,CAAC,CAACC,IAAI,CAC5E,IACD,CAAC,gHACF,CAAC;IACF;EACD,CAAC,CAAC;AACH","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"signal.js","names":["$PROXY","__getSignal","__trackPropSetAtLeastOnce","__createSignalAccessor","__propsToSignalify","Map","__resetPropsToSignalify","Undefined","Symbol","signal","value","context","kind","name","metadata","props","static","Error","queueReactiveDecoratorChecker","private","set","initialValue","undefined","proxy","prop","propSpec","Object","hasOwn","PropNotFoundError","get","signalStorage","WeakMap","init","initialVal","call","newValue","s","getOrSet","signalStoragesPerProp","signalsStorages","getterSetterPairs","pairs","queueMicrotask","MissingDecoratorError","InvalidDecorationError","checkerQueued","Array","from","keys","join","constructor","String"],"sources":["../../src/decorators/signal.ts"],"sourcesContent":["import {$PROXY} from 'solid-js'\nimport {__getSignal, __trackPropSetAtLeastOnce, __createSignalAccessor} from '../signalify.js'\nimport type {PropKey, PropSpec} from './types.js'\nimport type {SignalFunction} from '../createSignalFunction.js'\n\nexport let __propsToSignalify = new Map()\n\nexport function __resetPropsToSignalify() {\n\t__propsToSignalify = new Map()\n}\n\nconst Undefined = Symbol()\n\ntype SignalStorages = Record> | undefined>\n\n/**\n * @decorator\n * Decorate properties of a class with `@signal` to back them with Solid\n * signals, making them reactive. Don't forget that the class in which `@signal`\n * is used must be decorated with `@reactive`.\n *\n * Related: See the Solid.js `createSignal` API for creating signals.\n *\n * Example:\n *\n * ```js\n * import {reactive, signal} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * ⁣@reactive\n * class Counter {\n * ⁣@signal count = 0\n *\n * constructor() {\n * setInterval(() => this.count++, 1000)\n * }\n * }\n *\n * const counter = new Counter\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n */\nexport function signal(\n\tvalue: unknown,\n\tcontext:\n\t\t| ClassFieldDecoratorContext\n\t\t| ClassGetterDecoratorContext\n\t\t| ClassSetterDecoratorContext\n\t\t| ClassAccessorDecoratorContext,\n): any {\n\tconst {kind, name, metadata} = context\n\tconst props = __propsToSignalify\n\n\tif (context.static) throw new Error('@signal is not supported on static fields yet.')\n\n\t// @prod-prune\n\tqueueReactiveDecoratorChecker(props)\n\n\tif (kind === 'field') {\n\t\tif (context.private && name !== '#finalize') throw new Error('@signal is not supported on private fields yet.')\n\n\t\tif (name === '#finalize') __propsToSignalify = new Map() // reset\n\t\telse props.set(name, {initialValue: undefined, kind})\n\n\t\treturn function (this: object, initialValue: unknown) {\n\t\t\tif (name === '#finalize') {\n\t\t\t\t// Special case for Solid proxies: if the object is already a solid proxy,\n\t\t\t\t// all properties are already reactive, no need to signalify.\n\t\t\t\t// @ts-expect-error special indexed access\n\t\t\t\tconst proxy = this[$PROXY] as T\n\t\t\t\tif (proxy) return this\n\n\t\t\t\tfor (const [prop, propSpec] of props) {\n\t\t\t\t\tlet initialValue = propSpec.initialValue\n\n\t\t\t\t\t// @prod-prune\n\t\t\t\t\tif (!Object.hasOwn(this, prop))\n\t\t\t\t\t\t// continue\n\t\t\t\t\t\tthrow new PropNotFoundError(prop)\n\n\t\t\t\t\t__createSignalAccessor(this as any, prop, initialValue)\n\t\t\t\t\t// CONTINUE testing this way of finalizing signal fields\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tprops.get(name)!.initialValue = initialValue\n\t\t\treturn initialValue\n\t\t}\n\t} else if (kind === 'accessor') {\n\t\tconst {get, set} = value as {get: () => unknown; set: (v: unknown) => void}\n\t\tconst signalStorage = new WeakMap>()\n\t\tlet initialValue: unknown = undefined\n\n\t\treturn {\n\t\t\tinit: function (this: object, initialVal: unknown) {\n\t\t\t\tinitialValue = initialVal\n\t\t\t\treturn initialVal\n\t\t\t},\n\t\t\tget: function (this: object): unknown {\n\t\t\t\t__getSignal(this, signalStorage, initialValue)()\n\t\t\t\treturn get.call(this)\n\t\t\t},\n\t\t\tset: function (this: object, newValue: unknown) {\n\t\t\t\tset.call(this, newValue)\n\t\t\t\t__trackPropSetAtLeastOnce(this, name) // not needed anymore? test it\n\n\t\t\t\tconst s = __getSignal(this, signalStorage, initialValue)\n\t\t\t\ts(typeof newValue === 'function' ? () => newValue : newValue)\n\t\t\t},\n\t\t}\n\t} else if (kind === 'getter' || kind === 'setter') {\n\t\tconst getOrSet = value as Function\n\t\tconst initialValue = Undefined\n\n\t\tif (!Object.hasOwn(metadata, 'signalStoragesPerProp')) metadata.signalStoragesPerProp = {}\n\t\tconst signalsStorages = metadata.signalStoragesPerProp as SignalStorages\n\n\t\tlet signalStorage = signalsStorages[name]\n\t\tif (!signalStorage) signalsStorages[name] = signalStorage = new WeakMap>()\n\n\t\tif (!Object.hasOwn(metadata, 'getterSetterPairs')) metadata.getterSetterPairs = {}\n\t\tconst pairs = metadata.getterSetterPairs as {[key: PropKey]: 0 | 1 | 2}\n\n\t\t// Show a helpful error in case someone forgets to decorate both a getter and setter.\n\t\tqueueMicrotask(() => {\n\t\t\tif (pairs[name] !== 2) throw new MissingDecoratorError(name)\n\t\t})\n\n\t\tif (kind === 'getter') {\n\t\t\tpairs[name] ??= 0\n\t\t\tpairs[name]++\n\n\t\t\treturn function (this: object): unknown {\n\t\t\t\t__getSignal(this, signalStorage, initialValue)()\n\t\t\t\treturn getOrSet.call(this)\n\t\t\t}\n\t\t} else {\n\t\t\tpairs[name] ??= 0\n\t\t\tpairs[name]++\n\n\t\t\treturn function (this: object, newValue: unknown) {\n\t\t\t\tgetOrSet.call(this, newValue)\n\t\t\t\t__trackPropSetAtLeastOnce(this, name)\n\n\t\t\t\tconst s = __getSignal(this, signalStorage, initialValue)\n\t\t\t\ts(typeof newValue === 'function' ? () => newValue : newValue)\n\t\t\t}\n\t\t}\n\t} else throw new InvalidDecorationError()\n}\n\nlet checkerQueued = false\n\n/**\n * This throws an error in some cases of an end dev forgetting to decorate a\n * class with `@reactive` if they used `@signal` on that class's fields.\n *\n * This doesn't work all the time, only when the very last class decorated is\n * missing @reactive, but something is better than nothing. There's another\n * similar check performed in the `@reactive` decorator.\n */\nfunction queueReactiveDecoratorChecker(props: Map) {\n\tif (checkerQueued) return\n\tcheckerQueued = true\n\n\tqueueMicrotask(() => {\n\t\tcheckerQueued = false\n\n\t\t// If the refs are still equal, it means @reactive did not run (forgot\n\t\t// to decorate a class that uses @signal with @reactive).\n\t\tif (props === __propsToSignalify) {\n\t\t\tthrow new Error(\n\t\t\t\t// Array.from(map.keys()) instead of [...map.keys()] because it breaks in Oculus browser.\n\t\t\t\t`Stray @signal-decorated properties detected: ${Array.from(props.keys()).join(\n\t\t\t\t\t', ',\n\t\t\t\t)}. Did you forget to use the \\`@reactive\\` decorator on a class that has properties decorated with \\`@signal\\`?`,\n\t\t\t)\n\t\t}\n\t})\n}\n\nclass PropNotFoundError extends Error {\n\tconstructor(prop: PropertyKey) {\n\t\tsuper(\n\t\t\t`Property \"${String(\n\t\t\t\tprop,\n\t\t\t)}\" not found on instance of class decorated with \\`@reactive\\`. Did you forget to use the \\`@reactive\\` decorator on one of your classes that has a \"${String(\n\t\t\t\tprop,\n\t\t\t)}\" property decorated with \\`@signal\\`?`,\n\t\t)\n\t}\n}\n\nclass MissingDecoratorError extends Error {\n\tconstructor(prop: PropertyKey) {\n\t\tsuper(\n\t\t\t`Missing @signal decorator on setter or getter for property \"${String(\n\t\t\t\tprop,\n\t\t\t)}\". The @signal decorator will only work on a getter/setter pair with *both* getter and setter decorated with @signal.`,\n\t\t)\n\t}\n}\n\nclass InvalidDecorationError extends Error {\n\tconstructor() {\n\t\tsuper('The @signal decorator is only for use on fields, getters, setters, and auto accessors.')\n\t}\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/index.test.js b/dist/index.test.js index 33de2ac..e04655a 100644 --- a/dist/index.test.js +++ b/dist/index.test.js @@ -14,7 +14,7 @@ import { createSignalObject, reactive, signalify, createSignalFunction, signal, describe('classy-solid', () => { describe('createSignalObject()', () => { - it('has gettable and settable values via .get and .set methods', async () => { + it('has gettable and settable values via .get and .set methods', () => { const num = createSignalObject(0); // Set the variable's value by passing a value in. @@ -33,7 +33,7 @@ describe('classy-solid', () => { }); }); describe('createSignalFunction()', () => { - it('has gettable and settable values via a single overloaded function', async () => { + it('has gettable and settable values via a single overloaded function', () => { const num = createSignalFunction(0); // Set the variable's value by passing a value in. @@ -50,6 +50,14 @@ describe('classy-solid', () => { num(n => n + 1); expect(num()).toBe(3); }); + it('works with function values', () => { + const f1 = () => 123; + const func = createSignalFunction(f1); + expect(func()).toBe(f1); + const f2 = () => 456; + func(() => f2); + expect(func()).toBe(f2); + }); }); describe('createDeferredEffect()', () => { it('works', async () => { @@ -112,34 +120,174 @@ describe('classy-solid', () => { }); }); describe('@reactive, @signal', () => { - var _initClass, _init_colors, _initProto; + var _initClass, _init_colors, _initProto, _init_colors2, _init_wingSize, _init_finalize, _init_colors3, _init_finalize2, _initProto2, _init_colors4, _init_wingSize2, _init_finalize3, _initProto3, _initClass2, _init_colors5, _init_wingSize3, _initProto4, _init_colors6, _get_colors, _set_colors, _initProto5, _call_colors, _call_colors2, _initProto6; let _Butterfly; class Butterfly { static { ({ e: [_init_colors, _initProto], c: [_Butterfly, _initClass] - } = _applyDecs(this, [[signal, 3, "wingSize"], [signal, 0, "colors"]], [reactive])); + } = _applyDecs(this, [[signal, 3, "wingSize"], [signal, 4, "wingSize"], [signal, 0, "colors"]], [reactive])); } colors = (_initProto(this), _init_colors(this, 3)); - _wingSize = 2; + #wingSize = 2; get wingSize() { - return this._wingSize; + return this.#wingSize; } set wingSize(s) { - this._wingSize = s; + this.#wingSize = s; } static { _initClass(); } } - it('makes class fields reactive, using class and field/accessor decorators', () => { + it('makes class fields reactive, using class and field/getter/setter decorators', () => { const b = new _Butterfly(); testButterflyProps(b); }); + + // @reactive + class Butterfly2 { + static { + [_init_colors2, _init_wingSize, _init_finalize] = _applyDecs(this, [[signal, 0, "colors"], [signal, 0, "wingSize"], [signal, 0, "finalize", o => o.#finalize, (o, v) => o.#finalize = v]], [], 0, _ => #finalize in _).e; + } + colors = _init_colors2(this, 3); + wingSize = _init_wingSize(this, 2); + // @ts-ignore + #finalize = _init_finalize(this); + } + it('makes class fields reactive, using field decorators without class decorator', () => { + const b = new Butterfly2(); + testButterflyProps(b); + }); + class Butterfly3 { + static { + [_init_colors3, _init_finalize2, _initProto2] = _applyDecs(this, [[signal, 3, "wingSize"], [signal, 4, "wingSize"], [signal, 0, "colors"], [signal, 0, "finalize", o => o.#finalize, (o, v) => o.#finalize = v]], [], 0, _ => #finalize in _).e; + } + colors = (_initProto2(this), _init_colors3(this, 3)); + #wingSize = 2; + get wingSize() { + return this.#wingSize; + } + set wingSize(s) { + this.#wingSize = s; + } + + // @ts-ignore + #finalize = _init_finalize2(this); + } + it('makes class fields reactive, using field/getter/setter decorators without class decorator', () => { + const b = new Butterfly3(); + testButterflyProps(b); + }); + class Butterfly4 { + static { + [_init_wingSize2, _init_colors4, _init_finalize3, _initProto3] = _applyDecs(this, [[signal, 1, "wingSize"], [signal, 0, "colors"], [signal, 0, "finalize", o => o.#finalize, (o, v) => o.#finalize = v]], [], 0, _ => #finalize in _).e; + } + colors = (_initProto3(this), _init_colors4(this, 3)); + #A = _init_wingSize2(this, 2); // @ts-ignore + get wingSize() { + return this.#A; + } + set wingSize(v) { + this.#A = v; + } + #finalize = _init_finalize3(this); + } + it('makes class fields reactive, using field/accessor decorators without class decorator', () => { + const b = new Butterfly4(); + testButterflyProps(b); + }); + let _Butterfly2; + class Butterfly5 { + static { + ({ + e: [_init_wingSize3, _init_colors5, _initProto4], + c: [_Butterfly2, _initClass2] + } = _applyDecs(this, [[signal, 1, "wingSize"], [signal, 0, "colors"]], [reactive])); + } + colors = (_initProto4(this), _init_colors5(this, 3)); + #A = _init_wingSize3(this, 2); + get wingSize() { + return this.#A; + } + set wingSize(v) { + this.#A = v; + } + static { + _initClass2(); + } + } + it('makes class fields reactive, using field/accessor decorators with class decorator', () => { + const b = new _Butterfly2(); + testButterflyProps(b); + }); + class Butterfly6 { + static { + [_init_colors6, _get_colors, _set_colors, _initProto5] = _applyDecs(this, [[signal, 1, "colors", o => o.#A, (o, v) => o.#A = v]], [], 0, _ => #colors in _).e; + } + #A = (_initProto5(this), _init_colors6(this, 3)); + set #colors(v) { + _set_colors(this, v); + } + get #colors() { + return _get_colors(this); + } + getColors() { + return this.#colors; + } + setColors(v) { + return this.#colors = v; + } + } + it('makes private class auto accessor reactive', () => { + const b = new Butterfly6(); + testPrivate(b); + }); + class Butterfly7 { + static { + [_call_colors, _call_colors2, _initProto6] = _applyDecs(this, [[signal, 3, "colors", function () { + return this.#_colors; + }], [signal, 4, "colors", function (v) { + this.#_colors = v; + }]], [], 0, _ => #_colors in _).e; + } + constructor(...args) { + _initProto6(this); + } + #_colors = 3; + get #colors() { + return _call_colors(this); + } + set #colors(v) { + _call_colors2(this, v); + } + getColors() { + return this.#colors; + } + setColors(v) { + return this.#colors = v; + } + } + it('makes private class getter/setter accessors reactive', () => { + const b = new Butterfly7(); + testPrivate(b); + }); + function testPrivate(b) { + let count = 0; + createEffect(() => { + b.getColors(); + count++; + }); + expect(b.getColors()).toBe(3); + expect(count).toBe(1); + b.setColors(5); + expect(b.getColors()).toBe(5); + expect(count).toBe(2); + } const ensure = it; ensure('overridden fields work as expected', async () => { - var _initClass2, _init_colors2; + var _initClass3, _init_colors7; class Mid extends _Butterfly { colors = 0; } @@ -152,13 +300,13 @@ describe('classy-solid', () => { class SubButterfly extends Mid { static { ({ - e: [_init_colors2], - c: [_SubButterfly, _initClass2] + e: [_init_colors7], + c: [_SubButterfly, _initClass3] } = _applyDecs(this, [[signal, 0, "colors"]], [reactive], 0, void 0, Mid)); } - colors = _init_colors2(this, 123); + colors = _init_colors7(this, 123); static { - _initClass2(); + _initClass3(); } } @@ -189,49 +337,49 @@ describe('classy-solid', () => { expect(count).toBe(reactive ? 2 : 1); } it('does not prevent superclass constructor from receiving subclass constructor args', () => { - var _initClass3, _initClass4, _init_colors3, _initProto2, _Insect2; + var _initClass4, _initClass5, _init_colors8, _initProto7, _Insect2; let _Insect; class Insect { static { - [_Insect, _initClass3] = _applyDecs(this, [], [reactive]).c; + [_Insect, _initClass4] = _applyDecs(this, [], [reactive]).c; } constructor(double) { this.double = double; } static { - _initClass3(); + _initClass4(); } } - let _Butterfly2; + let _Butterfly3; class Butterfly extends (_Insect2 = _Insect) { static { ({ - e: [_init_colors3, _initProto2], - c: [_Butterfly2, _initClass4] - } = _applyDecs(this, [[signal, 3, "wingSize"], [signal, 0, "colors"]], [reactive], 0, void 0, _Insect2)); + e: [_init_colors8, _initProto7], + c: [_Butterfly3, _initClass5] + } = _applyDecs(this, [[signal, 3, "wingSize"], [signal, 4, "wingSize"], [signal, 0, "colors"]], [reactive], 0, void 0, _Insect2)); } - colors = (_initProto2(this), _init_colors3(this, 3)); - _wingSize = 2; + colors = (_initProto7(this), _init_colors8(this, 3)); + #wingSize = 2; get wingSize() { - return this._wingSize; + return this.#wingSize; } set wingSize(s) { - this._wingSize = s; + this.#wingSize = s; } constructor(arg) { super(arg * 2); } static { - _initClass4(); + _initClass5(); } } - const b = new _Butterfly2(4); + const b = new _Butterfly3(4); expect(b.double).toBe(8); testButterflyProps(b); }); it('throws an error when @signal is used without @reactive', async () => { expect(() => { - var _init_foo, _initClass5, _init_bar; + var _init_foo, _initClass6, _init_bar; // user forgot to use @reactive here class Foo { static { @@ -245,12 +393,12 @@ describe('classy-solid', () => { static { ({ e: [_init_bar], - c: [_Bar, _initClass5] + c: [_Bar, _initClass6] } = _applyDecs(this, [[signal, 0, "bar"]], [reactive])); } bar = _init_bar(this, 123); static { - _initClass5(); + _initClass6(); } } new _Bar(); @@ -283,7 +431,7 @@ describe('classy-solid', () => { // expect(err.message).toContain('Did you forget') }); it('works with function values', () => { - var _initClass6, _init_do; + var _initClass7, _init_do; let _Doer; // This test ensures that functions are handled propertly, because // if passed without being wrapped to a signal setter it will be @@ -294,12 +442,12 @@ describe('classy-solid', () => { static { ({ e: [_init_do], - c: [_Doer, _initClass6] + c: [_Doer, _initClass7] } = _applyDecs(this, [[signal, 0, "do"]], [reactive])); } do = _init_do(this, null); static { - _initClass6(); + _initClass7(); } } const doer = new _Doer(); @@ -310,18 +458,18 @@ describe('classy-solid', () => { expect(doer.do()).toBe(123); }); it('automatically does not track reactivity in constructors when using decorators', () => { - var _initClass7, _init_amount, _initClass8, _init_double, _Foo2; + var _initClass8, _init_amount, _initClass9, _init_double, _Foo2; let _Foo; class Foo { static { ({ e: [_init_amount], - c: [_Foo, _initClass7] + c: [_Foo, _initClass8] } = _applyDecs(this, [[signal, 0, "amount"]], [reactive])); } amount = _init_amount(this, 3); static { - _initClass7(); + _initClass8(); } } let _Bar2; @@ -329,7 +477,7 @@ describe('classy-solid', () => { static { ({ e: [_init_double], - c: [_Bar2, _initClass8] + c: [_Bar2, _initClass9] } = _applyDecs(this, [[signal, 0, "double"]], [reactive], 0, void 0, _Foo2)); } double = _init_double(this, 0); @@ -338,7 +486,7 @@ describe('classy-solid', () => { this.double = this.amount * 2; // this read of .amount should not be tracked } static { - _initClass8(); + _initClass9(); } } let b; @@ -422,12 +570,12 @@ describe('classy-solid', () => { it('makes class fields reactive, not using any decorators', () => { class Butterfly { colors = 3; - _wingSize = 2; + #wingSize = 2; get wingSize() { - return this._wingSize; + return this.#wingSize; } set wingSize(s) { - this._wingSize = s; + this.#wingSize = s; } constructor() { signalify(this, 'colors', 'wingSize'); @@ -443,15 +591,16 @@ describe('classy-solid', () => { }); it('makes constructor properties reactive, not using any decorators', () => { class Butterfly { + #wingSize; get wingSize() { - return this._wingSize; + return this.#wingSize; } set wingSize(s) { - this._wingSize = s; + this.#wingSize = s; } constructor() { this.colors = 3; - this._wingSize = 2; + this.#wingSize = 2; signalify(this, 'colors', 'wingSize'); } } @@ -637,13 +786,13 @@ describe('classy-solid', () => { }); describe('@component', () => { it('allows to define a class using class syntax', () => { - var _initClass9; + var _initClass10; let onMountCalled = false; let onCleanupCalled = false; let _CoolComp; class CoolComp { static { - [_CoolComp, _initClass9] = _applyDecs(this, [], [component]).c; + [_CoolComp, _initClass10] = _applyDecs(this, [], [component]).c; } onMount() { onMountCalled = true; @@ -656,7 +805,7 @@ describe('classy-solid', () => { return html`
hello classes!
`; } static { - _initClass9(); + _initClass10(); } } const root = document.createElement('div'); @@ -671,13 +820,13 @@ describe('classy-solid', () => { // throws on non-class use expect(() => { - var _initProto3; + var _initProto8; class CoolComp { static { - [_initProto3] = _applyDecs(this, [[component, 2, "onMount"]], []).e; + [_initProto8] = _applyDecs(this, [[component, 2, "onMount"]], []).e; } constructor(...args) { - _initProto3(this); + _initProto8(this); } // @ts-ignore onMount() {} @@ -686,13 +835,13 @@ describe('classy-solid', () => { }).toThrow('component decorator should only be used on a class'); }); it('works in tandem with @reactive and @signal for reactivity', async () => { - var _initClass10, _init_foo2, _init_bar2; + var _initClass11, _init_foo2, _init_bar2; let _CoolComp2; class CoolComp { static { ({ e: [_init_foo2, _init_bar2], - c: [_CoolComp2, _initClass10] + c: [_CoolComp2, _initClass11] } = _applyDecs(this, [[signal, 0, "foo"], [signal, 0, "bar"]], [component, reactive])); } foo = _init_foo2(this, 0); @@ -701,7 +850,7 @@ describe('classy-solid', () => { return html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`; } static { - _initClass10(); + _initClass11(); } } const root = document.createElement('div'); @@ -752,13 +901,13 @@ describe('classy-solid', () => { // FIXME not working, the spread doesn't seem to do anything. xit('works with reactive spreads', async () => { - var _initClass11, _init_foo3, _init_bar3; + var _initClass12, _init_foo3, _init_bar3; let _CoolComp3; class CoolComp { static { ({ e: [_init_foo3, _init_bar3], - c: [_CoolComp3, _initClass11] + c: [_CoolComp3, _initClass12] } = _applyDecs(this, [[signal, 0, "foo"], [signal, 0, "bar"]], [component, reactive])); } foo = _init_foo3(this, 0); @@ -767,7 +916,7 @@ describe('classy-solid', () => { return html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`; } static { - _initClass11(); + _initClass12(); } } const root = document.createElement('div'); @@ -802,14 +951,12 @@ function testButterflyProps(b, initialColors = 3) { }); expect(b.colors).toBe(initialColors, 'initial colors value'); expect(b.wingSize).toBe(2, 'initial wingSize value'); - expect(b._wingSize).toBe(2, 'ensure the original accessor works'); expect(count).toBe(1, 'Should be reactive'); b.colors++; expect(b.colors).toBe(initialColors + 1, 'incremented colors value'); expect(count).toBe(2, 'Should be reactive'); b.wingSize++; expect(b.wingSize).toBe(3, 'incremented wingSize value'); - expect(b._wingSize).toBe(3, 'ensure the original accessor works'); expect(count).toBe(3, 'Should be reactive'); } diff --git a/dist/index.test.js.map b/dist/index.test.js.map index f9cbc8a..746bb27 100644 --- a/dist/index.test.js.map +++ b/dist/index.test.js.map @@ -1 +1 @@ -{"version":3,"file":"index.test.js","names":["createComputed","createEffect","createRoot","createSignal","untrack","createMutable","render","html","createSignalObject","reactive","signalify","createSignalFunction","signal","createDeferredEffect","component","describe","it","num","set","expect","get","toBe","setResult","n","count","foo","runCount","stop","_stop","Promise","resolve","_initClass","_init_colors","_initProto","_Butterfly","Butterfly","e","c","_applyDecs","colors","_wingSize","wingSize","s","b","testButterflyProps","ensure","_initClass2","_init_colors2","Mid","b0","testProp","Object","getOwnPropertyDescriptor","call","_SubButterfly","SubButterfly","m","value","SubSubButterfly","b2","o","k","startVal","newVal","_initClass3","_initClass4","_init_colors3","_initProto2","_Insect2","_Insect","Insect","constructor","double","_Butterfly2","arg","_init_foo","_initClass5","_init_bar","Foo","_Bar","Bar","bar","toThrow","_initClass6","_init_do","_Doer","Doer","do","doer","newFunc","_initClass7","_init_amount","_initClass8","_init_double","_Foo2","_Foo","amount","_Bar2","noLoop","not","obj","obj2","butterfly","test","signalifyInitially","console","log","prototype","a","name","assign","create","countA","countB","_initClass9","onMountCalled","onCleanupCalled","_CoolComp","CoolComp","onMount","onCleanup","template","props","root","document","createElement","body","append","dispose","textContent","remove","_initProto3","args","_initClass10","_init_foo2","_init_bar2","_CoolComp2","setA","xit","_initClass11","_init_foo3","_init_bar3","_CoolComp3","initialColors","n1","num3","n3","undefined","num4","bool","b1","bool2","n4","func","fn","n5","func2","fn2","n6","stringOrFunc1","sf1","sf2","sf3","sf6","sf7","sf8","stringOrFunc2","sf9","sf10","sf11","sf12","sf13","sf14","sf15"],"sources":["../src/index.test.ts"],"sourcesContent":["import {createComputed, createEffect, createRoot, createSignal, untrack} from 'solid-js'\nimport {createMutable} from 'solid-js/store'\nimport {render} from 'solid-js/web'\nimport html from 'solid-js/html'\nimport {\n\tcreateSignalObject,\n\treactive,\n\tsignalify,\n\tcreateSignalFunction,\n\tsignal,\n\tcreateDeferredEffect,\n\tcomponent,\n} from './index.js'\n\n// TODO move type def to @lume/cli, map @types/jest's `expect` type into the\n// global env.\ndeclare global {\n\tfunction expect(...args: any[]): any\n}\n\ndescribe('classy-solid', () => {\n\tdescribe('createSignalObject()', () => {\n\t\tit('has gettable and settable values via .get and .set methods', async () => {\n\t\t\tconst num = createSignalObject(0)\n\n\t\t\t// Set the variable's value by passing a value in.\n\t\t\tnum.set(1)\n\t\t\t// Read the variable's value by calling it with no args.\n\t\t\texpect(num.get()).toBe(1)\n\n\t\t\t// increment example:\n\t\t\tconst setResult = num.set(num.get() + 1)\n\t\t\texpect(num.get()).toBe(2)\n\t\t\texpect(setResult).toBe(2)\n\n\t\t\t// Set with a function that accepts the previous value and returns the next value.\n\t\t\tnum.set(n => n + 1)\n\t\t\texpect(num.get()).toBe(3)\n\t\t})\n\t})\n\n\tdescribe('createSignalFunction()', () => {\n\t\tit('has gettable and settable values via a single overloaded function', async () => {\n\t\t\tconst num = createSignalFunction(0)\n\n\t\t\t// Set the variable's value by passing a value in.\n\t\t\tnum(1)\n\t\t\t// Read the variable's value by calling it with no args.\n\t\t\texpect(num()).toBe(1)\n\n\t\t\t// increment example:\n\t\t\tconst setResult = num(num() + 1)\n\t\t\texpect(num()).toBe(2)\n\t\t\texpect(setResult).toBe(2)\n\n\t\t\t// Set with a function that accepts the previous value and returns the next value.\n\t\t\tnum(n => n + 1)\n\t\t\texpect(num()).toBe(3)\n\t\t})\n\t})\n\n\tdescribe('createDeferredEffect()', () => {\n\t\tit('works', async () => {\n\t\t\tconst count = createSignalFunction(0)\n\t\t\tconst foo = createSignalFunction(0)\n\n\t\t\tlet runCount = 0\n\n\t\t\tconst stop = (() => {\n\t\t\t\tlet stop!: () => void\n\n\t\t\t\tcreateRoot(_stop => {\n\t\t\t\t\tstop = _stop\n\n\t\t\t\t\t// Runs once initially after the current root context just\n\t\t\t\t\t// like createEffect, then any time it re-runs due to a\n\t\t\t\t\t// change in a dependency, the re-run will be deferred in\n\t\t\t\t\t// the next microtask and will run only once (not once per\n\t\t\t\t\t// signal that changed)\n\t\t\t\t\tcreateDeferredEffect(() => {\n\t\t\t\t\t\tcount()\n\t\t\t\t\t\tfoo()\n\t\t\t\t\t\trunCount++\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\treturn stop\n\t\t\t})()\n\n\t\t\t// Queues the effect to run in the next microtask\n\t\t\tcount(1)\n\t\t\tcount(2)\n\t\t\tfoo(3)\n\n\t\t\t// Still 1 because the deferred effect didn't run yet, it will in the next microtask.\n\t\t\texpect(runCount).toBe(1)\n\n\t\t\tawait Promise.resolve()\n\n\t\t\t// It ran only once in the previous microtask (batched), not once per signal write.\n\t\t\texpect(runCount).toBe(2)\n\n\t\t\tcount(3)\n\t\t\tcount(4)\n\t\t\tfoo(5)\n\n\t\t\texpect(runCount).toBe(2)\n\n\t\t\tawait Promise.resolve()\n\n\t\t\texpect(runCount).toBe(3)\n\n\t\t\t// Stops the effect from re-running. It can now be garbage collected.\n\t\t\tstop()\n\n\t\t\tcount(3)\n\t\t\tcount(4)\n\t\t\tfoo(5)\n\n\t\t\texpect(runCount).toBe(3)\n\n\t\t\tawait Promise.resolve()\n\n\t\t\t// Still the same because it was stopped, so it didn't run in the\n\t\t\t// macrotask prior to the await.\n\t\t\texpect(runCount).toBe(3)\n\n\t\t\t// Double check just in case (the wrong implementation would make it\n\t\t\t// skip two microtasks before running).\n\t\t\tawait Promise.resolve()\n\t\t\texpect(runCount).toBe(3)\n\t\t})\n\t})\n\n\tdescribe('@reactive, @signal', () => {\n\t\t@reactive\n\t\tclass Butterfly {\n\t\t\t@signal colors = 3\n\n\t\t\t_wingSize = 2\n\n\t\t\t@signal\n\t\t\tget wingSize() {\n\t\t\t\treturn this._wingSize\n\t\t\t}\n\t\t\tset wingSize(s: number) {\n\t\t\t\tthis._wingSize = s\n\t\t\t}\n\t\t}\n\n\t\tit('makes class fields reactive, using class and field/accessor decorators', () => {\n\t\t\tconst b = new Butterfly()\n\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\tconst ensure = it\n\n\t\tensure('overridden fields work as expected', async () => {\n\t\t\tclass Mid extends Butterfly {\n\t\t\t\toverride colors = 0\n\t\t\t}\n\n\t\t\t// ensure subclass did not interfere with functionality of base class\n\t\t\tconst b0 = new Butterfly()\n\t\t\ttestProp(b0, 'colors', 3, 4, true)\n\t\t\texpect(Object.getOwnPropertyDescriptor(b0, 'colors')?.get?.call(b0) === 4).toBe(true) // accessor descriptor\n\n\t\t\t@reactive\n\t\t\tclass SubButterfly extends Mid {\n\t\t\t\t@signal override colors = 123\n\t\t\t}\n\n\t\t\t// ensure subclass did not interfere with functionality of base class\n\t\t\tconst m = new Mid()\n\t\t\ttestProp(m, 'colors', 0, 1, false)\n\t\t\texpect(Object.getOwnPropertyDescriptor(m, 'colors')?.value === 1).toBe(true) // value descriptor\n\n\t\t\tclass SubSubButterfly extends SubButterfly {\n\t\t\t\toverride colors = 456\n\t\t\t}\n\n\t\t\tconst b = new SubButterfly()\n\t\t\ttestButterflyProps(b, 123)\n\n\t\t\tconst b2 = new SubSubButterfly()\n\n\t\t\ttestProp(b2, 'colors', 456, 654, false)\n\t\t})\n\n\t\tfunction testProp(o: T, k: keyof T, startVal: any, newVal: any, reactive = true) {\n\t\t\tlet count = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\to[k]\n\t\t\t\tcount++\n\t\t\t})\n\n\t\t\texpect(o[k]).toBe(startVal)\n\t\t\texpect(count).toBe(1)\n\n\t\t\to[k] = newVal // should not be a signal, should not trigger\n\n\t\t\texpect(o[k]).toBe(newVal)\n\t\t\texpect(count).toBe(reactive ? 2 : 1)\n\t\t}\n\n\t\tit('does not prevent superclass constructor from receiving subclass constructor args', () => {\n\t\t\t@reactive\n\t\t\tclass Insect {\n\t\t\t\tconstructor(public double: number) {}\n\t\t\t}\n\n\t\t\t@reactive\n\t\t\tclass Butterfly extends Insect {\n\t\t\t\t@signal colors = 3\n\n\t\t\t\t_wingSize = 2\n\n\t\t\t\t@signal\n\t\t\t\tget wingSize() {\n\t\t\t\t\treturn this._wingSize\n\t\t\t\t}\n\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\tthis._wingSize = s\n\t\t\t\t}\n\n\t\t\t\tconstructor(arg: number) {\n\t\t\t\t\tsuper(arg * 2)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst b = new Butterfly(4)\n\n\t\t\texpect(b.double).toBe(8)\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\tit('throws an error when @signal is used without @reactive', async () => {\n\t\t\texpect(() => {\n\t\t\t\t// user forgot to use @reactive here\n\t\t\t\tclass Foo {\n\t\t\t\t\t@signal foo = 'hoo'\n\t\t\t\t}\n\n\t\t\t\tFoo\n\n\t\t\t\t@reactive\n\t\t\t\tclass Bar {\n\t\t\t\t\t@signal bar = 123\n\t\t\t\t}\n\n\t\t\t\tnew Bar()\n\t\t\t}).toThrow('Did you forget')\n\n\t\t\t// TODO how to check for an error thrown from a microtask?\n\t\t\t// (window.addEventListener('error') seems not to work)\n\t\t\t//\n\t\t\t// It just won't work, the error seems to never fire here in the\n\t\t\t// tests, but it works fine when testing manually in Chrome.\n\n\t\t\t// const errPromise = new Promise(r => window.addEventListener('error', e => r(e), {once: true}))\n\n\t\t\t// @reactive\n\t\t\t// class Foo {\n\t\t\t// \t@signal foo = 'hoo'\n\t\t\t// }\n\n\t\t\t// Foo\n\n\t\t\t// // user forgot to use @reactive here\n\t\t\t// class Bar {\n\t\t\t// \t@signal bar = 123\n\t\t\t// }\n\n\t\t\t// Bar\n\n\t\t\t// const err = await errPromise\n\n\t\t\t// expect(err.message).toContain('Did you forget')\n\t\t})\n\n\t\tit('works with function values', () => {\n\t\t\t// This test ensures that functions are handled propertly, because\n\t\t\t// if passed without being wrapped to a signal setter it will be\n\t\t\t// called immediately with the previous value and be expected to\n\t\t\t// return a new value, instead of being set as the actual new value.\n\n\t\t\t@reactive\n\t\t\tclass Doer {\n\t\t\t\t@signal do: (() => unknown) | null = null\n\t\t\t}\n\n\t\t\tconst doer = new Doer()\n\n\t\t\texpect(doer.do).toBe(null)\n\n\t\t\tconst newFunc = () => 123\n\t\t\tdoer.do = newFunc\n\n\t\t\texpect(doer.do).toBe(newFunc)\n\t\t\texpect(doer.do()).toBe(123)\n\t\t})\n\n\t\tit('automatically does not track reactivity in constructors when using decorators', () => {\n\t\t\t@reactive\n\t\t\tclass Foo {\n\t\t\t\t@signal amount = 3\n\t\t\t}\n\n\t\t\t@reactive\n\t\t\tclass Bar extends Foo {\n\t\t\t\t@signal double = 0\n\n\t\t\t\tconstructor() {\n\t\t\t\t\tsuper()\n\t\t\t\t\tthis.double = this.amount * 2 // this read of .amount should not be tracked\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet b: Bar\n\t\t\tlet count = 0\n\n\t\t\tfunction noLoop() {\n\t\t\t\tcreateEffect(() => {\n\t\t\t\t\tb = new Bar() // this should not track\n\t\t\t\t\tcount++\n\t\t\t\t})\n\t\t\t}\n\n\t\t\texpect(noLoop).not.toThrow()\n\n\t\t\tconst b2 = b!\n\n\t\t\tb!.amount = 4 // hence this should not trigger\n\n\t\t\t// If the effect ran only once initially, not when setting b.colors,\n\t\t\t// then both variables should reference the same instance\n\t\t\texpect(count).toBe(1)\n\t\t\texpect(b!).toBe(b2)\n\t\t})\n\t})\n\n\tdescribe('signalify()', () => {\n\t\tit('returns the same object that was passed in', () => {\n\t\t\tlet obj = {n: 123}\n\t\t\tlet obj2 = signalify(obj, 'n')\n\t\t\texpect(obj).toBe(obj2)\n\n\t\t\tobj = createMutable({n: 123})\n\t\t\tobj2 = signalify(obj, 'n')\n\t\t\texpect(obj).toBe(obj2)\n\t\t})\n\n\t\tdescribe('making objects reactive with signalify()', () => {\n\t\t\tit('', () => {\n\t\t\t\tconst butterfly = {\n\t\t\t\t\tcolors: 3,\n\n\t\t\t\t\t_wingSize: 2,\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tconst b = signalify(butterfly, 'colors', 'wingSize')\n\n\t\t\t\ttestButterflyProps(b)\n\n\t\t\t\t// quick type check:\n\t\t\t\t// @ts-expect-error \"foo\" is not a property on butterfly\n\t\t\t\tsignalify(butterfly, 'colors', 'wingSize', 'foo')\n\t\t\t})\n\n\t\t\tit('is not tracked inside of an effect to prevent loops', () => {\n\t\t\t\ttest(true)\n\t\t\t\ttest(false)\n\n\t\t\t\tfunction test(signalifyInitially: boolean) {\n\t\t\t\t\t// Library author provides obj\n\t\t\t\t\tconst obj = {n: 123}\n\t\t\t\t\tif (signalifyInitially) signalify(obj, 'n') // library author might signalify obj.n\n\n\t\t\t\t\t// User code:\n\t\t\t\t\tcreateEffect(() => {\n\t\t\t\t\t\t// o.n may or may not already be signalified, user does not know, but they want to be sure they can react to its changes.\n\t\t\t\t\t\tsignalify(obj, 'n')\n\n\t\t\t\t\t\tobj.n = 123 // does not make an infinite loop\n\n\t\t\t\t\t\t// A deeper effect will be reading the property.\n\t\t\t\t\t\tcreateEffect(() => {\n\t\t\t\t\t\t\tconsole.log(obj.n)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\n\t\t\t\t\t// No expectations in this test, the test passes if a maximum\n\t\t\t\t\t// callstack size error (infinite loop) does not happen.\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tdescribe('making reactive classes with signalify instead of with decorators', () => {\n\t\t\tit('makes class fields reactive, not using any decorators', () => {\n\t\t\t\tclass Butterfly {\n\t\t\t\t\tcolors = 3\n\n\t\t\t\t\t_wingSize = 2\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t}\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t}\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst b = new Butterfly()\n\n\t\t\t\ttestButterflyProps(b)\n\n\t\t\t\t// quick type check:\n\t\t\t\tconst b2 = new Butterfly()\n\t\t\t\t// @ts-expect-error \"foo\" is not a property on Butterfly\n\t\t\t\tsignalify(b2, 'colors', 'wingSize', 'foo')\n\t\t\t})\n\n\t\t\tit('makes constructor properties reactive, not using any decorators', () => {\n\t\t\t\tclass Butterfly {\n\t\t\t\t\tdeclare colors: number\n\n\t\t\t\t\tdeclare _wingSize: number\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t}\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t}\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tthis.colors = 3\n\t\t\t\t\t\tthis._wingSize = 2\n\n\t\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst b = new Butterfly()\n\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('works with a function-style class, with signalify in the constructor', () => {\n\t\t\t\tfunction Butterfly() {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis.colors = 3\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis._wingSize = 2\n\n\t\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('works with a function-style class, with properties on the prototype, and signalify in constructor', () => {\n\t\t\t\tfunction Butterfly() {\n\t\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tcolors: 3,\n\t\t\t\t\t_wingSize: 2,\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('can be used on a function-style class, with properties on the prototype, and signalify on the prototype', () => {\n\t\t\t\tfunction Butterfly() {}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tcolors: 3,\n\t\t\t\t\t_wingSize: 2,\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tsignalify(Butterfly.prototype, 'colors', 'wingSize')\n\n\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('can be used on a function-style class, with properties in the constructor, and signalify on the prototype', () => {\n\t\t\t\tfunction Butterfly() {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis.colors = 3\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis._wingSize = 2\n\t\t\t\t}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tsignalify(Butterfly.prototype, 'colors', 'wingSize')\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('show that signalify causes constructor to be reactive when used manually instead of decorators', () => {\n\t\t\t\tclass Foo {\n\t\t\t\t\tamount = 3\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this, 'amount')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tclass Bar extends Foo {\n\t\t\t\t\tdouble = 0\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsuper()\n\t\t\t\t\t\tsignalify(this, 'double')\n\t\t\t\t\t\tthis.double = this.amount * 2 // this tracks access of .amount\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet count = 0\n\t\t\t\tlet b!: Bar\n\n\t\t\t\tcreateEffect(() => {\n\t\t\t\t\tb = new Bar() // tracks .amount\n\t\t\t\t\tcount++\n\t\t\t\t})\n\n\t\t\t\texpect(count).toBe(1)\n\n\t\t\t\tb.amount = 4 // triggers\n\n\t\t\t\texpect(count).toBe(2)\n\t\t\t})\n\n\t\t\tit('show how to manually untrack constructors when not using decorators', () => {\n\t\t\t\tclass Foo {\n\t\t\t\t\tamount = 3\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this, 'amount')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tclass Bar extends Foo {\n\t\t\t\t\tdouble = 0\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsuper()\n\t\t\t\t\t\tsignalify(this, 'double')\n\n\t\t\t\t\t\tuntrack(() => {\n\t\t\t\t\t\t\tthis.double = this.amount * 2\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet count = 0\n\t\t\t\tlet b!: Bar\n\n\t\t\t\tcreateEffect(() => {\n\t\t\t\t\tb = new Bar() // does not track .amount\n\t\t\t\t\tcount++\n\t\t\t\t})\n\n\t\t\t\texpect(count).toBe(1)\n\n\t\t\t\tb.amount = 4 // will not trigger\n\n\t\t\t\texpect(count).toBe(1)\n\t\t\t})\n\t\t})\n\n\t\tit('creates signal storage per descriptor+object pair, not per descriptor', () => {\n\t\t\t// This ensures we don't accidentally share a signal with multiple\n\t\t\t// objects. For example, we don't want a single signal per descriptor\n\t\t\t// because if the descriptor is on a prototype object, then that single\n\t\t\t// signal will erroneously be used by all objects extending from that\n\t\t\t// prototype.\n\n\t\t\tconst a = signalify({foo: 0, name: 'a'}, 'foo')\n\t\t\tconst b = Object.assign(Object.create(a) as typeof a, {name: 'b'})\n\n\t\t\texpect(a.foo).toBe(0)\n\t\t\texpect(b.foo).toBe(0)\n\n\t\t\tlet countA = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\ta.foo\n\t\t\t\tcountA++\n\t\t\t})\n\n\t\t\tlet countB = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\tb.foo\n\t\t\t\tcountB++\n\t\t\t})\n\n\t\t\texpect(countA).toBe(1)\n\t\t\texpect(countB).toBe(1)\n\n\t\t\ta.foo++\n\n\t\t\texpect(a.foo).toBe(1)\n\t\t\texpect(countA).toBe(2)\n\n\t\t\t// ensure that updating a's foo property did not update b's foo\n\t\t\t// property or trigger b's effect, despite that the property is\n\t\t\t// defined in a single location on the prototype.\n\t\t\t// @ts-ignore\n\t\t\texpect(b.foo).toBe(0)\n\t\t\texpect(countB).toBe(1)\n\t\t})\n\t})\n\n\tdescribe('@component', () => {\n\t\tit('allows to define a class using class syntax', () => {\n\t\t\tlet onMountCalled = false\n\t\t\tlet onCleanupCalled = false\n\n\t\t\t@component\n\t\t\tclass CoolComp {\n\t\t\t\tonMount() {\n\t\t\t\t\tonMountCalled = true\n\t\t\t\t}\n\n\t\t\t\tonCleanup() {\n\t\t\t\t\tonCleanupCalled = true\n\t\t\t\t}\n\n\t\t\t\ttemplate(props: any) {\n\t\t\t\t\texpect(props.foo).toBe(123)\n\t\t\t\t\treturn html`
hello classes!
`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tconst dispose = render(() => html`<${CoolComp} foo=${123} />`, root)\n\n\t\t\texpect(root.textContent).toBe('hello classes!')\n\t\t\texpect(onMountCalled).toBe(true)\n\t\t\texpect(onCleanupCalled).toBe(false)\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\n\t\t\texpect(onCleanupCalled).toBe(true)\n\n\t\t\t// throws on non-class use\n\t\t\texpect(() => {\n\t\t\t\tclass CoolComp {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t@component\n\t\t\t\t\tonMount() {}\n\t\t\t\t}\n\t\t\t\tCoolComp\n\t\t\t}).toThrow('component decorator should only be used on a class')\n\t\t})\n\n\t\tit('works in tandem with @reactive and @signal for reactivity', async () => {\n\t\t\t@component\n\t\t\t@reactive\n\t\t\tclass CoolComp {\n\t\t\t\t@signal foo = 0\n\t\t\t\t@signal bar = 0\n\n\t\t\t\ttemplate() {\n\t\t\t\t\treturn html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tconst [a, setA] = createSignal(1)\n\t\t\tconst b = createSignalFunction(2)\n\n\t\t\t// FIXME Why do we need `() => b()` instead of just `b` here? Does `html`\n\t\t\t// check the `length` of the function and do something based on\n\t\t\t// that? Or does it get passed to a @signal property's setter and\n\t\t\t// receives the previous value?\n\t\t\tconst dispose = render(() => html`<${CoolComp} foo=${a} bar=${() => b()} />`, root)\n\n\t\t\texpect(root.textContent).toBe('foo: 1, bar: 2')\n\n\t\t\tsetA(3)\n\t\t\tb(4)\n\n\t\t\texpect(root.textContent).toBe('foo: 3, bar: 4')\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\t\t})\n\n\t\tit('works without decorators', () => {\n\t\t\tconst CoolComp = component(\n\t\t\t\tclass CoolComp {\n\t\t\t\t\tfoo = 0\n\t\t\t\t\tbar = 0\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this)\n\t\t\t\t\t}\n\n\t\t\t\t\ttemplate() {\n\t\t\t\t\t\treturn html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tconst [a, setA] = createSignal(1)\n\t\t\tconst b = createSignalFunction(2)\n\n\t\t\t// FIXME Why do we need `() => b()` instead of just `b` here? Does `html`\n\t\t\t// check the `length` of the function and do something based on\n\t\t\t// that? Or does it get passed to a @signal property's setter and\n\t\t\t// receives the previous value?\n\t\t\tconst dispose = render(() => html`<${CoolComp} foo=${a} bar=${() => b()} />`, root)\n\n\t\t\texpect(root.textContent).toBe('foo: 1, bar: 2')\n\n\t\t\tsetA(3)\n\t\t\tb(4)\n\n\t\t\texpect(root.textContent).toBe('foo: 3, bar: 4')\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\t\t})\n\n\t\t// FIXME not working, the spread doesn't seem to do anything.\n\t\txit('works with reactive spreads', async () => {\n\t\t\t@component\n\t\t\t@reactive\n\t\t\tclass CoolComp {\n\t\t\t\t@signal foo = 0\n\t\t\t\t@signal bar = 0\n\n\t\t\t\ttemplate() {\n\t\t\t\t\treturn html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tlet o = createMutable({o: {foo: 123}})\n\n\t\t\t// neither of these work\n\t\t\t// const dispose = render(() => html`<${CoolComp} ...${() => o.o} />`, root)\n\t\t\tconst dispose = render(() => html`<${CoolComp} ...${o.o} />`, root)\n\n\t\t\texpect(root.textContent).toBe('foo: 123, bar: 0')\n\n\t\t\to.o = {bar: 456}\n\n\t\t\texpect(root.textContent).toBe('foo: 123, bar: 456')\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\t\t})\n\t})\n})\n\nfunction testButterflyProps(b: {colors: number; wingSize: number; _wingSize: number}, initialColors = 3) {\n\tlet count = 0\n\n\tcreateRoot(() => {\n\t\tcreateComputed(() => {\n\t\t\tb.colors\n\t\t\tb.wingSize\n\t\t\tcount++\n\t\t})\n\t})\n\n\texpect(b.colors).toBe(initialColors, 'initial colors value')\n\texpect(b.wingSize).toBe(2, 'initial wingSize value')\n\texpect(b._wingSize).toBe(2, 'ensure the original accessor works')\n\texpect(count).toBe(1, 'Should be reactive')\n\n\tb.colors++\n\n\texpect(b.colors).toBe(initialColors + 1, 'incremented colors value')\n\texpect(count).toBe(2, 'Should be reactive')\n\n\tb.wingSize++\n\n\texpect(b.wingSize).toBe(3, 'incremented wingSize value')\n\texpect(b._wingSize).toBe(3, 'ensure the original accessor works')\n\texpect(count).toBe(3, 'Should be reactive')\n}\n\n//////////////////////////////////////////////////////////////////////////\n// createSignalObject type tests ///////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////\n\n{\n\tconst num = createSignalObject(1)\n\tlet n1: number = num.get()\n\tn1\n\tnum.set(123)\n\tnum.set(n => (n1 = n + 1))\n\t// @ts-expect-error Expected 1 arguments, but got 0. ts(2554)\n\tnum.set()\n\n\tconst num3 = createSignalObject()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n3: number = num3.get()\n\tnum3.set(123)\n\tnum3.set(undefined) // ok, accepts undefined\n\t// @ts-expect-error Object is possibly 'undefined'. ts(2532) (the `n` value)\n\tnum3.set(n => (n3 = n + 1))\n\t// num3.set() // ok, accepts undefined // FIXME broke in Solid 1.7.9\n\n\t// @ts-expect-error Argument of type 'boolean' is not assignable to parameter of type 'number'. ts(2345)\n\tconst num4 = createSignalObject(true)\n\n\tconst bool = createSignalObject(true)\n\tlet b1: boolean = bool.get()\n\tb1\n\tbool.set(false)\n\tbool.set(b => (b1 = !b))\n\t// @ts-expect-error Expected 1 arguments, but got 0. ts(2554)\n\tbool.set()\n\n\tconst bool2 = createSignalObject()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n4: boolean = bool2.get()\n\tbool2.set(false)\n\tbool2.set(undefined) // ok, accepts undefined\n\tbool2.set(n => (n4 = !n)) // ok because undefined is being converted to boolean\n\t// @ts-expect-error Type 'boolean | undefined' is not assignable to type 'boolean'. ts(2322)\n\tbool2.set(n => (n4 = n))\n\t// bool2.set() // ok, accepts undefined // FIXME try Solid 1.7.9\n\n\tconst func = createSignalObject(() => 1)\n\t// @ts-expect-error 1 is not assignable to function (no overload matches)\n\tfunc.set(() => 1)\n\tfunc.set(() => (): 1 => 1) // ok, set the value to a function\n\tconst fn: () => 1 = func.get() // ok, returns function value\n\tfn\n\tconst n5: 1 = func.get()()\n\tn5\n\n\tconst func2 = createSignalObject<() => number>(() => 1)\n\t// @FIXME-ts-expect-error number is not assignable to function (no overload matches)\n\tfunc2.set(() => 1) // FIXME should be a type error. Try Solid 1.7.9\n\tfunc2.set(() => () => 1) // ok, set the value to a function\n\tconst fn2: () => number = func2.get() // ok, returns function value\n\tfn2\n\tconst n6: number = func2.get()()\n\tn6\n\n\tconst stringOrFunc1 = createSignalObject<(() => number) | string>('')\n\t// @FIXME-ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc1.set(() => 1) // FIXME should be a type error. Try Solid 1.7.9\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf1: () => number = stringOrFunc1.set(() => () => 1)\n\tsf1\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf2: string = stringOrFunc1.set('oh yeah')\n\tsf2\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf3: string = stringOrFunc1.set(() => 'oh yeah')\n\tsf3\n\t// @ts-expect-error cannot set signal to undefined\n\tstringOrFunc1.set()\n\t// @ts-expect-error cannot set signal to undefined\n\tstringOrFunc1.set(undefined)\n\t// @ts-expect-error return value might be string\n\tconst sf6: () => number = stringOrFunc1.get()\n\tsf6\n\tconst sf7: (() => number) | string | undefined = stringOrFunc1.get()\n\tsf7\n\tconst sf8: (() => number) | string = stringOrFunc1.get()\n\tsf8\n\n\tconst stringOrFunc2 = createSignalObject<(() => number) | string>()\n\t// @FIXME-ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc2.set(() => 1) // FIXME should be a type error. Try Solid 1.7.9\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf9: () => number = stringOrFunc2.set(() => () => 1)\n\tsf9\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf10: string = stringOrFunc2.set('oh yeah')\n\tsf10\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf11: string = stringOrFunc2.set(() => 'oh yeah')\n\tsf11\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf12: undefined = stringOrFunc2.set()\n\tsf12\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf13: undefined = stringOrFunc2.set(undefined)\n\tsf13\n\tconst sf14: (() => number) | string | undefined = stringOrFunc2.get()\n\tsf14\n\t// @ts-expect-error return value might be undefined\n\tconst sf15: (() => number) | string = stringOrFunc2.get()\n\tsf15\n}\n\n//////////////////////////////////////////////////////////////////////////\n// createSignalFunction type tests ///////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////\n\n{\n\tconst num = createSignalFunction(1)\n\tlet n1: number = num()\n\tn1\n\tnum(123)\n\tnum(n => (n1 = n + 1))\n\tnum()\n\n\tconst num3 = createSignalFunction()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n3: number = num3()\n\tnum3(123)\n\tnum3(undefined) // ok, accepts undefined\n\t// @ts-expect-error Object is possibly 'undefined'. ts(2532) (the `n` value)\n\tnum3(n => (n3 = n + 1))\n\tnum3() // ok, getter\n\n\t// @ts-expect-error Argument of type 'boolean' is not assignable to parameter of type 'number'. ts(2345)\n\tconst num4 = createSignalFunction(true)\n\n\tconst bool = createSignalFunction(true)\n\tlet b1: boolean = bool()\n\tb1\n\tbool(false)\n\tbool(b => (b1 = !b))\n\tbool()\n\n\tconst bool2 = createSignalFunction()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n4: boolean = bool2()\n\tbool2(false)\n\tbool2(undefined) // ok, accepts undefined\n\tbool2(n => (n4 = !n)) // ok because undefined is being converted to boolean\n\t// @ts-expect-error Type 'boolean | undefined' is not assignable to type 'boolean'. ts(2322)\n\tbool2(n => (n4 = n))\n\tbool2() // ok, accepts undefined\n\n\tconst func = createSignalFunction(() => 1)\n\t// @ts-expect-error 1 is not assignable to function (no overload matches)\n\tfunc(() => 1)\n\tfunc(() => (): 1 => 1) // ok, set the value to a function\n\tconst fn: () => 1 = func() // ok, returns function value\n\tfn\n\tconst n5: 1 = func()()\n\tn5\n\n\tconst func2 = createSignalFunction<() => number>(() => 1)\n\t// @ts-expect-error number is not assignable to function (no overload matches)\n\tfunc2(() => 1)\n\tfunc2(() => () => 1) // ok, set the value to a function\n\tconst fn2: () => number = func2() // ok, returns function value\n\tfn2\n\tconst n6: number = func2()()\n\tn6\n\n\tconst stringOrFunc1 = createSignalFunction<(() => number) | string>('')\n\t// @ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc1(() => 1)\n\tconst sf1: () => number = stringOrFunc1(() => () => 1)\n\tsf1\n\tconst sf2: string = stringOrFunc1('oh yeah')\n\tsf2\n\tconst sf3: string = stringOrFunc1(() => 'oh yeah')\n\tsf3\n\tstringOrFunc1() // ok, getter\n\t// @ts-expect-error cannot set signal to undefined\n\tstringOrFunc1(undefined)\n\t// @ts-expect-error return value might be string\n\tconst sf6: () => number = stringOrFunc1()\n\tsf6\n\tconst sf7: (() => number) | string | undefined = stringOrFunc1()\n\tsf7\n\tconst sf8: (() => number) | string = stringOrFunc1()\n\tsf8\n\n\tconst stringOrFunc2 = createSignalFunction<(() => number) | string>()\n\t// @ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc2(() => 1)\n\tconst sf9: () => number = stringOrFunc2(() => () => 1)\n\tsf9\n\tconst sf10: string = stringOrFunc2('oh yeah')\n\tsf10\n\tconst sf11: string = stringOrFunc2(() => 'oh yeah')\n\tsf11\n\t// @ts-expect-error 'string | (() => number) | undefined' is not assignable to type 'undefined'.\n\tconst sf12: undefined = stringOrFunc2()\n\tsf12\n\tconst sf13: undefined = stringOrFunc2(undefined)\n\tsf13\n\tconst sf14: (() => number) | string | undefined = stringOrFunc2()\n\tsf14\n\t// @ts-expect-error return value might be undefined\n\tconst sf15: (() => number) | string = stringOrFunc2()\n\tsf15\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.test.js","names":["createComputed","createEffect","createRoot","createSignal","untrack","createMutable","render","html","createSignalObject","reactive","signalify","createSignalFunction","signal","createDeferredEffect","component","describe","it","num","set","expect","get","toBe","setResult","n","f1","func","f2","count","foo","runCount","stop","_stop","Promise","resolve","_initClass","_init_colors","_initProto","_init_colors2","_init_wingSize","_init_finalize","_init_colors3","_init_finalize2","_initProto2","_init_colors4","_init_wingSize2","_init_finalize3","_initProto3","_initClass2","_init_colors5","_init_wingSize3","_initProto4","_init_colors6","_get_colors","_set_colors","_initProto5","_call_colors","_call_colors2","_initProto6","_Butterfly","Butterfly","e","c","_applyDecs","colors","wingSize","s","b","testButterflyProps","Butterfly2","o","finalize","v","_","Butterfly3","Butterfly4","A","_Butterfly2","Butterfly5","Butterfly6","#colors","getColors","setColors","testPrivate","Butterfly7","_colors","constructor","args","ensure","_initClass3","_init_colors7","Mid","b0","testProp","Object","getOwnPropertyDescriptor","call","_SubButterfly","SubButterfly","m","value","SubSubButterfly","b2","k","startVal","newVal","_initClass4","_initClass5","_init_colors8","_initProto7","_Insect2","_Insect","Insect","double","_Butterfly3","arg","_init_foo","_initClass6","_init_bar","Foo","_Bar","Bar","bar","toThrow","_initClass7","_init_do","_Doer","Doer","do","doer","newFunc","_initClass8","_init_amount","_initClass9","_init_double","_Foo2","_Foo","amount","_Bar2","noLoop","not","obj","obj2","butterfly","_wingSize","test","signalifyInitially","console","log","prototype","a","name","assign","create","countA","countB","_initClass10","onMountCalled","onCleanupCalled","_CoolComp","CoolComp","onMount","onCleanup","template","props","root","document","createElement","body","append","dispose","textContent","remove","_initProto8","_initClass11","_init_foo2","_init_bar2","_CoolComp2","setA","xit","_initClass12","_init_foo3","_init_bar3","_CoolComp3","initialColors","n1","num3","n3","undefined","num4","bool","b1","bool2","n4","fn","n5","func2","fn2","n6","stringOrFunc1","sf1","sf2","sf3","sf6","sf7","sf8","stringOrFunc2","sf9","sf10","sf11","sf12","sf13","sf14","sf15"],"sources":["../src/index.test.ts"],"sourcesContent":["import {createComputed, createEffect, createRoot, createSignal, untrack} from 'solid-js'\nimport {createMutable} from 'solid-js/store'\nimport {render} from 'solid-js/web'\nimport html from 'solid-js/html'\nimport {\n\tcreateSignalObject,\n\treactive,\n\tsignalify,\n\tcreateSignalFunction,\n\tsignal,\n\tcreateDeferredEffect,\n\tcomponent,\n} from './index.js'\n\n// TODO move type def to @lume/cli, map @types/jest's `expect` type into the\n// global env.\ndeclare global {\n\tfunction expect(...args: any[]): any\n}\n\ndescribe('classy-solid', () => {\n\tdescribe('createSignalObject()', () => {\n\t\tit('has gettable and settable values via .get and .set methods', () => {\n\t\t\tconst num = createSignalObject(0)\n\n\t\t\t// Set the variable's value by passing a value in.\n\t\t\tnum.set(1)\n\t\t\t// Read the variable's value by calling it with no args.\n\t\t\texpect(num.get()).toBe(1)\n\n\t\t\t// increment example:\n\t\t\tconst setResult = num.set(num.get() + 1)\n\t\t\texpect(num.get()).toBe(2)\n\t\t\texpect(setResult).toBe(2)\n\n\t\t\t// Set with a function that accepts the previous value and returns the next value.\n\t\t\tnum.set(n => n + 1)\n\t\t\texpect(num.get()).toBe(3)\n\t\t})\n\t})\n\n\tdescribe('createSignalFunction()', () => {\n\t\tit('has gettable and settable values via a single overloaded function', () => {\n\t\t\tconst num = createSignalFunction(0)\n\n\t\t\t// Set the variable's value by passing a value in.\n\t\t\tnum(1)\n\t\t\t// Read the variable's value by calling it with no args.\n\t\t\texpect(num()).toBe(1)\n\n\t\t\t// increment example:\n\t\t\tconst setResult = num(num() + 1)\n\t\t\texpect(num()).toBe(2)\n\t\t\texpect(setResult).toBe(2)\n\n\t\t\t// Set with a function that accepts the previous value and returns the next value.\n\t\t\tnum(n => n + 1)\n\t\t\texpect(num()).toBe(3)\n\t\t})\n\n\t\tit('works with function values', () => {\n\t\t\tconst f1 = () => 123\n\t\t\tconst func = createSignalFunction(f1)\n\n\t\t\texpect(func()).toBe(f1)\n\n\t\t\tconst f2 = () => 456\n\t\t\tfunc(() => f2)\n\n\t\t\texpect(func()).toBe(f2)\n\t\t})\n\t})\n\n\tdescribe('createDeferredEffect()', () => {\n\t\tit('works', async () => {\n\t\t\tconst count = createSignalFunction(0)\n\t\t\tconst foo = createSignalFunction(0)\n\n\t\t\tlet runCount = 0\n\n\t\t\tconst stop = (() => {\n\t\t\t\tlet stop!: () => void\n\n\t\t\t\tcreateRoot(_stop => {\n\t\t\t\t\tstop = _stop\n\n\t\t\t\t\t// Runs once initially after the current root context just\n\t\t\t\t\t// like createEffect, then any time it re-runs due to a\n\t\t\t\t\t// change in a dependency, the re-run will be deferred in\n\t\t\t\t\t// the next microtask and will run only once (not once per\n\t\t\t\t\t// signal that changed)\n\t\t\t\t\tcreateDeferredEffect(() => {\n\t\t\t\t\t\tcount()\n\t\t\t\t\t\tfoo()\n\t\t\t\t\t\trunCount++\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\treturn stop\n\t\t\t})()\n\n\t\t\t// Queues the effect to run in the next microtask\n\t\t\tcount(1)\n\t\t\tcount(2)\n\t\t\tfoo(3)\n\n\t\t\t// Still 1 because the deferred effect didn't run yet, it will in the next microtask.\n\t\t\texpect(runCount).toBe(1)\n\n\t\t\tawait Promise.resolve()\n\n\t\t\t// It ran only once in the previous microtask (batched), not once per signal write.\n\t\t\texpect(runCount).toBe(2)\n\n\t\t\tcount(3)\n\t\t\tcount(4)\n\t\t\tfoo(5)\n\n\t\t\texpect(runCount).toBe(2)\n\n\t\t\tawait Promise.resolve()\n\n\t\t\texpect(runCount).toBe(3)\n\n\t\t\t// Stops the effect from re-running. It can now be garbage collected.\n\t\t\tstop()\n\n\t\t\tcount(3)\n\t\t\tcount(4)\n\t\t\tfoo(5)\n\n\t\t\texpect(runCount).toBe(3)\n\n\t\t\tawait Promise.resolve()\n\n\t\t\t// Still the same because it was stopped, so it didn't run in the\n\t\t\t// macrotask prior to the await.\n\t\t\texpect(runCount).toBe(3)\n\n\t\t\t// Double check just in case (the wrong implementation would make it\n\t\t\t// skip two microtasks before running).\n\t\t\tawait Promise.resolve()\n\t\t\texpect(runCount).toBe(3)\n\t\t})\n\t})\n\n\tdescribe('@reactive, @signal', () => {\n\t\t@reactive\n\t\tclass Butterfly {\n\t\t\t@signal colors = 3\n\n\t\t\t#wingSize = 2\n\n\t\t\t@signal get wingSize() {\n\t\t\t\treturn this.#wingSize\n\t\t\t}\n\t\t\t@signal set wingSize(s: number) {\n\t\t\t\tthis.#wingSize = s\n\t\t\t}\n\t\t}\n\n\t\tit('makes class fields reactive, using class and field/getter/setter decorators', () => {\n\t\t\tconst b = new Butterfly()\n\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\t// @reactive\n\t\tclass Butterfly2 {\n\t\t\t@signal colors = 3\n\t\t\t@signal wingSize = 2\n\t\t\t// @ts-ignore\n\t\t\t@signal #finalize\n\t\t}\n\n\t\tit('makes class fields reactive, using field decorators without class decorator', () => {\n\t\t\tconst b = new Butterfly2()\n\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\tclass Butterfly3 {\n\t\t\t@signal colors = 3\n\n\t\t\t#wingSize = 2\n\n\t\t\t@signal get wingSize() {\n\t\t\t\treturn this.#wingSize\n\t\t\t}\n\t\t\t@signal set wingSize(s: number) {\n\t\t\t\tthis.#wingSize = s\n\t\t\t}\n\n\t\t\t// @ts-ignore\n\t\t\t@signal #finalize\n\t\t}\n\n\t\tit('makes class fields reactive, using field/getter/setter decorators without class decorator', () => {\n\t\t\tconst b = new Butterfly3()\n\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\tclass Butterfly4 {\n\t\t\t@signal colors = 3\n\t\t\t@signal accessor wingSize = 2\n\t\t\t// @ts-ignore\n\t\t\t@signal #finalize\n\t\t}\n\n\t\tit('makes class fields reactive, using field/accessor decorators without class decorator', () => {\n\t\t\tconst b = new Butterfly4()\n\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\t@reactive\n\t\tclass Butterfly5 {\n\t\t\t@signal colors = 3\n\t\t\t@signal accessor wingSize = 2\n\t\t}\n\n\t\tit('makes class fields reactive, using field/accessor decorators with class decorator', () => {\n\t\t\tconst b = new Butterfly5()\n\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\tclass Butterfly6 {\n\t\t\t@signal accessor #colors = 3\n\n\t\t\tgetColors() {\n\t\t\t\treturn this.#colors\n\t\t\t}\n\t\t\tsetColors(v: number) {\n\t\t\t\treturn (this.#colors = v)\n\t\t\t}\n\t\t}\n\n\t\tit('makes private class auto accessor reactive', () => {\n\t\t\tconst b = new Butterfly6()\n\t\t\ttestPrivate(b)\n\t\t})\n\n\t\tclass Butterfly7 {\n\t\t\t#_colors = 3\n\n\t\t\t@signal get #colors() {\n\t\t\t\treturn this.#_colors\n\t\t\t}\n\t\t\t@signal set #colors(v: number) {\n\t\t\t\tthis.#_colors = v\n\t\t\t}\n\n\t\t\tgetColors() {\n\t\t\t\treturn this.#colors\n\t\t\t}\n\t\t\tsetColors(v: number) {\n\t\t\t\treturn (this.#colors = v)\n\t\t\t}\n\t\t}\n\n\t\tit('makes private class getter/setter accessors reactive', () => {\n\t\t\tconst b = new Butterfly7()\n\t\t\ttestPrivate(b)\n\t\t})\n\n\t\tfunction testPrivate(b: Pick) {\n\t\t\tlet count = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\tb.getColors()\n\t\t\t\tcount++\n\t\t\t})\n\n\t\t\texpect(b.getColors()).toBe(3)\n\t\t\texpect(count).toBe(1)\n\n\t\t\tb.setColors(5)\n\t\t\texpect(b.getColors()).toBe(5)\n\t\t\texpect(count).toBe(2)\n\t\t}\n\n\t\tconst ensure = it\n\n\t\tensure('overridden fields work as expected', async () => {\n\t\t\tclass Mid extends Butterfly {\n\t\t\t\toverride colors = 0\n\t\t\t}\n\n\t\t\t// ensure subclass did not interfere with functionality of base class\n\t\t\tconst b0 = new Butterfly()\n\t\t\ttestProp(b0, 'colors', 3, 4, true)\n\t\t\texpect(Object.getOwnPropertyDescriptor(b0, 'colors')?.get?.call(b0) === 4).toBe(true) // accessor descriptor\n\n\t\t\t@reactive\n\t\t\tclass SubButterfly extends Mid {\n\t\t\t\t@signal override colors = 123\n\t\t\t}\n\n\t\t\t// ensure subclass did not interfere with functionality of base class\n\t\t\tconst m = new Mid()\n\t\t\ttestProp(m, 'colors', 0, 1, false)\n\t\t\texpect(Object.getOwnPropertyDescriptor(m, 'colors')?.value === 1).toBe(true) // value descriptor\n\n\t\t\tclass SubSubButterfly extends SubButterfly {\n\t\t\t\toverride colors = 456\n\t\t\t}\n\n\t\t\tconst b = new SubButterfly()\n\t\t\ttestButterflyProps(b, 123)\n\n\t\t\tconst b2 = new SubSubButterfly()\n\n\t\t\ttestProp(b2, 'colors', 456, 654, false)\n\t\t})\n\n\t\tfunction testProp(o: T, k: keyof T, startVal: any, newVal: any, reactive = true) {\n\t\t\tlet count = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\to[k]\n\t\t\t\tcount++\n\t\t\t})\n\n\t\t\texpect(o[k]).toBe(startVal)\n\t\t\texpect(count).toBe(1)\n\n\t\t\to[k] = newVal // should not be a signal, should not trigger\n\n\t\t\texpect(o[k]).toBe(newVal)\n\t\t\texpect(count).toBe(reactive ? 2 : 1)\n\t\t}\n\n\t\tit('does not prevent superclass constructor from receiving subclass constructor args', () => {\n\t\t\t@reactive\n\t\t\tclass Insect {\n\t\t\t\tconstructor(public double: number) {}\n\t\t\t}\n\n\t\t\t@reactive\n\t\t\tclass Butterfly extends Insect {\n\t\t\t\t@signal colors = 3\n\n\t\t\t\t#wingSize = 2\n\n\t\t\t\t@signal get wingSize() {\n\t\t\t\t\treturn this.#wingSize\n\t\t\t\t}\n\t\t\t\t@signal set wingSize(s: number) {\n\t\t\t\t\tthis.#wingSize = s\n\t\t\t\t}\n\n\t\t\t\tconstructor(arg: number) {\n\t\t\t\t\tsuper(arg * 2)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst b = new Butterfly(4)\n\n\t\t\texpect(b.double).toBe(8)\n\t\t\ttestButterflyProps(b)\n\t\t})\n\n\t\tit('throws an error when @signal is used without @reactive', async () => {\n\t\t\texpect(() => {\n\t\t\t\t// user forgot to use @reactive here\n\t\t\t\tclass Foo {\n\t\t\t\t\t@signal foo = 'hoo'\n\t\t\t\t}\n\n\t\t\t\tFoo\n\n\t\t\t\t@reactive\n\t\t\t\tclass Bar {\n\t\t\t\t\t@signal bar = 123\n\t\t\t\t}\n\n\t\t\t\tnew Bar()\n\t\t\t}).toThrow('Did you forget')\n\n\t\t\t// TODO how to check for an error thrown from a microtask?\n\t\t\t// (window.addEventListener('error') seems not to work)\n\t\t\t//\n\t\t\t// It just won't work, the error seems to never fire here in the\n\t\t\t// tests, but it works fine when testing manually in Chrome.\n\n\t\t\t// const errPromise = new Promise(r => window.addEventListener('error', e => r(e), {once: true}))\n\n\t\t\t// @reactive\n\t\t\t// class Foo {\n\t\t\t// \t@signal foo = 'hoo'\n\t\t\t// }\n\n\t\t\t// Foo\n\n\t\t\t// // user forgot to use @reactive here\n\t\t\t// class Bar {\n\t\t\t// \t@signal bar = 123\n\t\t\t// }\n\n\t\t\t// Bar\n\n\t\t\t// const err = await errPromise\n\n\t\t\t// expect(err.message).toContain('Did you forget')\n\t\t})\n\n\t\tit('works with function values', () => {\n\t\t\t// This test ensures that functions are handled propertly, because\n\t\t\t// if passed without being wrapped to a signal setter it will be\n\t\t\t// called immediately with the previous value and be expected to\n\t\t\t// return a new value, instead of being set as the actual new value.\n\n\t\t\t@reactive\n\t\t\tclass Doer {\n\t\t\t\t@signal do: (() => unknown) | null = null\n\t\t\t}\n\n\t\t\tconst doer = new Doer()\n\n\t\t\texpect(doer.do).toBe(null)\n\n\t\t\tconst newFunc = () => 123\n\t\t\tdoer.do = newFunc\n\n\t\t\texpect(doer.do).toBe(newFunc)\n\t\t\texpect(doer.do()).toBe(123)\n\t\t})\n\n\t\tit('automatically does not track reactivity in constructors when using decorators', () => {\n\t\t\t@reactive\n\t\t\tclass Foo {\n\t\t\t\t@signal amount = 3\n\t\t\t}\n\n\t\t\t@reactive\n\t\t\tclass Bar extends Foo {\n\t\t\t\t@signal double = 0\n\n\t\t\t\tconstructor() {\n\t\t\t\t\tsuper()\n\t\t\t\t\tthis.double = this.amount * 2 // this read of .amount should not be tracked\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet b: Bar\n\t\t\tlet count = 0\n\n\t\t\tfunction noLoop() {\n\t\t\t\tcreateEffect(() => {\n\t\t\t\t\tb = new Bar() // this should not track\n\t\t\t\t\tcount++\n\t\t\t\t})\n\t\t\t}\n\n\t\t\texpect(noLoop).not.toThrow()\n\n\t\t\tconst b2 = b!\n\n\t\t\tb!.amount = 4 // hence this should not trigger\n\n\t\t\t// If the effect ran only once initially, not when setting b.colors,\n\t\t\t// then both variables should reference the same instance\n\t\t\texpect(count).toBe(1)\n\t\t\texpect(b!).toBe(b2)\n\t\t})\n\t})\n\n\tdescribe('signalify()', () => {\n\t\tit('returns the same object that was passed in', () => {\n\t\t\tlet obj = {n: 123}\n\t\t\tlet obj2 = signalify(obj, 'n')\n\t\t\texpect(obj).toBe(obj2)\n\n\t\t\tobj = createMutable({n: 123})\n\t\t\tobj2 = signalify(obj, 'n')\n\t\t\texpect(obj).toBe(obj2)\n\t\t})\n\n\t\tdescribe('making objects reactive with signalify()', () => {\n\t\t\tit('', () => {\n\t\t\t\tconst butterfly = {\n\t\t\t\t\tcolors: 3,\n\n\t\t\t\t\t_wingSize: 2,\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tconst b = signalify(butterfly, 'colors', 'wingSize')\n\n\t\t\t\ttestButterflyProps(b)\n\n\t\t\t\t// quick type check:\n\t\t\t\t// @ts-expect-error \"foo\" is not a property on butterfly\n\t\t\t\tsignalify(butterfly, 'colors', 'wingSize', 'foo')\n\t\t\t})\n\n\t\t\tit('is not tracked inside of an effect to prevent loops', () => {\n\t\t\t\ttest(true)\n\t\t\t\ttest(false)\n\n\t\t\t\tfunction test(signalifyInitially: boolean) {\n\t\t\t\t\t// Library author provides obj\n\t\t\t\t\tconst obj = {n: 123}\n\t\t\t\t\tif (signalifyInitially) signalify(obj, 'n') // library author might signalify obj.n\n\n\t\t\t\t\t// User code:\n\t\t\t\t\tcreateEffect(() => {\n\t\t\t\t\t\t// o.n may or may not already be signalified, user does not know, but they want to be sure they can react to its changes.\n\t\t\t\t\t\tsignalify(obj, 'n')\n\n\t\t\t\t\t\tobj.n = 123 // does not make an infinite loop\n\n\t\t\t\t\t\t// A deeper effect will be reading the property.\n\t\t\t\t\t\tcreateEffect(() => {\n\t\t\t\t\t\t\tconsole.log(obj.n)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\n\t\t\t\t\t// No expectations in this test, the test passes if a maximum\n\t\t\t\t\t// callstack size error (infinite loop) does not happen.\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t\tdescribe('making reactive classes with signalify instead of with decorators', () => {\n\t\t\tit('makes class fields reactive, not using any decorators', () => {\n\t\t\t\tclass Butterfly {\n\t\t\t\t\tcolors = 3\n\n\t\t\t\t\t#wingSize = 2\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this.#wingSize\n\t\t\t\t\t}\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis.#wingSize = s\n\t\t\t\t\t}\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst b = new Butterfly()\n\n\t\t\t\ttestButterflyProps(b)\n\n\t\t\t\t// quick type check:\n\t\t\t\tconst b2 = new Butterfly()\n\t\t\t\t// @ts-expect-error \"foo\" is not a property on Butterfly\n\t\t\t\tsignalify(b2, 'colors', 'wingSize', 'foo')\n\t\t\t})\n\n\t\t\tit('makes constructor properties reactive, not using any decorators', () => {\n\t\t\t\tclass Butterfly {\n\t\t\t\t\tdeclare colors: number\n\n\t\t\t\t\t#wingSize: number\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this.#wingSize\n\t\t\t\t\t}\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis.#wingSize = s\n\t\t\t\t\t}\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tthis.colors = 3\n\t\t\t\t\t\tthis.#wingSize = 2\n\n\t\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst b = new Butterfly()\n\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('works with a function-style class, with signalify in the constructor', () => {\n\t\t\t\tfunction Butterfly() {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis.colors = 3\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis._wingSize = 2\n\n\t\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('works with a function-style class, with properties on the prototype, and signalify in constructor', () => {\n\t\t\t\tfunction Butterfly() {\n\t\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\t\tsignalify(this, 'colors', 'wingSize')\n\t\t\t\t}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tcolors: 3,\n\t\t\t\t\t_wingSize: 2,\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('can be used on a function-style class, with properties on the prototype, and signalify on the prototype', () => {\n\t\t\t\tfunction Butterfly() {}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tcolors: 3,\n\t\t\t\t\t_wingSize: 2,\n\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tsignalify(Butterfly.prototype, 'colors', 'wingSize')\n\n\t\t\t\t// @ts-ignore no type checking for ES5-style classes.\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('can be used on a function-style class, with properties in the constructor, and signalify on the prototype', () => {\n\t\t\t\tfunction Butterfly() {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis.colors = 3\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tthis._wingSize = 2\n\t\t\t\t}\n\n\t\t\t\tButterfly.prototype = {\n\t\t\t\t\tget wingSize() {\n\t\t\t\t\t\treturn this._wingSize\n\t\t\t\t\t},\n\t\t\t\t\tset wingSize(s: number) {\n\t\t\t\t\t\tthis._wingSize = s\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\t\tsignalify(Butterfly.prototype, 'colors', 'wingSize')\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst b = new Butterfly()\n\t\t\t\ttestButterflyProps(b)\n\t\t\t})\n\n\t\t\tit('show that signalify causes constructor to be reactive when used manually instead of decorators', () => {\n\t\t\t\tclass Foo {\n\t\t\t\t\tamount = 3\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this, 'amount')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tclass Bar extends Foo {\n\t\t\t\t\tdouble = 0\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsuper()\n\t\t\t\t\t\tsignalify(this, 'double')\n\t\t\t\t\t\tthis.double = this.amount * 2 // this tracks access of .amount\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet count = 0\n\t\t\t\tlet b!: Bar\n\n\t\t\t\tcreateEffect(() => {\n\t\t\t\t\tb = new Bar() // tracks .amount\n\t\t\t\t\tcount++\n\t\t\t\t})\n\n\t\t\t\texpect(count).toBe(1)\n\n\t\t\t\tb.amount = 4 // triggers\n\n\t\t\t\texpect(count).toBe(2)\n\t\t\t})\n\n\t\t\tit('show how to manually untrack constructors when not using decorators', () => {\n\t\t\t\tclass Foo {\n\t\t\t\t\tamount = 3\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this, 'amount')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tclass Bar extends Foo {\n\t\t\t\t\tdouble = 0\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsuper()\n\t\t\t\t\t\tsignalify(this, 'double')\n\n\t\t\t\t\t\tuntrack(() => {\n\t\t\t\t\t\t\tthis.double = this.amount * 2\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet count = 0\n\t\t\t\tlet b!: Bar\n\n\t\t\t\tcreateEffect(() => {\n\t\t\t\t\tb = new Bar() // does not track .amount\n\t\t\t\t\tcount++\n\t\t\t\t})\n\n\t\t\t\texpect(count).toBe(1)\n\n\t\t\t\tb.amount = 4 // will not trigger\n\n\t\t\t\texpect(count).toBe(1)\n\t\t\t})\n\t\t})\n\n\t\tit('creates signal storage per descriptor+object pair, not per descriptor', () => {\n\t\t\t// This ensures we don't accidentally share a signal with multiple\n\t\t\t// objects. For example, we don't want a single signal per descriptor\n\t\t\t// because if the descriptor is on a prototype object, then that single\n\t\t\t// signal will erroneously be used by all objects extending from that\n\t\t\t// prototype.\n\n\t\t\tconst a = signalify({foo: 0, name: 'a'}, 'foo')\n\t\t\tconst b = Object.assign(Object.create(a) as typeof a, {name: 'b'})\n\n\t\t\texpect(a.foo).toBe(0)\n\t\t\texpect(b.foo).toBe(0)\n\n\t\t\tlet countA = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\ta.foo\n\t\t\t\tcountA++\n\t\t\t})\n\n\t\t\tlet countB = 0\n\n\t\t\tcreateEffect(() => {\n\t\t\t\tb.foo\n\t\t\t\tcountB++\n\t\t\t})\n\n\t\t\texpect(countA).toBe(1)\n\t\t\texpect(countB).toBe(1)\n\n\t\t\ta.foo++\n\n\t\t\texpect(a.foo).toBe(1)\n\t\t\texpect(countA).toBe(2)\n\n\t\t\t// ensure that updating a's foo property did not update b's foo\n\t\t\t// property or trigger b's effect, despite that the property is\n\t\t\t// defined in a single location on the prototype.\n\t\t\t// @ts-ignore\n\t\t\texpect(b.foo).toBe(0)\n\t\t\texpect(countB).toBe(1)\n\t\t})\n\t})\n\n\tdescribe('@component', () => {\n\t\tit('allows to define a class using class syntax', () => {\n\t\t\tlet onMountCalled = false\n\t\t\tlet onCleanupCalled = false\n\n\t\t\t@component\n\t\t\tclass CoolComp {\n\t\t\t\tonMount() {\n\t\t\t\t\tonMountCalled = true\n\t\t\t\t}\n\n\t\t\t\tonCleanup() {\n\t\t\t\t\tonCleanupCalled = true\n\t\t\t\t}\n\n\t\t\t\ttemplate(props: any) {\n\t\t\t\t\texpect(props.foo).toBe(123)\n\t\t\t\t\treturn html`
hello classes!
`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tconst dispose = render(() => html`<${CoolComp} foo=${123} />`, root)\n\n\t\t\texpect(root.textContent).toBe('hello classes!')\n\t\t\texpect(onMountCalled).toBe(true)\n\t\t\texpect(onCleanupCalled).toBe(false)\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\n\t\t\texpect(onCleanupCalled).toBe(true)\n\n\t\t\t// throws on non-class use\n\t\t\texpect(() => {\n\t\t\t\tclass CoolComp {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t@component\n\t\t\t\t\tonMount() {}\n\t\t\t\t}\n\t\t\t\tCoolComp\n\t\t\t}).toThrow('component decorator should only be used on a class')\n\t\t})\n\n\t\tit('works in tandem with @reactive and @signal for reactivity', async () => {\n\t\t\t@component\n\t\t\t@reactive\n\t\t\tclass CoolComp {\n\t\t\t\t@signal foo = 0\n\t\t\t\t@signal bar = 0\n\n\t\t\t\ttemplate() {\n\t\t\t\t\treturn html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tconst [a, setA] = createSignal(1)\n\t\t\tconst b = createSignalFunction(2)\n\n\t\t\t// FIXME Why do we need `() => b()` instead of just `b` here? Does `html`\n\t\t\t// check the `length` of the function and do something based on\n\t\t\t// that? Or does it get passed to a @signal property's setter and\n\t\t\t// receives the previous value?\n\t\t\tconst dispose = render(() => html`<${CoolComp} foo=${a} bar=${() => b()} />`, root)\n\n\t\t\texpect(root.textContent).toBe('foo: 1, bar: 2')\n\n\t\t\tsetA(3)\n\t\t\tb(4)\n\n\t\t\texpect(root.textContent).toBe('foo: 3, bar: 4')\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\t\t})\n\n\t\tit('works without decorators', () => {\n\t\t\tconst CoolComp = component(\n\t\t\t\tclass CoolComp {\n\t\t\t\t\tfoo = 0\n\t\t\t\t\tbar = 0\n\n\t\t\t\t\tconstructor() {\n\t\t\t\t\t\tsignalify(this)\n\t\t\t\t\t}\n\n\t\t\t\t\ttemplate() {\n\t\t\t\t\t\treturn html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t)\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tconst [a, setA] = createSignal(1)\n\t\t\tconst b = createSignalFunction(2)\n\n\t\t\t// FIXME Why do we need `() => b()` instead of just `b` here? Does `html`\n\t\t\t// check the `length` of the function and do something based on\n\t\t\t// that? Or does it get passed to a @signal property's setter and\n\t\t\t// receives the previous value?\n\t\t\tconst dispose = render(() => html`<${CoolComp} foo=${a} bar=${() => b()} />`, root)\n\n\t\t\texpect(root.textContent).toBe('foo: 1, bar: 2')\n\n\t\t\tsetA(3)\n\t\t\tb(4)\n\n\t\t\texpect(root.textContent).toBe('foo: 3, bar: 4')\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\t\t})\n\n\t\t// FIXME not working, the spread doesn't seem to do anything.\n\t\txit('works with reactive spreads', async () => {\n\t\t\t@component\n\t\t\t@reactive\n\t\t\tclass CoolComp {\n\t\t\t\t@signal foo = 0\n\t\t\t\t@signal bar = 0\n\n\t\t\t\ttemplate() {\n\t\t\t\t\treturn html`
foo: ${() => this.foo}, bar: ${() => this.bar}
`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst root = document.createElement('div')\n\t\t\tdocument.body.append(root)\n\n\t\t\tlet o = createMutable({o: {foo: 123}})\n\n\t\t\t// neither of these work\n\t\t\t// const dispose = render(() => html`<${CoolComp} ...${() => o.o} />`, root)\n\t\t\tconst dispose = render(() => html`<${CoolComp} ...${o.o} />`, root)\n\n\t\t\texpect(root.textContent).toBe('foo: 123, bar: 0')\n\n\t\t\to.o = {bar: 456}\n\n\t\t\texpect(root.textContent).toBe('foo: 123, bar: 456')\n\n\t\t\tdispose()\n\t\t\troot.remove()\n\t\t})\n\t})\n})\n\nfunction testButterflyProps(b: {colors: number; wingSize: number}, initialColors = 3) {\n\tlet count = 0\n\n\tcreateRoot(() => {\n\t\tcreateComputed(() => {\n\t\t\tb.colors\n\t\t\tb.wingSize\n\t\t\tcount++\n\t\t})\n\t})\n\n\texpect(b.colors).toBe(initialColors, 'initial colors value')\n\texpect(b.wingSize).toBe(2, 'initial wingSize value')\n\texpect(count).toBe(1, 'Should be reactive')\n\n\tb.colors++\n\n\texpect(b.colors).toBe(initialColors + 1, 'incremented colors value')\n\texpect(count).toBe(2, 'Should be reactive')\n\n\tb.wingSize++\n\n\texpect(b.wingSize).toBe(3, 'incremented wingSize value')\n\texpect(count).toBe(3, 'Should be reactive')\n}\n\n//////////////////////////////////////////////////////////////////////////\n// createSignalObject type tests ///////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////\n\n{\n\tconst num = createSignalObject(1)\n\tlet n1: number = num.get()\n\tn1\n\tnum.set(123)\n\tnum.set(n => (n1 = n + 1))\n\t// @ts-expect-error Expected 1 arguments, but got 0. ts(2554)\n\tnum.set()\n\n\tconst num3 = createSignalObject()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n3: number = num3.get()\n\tnum3.set(123)\n\tnum3.set(undefined) // ok, accepts undefined\n\t// @ts-expect-error Object is possibly 'undefined'. ts(2532) (the `n` value)\n\tnum3.set(n => (n3 = n + 1))\n\t// num3.set() // ok, accepts undefined // FIXME broke in Solid 1.7.9\n\n\t// @ts-expect-error Argument of type 'boolean' is not assignable to parameter of type 'number'. ts(2345)\n\tconst num4 = createSignalObject(true)\n\n\tconst bool = createSignalObject(true)\n\tlet b1: boolean = bool.get()\n\tb1\n\tbool.set(false)\n\tbool.set(b => (b1 = !b))\n\t// @ts-expect-error Expected 1 arguments, but got 0. ts(2554)\n\tbool.set()\n\n\tconst bool2 = createSignalObject()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n4: boolean = bool2.get()\n\tbool2.set(false)\n\tbool2.set(undefined) // ok, accepts undefined\n\tbool2.set(n => (n4 = !n)) // ok because undefined is being converted to boolean\n\t// @ts-expect-error Type 'boolean | undefined' is not assignable to type 'boolean'. ts(2322)\n\tbool2.set(n => (n4 = n))\n\t// bool2.set() // ok, accepts undefined // FIXME try Solid 1.7.9\n\n\tconst func = createSignalObject(() => 1)\n\t// @ts-expect-error 1 is not assignable to function (no overload matches)\n\tfunc.set(() => 1)\n\tfunc.set(() => (): 1 => 1) // ok, set the value to a function\n\tconst fn: () => 1 = func.get() // ok, returns function value\n\tfn\n\tconst n5: 1 = func.get()()\n\tn5\n\n\tconst func2 = createSignalObject<() => number>(() => 1)\n\t// @FIXME-ts-expect-error number is not assignable to function (no overload matches)\n\tfunc2.set(() => 1) // FIXME should be a type error. Try Solid 1.7.9\n\tfunc2.set(() => () => 1) // ok, set the value to a function\n\tconst fn2: () => number = func2.get() // ok, returns function value\n\tfn2\n\tconst n6: number = func2.get()()\n\tn6\n\n\tconst stringOrFunc1 = createSignalObject<(() => number) | string>('')\n\t// @FIXME-ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc1.set(() => 1) // FIXME should be a type error. Try Solid 1.7.9\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf1: () => number = stringOrFunc1.set(() => () => 1)\n\tsf1\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf2: string = stringOrFunc1.set('oh yeah')\n\tsf2\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf3: string = stringOrFunc1.set(() => 'oh yeah')\n\tsf3\n\t// @ts-expect-error cannot set signal to undefined\n\tstringOrFunc1.set()\n\t// @ts-expect-error cannot set signal to undefined\n\tstringOrFunc1.set(undefined)\n\t// @ts-expect-error return value might be string\n\tconst sf6: () => number = stringOrFunc1.get()\n\tsf6\n\tconst sf7: (() => number) | string | undefined = stringOrFunc1.get()\n\tsf7\n\tconst sf8: (() => number) | string = stringOrFunc1.get()\n\tsf8\n\n\tconst stringOrFunc2 = createSignalObject<(() => number) | string>()\n\t// @FIXME-ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc2.set(() => 1) // FIXME should be a type error. Try Solid 1.7.9\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf9: () => number = stringOrFunc2.set(() => () => 1)\n\tsf9\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf10: string = stringOrFunc2.set('oh yeah')\n\tsf10\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf11: string = stringOrFunc2.set(() => 'oh yeah')\n\tsf11\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf12: undefined = stringOrFunc2.set()\n\tsf12\n\t// @ts-expect-error FIXME try Solid 1.7.9\n\tconst sf13: undefined = stringOrFunc2.set(undefined)\n\tsf13\n\tconst sf14: (() => number) | string | undefined = stringOrFunc2.get()\n\tsf14\n\t// @ts-expect-error return value might be undefined\n\tconst sf15: (() => number) | string = stringOrFunc2.get()\n\tsf15\n}\n\n//////////////////////////////////////////////////////////////////////////\n// createSignalFunction type tests ///////////////////////////////////////\n//////////////////////////////////////////////////////////////////////////\n\n{\n\tconst num = createSignalFunction(1)\n\tlet n1: number = num()\n\tn1\n\tnum(123)\n\tnum(n => (n1 = n + 1))\n\tnum()\n\n\tconst num3 = createSignalFunction()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n3: number = num3()\n\tnum3(123)\n\tnum3(undefined) // ok, accepts undefined\n\t// @ts-expect-error Object is possibly 'undefined'. ts(2532) (the `n` value)\n\tnum3(n => (n3 = n + 1))\n\tnum3() // ok, getter\n\n\t// @ts-expect-error Argument of type 'boolean' is not assignable to parameter of type 'number'. ts(2345)\n\tconst num4 = createSignalFunction(true)\n\n\tconst bool = createSignalFunction(true)\n\tlet b1: boolean = bool()\n\tb1\n\tbool(false)\n\tbool(b => (b1 = !b))\n\tbool()\n\n\tconst bool2 = createSignalFunction()\n\t// @ts-expect-error Type 'undefined' is not assignable to type 'number'. ts(2322)\n\tlet n4: boolean = bool2()\n\tbool2(false)\n\tbool2(undefined) // ok, accepts undefined\n\tbool2(n => (n4 = !n)) // ok because undefined is being converted to boolean\n\t// @ts-expect-error Type 'boolean | undefined' is not assignable to type 'boolean'. ts(2322)\n\tbool2(n => (n4 = n))\n\tbool2() // ok, accepts undefined\n\n\tconst func = createSignalFunction(() => 1)\n\t// @ts-expect-error 1 is not assignable to function (no overload matches)\n\tfunc(() => 1)\n\tfunc(() => (): 1 => 1) // ok, set the value to a function\n\tconst fn: () => 1 = func() // ok, returns function value\n\tfn\n\tconst n5: 1 = func()()\n\tn5\n\n\tconst func2 = createSignalFunction<() => number>(() => 1)\n\t// @ts-expect-error number is not assignable to function (no overload matches)\n\tfunc2(() => 1)\n\tfunc2(() => () => 1) // ok, set the value to a function\n\tconst fn2: () => number = func2() // ok, returns function value\n\tfn2\n\tconst n6: number = func2()()\n\tn6\n\n\tconst stringOrFunc1 = createSignalFunction<(() => number) | string>('')\n\t// @ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc1(() => 1)\n\tconst sf1: () => number = stringOrFunc1(() => () => 1)\n\tsf1\n\tconst sf2: string = stringOrFunc1('oh yeah')\n\tsf2\n\tconst sf3: string = stringOrFunc1(() => 'oh yeah')\n\tsf3\n\tstringOrFunc1() // ok, getter\n\t// @ts-expect-error cannot set signal to undefined\n\tstringOrFunc1(undefined)\n\t// @ts-expect-error return value might be string\n\tconst sf6: () => number = stringOrFunc1()\n\tsf6\n\tconst sf7: (() => number) | string | undefined = stringOrFunc1()\n\tsf7\n\tconst sf8: (() => number) | string = stringOrFunc1()\n\tsf8\n\n\tconst stringOrFunc2 = createSignalFunction<(() => number) | string>()\n\t// @ts-expect-error number not assignable to string | (()=>number) | undefined\n\tstringOrFunc2(() => 1)\n\tconst sf9: () => number = stringOrFunc2(() => () => 1)\n\tsf9\n\tconst sf10: string = stringOrFunc2('oh yeah')\n\tsf10\n\tconst sf11: string = stringOrFunc2(() => 'oh yeah')\n\tsf11\n\t// @ts-expect-error 'string | (() => number) | undefined' is not assignable to type 'undefined'.\n\tconst sf12: undefined = stringOrFunc2()\n\tsf12\n\tconst sf13: undefined = stringOrFunc2(undefined)\n\tsf13\n\tconst sf14: (() => number) | string | undefined = stringOrFunc2()\n\tsf14\n\t// @ts-expect-error return value might be undefined\n\tconst sf15: (() => number) | string = stringOrFunc2()\n\tsf15\n}\n"],"mappings":";;;;;AAAA,SAAQA,cAAc,EAAEC,YAAY,EAAEC,UAAU,EAAEC,YAAY,EAAEC,OAAO,QAAO,UAAU;AACxF,SAAQC,aAAa,QAAO,gBAAgB;AAC5C,SAAQC,MAAM,QAAO,cAAc;AACnC,OAAOC,IAAI,MAAM,eAAe;AAChC,SACCC,kBAAkB,EAClBC,QAAQ,EACRC,SAAS,EACTC,oBAAoB,EACpBC,MAAM,EACNC,oBAAoB,EACpBC,SAAS,QACH,YAAY;;AAEnB;AACA;;AAKAC,QAAQ,CAAC,cAAc,EAAE,MAAM;EAC9BA,QAAQ,CAAC,sBAAsB,EAAE,MAAM;IACtCC,EAAE,CAAC,4DAA4D,EAAE,MAAM;MACtE,MAAMC,GAAG,GAAGT,kBAAkB,CAAC,CAAC,CAAC;;MAEjC;MACAS,GAAG,CAACC,GAAG,CAAC,CAAC,CAAC;MACV;MACAC,MAAM,CAACF,GAAG,CAACG,GAAG,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;;MAEzB;MACA,MAAMC,SAAS,GAAGL,GAAG,CAACC,GAAG,CAACD,GAAG,CAACG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;MACxCD,MAAM,CAACF,GAAG,CAACG,GAAG,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;MACzBF,MAAM,CAACG,SAAS,CAAC,CAACD,IAAI,CAAC,CAAC,CAAC;;MAEzB;MACAJ,GAAG,CAACC,GAAG,CAACK,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC;MACnBJ,MAAM,CAACF,GAAG,CAACG,GAAG,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC;EACH,CAAC,CAAC;EAEFN,QAAQ,CAAC,wBAAwB,EAAE,MAAM;IACxCC,EAAE,CAAC,mEAAmE,EAAE,MAAM;MAC7E,MAAMC,GAAG,GAAGN,oBAAoB,CAAC,CAAC,CAAC;;MAEnC;MACAM,GAAG,CAAC,CAAC,CAAC;MACN;MACAE,MAAM,CAACF,GAAG,CAAC,CAAC,CAAC,CAACI,IAAI,CAAC,CAAC,CAAC;;MAErB;MACA,MAAMC,SAAS,GAAGL,GAAG,CAACA,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;MAChCE,MAAM,CAACF,GAAG,CAAC,CAAC,CAAC,CAACI,IAAI,CAAC,CAAC,CAAC;MACrBF,MAAM,CAACG,SAAS,CAAC,CAACD,IAAI,CAAC,CAAC,CAAC;;MAEzB;MACAJ,GAAG,CAACM,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC;MACfJ,MAAM,CAACF,GAAG,CAAC,CAAC,CAAC,CAACI,IAAI,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC;IAEFL,EAAE,CAAC,4BAA4B,EAAE,MAAM;MACtC,MAAMQ,EAAE,GAAGA,CAAA,KAAM,GAAG;MACpB,MAAMC,IAAI,GAAGd,oBAAoB,CAACa,EAAE,CAAC;MAErCL,MAAM,CAACM,IAAI,CAAC,CAAC,CAAC,CAACJ,IAAI,CAACG,EAAE,CAAC;MAEvB,MAAME,EAAE,GAAGA,CAAA,KAAM,GAAG;MACpBD,IAAI,CAAC,MAAMC,EAAE,CAAC;MAEdP,MAAM,CAACM,IAAI,CAAC,CAAC,CAAC,CAACJ,IAAI,CAACK,EAAE,CAAC;IACxB,CAAC,CAAC;EACH,CAAC,CAAC;EAEFX,QAAQ,CAAC,wBAAwB,EAAE,MAAM;IACxCC,EAAE,CAAC,OAAO,EAAE,YAAY;MACvB,MAAMW,KAAK,GAAGhB,oBAAoB,CAAC,CAAC,CAAC;MACrC,MAAMiB,GAAG,GAAGjB,oBAAoB,CAAC,CAAC,CAAC;MAEnC,IAAIkB,QAAQ,GAAG,CAAC;MAEhB,MAAMC,IAAI,GAAG,CAAC,MAAM;QACnB,IAAIA,IAAiB;QAErB5B,UAAU,CAAC6B,KAAK,IAAI;UACnBD,IAAI,GAAGC,KAAK;;UAEZ;UACA;UACA;UACA;UACA;UACAlB,oBAAoB,CAAC,MAAM;YAC1Bc,KAAK,CAAC,CAAC;YACPC,GAAG,CAAC,CAAC;YACLC,QAAQ,EAAE;UACX,CAAC,CAAC;QACH,CAAC,CAAC;QAEF,OAAOC,IAAI;MACZ,CAAC,EAAE,CAAC;;MAEJ;MACAH,KAAK,CAAC,CAAC,CAAC;MACRA,KAAK,CAAC,CAAC,CAAC;MACRC,GAAG,CAAC,CAAC,CAAC;;MAEN;MACAT,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;MAExB,MAAMW,OAAO,CAACC,OAAO,CAAC,CAAC;;MAEvB;MACAd,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;MAExBM,KAAK,CAAC,CAAC,CAAC;MACRA,KAAK,CAAC,CAAC,CAAC;MACRC,GAAG,CAAC,CAAC,CAAC;MAENT,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;MAExB,MAAMW,OAAO,CAACC,OAAO,CAAC,CAAC;MAEvBd,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;;MAExB;MACAS,IAAI,CAAC,CAAC;MAENH,KAAK,CAAC,CAAC,CAAC;MACRA,KAAK,CAAC,CAAC,CAAC;MACRC,GAAG,CAAC,CAAC,CAAC;MAENT,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;MAExB,MAAMW,OAAO,CAACC,OAAO,CAAC,CAAC;;MAEvB;MACA;MACAd,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;;MAExB;MACA;MACA,MAAMW,OAAO,CAACC,OAAO,CAAC,CAAC;MACvBd,MAAM,CAACU,QAAQ,CAAC,CAACR,IAAI,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC;EACH,CAAC,CAAC;EAEFN,QAAQ,CAAC,oBAAoB,EAAE,MAAM;IAAA,IAAAmB,UAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,aAAA,EAAAC,cAAA,EAAAC,cAAA,EAAAC,aAAA,EAAAC,eAAA,EAAAC,WAAA,EAAAC,aAAA,EAAAC,eAAA,EAAAC,eAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,aAAA,EAAAC,eAAA,EAAAC,WAAA,EAAAC,aAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,YAAA,EAAAC,aAAA,EAAAC,WAAA;IAAA,IAAAC,UAAA;IACpC,MAAAC,SAAA,CACgB;MAAA;QAAA;UAAAC,CAAA,GAAAzB,YAAA,EAAAC,UAAA;UAAAyB,CAAA,GAAAH,UAAA,EAAAxB,UAAA;QAAA,IAAA4B,UAAA,SAKdlD,MAAM,mBAGNA,MAAM,mBAPNA,MAAM,kBAFPH,QAAQ;MAAA;MAEAsD,MAAM,IAAA3B,UAAA,QAAAD,YAAA,OAAG,CAAC;MAElB,CAAC6B,QAAQ,GAAG,CAAC;MAEb,IAAYA,QAAQA,CAAA,EAAG;QACtB,OAAO,IAAI,CAAC,CAACA,QAAQ;MACtB;MACA,IAAYA,QAAQA,CAACC,CAAS,EAAE;QAC/B,IAAI,CAAC,CAACD,QAAQ,GAAGC,CAAC;MACnB;MAAC;QAAA/B,UAAA;MAAA;IACF;IAEAlB,EAAE,CAAC,6EAA6E,EAAE,MAAM;MACvF,MAAMkD,CAAC,GAAG,IAAIP,UAAS,CAAC,CAAC;MAEzBQ,kBAAkB,CAACD,CAAC,CAAC;IACtB,CAAC,CAAC;;IAEF;IACA,MAAME,UAAU,CAAC;MAAA;QAAA,CAAA/B,aAAA,EAAAC,cAAA,EAAAC,cAAA,IAAAuB,UAAA,SACflD,MAAM,iBACNA,MAAM,mBAENA,MAAM,iBAAAyD,CAAA,IAAAA,CAAA,CAAC,CAACC,QAAQ,GAAAD,CAAA,EAAAE,CAAA,KAAAF,CAAA,CAAT,CAACC,QAAQ,GAAAC,CAAA,WAAAC,CAAA,IAAT,CAACF,QAAQ,IAAAE,CAAA,EAAAZ,CAAA;MAAA;MAHTG,MAAM,GAAA1B,aAAA,OAAG,CAAC;MACV2B,QAAQ,GAAA1B,cAAA,OAAG,CAAC;MACpB;MACQ,CAACgC,QAAQ,GAAA/B,cAAA;IAClB;IAEAvB,EAAE,CAAC,6EAA6E,EAAE,MAAM;MACvF,MAAMkD,CAAC,GAAG,IAAIE,UAAU,CAAC,CAAC;MAE1BD,kBAAkB,CAACD,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAMO,UAAU,CAAC;MAAA;QAAA,CAAAjC,aAAA,EAAAC,eAAA,EAAAC,WAAA,IAAAoB,UAAA,SAKflD,MAAM,mBAGNA,MAAM,mBAPNA,MAAM,iBAYNA,MAAM,iBAAAyD,CAAA,IAAAA,CAAA,CAAC,CAACC,QAAQ,GAAAD,CAAA,EAAAE,CAAA,KAAAF,CAAA,CAAT,CAACC,QAAQ,GAAAC,CAAA,WAAAC,CAAA,IAAT,CAACF,QAAQ,IAAAE,CAAA,EAAAZ,CAAA;MAAA;MAZTG,MAAM,IAAArB,WAAA,QAAAF,aAAA,OAAG,CAAC;MAElB,CAACwB,QAAQ,GAAG,CAAC;MAEb,IAAYA,QAAQA,CAAA,EAAG;QACtB,OAAO,IAAI,CAAC,CAACA,QAAQ;MACtB;MACA,IAAYA,QAAQA,CAACC,CAAS,EAAE;QAC/B,IAAI,CAAC,CAACD,QAAQ,GAAGC,CAAC;MACnB;;MAEA;MACQ,CAACK,QAAQ,GAAA7B,eAAA;IAClB;IAEAzB,EAAE,CAAC,2FAA2F,EAAE,MAAM;MACrG,MAAMkD,CAAC,GAAG,IAAIO,UAAU,CAAC,CAAC;MAE1BN,kBAAkB,CAACD,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAMQ,UAAU,CAAC;MAAA;QAAA,CAAA9B,eAAA,EAAAD,aAAA,EAAAE,eAAA,EAAAC,WAAA,IAAAgB,UAAA,SAEflD,MAAM,mBADNA,MAAM,iBAGNA,MAAM,iBAAAyD,CAAA,IAAAA,CAAA,CAAC,CAACC,QAAQ,GAAAD,CAAA,EAAAE,CAAA,KAAAF,CAAA,CAAT,CAACC,QAAQ,GAAAC,CAAA,WAAAC,CAAA,IAAT,CAACF,QAAQ,IAAAE,CAAA,EAAAZ,CAAA;MAAA;MAHTG,MAAM,IAAAjB,WAAA,QAAAH,aAAA,OAAG,CAAC;MAAA,CAAAgC,CAAA,GAAA/B,eAAA,OACU,CAAC,GAC7B;MAAA,IADiBoB,QAAQA,CAAA;QAAA,aAAAW,CAAA;MAAA;MAAA,IAARX,QAAQA,CAAAO,CAAA;QAAA,MAAAI,CAAA,GAAAJ,CAAA;MAAA;MAEjB,CAACD,QAAQ,GAAAzB,eAAA;IAClB;IAEA7B,EAAE,CAAC,sFAAsF,EAAE,MAAM;MAChG,MAAMkD,CAAC,GAAG,IAAIQ,UAAU,CAAC,CAAC;MAE1BP,kBAAkB,CAACD,CAAC,CAAC;IACtB,CAAC,CAAC;IAAA,IAAAU,WAAA;IAEF,MAAAC,UAAA,CACiB;MAAA;QAAA;UAAAjB,CAAA,GAAAX,eAAA,EAAAD,aAAA,EAAAE,WAAA;UAAAW,CAAA,GAAAe,WAAA,EAAA7B,WAAA;QAAA,IAAAe,UAAA,SAEflD,MAAM,mBADNA,MAAM,kBAFPH,QAAQ;MAAA;MAEAsD,MAAM,IAAAb,WAAA,QAAAF,aAAA,OAAG,CAAC;MAAA,CAAA2B,CAAA,GAAA1B,eAAA,OACU,CAAC;MAAA,IAAZe,QAAQA,CAAA;QAAA,aAAAW,CAAA;MAAA;MAAA,IAARX,QAAQA,CAAAO,CAAA;QAAA,MAAAI,CAAA,GAAAJ,CAAA;MAAA;MAAA;QAAAxB,WAAA;MAAA;IAC1B;IAEA/B,EAAE,CAAC,mFAAmF,EAAE,MAAM;MAC7F,MAAMkD,CAAC,GAAG,IAAIW,WAAU,CAAC,CAAC;MAE1BV,kBAAkB,CAACD,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAMY,UAAU,CAAC;MAAA;QAAA,CAAA3B,aAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,WAAA,IAAAQ,UAAA,SACflD,MAAM,eAAAyD,CAAA,IAAAA,CAAA,EAAAM,CAAA,GAAAN,CAAA,EAAAE,CAAA,KAAAF,CAAA,EAAAM,CAAA,GAAAJ,CAAA,WAAAC,CAAA,IAAU,CAACT,MAAM,IAAAS,CAAA,EAAAZ,CAAA;MAAA;MAAA,CAAAe,CAAA,IAAArB,WAAA,QAAAH,aAAA,OAAG,CAAC;MAAA,IAAX,CAACY,MAAMgB,CAAAR,CAAA;QAAAlB,WAAA,OAAAkB,CAAA;MAAA;MAAA,IAAP,CAACR,MAAMgB,CAAA;QAAA,OAAA3B,WAAA;MAAA;MAExB4B,SAASA,CAAA,EAAG;QACX,OAAO,IAAI,CAAC,CAACjB,MAAM;MACpB;MACAkB,SAASA,CAACV,CAAS,EAAE;QACpB,OAAQ,IAAI,CAAC,CAACR,MAAM,GAAGQ,CAAC;MACzB;IACD;IAEAvD,EAAE,CAAC,4CAA4C,EAAE,MAAM;MACtD,MAAMkD,CAAC,GAAG,IAAIY,UAAU,CAAC,CAAC;MAC1BI,WAAW,CAAChB,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,MAAMiB,UAAU,CAAC;MAAA;QAAA,CAAA5B,YAAA,EAAAC,aAAA,EAAAC,WAAA,IAAAK,UAAA,SAGflD,MAAM,2BAAe;UACrB,OAAO,IAAI,CAAC,CAACwE,OAAO;QACrB,CAAC,IACAxE,MAAM,yBAAa2D,CAAS,EAAE;UAC9B,IAAI,CAAC,CAACa,OAAO,GAAGb,CAAC;QAClB,CAAC,WAAAC,CAAA,IAPD,CAACY,OAAO,IAAAZ,CAAA,EAAAZ,CAAA;MAAA;MAAAyB,YAAA,GAAAC,IAAA;QAAA7B,WAAA;MAAA;MAAR,CAAC2B,OAAO,GAAG,CAAC;MAAA,IAEA,CAACrB,MAAMgB,CAAA;QAAA,OAAAxB,YAAA;MAAA;MAAA,IAGP,CAACQ,MAAMgB,CAAAR,CAAA;QAAAf,aAAA,OAAAe,CAAA;MAAA;MAInBS,SAASA,CAAA,EAAG;QACX,OAAO,IAAI,CAAC,CAACjB,MAAM;MACpB;MACAkB,SAASA,CAACV,CAAS,EAAE;QACpB,OAAQ,IAAI,CAAC,CAACR,MAAM,GAAGQ,CAAC;MACzB;IACD;IAEAvD,EAAE,CAAC,sDAAsD,EAAE,MAAM;MAChE,MAAMkD,CAAC,GAAG,IAAIiB,UAAU,CAAC,CAAC;MAC1BD,WAAW,CAAChB,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,SAASgB,WAAWA,CAAChB,CAA8C,EAAE;MACpE,IAAIvC,KAAK,GAAG,CAAC;MAEb1B,YAAY,CAAC,MAAM;QAClBiE,CAAC,CAACc,SAAS,CAAC,CAAC;QACbrD,KAAK,EAAE;MACR,CAAC,CAAC;MAEFR,MAAM,CAAC+C,CAAC,CAACc,SAAS,CAAC,CAAC,CAAC,CAAC3D,IAAI,CAAC,CAAC,CAAC;MAC7BF,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;MAErB6C,CAAC,CAACe,SAAS,CAAC,CAAC,CAAC;MACd9D,MAAM,CAAC+C,CAAC,CAACc,SAAS,CAAC,CAAC,CAAC,CAAC3D,IAAI,CAAC,CAAC,CAAC;MAC7BF,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;IACtB;IAEA,MAAMkE,MAAM,GAAGvE,EAAE;IAEjBuE,MAAM,CAAC,oCAAoC,EAAE,YAAY;MAAA,IAAAC,WAAA,EAAAC,aAAA;MACxD,MAAMC,GAAG,SAAS/B,UAAS,CAAC;QAClBI,MAAM,GAAG,CAAC;MACpB;;MAEA;MACA,MAAM4B,EAAE,GAAG,IAAIhC,UAAS,CAAC,CAAC;MAC1BiC,QAAQ,CAACD,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;MAClCxE,MAAM,CAAC0E,MAAM,CAACC,wBAAwB,CAACH,EAAE,EAAE,QAAQ,CAAC,EAAEvE,GAAG,EAAE2E,IAAI,CAACJ,EAAE,CAAC,KAAK,CAAC,CAAC,CAACtE,IAAI,CAAC,IAAI,CAAC,EAAC;MAAA,IAAA2E,aAAA;MAEtF,MAAAC,YAAA,SAC2BP,GAAG,CAAC;QAAA;UAAA;YAAA9B,CAAA,GAAA6B,aAAA;YAAA5B,CAAA,GAAAmC,aAAA,EAAAR,WAAA;UAAA,IAAA1B,UAAA,SAC7BlD,MAAM,kBAFPH,QAAQ,cACkBiF,GAAG;QAAA;QACZ3B,MAAM,GAAA0B,aAAA,OAAG,GAAG;QAAA;UAAAD,WAAA;QAAA;MAC9B;;MAEA;MACA,MAAMU,CAAC,GAAG,IAAIR,GAAG,CAAC,CAAC;MACnBE,QAAQ,CAACM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;MAClC/E,MAAM,CAAC0E,MAAM,CAACC,wBAAwB,CAACI,CAAC,EAAE,QAAQ,CAAC,EAAEC,KAAK,KAAK,CAAC,CAAC,CAAC9E,IAAI,CAAC,IAAI,CAAC,EAAC;;MAE7E,MAAM+E,eAAe,SAASH,aAAY,CAAC;QACjClC,MAAM,GAAG,GAAG;MACtB;MAEA,MAAMG,CAAC,GAAG,IAAI+B,aAAY,CAAC,CAAC;MAC5B9B,kBAAkB,CAACD,CAAC,EAAE,GAAG,CAAC;MAE1B,MAAMmC,EAAE,GAAG,IAAID,eAAe,CAAC,CAAC;MAEhCR,QAAQ,CAACS,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;IACxC,CAAC,CAAC;IAEF,SAAST,QAAQA,CAAmBvB,CAAI,EAAEiC,CAAU,EAAEC,QAAa,EAAEC,MAAW,EAAE/F,QAAQ,GAAG,IAAI,EAAE;MAClG,IAAIkB,KAAK,GAAG,CAAC;MAEb1B,YAAY,CAAC,MAAM;QAClBoE,CAAC,CAACiC,CAAC,CAAC;QACJ3E,KAAK,EAAE;MACR,CAAC,CAAC;MAEFR,MAAM,CAACkD,CAAC,CAACiC,CAAC,CAAC,CAAC,CAACjF,IAAI,CAACkF,QAAQ,CAAC;MAC3BpF,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;MAErBgD,CAAC,CAACiC,CAAC,CAAC,GAAGE,MAAM,EAAC;;MAEdrF,MAAM,CAACkD,CAAC,CAACiC,CAAC,CAAC,CAAC,CAACjF,IAAI,CAACmF,MAAM,CAAC;MACzBrF,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAACZ,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC;IAEAO,EAAE,CAAC,kFAAkF,EAAE,MAAM;MAAA,IAAAyF,WAAA,EAAAC,WAAA,EAAAC,aAAA,EAAAC,WAAA,EAAAC,QAAA;MAAA,IAAAC,OAAA;MAC5F,MAAAC,MAAA,CACa;QAAA;UAAA,CAAAD,OAAA,EAAAL,WAAA,IAAA3C,UAAA,YADZrD,QAAQ,GAAAoD,CAAA;QAAA;QAERwB,WAAWA,CAAQ2B,MAAc,EAAE;UAAA,KAAhBA,MAAc,GAAdA,MAAc;QAAG;QAAC;UAAAP,WAAA;QAAA;MACtC;MAAC,IAAAQ,WAAA;MAED,MAAAtD,SAAA,UAAAkD,QAAA,GACwBE,OAAM,EAAC;QAAA;UAAA;YAAAnD,CAAA,GAAA+C,aAAA,EAAAC,WAAA;YAAA/C,CAAA,GAAAoD,WAAA,EAAAP,WAAA;UAAA,IAAA5C,UAAA,SAK7BlD,MAAM,mBAGNA,MAAM,mBAPNA,MAAM,kBAFPH,QAAQ,cAAAoG,QAAA;QAAA;QAEA9C,MAAM,IAAA6C,WAAA,QAAAD,aAAA,OAAG,CAAC;QAElB,CAAC3C,QAAQ,GAAG,CAAC;QAEb,IAAYA,QAAQA,CAAA,EAAG;UACtB,OAAO,IAAI,CAAC,CAACA,QAAQ;QACtB;QACA,IAAYA,QAAQA,CAACC,CAAS,EAAE;UAC/B,IAAI,CAAC,CAACD,QAAQ,GAAGC,CAAC;QACnB;QAEAoB,WAAWA,CAAC6B,GAAW,EAAE;UACxB,KAAK,CAACA,GAAG,GAAG,CAAC,CAAC;QACf;QAAC;UAAAR,WAAA;QAAA;MACF;MAEA,MAAMxC,CAAC,GAAG,IAAIP,WAAS,CAAC,CAAC,CAAC;MAE1BxC,MAAM,CAAC+C,CAAC,CAAC8C,MAAM,CAAC,CAAC3F,IAAI,CAAC,CAAC,CAAC;MACxB8C,kBAAkB,CAACD,CAAC,CAAC;IACtB,CAAC,CAAC;IAEFlD,EAAE,CAAC,wDAAwD,EAAE,YAAY;MACxEG,MAAM,CAAC,MAAM;QAAA,IAAAgG,SAAA,EAAAC,WAAA,EAAAC,SAAA;QACZ;QACA,MAAMC,GAAG,CAAC;UAAA;YAAA,CAAAH,SAAA,IAAArD,UAAA,SACRlD,MAAM,kBAAAgD,CAAA;UAAA;UAAChC,GAAG,GAAAuF,SAAA,OAAG,KAAK;QACpB;QAEAG,GAAG;QAAA,IAAAC,IAAA;QAEH,MAAAC,GAAA,CACU;UAAA;YAAA;cAAA5D,CAAA,GAAAyD,SAAA;cAAAxD,CAAA,GAAA0D,IAAA,EAAAH,WAAA;YAAA,IAAAtD,UAAA,SACRlD,MAAM,eAFPH,QAAQ;UAAA;UAEAgH,GAAG,GAAAJ,SAAA,OAAG,GAAG;UAAA;YAAAD,WAAA;UAAA;QAClB;QAEA,IAAII,IAAG,CAAC,CAAC;MACV,CAAC,CAAC,CAACE,OAAO,CAAC,gBAAgB,CAAC;;MAE5B;MACA;MACA;MACA;MACA;;MAEA;;MAEA;MACA;MACA;MACA;;MAEA;;MAEA;MACA;MACA;MACA;;MAEA;;MAEA;;MAEA;IACD,CAAC,CAAC;IAEF1G,EAAE,CAAC,4BAA4B,EAAE,MAAM;MAAA,IAAA2G,WAAA,EAAAC,QAAA;MAAA,IAAAC,KAAA;MACtC;MACA;MACA;MACA;;MAEA,MAAAC,IAAA,CACW;QAAA;UAAA;YAAAlE,CAAA,GAAAgE,QAAA;YAAA/D,CAAA,GAAAgE,KAAA,EAAAF,WAAA;UAAA,IAAA7D,UAAA,SACTlD,MAAM,cAFPH,QAAQ;QAAA;QAEAsH,EAAE,GAAAH,QAAA,OAA2B,IAAI;QAAA;UAAAD,WAAA;QAAA;MAC1C;MAEA,MAAMK,IAAI,GAAG,IAAIF,KAAI,CAAC,CAAC;MAEvB3G,MAAM,CAAC6G,IAAI,CAACD,EAAE,CAAC,CAAC1G,IAAI,CAAC,IAAI,CAAC;MAE1B,MAAM4G,OAAO,GAAGA,CAAA,KAAM,GAAG;MACzBD,IAAI,CAACD,EAAE,GAAGE,OAAO;MAEjB9G,MAAM,CAAC6G,IAAI,CAACD,EAAE,CAAC,CAAC1G,IAAI,CAAC4G,OAAO,CAAC;MAC7B9G,MAAM,CAAC6G,IAAI,CAACD,EAAE,CAAC,CAAC,CAAC,CAAC1G,IAAI,CAAC,GAAG,CAAC;IAC5B,CAAC,CAAC;IAEFL,EAAE,CAAC,+EAA+E,EAAE,MAAM;MAAA,IAAAkH,WAAA,EAAAC,YAAA,EAAAC,WAAA,EAAAC,YAAA,EAAAC,KAAA;MAAA,IAAAC,IAAA;MACzF,MAAAjB,GAAA,CACU;QAAA;UAAA;YAAA1D,CAAA,GAAAuE,YAAA;YAAAtE,CAAA,GAAA0E,IAAA,EAAAL,WAAA;UAAA,IAAApE,UAAA,SACRlD,MAAM,kBAFPH,QAAQ;QAAA;QAEA+H,MAAM,GAAAL,YAAA,OAAG,CAAC;QAAA;UAAAD,WAAA;QAAA;MACnB;MAAC,IAAAO,KAAA;MAED,MAAAjB,GAAA,UAAAc,KAAA,GACkBhB,IAAG,EAAC;QAAA;UAAA;YAAA1D,CAAA,GAAAyE,YAAA;YAAAxE,CAAA,GAAA4E,KAAA,EAAAL,WAAA;UAAA,IAAAtE,UAAA,SACpBlD,MAAM,kBAFPH,QAAQ,cAAA6H,KAAA;QAAA;QAEAtB,MAAM,GAAAqB,YAAA,OAAG,CAAC;QAElBhD,WAAWA,CAAA,EAAG;UACb,KAAK,CAAC,CAAC;UACP,IAAI,CAAC2B,MAAM,GAAG,IAAI,CAACwB,MAAM,GAAG,CAAC,EAAC;QAC/B;QAAC;UAAAJ,WAAA;QAAA;MACF;MAEA,IAAIlE,CAAM;MACV,IAAIvC,KAAK,GAAG,CAAC;MAEb,SAAS+G,MAAMA,CAAA,EAAG;QACjBzI,YAAY,CAAC,MAAM;UAClBiE,CAAC,GAAG,IAAIsD,KAAG,CAAC,CAAC,EAAC;UACd7F,KAAK,EAAE;QACR,CAAC,CAAC;MACH;MAEAR,MAAM,CAACuH,MAAM,CAAC,CAACC,GAAG,CAACjB,OAAO,CAAC,CAAC;MAE5B,MAAMrB,EAAE,GAAGnC,CAAE;MAEbA,CAAC,CAAEsE,MAAM,GAAG,CAAC,EAAC;;MAEd;MACA;MACArH,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;MACrBF,MAAM,CAAC+C,CAAE,CAAC,CAAC7C,IAAI,CAACgF,EAAE,CAAC;IACpB,CAAC,CAAC;EACH,CAAC,CAAC;EAEFtF,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC7BC,EAAE,CAAC,4CAA4C,EAAE,MAAM;MACtD,IAAI4H,GAAG,GAAG;QAACrH,CAAC,EAAE;MAAG,CAAC;MAClB,IAAIsH,IAAI,GAAGnI,SAAS,CAACkI,GAAG,EAAE,GAAG,CAAC;MAC9BzH,MAAM,CAACyH,GAAG,CAAC,CAACvH,IAAI,CAACwH,IAAI,CAAC;MAEtBD,GAAG,GAAGvI,aAAa,CAAC;QAACkB,CAAC,EAAE;MAAG,CAAC,CAAC;MAC7BsH,IAAI,GAAGnI,SAAS,CAACkI,GAAG,EAAE,GAAG,CAAC;MAC1BzH,MAAM,CAACyH,GAAG,CAAC,CAACvH,IAAI,CAACwH,IAAI,CAAC;IACvB,CAAC,CAAC;IAEF9H,QAAQ,CAAC,0CAA0C,EAAE,MAAM;MAC1DC,EAAE,CAAC,EAAE,EAAE,MAAM;QACZ,MAAM8H,SAAS,GAAG;UACjB/E,MAAM,EAAE,CAAC;UAETgF,SAAS,EAAE,CAAC;UAEZ,IAAI/E,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC+E,SAAS;UACtB,CAAC;UACD,IAAI/E,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC8E,SAAS,GAAG9E,CAAC;UACnB;QACD,CAAC;QAED,MAAMC,CAAC,GAAGxD,SAAS,CAACoI,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QAEpD3E,kBAAkB,CAACD,CAAC,CAAC;;QAErB;QACA;QACAxD,SAAS,CAACoI,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;MAClD,CAAC,CAAC;MAEF9H,EAAE,CAAC,qDAAqD,EAAE,MAAM;QAC/DgI,IAAI,CAAC,IAAI,CAAC;QACVA,IAAI,CAAC,KAAK,CAAC;QAEX,SAASA,IAAIA,CAACC,kBAA2B,EAAE;UAC1C;UACA,MAAML,GAAG,GAAG;YAACrH,CAAC,EAAE;UAAG,CAAC;UACpB,IAAI0H,kBAAkB,EAAEvI,SAAS,CAACkI,GAAG,EAAE,GAAG,CAAC,EAAC;;UAE5C;UACA3I,YAAY,CAAC,MAAM;YAClB;YACAS,SAAS,CAACkI,GAAG,EAAE,GAAG,CAAC;YAEnBA,GAAG,CAACrH,CAAC,GAAG,GAAG,EAAC;;YAEZ;YACAtB,YAAY,CAAC,MAAM;cAClBiJ,OAAO,CAACC,GAAG,CAACP,GAAG,CAACrH,CAAC,CAAC;YACnB,CAAC,CAAC;UACH,CAAC,CAAC;;UAEF;UACA;QACD;MACD,CAAC,CAAC;IACH,CAAC,CAAC;IAEFR,QAAQ,CAAC,mEAAmE,EAAE,MAAM;MACnFC,EAAE,CAAC,uDAAuD,EAAE,MAAM;QACjE,MAAM2C,SAAS,CAAC;UACfI,MAAM,GAAG,CAAC;UAEV,CAACC,QAAQ,GAAG,CAAC;UAEb,IAAIA,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC,CAACA,QAAQ;UACtB;UACA,IAAIA,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC,CAACD,QAAQ,GAAGC,CAAC;UACnB;UAEAoB,WAAWA,CAAA,EAAG;YACb3E,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC;UACtC;QACD;QAEA,MAAMwD,CAAC,GAAG,IAAIP,SAAS,CAAC,CAAC;QAEzBQ,kBAAkB,CAACD,CAAC,CAAC;;QAErB;QACA,MAAMmC,EAAE,GAAG,IAAI1C,SAAS,CAAC,CAAC;QAC1B;QACAjD,SAAS,CAAC2F,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC;MAC3C,CAAC,CAAC;MAEFrF,EAAE,CAAC,iEAAiE,EAAE,MAAM;QAC3E,MAAM2C,SAAS,CAAC;UAGf,CAACK,QAAQ;UAET,IAAIA,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC,CAACA,QAAQ;UACtB;UACA,IAAIA,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC,CAACD,QAAQ,GAAGC,CAAC;UACnB;UAEAoB,WAAWA,CAAA,EAAG;YACb,IAAI,CAACtB,MAAM,GAAG,CAAC;YACf,IAAI,CAAC,CAACC,QAAQ,GAAG,CAAC;YAElBtD,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC;UACtC;QACD;QAEA,MAAMwD,CAAC,GAAG,IAAIP,SAAS,CAAC,CAAC;QAEzBQ,kBAAkB,CAACD,CAAC,CAAC;MACtB,CAAC,CAAC;MAEFlD,EAAE,CAAC,sEAAsE,EAAE,MAAM;QAChF,SAAS2C,SAASA,CAAA,EAAG;UACpB;UACA,IAAI,CAACI,MAAM,GAAG,CAAC;UACf;UACA,IAAI,CAACgF,SAAS,GAAG,CAAC;;UAElB;UACArI,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC;QACtC;QAEAiD,SAAS,CAACyF,SAAS,GAAG;UACrB,IAAIpF,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC+E,SAAS;UACtB,CAAC;UACD,IAAI/E,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC8E,SAAS,GAAG9E,CAAC;UACnB;QACD,CAAC;;QAED;QACA,MAAMC,CAAC,GAAG,IAAIP,SAAS,CAAC,CAAC;QACzBQ,kBAAkB,CAACD,CAAC,CAAC;MACtB,CAAC,CAAC;MAEFlD,EAAE,CAAC,mGAAmG,EAAE,MAAM;QAC7G,SAAS2C,SAASA,CAAA,EAAG;UACpB;UACAjD,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC;QACtC;QAEAiD,SAAS,CAACyF,SAAS,GAAG;UACrBrF,MAAM,EAAE,CAAC;UACTgF,SAAS,EAAE,CAAC;UAEZ,IAAI/E,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC+E,SAAS;UACtB,CAAC;UACD,IAAI/E,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC8E,SAAS,GAAG9E,CAAC;UACnB;QACD,CAAC;;QAED;QACA,MAAMC,CAAC,GAAG,IAAIP,SAAS,CAAC,CAAC;QACzBQ,kBAAkB,CAACD,CAAC,CAAC;MACtB,CAAC,CAAC;MAEFlD,EAAE,CAAC,yGAAyG,EAAE,MAAM;QACnH,SAAS2C,SAASA,CAAA,EAAG,CAAC;QAEtBA,SAAS,CAACyF,SAAS,GAAG;UACrBrF,MAAM,EAAE,CAAC;UACTgF,SAAS,EAAE,CAAC;UAEZ,IAAI/E,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC+E,SAAS;UACtB,CAAC;UACD,IAAI/E,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC8E,SAAS,GAAG9E,CAAC;UACnB;QACD,CAAC;QAEDvD,SAAS,CAACiD,SAAS,CAACyF,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;;QAEpD;QACA,MAAMlF,CAAC,GAAG,IAAIP,SAAS,CAAC,CAAC;QACzBQ,kBAAkB,CAACD,CAAC,CAAC;MACtB,CAAC,CAAC;MAEFlD,EAAE,CAAC,2GAA2G,EAAE,MAAM;QACrH,SAAS2C,SAASA,CAAA,EAAG;UACpB;UACA,IAAI,CAACI,MAAM,GAAG,CAAC;UACf;UACA,IAAI,CAACgF,SAAS,GAAG,CAAC;QACnB;QAEApF,SAAS,CAACyF,SAAS,GAAG;UACrB,IAAIpF,QAAQA,CAAA,EAAG;YACd,OAAO,IAAI,CAAC+E,SAAS;UACtB,CAAC;UACD,IAAI/E,QAAQA,CAACC,CAAS,EAAE;YACvB,IAAI,CAAC8E,SAAS,GAAG9E,CAAC;UACnB;QACD,CAAC;QAEDvD,SAAS,CAACiD,SAAS,CAACyF,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;;QAEpD;QACA,MAAMlF,CAAC,GAAG,IAAIP,SAAS,CAAC,CAAC;QACzBQ,kBAAkB,CAACD,CAAC,CAAC;MACtB,CAAC,CAAC;MAEFlD,EAAE,CAAC,gGAAgG,EAAE,MAAM;QAC1G,MAAMsG,GAAG,CAAC;UACTkB,MAAM,GAAG,CAAC;UAEVnD,WAAWA,CAAA,EAAG;YACb3E,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;UAC1B;QACD;QAEA,MAAM8G,GAAG,SAASF,GAAG,CAAC;UACrBN,MAAM,GAAG,CAAC;UAEV3B,WAAWA,CAAA,EAAG;YACb,KAAK,CAAC,CAAC;YACP3E,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;YACzB,IAAI,CAACsG,MAAM,GAAG,IAAI,CAACwB,MAAM,GAAG,CAAC,EAAC;UAC/B;QACD;QAEA,IAAI7G,KAAK,GAAG,CAAC;QACb,IAAIuC,CAAO;QAEXjE,YAAY,CAAC,MAAM;UAClBiE,CAAC,GAAG,IAAIsD,GAAG,CAAC,CAAC,EAAC;UACd7F,KAAK,EAAE;QACR,CAAC,CAAC;QAEFR,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;QAErB6C,CAAC,CAACsE,MAAM,GAAG,CAAC,EAAC;;QAEbrH,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;MACtB,CAAC,CAAC;MAEFL,EAAE,CAAC,qEAAqE,EAAE,MAAM;QAC/E,MAAMsG,GAAG,CAAC;UACTkB,MAAM,GAAG,CAAC;UAEVnD,WAAWA,CAAA,EAAG;YACb3E,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;UAC1B;QACD;QAEA,MAAM8G,GAAG,SAASF,GAAG,CAAC;UACrBN,MAAM,GAAG,CAAC;UAEV3B,WAAWA,CAAA,EAAG;YACb,KAAK,CAAC,CAAC;YACP3E,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;YAEzBN,OAAO,CAAC,MAAM;cACb,IAAI,CAAC4G,MAAM,GAAG,IAAI,CAACwB,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC;UACH;QACD;QAEA,IAAI7G,KAAK,GAAG,CAAC;QACb,IAAIuC,CAAO;QAEXjE,YAAY,CAAC,MAAM;UAClBiE,CAAC,GAAG,IAAIsD,GAAG,CAAC,CAAC,EAAC;UACd7F,KAAK,EAAE;QACR,CAAC,CAAC;QAEFR,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;QAErB6C,CAAC,CAACsE,MAAM,GAAG,CAAC,EAAC;;QAEbrH,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;MACtB,CAAC,CAAC;IACH,CAAC,CAAC;IAEFL,EAAE,CAAC,uEAAuE,EAAE,MAAM;MACjF;MACA;MACA;MACA;MACA;;MAEA,MAAMqI,CAAC,GAAG3I,SAAS,CAAC;QAACkB,GAAG,EAAE,CAAC;QAAE0H,IAAI,EAAE;MAAG,CAAC,EAAE,KAAK,CAAC;MAC/C,MAAMpF,CAAC,GAAG2B,MAAM,CAAC0D,MAAM,CAAC1D,MAAM,CAAC2D,MAAM,CAACH,CAAC,CAAC,EAAc;QAACC,IAAI,EAAE;MAAG,CAAC,CAAC;MAElEnI,MAAM,CAACkI,CAAC,CAACzH,GAAG,CAAC,CAACP,IAAI,CAAC,CAAC,CAAC;MACrBF,MAAM,CAAC+C,CAAC,CAACtC,GAAG,CAAC,CAACP,IAAI,CAAC,CAAC,CAAC;MAErB,IAAIoI,MAAM,GAAG,CAAC;MAEdxJ,YAAY,CAAC,MAAM;QAClBoJ,CAAC,CAACzH,GAAG;QACL6H,MAAM,EAAE;MACT,CAAC,CAAC;MAEF,IAAIC,MAAM,GAAG,CAAC;MAEdzJ,YAAY,CAAC,MAAM;QAClBiE,CAAC,CAACtC,GAAG;QACL8H,MAAM,EAAE;MACT,CAAC,CAAC;MAEFvI,MAAM,CAACsI,MAAM,CAAC,CAACpI,IAAI,CAAC,CAAC,CAAC;MACtBF,MAAM,CAACuI,MAAM,CAAC,CAACrI,IAAI,CAAC,CAAC,CAAC;MAEtBgI,CAAC,CAACzH,GAAG,EAAE;MAEPT,MAAM,CAACkI,CAAC,CAACzH,GAAG,CAAC,CAACP,IAAI,CAAC,CAAC,CAAC;MACrBF,MAAM,CAACsI,MAAM,CAAC,CAACpI,IAAI,CAAC,CAAC,CAAC;;MAEtB;MACA;MACA;MACA;MACAF,MAAM,CAAC+C,CAAC,CAACtC,GAAG,CAAC,CAACP,IAAI,CAAC,CAAC,CAAC;MACrBF,MAAM,CAACuI,MAAM,CAAC,CAACrI,IAAI,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC;EACH,CAAC,CAAC;EAEFN,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC5BC,EAAE,CAAC,6CAA6C,EAAE,MAAM;MAAA,IAAA2I,YAAA;MACvD,IAAIC,aAAa,GAAG,KAAK;MACzB,IAAIC,eAAe,GAAG,KAAK;MAAA,IAAAC,SAAA;MAE3B,MAAAC,QAAA,CACe;QAAA;UAAA,CAAAD,SAAA,EAAAH,YAAA,IAAA7F,UAAA,YADdhD,SAAS,GAAA+C,CAAA;QAAA;QAETmG,OAAOA,CAAA,EAAG;UACTJ,aAAa,GAAG,IAAI;QACrB;QAEAK,SAASA,CAAA,EAAG;UACXJ,eAAe,GAAG,IAAI;QACvB;QAEAK,QAAQA,CAACC,KAAU,EAAE;UACpBhJ,MAAM,CAACgJ,KAAK,CAACvI,GAAG,CAAC,CAACP,IAAI,CAAC,GAAG,CAAC;UAC3B,OAAOd,IAAI,2BAA2B;QACvC;QAAC;UAAAoJ,YAAA;QAAA;MACF;MAEA,MAAMS,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MAC1CD,QAAQ,CAACE,IAAI,CAACC,MAAM,CAACJ,IAAI,CAAC;MAE1B,MAAMK,OAAO,GAAGnK,MAAM,CAAC,MAAMC,IAAI,IAAIwJ,SAAQ,QAAQ,GAAG,KAAK,EAAEK,IAAI,CAAC;MAEpEjJ,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,gBAAgB,CAAC;MAC/CF,MAAM,CAACyI,aAAa,CAAC,CAACvI,IAAI,CAAC,IAAI,CAAC;MAChCF,MAAM,CAAC0I,eAAe,CAAC,CAACxI,IAAI,CAAC,KAAK,CAAC;MAEnCoJ,OAAO,CAAC,CAAC;MACTL,IAAI,CAACO,MAAM,CAAC,CAAC;MAEbxJ,MAAM,CAAC0I,eAAe,CAAC,CAACxI,IAAI,CAAC,IAAI,CAAC;;MAElC;MACAF,MAAM,CAAC,MAAM;QAAA,IAAAyJ,WAAA;QACZ,MAAMb,QAAQ,CAAC;UAAA;YAAA,CAAAa,WAAA,IAAA9G,UAAA,SAEbhD,SAAS,sBAAA8C,CAAA;UAAA;UAAAyB,YAAA,GAAAC,IAAA;YAAAsF,WAAA;UAAA;UADV;UAEAZ,OAAOA,CAAA,EAAG,CAAC;QACZ;QACAD,QAAQ;MACT,CAAC,CAAC,CAACrC,OAAO,CAAC,oDAAoD,CAAC;IACjE,CAAC,CAAC;IAEF1G,EAAE,CAAC,2DAA2D,EAAE,YAAY;MAAA,IAAA6J,YAAA,EAAAC,UAAA,EAAAC,UAAA;MAAA,IAAAC,UAAA;MAC3E,MAAAjB,QAAA,CAEe;QAAA;UAAA;YAAAnG,CAAA,GAAAkH,UAAA,EAAAC,UAAA;YAAAlH,CAAA,GAAAmH,UAAA,EAAAH,YAAA;UAAA,IAAA/G,UAAA,SACblD,MAAM,cACNA,MAAM,eAJPE,SAAS,EACTL,QAAQ;QAAA;QAEAmB,GAAG,GAAAkJ,UAAA,OAAG,CAAC;QACPrD,GAAG,GAAAsD,UAAA,OAAG,CAAC;QAEfb,QAAQA,CAAA,EAAG;UACV,OAAO3J,IAAI,aAAa,MAAM,IAAI,CAACqB,GAAG,UAAU,MAAM,IAAI,CAAC6F,GAAG,QAAQ;QACvE;QAAC;UAAAoD,YAAA;QAAA;MACF;MAEA,MAAMT,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MAC1CD,QAAQ,CAACE,IAAI,CAACC,MAAM,CAACJ,IAAI,CAAC;MAE1B,MAAM,CAACf,CAAC,EAAE4B,IAAI,CAAC,GAAG9K,YAAY,CAAC,CAAC,CAAC;MACjC,MAAM+D,CAAC,GAAGvD,oBAAoB,CAAC,CAAC,CAAC;;MAEjC;MACA;MACA;MACA;MACA,MAAM8J,OAAO,GAAGnK,MAAM,CAAC,MAAMC,IAAI,IAAIwJ,UAAQ,QAAQV,CAAC,QAAQ,MAAMnF,CAAC,CAAC,CAAC,KAAK,EAAEkG,IAAI,CAAC;MAEnFjJ,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,gBAAgB,CAAC;MAE/C4J,IAAI,CAAC,CAAC,CAAC;MACP/G,CAAC,CAAC,CAAC,CAAC;MAEJ/C,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,gBAAgB,CAAC;MAE/CoJ,OAAO,CAAC,CAAC;MACTL,IAAI,CAACO,MAAM,CAAC,CAAC;IACd,CAAC,CAAC;IAEF3J,EAAE,CAAC,0BAA0B,EAAE,MAAM;MACpC,MAAM+I,QAAQ,GAAGjJ,SAAS,CACzB,MAAMiJ,QAAQ,CAAC;QACdnI,GAAG,GAAG,CAAC;QACP6F,GAAG,GAAG,CAAC;QAEPpC,WAAWA,CAAA,EAAG;UACb3E,SAAS,CAAC,IAAI,CAAC;QAChB;QAEAwJ,QAAQA,CAAA,EAAG;UACV,OAAO3J,IAAI,aAAa,MAAM,IAAI,CAACqB,GAAG,UAAU,MAAM,IAAI,CAAC6F,GAAG,QAAQ;QACvE;MACD,CACD,CAAC;MAED,MAAM2C,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MAC1CD,QAAQ,CAACE,IAAI,CAACC,MAAM,CAACJ,IAAI,CAAC;MAE1B,MAAM,CAACf,CAAC,EAAE4B,IAAI,CAAC,GAAG9K,YAAY,CAAC,CAAC,CAAC;MACjC,MAAM+D,CAAC,GAAGvD,oBAAoB,CAAC,CAAC,CAAC;;MAEjC;MACA;MACA;MACA;MACA,MAAM8J,OAAO,GAAGnK,MAAM,CAAC,MAAMC,IAAI,IAAIwJ,QAAQ,QAAQV,CAAC,QAAQ,MAAMnF,CAAC,CAAC,CAAC,KAAK,EAAEkG,IAAI,CAAC;MAEnFjJ,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,gBAAgB,CAAC;MAE/C4J,IAAI,CAAC,CAAC,CAAC;MACP/G,CAAC,CAAC,CAAC,CAAC;MAEJ/C,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,gBAAgB,CAAC;MAE/CoJ,OAAO,CAAC,CAAC;MACTL,IAAI,CAACO,MAAM,CAAC,CAAC;IACd,CAAC,CAAC;;IAEF;IACAO,GAAG,CAAC,6BAA6B,EAAE,YAAY;MAAA,IAAAC,YAAA,EAAAC,UAAA,EAAAC,UAAA;MAAA,IAAAC,UAAA;MAC9C,MAAAvB,QAAA,CAEe;QAAA;UAAA;YAAAnG,CAAA,GAAAwH,UAAA,EAAAC,UAAA;YAAAxH,CAAA,GAAAyH,UAAA,EAAAH,YAAA;UAAA,IAAArH,UAAA,SACblD,MAAM,cACNA,MAAM,eAJPE,SAAS,EACTL,QAAQ;QAAA;QAEAmB,GAAG,GAAAwJ,UAAA,OAAG,CAAC;QACP3D,GAAG,GAAA4D,UAAA,OAAG,CAAC;QAEfnB,QAAQA,CAAA,EAAG;UACV,OAAO3J,IAAI,aAAa,MAAM,IAAI,CAACqB,GAAG,UAAU,MAAM,IAAI,CAAC6F,GAAG,QAAQ;QACvE;QAAC;UAAA0D,YAAA;QAAA;MACF;MAEA,MAAMf,IAAI,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;MAC1CD,QAAQ,CAACE,IAAI,CAACC,MAAM,CAACJ,IAAI,CAAC;MAE1B,IAAI/F,CAAC,GAAGhE,aAAa,CAAM;QAACgE,CAAC,EAAE;UAACzC,GAAG,EAAE;QAAG;MAAC,CAAC,CAAC;;MAE3C;MACA;MACA,MAAM6I,OAAO,GAAGnK,MAAM,CAAC,MAAMC,IAAI,IAAIwJ,UAAQ,OAAO1F,CAAC,CAACA,CAAC,KAAK,EAAE+F,IAAI,CAAC;MAEnEjJ,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,kBAAkB,CAAC;MAEjDgD,CAAC,CAACA,CAAC,GAAG;QAACoD,GAAG,EAAE;MAAG,CAAC;MAEhBtG,MAAM,CAACiJ,IAAI,CAACM,WAAW,CAAC,CAACrJ,IAAI,CAAC,oBAAoB,CAAC;MAEnDoJ,OAAO,CAAC,CAAC;MACTL,IAAI,CAACO,MAAM,CAAC,CAAC;IACd,CAAC,CAAC;EACH,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,SAASxG,kBAAkBA,CAACD,CAAqC,EAAEqH,aAAa,GAAG,CAAC,EAAE;EACrF,IAAI5J,KAAK,GAAG,CAAC;EAEbzB,UAAU,CAAC,MAAM;IAChBF,cAAc,CAAC,MAAM;MACpBkE,CAAC,CAACH,MAAM;MACRG,CAAC,CAACF,QAAQ;MACVrC,KAAK,EAAE;IACR,CAAC,CAAC;EACH,CAAC,CAAC;EAEFR,MAAM,CAAC+C,CAAC,CAACH,MAAM,CAAC,CAAC1C,IAAI,CAACkK,aAAa,EAAE,sBAAsB,CAAC;EAC5DpK,MAAM,CAAC+C,CAAC,CAACF,QAAQ,CAAC,CAAC3C,IAAI,CAAC,CAAC,EAAE,wBAAwB,CAAC;EACpDF,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC;EAE3C6C,CAAC,CAACH,MAAM,EAAE;EAEV5C,MAAM,CAAC+C,CAAC,CAACH,MAAM,CAAC,CAAC1C,IAAI,CAACkK,aAAa,GAAG,CAAC,EAAE,0BAA0B,CAAC;EACpEpK,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC;EAE3C6C,CAAC,CAACF,QAAQ,EAAE;EAEZ7C,MAAM,CAAC+C,CAAC,CAACF,QAAQ,CAAC,CAAC3C,IAAI,CAAC,CAAC,EAAE,4BAA4B,CAAC;EACxDF,MAAM,CAACQ,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,EAAE,oBAAoB,CAAC;AAC5C;;AAEA;AACA;AACA;;AAEA;EACC,MAAMJ,GAAG,GAAGT,kBAAkB,CAAC,CAAC,CAAC;EACjC,IAAIgL,EAAU,GAAGvK,GAAG,CAACG,GAAG,CAAC,CAAC;EAC1BoK,EAAE;EACFvK,GAAG,CAACC,GAAG,CAAC,GAAG,CAAC;EACZD,GAAG,CAACC,GAAG,CAACK,CAAC,IAAKiK,EAAE,GAAGjK,CAAC,GAAG,CAAE,CAAC;EAC1B;EACAN,GAAG,CAACC,GAAG,CAAC,CAAC;EAET,MAAMuK,IAAI,GAAGjL,kBAAkB,CAAS,CAAC;EACzC;EACA,IAAIkL,EAAU,GAAGD,IAAI,CAACrK,GAAG,CAAC,CAAC;EAC3BqK,IAAI,CAACvK,GAAG,CAAC,GAAG,CAAC;EACbuK,IAAI,CAACvK,GAAG,CAACyK,SAAS,CAAC,EAAC;EACpB;EACAF,IAAI,CAACvK,GAAG,CAACK,CAAC,IAAKmK,EAAE,GAAGnK,CAAC,GAAG,CAAE,CAAC;EAC3B;;EAEA;EACA,MAAMqK,IAAI,GAAGpL,kBAAkB,CAAS,IAAI,CAAC;EAE7C,MAAMqL,IAAI,GAAGrL,kBAAkB,CAAC,IAAI,CAAC;EACrC,IAAIsL,EAAW,GAAGD,IAAI,CAACzK,GAAG,CAAC,CAAC;EAC5B0K,EAAE;EACFD,IAAI,CAAC3K,GAAG,CAAC,KAAK,CAAC;EACf2K,IAAI,CAAC3K,GAAG,CAACgD,CAAC,IAAK4H,EAAE,GAAG,CAAC5H,CAAE,CAAC;EACxB;EACA2H,IAAI,CAAC3K,GAAG,CAAC,CAAC;EAEV,MAAM6K,KAAK,GAAGvL,kBAAkB,CAAU,CAAC;EAC3C;EACA,IAAIwL,EAAW,GAAGD,KAAK,CAAC3K,GAAG,CAAC,CAAC;EAC7B2K,KAAK,CAAC7K,GAAG,CAAC,KAAK,CAAC;EAChB6K,KAAK,CAAC7K,GAAG,CAACyK,SAAS,CAAC,EAAC;EACrBI,KAAK,CAAC7K,GAAG,CAACK,CAAC,IAAKyK,EAAE,GAAG,CAACzK,CAAE,CAAC,EAAC;EAC1B;EACAwK,KAAK,CAAC7K,GAAG,CAACK,CAAC,IAAKyK,EAAE,GAAGzK,CAAE,CAAC;EACxB;;EAEA,MAAME,IAAI,GAAGjB,kBAAkB,CAAC,MAAM,CAAC,CAAC;EACxC;EACAiB,IAAI,CAACP,GAAG,CAAC,MAAM,CAAC,CAAC;EACjBO,IAAI,CAACP,GAAG,CAAC,MAAM,MAAS,CAAC,CAAC,EAAC;EAC3B,MAAM+K,EAAW,GAAGxK,IAAI,CAACL,GAAG,CAAC,CAAC,EAAC;EAC/B6K,EAAE;EACF,MAAMC,EAAK,GAAGzK,IAAI,CAACL,GAAG,CAAC,CAAC,CAAC,CAAC;EAC1B8K,EAAE;EAEF,MAAMC,KAAK,GAAG3L,kBAAkB,CAAe,MAAM,CAAC,CAAC;EACvD;EACA2L,KAAK,CAACjL,GAAG,CAAC,MAAM,CAAC,CAAC,EAAC;EACnBiL,KAAK,CAACjL,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC,EAAC;EACzB,MAAMkL,GAAiB,GAAGD,KAAK,CAAC/K,GAAG,CAAC,CAAC,EAAC;EACtCgL,GAAG;EACH,MAAMC,EAAU,GAAGF,KAAK,CAAC/K,GAAG,CAAC,CAAC,CAAC,CAAC;EAChCiL,EAAE;EAEF,MAAMC,aAAa,GAAG9L,kBAAkB,CAA0B,EAAE,CAAC;EACrE;EACA8L,aAAa,CAACpL,GAAG,CAAC,MAAM,CAAC,CAAC,EAAC;EAC3B;EACA,MAAMqL,GAAiB,GAAGD,aAAa,CAACpL,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;EAC1DqL,GAAG;EACH;EACA,MAAMC,GAAW,GAAGF,aAAa,CAACpL,GAAG,CAAC,SAAS,CAAC;EAChDsL,GAAG;EACH;EACA,MAAMC,GAAW,GAAGH,aAAa,CAACpL,GAAG,CAAC,MAAM,SAAS,CAAC;EACtDuL,GAAG;EACH;EACAH,aAAa,CAACpL,GAAG,CAAC,CAAC;EACnB;EACAoL,aAAa,CAACpL,GAAG,CAACyK,SAAS,CAAC;EAC5B;EACA,MAAMe,GAAiB,GAAGJ,aAAa,CAAClL,GAAG,CAAC,CAAC;EAC7CsL,GAAG;EACH,MAAMC,GAAwC,GAAGL,aAAa,CAAClL,GAAG,CAAC,CAAC;EACpEuL,GAAG;EACH,MAAMC,GAA4B,GAAGN,aAAa,CAAClL,GAAG,CAAC,CAAC;EACxDwL,GAAG;EAEH,MAAMC,aAAa,GAAGrM,kBAAkB,CAA0B,CAAC;EACnE;EACAqM,aAAa,CAAC3L,GAAG,CAAC,MAAM,CAAC,CAAC,EAAC;EAC3B;EACA,MAAM4L,GAAiB,GAAGD,aAAa,CAAC3L,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;EAC1D4L,GAAG;EACH;EACA,MAAMC,IAAY,GAAGF,aAAa,CAAC3L,GAAG,CAAC,SAAS,CAAC;EACjD6L,IAAI;EACJ;EACA,MAAMC,IAAY,GAAGH,aAAa,CAAC3L,GAAG,CAAC,MAAM,SAAS,CAAC;EACvD8L,IAAI;EACJ;EACA,MAAMC,IAAe,GAAGJ,aAAa,CAAC3L,GAAG,CAAC,CAAC;EAC3C+L,IAAI;EACJ;EACA,MAAMC,IAAe,GAAGL,aAAa,CAAC3L,GAAG,CAACyK,SAAS,CAAC;EACpDuB,IAAI;EACJ,MAAMC,IAAyC,GAAGN,aAAa,CAACzL,GAAG,CAAC,CAAC;EACrE+L,IAAI;EACJ;EACA,MAAMC,IAA6B,GAAGP,aAAa,CAACzL,GAAG,CAAC,CAAC;EACzDgM,IAAI;AACL;;AAEA;AACA;AACA;;AAEA;EACC,MAAMnM,GAAG,GAAGN,oBAAoB,CAAC,CAAC,CAAC;EACnC,IAAI6K,EAAU,GAAGvK,GAAG,CAAC,CAAC;EACtBuK,EAAE;EACFvK,GAAG,CAAC,GAAG,CAAC;EACRA,GAAG,CAACM,CAAC,IAAKiK,EAAE,GAAGjK,CAAC,GAAG,CAAE,CAAC;EACtBN,GAAG,CAAC,CAAC;EAEL,MAAMwK,IAAI,GAAG9K,oBAAoB,CAAS,CAAC;EAC3C;EACA,IAAI+K,EAAU,GAAGD,IAAI,CAAC,CAAC;EACvBA,IAAI,CAAC,GAAG,CAAC;EACTA,IAAI,CAACE,SAAS,CAAC,EAAC;EAChB;EACAF,IAAI,CAAClK,CAAC,IAAKmK,EAAE,GAAGnK,CAAC,GAAG,CAAE,CAAC;EACvBkK,IAAI,CAAC,CAAC,EAAC;;EAEP;EACA,MAAMG,IAAI,GAAGjL,oBAAoB,CAAS,IAAI,CAAC;EAE/C,MAAMkL,IAAI,GAAGlL,oBAAoB,CAAC,IAAI,CAAC;EACvC,IAAImL,EAAW,GAAGD,IAAI,CAAC,CAAC;EACxBC,EAAE;EACFD,IAAI,CAAC,KAAK,CAAC;EACXA,IAAI,CAAC3H,CAAC,IAAK4H,EAAE,GAAG,CAAC5H,CAAE,CAAC;EACpB2H,IAAI,CAAC,CAAC;EAEN,MAAME,KAAK,GAAGpL,oBAAoB,CAAU,CAAC;EAC7C;EACA,IAAIqL,EAAW,GAAGD,KAAK,CAAC,CAAC;EACzBA,KAAK,CAAC,KAAK,CAAC;EACZA,KAAK,CAACJ,SAAS,CAAC,EAAC;EACjBI,KAAK,CAACxK,CAAC,IAAKyK,EAAE,GAAG,CAACzK,CAAE,CAAC,EAAC;EACtB;EACAwK,KAAK,CAACxK,CAAC,IAAKyK,EAAE,GAAGzK,CAAE,CAAC;EACpBwK,KAAK,CAAC,CAAC,EAAC;;EAER,MAAMtK,IAAI,GAAGd,oBAAoB,CAAC,MAAM,CAAC,CAAC;EAC1C;EACAc,IAAI,CAAC,MAAM,CAAC,CAAC;EACbA,IAAI,CAAC,MAAM,MAAS,CAAC,CAAC,EAAC;EACvB,MAAMwK,EAAW,GAAGxK,IAAI,CAAC,CAAC,EAAC;EAC3BwK,EAAE;EACF,MAAMC,EAAK,GAAGzK,IAAI,CAAC,CAAC,CAAC,CAAC;EACtByK,EAAE;EAEF,MAAMC,KAAK,GAAGxL,oBAAoB,CAAe,MAAM,CAAC,CAAC;EACzD;EACAwL,KAAK,CAAC,MAAM,CAAC,CAAC;EACdA,KAAK,CAAC,MAAM,MAAM,CAAC,CAAC,EAAC;EACrB,MAAMC,GAAiB,GAAGD,KAAK,CAAC,CAAC,EAAC;EAClCC,GAAG;EACH,MAAMC,EAAU,GAAGF,KAAK,CAAC,CAAC,CAAC,CAAC;EAC5BE,EAAE;EAEF,MAAMC,aAAa,GAAG3L,oBAAoB,CAA0B,EAAE,CAAC;EACvE;EACA2L,aAAa,CAAC,MAAM,CAAC,CAAC;EACtB,MAAMC,GAAiB,GAAGD,aAAa,CAAC,MAAM,MAAM,CAAC,CAAC;EACtDC,GAAG;EACH,MAAMC,GAAW,GAAGF,aAAa,CAAC,SAAS,CAAC;EAC5CE,GAAG;EACH,MAAMC,GAAW,GAAGH,aAAa,CAAC,MAAM,SAAS,CAAC;EAClDG,GAAG;EACHH,aAAa,CAAC,CAAC,EAAC;EAChB;EACAA,aAAa,CAACX,SAAS,CAAC;EACxB;EACA,MAAMe,GAAiB,GAAGJ,aAAa,CAAC,CAAC;EACzCI,GAAG;EACH,MAAMC,GAAwC,GAAGL,aAAa,CAAC,CAAC;EAChEK,GAAG;EACH,MAAMC,GAA4B,GAAGN,aAAa,CAAC,CAAC;EACpDM,GAAG;EAEH,MAAMC,aAAa,GAAGlM,oBAAoB,CAA0B,CAAC;EACrE;EACAkM,aAAa,CAAC,MAAM,CAAC,CAAC;EACtB,MAAMC,GAAiB,GAAGD,aAAa,CAAC,MAAM,MAAM,CAAC,CAAC;EACtDC,GAAG;EACH,MAAMC,IAAY,GAAGF,aAAa,CAAC,SAAS,CAAC;EAC7CE,IAAI;EACJ,MAAMC,IAAY,GAAGH,aAAa,CAAC,MAAM,SAAS,CAAC;EACnDG,IAAI;EACJ;EACA,MAAMC,IAAe,GAAGJ,aAAa,CAAC,CAAC;EACvCI,IAAI;EACJ,MAAMC,IAAe,GAAGL,aAAa,CAAClB,SAAS,CAAC;EAChDuB,IAAI;EACJ,MAAMC,IAAyC,GAAGN,aAAa,CAAC,CAAC;EACjEM,IAAI;EACJ;EACA,MAAMC,IAA6B,GAAGP,aAAa,CAAC,CAAC;EACrDO,IAAI;AACL","ignoreList":[]} \ No newline at end of file diff --git a/dist/signalify.d.ts b/dist/signalify.d.ts index 36bca7c..e8b4b8a 100644 --- a/dist/signalify.d.ts +++ b/dist/signalify.d.ts @@ -1,3 +1,4 @@ +import { type SignalFunction } from './createSignalFunction.js'; /** * Convert properties on an object into Solid signal-backed properties. * @@ -50,11 +51,8 @@ export declare function signalify(obj: T): T; export declare function signalify(obj: T, ...props: (keyof T)[]): T; export declare function signalify(obj: T, ...props: [key: keyof T, initialValue: unknown][]): T; -/** - * This ensures that `createSignalAccessor` is kept internal to classy-solid only. - */ -export declare function getCreateSignalAccessor(): typeof createSignalAccessor; export declare function __isPropSetAtLeastOnce(instance: object, prop: string | symbol): boolean; -declare function createSignalAccessor(obj: T, prop: Exclude, initialVal: unknown): void; -export {}; +export declare function __trackPropSetAtLeastOnce(instance: object, prop: string | symbol): void; +export declare function __createSignalAccessor(obj: T, prop: Exclude, initialVal: unknown): void; +export declare function __getSignal(obj: object, storage: WeakMap>, initialVal: unknown): SignalFunction; //# sourceMappingURL=signalify.d.ts.map \ No newline at end of file diff --git a/dist/signalify.d.ts.map b/dist/signalify.d.ts.map index 79550f3..dfc17a6 100644 --- a/dist/signalify.d.ts.map +++ b/dist/signalify.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"signalify.d.ts","sourceRoot":"","sources":["../src/signalify.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AACzE,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC7E,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAA;AA0BzG;;GAEG;AACH,wBAAgB,uBAAuB,gCAItC;AASD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,WAE7E;AASD,iBAAS,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CA0EjH"} \ No newline at end of file +{"version":3,"file":"signalify.d.ts","sourceRoot":"","sources":["../src/signalify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAA;AAInF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;AACzE,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC7E,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAA;AA+BzG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,WAE7E;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,QAGhF;AAID,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACtD,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAC9B,UAAU,EAAE,OAAO,GACjB,IAAI,CA2DN;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,2BAI9G"} \ No newline at end of file diff --git a/dist/signalify.js b/dist/signalify.js index 59bcd77..2251651 100644 --- a/dist/signalify.js +++ b/dist/signalify.js @@ -1,5 +1,6 @@ import { getInheritedDescriptor } from 'lowclass/dist/getInheritedDescriptor.js'; -import { createSignal, $PROXY, untrack } from 'solid-js'; +import { $PROXY, untrack } from 'solid-js'; +import { createSignalFunction } from './createSignalFunction.js'; /** * Convert properties on an object into Solid signal-backed properties. @@ -66,20 +67,10 @@ export function signalify(obj, ...props) { // We cast from PropertyKey to PropKey because keys can't actually be number, only string | symbol. const _prop = isTuple ? prop[0] : prop; const initialValue = isTuple ? prop[1] : untrack(() => obj[_prop]); - createSignalAccessor(obj, _prop, initialValue); + __createSignalAccessor(obj, _prop, initialValue); } return obj; } -let gotCreateSignalAccessor = false; - -/** - * This ensures that `createSignalAccessor` is kept internal to classy-solid only. - */ -export function getCreateSignalAccessor() { - if (gotCreateSignalAccessor) throw new Error('Export "createSignalAccessor" is internal to classy-solid only.'); - gotCreateSignalAccessor = true; - return createSignalAccessor; -} // propsSetAtLeastOnce is a Set that tracks which reactive properties have been // set at least once. @@ -91,72 +82,60 @@ const propsSetAtLeastOnce = new WeakMap(); export function __isPropSetAtLeastOnce(instance, prop) { return !!propsSetAtLeastOnce.get(instance)?.has(prop); } -function trackPropSetAtLeastOnce(instance, prop) { +export function __trackPropSetAtLeastOnce(instance, prop) { if (!propsSetAtLeastOnce.has(instance)) propsSetAtLeastOnce.set(instance, new Set()); propsSetAtLeastOnce.get(instance).add(prop); } const isSignalGetter = new WeakSet(); -function createSignalAccessor(obj, prop, initialVal) { +export function __createSignalAccessor(obj, prop, initialVal) { let descriptor = getInheritedDescriptor(obj, prop); let originalGet; let originalSet; + const isAccessor = !!(descriptor?.get || descriptor?.set); if (descriptor) { originalGet = descriptor.get; originalSet = descriptor.set; if (originalGet && isSignalGetter.has(originalGet)) return; - if (originalGet || originalSet) { - // reactivity requires both - if (!originalGet || !originalSet) return warnNotReadWrite(prop); - delete descriptor.get; - delete descriptor.set; - } else { + // reactivity requires both + if (isAccessor && !(originalGet && originalSet)) return warnNotReadWrite(prop); + if (!isAccessor) { + // no need to make a signal that can't be written to + if (!descriptor.writable) return warnNotWritable(prop); + // If there was a value descriptor, trust it as the source of truth // for initialVal. For example, if the user class modifies the value // after the initializer, it will have a different value than what // we tracked from the initializer. initialVal = descriptor.value; - - // if it isn't writable, we don't need to make a reactive variable because - // the value won't change - if (!descriptor.writable) return warnNotWritable(prop); - delete descriptor.value; - delete descriptor.writable; } } const signalStorage = new WeakMap(); - descriptor = { + const newDescriptor = { configurable: true, - enumerable: true, - ...descriptor, - get: originalGet ? function () { - const s = getSignal(this, signalStorage, initialVal); - s[0](); // read + enumerable: descriptor?.enumerable, + get: isAccessor ? function () { + __getSignal(this, signalStorage, initialVal)(); return originalGet.call(this); } : function () { - const s = getSignal(this, signalStorage, initialVal); - return s[0](); // read + return __getSignal(this, signalStorage, initialVal)(); }, - set: originalSet ? function (newValue) { + set: isAccessor ? function (newValue) { originalSet.call(this, newValue); - trackPropSetAtLeastOnce(this, prop); - - // write - const s = getSignal(this, signalStorage, initialVal); - if (typeof newValue === 'function') s[1](() => newValue);else s[1](newValue); + __trackPropSetAtLeastOnce(this, prop); + const s = __getSignal(this, signalStorage, initialVal); + s(typeof newValue === 'function' ? () => newValue : newValue); } : function (newValue) { - trackPropSetAtLeastOnce(this, prop); - - // write - const s = getSignal(this, signalStorage, initialVal); - if (typeof newValue === 'function') s[1](() => newValue);else s[1](newValue); + __trackPropSetAtLeastOnce(this, prop); + const s = __getSignal(this, signalStorage, initialVal); + s(typeof newValue === 'function' ? () => newValue : newValue); } }; - isSignalGetter.add(descriptor.get); - Object.defineProperty(obj, prop, descriptor); + isSignalGetter.add(newDescriptor.get); + Object.defineProperty(obj, prop, newDescriptor); } -function getSignal(obj, storage, initialVal) { +export function __getSignal(obj, storage, initialVal) { let s = storage.get(obj); - if (!s) storage.set(obj, s = createSignal(initialVal, { + if (!s) storage.set(obj, s = createSignalFunction(initialVal, { equals: false })); return s; diff --git a/dist/signalify.js.map b/dist/signalify.js.map index 22c6dd2..ae82a72 100644 --- a/dist/signalify.js.map +++ b/dist/signalify.js.map @@ -1 +1 @@ -{"version":3,"file":"signalify.js","names":["getInheritedDescriptor","createSignal","$PROXY","untrack","signalify","obj","props","proxy","_props","length","Object","keys","concat","getOwnPropertySymbols","prop","isTuple","Array","isArray","_prop","initialValue","createSignalAccessor","gotCreateSignalAccessor","getCreateSignalAccessor","Error","propsSetAtLeastOnce","WeakMap","__isPropSetAtLeastOnce","instance","get","has","trackPropSetAtLeastOnce","set","Set","add","isSignalGetter","WeakSet","initialVal","descriptor","originalGet","originalSet","warnNotReadWrite","value","writable","warnNotWritable","signalStorage","configurable","enumerable","s","getSignal","call","newValue","defineProperty","storage","equals","console","warn","String"],"sources":["../src/signalify.ts"],"sourcesContent":["import {getInheritedDescriptor} from 'lowclass/dist/getInheritedDescriptor.js'\nimport {createSignal, $PROXY, untrack, type Signal} from 'solid-js'\nimport type {PropKey} from './decorators/types.js'\n\ntype AnyObject = Record\n\n/**\n * Convert properties on an object into Solid signal-backed properties.\n *\n * There are two ways to use this: either by defining which properties to\n * convert to signal-backed properties by providing an array as property names\n * in the second arg, which is useful on plain objects, or by passing in `this`\n * and `this.constructor` within the `constructor` of a class that has\n * properties decorated with `@signal`.\n *\n * Example with a class:\n *\n * ```js\n * import {signalify} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * class Counter {\n * count = 0\n *\n * constructor() {\n * signalify(this, 'count')\n * setInterval(() => this.count++, 1000)\n * }\n * }\n *\n * const counter = new Counter\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n *\n * Example with a plain object:\n *\n * ```js\n * import {signalify} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * const counter = {\n * count: 0\n * }\n *\n * signalify(counter, 'count')\n * setInterval(() => counter.count++, 1000)\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n */\nexport function signalify(obj: T): T\nexport function signalify(obj: T, ...props: (keyof T)[]): T\nexport function signalify(obj: T, ...props: [key: keyof T, initialValue: unknown][]): T\nexport function signalify(obj: AnyObject, ...props: [key: PropertyKey, initialValue: unknown][] | PropertyKey[]) {\n\t// Special case for Solid proxies: if the object is already a solid proxy,\n\t// all properties are already reactive, no need to signalify.\n\t// @ts-expect-error special indexed access\n\tconst proxy = obj[$PROXY] as T\n\tif (proxy) return obj\n\n\tconst _props = props.length ? props : (Object.keys(obj) as PropKey[]).concat(Object.getOwnPropertySymbols(obj))\n\n\t// Use `untrack` here to be extra safe the initial value doesn't count as a\n\t// dependency and cause a reactivity loop.\n\tfor (const prop of _props) {\n\t\tconst isTuple = Array.isArray(prop)\n\t\t// We cast from PropertyKey to PropKey because keys can't actually be number, only string | symbol.\n\t\tconst _prop = (isTuple ? prop[0] : prop) as PropKey\n\t\tconst initialValue = isTuple ? prop[1] : untrack(() => obj[_prop])\n\n\t\tcreateSignalAccessor(obj, _prop, initialValue)\n\t}\n\n\treturn obj\n}\n\nlet gotCreateSignalAccessor = false\n\n/**\n * This ensures that `createSignalAccessor` is kept internal to classy-solid only.\n */\nexport function getCreateSignalAccessor() {\n\tif (gotCreateSignalAccessor) throw new Error('Export \"createSignalAccessor\" is internal to classy-solid only.')\n\tgotCreateSignalAccessor = true\n\treturn createSignalAccessor\n}\n\n// propsSetAtLeastOnce is a Set that tracks which reactive properties have been\n// set at least once.\nconst propsSetAtLeastOnce = new WeakMap>()\n\n// @lume/element uses this to detect if a reactive prop has been set, and if so\n// will not overwrite the value with any pre-existing value from custom element\n// pre-upgrade.\nexport function __isPropSetAtLeastOnce(instance: object, prop: string | symbol) {\n\treturn !!propsSetAtLeastOnce.get(instance)?.has(prop)\n}\n\nfunction trackPropSetAtLeastOnce(instance: object, prop: string | symbol) {\n\tif (!propsSetAtLeastOnce.has(instance)) propsSetAtLeastOnce.set(instance, new Set())\n\tpropsSetAtLeastOnce.get(instance)!.add(prop)\n}\n\nconst isSignalGetter = new WeakSet()\n\nfunction createSignalAccessor(obj: T, prop: Exclude, initialVal: unknown): void {\n\tlet descriptor: PropertyDescriptor | undefined = getInheritedDescriptor(obj, prop)\n\n\tlet originalGet: (() => any) | undefined\n\tlet originalSet: ((v: any) => void) | undefined\n\n\tif (descriptor) {\n\t\toriginalGet = descriptor.get\n\t\toriginalSet = descriptor.set\n\n\t\tif (originalGet && isSignalGetter.has(originalGet)) return\n\n\t\tif (originalGet || originalSet) {\n\t\t\t// reactivity requires both\n\t\t\tif (!originalGet || !originalSet) return warnNotReadWrite(prop)\n\n\t\t\tdelete descriptor.get\n\t\t\tdelete descriptor.set\n\t\t} else {\n\t\t\t// If there was a value descriptor, trust it as the source of truth\n\t\t\t// for initialVal. For example, if the user class modifies the value\n\t\t\t// after the initializer, it will have a different value than what\n\t\t\t// we tracked from the initializer.\n\t\t\tinitialVal = descriptor.value\n\n\t\t\t// if it isn't writable, we don't need to make a reactive variable because\n\t\t\t// the value won't change\n\t\t\tif (!descriptor.writable) return warnNotWritable(prop)\n\n\t\t\tdelete descriptor.value\n\t\t\tdelete descriptor.writable\n\t\t}\n\t}\n\n\tconst signalStorage = new WeakMap>()\n\n\tdescriptor = {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\t...descriptor,\n\t\tget: originalGet\n\t\t\t? function (this: object): unknown {\n\t\t\t\t\tconst s = getSignal(this, signalStorage, initialVal)\n\t\t\t\t\ts[0]() // read\n\t\t\t\t\treturn originalGet!.call(this)\n\t\t\t }\n\t\t\t: function (this: object): unknown {\n\t\t\t\t\tconst s = getSignal(this, signalStorage, initialVal)\n\t\t\t\t\treturn s[0]() // read\n\t\t\t },\n\t\tset: originalSet\n\t\t\t? function (this: object, newValue: unknown) {\n\t\t\t\t\toriginalSet!.call(this, newValue)\n\n\t\t\t\t\ttrackPropSetAtLeastOnce(this, prop)\n\n\t\t\t\t\t// write\n\t\t\t\t\tconst s = getSignal(this, signalStorage, initialVal)\n\t\t\t\t\tif (typeof newValue === 'function') s[1](() => newValue)\n\t\t\t\t\telse s[1](newValue)\n\t\t\t }\n\t\t\t: function (this: object, newValue: unknown) {\n\t\t\t\t\ttrackPropSetAtLeastOnce(this, prop)\n\n\t\t\t\t\t// write\n\t\t\t\t\tconst s = getSignal(this, signalStorage, initialVal)\n\t\t\t\t\tif (typeof newValue === 'function') s[1](() => newValue)\n\t\t\t\t\telse s[1](newValue)\n\t\t\t },\n\t}\n\n\tisSignalGetter.add(descriptor.get!)\n\n\tObject.defineProperty(obj, prop, descriptor)\n}\n\nfunction getSignal(obj: object, storage: WeakMap>, initialVal: unknown) {\n\tlet s = storage.get(obj)\n\tif (!s) storage.set(obj, (s = createSignal(initialVal, {equals: false})))\n\treturn s\n}\n\nfunction warnNotReadWrite(prop: PropertyKey) {\n\tconsole.warn(\n\t\t`Cannot signalify property named \"${String(\n\t\t\tprop,\n\t\t)}\" which had a getter or a setter, but not both. Reactivity on accessors works only when accessors have both get and set. Skipped.`,\n\t)\n}\n\nfunction warnNotWritable(prop: PropertyKey) {\n\tconsole.warn(\n\t\t`The \\`@signal\\` decorator was used on a property named \"${String(\n\t\t\tprop,\n\t\t)}\" that is not writable. Reactivity is not enabled for non-writable properties.`,\n\t)\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"signalify.js","names":["getInheritedDescriptor","$PROXY","untrack","createSignalFunction","signalify","obj","props","proxy","_props","length","Object","keys","concat","getOwnPropertySymbols","prop","isTuple","Array","isArray","_prop","initialValue","__createSignalAccessor","propsSetAtLeastOnce","WeakMap","__isPropSetAtLeastOnce","instance","get","has","__trackPropSetAtLeastOnce","set","Set","add","isSignalGetter","WeakSet","initialVal","descriptor","originalGet","originalSet","isAccessor","warnNotReadWrite","writable","warnNotWritable","value","signalStorage","newDescriptor","configurable","enumerable","__getSignal","call","newValue","s","defineProperty","storage","equals","console","warn","String"],"sources":["../src/signalify.ts"],"sourcesContent":["import {getInheritedDescriptor} from 'lowclass/dist/getInheritedDescriptor.js'\nimport {$PROXY, untrack} from 'solid-js'\nimport type {PropKey} from './decorators/types.js'\nimport {createSignalFunction, type SignalFunction} from './createSignalFunction.js'\n\ntype AnyObject = Record\n\n/**\n * Convert properties on an object into Solid signal-backed properties.\n *\n * There are two ways to use this: either by defining which properties to\n * convert to signal-backed properties by providing an array as property names\n * in the second arg, which is useful on plain objects, or by passing in `this`\n * and `this.constructor` within the `constructor` of a class that has\n * properties decorated with `@signal`.\n *\n * Example with a class:\n *\n * ```js\n * import {signalify} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * class Counter {\n * count = 0\n *\n * constructor() {\n * signalify(this, 'count')\n * setInterval(() => this.count++, 1000)\n * }\n * }\n *\n * const counter = new Counter\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n *\n * Example with a plain object:\n *\n * ```js\n * import {signalify} from 'classy-solid'\n * import {createEffect} from 'solid-js'\n *\n * const counter = {\n * count: 0\n * }\n *\n * signalify(counter, 'count')\n * setInterval(() => counter.count++, 1000)\n *\n * createEffect(() => {\n * console.log('count:', counter.count)\n * })\n * ```\n */\nexport function signalify(obj: T): T\nexport function signalify(obj: T, ...props: (keyof T)[]): T\nexport function signalify(obj: T, ...props: [key: keyof T, initialValue: unknown][]): T\nexport function signalify(obj: AnyObject, ...props: [key: PropertyKey, initialValue: unknown][] | PropertyKey[]) {\n\t// Special case for Solid proxies: if the object is already a solid proxy,\n\t// all properties are already reactive, no need to signalify.\n\t// @ts-expect-error special indexed access\n\tconst proxy = obj[$PROXY] as T\n\tif (proxy) return obj\n\n\tconst _props = props.length ? props : (Object.keys(obj) as PropKey[]).concat(Object.getOwnPropertySymbols(obj))\n\n\t// Use `untrack` here to be extra safe the initial value doesn't count as a\n\t// dependency and cause a reactivity loop.\n\tfor (const prop of _props) {\n\t\tconst isTuple = Array.isArray(prop)\n\t\t// We cast from PropertyKey to PropKey because keys can't actually be number, only string | symbol.\n\t\tconst _prop = (isTuple ? prop[0] : prop) as PropKey\n\t\tconst initialValue = isTuple ? prop[1] : untrack(() => obj[_prop])\n\n\t\t__createSignalAccessor(obj, _prop, initialValue)\n\t}\n\n\treturn obj\n}\n\n// propsSetAtLeastOnce is a Set that tracks which reactive properties have been\n// set at least once.\nconst propsSetAtLeastOnce = new WeakMap>()\n\n// @lume/element uses this to detect if a reactive prop has been set, and if so\n// will not overwrite the value with any pre-existing value from custom element\n// pre-upgrade.\nexport function __isPropSetAtLeastOnce(instance: object, prop: string | symbol) {\n\treturn !!propsSetAtLeastOnce.get(instance)?.has(prop)\n}\n\nexport function __trackPropSetAtLeastOnce(instance: object, prop: string | symbol) {\n\tif (!propsSetAtLeastOnce.has(instance)) propsSetAtLeastOnce.set(instance, new Set())\n\tpropsSetAtLeastOnce.get(instance)!.add(prop)\n}\n\nconst isSignalGetter = new WeakSet()\n\nexport function __createSignalAccessor(\n\tobj: T,\n\tprop: Exclude,\n\tinitialVal: unknown,\n): void {\n\tlet descriptor: PropertyDescriptor | undefined = getInheritedDescriptor(obj, prop)\n\n\tlet originalGet: (() => any) | undefined\n\tlet originalSet: ((v: any) => void) | undefined\n\tconst isAccessor = !!(descriptor?.get || descriptor?.set)\n\n\tif (descriptor) {\n\t\toriginalGet = descriptor.get\n\t\toriginalSet = descriptor.set\n\n\t\tif (originalGet && isSignalGetter.has(originalGet)) return\n\t\t// reactivity requires both\n\t\tif (isAccessor && !(originalGet && originalSet)) return warnNotReadWrite(prop)\n\n\t\tif (!isAccessor) {\n\t\t\t// no need to make a signal that can't be written to\n\t\t\tif (!descriptor.writable) return warnNotWritable(prop)\n\n\t\t\t// If there was a value descriptor, trust it as the source of truth\n\t\t\t// for initialVal. For example, if the user class modifies the value\n\t\t\t// after the initializer, it will have a different value than what\n\t\t\t// we tracked from the initializer.\n\t\t\tinitialVal = descriptor.value\n\t\t}\n\t}\n\n\tconst signalStorage = new WeakMap>()\n\n\tconst newDescriptor = {\n\t\tconfigurable: true,\n\t\tenumerable: descriptor?.enumerable,\n\t\tget: isAccessor\n\t\t\t? function (this: object): unknown {\n\t\t\t\t\t__getSignal(this, signalStorage, initialVal)()\n\t\t\t\t\treturn originalGet!.call(this)\n\t\t\t }\n\t\t\t: function (this: object): unknown {\n\t\t\t\t\treturn __getSignal(this, signalStorage, initialVal)()\n\t\t\t },\n\t\tset: isAccessor\n\t\t\t? function (this: object, newValue: unknown) {\n\t\t\t\t\toriginalSet!.call(this, newValue)\n\t\t\t\t\t__trackPropSetAtLeastOnce(this, prop)\n\n\t\t\t\t\tconst s = __getSignal(this, signalStorage, initialVal)\n\t\t\t\t\ts(typeof newValue === 'function' ? () => newValue : newValue)\n\t\t\t }\n\t\t\t: function (this: object, newValue: unknown) {\n\t\t\t\t\t__trackPropSetAtLeastOnce(this, prop)\n\n\t\t\t\t\tconst s = __getSignal(this, signalStorage, initialVal)\n\t\t\t\t\ts(typeof newValue === 'function' ? () => newValue : newValue)\n\t\t\t },\n\t}\n\n\tisSignalGetter.add(newDescriptor.get!)\n\n\tObject.defineProperty(obj, prop, newDescriptor)\n}\n\nexport function __getSignal(obj: object, storage: WeakMap>, initialVal: unknown) {\n\tlet s = storage.get(obj)\n\tif (!s) storage.set(obj, (s = createSignalFunction(initialVal, {equals: false})))\n\treturn s\n}\n\nfunction warnNotReadWrite(prop: PropertyKey) {\n\tconsole.warn(\n\t\t`Cannot signalify property named \"${String(\n\t\t\tprop,\n\t\t)}\" which had a getter or a setter, but not both. Reactivity on accessors works only when accessors have both get and set. Skipped.`,\n\t)\n}\n\nfunction warnNotWritable(prop: PropertyKey) {\n\tconsole.warn(\n\t\t`The \\`@signal\\` decorator was used on a property named \"${String(\n\t\t\tprop,\n\t\t)}\" that is not writable. Reactivity is not enabled for non-writable properties.`,\n\t)\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/src/decorators/reactive.ts b/src/decorators/reactive.ts index d0853f8..b0e9ce5 100644 --- a/src/decorators/reactive.ts +++ b/src/decorators/reactive.ts @@ -1,14 +1,8 @@ import type {AnyConstructor} from 'lowclass/dist/Constructor.js' import {getListener, $PROXY, untrack} from 'solid-js' -import {getKey, getPropsToSignalify, resetPropsToSignalify} from './signal.js' -import {getCreateSignalAccessor} from '../signalify.js' +import {__propsToSignalify, __resetPropsToSignalify} from './signal.js' +import {__createSignalAccessor} from '../signalify.js' -/** - * Access key for classy-solid private internal APIs. - */ -const accessKey = getKey() - -const createSignalAccessor = getCreateSignalAccessor() const hasOwnProperty = Object.prototype.hasOwnProperty /** @@ -43,7 +37,6 @@ export function reactive(value: AnyConstructor, context: ClassDecoratorContext | throw new TypeError('The @reactive decorator is only for use on classes.') const Class = value - const signalProps = getPropsToSignalify(accessKey) // For the current class decorated with @reactive, we reset the map, so that // for the next class decorated with @reactive we track only that next @@ -52,7 +45,8 @@ export function reactive(value: AnyConstructor, context: ClassDecoratorContext | // // In the future maybe we can use decorator metadata for this // (https://github.com/tc39/proposal-decorator-metadata)? - resetPropsToSignalify(accessKey) + const signalProps = __propsToSignalify // grab the current value before we reset it. + __resetPropsToSignalify() class ReactiveDecorator extends Class { constructor(...args: any[]) { @@ -73,26 +67,13 @@ export function reactive(value: AnyConstructor, context: ClassDecoratorContext | if (proxy) return instance for (const [prop, propSpec] of signalProps) { - const kind = propSpec.kind let initialValue = propSpec.initialValue // @prod-prune if (!(hasOwnProperty.call(instance, prop) || hasOwnProperty.call(Class.prototype, prop))) throw new PropNotFoundError(prop) - const isAccessor = kind === 'getter' || kind === 'setter' - - if (isAccessor) { - const desc = Object.getOwnPropertyDescriptor(Class.prototype, prop)! - initialValue = desc.get!.call(instance) - // Note, if the kind was field, then the initializer already defined the initialValue. - } - - createSignalAccessor( - isAccessor ? Class.prototype : instance, - prop as Exclude, - initialValue, - ) + __createSignalAccessor(instance, prop as Exclude, initialValue) } return instance diff --git a/src/decorators/signal.ts b/src/decorators/signal.ts index aa351a2..a8effd7 100644 --- a/src/decorators/signal.ts +++ b/src/decorators/signal.ts @@ -1,42 +1,17 @@ +import {$PROXY} from 'solid-js' +import {__getSignal, __trackPropSetAtLeastOnce, __createSignalAccessor} from '../signalify.js' import type {PropKey, PropSpec} from './types.js' +import type {SignalFunction} from '../createSignalFunction.js' -let propsToSignalify = new Map() -let accessKey: symbol | null = null +export let __propsToSignalify = new Map() -/** - * Provides a key for accessing internal APIs. If any other module tries to get - * this, an error will be thrown, and signal and reactive decorators will not - * work. - */ -export function getKey() { - if (accessKey) throw new Error('Attempted use of classy-solid internals.') - accessKey = Symbol() - return accessKey -} - -/** - * This function provides propsToSignalify to only one external module - * (reactive.ts). The purpose of this is to keep the API private for reactive.ts - * only, otherwise an error will be thrown that breaks signal/reactive - * functionality. - */ -export function getPropsToSignalify(key: symbol) { - if (key !== accessKey) throw new Error('Attempted use of classy-solid internals.') - return propsToSignalify +export function __resetPropsToSignalify() { + __propsToSignalify = new Map() } -/** - * Only the module that first gets the key can call this function (it should be - * reactive.ts) - */ -export function resetPropsToSignalify(key: symbol) { - if (key !== accessKey) throw new Error('Attempted use of classy-solid internals.') - propsToSignalify = new Map() -} +const Undefined = Symbol() -function isMemberDecorator(context: DecoratorContext): context is ClassMemberDecoratorContext { - return !!('private' in context) -} +type SignalStorages = Record> | undefined> /** * @decorator @@ -69,33 +44,113 @@ function isMemberDecorator(context: DecoratorContext): context is ClassMemberDec * ``` */ export function signal( - _: unknown, - context: ClassFieldDecoratorContext | ClassGetterDecoratorContext | ClassSetterDecoratorContext, + value: unknown, + context: + | ClassFieldDecoratorContext + | ClassGetterDecoratorContext + | ClassSetterDecoratorContext + | ClassAccessorDecoratorContext, ): any { - const {kind, name} = context - const props = propsToSignalify + const {kind, name, metadata} = context + const props = __propsToSignalify - if (isMemberDecorator(context)) { - if (context.private) throw new Error('@signal is not supported on private fields yet.') - if (context.static) throw new Error('@signal is not supported on static fields yet.') - } + if (context.static) throw new Error('@signal is not supported on static fields yet.') + + // @prod-prune + queueReactiveDecoratorChecker(props) if (kind === 'field') { - props.set(name, {initialValue: undefined, kind}) + if (context.private && name !== '#finalize') throw new Error('@signal is not supported on private fields yet.') + + if (name === '#finalize') __propsToSignalify = new Map() // reset + else props.set(name, {initialValue: undefined, kind}) + return function (this: object, initialValue: unknown) { + if (name === '#finalize') { + // Special case for Solid proxies: if the object is already a solid proxy, + // all properties are already reactive, no need to signalify. + // @ts-expect-error special indexed access + const proxy = this[$PROXY] as T + if (proxy) return this + + for (const [prop, propSpec] of props) { + let initialValue = propSpec.initialValue + + // @prod-prune + if (!Object.hasOwn(this, prop)) + // continue + throw new PropNotFoundError(prop) + + __createSignalAccessor(this as any, prop, initialValue) + // CONTINUE testing this way of finalizing signal fields + } + return + } + props.get(name)!.initialValue = initialValue return initialValue } + } else if (kind === 'accessor') { + const {get, set} = value as {get: () => unknown; set: (v: unknown) => void} + const signalStorage = new WeakMap>() + let initialValue: unknown = undefined + + return { + init: function (this: object, initialVal: unknown) { + initialValue = initialVal + return initialVal + }, + get: function (this: object): unknown { + __getSignal(this, signalStorage, initialValue)() + return get.call(this) + }, + set: function (this: object, newValue: unknown) { + set.call(this, newValue) + __trackPropSetAtLeastOnce(this, name) // not needed anymore? test it + + const s = __getSignal(this, signalStorage, initialValue) + s(typeof newValue === 'function' ? () => newValue : newValue) + }, + } } else if (kind === 'getter' || kind === 'setter') { - props.set(name, {initialValue: undefined, kind}) - } else { - throw new Error( - 'The @signal decorator is only for use on fields, getters, and setters. Auto accessor support is coming next if there is demand for it.', - ) - } + const getOrSet = value as Function + const initialValue = Undefined - // @prod-prune - queueReactiveDecoratorChecker(props) + if (!Object.hasOwn(metadata, 'signalStoragesPerProp')) metadata.signalStoragesPerProp = {} + const signalsStorages = metadata.signalStoragesPerProp as SignalStorages + + let signalStorage = signalsStorages[name] + if (!signalStorage) signalsStorages[name] = signalStorage = new WeakMap>() + + if (!Object.hasOwn(metadata, 'getterSetterPairs')) metadata.getterSetterPairs = {} + const pairs = metadata.getterSetterPairs as {[key: PropKey]: 0 | 1 | 2} + + // Show a helpful error in case someone forgets to decorate both a getter and setter. + queueMicrotask(() => { + if (pairs[name] !== 2) throw new MissingDecoratorError(name) + }) + + if (kind === 'getter') { + pairs[name] ??= 0 + pairs[name]++ + + return function (this: object): unknown { + __getSignal(this, signalStorage, initialValue)() + return getOrSet.call(this) + } + } else { + pairs[name] ??= 0 + pairs[name]++ + + return function (this: object, newValue: unknown) { + getOrSet.call(this, newValue) + __trackPropSetAtLeastOnce(this, name) + + const s = __getSignal(this, signalStorage, initialValue) + s(typeof newValue === 'function' ? () => newValue : newValue) + } + } + } else throw new InvalidDecorationError() } let checkerQueued = false @@ -117,7 +172,7 @@ function queueReactiveDecoratorChecker(props: Map) { // If the refs are still equal, it means @reactive did not run (forgot // to decorate a class that uses @signal with @reactive). - if (props === propsToSignalify) { + if (props === __propsToSignalify) { throw new Error( // Array.from(map.keys()) instead of [...map.keys()] because it breaks in Oculus browser. `Stray @signal-decorated properties detected: ${Array.from(props.keys()).join( @@ -127,3 +182,31 @@ function queueReactiveDecoratorChecker(props: Map) { } }) } + +class PropNotFoundError extends Error { + constructor(prop: PropertyKey) { + super( + `Property "${String( + prop, + )}" not found on instance of class decorated with \`@reactive\`. Did you forget to use the \`@reactive\` decorator on one of your classes that has a "${String( + prop, + )}" property decorated with \`@signal\`?`, + ) + } +} + +class MissingDecoratorError extends Error { + constructor(prop: PropertyKey) { + super( + `Missing @signal decorator on setter or getter for property "${String( + prop, + )}". The @signal decorator will only work on a getter/setter pair with *both* getter and setter decorated with @signal.`, + ) + } +} + +class InvalidDecorationError extends Error { + constructor() { + super('The @signal decorator is only for use on fields, getters, setters, and auto accessors.') + } +} diff --git a/src/index.test.ts b/src/index.test.ts index 121839e..082463f 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -20,7 +20,7 @@ declare global { describe('classy-solid', () => { describe('createSignalObject()', () => { - it('has gettable and settable values via .get and .set methods', async () => { + it('has gettable and settable values via .get and .set methods', () => { const num = createSignalObject(0) // Set the variable's value by passing a value in. @@ -40,7 +40,7 @@ describe('classy-solid', () => { }) describe('createSignalFunction()', () => { - it('has gettable and settable values via a single overloaded function', async () => { + it('has gettable and settable values via a single overloaded function', () => { const num = createSignalFunction(0) // Set the variable's value by passing a value in. @@ -57,6 +57,18 @@ describe('classy-solid', () => { num(n => n + 1) expect(num()).toBe(3) }) + + it('works with function values', () => { + const f1 = () => 123 + const func = createSignalFunction(f1) + + expect(func()).toBe(f1) + + const f2 = () => 456 + func(() => f2) + + expect(func()).toBe(f2) + }) }) describe('createDeferredEffect()', () => { @@ -137,23 +149,138 @@ describe('classy-solid', () => { class Butterfly { @signal colors = 3 - _wingSize = 2 + #wingSize = 2 - @signal - get wingSize() { - return this._wingSize + @signal get wingSize() { + return this.#wingSize } - set wingSize(s: number) { - this._wingSize = s + @signal set wingSize(s: number) { + this.#wingSize = s } } - it('makes class fields reactive, using class and field/accessor decorators', () => { + it('makes class fields reactive, using class and field/getter/setter decorators', () => { const b = new Butterfly() testButterflyProps(b) }) + // @reactive + class Butterfly2 { + @signal colors = 3 + @signal wingSize = 2 + // @ts-ignore + @signal #finalize + } + + it('makes class fields reactive, using field decorators without class decorator', () => { + const b = new Butterfly2() + + testButterflyProps(b) + }) + + class Butterfly3 { + @signal colors = 3 + + #wingSize = 2 + + @signal get wingSize() { + return this.#wingSize + } + @signal set wingSize(s: number) { + this.#wingSize = s + } + + // @ts-ignore + @signal #finalize + } + + it('makes class fields reactive, using field/getter/setter decorators without class decorator', () => { + const b = new Butterfly3() + + testButterflyProps(b) + }) + + class Butterfly4 { + @signal colors = 3 + @signal accessor wingSize = 2 + // @ts-ignore + @signal #finalize + } + + it('makes class fields reactive, using field/accessor decorators without class decorator', () => { + const b = new Butterfly4() + + testButterflyProps(b) + }) + + @reactive + class Butterfly5 { + @signal colors = 3 + @signal accessor wingSize = 2 + } + + it('makes class fields reactive, using field/accessor decorators with class decorator', () => { + const b = new Butterfly5() + + testButterflyProps(b) + }) + + class Butterfly6 { + @signal accessor #colors = 3 + + getColors() { + return this.#colors + } + setColors(v: number) { + return (this.#colors = v) + } + } + + it('makes private class auto accessor reactive', () => { + const b = new Butterfly6() + testPrivate(b) + }) + + class Butterfly7 { + #_colors = 3 + + @signal get #colors() { + return this.#_colors + } + @signal set #colors(v: number) { + this.#_colors = v + } + + getColors() { + return this.#colors + } + setColors(v: number) { + return (this.#colors = v) + } + } + + it('makes private class getter/setter accessors reactive', () => { + const b = new Butterfly7() + testPrivate(b) + }) + + function testPrivate(b: Pick) { + let count = 0 + + createEffect(() => { + b.getColors() + count++ + }) + + expect(b.getColors()).toBe(3) + expect(count).toBe(1) + + b.setColors(5) + expect(b.getColors()).toBe(5) + expect(count).toBe(2) + } + const ensure = it ensure('overridden fields work as expected', async () => { @@ -215,14 +342,13 @@ describe('classy-solid', () => { class Butterfly extends Insect { @signal colors = 3 - _wingSize = 2 + #wingSize = 2 - @signal - get wingSize() { - return this._wingSize + @signal get wingSize() { + return this.#wingSize } - set wingSize(s: number) { - this._wingSize = s + @signal set wingSize(s: number) { + this.#wingSize = s } constructor(arg: number) { @@ -409,13 +535,13 @@ describe('classy-solid', () => { class Butterfly { colors = 3 - _wingSize = 2 + #wingSize = 2 get wingSize() { - return this._wingSize + return this.#wingSize } set wingSize(s: number) { - this._wingSize = s + this.#wingSize = s } constructor() { @@ -437,18 +563,18 @@ describe('classy-solid', () => { class Butterfly { declare colors: number - declare _wingSize: number + #wingSize: number get wingSize() { - return this._wingSize + return this.#wingSize } set wingSize(s: number) { - this._wingSize = s + this.#wingSize = s } constructor() { this.colors = 3 - this._wingSize = 2 + this.#wingSize = 2 signalify(this, 'colors', 'wingSize') } @@ -823,7 +949,7 @@ describe('classy-solid', () => { }) }) -function testButterflyProps(b: {colors: number; wingSize: number; _wingSize: number}, initialColors = 3) { +function testButterflyProps(b: {colors: number; wingSize: number}, initialColors = 3) { let count = 0 createRoot(() => { @@ -836,7 +962,6 @@ function testButterflyProps(b: {colors: number; wingSize: number; _wingSize: num expect(b.colors).toBe(initialColors, 'initial colors value') expect(b.wingSize).toBe(2, 'initial wingSize value') - expect(b._wingSize).toBe(2, 'ensure the original accessor works') expect(count).toBe(1, 'Should be reactive') b.colors++ @@ -847,7 +972,6 @@ function testButterflyProps(b: {colors: number; wingSize: number; _wingSize: num b.wingSize++ expect(b.wingSize).toBe(3, 'incremented wingSize value') - expect(b._wingSize).toBe(3, 'ensure the original accessor works') expect(count).toBe(3, 'Should be reactive') } diff --git a/src/signalify.ts b/src/signalify.ts index fe76078..3891148 100644 --- a/src/signalify.ts +++ b/src/signalify.ts @@ -1,6 +1,7 @@ import {getInheritedDescriptor} from 'lowclass/dist/getInheritedDescriptor.js' -import {createSignal, $PROXY, untrack, type Signal} from 'solid-js' +import {$PROXY, untrack} from 'solid-js' import type {PropKey} from './decorators/types.js' +import {createSignalFunction, type SignalFunction} from './createSignalFunction.js' type AnyObject = Record @@ -73,23 +74,12 @@ export function signalify(obj: AnyObject, ...props: [key: PropertyKey, initialVa const _prop = (isTuple ? prop[0] : prop) as PropKey const initialValue = isTuple ? prop[1] : untrack(() => obj[_prop]) - createSignalAccessor(obj, _prop, initialValue) + __createSignalAccessor(obj, _prop, initialValue) } return obj } -let gotCreateSignalAccessor = false - -/** - * This ensures that `createSignalAccessor` is kept internal to classy-solid only. - */ -export function getCreateSignalAccessor() { - if (gotCreateSignalAccessor) throw new Error('Export "createSignalAccessor" is internal to classy-solid only.') - gotCreateSignalAccessor = true - return createSignalAccessor -} - // propsSetAtLeastOnce is a Set that tracks which reactive properties have been // set at least once. const propsSetAtLeastOnce = new WeakMap>() @@ -101,92 +91,81 @@ export function __isPropSetAtLeastOnce(instance: object, prop: string | symbol) return !!propsSetAtLeastOnce.get(instance)?.has(prop) } -function trackPropSetAtLeastOnce(instance: object, prop: string | symbol) { +export function __trackPropSetAtLeastOnce(instance: object, prop: string | symbol) { if (!propsSetAtLeastOnce.has(instance)) propsSetAtLeastOnce.set(instance, new Set()) propsSetAtLeastOnce.get(instance)!.add(prop) } const isSignalGetter = new WeakSet() -function createSignalAccessor(obj: T, prop: Exclude, initialVal: unknown): void { +export function __createSignalAccessor( + obj: T, + prop: Exclude, + initialVal: unknown, +): void { let descriptor: PropertyDescriptor | undefined = getInheritedDescriptor(obj, prop) let originalGet: (() => any) | undefined let originalSet: ((v: any) => void) | undefined + const isAccessor = !!(descriptor?.get || descriptor?.set) if (descriptor) { originalGet = descriptor.get originalSet = descriptor.set if (originalGet && isSignalGetter.has(originalGet)) return + // reactivity requires both + if (isAccessor && !(originalGet && originalSet)) return warnNotReadWrite(prop) - if (originalGet || originalSet) { - // reactivity requires both - if (!originalGet || !originalSet) return warnNotReadWrite(prop) + if (!isAccessor) { + // no need to make a signal that can't be written to + if (!descriptor.writable) return warnNotWritable(prop) - delete descriptor.get - delete descriptor.set - } else { // If there was a value descriptor, trust it as the source of truth // for initialVal. For example, if the user class modifies the value // after the initializer, it will have a different value than what // we tracked from the initializer. initialVal = descriptor.value - - // if it isn't writable, we don't need to make a reactive variable because - // the value won't change - if (!descriptor.writable) return warnNotWritable(prop) - - delete descriptor.value - delete descriptor.writable } } - const signalStorage = new WeakMap>() + const signalStorage = new WeakMap>() - descriptor = { + const newDescriptor = { configurable: true, - enumerable: true, - ...descriptor, - get: originalGet + enumerable: descriptor?.enumerable, + get: isAccessor ? function (this: object): unknown { - const s = getSignal(this, signalStorage, initialVal) - s[0]() // read + __getSignal(this, signalStorage, initialVal)() return originalGet!.call(this) } : function (this: object): unknown { - const s = getSignal(this, signalStorage, initialVal) - return s[0]() // read + return __getSignal(this, signalStorage, initialVal)() }, - set: originalSet + set: isAccessor ? function (this: object, newValue: unknown) { originalSet!.call(this, newValue) + __trackPropSetAtLeastOnce(this, prop) - trackPropSetAtLeastOnce(this, prop) - - // write - const s = getSignal(this, signalStorage, initialVal) - if (typeof newValue === 'function') s[1](() => newValue) - else s[1](newValue) + const s = __getSignal(this, signalStorage, initialVal) + s(typeof newValue === 'function' ? () => newValue : newValue) } : function (this: object, newValue: unknown) { - trackPropSetAtLeastOnce(this, prop) + __trackPropSetAtLeastOnce(this, prop) - // write - const s = getSignal(this, signalStorage, initialVal) - if (typeof newValue === 'function') s[1](() => newValue) - else s[1](newValue) + const s = __getSignal(this, signalStorage, initialVal) + s(typeof newValue === 'function' ? () => newValue : newValue) }, } - isSignalGetter.add(descriptor.get!) + isSignalGetter.add(newDescriptor.get!) - Object.defineProperty(obj, prop, descriptor) + Object.defineProperty(obj, prop, newDescriptor) } -function getSignal(obj: object, storage: WeakMap>, initialVal: unknown) { +export function __getSignal(obj: object, storage: WeakMap>, initialVal: unknown) { let s = storage.get(obj) - if (!s) storage.set(obj, (s = createSignal(initialVal, {equals: false}))) + if (!s) storage.set(obj, (s = createSignalFunction(initialVal, {equals: false}))) return s }