@graphrefly/ts 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -7
- package/dist/{actions-types-DfRob139.d.cts → actions-types-BYzAurt6.d.cts} +1 -1
- package/dist/{actions-types-DcDaBRTC.d.ts → actions-types-CFJILlFn.d.ts} +1 -1
- package/dist/adapters/index.cjs.map +1 -1
- package/dist/adapters/index.d.cts +5 -5
- package/dist/adapters/index.d.ts +5 -5
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/nestjs/microservices.d.cts +1 -1
- package/dist/adapters/nestjs/microservices.d.ts +1 -1
- package/dist/adapters/nestjs/native.d.cts +2 -2
- package/dist/adapters/nestjs/native.d.ts +2 -2
- package/dist/adapters/nestjs/native.js +2 -2
- package/dist/adapters/nestjs/websockets.d.cts +1 -1
- package/dist/adapters/nestjs/websockets.d.ts +1 -1
- package/dist/adapters/nestjs.d.cts +1 -1
- package/dist/adapters/nestjs.d.ts +1 -1
- package/dist/adapters/observe-storage.d.cts +1 -1
- package/dist/adapters/observe-storage.d.ts +1 -1
- package/dist/adapters/react.cjs.map +1 -1
- package/dist/adapters/react.d.cts +1 -1
- package/dist/adapters/react.d.ts +1 -1
- package/dist/adapters/react.js +1 -1
- package/dist/adapters/solid.cjs.map +1 -1
- package/dist/adapters/solid.d.cts +1 -1
- package/dist/adapters/solid.d.ts +1 -1
- package/dist/adapters/solid.js +1 -1
- package/dist/adapters/svelte.cjs.map +1 -1
- package/dist/adapters/svelte.d.cts +1 -1
- package/dist/adapters/svelte.d.ts +1 -1
- package/dist/adapters/svelte.js +1 -1
- package/dist/adapters/vue.cjs.map +1 -1
- package/dist/adapters/vue.d.cts +1 -1
- package/dist/adapters/vue.d.ts +1 -1
- package/dist/adapters/vue.js +1 -1
- package/dist/{agent-runtime-types-tool-CTZx51kE.d.cts → agent-runtime-types-tool-DSzCWLK4.d.cts} +1 -1
- package/dist/{agent-runtime-types-tool-B0jR0euI.d.ts → agent-runtime-types-tool-DUZUxrl5.d.ts} +1 -1
- package/dist/{capability-admission-CGmtVzfS.d.ts → capability-admission--qmB5qYW.d.ts} +1 -1
- package/dist/{capability-admission-BwmsThnQ.d.cts → capability-admission-BbiUMnpF.d.cts} +1 -1
- package/dist/{chunk-BIGKAHSX.js → chunk-2U4G3PEU.js} +8 -8
- package/dist/{chunk-FLUPPSIP.js → chunk-3KYPNNBH.js} +1 -1
- package/dist/chunk-3KYPNNBH.js.map +1 -0
- package/dist/{chunk-AVPXWVRL.js → chunk-BOWKPNXS.js} +2 -2
- package/dist/{chunk-LRYGIKWY.js → chunk-G3J4KZLK.js} +5 -5
- package/dist/{chunk-32WGWBYO.js → chunk-HFPPLLLQ.js} +2 -2
- package/dist/{chunk-VYAEEKZ3.js → chunk-IISXKNWE.js} +1 -1
- package/dist/chunk-IISXKNWE.js.map +1 -0
- package/dist/{chunk-DXBOAAPS.js → chunk-KTJ5LEOL.js} +1 -1
- package/dist/chunk-KTJ5LEOL.js.map +1 -0
- package/dist/{chunk-HT5R7S47.js → chunk-LPC42V2E.js} +3 -3
- package/dist/{chunk-STLRNFU7.js → chunk-T3YMFLRH.js} +3 -3
- package/dist/chunk-T3YMFLRH.js.map +1 -0
- package/dist/{chunk-V3MSIDUQ.js → chunk-TWOPVCGK.js} +2 -2
- package/dist/{chunk-ND43YDGK.js → chunk-V3YEGWSH.js} +1 -1
- package/dist/chunk-V3YEGWSH.js.map +1 -0
- package/dist/{chunk-2BIF6BQ7.js → chunk-W4ATMMTH.js} +2 -2
- package/dist/{committed-fact-log-backend-Cjhgia-O.d.ts → committed-fact-log-backend-B_h6A6cN.d.ts} +1 -1
- package/dist/{committed-fact-log-backend-BE3Fx5Zv.d.cts → committed-fact-log-backend-CIhiKL-Q.d.cts} +1 -1
- package/dist/composition/index.cjs.map +1 -1
- package/dist/composition/index.d.cts +1 -1
- package/dist/composition/index.d.ts +1 -1
- package/dist/composition/index.js +2 -2
- package/dist/cqrs/index.d.cts +1 -1
- package/dist/cqrs/index.d.ts +1 -1
- package/dist/cqrs/messaging.d.cts +1 -1
- package/dist/cqrs/messaging.d.ts +1 -1
- package/dist/cqrs/work-queue.d.cts +1 -1
- package/dist/cqrs/work-queue.d.ts +1 -1
- package/dist/data-structures/index.cjs.map +1 -1
- package/dist/data-structures/index.d.cts +5 -5
- package/dist/data-structures/index.d.ts +5 -5
- package/dist/data-structures/index.js +3 -3
- package/dist/executors/tool-provider-adapters.d.cts +3 -3
- package/dist/executors/tool-provider-adapters.d.ts +3 -3
- package/dist/executors/tool-provider-adapters.js +4 -4
- package/dist/executors/tool-provider-runtime.d.cts +4 -4
- package/dist/executors/tool-provider-runtime.d.ts +4 -4
- package/dist/executors/tool-provider.d.cts +3 -3
- package/dist/executors/tool-provider.d.ts +3 -3
- package/dist/executors/tool-provider.js +3 -3
- package/dist/executors/work-queue.d.cts +1 -1
- package/dist/executors/work-queue.d.ts +1 -1
- package/dist/graph/index.cjs.map +1 -1
- package/dist/graph/index.d.cts +4 -4
- package/dist/graph/index.d.ts +4 -4
- package/dist/graph/index.js +7 -7
- package/dist/{graph-D7DgoW4r.d.ts → graph-BYcUX6Y-.d.ts} +1 -1
- package/dist/{graph-BpVjXE3p.d.cts → graph-DpUhfPg-.d.cts} +1 -1
- package/dist/{index-NxEHWqYL.d.ts → index-CBXYou1z.d.ts} +1 -1
- package/dist/{index-Df4kax8O.d.cts → index-sxZ52y0d.d.cts} +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +15 -15
- package/dist/inspection/boundary.d.cts +2 -2
- package/dist/inspection/boundary.d.ts +2 -2
- package/dist/{measurements-CIGHDnsE.d.ts → measurements-ByXwo0t6.d.ts} +2 -2
- package/dist/{measurements-BwkzVaf4.d.cts → measurements-CQONT7Qg.d.cts} +2 -2
- package/dist/memory/index.d.cts +1 -1
- package/dist/memory/index.d.ts +1 -1
- package/dist/memory/semantic/index.d.cts +1 -1
- package/dist/memory/semantic/index.d.ts +1 -1
- package/dist/messaging/index.d.cts +1 -1
- package/dist/messaging/index.d.ts +1 -1
- package/dist/operators/index.cjs.map +1 -1
- package/dist/operators/index.d.cts +5 -5
- package/dist/operators/index.d.ts +5 -5
- package/dist/operators/index.js +3 -3
- package/dist/orchestration/index.cjs.map +1 -1
- package/dist/orchestration/index.d.cts +5 -5
- package/dist/orchestration/index.d.ts +5 -5
- package/dist/orchestration/index.js +4 -4
- package/dist/orchestration/messaging.d.cts +1 -1
- package/dist/orchestration/messaging.d.ts +1 -1
- package/dist/orchestration/work-queue.d.cts +2 -2
- package/dist/orchestration/work-queue.d.ts +2 -2
- package/dist/patterns/event-flow.d.cts +1 -1
- package/dist/patterns/event-flow.d.ts +1 -1
- package/dist/patterns/index.cjs.map +1 -1
- package/dist/patterns/index.d.cts +2 -2
- package/dist/patterns/index.d.ts +2 -2
- package/dist/patterns/index.js +1 -1
- package/dist/{reactive-collection-yjdqrWkb.d.cts → reactive-collection-Bt5117qe.d.cts} +1 -1
- package/dist/{reactive-collection-BTdjAVpJ.d.ts → reactive-collection-CZGtOhEp.d.ts} +1 -1
- package/dist/{reactive-collection-storage-C1YIW_q2.d.cts → reactive-collection-storage-BzhzmEpP.d.cts} +3 -3
- package/dist/{reactive-collection-storage-BZozONHw.d.ts → reactive-collection-storage-NKUpbyyK.d.ts} +3 -3
- package/dist/{reactive-map-c-l8bYrl.d.cts → reactive-map-Cf9_oTOT.d.cts} +1 -1
- package/dist/{reactive-map-B6sA6p5U.d.ts → reactive-map-DQeA7ThE.d.ts} +1 -1
- package/dist/{scheduled-readiness-Batwa3Fm.d.ts → scheduled-readiness-BQdebv1Q.d.ts} +1 -1
- package/dist/{scheduled-readiness-BtUBoaGJ.d.cts → scheduled-readiness-D5qPFnZF.d.cts} +1 -1
- package/dist/solutions/agentic-memory/browser.d.cts +2 -2
- package/dist/solutions/agentic-memory/browser.d.ts +2 -2
- package/dist/solutions/agentic-memory/index.d.cts +3 -3
- package/dist/solutions/agentic-memory/index.d.ts +3 -3
- package/dist/solutions/agentic-memory/node.d.cts +2 -2
- package/dist/solutions/agentic-memory/node.d.ts +2 -2
- package/dist/solutions/agentic-work-item-memory/index.d.cts +1 -1
- package/dist/solutions/agentic-work-item-memory/index.d.ts +1 -1
- package/dist/solutions/agentic-work-item-memory-application/index.d.cts +1 -1
- package/dist/solutions/agentic-work-item-memory-application/index.d.ts +1 -1
- package/dist/solutions/index.d.cts +6 -6
- package/dist/solutions/index.d.ts +6 -6
- package/dist/solutions/reactive-layout/browser/index.d.cts +2 -2
- package/dist/solutions/reactive-layout/browser/index.d.ts +2 -2
- package/dist/solutions/reactive-layout/index.d.cts +4 -4
- package/dist/solutions/reactive-layout/index.d.ts +4 -4
- package/dist/solutions/reactive-layout/node-canvas/index.d.cts +2 -2
- package/dist/solutions/reactive-layout/node-canvas/index.d.ts +2 -2
- package/dist/solutions/reactive-layout/react-native/index.d.cts +2 -2
- package/dist/solutions/reactive-layout/react-native/index.d.ts +2 -2
- package/dist/solutions/reactive-layout/skia/index.d.cts +2 -2
- package/dist/solutions/reactive-layout/skia/index.d.ts +2 -2
- package/dist/solutions/work-item/actions.d.cts +5 -5
- package/dist/solutions/work-item/actions.d.ts +5 -5
- package/dist/solutions/work-item/index.d.cts +4 -4
- package/dist/solutions/work-item/index.d.ts +4 -4
- package/dist/solutions/work-item/scheduling.d.cts +4 -4
- package/dist/solutions/work-item/scheduling.d.ts +4 -4
- package/dist/solutions/work-item/work-queue.d.cts +1 -1
- package/dist/solutions/work-item/work-queue.d.ts +1 -1
- package/dist/sources/browser.cjs.map +1 -1
- package/dist/sources/browser.d.cts +2 -2
- package/dist/sources/browser.d.ts +2 -2
- package/dist/sources/browser.js +2 -2
- package/dist/sources/index.cjs.map +1 -1
- package/dist/sources/index.d.cts +2 -2
- package/dist/sources/index.d.ts +2 -2
- package/dist/sources/index.js +2 -2
- package/dist/sources/node.d.cts +1 -1
- package/dist/sources/node.d.ts +1 -1
- package/dist/storage/index.d.cts +2 -2
- package/dist/storage/index.d.ts +2 -2
- package/dist/{store-BnjczOv3.d.cts → store-Rxycbh-H.d.cts} +5 -5
- package/dist/{store-DEQq1IUZ.d.ts → store-piaqo-AU.d.ts} +5 -5
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/{types-CjoOI5fY.d.cts → types-084NQr4q.d.cts} +1 -1
- package/dist/{types-C_rZAUfY.d.ts → types-CIYYkmqF.d.ts} +1 -1
- package/dist/work-queue/index.d.cts +1 -1
- package/dist/work-queue/index.d.ts +1 -1
- package/package.json +2 -2
- package/dist/chunk-DXBOAAPS.js.map +0 -1
- package/dist/chunk-FLUPPSIP.js.map +0 -1
- package/dist/chunk-ND43YDGK.js.map +0 -1
- package/dist/chunk-STLRNFU7.js.map +0 -1
- package/dist/chunk-VYAEEKZ3.js.map +0 -1
- /package/dist/{chunk-BIGKAHSX.js.map → chunk-2U4G3PEU.js.map} +0 -0
- /package/dist/{chunk-AVPXWVRL.js.map → chunk-BOWKPNXS.js.map} +0 -0
- /package/dist/{chunk-LRYGIKWY.js.map → chunk-G3J4KZLK.js.map} +0 -0
- /package/dist/{chunk-32WGWBYO.js.map → chunk-HFPPLLLQ.js.map} +0 -0
- /package/dist/{chunk-HT5R7S47.js.map → chunk-LPC42V2E.js.map} +0 -0
- /package/dist/{chunk-V3MSIDUQ.js.map → chunk-TWOPVCGK.js.map} +0 -0
- /package/dist/{chunk-2BIF6BQ7.js.map → chunk-W4ATMMTH.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/svelte.ts","../../src/adapters/store.ts"],"sourcesContent":["/**\n * Svelte node bindings for GraphReFly (D238).\n *\n * Svelte is imported only from this focused subpath.\n */\n\nimport { type Readable, readable } from \"svelte/store\";\nimport type { Node } from \"../node/node.js\";\nimport {\n\tnodeSnapshot,\n\trecordReadableStore,\n\tsubscribeNodeValues,\n\ttype WritableNode,\n} from \"./store.js\";\n\n/** A Svelte-readable store plus DATA-only write helpers. */\nexport interface NodeWritable<T> extends Readable<T | undefined> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** Read a GraphReFly node as a Svelte readable store.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `Readable<T | undefined>` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeReadable } from \"@graphrefly/ts/adapters/svelte\";\n * ```\n */\nexport function nodeReadable<T>(node: Node<T>): Readable<T | undefined> {\n\treturn readable<T | undefined>(nodeSnapshot(node), (set) =>\n\t\tsubscribeNodeValues(node, set, { immediate: true }),\n\t);\n}\n\nfunction assertDataValue(value: unknown): void {\n\tif (value === undefined) {\n\t\tthrow new TypeError(\"nodeWritable: undefined is SENTINEL/no DATA, not a writable DATA value\");\n\t}\n}\n\n/** Bind a writable GraphReFly node as a Svelte store.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `NodeWritable<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeWritable } from \"@graphrefly/ts/adapters/svelte\";\n * ```\n */\nexport function nodeWritable<T>(node: WritableNode<T>): NodeWritable<T> {\n\tconst store = nodeReadable(node);\n\treturn {\n\t\tsubscribe: store.subscribe,\n\t\tset(value) {\n\t\t\tassertDataValue(value);\n\t\t\tnode.set(value);\n\t\t},\n\t\tupdate(fn) {\n\t\t\tconst next = fn(nodeSnapshot(node));\n\t\t\tassertDataValue(next);\n\t\t\tnode.set(next);\n\t\t},\n\t};\n}\n\n/**\n * Read a keyed record of nodes as a Svelte readable store.\n *\n * `factory` must have stable identity. Recreating it during component churn\n * rebuilds the record subscriptions.\n * @param keysNode - keys node value used by the helper.\n * @param factory - factory value used by the helper.\n * @returns A `Readable<Record<K, R>>` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeRecord } from \"@graphrefly/ts/adapters/svelte\";\n * ```\n */\nexport function nodeRecord<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: (key: K) => { [P in keyof R]: Node<R[P]> },\n): Readable<Record<K, R>> {\n\tconst store = recordReadableStore(keysNode, factory);\n\tconst read = () => store.get() ?? ({} as Record<K, R>);\n\treturn readable(read(), (set) => store.subscribe((value) => set(value ?? ({} as Record<K, R>))));\n}\n","/**\n * Framework-neutral store adapters.\n *\n * Focused framework bindings build on this tiny Node-facing layer without\n * importing framework packages into the dependency-free adapters barrel\n * (D125/D238).\n */\n\nimport type { DeliveryMeta, Sink } from \"../ctx/types.js\";\nimport type { Node } from \"../node/node.js\";\n\n/** A minimal readable store contract shared by Svelte/Nanostores-style adapters. */\nexport interface ReadableStore<T> {\n\tget(): T | undefined;\n\tsubscribe(run: (value: T | undefined) => void): () => void;\n}\n\n/** A minimal writable store contract over a clean-slate writable node. */\nexport interface WritableStore<T> extends ReadableStore<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** React `useSyncExternalStore`-compatible shape, without importing React. */\nexport interface ExternalStore<T> {\n\tgetSnapshot(): T | undefined;\n\tgetServerSnapshot(): T | undefined;\n\tsubscribe(onStoreChange: () => void): () => void;\n}\n\n/** Object-of-nodes factory used by record subscription adapters. */\nexport type NodeRecordFactory<K extends string, R extends Record<string, unknown>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/** Zustand-compatible store API over a caller-owned clean-slate state node. */\nexport interface ZustandStoreApi<T extends object> {\n\tgetState(): T;\n\tsetState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean): void;\n\tgetInitialState(): T;\n\tsubscribe(listener: (state: T, prevState: T) => void): () => void;\n\tdestroy(): void;\n}\n\n/** Jotai-style atom facade over a caller-owned node. */\nexport interface JotaiAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Jotai-style atom facade over a caller-owned writable node. */\nexport interface WritableJotaiAtom<T> extends JotaiAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** Nanostores-style atom facade over a caller-owned node. */\nexport interface NanoAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\tlisten(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Nanostores-style atom facade over a caller-owned writable node. */\nexport interface WritableNanoAtom<T> extends NanoAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** TC39-Signals-style facade over a caller-owned node. */\nexport interface SignalLike<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable TC39-Signals-style facade over a caller-owned writable node. */\nexport interface WritableSignalLike<T> extends SignalLike<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\nexport interface SubscribeValuesOptions<T> {\n\t/** Emit the current cache snapshot immediately. `undefined` means SENTINEL/no DATA. */\n\timmediate?: boolean;\n\t/** Suppress synchronous push-on-subscribe/replay DATA. Useful for change-only store listeners. */\n\tchangesOnly?: boolean;\n\tonError?: (error: unknown) => void;\n\tonComplete?: () => void;\n\t/** Custom cache reader for wrappers that keep their own snapshot object. */\n\tgetSnapshot?: () => T | undefined;\n}\n\nexport interface WritableNode<T> extends Node<T> {\n\tset(value: T): void;\n}\n\nexport interface WritableStoreOptions<T> extends SubscribeValuesOptions<T> {\n\t/** Override writes for adapters that need a framework-owned reducer. */\n\twrite?: (node: WritableNode<T>, value: T) => void;\n}\n\n/** Read a node cache without activating it.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `T | undefined` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeSnapshot } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nodeSnapshot<T>(node: Node<T>): T | undefined {\n\treturn node.cache as T | undefined;\n}\n\n/**\n * Subscribe to DATA values from a Node. Protocol internals stay below the adapter boundary:\n * DATA drives value listeners, ERROR/COMPLETE route to optional lifecycle callbacks.\n * @param node - Node to observe, adapt, or connect.\n * @param run - run value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `() => void` value.\n * @category adapters\n * @example\n * ```ts\n * import { subscribeNodeValues } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function subscribeNodeValues<T>(\n\tnode: Node<T>,\n\trun: (value: T | undefined) => void,\n\topts: SubscribeValuesOptions<T> = {},\n): () => void {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tif (opts.immediate) run(read());\n\n\tlet subscribing = true;\n\tconst skipSynchronousHandshakeData = opts.changesOnly || opts.immediate;\n\tconst sink: Sink = (msg, delivery?: DeliveryMeta) => {\n\t\tswitch (msg[0]) {\n\t\t\tcase \"DATA\":\n\t\t\t\tif (skipSynchronousHandshakeData && subscribing && delivery === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trun(msg[1] as T);\n\t\t\t\treturn;\n\t\t\tcase \"ERROR\":\n\t\t\t\topts.onError?.(msg[1]);\n\t\t\t\treturn;\n\t\t\tcase \"COMPLETE\":\n\t\t\t\topts.onComplete?.();\n\t\t\t\treturn;\n\t\t}\n\t};\n\tconst unsubscribe = node.subscribe(sink);\n\tsubscribing = false;\n\treturn unsubscribe;\n}\n\n/** Build a Svelte/Nanostores-style readable store from a clean-slate Node.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { readableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function readableStore<T>(\n\tnode: Node<T>,\n\topts: SubscribeValuesOptions<T> = {},\n): ReadableStore<T> {\n\treturn {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t};\n}\n\nfunction hasWritableSet<T>(node: Node<T>): node is WritableNode<T> {\n\treturn typeof (node as { set?: unknown }).set === \"function\";\n}\n\nfunction defaultWrite<T>(node: WritableNode<T>, value: T): void {\n\tnode.set(value);\n}\n\n/** Build a writable store over a StateNode or compatible clean-slate writable Node. */\nexport function writableStore<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> = {},\n): WritableStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"writableStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\treturn {\n\t\tget: read,\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t\tset: (value) => write(writable, value),\n\t\tupdate: (fn) => write(writable, fn(read())),\n\t};\n}\n\n/** Build the tiny shape React's `useSyncExternalStore` expects, without importing React.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ExternalStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { externalStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function externalStore<T>(\n\tnode: Node<T>,\n\topts: Pick<SubscribeValuesOptions<T>, \"getSnapshot\" | \"onError\" | \"onComplete\"> = {},\n): ExternalStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\treturn {\n\t\tgetSnapshot: read,\n\t\tgetServerSnapshot: read,\n\t\tsubscribe: (onStoreChange) =>\n\t\t\tsubscribeNodeValues(node, () => onStoreChange(), {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t}),\n\t};\n}\n\n/** Build a framework-neutral keyed record store for focused framework record bindings.\n * @param keysNode - keys node value used by the helper.\n * @param factory - factory value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<Record<K, R>>` value.\n * @category adapters\n * @example\n * ```ts\n * import { recordReadableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function recordReadableStore<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: NodeRecordFactory<K, R>,\n\topts: SubscribeValuesOptions<Record<K, R>> = {},\n): ReadableStore<Record<K, R>> {\n\tconst read = () => {\n\t\tconst keys = keysNode.cache ?? [];\n\t\tconst out = {} as Record<K, R>;\n\t\tfor (const key of keys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst values = {} as R;\n\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\tvalues[field] = nodes[field].cache as R[keyof R];\n\t\t\t}\n\t\t\tout[key] = values;\n\t\t}\n\t\treturn out;\n\t};\n\n\treturn {\n\t\tget: read,\n\t\tsubscribe(run) {\n\t\t\tconst entryUnsubs: Array<() => void> = [];\n\t\t\tconst cleanupEntries = () => {\n\t\t\t\tfor (const unsub of entryUnsubs.splice(0)) unsub();\n\t\t\t};\n\t\t\tconst sync = () => {\n\t\t\t\tcleanupEntries();\n\t\t\t\tfor (const key of keysNode.cache ?? []) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\t\t\tentryUnsubs.push(\n\t\t\t\t\t\t\tsubscribeNodeValues(nodes[field], () => run(read()), {\n\t\t\t\t\t\t\t\tchangesOnly: true,\n\t\t\t\t\t\t\t\tonError: opts.onError,\n\t\t\t\t\t\t\t\tonComplete: opts.onComplete,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun(read());\n\t\t\t};\n\t\t\tconst keysUnsub = subscribeNodeValues(keysNode, sync, {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t});\n\t\t\tsync();\n\t\t\treturn () => {\n\t\t\t\tkeysUnsub();\n\t\t\t\tcleanupEntries();\n\t\t\t};\n\t\t},\n\t};\n}\n\n/** Build a Zustand-compatible StoreApi over a caller-owned clean-slate state node. */\nexport function zustandStore<T extends object>(\n\tnode: WritableNode<T>,\n\tinitialState?: T,\n\topts?: WritableStoreOptions<T>,\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T | undefined,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T = nodeSnapshot(node) as T,\n\topts: WritableStoreOptions<T> = {},\n): ZustandStoreApi<T> {\n\tconst listeners = new Set<() => void>();\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"zustandStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\tconst api: ZustandStoreApi<T> = {\n\t\tgetState: () => read() as T,\n\t\tsetState(partial, replace) {\n\t\t\tconst prev = api.getState();\n\t\t\tconst next = typeof partial === \"function\" ? partial(prev) : partial;\n\t\t\twrite(writable, replace ? (next as T) : ({ ...prev, ...next } as T));\n\t\t},\n\t\tgetInitialState: () => initialState,\n\t\tsubscribe(listener) {\n\t\t\tlet prev = api.getState();\n\t\t\tconst unsub = subscribeNodeValues(\n\t\t\t\tnode,\n\t\t\t\t() => {\n\t\t\t\t\tconst next = api.getState();\n\t\t\t\t\tlistener(next, prev);\n\t\t\t\t\tprev = next;\n\t\t\t\t},\n\t\t\t\t{ changesOnly: true, onError: opts.onError, onComplete: opts.onComplete },\n\t\t\t);\n\t\t\tlisteners.add(unsub);\n\t\t\treturn () => {\n\t\t\t\tif (!listeners.delete(unsub)) return;\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\tdestroy() {\n\t\t\tfor (const unsub of [...listeners]) {\n\t\t\t\tlisteners.delete(unsub);\n\t\t\t\tunsub();\n\t\t\t}\n\t\t},\n\t};\n\treturn api;\n}\n\n/** Build a Jotai-style atom facade over a caller-owned node. */\nexport function jotaiAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableJotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): JotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): JotaiAtom<T> | WritableJotaiAtom<T> {\n\tconst base: JotaiAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a Nanostores-style atom facade over a caller-owned node. */\nexport function nanoAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableNanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): NanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): NanoAtom<T> | WritableNanoAtom<T> {\n\tconst base: NanoAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { immediate: true, ...opts }),\n\t\tlisten: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a TC39-Signals-style facade over a caller-owned node. */\nexport function signalFromNode<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableSignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): SignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): SignalLike<T> | WritableSignalLike<T> {\n\tconst base: SignalLike<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/svelte.ts","../../src/adapters/store.ts"],"sourcesContent":["/**\n * Svelte node bindings for GraphReFly (D238).\n *\n * Svelte is imported only from this focused subpath.\n */\n\nimport { type Readable, readable } from \"svelte/store\";\nimport type { Node } from \"../node/node.js\";\nimport {\n\tnodeSnapshot,\n\trecordReadableStore,\n\tsubscribeNodeValues,\n\ttype WritableNode,\n} from \"./store.js\";\n\n/** A Svelte-readable store plus DATA-only write helpers. */\nexport interface NodeWritable<T> extends Readable<T | undefined> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** Read a GraphReFly node as a Svelte readable store.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `Readable<T | undefined>` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeReadable } from \"@graphrefly/ts/adapters/svelte\";\n * ```\n */\nexport function nodeReadable<T>(node: Node<T>): Readable<T | undefined> {\n\treturn readable<T | undefined>(nodeSnapshot(node), (set) =>\n\t\tsubscribeNodeValues(node, set, { immediate: true }),\n\t);\n}\n\nfunction assertDataValue(value: unknown): void {\n\tif (value === undefined) {\n\t\tthrow new TypeError(\"nodeWritable: undefined is SENTINEL/no DATA, not a writable DATA value\");\n\t}\n}\n\n/** Bind a writable GraphReFly node as a Svelte store.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `NodeWritable<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeWritable } from \"@graphrefly/ts/adapters/svelte\";\n * ```\n */\nexport function nodeWritable<T>(node: WritableNode<T>): NodeWritable<T> {\n\tconst store = nodeReadable(node);\n\treturn {\n\t\tsubscribe: store.subscribe,\n\t\tset(value) {\n\t\t\tassertDataValue(value);\n\t\t\tnode.set(value);\n\t\t},\n\t\tupdate(fn) {\n\t\t\tconst next = fn(nodeSnapshot(node));\n\t\t\tassertDataValue(next);\n\t\t\tnode.set(next);\n\t\t},\n\t};\n}\n\n/**\n * Read a keyed record of nodes as a Svelte readable store.\n *\n * `factory` must have stable identity. Recreating it during component churn\n * rebuilds the record subscriptions.\n * @param keysNode - keys node value used by the helper.\n * @param factory - factory value used by the helper.\n * @returns A `Readable<Record<K, R>>` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeRecord } from \"@graphrefly/ts/adapters/svelte\";\n * ```\n */\nexport function nodeRecord<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: (key: K) => { [P in keyof R]: Node<R[P]> },\n): Readable<Record<K, R>> {\n\tconst store = recordReadableStore(keysNode, factory);\n\tconst read = () => store.get() ?? ({} as Record<K, R>);\n\treturn readable(read(), (set) => store.subscribe((value) => set(value ?? ({} as Record<K, R>))));\n}\n","/**\n * Framework-neutral store adapters.\n *\n * Focused framework bindings build on this tiny Node-facing layer without\n * importing framework packages into the dependency-free adapters barrel\n * (D125/D238).\n */\n\nimport type { DeliveryMeta, Sink } from \"../ctx/types.js\";\nimport type { Node } from \"../node/node.js\";\n\n/** A minimal readable store contract shared by Svelte/Nanostores-style adapters. */\nexport interface ReadableStore<T> {\n\tget(): T | undefined;\n\tsubscribe(run: (value: T | undefined) => void): () => void;\n}\n\n/** A minimal writable store contract over a GraphReFly writable node. */\nexport interface WritableStore<T> extends ReadableStore<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** React `useSyncExternalStore`-compatible shape, without importing React. */\nexport interface ExternalStore<T> {\n\tgetSnapshot(): T | undefined;\n\tgetServerSnapshot(): T | undefined;\n\tsubscribe(onStoreChange: () => void): () => void;\n}\n\n/** Object-of-nodes factory used by record subscription adapters. */\nexport type NodeRecordFactory<K extends string, R extends Record<string, unknown>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/** Zustand-compatible store API over a caller-owned GraphReFly state node. */\nexport interface ZustandStoreApi<T extends object> {\n\tgetState(): T;\n\tsetState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean): void;\n\tgetInitialState(): T;\n\tsubscribe(listener: (state: T, prevState: T) => void): () => void;\n\tdestroy(): void;\n}\n\n/** Jotai-style atom facade over a caller-owned node. */\nexport interface JotaiAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Jotai-style atom facade over a caller-owned writable node. */\nexport interface WritableJotaiAtom<T> extends JotaiAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** Nanostores-style atom facade over a caller-owned node. */\nexport interface NanoAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\tlisten(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Nanostores-style atom facade over a caller-owned writable node. */\nexport interface WritableNanoAtom<T> extends NanoAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** TC39-Signals-style facade over a caller-owned node. */\nexport interface SignalLike<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable TC39-Signals-style facade over a caller-owned writable node. */\nexport interface WritableSignalLike<T> extends SignalLike<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\nexport interface SubscribeValuesOptions<T> {\n\t/** Emit the current cache snapshot immediately. `undefined` means SENTINEL/no DATA. */\n\timmediate?: boolean;\n\t/** Suppress synchronous push-on-subscribe/replay DATA. Useful for change-only store listeners. */\n\tchangesOnly?: boolean;\n\tonError?: (error: unknown) => void;\n\tonComplete?: () => void;\n\t/** Custom cache reader for wrappers that keep their own snapshot object. */\n\tgetSnapshot?: () => T | undefined;\n}\n\nexport interface WritableNode<T> extends Node<T> {\n\tset(value: T): void;\n}\n\nexport interface WritableStoreOptions<T> extends SubscribeValuesOptions<T> {\n\t/** Override writes for adapters that need a framework-owned reducer. */\n\twrite?: (node: WritableNode<T>, value: T) => void;\n}\n\n/** Read a node cache without activating it.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `T | undefined` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeSnapshot } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nodeSnapshot<T>(node: Node<T>): T | undefined {\n\treturn node.cache as T | undefined;\n}\n\n/**\n * Subscribe to DATA values from a Node. Protocol internals stay below the adapter boundary:\n * DATA drives value listeners, ERROR/COMPLETE route to optional lifecycle callbacks.\n * @param node - Node to observe, adapt, or connect.\n * @param run - run value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `() => void` value.\n * @category adapters\n * @example\n * ```ts\n * import { subscribeNodeValues } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function subscribeNodeValues<T>(\n\tnode: Node<T>,\n\trun: (value: T | undefined) => void,\n\topts: SubscribeValuesOptions<T> = {},\n): () => void {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tif (opts.immediate) run(read());\n\n\tlet subscribing = true;\n\tconst skipSynchronousHandshakeData = opts.changesOnly || opts.immediate;\n\tconst sink: Sink = (msg, delivery?: DeliveryMeta) => {\n\t\tswitch (msg[0]) {\n\t\t\tcase \"DATA\":\n\t\t\t\tif (skipSynchronousHandshakeData && subscribing && delivery === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trun(msg[1] as T);\n\t\t\t\treturn;\n\t\t\tcase \"ERROR\":\n\t\t\t\topts.onError?.(msg[1]);\n\t\t\t\treturn;\n\t\t\tcase \"COMPLETE\":\n\t\t\t\topts.onComplete?.();\n\t\t\t\treturn;\n\t\t}\n\t};\n\tconst unsubscribe = node.subscribe(sink);\n\tsubscribing = false;\n\treturn unsubscribe;\n}\n\n/** Build a Svelte/Nanostores-style readable store from a GraphReFly Node.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { readableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function readableStore<T>(\n\tnode: Node<T>,\n\topts: SubscribeValuesOptions<T> = {},\n): ReadableStore<T> {\n\treturn {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t};\n}\n\nfunction hasWritableSet<T>(node: Node<T>): node is WritableNode<T> {\n\treturn typeof (node as { set?: unknown }).set === \"function\";\n}\n\nfunction defaultWrite<T>(node: WritableNode<T>, value: T): void {\n\tnode.set(value);\n}\n\n/** Build a writable store over a StateNode or compatible GraphReFly writable Node. */\nexport function writableStore<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> = {},\n): WritableStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"writableStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\treturn {\n\t\tget: read,\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t\tset: (value) => write(writable, value),\n\t\tupdate: (fn) => write(writable, fn(read())),\n\t};\n}\n\n/** Build the tiny shape React's `useSyncExternalStore` expects, without importing React.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ExternalStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { externalStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function externalStore<T>(\n\tnode: Node<T>,\n\topts: Pick<SubscribeValuesOptions<T>, \"getSnapshot\" | \"onError\" | \"onComplete\"> = {},\n): ExternalStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\treturn {\n\t\tgetSnapshot: read,\n\t\tgetServerSnapshot: read,\n\t\tsubscribe: (onStoreChange) =>\n\t\t\tsubscribeNodeValues(node, () => onStoreChange(), {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t}),\n\t};\n}\n\n/** Build a framework-neutral keyed record store for focused framework record bindings.\n * @param keysNode - keys node value used by the helper.\n * @param factory - factory value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<Record<K, R>>` value.\n * @category adapters\n * @example\n * ```ts\n * import { recordReadableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function recordReadableStore<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: NodeRecordFactory<K, R>,\n\topts: SubscribeValuesOptions<Record<K, R>> = {},\n): ReadableStore<Record<K, R>> {\n\tconst read = () => {\n\t\tconst keys = keysNode.cache ?? [];\n\t\tconst out = {} as Record<K, R>;\n\t\tfor (const key of keys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst values = {} as R;\n\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\tvalues[field] = nodes[field].cache as R[keyof R];\n\t\t\t}\n\t\t\tout[key] = values;\n\t\t}\n\t\treturn out;\n\t};\n\n\treturn {\n\t\tget: read,\n\t\tsubscribe(run) {\n\t\t\tconst entryUnsubs: Array<() => void> = [];\n\t\t\tconst cleanupEntries = () => {\n\t\t\t\tfor (const unsub of entryUnsubs.splice(0)) unsub();\n\t\t\t};\n\t\t\tconst sync = () => {\n\t\t\t\tcleanupEntries();\n\t\t\t\tfor (const key of keysNode.cache ?? []) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\t\t\tentryUnsubs.push(\n\t\t\t\t\t\t\tsubscribeNodeValues(nodes[field], () => run(read()), {\n\t\t\t\t\t\t\t\tchangesOnly: true,\n\t\t\t\t\t\t\t\tonError: opts.onError,\n\t\t\t\t\t\t\t\tonComplete: opts.onComplete,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun(read());\n\t\t\t};\n\t\t\tconst keysUnsub = subscribeNodeValues(keysNode, sync, {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t});\n\t\t\tsync();\n\t\t\treturn () => {\n\t\t\t\tkeysUnsub();\n\t\t\t\tcleanupEntries();\n\t\t\t};\n\t\t},\n\t};\n}\n\n/** Build a Zustand-compatible StoreApi over a caller-owned GraphReFly state node. */\nexport function zustandStore<T extends object>(\n\tnode: WritableNode<T>,\n\tinitialState?: T,\n\topts?: WritableStoreOptions<T>,\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T | undefined,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T = nodeSnapshot(node) as T,\n\topts: WritableStoreOptions<T> = {},\n): ZustandStoreApi<T> {\n\tconst listeners = new Set<() => void>();\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"zustandStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\tconst api: ZustandStoreApi<T> = {\n\t\tgetState: () => read() as T,\n\t\tsetState(partial, replace) {\n\t\t\tconst prev = api.getState();\n\t\t\tconst next = typeof partial === \"function\" ? partial(prev) : partial;\n\t\t\twrite(writable, replace ? (next as T) : ({ ...prev, ...next } as T));\n\t\t},\n\t\tgetInitialState: () => initialState,\n\t\tsubscribe(listener) {\n\t\t\tlet prev = api.getState();\n\t\t\tconst unsub = subscribeNodeValues(\n\t\t\t\tnode,\n\t\t\t\t() => {\n\t\t\t\t\tconst next = api.getState();\n\t\t\t\t\tlistener(next, prev);\n\t\t\t\t\tprev = next;\n\t\t\t\t},\n\t\t\t\t{ changesOnly: true, onError: opts.onError, onComplete: opts.onComplete },\n\t\t\t);\n\t\t\tlisteners.add(unsub);\n\t\t\treturn () => {\n\t\t\t\tif (!listeners.delete(unsub)) return;\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\tdestroy() {\n\t\t\tfor (const unsub of [...listeners]) {\n\t\t\t\tlisteners.delete(unsub);\n\t\t\t\tunsub();\n\t\t\t}\n\t\t},\n\t};\n\treturn api;\n}\n\n/** Build a Jotai-style atom facade over a caller-owned node. */\nexport function jotaiAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableJotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): JotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): JotaiAtom<T> | WritableJotaiAtom<T> {\n\tconst base: JotaiAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a Nanostores-style atom facade over a caller-owned node. */\nexport function nanoAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableNanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): NanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): NanoAtom<T> | WritableNanoAtom<T> {\n\tconst base: NanoAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { immediate: true, ...opts }),\n\t\tlisten: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a TC39-Signals-style facade over a caller-owned node. */\nexport function signalFromNode<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableSignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): SignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): SignalLike<T> | WritableSignalLike<T> {\n\tconst base: SignalLike<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n"],"mappings":"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","names":[]}
|
package/dist/adapters/svelte.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/vue.ts","../../src/adapters/store.ts"],"sourcesContent":["/**\n * Vue node bindings for GraphReFly (D238).\n *\n * Vue is imported only from this focused subpath.\n */\n\nimport { onScopeDispose, readonly, type ShallowRef, shallowRef } from \"vue\";\nimport type { Node } from \"../node/node.js\";\nimport { readableStore, recordReadableStore, type WritableNode } from \"./store.js\";\n\nfunction assertDataValue(value: unknown): void {\n\tif (value === undefined) {\n\t\tthrow new TypeError(\"useNodeInput: undefined is SENTINEL/no DATA, not a writable DATA value\");\n\t}\n}\n\nfunction bindReadable<T>(store: { get(): T; subscribe(run: (value: T) => void): () => void }) {\n\tconst value = shallowRef(store.get()) as ShallowRef<T>;\n\tconst unsubscribe = store.subscribe((next) => {\n\t\tvalue.value = next;\n\t});\n\tonScopeDispose(unsubscribe);\n\treturn readonly(value) as Readonly<ShallowRef<T>>;\n}\n\n/** Read a GraphReFly node as a Vue shallow ref. */\nexport function useNodeValue<T>(node: Node<T>): Readonly<ShallowRef<T | undefined>> {\n\treturn bindReadable(readableStore(node));\n}\n\n/** Bind a writable GraphReFly node as `[valueRef, setValue]`. */\nexport function useNodeInput<T>(\n\tnode: WritableNode<T>,\n): readonly [Readonly<ShallowRef<T | undefined>>, (value: T) => void] {\n\treturn [\n\t\tuseNodeValue(node),\n\t\t(value: T) => {\n\t\t\tassertDataValue(value);\n\t\t\tnode.set(value);\n\t\t},\n\t] as const;\n}\n\n/**\n * Read a keyed record of nodes as a Vue shallow ref.\n *\n * `factory` must have stable identity; callers should define it outside render\n * churn or memoize it in their composition function.\n */\nexport function useNodeRecord<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: (key: K) => { [P in keyof R]: Node<R[P]> },\n): Readonly<ShallowRef<Record<K, R>>> {\n\tconst store = recordReadableStore(keysNode, factory);\n\treturn bindReadable({\n\t\tget: () => store.get() ?? ({} as Record<K, R>),\n\t\tsubscribe: (run) => store.subscribe((value) => run(value ?? ({} as Record<K, R>))),\n\t});\n}\n","/**\n * Framework-neutral store adapters.\n *\n * Focused framework bindings build on this tiny Node-facing layer without\n * importing framework packages into the dependency-free adapters barrel\n * (D125/D238).\n */\n\nimport type { DeliveryMeta, Sink } from \"../ctx/types.js\";\nimport type { Node } from \"../node/node.js\";\n\n/** A minimal readable store contract shared by Svelte/Nanostores-style adapters. */\nexport interface ReadableStore<T> {\n\tget(): T | undefined;\n\tsubscribe(run: (value: T | undefined) => void): () => void;\n}\n\n/** A minimal writable store contract over a clean-slate writable node. */\nexport interface WritableStore<T> extends ReadableStore<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** React `useSyncExternalStore`-compatible shape, without importing React. */\nexport interface ExternalStore<T> {\n\tgetSnapshot(): T | undefined;\n\tgetServerSnapshot(): T | undefined;\n\tsubscribe(onStoreChange: () => void): () => void;\n}\n\n/** Object-of-nodes factory used by record subscription adapters. */\nexport type NodeRecordFactory<K extends string, R extends Record<string, unknown>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/** Zustand-compatible store API over a caller-owned clean-slate state node. */\nexport interface ZustandStoreApi<T extends object> {\n\tgetState(): T;\n\tsetState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean): void;\n\tgetInitialState(): T;\n\tsubscribe(listener: (state: T, prevState: T) => void): () => void;\n\tdestroy(): void;\n}\n\n/** Jotai-style atom facade over a caller-owned node. */\nexport interface JotaiAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Jotai-style atom facade over a caller-owned writable node. */\nexport interface WritableJotaiAtom<T> extends JotaiAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** Nanostores-style atom facade over a caller-owned node. */\nexport interface NanoAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\tlisten(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Nanostores-style atom facade over a caller-owned writable node. */\nexport interface WritableNanoAtom<T> extends NanoAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** TC39-Signals-style facade over a caller-owned node. */\nexport interface SignalLike<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable TC39-Signals-style facade over a caller-owned writable node. */\nexport interface WritableSignalLike<T> extends SignalLike<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\nexport interface SubscribeValuesOptions<T> {\n\t/** Emit the current cache snapshot immediately. `undefined` means SENTINEL/no DATA. */\n\timmediate?: boolean;\n\t/** Suppress synchronous push-on-subscribe/replay DATA. Useful for change-only store listeners. */\n\tchangesOnly?: boolean;\n\tonError?: (error: unknown) => void;\n\tonComplete?: () => void;\n\t/** Custom cache reader for wrappers that keep their own snapshot object. */\n\tgetSnapshot?: () => T | undefined;\n}\n\nexport interface WritableNode<T> extends Node<T> {\n\tset(value: T): void;\n}\n\nexport interface WritableStoreOptions<T> extends SubscribeValuesOptions<T> {\n\t/** Override writes for adapters that need a framework-owned reducer. */\n\twrite?: (node: WritableNode<T>, value: T) => void;\n}\n\n/** Read a node cache without activating it.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `T | undefined` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeSnapshot } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nodeSnapshot<T>(node: Node<T>): T | undefined {\n\treturn node.cache as T | undefined;\n}\n\n/**\n * Subscribe to DATA values from a Node. Protocol internals stay below the adapter boundary:\n * DATA drives value listeners, ERROR/COMPLETE route to optional lifecycle callbacks.\n * @param node - Node to observe, adapt, or connect.\n * @param run - run value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `() => void` value.\n * @category adapters\n * @example\n * ```ts\n * import { subscribeNodeValues } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function subscribeNodeValues<T>(\n\tnode: Node<T>,\n\trun: (value: T | undefined) => void,\n\topts: SubscribeValuesOptions<T> = {},\n): () => void {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tif (opts.immediate) run(read());\n\n\tlet subscribing = true;\n\tconst skipSynchronousHandshakeData = opts.changesOnly || opts.immediate;\n\tconst sink: Sink = (msg, delivery?: DeliveryMeta) => {\n\t\tswitch (msg[0]) {\n\t\t\tcase \"DATA\":\n\t\t\t\tif (skipSynchronousHandshakeData && subscribing && delivery === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trun(msg[1] as T);\n\t\t\t\treturn;\n\t\t\tcase \"ERROR\":\n\t\t\t\topts.onError?.(msg[1]);\n\t\t\t\treturn;\n\t\t\tcase \"COMPLETE\":\n\t\t\t\topts.onComplete?.();\n\t\t\t\treturn;\n\t\t}\n\t};\n\tconst unsubscribe = node.subscribe(sink);\n\tsubscribing = false;\n\treturn unsubscribe;\n}\n\n/** Build a Svelte/Nanostores-style readable store from a clean-slate Node.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { readableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function readableStore<T>(\n\tnode: Node<T>,\n\topts: SubscribeValuesOptions<T> = {},\n): ReadableStore<T> {\n\treturn {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t};\n}\n\nfunction hasWritableSet<T>(node: Node<T>): node is WritableNode<T> {\n\treturn typeof (node as { set?: unknown }).set === \"function\";\n}\n\nfunction defaultWrite<T>(node: WritableNode<T>, value: T): void {\n\tnode.set(value);\n}\n\n/** Build a writable store over a StateNode or compatible clean-slate writable Node. */\nexport function writableStore<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> = {},\n): WritableStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"writableStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\treturn {\n\t\tget: read,\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t\tset: (value) => write(writable, value),\n\t\tupdate: (fn) => write(writable, fn(read())),\n\t};\n}\n\n/** Build the tiny shape React's `useSyncExternalStore` expects, without importing React.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ExternalStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { externalStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function externalStore<T>(\n\tnode: Node<T>,\n\topts: Pick<SubscribeValuesOptions<T>, \"getSnapshot\" | \"onError\" | \"onComplete\"> = {},\n): ExternalStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\treturn {\n\t\tgetSnapshot: read,\n\t\tgetServerSnapshot: read,\n\t\tsubscribe: (onStoreChange) =>\n\t\t\tsubscribeNodeValues(node, () => onStoreChange(), {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t}),\n\t};\n}\n\n/** Build a framework-neutral keyed record store for focused framework record bindings.\n * @param keysNode - keys node value used by the helper.\n * @param factory - factory value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<Record<K, R>>` value.\n * @category adapters\n * @example\n * ```ts\n * import { recordReadableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function recordReadableStore<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: NodeRecordFactory<K, R>,\n\topts: SubscribeValuesOptions<Record<K, R>> = {},\n): ReadableStore<Record<K, R>> {\n\tconst read = () => {\n\t\tconst keys = keysNode.cache ?? [];\n\t\tconst out = {} as Record<K, R>;\n\t\tfor (const key of keys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst values = {} as R;\n\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\tvalues[field] = nodes[field].cache as R[keyof R];\n\t\t\t}\n\t\t\tout[key] = values;\n\t\t}\n\t\treturn out;\n\t};\n\n\treturn {\n\t\tget: read,\n\t\tsubscribe(run) {\n\t\t\tconst entryUnsubs: Array<() => void> = [];\n\t\t\tconst cleanupEntries = () => {\n\t\t\t\tfor (const unsub of entryUnsubs.splice(0)) unsub();\n\t\t\t};\n\t\t\tconst sync = () => {\n\t\t\t\tcleanupEntries();\n\t\t\t\tfor (const key of keysNode.cache ?? []) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\t\t\tentryUnsubs.push(\n\t\t\t\t\t\t\tsubscribeNodeValues(nodes[field], () => run(read()), {\n\t\t\t\t\t\t\t\tchangesOnly: true,\n\t\t\t\t\t\t\t\tonError: opts.onError,\n\t\t\t\t\t\t\t\tonComplete: opts.onComplete,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun(read());\n\t\t\t};\n\t\t\tconst keysUnsub = subscribeNodeValues(keysNode, sync, {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t});\n\t\t\tsync();\n\t\t\treturn () => {\n\t\t\t\tkeysUnsub();\n\t\t\t\tcleanupEntries();\n\t\t\t};\n\t\t},\n\t};\n}\n\n/** Build a Zustand-compatible StoreApi over a caller-owned clean-slate state node. */\nexport function zustandStore<T extends object>(\n\tnode: WritableNode<T>,\n\tinitialState?: T,\n\topts?: WritableStoreOptions<T>,\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T | undefined,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T = nodeSnapshot(node) as T,\n\topts: WritableStoreOptions<T> = {},\n): ZustandStoreApi<T> {\n\tconst listeners = new Set<() => void>();\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"zustandStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\tconst api: ZustandStoreApi<T> = {\n\t\tgetState: () => read() as T,\n\t\tsetState(partial, replace) {\n\t\t\tconst prev = api.getState();\n\t\t\tconst next = typeof partial === \"function\" ? partial(prev) : partial;\n\t\t\twrite(writable, replace ? (next as T) : ({ ...prev, ...next } as T));\n\t\t},\n\t\tgetInitialState: () => initialState,\n\t\tsubscribe(listener) {\n\t\t\tlet prev = api.getState();\n\t\t\tconst unsub = subscribeNodeValues(\n\t\t\t\tnode,\n\t\t\t\t() => {\n\t\t\t\t\tconst next = api.getState();\n\t\t\t\t\tlistener(next, prev);\n\t\t\t\t\tprev = next;\n\t\t\t\t},\n\t\t\t\t{ changesOnly: true, onError: opts.onError, onComplete: opts.onComplete },\n\t\t\t);\n\t\t\tlisteners.add(unsub);\n\t\t\treturn () => {\n\t\t\t\tif (!listeners.delete(unsub)) return;\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\tdestroy() {\n\t\t\tfor (const unsub of [...listeners]) {\n\t\t\t\tlisteners.delete(unsub);\n\t\t\t\tunsub();\n\t\t\t}\n\t\t},\n\t};\n\treturn api;\n}\n\n/** Build a Jotai-style atom facade over a caller-owned node. */\nexport function jotaiAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableJotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): JotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): JotaiAtom<T> | WritableJotaiAtom<T> {\n\tconst base: JotaiAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a Nanostores-style atom facade over a caller-owned node. */\nexport function nanoAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableNanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): NanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): NanoAtom<T> | WritableNanoAtom<T> {\n\tconst base: NanoAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { immediate: true, ...opts }),\n\t\tlisten: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a TC39-Signals-style facade over a caller-owned node. */\nexport function signalFromNode<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableSignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): SignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): SignalLike<T> | WritableSignalLike<T> {\n\tconst base: SignalLike<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/vue.ts","../../src/adapters/store.ts"],"sourcesContent":["/**\n * Vue node bindings for GraphReFly (D238).\n *\n * Vue is imported only from this focused subpath.\n */\n\nimport { onScopeDispose, readonly, type ShallowRef, shallowRef } from \"vue\";\nimport type { Node } from \"../node/node.js\";\nimport { readableStore, recordReadableStore, type WritableNode } from \"./store.js\";\n\nfunction assertDataValue(value: unknown): void {\n\tif (value === undefined) {\n\t\tthrow new TypeError(\"useNodeInput: undefined is SENTINEL/no DATA, not a writable DATA value\");\n\t}\n}\n\nfunction bindReadable<T>(store: { get(): T; subscribe(run: (value: T) => void): () => void }) {\n\tconst value = shallowRef(store.get()) as ShallowRef<T>;\n\tconst unsubscribe = store.subscribe((next) => {\n\t\tvalue.value = next;\n\t});\n\tonScopeDispose(unsubscribe);\n\treturn readonly(value) as Readonly<ShallowRef<T>>;\n}\n\n/** Read a GraphReFly node as a Vue shallow ref. */\nexport function useNodeValue<T>(node: Node<T>): Readonly<ShallowRef<T | undefined>> {\n\treturn bindReadable(readableStore(node));\n}\n\n/** Bind a writable GraphReFly node as `[valueRef, setValue]`. */\nexport function useNodeInput<T>(\n\tnode: WritableNode<T>,\n): readonly [Readonly<ShallowRef<T | undefined>>, (value: T) => void] {\n\treturn [\n\t\tuseNodeValue(node),\n\t\t(value: T) => {\n\t\t\tassertDataValue(value);\n\t\t\tnode.set(value);\n\t\t},\n\t] as const;\n}\n\n/**\n * Read a keyed record of nodes as a Vue shallow ref.\n *\n * `factory` must have stable identity; callers should define it outside render\n * churn or memoize it in their composition function.\n */\nexport function useNodeRecord<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: (key: K) => { [P in keyof R]: Node<R[P]> },\n): Readonly<ShallowRef<Record<K, R>>> {\n\tconst store = recordReadableStore(keysNode, factory);\n\treturn bindReadable({\n\t\tget: () => store.get() ?? ({} as Record<K, R>),\n\t\tsubscribe: (run) => store.subscribe((value) => run(value ?? ({} as Record<K, R>))),\n\t});\n}\n","/**\n * Framework-neutral store adapters.\n *\n * Focused framework bindings build on this tiny Node-facing layer without\n * importing framework packages into the dependency-free adapters barrel\n * (D125/D238).\n */\n\nimport type { DeliveryMeta, Sink } from \"../ctx/types.js\";\nimport type { Node } from \"../node/node.js\";\n\n/** A minimal readable store contract shared by Svelte/Nanostores-style adapters. */\nexport interface ReadableStore<T> {\n\tget(): T | undefined;\n\tsubscribe(run: (value: T | undefined) => void): () => void;\n}\n\n/** A minimal writable store contract over a GraphReFly writable node. */\nexport interface WritableStore<T> extends ReadableStore<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** React `useSyncExternalStore`-compatible shape, without importing React. */\nexport interface ExternalStore<T> {\n\tgetSnapshot(): T | undefined;\n\tgetServerSnapshot(): T | undefined;\n\tsubscribe(onStoreChange: () => void): () => void;\n}\n\n/** Object-of-nodes factory used by record subscription adapters. */\nexport type NodeRecordFactory<K extends string, R extends Record<string, unknown>> = (key: K) => {\n\t[P in keyof R]: Node<R[P]>;\n};\n\n/** Zustand-compatible store API over a caller-owned GraphReFly state node. */\nexport interface ZustandStoreApi<T extends object> {\n\tgetState(): T;\n\tsetState(partial: T | Partial<T> | ((state: T) => T | Partial<T>), replace?: boolean): void;\n\tgetInitialState(): T;\n\tsubscribe(listener: (state: T, prevState: T) => void): () => void;\n\tdestroy(): void;\n}\n\n/** Jotai-style atom facade over a caller-owned node. */\nexport interface JotaiAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Jotai-style atom facade over a caller-owned writable node. */\nexport interface WritableJotaiAtom<T> extends JotaiAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** Nanostores-style atom facade over a caller-owned node. */\nexport interface NanoAtom<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\tlisten(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable Nanostores-style atom facade over a caller-owned writable node. */\nexport interface WritableNanoAtom<T> extends NanoAtom<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\n/** TC39-Signals-style facade over a caller-owned node. */\nexport interface SignalLike<T> {\n\tget(): T | undefined;\n\tsubscribe(callback: (value: T | undefined) => void): () => void;\n\treadonly _node: Node<T>;\n}\n\n/** Writable TC39-Signals-style facade over a caller-owned writable node. */\nexport interface WritableSignalLike<T> extends SignalLike<T> {\n\tset(value: T): void;\n\tupdate(fn: (value: T | undefined) => T): void;\n}\n\nexport interface SubscribeValuesOptions<T> {\n\t/** Emit the current cache snapshot immediately. `undefined` means SENTINEL/no DATA. */\n\timmediate?: boolean;\n\t/** Suppress synchronous push-on-subscribe/replay DATA. Useful for change-only store listeners. */\n\tchangesOnly?: boolean;\n\tonError?: (error: unknown) => void;\n\tonComplete?: () => void;\n\t/** Custom cache reader for wrappers that keep their own snapshot object. */\n\tgetSnapshot?: () => T | undefined;\n}\n\nexport interface WritableNode<T> extends Node<T> {\n\tset(value: T): void;\n}\n\nexport interface WritableStoreOptions<T> extends SubscribeValuesOptions<T> {\n\t/** Override writes for adapters that need a framework-owned reducer. */\n\twrite?: (node: WritableNode<T>, value: T) => void;\n}\n\n/** Read a node cache without activating it.\n * @param node - Node to observe, adapt, or connect.\n * @returns A `T | undefined` value.\n * @category adapters\n * @example\n * ```ts\n * import { nodeSnapshot } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nodeSnapshot<T>(node: Node<T>): T | undefined {\n\treturn node.cache as T | undefined;\n}\n\n/**\n * Subscribe to DATA values from a Node. Protocol internals stay below the adapter boundary:\n * DATA drives value listeners, ERROR/COMPLETE route to optional lifecycle callbacks.\n * @param node - Node to observe, adapt, or connect.\n * @param run - run value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `() => void` value.\n * @category adapters\n * @example\n * ```ts\n * import { subscribeNodeValues } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function subscribeNodeValues<T>(\n\tnode: Node<T>,\n\trun: (value: T | undefined) => void,\n\topts: SubscribeValuesOptions<T> = {},\n): () => void {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tif (opts.immediate) run(read());\n\n\tlet subscribing = true;\n\tconst skipSynchronousHandshakeData = opts.changesOnly || opts.immediate;\n\tconst sink: Sink = (msg, delivery?: DeliveryMeta) => {\n\t\tswitch (msg[0]) {\n\t\t\tcase \"DATA\":\n\t\t\t\tif (skipSynchronousHandshakeData && subscribing && delivery === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trun(msg[1] as T);\n\t\t\t\treturn;\n\t\t\tcase \"ERROR\":\n\t\t\t\topts.onError?.(msg[1]);\n\t\t\t\treturn;\n\t\t\tcase \"COMPLETE\":\n\t\t\t\topts.onComplete?.();\n\t\t\t\treturn;\n\t\t}\n\t};\n\tconst unsubscribe = node.subscribe(sink);\n\tsubscribing = false;\n\treturn unsubscribe;\n}\n\n/** Build a Svelte/Nanostores-style readable store from a GraphReFly Node.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { readableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function readableStore<T>(\n\tnode: Node<T>,\n\topts: SubscribeValuesOptions<T> = {},\n): ReadableStore<T> {\n\treturn {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t};\n}\n\nfunction hasWritableSet<T>(node: Node<T>): node is WritableNode<T> {\n\treturn typeof (node as { set?: unknown }).set === \"function\";\n}\n\nfunction defaultWrite<T>(node: WritableNode<T>, value: T): void {\n\tnode.set(value);\n}\n\n/** Build a writable store over a StateNode or compatible GraphReFly writable Node. */\nexport function writableStore<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): WritableStore<T>;\n\n/**\n * Creates a writable store.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The writable store result.\n * @category adapters\n * @example\n * ```ts\n * import { writableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function writableStore<T>(\n\tnode: Node<T>,\n\topts: WritableStoreOptions<T> = {},\n): WritableStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"writableStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\treturn {\n\t\tget: read,\n\t\tsubscribe: (run) => subscribeNodeValues(node, run, { immediate: true, ...opts }),\n\t\tset: (value) => write(writable, value),\n\t\tupdate: (fn) => write(writable, fn(read())),\n\t};\n}\n\n/** Build the tiny shape React's `useSyncExternalStore` expects, without importing React.\n * @param node - Node to observe, adapt, or connect.\n * @param opts - Options that configure the helper.\n * @returns A `ExternalStore<T>` value.\n * @category adapters\n * @example\n * ```ts\n * import { externalStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function externalStore<T>(\n\tnode: Node<T>,\n\topts: Pick<SubscribeValuesOptions<T>, \"getSnapshot\" | \"onError\" | \"onComplete\"> = {},\n): ExternalStore<T> {\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\treturn {\n\t\tgetSnapshot: read,\n\t\tgetServerSnapshot: read,\n\t\tsubscribe: (onStoreChange) =>\n\t\t\tsubscribeNodeValues(node, () => onStoreChange(), {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t}),\n\t};\n}\n\n/** Build a framework-neutral keyed record store for focused framework record bindings.\n * @param keysNode - keys node value used by the helper.\n * @param factory - factory value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `ReadableStore<Record<K, R>>` value.\n * @category adapters\n * @example\n * ```ts\n * import { recordReadableStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function recordReadableStore<K extends string, R extends Record<string, unknown>>(\n\tkeysNode: Node<readonly K[]>,\n\tfactory: NodeRecordFactory<K, R>,\n\topts: SubscribeValuesOptions<Record<K, R>> = {},\n): ReadableStore<Record<K, R>> {\n\tconst read = () => {\n\t\tconst keys = keysNode.cache ?? [];\n\t\tconst out = {} as Record<K, R>;\n\t\tfor (const key of keys) {\n\t\t\tconst nodes = factory(key);\n\t\t\tconst values = {} as R;\n\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\tvalues[field] = nodes[field].cache as R[keyof R];\n\t\t\t}\n\t\t\tout[key] = values;\n\t\t}\n\t\treturn out;\n\t};\n\n\treturn {\n\t\tget: read,\n\t\tsubscribe(run) {\n\t\t\tconst entryUnsubs: Array<() => void> = [];\n\t\t\tconst cleanupEntries = () => {\n\t\t\t\tfor (const unsub of entryUnsubs.splice(0)) unsub();\n\t\t\t};\n\t\t\tconst sync = () => {\n\t\t\t\tcleanupEntries();\n\t\t\t\tfor (const key of keysNode.cache ?? []) {\n\t\t\t\t\tconst nodes = factory(key);\n\t\t\t\t\tfor (const field of Object.keys(nodes) as Array<keyof R>) {\n\t\t\t\t\t\tentryUnsubs.push(\n\t\t\t\t\t\t\tsubscribeNodeValues(nodes[field], () => run(read()), {\n\t\t\t\t\t\t\t\tchangesOnly: true,\n\t\t\t\t\t\t\t\tonError: opts.onError,\n\t\t\t\t\t\t\t\tonComplete: opts.onComplete,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trun(read());\n\t\t\t};\n\t\t\tconst keysUnsub = subscribeNodeValues(keysNode, sync, {\n\t\t\t\tchangesOnly: true,\n\t\t\t\tonError: opts.onError,\n\t\t\t\tonComplete: opts.onComplete,\n\t\t\t});\n\t\t\tsync();\n\t\t\treturn () => {\n\t\t\t\tkeysUnsub();\n\t\t\t\tcleanupEntries();\n\t\t\t};\n\t\t},\n\t};\n}\n\n/** Build a Zustand-compatible StoreApi over a caller-owned GraphReFly state node. */\nexport function zustandStore<T extends object>(\n\tnode: WritableNode<T>,\n\tinitialState?: T,\n\topts?: WritableStoreOptions<T>,\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T | undefined,\n\topts: WritableStoreOptions<T> & { write: (node: WritableNode<T>, value: T) => void },\n): ZustandStoreApi<T>;\n\n/**\n * Creates a zustand store.\n *\n * @param node - node value used by the helper.\n * @param initialState - initial state value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The zustand store result.\n * @category adapters\n * @example\n * ```ts\n * import { zustandStore } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function zustandStore<T extends object>(\n\tnode: Node<T>,\n\tinitialState: T = nodeSnapshot(node) as T,\n\topts: WritableStoreOptions<T> = {},\n): ZustandStoreApi<T> {\n\tconst listeners = new Set<() => void>();\n\tconst read = opts.getSnapshot ?? (() => nodeSnapshot(node));\n\tconst write = opts.write ?? (hasWritableSet(node) ? defaultWrite : undefined);\n\tif (!write) {\n\t\tthrow new TypeError(\"zustandStore: node must expose set(value) or opts.write\");\n\t}\n\tconst writable = node as WritableNode<T>;\n\tconst api: ZustandStoreApi<T> = {\n\t\tgetState: () => read() as T,\n\t\tsetState(partial, replace) {\n\t\t\tconst prev = api.getState();\n\t\t\tconst next = typeof partial === \"function\" ? partial(prev) : partial;\n\t\t\twrite(writable, replace ? (next as T) : ({ ...prev, ...next } as T));\n\t\t},\n\t\tgetInitialState: () => initialState,\n\t\tsubscribe(listener) {\n\t\t\tlet prev = api.getState();\n\t\t\tconst unsub = subscribeNodeValues(\n\t\t\t\tnode,\n\t\t\t\t() => {\n\t\t\t\t\tconst next = api.getState();\n\t\t\t\t\tlistener(next, prev);\n\t\t\t\t\tprev = next;\n\t\t\t\t},\n\t\t\t\t{ changesOnly: true, onError: opts.onError, onComplete: opts.onComplete },\n\t\t\t);\n\t\t\tlisteners.add(unsub);\n\t\t\treturn () => {\n\t\t\t\tif (!listeners.delete(unsub)) return;\n\t\t\t\tunsub();\n\t\t\t};\n\t\t},\n\t\tdestroy() {\n\t\t\tfor (const unsub of [...listeners]) {\n\t\t\t\tlisteners.delete(unsub);\n\t\t\t\tunsub();\n\t\t\t}\n\t\t},\n\t};\n\treturn api;\n}\n\n/** Build a Jotai-style atom facade over a caller-owned node. */\nexport function jotaiAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableJotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): JotaiAtom<T>;\n\n/**\n * Creates a jotai atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The jotai atom result.\n * @category adapters\n * @example\n * ```ts\n * import { jotaiAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function jotaiAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): JotaiAtom<T> | WritableJotaiAtom<T> {\n\tconst base: JotaiAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a Nanostores-style atom facade over a caller-owned node. */\nexport function nanoAtom<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableNanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): NanoAtom<T>;\n\n/**\n * Creates a nano atom.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The nano atom result.\n * @category adapters\n * @example\n * ```ts\n * import { nanoAtom } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function nanoAtom<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): NanoAtom<T> | WritableNanoAtom<T> {\n\tconst base: NanoAtom<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { immediate: true, ...opts }),\n\t\tlisten: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n\n/** Build a TC39-Signals-style facade over a caller-owned node. */\nexport function signalFromNode<T>(\n\tnode: WritableNode<T>,\n\topts?: WritableStoreOptions<T>,\n): WritableSignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(node: Node<T>, opts?: SubscribeValuesOptions<T>): SignalLike<T>;\n\n/**\n * Creates a signal from node.\n *\n * @param node - node value used by the helper.\n * @param opts - Options that configure the helper.\n * @returns The signal from node result.\n * @category adapters\n * @example\n * ```ts\n * import { signalFromNode } from \"@graphrefly/ts/adapters\";\n * ```\n */\nexport function signalFromNode<T>(\n\tnode: Node<T> | WritableNode<T>,\n\topts: SubscribeValuesOptions<T> | WritableStoreOptions<T> = {},\n): SignalLike<T> | WritableSignalLike<T> {\n\tconst base: SignalLike<T> = {\n\t\tget: () => (opts.getSnapshot ?? (() => nodeSnapshot(node)))(),\n\t\tsubscribe: (callback) => subscribeNodeValues(node, callback, { changesOnly: true, ...opts }),\n\t\t_node: node,\n\t};\n\tif (hasWritableSet(node) || typeof (opts as WritableStoreOptions<T>).write === \"function\") {\n\t\tconst writable = writableStore(\n\t\t\tnode,\n\t\t\topts as WritableStoreOptions<T> & {\n\t\t\t\twrite: (node: WritableNode<T>, value: T) => void;\n\t\t\t},\n\t\t);\n\t\treturn { ...base, set: writable.set, update: writable.update };\n\t}\n\treturn base;\n}\n"],"mappings":"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","names":[]}
|
package/dist/adapters/vue.d.cts
CHANGED
package/dist/adapters/vue.d.ts
CHANGED
package/dist/adapters/vue.js
CHANGED
package/dist/{agent-runtime-types-tool-CTZx51kE.d.cts → agent-runtime-types-tool-DSzCWLK4.d.cts}
RENAMED
|
@@ -3,7 +3,7 @@ import { C as CapacityPolicy, a as RetentionPolicy, R as ReactiveOpt } from './t
|
|
|
3
3
|
import { R as RetryPolicy } from './resilience-aVNDvpQ2.cjs';
|
|
4
4
|
import { N as Node } from './index-BNyz3GBZ.cjs';
|
|
5
5
|
import { e as ExecutorProfile, S as SourceRef, a as AgentRuntimeAuditRecord, f as ExecutorOutcomeStatus, g as AgentRequestInput, c as ExecutorRoute, h as AgentOutputEnvelope, i as ExecutorUsage, j as AgentNeed, E as ExecutorOutcome, A as AgentRequestStatusChanged } from './agent-runtime-types-core-8YmdcPPL.cjs';
|
|
6
|
-
import { S as ScheduledReadinessRequested, a as ScheduledReadinessReady } from './scheduled-readiness-
|
|
6
|
+
import { S as ScheduledReadinessRequested, a as ScheduledReadinessReady } from './scheduled-readiness-D5qPFnZF.cjs';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Provider-neutral tool-call request input (D359). Concrete clients, secrets,
|
package/dist/{agent-runtime-types-tool-B0jR0euI.d.ts → agent-runtime-types-tool-DUZUxrl5.d.ts}
RENAMED
|
@@ -3,7 +3,7 @@ import { C as CapacityPolicy, a as RetentionPolicy, R as ReactiveOpt } from './t
|
|
|
3
3
|
import { R as RetryPolicy } from './resilience-aVNDvpQ2.js';
|
|
4
4
|
import { N as Node } from './index-D9ATwlam.js';
|
|
5
5
|
import { e as ExecutorProfile, S as SourceRef, a as AgentRuntimeAuditRecord, f as ExecutorOutcomeStatus, g as AgentRequestInput, c as ExecutorRoute, h as AgentOutputEnvelope, i as ExecutorUsage, j as AgentNeed, E as ExecutorOutcome, A as AgentRequestStatusChanged } from './agent-runtime-types-core-BM40FSpx.js';
|
|
6
|
-
import { S as ScheduledReadinessRequested, a as ScheduledReadinessReady } from './scheduled-readiness-
|
|
6
|
+
import { S as ScheduledReadinessRequested, a as ScheduledReadinessReady } from './scheduled-readiness-BQdebv1Q.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Provider-neutral tool-call request input (D359). Concrete clients, secrets,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DataIssue } from './data/index.js';
|
|
2
|
-
import { d as Graph } from './graph-
|
|
2
|
+
import { d as Graph } from './graph-BYcUX6Y-.js';
|
|
3
3
|
import { BoundaryCapabilityRef, BoundaryRole } from './inspection/boundary.js';
|
|
4
4
|
import { N as Node } from './index-D9ATwlam.js';
|
|
5
5
|
import { S as SourceRef, a as AgentRuntimeAuditRecord } from './agent-runtime-types-core-BM40FSpx.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DataIssue } from './data/index.cjs';
|
|
2
|
-
import { d as Graph } from './graph-
|
|
2
|
+
import { d as Graph } from './graph-DpUhfPg-.cjs';
|
|
3
3
|
import { BoundaryCapabilityRef, BoundaryRole } from './inspection/boundary.cjs';
|
|
4
4
|
import { N as Node } from './index-BNyz3GBZ.cjs';
|
|
5
5
|
import { S as SourceRef, a as AgentRuntimeAuditRecord } from './agent-runtime-types-core-8YmdcPPL.cjs';
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
timer
|
|
3
|
+
} from "./chunk-HFPPLLLQ.js";
|
|
4
|
+
import {
|
|
5
|
+
initNode,
|
|
6
|
+
registerBackendStateContributor
|
|
7
|
+
} from "./chunk-3KYPNNBH.js";
|
|
1
8
|
import {
|
|
2
9
|
PolicyInputs,
|
|
3
10
|
deadlines,
|
|
@@ -5,13 +12,6 @@ import {
|
|
|
5
12
|
selectRetentionVictims,
|
|
6
13
|
trimHeadOverflow
|
|
7
14
|
} from "./chunk-64GWAMKI.js";
|
|
8
|
-
import {
|
|
9
|
-
timer
|
|
10
|
-
} from "./chunk-32WGWBYO.js";
|
|
11
|
-
import {
|
|
12
|
-
initNode,
|
|
13
|
-
registerBackendStateContributor
|
|
14
|
-
} from "./chunk-FLUPPSIP.js";
|
|
15
15
|
import {
|
|
16
16
|
Node,
|
|
17
17
|
node,
|
|
@@ -1744,4 +1744,4 @@ export {
|
|
|
1744
1744
|
restoreReactiveMap,
|
|
1745
1745
|
restoreReactiveIndex
|
|
1746
1746
|
};
|
|
1747
|
-
//# sourceMappingURL=chunk-
|
|
1747
|
+
//# sourceMappingURL=chunk-2U4G3PEU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/graph/checkpoint.ts","../src/graph/operators.ts"],"sourcesContent":["/**\n * Graph checkpoint public data shape (D83/D86/D90/D116).\n *\n * Checkpoint is a graph lifecycle snapshot: strict-JSON-compatible data, no storage I/O,\n * no observe-log replay, and no restore runtime in this first TS slice.\n */\n\nimport { type StrictJsonValue, strictJsonCodec } from \"../json/codec.js\";\nimport type { Node } from \"../node/node.js\";\nimport type { NodeVersionJson } from \"../node/versioning.js\";\nimport { SENTINEL } from \"../protocol/messages.js\";\n\nexport const GRAPH_CHECKPOINT_VERSION = \"graphrefly.checkpoint.v1\" as const;\n\nexport type GraphCheckpointVersion = typeof GRAPH_CHECKPOINT_VERSION;\n\nexport type GraphCheckpointJson = StrictJsonValue;\n\nexport type GraphCheckpointValue =\n\t| { kind: \"SENTINEL\" }\n\t| { kind: \"DATA\"; data: GraphCheckpointJson };\n\nexport type GraphCheckpointTerminal =\n\t| { kind: \"none\" }\n\t| { kind: \"COMPLETE\" }\n\t| { kind: \"ERROR\"; error: GraphCheckpointJson };\n\nexport type GraphCheckpointFactory =\n\t| {\n\t\t\tkind: \"registry-ref\";\n\t\t\tref: string;\n\t\t\tconfig?: GraphCheckpointJson;\n\t\t\tconfigVersion?: GraphCheckpointJson;\n\t }\n\t| { kind: \"local-only\"; name: string; reason: string };\n\nexport interface GraphCheckpointNode {\n\tid: string;\n\tname?: string;\n\tfactory: GraphCheckpointFactory;\n\tstatus: string;\n\tdeps: string[];\n\tvalue: GraphCheckpointValue;\n\tbackendState?: GraphCheckpointJson;\n\tversion?: NodeVersionJson;\n\tterminal: GraphCheckpointTerminal;\n\tlifecycle: { activated: boolean; hasCalledFnOnce: boolean };\n\tctxState: { persist: boolean; value: GraphCheckpointValue };\n\tmeta?: { [key: string]: GraphCheckpointJson };\n}\n\nexport interface GraphCheckpointEdge {\n\tfrom: string;\n\tto: string;\n}\n\nexport interface GraphCheckpointMount {\n\tat: string;\n\tcheckpoint: GraphCheckpoint;\n}\n\nexport interface GraphCheckpoint {\n\tversion: GraphCheckpointVersion;\n\tname?: string;\n\tnodes: GraphCheckpointNode[];\n\tedges: GraphCheckpointEdge[];\n\tmounts?: GraphCheckpointMount[];\n}\n\nexport function toCheckpointJson(value: unknown, path = \"$\"): GraphCheckpointJson {\n\ttry {\n\t\treturn strictJsonCodec.decode(strictJsonCodec.encode(value)) as GraphCheckpointJson;\n\t} catch (cause) {\n\t\tthrow new TypeError(`checkpoint: value at ${path} is not strict JSON compatible`, {\n\t\t\tcause,\n\t\t});\n\t}\n}\n\nexport function checkpointValue(\n\tvalue: unknown,\n\thasData: boolean,\n\tpath: string,\n): GraphCheckpointValue {\n\tif (!hasData || value === SENTINEL) return { kind: \"SENTINEL\" };\n\treturn { kind: \"DATA\", data: toCheckpointJson(value, path) };\n}\n\nexport function checkpointTerminal(value: unknown, path: string): GraphCheckpointTerminal {\n\tif (value === undefined) return { kind: \"none\" };\n\tif (value === true) return { kind: \"COMPLETE\" };\n\treturn { kind: \"ERROR\", error: toCheckpointJson(value, path) };\n}\n\ntype BackendStateContributor = () => unknown;\n\nconst backendStateContributors = new WeakMap<Node<unknown>, BackendStateContributor>();\n\n/** @internal D160: collection-owned backend checkpoint contributor for graph checkpoint. */\nexport function registerBackendStateContributor(\n\tnode: Node<unknown>,\n\tcontributor: BackendStateContributor,\n): void {\n\tbackendStateContributors.set(node, contributor);\n}\n\n/** @internal D160: capture a node's collection backend state when it has a contributor. */\nexport function checkpointBackendStateOfNode(\n\tnode: Node<unknown>,\n\tpath: string,\n): GraphCheckpointJson | undefined {\n\tconst contributor = backendStateContributors.get(node);\n\tif (contributor === undefined) return undefined;\n\treturn toCheckpointJson(contributor(), path);\n}\n","/**\n * Operators as free-standing factory definitions (D43 / D6 / D40 Catalog-first).\n *\n * Operators are `node` sugar (D6), NOT verbs (D4) and NEVER in parity (D24). Each is a\n * pure {@link Operator} spec — `{factory, body, opts}` — built on the bare `node` primitive\n * (NOT the `derived` verb): `body` reads ctx dep slots positionally and emits via\n * `ctx.down`. Two ways to instantiate:\n *\n * - {@link initNode}(op, deps, opts?) — bare, no Graph; returns a working `Node<T>`.\n * - `g.initNode(op, deps, opts?)` — graph-bound; the SAME call, plus inspection registration\n * (the real factory name lands in the graph's `_entries`, so describe/observe/profile\n * show it — D6/R-describe — while the node stays thin, R-node-thin).\n *\n * The D30 throw→ERROR boundary lives once, in the free {@link initNode} (which `g.initNode`\n * funnels through). The pure-ts `operatorOpts/partialOperatorOpts/gatedOperatorOpts` trio is\n * NOT ported: its sole job (`describeKind:\"derived\"`) is dead under D6/D39 (factory = the\n * REAL operator name); only the `partial`/`terminalAsRealInput` flags survive, carried\n * per-operator in `op.opts`.\n *\n * Config is folded into the factory (`map(fn)`, `scan(reducer, seed)`, `take(n)`, `merge()`),\n * so fn params are annotated where the source type can't be inferred (RxJS-pipe cost);\n * dep-type safety is recovered by the typed `g.initNode` overloads.\n */\n\nimport {\n\ttype Ctx,\n\tdepBatch,\n\tdepCount,\n\tdepLatest,\n\tdepTerminal,\n\tisTerminalComplete,\n\tisTerminalError,\n\ttype NodeFn,\n\tterminalErrorValue,\n} from \"../ctx/types.js\";\nimport type { NodeCore } from \"../node/core.js\";\nimport { Node, type NodeOptions, withNodeCore } from \"../node/node.js\";\nimport { errorPayload } from \"../protocol/messages.js\";\nimport { type GraphCheckpointJson, toCheckpointJson } from \"./checkpoint.js\";\nimport type { GraphRestoreDefinition, GraphRestoreEntry, GraphRestoreRegistry } from \"./restore.js\";\n\n/**\n * A free-standing operator definition (D43). `TIn` = the element type each dep delivers\n * (the operator reads `depLatest(ctx, i) as TIn`); `TOut` = the emitted value type.\n * `__in`/`__out` are phantom-only (never assigned) — they let `g.initNode` infer + check the\n * dep tuple against the operator without an explicit type argument.\n */\nexport interface Operator<TIn = unknown, TOut = unknown> {\n\t/** Real operator name shown in describe (D6/L1.5) — recorded at `_add` by `g.initNode`. */\n\treadonly factory: string;\n\t/** The ctx-body: reads ctx dep slots positionally, emits via `ctx.down`. */\n\treadonly body: (ctx: Ctx) => void;\n\t/** Behavioral node options the operator needs (e.g. `partial:true` for combine-family). */\n\treadonly opts?: Partial<NodeOptions<TOut>>;\n\t/**\n\t * D97/D100 restore metadata derived from a named definition or static built-in config.\n\t * This is semantic metadata only; dispatcher handles stay graph-local runtime state.\n\t */\n\treadonly restore?: {\n\t\tref: string;\n\t\tconfig?: GraphCheckpointJson;\n\t\tconfigVersion?: GraphCheckpointJson;\n\t};\n\t/** @internal phantom — never set; carries the dep element type for `g.initNode` inference. */\n\treadonly __in?: TIn;\n\t/** @internal phantom — never set; carries the output value type. */\n\treadonly __out?: TOut;\n}\n\ntype MutableRestoreRegistry = Map<string, GraphRestoreEntry> | Record<string, GraphRestoreEntry>;\n\nexport type RestoreRegistryEntry = GraphRestoreEntry;\n\nexport interface Definition<S = unknown, T = unknown> extends GraphRestoreDefinition<S, T> {\n\treadonly ref: string;\n\treadonly fn: (v: S) => T;\n}\n\nexport interface DefineOpts {\n\tregistry?: MutableRestoreRegistry;\n}\n\nfunction registryHas(registry: MutableRestoreRegistry, ref: string): boolean {\n\treturn registry instanceof Map ? registry.has(ref) : Object.hasOwn(registry, ref);\n}\n\nfunction registrySet(\n\tregistry: MutableRestoreRegistry,\n\tref: string,\n\tentry: GraphRestoreEntry,\n): void {\n\tif (registryHas(registry, ref)) {\n\t\tthrow new Error(`restoreRegistry: duplicate ref '${ref}'`);\n\t}\n\tif (registry instanceof Map) registry.set(ref, entry);\n\telse registry[ref] = entry;\n}\n\nexport function addToRestoreRegistry(\n\tregistry: MutableRestoreRegistry,\n\tentry: GraphRestoreEntry,\n): void {\n\tregistrySet(registry, entry.ref, entry);\n}\n\n/**\n * Merge restore registry entries into a duplicate-checking Map.\n *\n * @param entries - Additional restore entries to add.\n * @param base - Optional base registry to copy from.\n * @returns A Map keyed by restore ref.\n * @example\n * ```ts\n * restoreRegistry([define(\"trim\", (value: string) => value.trim())]);\n * ```\n * @category operators\n */\nexport function restoreRegistry(\n\tentries: readonly GraphRestoreEntry[] = [],\n\tbase?: GraphRestoreRegistry,\n): Map<string, GraphRestoreEntry> {\n\tconst out = new Map<string, GraphRestoreEntry>();\n\tif (base instanceof Map) {\n\t\tfor (const [ref, entry] of base) registrySet(out, ref, entry);\n\t} else if (base !== undefined) {\n\t\tfor (const [ref, entry] of Object.entries(base)) registrySet(out, ref, entry);\n\t}\n\tfor (const entry of entries) addToRestoreRegistry(out, entry);\n\treturn out;\n}\n\nfunction isDefinition<S, T>(fn: ((v: S) => T) | Definition<S, T>): fn is Definition<S, T> {\n\treturn typeof fn === \"object\" && fn !== null && (fn as Definition<S, T>).kind === \"definition\";\n}\n\n/**\n * Register a named restore definition.\n *\n * @param ref - Stable restore reference name.\n * @param fn - Pure transform function used during restoration.\n * @param opts - Optional registry to receive the new definition.\n * @returns A named definition record.\n * @example\n * ```ts\n * define(\"trim\", (value: string) => value.trim());\n * ```\n * @category operators\n */\nexport function define<S, T>(\n\tref: string,\n\tfn: (v: S) => T,\n\topts: DefineOpts = {},\n): Definition<S, T> {\n\tconst jsonRef = toCheckpointJson(ref, \"define.ref\");\n\tif (typeof jsonRef !== \"string\") throw new TypeError(\"define: ref must be a string\");\n\tconst definition: Definition<S, T> = {\n\t\tkind: \"definition\",\n\t\tref: jsonRef,\n\t\tfn,\n\t};\n\tif (opts.registry !== undefined) addToRestoreRegistry(opts.registry, definition);\n\treturn definition;\n}\n\n/**\n * Instantiate an operator as a bare `Node<T>` — NO Graph required (D43 bare-node path).\n * Wraps `op.body` in the D30 value-throw→ERROR boundary; merges `op.opts` with caller `opts`\n * (caller wins, so `partial`/`pool`/`dispatcher` overrides take effect). The\n * dispatcher defaults to the process-global (D26) unless `opts.dispatcher` is passed.\n *\n * `g.initNode` is the same call PLUS graph registration; graph inspection\n * (describe/observe/profile) requires that path — a node built bare here is not registered in\n * any graph's index.\n * @param op - op value used by the helper.\n * @param deps - Declared dependency node or nodes.\n * @param opts - Options that configure the helper.\n * @returns A `Node<TOut>` value.\n * @category operators\n * @example\n * ```ts\n * import { initNode } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function initNode<TIn, TOut>(\n\top: Operator<TIn, TOut>,\n\tdeps: readonly Node<unknown>[],\n\topts: NodeOptions<TOut> = {},\n): Node<TOut> {\n\treturn makeInitNode(op, deps, opts);\n}\n\n/** @internal Graph-bound operator instantiation into a graph-local B49 core. */\nexport function initNodeWithCore<TIn, TOut>(\n\tcore: NodeCore,\n\top: Operator<TIn, TOut>,\n\tdeps: readonly Node<unknown>[],\n\topts: NodeOptions<TOut> = {},\n): Node<TOut> {\n\treturn withNodeCore(core, () => makeInitNode(op, deps, opts));\n}\n\nfunction makeInitNode<TIn, TOut>(\n\top: Operator<TIn, TOut>,\n\tdeps: readonly Node<unknown>[],\n\topts: NodeOptions<TOut>,\n): Node<TOut> {\n\tconst body = operatorNodeFn(op);\n\t// D43-reserved / D51: stamp the operator's real factory onto the bare node so a runtime *Map\n\t// inner (created here via fromAny, NOT registered in any graph) is named in describe's\n\t// auto-discovery. A graph-bound g.initNode also records it in `_entries` (entry.factory wins\n\t// there); this field is only read for a node absent from the graph index. Caller opts win.\n\treturn new Node<TOut>([...deps], body, { factory: op.factory, ...op.opts, ...opts });\n}\n\n/** @internal Build the dispatcher body for an Operator spec. */\nexport function operatorNodeFn<TIn, TOut>(op: Operator<TIn, TOut>): NodeFn {\n\treturn (ctx) => {\n\t\ttry {\n\t\t\top.body(ctx);\n\t\t} catch (e) {\n\t\t\tctx.down([[\"ERROR\", errorPayload(e, \"operator threw without a valid error payload\")]]); // D30: value-level throw → ERROR\n\t\t}\n\t};\n}\n\n// ── Slice 1 — single-dep map / take / control (CSP-2.7 catalog re-derive, D40) ──\n// All read dep 0 positionally + emit via ctx.down. Under D49 every occurrence is DATA (no\n// equals-absorption); a body that returns WITHOUT emitting gets a substrate-synthesized undirty\n// RESOLVED (R-resolved-undirty) — so a \"skip this wave\" is a bare `return`. Terminal-emitting\n// operators (reduce/last/find/elementAt) read `depTerminal(ctx, 0)` via the\n// `completeWhenDepsComplete:false + terminalAsRealInput:true` flags (R-deps-terminal): the fn fires\n// on the source's COMPLETE and emits its final value. NOT 1:1 pure-ts ports — the frozen reference\n// (D41) uses a producer + internal `subscribeOr`, the D45-banned describe island; these are\n// declared-dep nodes whose single edge `describe` shows truthfully.\n\n/**\n * Transform each upstream DATA value with a synchronous mapping function.\n *\n * @param fn - Mapping function, or a named `define()` definition for checkpoint restoration.\n * @returns An operator that emits `fn(value)` for each upstream value.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { map } from \"@graphrefly/ts/operators\";\n *\n * const g = graph();\n * const count = g.state(1);\n * const doubled = g.initNode(map((value: number) => value * 2), [count]);\n * ```\n * @remarks **Restorable maps:** Passing a named `define()` registers semantic restore metadata.\n * @category operators\n */\nexport function map<S, T>(fn: ((v: S) => T) | Definition<S, T>): Operator<S, T> {\n\tif (isDefinition(fn)) {\n\t\treturn mapFromFunction(fn.fn, {\n\t\t\tref: \"map\",\n\t\t\tconfig: { fn: toCheckpointJson(fn.ref, `map.fn`) },\n\t\t});\n\t}\n\treturn mapFromFunction(fn);\n}\n\nfunction mapFromFunction<S, T>(\n\tfn: (v: S) => T,\n\trestore?: {\n\t\tref: string;\n\t\tconfig?: GraphCheckpointJson;\n\t\tconfigVersion?: GraphCheckpointJson;\n\t},\n): Operator<S, T> {\n\treturn {\n\t\tfactory: \"map\",\n\t\t...(restore ? { restore } : {}),\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tfor (const v of b) ctx.down([[\"DATA\", fn(v as S)]]);\n\t\t},\n\t};\n}\n\n/**\n * Pass through upstream values that satisfy a predicate.\n *\n * @param pred - Predicate evaluated for each upstream DATA value.\n * @returns An operator that emits matching values and stays quiet for non-matches.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { filter } from \"@graphrefly/ts/operators\";\n *\n * const g = graph();\n * const count = g.state(0);\n * const even = g.initNode(filter((value: number) => value % 2 === 0), [count]);\n * ```\n * @category operators\n */\nexport function filter<S>(pred: (v: S) => boolean): Operator<S, S> {\n\treturn {\n\t\tfactory: \"filter\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tfor (const v of b) if (pred(v as S)) ctx.down([[\"DATA\", v]]);\n\t\t},\n\t};\n}\n\n/**\n * Accumulate upstream values and emit each intermediate accumulator.\n *\n * @param reducer - Reducer called with the previous accumulator and each upstream value.\n * @param seed - Initial accumulator value.\n * @returns An operator that emits the accumulator after every input value.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { scan } from \"@graphrefly/ts/operators\";\n *\n * const g = graph();\n * const values = g.state(1);\n * const total = g.initNode(scan((sum: number, value: number) => sum + value, 0), [values]);\n * ```\n * @category operators\n */\nexport function scan<S, T>(reducer: (acc: T, v: S) => T, seed: T): Operator<S, T> {\n\treturn {\n\t\tfactory: \"scan\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tlet acc = ctx.state.get<T>() ?? seed;\n\t\t\tfor (const v of b) {\n\t\t\t\tacc = reducer(acc, v as S);\n\t\t\t\tctx.down([[\"DATA\", acc]]);\n\t\t\t}\n\t\t\tctx.state.set(acc);\n\t\t},\n\t};\n}\n\n/**\n * Emit the first `n` upstream values, then complete.\n *\n * @param n - Number of DATA values to pass before completion.\n * @returns An operator that forwards at most `n` values and then emits COMPLETE.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { take } from \"@graphrefly/ts/operators\";\n *\n * const firstThree = graph().initNode(take<number>(3), [source]);\n * ```\n * @category operators\n */\nexport function take<S>(n: number): Operator<S, S> {\n\treturn {\n\t\tfactory: \"take\",\n\t\trestore: { ref: \"take\", config: { n: toCheckpointJson(n, \"take.n\") } },\n\t\tbody: (ctx) => {\n\t\t\tif (n <= 0) {\n\t\t\t\tctx.down([[\"COMPLETE\"]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tlet count = ctx.state.get<number>() ?? 0;\n\t\t\tif (count >= n) return; // already satisfied\n\t\t\tfor (const v of b) {\n\t\t\t\tif (count >= n) break;\n\t\t\t\tcount += 1;\n\t\t\t\tctx.down(count >= n ? [[\"DATA\", v], [\"COMPLETE\"]] : [[\"DATA\", v]]);\n\t\t\t}\n\t\t\tctx.state.set(count);\n\t\t},\n\t};\n}\n\n/**\n * Suppress consecutive duplicate values.\n *\n * @param eq - Equality predicate; defaults to `Object.is`.\n * @returns An operator that emits only when the next value differs from the previous emitted value.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { distinctUntilChanged } from \"@graphrefly/ts/operators\";\n *\n * const stable = graph().initNode(distinctUntilChanged<number>(), [source]);\n * ```\n * @category operators\n */\nexport function distinctUntilChanged<S>(eq: (a: S, b: S) => boolean = Object.is): Operator<S, S> {\n\treturn {\n\t\tfactory: \"distinctUntilChanged\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tconst prev = ctx.state.get<{ v: S }>();\n\t\t\tlet last = prev?.v;\n\t\t\tlet hasLast = prev !== undefined;\n\t\t\tfor (const v of b as readonly S[]) {\n\t\t\t\tif (hasLast && eq(last as S, v)) continue;\n\t\t\t\tlast = v;\n\t\t\t\thasLast = true;\n\t\t\t\tctx.down([[\"DATA\", v]]);\n\t\t\t}\n\t\t\tif (hasLast) ctx.state.set({ v: last as S });\n\t\t},\n\t};\n}\n\n/**\n * merge: interleave several sources — emit each DATA from whichever dep fired. `partial:true`\n * (combine-family): fires on any single dep, not gated on all deps settling.\n *\n * @returns An operator that forwards DATA from any dependency.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { merge } from \"@graphrefly/ts/operators\";\n *\n * const merged = graph().initNode(merge<number>(), [left, right]);\n * ```\n * @category operators\n */\nexport function merge<T>(): Operator<T, T> {\n\treturn {\n\t\tfactory: \"merge\",\n\t\topts: { partial: true },\n\t\tbody: (ctx) => {\n\t\t\tfor (let i = 0; i < depCount(ctx); i++) {\n\t\t\t\tconst b = depBatch(ctx, i);\n\t\t\t\tif (b && b.length > 0) {\n\t\t\t\t\tfor (const v of b) ctx.down([[\"DATA\", v]]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * reduce: accumulate over the whole source, emit ONE final value on the source's COMPLETE\n * (RxJS `reduce`). Unlike {@link scan} (which emits every step), reduce stays quiet until the\n * source terminates. `completeWhenDepsComplete:false + terminalAsRealInput:true`: the fn fires on\n * the source COMPLETE (reading `terminal===true`) and emits the accumulator + COMPLETE. An empty\n * source emits the seed (RxJS parity). A source ERROR auto-forwards (errorWhenDepsError default).\n *\n * @param reducer - Reducer called with the accumulator and each upstream DATA value.\n * @param seed - Initial accumulator value emitted if the source completes empty.\n * @returns An operator that emits one accumulated value when the source completes.\n * @example\n * ```ts\n * import { graph } from \"@graphrefly/ts/graph\";\n * import { reduce } from \"@graphrefly/ts/operators\";\n *\n * const total = graph().initNode(reduce((sum: number, value: number) => sum + value, 0), [source]);\n * ```\n * @category operators\n */\nexport function reduce<S, T>(reducer: (acc: T, v: S) => T, seed: T): Operator<S, T> {\n\treturn {\n\t\tfactory: \"reduce\",\n\t\topts: { completeWhenDepsComplete: false, terminalAsRealInput: true },\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tlet acc = ctx.state.get<T>() ?? seed;\n\t\t\tif (b) for (const v of b) acc = reducer(acc, v as S);\n\t\t\tctx.state.set(acc);\n\t\t\tif (isTerminalComplete(depTerminal(ctx, 0))) ctx.down([[\"DATA\", acc], [\"COMPLETE\"]]);\n\t\t\t// else (live DATA wave): no emit → substrate-synthesized undirty RESOLVED (D49).\n\t\t},\n\t};\n}\n\n/**\n * pairwise: emit `[previous, current]` for each consecutive pair; the very first value produces no\n * pair (quiet → undirty RESOLVED). Previous value is kept in `ctx.state`.\n * @returns A `Operator<S, readonly [S, S]>` value.\n * @category operators\n * @example\n * ```ts\n * import { pairwise } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function pairwise<S>(): Operator<S, readonly [S, S]> {\n\treturn {\n\t\tfactory: \"pairwise\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tconst st = ctx.state.get<{ prev: S }>();\n\t\t\tlet prev = st?.prev;\n\t\t\tlet hasPrev = st !== undefined;\n\t\t\tfor (const v of b as readonly S[]) {\n\t\t\t\tif (hasPrev) ctx.down([[\"DATA\", [prev as S, v] as const]]);\n\t\t\t\tprev = v;\n\t\t\t\thasPrev = true;\n\t\t\t}\n\t\t\tif (hasPrev) ctx.state.set({ prev: prev as S });\n\t\t},\n\t};\n}\n\n/** skip: drop the first `n` DATA values, then pass the rest through.\n * @param n - n value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { skip } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function skip<S>(n: number): Operator<S, S> {\n\treturn {\n\t\tfactory: \"skip\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tlet count = ctx.state.get<number>() ?? 0;\n\t\t\tfor (const v of b) {\n\t\t\t\tif (count < n) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tctx.down([[\"DATA\", v]]);\n\t\t\t}\n\t\t\tctx.state.set(count);\n\t\t},\n\t};\n}\n\n/**\n * takeWhile: emit values while `pred` holds; on the first value that fails `pred`, COMPLETE\n * WITHOUT emitting it (RxJS default, non-inclusive). Terminal-is-forever once it completes.\n * @param pred - pred value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { takeWhile } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function takeWhile<S>(pred: (v: S) => boolean): Operator<S, S> {\n\treturn {\n\t\tfactory: \"takeWhile\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tfor (const v of b as readonly S[]) {\n\t\t\t\tif (pred(v)) ctx.down([[\"DATA\", v]]);\n\t\t\t\telse {\n\t\t\t\t\tctx.down([[\"COMPLETE\"]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * first: emit the first value matching `pred` (or simply the first value), then COMPLETE. EDGE\n * (RxJS divergence, flagged — same class as last/find/elementAt): if the source COMPLETEs with no\n * matching value, the substrate auto-cascades a bare COMPLETE (no value); RxJS `first()` throws\n * EmptyError. Could align to `[[ERROR, EmptyError]]` (expressible) if strict RxJS parity is wanted.\n * @param pred - pred value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { first } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function first<S>(pred?: (v: S) => boolean): Operator<S, S> {\n\treturn {\n\t\tfactory: \"first\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tfor (const v of b as readonly S[]) {\n\t\t\t\tif (!pred || pred(v)) {\n\t\t\t\t\tctx.down([[\"DATA\", v], [\"COMPLETE\"]]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// no match in this wave → undirty RESOLVED (await next match)\n\t\t},\n\t};\n}\n\n/**\n * last: emit the last value matching `pred` (or the last value) on the source's COMPLETE.\n * `completeWhenDepsComplete:false + terminalAsRealInput:true`. EDGE (RxJS divergence, flagged):\n * RxJS `last()` throws EmptyError when no value matched; we COMPLETE without a value (no throw) —\n * GraphReFly has no \"complete-or-throw\" terminal and SENTINEL forbids emitting a\n * placeholder.\n * @param pred - pred value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { last } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function last<S>(pred?: (v: S) => boolean): Operator<S, S> {\n\treturn {\n\t\tfactory: \"last\",\n\t\topts: { completeWhenDepsComplete: false, terminalAsRealInput: true },\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (b) for (const v of b) if (!pred || pred(v as S)) ctx.state.set({ v });\n\t\t\tif (isTerminalComplete(depTerminal(ctx, 0))) {\n\t\t\t\tconst st = ctx.state.get<{ v: S }>();\n\t\t\t\tctx.down(st ? [[\"DATA\", st.v], [\"COMPLETE\"]] : [[\"COMPLETE\"]]);\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * find: emit the first value matching `pred`, then COMPLETE. EDGE (RxJS divergence, flagged): RxJS\n * `find` emits `undefined` then COMPLETE when nothing matched — but `undefined` IS the SENTINEL\n * (R-sentinel), so a not-found source COMPLETE here emits a bare COMPLETE (no value).\n * @param pred - pred value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { find } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function find<S>(pred: (v: S) => boolean): Operator<S, S> {\n\treturn {\n\t\tfactory: \"find\",\n\t\topts: { completeWhenDepsComplete: false, terminalAsRealInput: true },\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (b) {\n\t\t\t\tfor (const v of b) {\n\t\t\t\t\tif (pred(v as S)) {\n\t\t\t\t\t\tctx.down([[\"DATA\", v], [\"COMPLETE\"]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isTerminalComplete(depTerminal(ctx, 0))) ctx.down([[\"COMPLETE\"]]); // not found → bare COMPLETE\n\t\t},\n\t};\n}\n\n/**\n * elementAt: emit the value at zero-based `index`, then COMPLETE. EDGE (RxJS divergence, flagged):\n * RxJS throws ArgumentOutOfRangeError if the source completes before `index`; we COMPLETE without\n * a value (no throw), consistent with last/find.\n * @param index - index value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { elementAt } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function elementAt<S>(index: number): Operator<S, S> {\n\treturn {\n\t\tfactory: \"elementAt\",\n\t\topts: { completeWhenDepsComplete: false, terminalAsRealInput: true },\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tlet count = ctx.state.get<number>() ?? 0;\n\t\t\tif (b) {\n\t\t\t\tfor (const v of b) {\n\t\t\t\t\tif (count === index) {\n\t\t\t\t\t\tctx.down([[\"DATA\", v], [\"COMPLETE\"]]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t\tctx.state.set(count);\n\t\t\t}\n\t\t\tif (isTerminalComplete(depTerminal(ctx, 0))) ctx.down([[\"COMPLETE\"]]); // index out of range → bare COMPLETE\n\t\t},\n\t};\n}\n\n/** Observer object for {@link tap} — lifecycle-aware side effects (RxJS tap observer form). */\nexport interface TapObserver<T> {\n\tdata?: (value: T) => void;\n\terror?: (err: unknown) => void;\n\tcomplete?: () => void;\n}\n\n/**\n * tap: invoke a side effect on each DATA (function form) or on data/error/complete (observer form);\n * values pass through unchanged. The observer form reads source terminals\n * (`completeWhenDepsComplete:false + errorWhenDepsError:false + terminalAsRealInput:true`) so it can\n * call `error`/`complete` then forward the terminal; the function form lets the substrate\n * auto-cascade terminals.\n * @param fnOrObserver - fn or observer value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { tap } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function tap<S>(fnOrObserver: ((v: S) => void) | TapObserver<S>): Operator<S, S> {\n\tif (typeof fnOrObserver === \"function\") {\n\t\tconst fn = fnOrObserver;\n\t\treturn {\n\t\t\tfactory: \"tap\",\n\t\t\tbody: (ctx) => {\n\t\t\t\tconst b = depBatch(ctx, 0);\n\t\t\t\tif (b)\n\t\t\t\t\tfor (const v of b) {\n\t\t\t\t\t\tfn(v as S);\n\t\t\t\t\t\tctx.down([[\"DATA\", v]]);\n\t\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\tconst obs = fnOrObserver;\n\treturn {\n\t\tfactory: \"tap\",\n\t\topts: {\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\terrorWhenDepsError: false,\n\t\t\tterminalAsRealInput: true,\n\t\t},\n\t\tbody: (ctx) => {\n\t\t\tconst terminal = depTerminal(ctx, 0);\n\t\t\tif (isTerminalComplete(terminal)) {\n\t\t\t\tobs.complete?.();\n\t\t\t\tctx.down([[\"COMPLETE\"]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isTerminalError(terminal)) {\n\t\t\t\tconst err = terminalErrorValue(terminal);\n\t\t\t\tobs.error?.(err);\n\t\t\t\tctx.down([[\"ERROR\", err]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (b)\n\t\t\t\tfor (const v of b) {\n\t\t\t\t\tobs.data?.(v as S);\n\t\t\t\t\tctx.down([[\"DATA\", v]]);\n\t\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * onFirstData (alias `tapFirst`): invoke `fn` exactly once on the first qualifying value (default\n * `where: v => v != null` — null/undefined pass through without counting as \"first\"), then pass all\n * values through unchanged. The one-shot guard is per-node `ctx.state` (NOT a factory closure, so a\n * second instantiation of the same factory re-arms — R-ctx-state).\n * @param fn - Synchronous function invoked by the helper.\n * @param opts - Options that configure the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { onFirstData } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function onFirstData<S>(\n\tfn: (v: S) => void,\n\topts?: { where?: (v: S) => boolean },\n): Operator<S, S> {\n\tconst where = opts?.where ?? ((v: S) => v != null);\n\treturn {\n\t\tfactory: \"onFirstData\",\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tif (!b) return;\n\t\t\tlet fired = ctx.state.get<boolean>() ?? false;\n\t\t\tfor (const v of b) {\n\t\t\t\tif (!fired && where(v as S)) {\n\t\t\t\t\tfired = true;\n\t\t\t\t\tfn(v as S);\n\t\t\t\t}\n\t\t\t\tctx.down([[\"DATA\", v]]);\n\t\t\t}\n\t\t\tctx.state.set(fired);\n\t\t},\n\t};\n}\n\n/** tapFirst: alias of {@link onFirstData} (the one-shot companion to {@link tap}). */\nexport const tapFirst = onFirstData;\n\n/** Options for {@link settle}. */\nexport interface SettleOpts<S> {\n\t/** Consecutive no-change waves before declaring convergence + COMPLETE. */\n\tquietWaves: number;\n\t/** Optional hard cap on total waves before forced COMPLETE. */\n\tmaxWaves?: number;\n\t/** Optional comparator; a DATA equal to the previous one does NOT reset the quiet counter. */\n\tequals?: (a: S, b: S) => boolean;\n}\n\n/** Internal settle accumulator state (per-node, R-ctx-state). */\ninterface SettleState<S> {\n\tlast: S | undefined;\n\thasValue: boolean;\n\tquiet: number;\n\twaves: number;\n\tdone: boolean;\n}\n\n/**\n * settle: forward each DATA unchanged, watch for convergence, COMPLETE once the source has been\n * quiet for `quietWaves` consecutive waves (or `maxWaves` elapsed). \"Wave\" = one fn invocation\n * (a DATA batch OR a bare undirty RESOLVED end-of-wave). No polling (R-no-polling) — the counter\n * advances only on real upstream waves. `settle`'s own `equals` is a body comparator, NOT the\n * removed substrate `equals` (D49).\n * @param opts - Options that configure the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { settle } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function settle<S>(opts: SettleOpts<S>): Operator<S, S> {\n\tconst { quietWaves, maxWaves, equals } = opts;\n\tif (!Number.isInteger(quietWaves) || quietWaves < 1) {\n\t\tthrow new RangeError(`settle: quietWaves must be a positive integer (got ${quietWaves})`);\n\t}\n\tif (maxWaves != null && (!Number.isInteger(maxWaves) || maxWaves < 1)) {\n\t\tthrow new RangeError(`settle: maxWaves must be a positive integer when set (got ${maxWaves})`);\n\t}\n\treturn {\n\t\tfactory: \"settle\",\n\t\tbody: (ctx) => {\n\t\t\tconst st: SettleState<S> = ctx.state.get<SettleState<S>>() ?? {\n\t\t\t\tlast: undefined,\n\t\t\t\thasValue: false,\n\t\t\t\tquiet: 0,\n\t\t\t\twaves: 0,\n\t\t\t\tdone: false,\n\t\t\t};\n\t\t\tif (st.done) return;\n\t\t\tst.waves++;\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tlet sawChange = false;\n\t\t\tif (b && b.length > 0) {\n\t\t\t\tfor (const v of b) {\n\t\t\t\t\tconst next = v as S;\n\t\t\t\t\tconst isChange = !st.hasValue || equals == null || !equals(st.last as S, next);\n\t\t\t\t\tif (isChange) sawChange = true;\n\t\t\t\t\tst.last = next;\n\t\t\t\t\tst.hasValue = true;\n\t\t\t\t\tctx.down([[\"DATA\", next]]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tst.quiet = sawChange ? 0 : st.quiet + 1;\n\t\t\tconst settled = st.hasValue && st.quiet >= quietWaves;\n\t\t\tconst exhausted = maxWaves != null && st.waves >= maxWaves;\n\t\t\tif (settled || exhausted) {\n\t\t\t\tst.done = true;\n\t\t\t\tctx.state.set(st);\n\t\t\t\tctx.down([[\"COMPLETE\"]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tctx.state.set(st);\n\t\t\t// A no-DATA wave that didn't converge → bare undirty RESOLVED is synthesized by the\n\t\t\t// substrate (D49); nothing to emit here.\n\t\t},\n\t};\n}\n\n// ── Slice 3 — error-handling control (CSP-2.7, D40) ──\n// rescue/catchError ABSORB the source ERROR (errorWhenDepsError:false) and read the error payload\n// from `depTerminal(ctx, 0)` (R-deps-terminal). They set completeWhenDepsComplete:false so a\n// normal source COMPLETE is forwarded explicitly — which ALSO sidesteps B40 (the\n// completeWhenDepsComplete:true × absorbed-errored-dep auto-complete gap): there is no auto-complete\n// to block. valve is a [source, control] gate (state-verb-legitimate control input).\n\n/**\n * rescue (alias `catchError`): replace an upstream ERROR with a recovered value. On source DATA →\n * forward; on source ERROR → emit `recover(err)` as DATA (if `recover` throws, forward THAT as\n * ERROR); on source COMPLETE → COMPLETE. After recovery the source is terminal-errored (dead) so no\n * further values flow — the recovered value is the final cached value (matches the frozen pure-ts\n * reference; it does NOT auto-COMPLETE, RxJS-`catchError(()=>of(x))` divergence, flagged).\n * @param recover - recover value used by the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { rescue } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function rescue<S>(recover: (err: unknown) => S): Operator<S, S> {\n\treturn {\n\t\tfactory: \"rescue\",\n\t\topts: {\n\t\t\terrorWhenDepsError: false,\n\t\t\tcompleteWhenDepsComplete: false,\n\t\t\tterminalAsRealInput: true,\n\t\t},\n\t\tbody: (ctx) => {\n\t\t\tconst b = depBatch(ctx, 0);\n\t\t\tconst terminal = depTerminal(ctx, 0);\n\t\t\tif (b) for (const v of b) ctx.down([[\"DATA\", v]]);\n\t\t\tif (isTerminalComplete(terminal)) {\n\t\t\t\tctx.down([[\"COMPLETE\"]]);\n\t\t\t} else if (isTerminalError(terminal)) {\n\t\t\t\t// ERROR payload absorbed → recover.\n\t\t\t\ttry {\n\t\t\t\t\tctx.down([[\"DATA\", recover(terminalErrorValue(terminal))]]);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tctx.down([[\"ERROR\", errorPayload(e, \"rescue threw without a valid error payload\")]]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n\n/** catchError: RxJS-named alias of {@link rescue}. */\nexport const catchError = rescue;\n\n/** Options for {@link valve}. */\nexport interface ValveOpts {\n\t/**\n\t * Optional AbortController (or a `() => AbortController | undefined` factory): on the control's\n\t * truthy→falsy edge, `valve` calls `controller.abort()` — cancel an in-flight async boundary\n\t * (LLM/fetch) the caller threaded `controller.signal` into. An external-resource cleanup (like\n\t * `ctx.onDeactivation`), NOT an imperative reactive trigger (R-no-imperative).\n\t */\n\tabortInFlight?: AbortController | (() => AbortController | undefined);\n}\n\n/**\n * valve: forward the source's DATA only while `control` (dep 1) is truthy; when closed, stay quiet\n * (undirty RESOLVED). `[source, control]` declared deps + `partial:true` (the control wave can fire\n * before the source ever delivers). `completeWhenDepsComplete:false` — closing the gate (control\n * terminating) does NOT complete the valve; only the SOURCE's terminal (read via\n * `terminalAsRealInput`) is forwarded. The `state`-verb control input is a legitimate external\n * boundary (D4 / D54), not a forbidden imperative trigger.\n * @param opts - Options that configure the helper.\n * @returns A `Operator<S, S>` value.\n * @category operators\n * @example\n * ```ts\n * import { valve } from \"@graphrefly/ts/operators\";\n * ```\n */\nexport function valve<S>(opts?: ValveOpts): Operator<S, S> {\n\tconst abortInFlight = opts?.abortInFlight;\n\treturn {\n\t\tfactory: \"valve\",\n\t\topts: { partial: true, completeWhenDepsComplete: false, terminalAsRealInput: true },\n\t\tbody: (ctx) => {\n\t\t\tconst srcBatch = depBatch(ctx, 0);\n\t\t\tconst ctlBatch = depBatch(ctx, 1);\n\t\t\tconst srcTerminal = depTerminal(ctx, 0);\n\t\t\tconst controlValue = depLatest(ctx, 1) as boolean | undefined;\n\n\t\t\tif (abortInFlight != null) {\n\t\t\t\t// Fire abort on the truthy→falsy edge only (never on activation / no prior state).\n\t\t\t\tconst prev = ctx.state.get<{ ctl: boolean | undefined }>();\n\t\t\t\tif (prev?.ctl === true && !controlValue) {\n\t\t\t\t\tconst c = typeof abortInFlight === \"function\" ? abortInFlight() : abortInFlight;\n\t\t\t\t\tc?.abort();\n\t\t\t\t}\n\t\t\t\tctx.state.set({\n\t\t\t\t\tctl: controlValue === true ? true : controlValue == null ? undefined : false,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Source terminal forwarding (control terminal is absorbed by completeWhenDepsComplete:false).\n\t\t\tif (isTerminalComplete(srcTerminal)) {\n\t\t\t\tctx.down([[\"COMPLETE\"]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (isTerminalError(srcTerminal)) {\n\t\t\t\tctx.down([[\"ERROR\", terminalErrorValue(srcTerminal)]]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!controlValue) return; // gate closed → quiet (undirty RESOLVED)\n\n\t\t\tif (srcBatch && srcBatch.length > 0) {\n\t\t\t\tfor (const v of srcBatch) ctx.down([[\"DATA\", v]]);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Gate just opened this wave (control fired, source didn't): re-emit the last source value.\n\t\t\tconst srcLatest = depLatest(ctx, 0);\n\t\t\tif (ctlBatch && ctlBatch.length > 0 && srcLatest !== undefined) {\n\t\t\t\tctx.down([[\"DATA\", srcLatest as S]]);\n\t\t\t}\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["last"]}
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "./chunk-UYN5H2LW.js";
|
|
23
23
|
import {
|
|
24
24
|
timeout
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-T3YMFLRH.js";
|
|
26
26
|
import {
|
|
27
27
|
nextRetryDelayMs,
|
|
28
28
|
retryPolicy,
|
|
@@ -4176,4 +4176,4 @@ export {
|
|
|
4176
4176
|
constantBackoff,
|
|
4177
4177
|
scheduledReadinessProjector
|
|
4178
4178
|
};
|
|
4179
|
-
//# sourceMappingURL=chunk-
|
|
4179
|
+
//# sourceMappingURL=chunk-BOWKPNXS.js.map
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
graph,
|
|
3
3
|
restoreNodeInGraph,
|
|
4
4
|
restoreStateNodeInGraph
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TWOPVCGK.js";
|
|
6
6
|
import {
|
|
7
7
|
tieredReadThrough
|
|
8
8
|
} from "./chunk-K42TQZPV.js";
|
|
@@ -11,17 +11,17 @@ import {
|
|
|
11
11
|
reactiveLog,
|
|
12
12
|
restoreReactiveIndexFromBackendState,
|
|
13
13
|
restoreReactiveMapFromBackendState
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-2U4G3PEU.js";
|
|
15
15
|
import {
|
|
16
16
|
timer
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-HFPPLLLQ.js";
|
|
18
18
|
import {
|
|
19
19
|
GRAPH_CHECKPOINT_VERSION,
|
|
20
20
|
map,
|
|
21
21
|
operatorNodeFn,
|
|
22
22
|
take,
|
|
23
23
|
toCheckpointJson
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-3KYPNNBH.js";
|
|
25
25
|
import {
|
|
26
26
|
restoreStateOfNode,
|
|
27
27
|
validateNodeVersionJson
|
|
@@ -1482,4 +1482,4 @@ export {
|
|
|
1482
1482
|
restoreGraph,
|
|
1483
1483
|
workerDerived
|
|
1484
1484
|
};
|
|
1485
|
-
//# sourceMappingURL=chunk-
|
|
1485
|
+
//# sourceMappingURL=chunk-G3J4KZLK.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
initNode,
|
|
3
3
|
toCheckpointJson
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3KYPNNBH.js";
|
|
5
5
|
import {
|
|
6
6
|
errorPayload
|
|
7
7
|
} from "./chunk-4GKAT72H.js";
|
|
@@ -768,4 +768,4 @@ export {
|
|
|
768
768
|
firstValueFrom,
|
|
769
769
|
singleFromAny
|
|
770
770
|
};
|
|
771
|
-
//# sourceMappingURL=chunk-
|
|
771
|
+
//# sourceMappingURL=chunk-HFPPLLLQ.js.map
|