1 line
17 KiB
Plaintext
1 line
17 KiB
Plaintext
{"version":3,"file":"signals.mjs","sources":["../src/index.ts"],"sourcesContent":["import { options, Component } from \"preact\";\nimport { useRef, useMemo, useEffect } from \"preact/hooks\";\nimport {\n\tsignal,\n\tcomputed,\n\tbatch,\n\teffect,\n\tSignal,\n\ttype ReadonlySignal,\n} from \"@preact/signals-core\";\nimport {\n\tVNode,\n\tOptionsTypes,\n\tHookFn,\n\tEffect,\n\tPropertyUpdater,\n\tAugmentedComponent,\n\tAugmentedElement as Element,\n} from \"./internal\";\n\nexport { signal, computed, batch, effect, Signal, type ReadonlySignal };\n\nconst HAS_PENDING_UPDATE = 1 << 0;\nconst HAS_HOOK_STATE = 1 << 1;\nconst HAS_COMPUTEDS = 1 << 2;\n\n// Install a Preact options hook\nfunction hook<T extends OptionsTypes>(hookName: T, hookFn: HookFn<T>) {\n\t// @ts-ignore-next-line private options hooks usage\n\toptions[hookName] = hookFn.bind(null, options[hookName] || (() => {}));\n}\n\nlet currentComponent: AugmentedComponent | undefined;\nlet finishUpdate: (() => void) | undefined;\n\nfunction setCurrentUpdater(updater?: Effect) {\n\t// end tracking for the current update:\n\tif (finishUpdate) finishUpdate();\n\t// start tracking the new update:\n\tfinishUpdate = updater && updater._start();\n}\n\nfunction createUpdater(update: () => void) {\n\tlet updater!: Effect;\n\teffect(function (this: Effect) {\n\t\tupdater = this;\n\t});\n\tupdater._callback = update;\n\treturn updater;\n}\n\n/** @todo This may be needed for complex prop value detection. */\n// function isSignalValue(value: any): value is Signal {\n// \tif (typeof value !== \"object\" || value == null) return false;\n// \tif (value instanceof Signal) return true;\n// \t// @TODO: uncomment this when we land Reactive (ideally behind a brand check)\n// \t// for (let i in value) if (value[i] instanceof Signal) return true;\n// \treturn false;\n// }\n\n/**\n * A wrapper component that renders a Signal directly as a Text node.\n * @todo: in Preact 11, just decorate Signal with `type:null`\n */\nfunction Text(this: AugmentedComponent, { data }: { data: Signal }) {\n\t// hasComputeds.add(this);\n\n\t// Store the props.data signal in another signal so that\n\t// passing a new signal reference re-runs the text computed:\n\tconst currentSignal = useSignal(data);\n\tcurrentSignal.value = data;\n\n\tconst s = useMemo(() => {\n\t\t// mark the parent component as having computeds so it gets optimized\n\t\tlet v = this.__v;\n\t\twhile ((v = v.__!)) {\n\t\t\tif (v.__c) {\n\t\t\t\tv.__c._updateFlags |= HAS_COMPUTEDS;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Replace this component's vdom updater with a direct text one:\n\t\tthis._updater!._callback = () => {\n\t\t\t(this.base as Text).data = s.peek();\n\t\t};\n\n\t\treturn computed(() => {\n\t\t\tlet data = currentSignal.value;\n\t\t\tlet s = data.value;\n\t\t\treturn s === 0 ? 0 : s === true ? \"\" : s || \"\";\n\t\t});\n\t}, []);\n\n\treturn s.value;\n}\nText.displayName = \"_st\";\n\nObject.defineProperties(Signal.prototype, {\n\tconstructor: { configurable: true },\n\ttype: { configurable: true, value: Text },\n\tprops: {\n\t\tconfigurable: true,\n\t\tget() {\n\t\t\treturn { data: this };\n\t\t},\n\t},\n\t// Setting a VNode's _depth to 1 forces Preact to clone it before modifying:\n\t// https://github.com/preactjs/preact/blob/d7a433ee8463a7dc23a05111bb47de9ec729ad4d/src/diff/children.js#L77\n\t// @todo remove this for Preact 11\n\t__b: { configurable: true, value: 1 },\n});\n\n/** Inject low-level property/attribute bindings for Signals into Preact's diff */\nhook(OptionsTypes.DIFF, (old, vnode) => {\n\tif (typeof vnode.type === \"string\") {\n\t\tlet signalProps: Record<string, any> | undefined;\n\n\t\tlet props = vnode.props;\n\t\tfor (let i in props) {\n\t\t\tif (i === \"children\") continue;\n\n\t\t\tlet value = props[i];\n\t\t\tif (value instanceof Signal) {\n\t\t\t\tif (!signalProps) vnode.__np = signalProps = {};\n\t\t\t\tsignalProps[i] = value;\n\t\t\t\tprops[i] = value.peek();\n\t\t\t}\n\t\t}\n\t}\n\n\told(vnode);\n});\n\n/** Set up Updater before rendering a component */\nhook(OptionsTypes.RENDER, (old, vnode) => {\n\tsetCurrentUpdater();\n\n\tlet updater;\n\n\tlet component = vnode.__c;\n\tif (component) {\n\t\tcomponent._updateFlags &= ~HAS_PENDING_UPDATE;\n\n\t\tupdater = component._updater;\n\t\tif (updater === undefined) {\n\t\t\tcomponent._updater = updater = createUpdater(() => {\n\t\t\t\tcomponent._updateFlags |= HAS_PENDING_UPDATE;\n\t\t\t\tcomponent.setState({});\n\t\t\t});\n\t\t}\n\t}\n\n\tcurrentComponent = component;\n\tsetCurrentUpdater(updater);\n\told(vnode);\n});\n\n/** Finish current updater if a component errors */\nhook(OptionsTypes.CATCH_ERROR, (old, error, vnode, oldVNode) => {\n\tsetCurrentUpdater();\n\tcurrentComponent = undefined;\n\told(error, vnode, oldVNode);\n});\n\n/** Finish current updater after rendering any VNode */\nhook(OptionsTypes.DIFFED, (old, vnode) => {\n\tsetCurrentUpdater();\n\tcurrentComponent = undefined;\n\n\tlet dom: Element;\n\n\t// vnode._dom is undefined during string rendering,\n\t// so we use this to skip prop subscriptions during SSR.\n\tif (typeof vnode.type === \"string\" && (dom = vnode.__e as Element)) {\n\t\tlet props = vnode.__np;\n\t\tlet renderedProps = vnode.props;\n\t\tif (props) {\n\t\t\tlet updaters = dom._updaters;\n\t\t\tif (updaters) {\n\t\t\t\tfor (let prop in updaters) {\n\t\t\t\t\tlet updater = updaters[prop];\n\t\t\t\t\tif (updater !== undefined && !(prop in props)) {\n\t\t\t\t\t\tupdater._dispose();\n\t\t\t\t\t\t// @todo we could just always invoke _dispose() here\n\t\t\t\t\t\tupdaters[prop] = undefined;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tupdaters = {};\n\t\t\t\tdom._updaters = updaters;\n\t\t\t}\n\t\t\tfor (let prop in props) {\n\t\t\t\tlet updater = updaters[prop];\n\t\t\t\tlet signal = props[prop];\n\t\t\t\tif (updater === undefined) {\n\t\t\t\t\tupdater = createPropUpdater(dom, prop, signal, renderedProps);\n\t\t\t\t\tupdaters[prop] = updater;\n\t\t\t\t} else {\n\t\t\t\t\tupdater._update(signal, renderedProps);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\told(vnode);\n});\n\nfunction createPropUpdater(\n\tdom: Element,\n\tprop: string,\n\tpropSignal: Signal,\n\tprops: Record<string, any>\n): PropertyUpdater {\n\tconst setAsProperty =\n\t\tprop in dom &&\n\t\t// SVG elements need to go through `setAttribute` because they\n\t\t// expect things like SVGAnimatedTransformList instead of strings.\n\t\t// @ts-ignore\n\t\tdom.ownerSVGElement === undefined;\n\n\tconst changeSignal = signal(propSignal);\n\treturn {\n\t\t_update: (newSignal: Signal, newProps: typeof props) => {\n\t\t\tchangeSignal.value = newSignal;\n\t\t\tprops = newProps;\n\t\t},\n\t\t_dispose: effect(() => {\n\t\t\tconst value = changeSignal.value.value;\n\t\t\t// If Preact just rendered this value, don't render it again:\n\t\t\tif (props[prop] === value) return;\n\t\t\tprops[prop] = value;\n\t\t\tif (setAsProperty) {\n\t\t\t\t// @ts-ignore-next-line silly\n\t\t\t\tdom[prop] = value;\n\t\t\t} else if (value) {\n\t\t\t\tdom.setAttribute(prop, value);\n\t\t\t} else {\n\t\t\t\tdom.removeAttribute(prop);\n\t\t\t}\n\t\t}),\n\t};\n}\n\n/** Unsubscribe from Signals when unmounting components/vnodes */\nhook(OptionsTypes.UNMOUNT, (old, vnode: VNode) => {\n\tif (typeof vnode.type === \"string\") {\n\t\tlet dom = vnode.__e as Element | undefined;\n\t\t// vnode._dom is undefined during string rendering\n\t\tif (dom) {\n\t\t\tconst updaters = dom._updaters;\n\t\t\tif (updaters) {\n\t\t\t\tdom._updaters = undefined;\n\t\t\t\tfor (let prop in updaters) {\n\t\t\t\t\tlet updater = updaters[prop];\n\t\t\t\t\tif (updater) updater._dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tlet component = vnode.__c;\n\t\tif (component) {\n\t\t\tconst updater = component._updater;\n\t\t\tif (updater) {\n\t\t\t\tcomponent._updater = undefined;\n\t\t\t\tupdater._dispose();\n\t\t\t}\n\t\t}\n\t}\n\told(vnode);\n});\n\n/** Mark components that use hook state so we can skip sCU optimization. */\nhook(OptionsTypes.HOOK, (old, component, index, type) => {\n\tif (type < 3)\n\t\t(component as AugmentedComponent)._updateFlags |= HAS_HOOK_STATE;\n\told(component, index, type);\n});\n\n/**\n * Auto-memoize components that use Signals/Computeds.\n * Note: Does _not_ optimize components that use hook/class state.\n */\nComponent.prototype.shouldComponentUpdate = function (\n\tthis: AugmentedComponent,\n\tprops,\n\tstate\n) {\n\t// @todo: Once preactjs/preact#3671 lands, this could just use `currentUpdater`:\n\tconst updater = this._updater;\n\tconst hasSignals = updater && updater._sources !== undefined;\n\n\t// let reason;\n\t// if (!hasSignals && !hasComputeds.has(this)) {\n\t// \treason = \"no signals or computeds\";\n\t// } else if (hasPendingUpdate.has(this)) {\n\t// \treason = \"has pending update\";\n\t// } else if (hasHookState.has(this)) {\n\t// \treason = \"has hook state\";\n\t// }\n\t// if (reason) {\n\t// \tif (!this) reason += \" (`this` bug)\";\n\t// \tconsole.log(\"not optimizing\", this?.constructor?.name, \": \", reason, {\n\t// \t\tdetails: {\n\t// \t\t\thasSignals,\n\t// \t\t\thasComputeds: hasComputeds.has(this),\n\t// \t\t\thasPendingUpdate: hasPendingUpdate.has(this),\n\t// \t\t\thasHookState: hasHookState.has(this),\n\t// \t\t\tdeps: Array.from(updater._deps),\n\t// \t\t\tupdater,\n\t// \t\t},\n\t// \t});\n\t// }\n\n\t// if this component used no signals or computeds, update:\n\tif (!hasSignals && !(this._updateFlags & HAS_COMPUTEDS)) return true;\n\n\t// if there is a pending re-render triggered from Signals,\n\t// or if there is hook or class state, update:\n\tif (this._updateFlags & (HAS_PENDING_UPDATE | HAS_HOOK_STATE)) return true;\n\n\t// @ts-ignore\n\tfor (let i in state) return true;\n\n\t// if any non-Signal props changed, update:\n\tfor (let i in props) {\n\t\tif (i !== \"__source\" && props[i] !== this.props[i]) return true;\n\t}\n\tfor (let i in this.props) if (!(i in props)) return true;\n\n\t// this is a purely Signal-driven component, don't update:\n\treturn false;\n};\n\nexport function useSignal<T>(value: T) {\n\treturn useMemo(() => signal<T>(value), []);\n}\n\nexport function useComputed<T>(compute: () => T) {\n\tconst $compute = useRef(compute);\n\t$compute.current = compute;\n\t(currentComponent as AugmentedComponent)._updateFlags |= HAS_COMPUTEDS;\n\treturn useMemo(() => computed<T>(() => $compute.current()), []);\n}\n\nexport function useSignalEffect(cb: () => void | (() => void)) {\n\tconst callback = useRef(cb);\n\tcallback.current = cb;\n\n\tuseEffect(() => {\n\t\treturn effect(() => {\n\t\t\tcallback.current();\n\t\t});\n\t}, []);\n}\n\n/**\n * @todo Determine which Reactive implementation we'll be using.\n * @internal\n */\n// export function useReactive<T extends object>(value: T): Reactive<T> {\n// \treturn useMemo(() => reactive<T>(value), []);\n// }\n\n/**\n * @internal\n * Update a Reactive's using the properties of an object or other Reactive.\n * Also works for Signals.\n * @example\n * // Update a Reactive with Object.assign()-like syntax:\n * const r = reactive({ name: \"Alice\" });\n * update(r, { name: \"Bob\" });\n * update(r, { age: 42 }); // property 'age' does not exist in type '{ name?: string }'\n * update(r, 2); // '2' has no properties in common with '{ name?: string }'\n * console.log(r.name.value); // \"Bob\"\n *\n * @example\n * // Update a Reactive with the properties of another Reactive:\n * const A = reactive({ name: \"Alice\" });\n * const B = reactive({ name: \"Bob\", age: 42 });\n * update(A, B);\n * console.log(`${A.name} is ${A.age}`); // \"Bob is 42\"\n *\n * @example\n * // Update a signal with assign()-like syntax:\n * const s = signal(42);\n * update(s, \"hi\"); // Argument type 'string' not assignable to type 'number'\n * update(s, {}); // Argument type '{}' not assignable to type 'number'\n * update(s, 43);\n * console.log(s.value); // 43\n *\n * @param obj The Reactive or Signal to be updated\n * @param update The value, Signal, object or Reactive to update `obj` to match\n * @param overwrite If `true`, any properties `obj` missing from `update` are set to `undefined`\n */\n/*\nexport function update<T extends SignalOrReactive>(\n\tobj: T,\n\tupdate: Partial<Unwrap<T>>,\n\toverwrite = false\n) {\n\tif (obj instanceof Signal) {\n\t\tobj.value = peekValue(update);\n\t} else {\n\t\tfor (let i in update) {\n\t\t\tif (i in obj) {\n\t\t\t\tobj[i].value = peekValue(update[i]);\n\t\t\t} else {\n\t\t\t\tlet sig = signal(peekValue(update[i]));\n\t\t\t\tsig[KEY] = i;\n\t\t\t\tobj[i] = sig;\n\t\t\t}\n\t\t}\n\t\tif (overwrite) {\n\t\t\tfor (let i in obj) {\n\t\t\t\tif (!(i in update)) {\n\t\t\t\t\tobj[i].value = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n*/\n"],"names":["HAS_COMPUTEDS","hook","hookName","hookFn","options","bind","finishUpdate","setCurrentUpdater","updater","_start","Text","data","currentSignal","useSignal","value","s","useMemo","v","this","__v","__","__c","_updateFlags","_updater","_callback","base","peek","displayName","Object","defineProperties","Signal","prototype","constructor","configurable","type","props","get","__b","old","vnode","signalProps","i","__np","component","undefined","update","effect","setState","createUpdater","currentComponent","error","oldVNode","dom","__e","updaters","_updaters","prop","_dispose","signal","createPropUpdater","renderedProps","_update","propSignal","setAsProperty","ownerSVGElement","changeSignal","newSignal","newProps","setAttribute","removeAttribute","index","Component","shouldComponentUpdate","state","_sources","HAS_PENDING_UPDATE","useComputed","compute","$compute","useRef","current","computed","useSignalEffect","cb","callback","useEffect"],"mappings":"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"} |