doxum 0.1.21 → 0.1.23

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.
Files changed (72) hide show
  1. package/README.md +35 -7
  2. package/dist/{advanced-FgdTwu5b.d.ts → advanced-CLJCWkHa.d.cts} +3 -3
  3. package/dist/{advanced-COFJtWMT.js → advanced-CRNHfJBu.js} +482 -446
  4. package/dist/advanced-CRNHfJBu.js.map +1 -0
  5. package/dist/{advanced-BRL5pN0y.cjs → advanced-Cle5g3B4.cjs} +615 -459
  6. package/dist/advanced-Cle5g3B4.cjs.map +1 -0
  7. package/dist/{advanced-DfKc7TZR.d.cts → advanced-d6J61er9.d.ts} +3 -3
  8. package/dist/advanced.cjs +1 -1
  9. package/dist/advanced.d.cts +1 -1
  10. package/dist/advanced.d.ts +1 -1
  11. package/dist/advanced.js +1 -1
  12. package/dist/context-BcLKGfq8.cjs +149 -0
  13. package/dist/context-BcLKGfq8.cjs.map +1 -0
  14. package/dist/context-DFEaDUv5.js +84 -0
  15. package/dist/context-DFEaDUv5.js.map +1 -0
  16. package/dist/{contract-CdmDHRUq.d.cts → contract-SYJFP0lM.d.cts} +62 -88
  17. package/dist/{contract-KG5XnQZt.d.ts → contract-ULPQmiEs.d.ts} +62 -88
  18. package/dist/driver-BD3DQOW6.cjs +382 -0
  19. package/dist/driver-BD3DQOW6.cjs.map +1 -0
  20. package/dist/{driver-CLYJOGDQ.js → driver-yFfvDMX5.js} +155 -26
  21. package/dist/driver-yFfvDMX5.js.map +1 -0
  22. package/dist/index.cjs +2370 -406
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +6 -5
  25. package/dist/index.d.ts +6 -5
  26. package/dist/index.js +2293 -330
  27. package/dist/index.js.map +1 -1
  28. package/dist/local-sync.cjs +5 -5
  29. package/dist/local-sync.cjs.map +1 -1
  30. package/dist/local-sync.d.cts +1 -1
  31. package/dist/local-sync.d.ts +1 -1
  32. package/dist/local-sync.js +2 -2
  33. package/dist/local-sync.js.map +1 -1
  34. package/dist/react.cjs +2 -69
  35. package/dist/react.cjs.map +1 -1
  36. package/dist/react.d.cts +0 -1
  37. package/dist/react.d.ts +1 -2
  38. package/dist/react.js +3 -70
  39. package/dist/react.js.map +1 -1
  40. package/package.json +1 -6
  41. package/skills/doxum-runtime/SKILL.md +7 -1
  42. package/skills/doxum-runtime/references/guide.en.md +17 -6
  43. package/skills/doxum-runtime/references/guide.zh-CN.md +15 -5
  44. package/skills/doxum-runtime/references/invariants.en.md +5 -3
  45. package/skills/doxum-runtime/references/invariants.zh-CN.md +4 -3
  46. package/skills/doxum-runtime/references/projections.en.md +5 -0
  47. package/skills/doxum-runtime/references/projections.zh-CN.md +5 -0
  48. package/dist/access-BeSV5ve-.js +0 -816
  49. package/dist/access-BeSV5ve-.js.map +0 -1
  50. package/dist/access-Bienf28h.cjs +0 -911
  51. package/dist/access-Bienf28h.cjs.map +0 -1
  52. package/dist/advanced-BRL5pN0y.cjs.map +0 -1
  53. package/dist/advanced-COFJtWMT.js.map +0 -1
  54. package/dist/driver-CLYJOGDQ.js.map +0 -1
  55. package/dist/driver-Djr3BVvo.cjs +0 -241
  56. package/dist/driver-Djr3BVvo.cjs.map +0 -1
  57. package/dist/integration-C4Isp8lJ.js +0 -26
  58. package/dist/integration-C4Isp8lJ.js.map +0 -1
  59. package/dist/integration-Z6MsfFI7.cjs +0 -31
  60. package/dist/integration-Z6MsfFI7.cjs.map +0 -1
  61. package/dist/integration.cjs +0 -12
  62. package/dist/integration.d.cts +0 -17
  63. package/dist/integration.d.ts +0 -17
  64. package/dist/integration.js +0 -4
  65. package/dist/issue-DjK1xp5K.cjs +0 -881
  66. package/dist/issue-DjK1xp5K.cjs.map +0 -1
  67. package/dist/issue-W0hT8u8D.js +0 -642
  68. package/dist/issue-W0hT8u8D.js.map +0 -1
  69. package/dist/notification-Bkjau6B6.js +0 -232
  70. package/dist/notification-Bkjau6B6.js.map +0 -1
  71. package/dist/notification-DJfouMEb.cjs +0 -309
  72. package/dist/notification-DJfouMEb.cjs.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["target.belongs","target.affected","anchor.toArray","anchor.indexedKeys","anchor.equal","anchor.indexedKeys","anchor.matches","read","readAddress"],"sources":["../core/src/impact.ts","../core/src/history.ts","../core/src/mutation/state.ts","../core/src/mutation/recorder.ts","../core/src/mutation/session.ts","../core/src/mutation/operations/replay.ts","../core/src/runtime.ts","../core/src/runtime/readable.ts","../core/src/projection/select.ts","../core/src/projection/value-output.ts","../core/src/projection/processor.ts","../core/src/projection/projection-readable.ts","../core/src/projection/source.ts","../core/src/projection/runtime.ts"],"sourcesContent":["import type {\n CollectionId,\n CollectionPath,\n CollectionSelector,\n ObjectNode,\n ImpactTarget,\n PathPick,\n SchemaPath,\n} from './schema';\nimport { compilePath } from './schema';\nimport type { ChangeSet } from './changes';\nimport { AddressIndex, contains } from './address';\nimport * as target from './impact-target';\nimport { profile } from './profile';\n\nexport type CollectionImpact<K> =\n | { readonly kind: 'reset' }\n | {\n readonly kind: 'incremental';\n readonly added: ReadonlySet<K>;\n readonly removed: ReadonlySet<K>;\n readonly updated: ReadonlySet<K>;\n readonly orderChanged: boolean;\n };\nexport type DocumentImpact<S extends ObjectNode> = {\n readonly kind: 'incremental' | 'reset';\n affects(pick: PathPick<S>): boolean;\n collection<P extends CollectionPath>(\n pick: (path: SchemaPath<S['shape']>) => P\n ): CollectionImpact<CollectionId<P>>;\n};\ntype ImpactQueries = {\n affects(value: ImpactTarget): boolean;\n collection(selector: CollectionSelector): CollectionImpact<string>;\n};\nconst queries = new WeakMap<object, ImpactQueries>();\nexport const affectsTarget = (impact: object, value: ImpactTarget): boolean =>\n queries.get(impact)!.affects(value);\nexport const collectionImpact = <K extends string>(\n impact: object,\n selector: CollectionSelector<K>\n): CollectionImpact<K> => queries.get(impact)!.collection(selector) as CollectionImpact<K>;\nexport const createImpact = <S extends ObjectNode>(\n schema: S,\n changes: ChangeSet\n): DocumentImpact<S> => {\n const reset = changes.changes.some(change => change.kind === 'reset');\n let values: AddressIndex<true> | undefined;\n let orders: AddressIndex<true> | undefined;\n const index = () => {\n if (!values) {\n profile.impact.index();\n values = new AddressIndex();\n orders = new AddressIndex();\n for (const change of changes.changes) {\n if (change.kind === 'members') {\n for (const member of change.members) values.add(change.at, true, member.key);\n if (change.order) orders.add(change.at, true);\n } else if (change.kind === 'tree') values.add(change.at, true);\n }\n }\n return values;\n };\n const cache = new Map<string, CollectionImpact<string>>();\n const implementation: ImpactQueries = {\n affects(value) {\n profile.impact.affects();\n if (!target.belongs(value, schema)) return false;\n if (reset) return true;\n return target.affected(value, index(), orders!);\n },\n collection(selector) {\n if (selector.schema !== schema)\n throw new TypeError('Collection belongs to another root model.');\n const key = JSON.stringify(selector.address),\n cached = cache.get(key);\n if (cached) return cached;\n if (reset) {\n const result = { kind: 'reset' } as const;\n cache.set(key, result);\n return result;\n }\n const at = selector.address;\n const added = new Set<string>(),\n removed = new Set<string>(),\n updated = new Set<string>();\n let orderChanged = false;\n for (const change of changes.changes) {\n if (change.kind === 'reset') continue;\n if (change.kind === 'members') {\n if (change.at.length < at.length && contains(change.at, at)) {\n if (change.members.some(member => member.key === at[change.at.length])) {\n const result = { kind: 'reset' } as const;\n cache.set(key, result);\n return result;\n }\n } else if (contains(at, change.at)) {\n if (change.at.length === at.length) {\n if (change.order) {\n const positions = new Map(change.order.after.map((id, i) => [id, i]));\n let previous = -1;\n for (const id of change.order.before) {\n const position = positions.get(id);\n if (position === undefined) continue;\n if (position < previous) orderChanged = true;\n previous = position;\n }\n }\n for (const member of change.members) {\n if (member.kind === 'added') added.add(member.key);\n else if (member.kind === 'removed') removed.add(member.key);\n else updated.add(member.key);\n }\n } else updated.add(change.at[at.length]);\n }\n continue;\n }\n if (change.kind === 'tree' && contains(change.at, at)) {\n const result = { kind: 'reset' } as const;\n cache.set(key, result);\n return result;\n }\n if (!contains(at, change.at)) continue;\n if (change.at.length === at.length) continue;\n const id = change.at[at.length];\n updated.add(id);\n }\n added.forEach(id => updated.delete(id));\n removed.forEach(id => updated.delete(id));\n const result = { kind: 'incremental', added, removed, updated, orderChanged } as const;\n cache.set(key, result);\n return result;\n },\n };\n const impact: DocumentImpact<S> = Object.freeze({\n kind: reset ? 'reset' : 'incremental',\n affects: (pick: PathPick<S>) =>\n implementation.affects(compilePath<S['shape']>(schema, 'value', pick)),\n collection: <P extends CollectionPath>(pick: (path: SchemaPath<S['shape']>) => P) =>\n implementation.collection(\n compilePath<S['shape']>(schema, 'collection', pick) as CollectionSelector\n ) as CollectionImpact<CollectionId<P>>,\n });\n queries.set(impact, implementation);\n return impact;\n};\n","import type { ChangeSet, ChangeDirection } from './changes';\nimport type {\n HistoryState,\n LocalHistory,\n ObserverError,\n OperationResult,\n} from './runtime/contract';\nimport { DocumentDisposedError } from './runtime/contract';\n\ntype Entry = { readonly batches: ChangeSet[] };\ntype Group = { entry?: Entry; readonly undos: Entry[]; readonly redos: Entry[] };\n\nexport const createHistory = <TCommit>(input: {\n readonly capacity: number;\n readonly apply: (\n changes: readonly ChangeSet[],\n direction: ChangeDirection\n ) => OperationResult<TCommit>;\n readonly revision: () => number;\n readonly assertIdle: () => void;\n readonly notify: (run: () => readonly ObserverError[]) => readonly ObserverError[];\n}) => {\n let undos: Entry[] = [];\n let redos: Entry[] = [];\n const listeners = new Set<() => void>();\n let state: HistoryState = Object.freeze({ undoDepth: 0, redoDepth: 0 });\n let revision = 0;\n let pending = false;\n let disposed = false;\n let group: Group | undefined;\n const unchanged = (): OperationResult<TCommit> => ({\n status: 'unchanged',\n revision: input.revision(),\n });\n const publish = () => {\n if (state.undoDepth === undos.length && state.redoDepth === redos.length) return;\n state = Object.freeze({ undoDepth: undos.length, redoDepth: redos.length });\n revision++;\n pending = true;\n };\n const flush = (): readonly ObserverError[] => {\n if (!pending) return [];\n pending = false;\n const errors: ObserverError[] = [];\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue;\n try {\n listener();\n } catch (error) {\n errors.push({ phase: 'listener', error });\n }\n }\n return errors;\n };\n const clear = () => {\n group = undefined;\n undos.length = redos.length = 0;\n publish();\n };\n const travel = (direction: 'undo' | 'redo' | 'cancel'): OperationResult<TCommit> => {\n input.assertIdle();\n const from = direction === 'redo' ? redos : undos;\n const to = direction === 'redo' ? undos : redos;\n const previousUndos = undos;\n const previousRedos = redos;\n const entry = direction === 'cancel' ? from.at(-1) : from.pop();\n if (!entry) return unchanged();\n if (direction === 'cancel') {\n if (!group || group.entry !== entry)\n throw new Error('History group no longer owns its entry.');\n undos = group.undos;\n redos = group.redos;\n } else to.push(entry);\n let committed = false;\n try {\n const changes = direction === 'redo' ? entry.batches : entry.batches.slice().reverse();\n const result = input.apply(changes, direction === 'redo' ? 'forward' : 'backward');\n committed = result.status !== 'rejected';\n if (committed && direction === 'cancel') group = undefined;\n if (result.status === 'unchanged') {\n publish();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n }\n return result;\n } finally {\n if (!committed) {\n if (direction === 'cancel') {\n undos = previousUndos;\n redos = previousRedos;\n } else {\n to.pop();\n from.push(entry);\n }\n }\n }\n };\n const api: LocalHistory<TCommit> = {\n current: () => state,\n revision: () => revision,\n subscribe: listener => {\n if (disposed) throw new DocumentDisposedError();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n undo: () => {\n input.assertIdle();\n group = undefined;\n return travel('undo');\n },\n redo: () => {\n input.assertIdle();\n group = undefined;\n return travel('redo');\n },\n clear: () => {\n input.assertIdle();\n clear();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n },\n group: () => {\n input.assertIdle();\n if (group) throw new Error('A history group is already active.');\n if (input.capacity <= 0) throw new Error('History is disabled.');\n const scope: Group = { undos: undos.slice(), redos: redos.slice() };\n group = scope;\n return Object.freeze({\n end: () => {\n input.assertIdle();\n if (group === scope) group = undefined;\n },\n cancel: () => {\n input.assertIdle();\n if (group !== scope) return unchanged();\n if (!scope.entry) {\n group = undefined;\n return unchanged();\n }\n const result = travel('cancel');\n if (result.status !== 'rejected') group = undefined;\n return result;\n },\n });\n },\n };\n return {\n api,\n record: (batch: ChangeSet) => {\n if (input.capacity <= 0) return;\n if (group?.entry) group.entry.batches.push(batch);\n else {\n const entry: Entry = { batches: [batch] };\n undos.push(entry);\n if (group) group.entry = entry;\n if (undos.length > input.capacity) undos.shift();\n }\n redos.length = 0;\n publish();\n },\n publish,\n flush,\n endGroup: () => {\n group = undefined;\n },\n invalidate: clear,\n dispose: () => {\n disposed = true;\n listeners.clear();\n clear();\n pending = false;\n },\n };\n};\n","import type { DocumentNode, ObjectNode } from '../schema';\nimport * as anchor from './anchor';\n\nexport type CanonicalState = { schema: ObjectNode; document: unknown };\n\n/** Install validated values, or captured before values during rollback. */\nexport const installMember = (\n parent: Record<string, unknown> | unknown[],\n key: string | number,\n present: boolean,\n value: unknown\n): void => {\n if (Array.isArray(parent)) {\n const index = Number(key);\n if (present) {\n if (index < 0) anchor.insert(parent, parent.length, value);\n else parent[index] = value;\n } else if (index >= 0) anchor.remove(parent, index);\n } else if (!present) delete parent[key];\n else if (Object.hasOwn(parent, key)) parent[key] = value;\n else\n Object.defineProperty(parent, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: true,\n });\n};\n\nexport const orderOf = (node: DocumentNode, value: unknown): string[] => {\n if (node.kind === 'list')\n return anchor.toArray(anchor.indexedKeys(value as unknown[], node.keyOf));\n if (node.kind === 'table') return [...(value as { ids: string[] }).ids];\n throw new Error('Order requires a table or list.');\n};\n\nexport const installOrder = (\n node: DocumentNode,\n value: unknown,\n order: readonly string[]\n): void => {\n if (node.kind === 'list') anchor.install(value as unknown[], node.keyOf, order);\n else if (node.kind === 'table') (value as { ids: string[] }).ids = [...order];\n else throw new Error('Order requires a table or list.');\n};\n","import type { Change, ChangeSet, MemberChange } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport {\n AddressIndex,\n contains,\n resolveValue,\n resolveLocated,\n memberKey,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n type CompiledMember,\n compiledShape,\n type FixedLayout,\n} from '../address';\nimport * as anchor from './anchor';\nimport { copyValue, equalValue } from '../schema-value';\nimport type { MutableTree, MutableTreeNode } from './tree';\nimport { profile } from '../profile';\nimport { sealChanges } from './changes';\nimport { installMember, installOrder, orderOf, type CanonicalState } from './state';\ntype MemberFact = { key: string; node: DocumentNode; present: boolean; value: unknown };\ntype MemberGroup = {\n kind: 'members';\n at: DocumentAddress;\n node: DocumentNode;\n parent: Record<string, unknown> | unknown[];\n value: unknown;\n order?: readonly string[];\n} & (\n | { layout: 'fixed'; definitions: FixedLayout['members']; members: (MemberFact | undefined)[] }\n | { layout: 'dynamic'; members: Map<string, MemberFact> | undefined }\n);\ntype TreeFact = {\n kind: 'tree';\n at: DocumentAddress;\n before: string | null;\n nodes: Map<string, MutableTreeNode | undefined>;\n};\ntype Fact = MemberGroup | TreeFact;\ntype RestoreFact =\n | { kind: 'order'; at: DocumentAddress; group: MemberGroup }\n | TreeFact\n | { kind: 'member'; at: DocumentAddress; group: MemberGroup; member: MemberFact };\nconst firstMember = (group: MemberGroup, key: string): MemberFact | undefined => {\n if (group.layout === 'dynamic') return group.members?.get(key);\n const member = group.definitions.get(key);\n return member && group.members[member.slot];\n};\n\nconst forgetMember = (group: MemberGroup, key: string): void => {\n if (group.layout === 'dynamic') group.members?.delete(key);\n else {\n const definition = group.definitions.get(key);\n if (definition) group.members[definition.slot] = undefined;\n }\n};\nconst emptyGroup = (group: MemberGroup): boolean =>\n !group.order && (group.layout === 'fixed' ? !group.members.some(Boolean) : !group.members?.size);\n\nconst copyNode = (node: MutableTreeNode): MutableTreeNode => ({\n ...node,\n children: [...node.children],\n});\nconst transition = (\n node: DocumentNode,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): MemberChange | undefined => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (node.kind !== 'field' && beforePresent === afterPresent && equalValue(node, before, after))\n return;\n const value = afterPresent ? (node.kind === 'field' ? after : copyValue(node, after)) : undefined;\n profile.recorder('transitions');\n return !beforePresent\n ? { key, kind: 'added', after: value }\n : !afterPresent\n ? { key, kind: 'removed', before }\n : { key, kind: 'updated', before, after: value };\n};\n\nconst publishMembers = (\n changes: Change[],\n at: DocumentAddress,\n members: MemberChange[],\n order?: { before: readonly string[]; after: readonly string[] }\n): void => {\n if (!members.length && !order) return;\n for (let i = 1; i < members.length; i++)\n if (members[i - 1].key > members[i].key) {\n members.sort((a, b) => lexical(a.key, b.key));\n break;\n }\n changes.push(order ? { kind: 'members', at, members, order } : { kind: 'members', at, members });\n};\n\n/** Diff only the captured subtree; this algorithm has no recorder or session state. */\nconst diffMember = (\n changes: Change[],\n members: MemberChange[],\n node: DocumentNode,\n at: DocumentAddress,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): void => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (beforePresent && afterPresent && before !== undefined && after !== undefined) {\n const sameShape =\n node.kind === 'object' ||\n (node.kind === 'variant' &&\n (before as Record<string, unknown>)[node.tag] ===\n (after as Record<string, unknown>)[node.tag]);\n if (sameShape) {\n const left = before as Record<string, unknown>,\n right = after as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const [child, definition] of compiledShape(node, before)!.members)\n diffMember(\n changes,\n children,\n definition.node,\n childAt,\n child,\n Object.hasOwn(left, child),\n left[child],\n Object.hasOwn(right, child),\n right[child]\n );\n publishMembers(changes, childAt, children);\n return;\n }\n if (node.kind === 'map' || node.kind === 'table') {\n const a = before as Record<string, unknown>,\n b = after as typeof a;\n const left = (node.kind === 'table' ? a.byId : a) as Record<string, unknown>;\n const right = (node.kind === 'table' ? b.byId : b) as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const id of Object.keys(left))\n diffMember(\n changes,\n children,\n node.value,\n childAt,\n id,\n true,\n left[id],\n Object.hasOwn(right, id),\n right[id]\n );\n for (const id of Object.keys(right))\n if (!Object.hasOwn(left, id))\n diffMember(changes, children, node.value, childAt, id, false, undefined, true, right[id]);\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (node.kind === 'table' && !anchor.equal(a.ids as string[], b.ids as string[])) {\n profile.recorder('publishedOrderItems', (b.ids as string[]).length);\n order = { before: a.ids as string[], after: [...(b.ids as string[])] };\n }\n publishMembers(changes, childAt, children, order);\n return;\n }\n }\n const member = transition(node, key, beforePresent, before, afterPresent, after);\n if (member) members.push(member);\n};\nconst restore = (fact: RestoreFact, schema: DocumentNode, root: unknown, skip = 0): unknown => {\n const at = skip ? fact.at.slice(skip) : fact.at;\n if (fact.kind === 'member') {\n const member = fact.member;\n const value = member.present ? copyValue(member.node, member.value) : undefined;\n if (!at.length) return value;\n const location = resolveLocated(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved member.');\n installMember(location.parent, location.key, member.present, value);\n return root;\n }\n const location = resolveValue(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved subtree.');\n if (fact.kind === 'order') installOrder(location.node, location.value, fact.group.order!);\n else {\n const tree = location.value as MutableTree;\n if (fact.before === null) delete tree.rootId;\n else tree.rootId = fact.before;\n for (const [id, node] of fact.nodes)\n installMember(tree.nodes, id, node !== undefined, node && copyNode(node));\n }\n return root;\n};\n\nconst reconstructBefore = (\n node: DocumentNode,\n current: unknown,\n records: readonly RestoreFact[],\n offset: number\n): unknown => {\n let before = copyValue(node, current);\n for (let i = records.length - 1; i >= 0; i--)\n if (records[i].kind !== 'order') before = restore(records[i], node, before, offset);\n for (const record of records)\n if (record.kind === 'order') before = restore(record, node, before, offset);\n return before;\n};\n\nconst sealMembers = (fact: MemberGroup, changes: Change[]): void => {\n const members: MemberChange[] = [];\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const key = memberKey(fact, member.key);\n const present = Object.hasOwn(fact.parent, key);\n const value = (fact.parent as Record<string | number, unknown>)[key];\n if (member.node.kind === 'field') {\n const change = transition(\n member.node,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n if (change) members.push(change);\n } else\n diffMember(\n changes,\n members,\n member.node,\n fact.at,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n }\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (fact.order) {\n const current =\n fact.node.kind === 'list'\n ? anchor.indexedKeys(fact.value as unknown[], fact.node.keyOf)\n : (fact.value as { ids: string[] }).ids;\n if (!anchor.equal(fact.order, current)) {\n const after = orderOf(fact.node, fact.value);\n profile.recorder('publishedOrderItems', after.length);\n order = { before: fact.order, after };\n }\n }\n publishMembers(changes, fact.at, members, order);\n};\n\nconst sealTree = (fact: TreeFact, state: CanonicalState, changes: Change[]): void => {\n const location = resolveValue(state.schema, state.document, fact.at);\n const tree = location?.value as MutableTree;\n const node = location?.node;\n if (node?.kind !== 'tree') throw new Error('Tree schema disappeared before sealing.');\n const nodes: Extract<Change, { kind: 'tree' }>['nodes'][number][] = [];\n for (const [id, before] of fact.nodes) {\n const after = Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : undefined;\n if (!before && !after) continue;\n if (\n before &&\n after &&\n before.parentId === after.parentId &&\n anchor.equal(before.children, after.children) &&\n Object.hasOwn(before, 'value') === Object.hasOwn(after, 'value') &&\n equalValue(node.value, before.value, after.value)\n )\n continue;\n nodes.push(\n !before\n ? { id, kind: 'added', after: copyNode(after!) }\n : !after\n ? { id, kind: 'removed', before }\n : { id, kind: 'updated', before, after: copyNode(after) }\n );\n }\n const after = tree.rootId ?? null;\n if (nodes.length || fact.before !== after)\n changes.push({\n kind: 'tree',\n at: fact.at,\n before: fact.before,\n after,\n nodes: nodes.sort((a, b) => lexical(a.id, b.id)),\n });\n};\n\n/** One first-touch record per owning container, never a per-write operation log. */\nexport class ChangeRecorder {\n private readonly facts = new Set<Fact>();\n private groups = new WeakMap<object, MemberGroup>();\n private index?: AddressIndex<Fact>;\n private indexedGroups = false;\n private resetBefore?: { value: unknown };\n constructor(private readonly state: CanonicalState) {}\n private indexGroups(): AddressIndex<Fact> {\n const index = (this.index ??= new AddressIndex());\n if (!this.indexedGroups) {\n this.indexedGroups = true;\n for (const fact of this.facts) {\n if (fact.kind === 'members') {\n index.add(fact.at, fact);\n profile.recorder('indexedGroups');\n }\n }\n }\n return index;\n }\n private covered(at: DocumentAddress): boolean {\n return (\n this.resetBefore !== undefined ||\n (this.indexedGroups &&\n this.index!.someAncestor(\n at,\n fact =>\n fact.kind === 'members' &&\n fact.at.length < at.length &&\n firstMember(fact, at[fact.at.length]) !== undefined\n ))\n );\n }\n private absorb(\n at: DocumentAddress,\n node: DocumentNode,\n value: unknown,\n present: boolean\n ): unknown {\n const index = this.indexGroups();\n const children: RestoreFact[] = [];\n index.query(fact => {\n if (fact.kind === 'members') {\n // An ancestor group can contribute only its one directly addressed member.\n if (fact.at.length < at.length) {\n if (fact.at.length + 1 === at.length) {\n const member = firstMember(fact, at[fact.at.length]);\n if (member) children.push({ kind: 'member', at, group: fact, member });\n }\n return;\n }\n if (fact.order && contains(at, fact.at))\n children.push({ kind: 'order', at: fact.at, group: fact });\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const memberAt = fact.at.concat(member.key);\n if (contains(at, memberAt))\n children.push({ kind: 'member', at: memberAt, group: fact, member });\n }\n } else if (contains(at, fact.at)) children.push(fact);\n })(at);\n if (present) value = reconstructBefore(node, value, children, at.length);\n this.releaseCovered(children);\n return value;\n }\n private releaseCovered(children: readonly RestoreFact[]): void {\n let changedGroups: Set<MemberGroup> | undefined;\n for (const child of children) {\n profile.recorder('absorbed');\n if (child.kind === 'member') {\n const { group, member } = child;\n forgetMember(group, member.key);\n (changedGroups ??= new Set()).add(group);\n } else if (child.kind === 'order') {\n child.group.order = undefined;\n (changedGroups ??= new Set()).add(child.group);\n } else {\n this.unregister(child);\n }\n }\n for (const group of changedGroups ?? []) {\n if (emptyGroup(group)) {\n this.unregister(group);\n }\n }\n }\n private register(fact: Fact): void {\n this.facts.add(fact);\n if (fact.kind === 'members') {\n this.groups.set(fact.parent, fact);\n profile.recorder('groups');\n if (!this.indexedGroups) return;\n profile.recorder('indexedGroups');\n }\n (this.index ??= new AddressIndex()).add(fact.at, fact);\n }\n private unregister(fact: Fact): void {\n this.facts.delete(fact);\n this.index?.delete(fact.at, fact);\n if (fact.kind === 'members') this.groups.delete(fact.parent);\n }\n member(\n container: ResolvedContainer,\n key: string,\n definition: CompiledMember,\n physicalKey: string | number\n ): void {\n if (this.resetBefore) return;\n const { node } = definition;\n let group = this.groups.get(container.parent);\n if (group?.layout === 'dynamic' && group.members?.has(key)) return;\n if (group?.layout === 'fixed' && definition.kind === 'fixed' && group.members[definition.slot])\n return;\n const at = this.indexedGroups || node.kind !== 'field' ? container.at.concat(key) : undefined;\n if (at && this.covered(at)) return;\n const present = Object.hasOwn(container.parent, physicalKey);\n let value = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (node.kind !== 'field') value = this.absorb(at!, node, value, present);\n if (!group || !this.facts.has(group)) {\n group = this.createGroup(container);\n }\n const member: MemberFact = { key, node, present, value };\n if (group.layout === 'dynamic') (group.members ??= new Map()).set(key, member);\n else if (definition.kind === 'fixed') group.members[definition.slot] = member;\n else throw new Error('A fixed member group requires a fixed schema member.');\n profile.recorder('facts');\n }\n reset(): void {\n if (this.resetBefore) return;\n const value = this.absorb([], this.state.schema, this.state.document, true);\n this.resetBefore = { value };\n this.groups = new WeakMap();\n profile.recorder('facts');\n }\n private createGroup(container: ResolvedContainer): MemberGroup {\n const group: MemberGroup =\n container.layout.kind === 'fixed'\n ? {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'fixed',\n definitions: container.layout.members,\n members: new Array<MemberFact | undefined>(container.layout.members.size),\n }\n : {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'dynamic',\n members: undefined,\n };\n this.register(group);\n return group;\n }\n order(container: ResolvedContainer): void {\n profile.recorder('orderCaptures');\n let group = this.groups.get(container.parent);\n if (group?.order || this.covered(container.at)) return;\n group ??= this.createGroup(container);\n group.order = orderOf(container.node, container.value);\n profile.recorder('orderSnapshots');\n profile.recorder('orderItems', group.order.length);\n }\n tree(container: ResolvedTreeContainer, id?: string): void {\n const { at, value: tree } = container;\n if (this.covered(at)) return;\n const index = (this.index ??= new AddressIndex());\n let fact: TreeFact | undefined;\n for (const item of index.exact(at) ?? []) if (item.kind === 'tree') fact = item;\n if (!fact) {\n fact = { kind: 'tree', at, before: tree.rootId ?? null, nodes: new Map() };\n this.register(fact);\n }\n if (id !== undefined && !fact.nodes.has(id)) {\n profile.recorder('treeNodes');\n fact.nodes.set(id, Object.hasOwn(tree.nodes, id) ? copyNode(tree.nodes[id]) : undefined);\n }\n }\n rollback(): void {\n if (this.resetBefore) {\n this.state.document = this.resetBefore.value;\n return;\n }\n const facts = [...this.facts];\n for (let i = facts.length - 1; i >= 0; i--) {\n const fact = facts[i];\n if (fact.kind === 'members') {\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n installMember(\n fact.parent,\n memberKey(fact, member.key),\n member.present,\n member.present ? copyValue(member.node, member.value) : undefined\n );\n }\n } else if (fact.kind === 'tree') restore(fact, this.state.schema, this.state.document);\n }\n for (const fact of facts)\n if (fact.kind === 'members' && fact.order) installOrder(fact.node, fact.value, fact.order);\n }\n seal(): ChangeSet {\n if (this.resetBefore) {\n if (equalValue(this.state.schema, this.resetBefore.value, this.state.document))\n return sealChanges([]);\n profile.recorder('sealed');\n return sealChanges([\n {\n kind: 'reset',\n before: this.resetBefore.value,\n after: copyValue(this.state.schema, this.state.document),\n },\n ]);\n }\n const changes: Change[] = [];\n for (const fact of this.facts) {\n if (fact.kind === 'members') sealMembers(fact, changes);\n else sealTree(fact, this.state, changes);\n }\n const result = sealChanges(changes);\n profile.recorder('sealed', result.changes.length);\n return result;\n }\n}\nconst lexical = (a: string, b: string): number => (a < b ? -1 : a === b ? 0 : 1);\n","import type { ChangeSet } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport {\n createAddressResolver,\n resolveContainer,\n resolveTreeContainer,\n resolveValue,\n memberKey,\n type CompiledMember,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n} from '../address';\nimport { checkKey, checkValue, copyValue } from '../schema-value';\nimport { ChangeRecorder } from './recorder';\nimport { installMember, type CanonicalState } from './state';\nimport { fail, invalidValue } from './issue';\n\nexport class MutationSession {\n readonly identity = {};\n generation = 0;\n readonly recorder: ChangeRecorder;\n private resolver;\n private resolvedRoot: unknown;\n constructor(readonly state: CanonicalState) {\n this.recorder = new ChangeRecorder(state);\n this.resolver = createAddressResolver(state.schema, state.document);\n this.resolvedRoot = state.document;\n }\n validate(node: DocumentNode, value: unknown, at: DocumentAddress): void {\n const issue = checkValue(node, value, at);\n if (issue) invalidValue(issue);\n }\n resolveContainer(at: DocumentAddress): ResolvedContainer {\n return (\n this.resolver.container(this.identity, this.generation, at) ??\n fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n /** Bind access-resolved canonical facts without walking the address again. */\n bind(at: DocumentAddress, node: DocumentNode | undefined, value: unknown): ResolvedContainer {\n return (\n resolveContainer(this.identity, this.generation, at, node, value) ??\n fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n bindTree(\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n ): ResolvedTreeContainer {\n return (\n resolveTreeContainer(this.identity, this.generation, at, node, value) ??\n fail(at, 'invalid-tree', 'Expected a tree.')\n );\n }\n resolveTree(at: DocumentAddress): ResolvedTreeContainer {\n const location = resolveValue(this.state.schema, this.state.document, at);\n return this.bindTree(at, location?.node, location?.value);\n }\n replace(at: DocumentAddress, value: unknown): void {\n if (!at.length) {\n this.validate(this.state.schema, value, at);\n if (Object.is(this.state.document, value)) return;\n this.recorder.reset();\n this.state.document = copyValue(this.state.schema, value);\n this.invalidate();\n return;\n }\n this.writeMember(this.resolveContainer(at.slice(0, -1)), at[at.length - 1], value, 'set');\n }\n assignMember(container: ResolvedContainer, key: string, value: unknown): void {\n container = this.refresh(container);\n const member = this.definition(container, key);\n if (\n container.layout.kind === 'fixed' &&\n member.node.kind !== 'field' &&\n member.node.kind !== 'variant' &&\n !member.node.optional\n )\n return fail(\n container.at.concat(key),\n 'invalid-value',\n 'Replace fields, variants, or collection entries; edit object members individually.'\n );\n this.writeLocatedMember(container, key, member, memberKey(container, key), value, 'set');\n }\n removeMember(container: ResolvedContainer, key: string): void {\n this.writeMember(this.refresh(container), key, undefined, 'remove');\n }\n private refresh(container: ResolvedContainer): ResolvedContainer {\n if (container.owner !== this.identity)\n return fail(\n container.at,\n 'invalid-address',\n 'Container belongs to another mutation session.'\n );\n return container.generation === this.generation\n ? container\n : this.resolveContainer(container.at);\n }\n definition(container: ResolvedContainer, key: string): CompiledMember {\n const layout = container.layout;\n const member = layout.kind === 'dynamic' ? layout.entry : layout.members.get(key);\n if (!member)\n return fail(container.at.concat(key), 'invalid-address', 'Address does not exist.');\n return member;\n }\n /** Consume a current command-local container; bulk writes retain its storage. */\n writeMember(\n container: ResolvedContainer,\n key: string,\n value: unknown,\n operation: 'set' | 'remove',\n physicalKey = memberKey(container, key)\n ): boolean {\n const member = this.definition(container, key);\n return this.writeLocatedMember(container, key, member, physicalKey, value, operation);\n }\n /** Location and definition are resolved once by the calling operation. */\n private writeLocatedMember(\n container: ResolvedContainer,\n key: string,\n member: CompiledMember,\n physicalKey: string | number,\n value: unknown,\n operation: 'set' | 'remove'\n ): boolean {\n const parentNode = container.node;\n const node = member.node;\n const present = operation === 'set';\n if (parentNode.kind === 'variant' && parentNode.tag === key)\n return fail(\n container.at.concat(key),\n 'invalid-value',\n 'Variant discriminants are read-only.'\n );\n const entry = container.layout.kind === 'dynamic';\n if (!present && !node.optional && !entry)\n return fail(\n container.at.concat(key),\n 'required-field',\n 'A required value cannot be removed.'\n );\n const existed = Object.hasOwn(container.parent, physicalKey);\n const previous = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (existed === present && (!present || Object.is(previous, value))) return false;\n if (parentNode.kind === 'map' || parentNode.kind === 'table') {\n const issue = checkKey(parentNode.key, key, []);\n if (issue)\n return fail(container.at.concat(key, ...issue.address), 'invalid-key', issue.message);\n }\n if (present) {\n if (node.kind === 'field') {\n const issue = checkValue(node, value, []);\n if (issue) return invalidValue(issue, container.at.concat(key, ...issue.address));\n } else this.validate(node, value, container.at.concat(key));\n if (parentNode.kind === 'list' && parentNode.keyOf(value) !== key)\n return fail(\n container.at.concat(key),\n 'invalid-list-key',\n 'Replacing an item must retain its addressed key.'\n );\n }\n const membershipChanged = entry && existed !== present;\n if (membershipChanged && (parentNode.kind === 'list' || parentNode.kind === 'table'))\n this.recorder.order(container);\n this.recorder.member(container, key, member, physicalKey);\n const next = present ? (node.kind === 'field' ? value : copyValue(node, value)) : undefined;\n installMember(container.parent, physicalKey, present, next);\n if (node.kind !== 'field' || membershipChanged) this.invalidate();\n return membershipChanged;\n }\n invalidate(): void {\n this.generation++;\n if (this.resolvedRoot !== this.state.document) {\n this.resolvedRoot = this.state.document;\n this.resolver = createAddressResolver(this.state.schema, this.state.document);\n } else this.resolver.invalidate();\n }\n finish(): ChangeSet {\n return this.recorder.seal();\n }\n rollback(): void {\n this.recorder.rollback();\n this.invalidate();\n }\n}\n","import type { ChangeDirection, ChangeSet } from '../../changes';\nimport type { MutationSession } from '../session';\nimport { installOrder, installMember, orderOf } from '../state';\nimport * as anchor from '../anchor';\nimport { fail } from '../issue';\nexport function apply(\n session: MutationSession,\n changes: ChangeSet,\n direction: ChangeDirection\n): void {\n const side = direction === 'forward' ? 'after' : 'before';\n for (const change of changes.changes) {\n if (change.kind === 'reset') {\n session.replace([], change[side]);\n } else if (change.kind === 'members') {\n const container = session.resolveContainer(change.at);\n const { node, value: current } = container;\n if (change.order) {\n if (node.kind !== 'table' && node.kind !== 'list')\n return fail(change.at, 'invalid-changes', 'Order requires an ordered container.');\n session.recorder.order(container);\n }\n let membershipChanged = false;\n for (const member of change.members) {\n const present = side === 'after' ? member.kind !== 'removed' : member.kind !== 'added';\n const value =\n side === 'after'\n ? member.kind !== 'removed'\n ? member.after\n : undefined\n : member.kind !== 'added'\n ? member.before\n : undefined;\n membershipChanged =\n session.writeMember(container, member.key, value, present ? 'set' : 'remove') ||\n membershipChanged;\n }\n if (change.order) {\n const keys = node.kind === 'table' ? Object.keys(container.parent) : orderOf(node, current);\n if (!anchor.matches(change.order[side], keys))\n return fail(\n change.at,\n 'invalid-changes',\n 'Order must contain exactly the resulting keys.'\n );\n installOrder(node, current, change.order[side]);\n session.invalidate();\n } else if (membershipChanged && node.kind === 'table') {\n const ids = (current as { ids: string[] }).ids;\n if (!anchor.matches(ids, Object.keys(container.parent)))\n return fail(\n change.at,\n 'invalid-changes',\n 'Table membership changes require a matching order.'\n );\n }\n } else {\n const container = session.resolveTree(change.at);\n const { value: current, node } = container;\n session.recorder.tree(container);\n for (const item of change.nodes) session.recorder.tree(container, item.id);\n const root = change[side];\n if (root === null) delete current.rootId;\n else current.rootId = root;\n for (const item of change.nodes) {\n const next =\n side === 'after'\n ? item.kind !== 'removed'\n ? item.after\n : undefined\n : item.kind !== 'added'\n ? item.before\n : undefined;\n installMember(\n current.nodes,\n item.id,\n next !== undefined,\n next && { ...next, children: [...next.children] }\n );\n }\n session.validate(node, current, change.at);\n session.invalidate();\n }\n }\n}\n","import type { ObjectNode, Infer, PathPick } from './schema';\nimport { compilePath } from './schema';\nimport { contains, debugKey, overlaps, read, resolveAddress } from './address';\nimport { createImpact } from './impact';\nimport { createHistory } from './history';\nimport { createAccess, type Draft } from './access/scope';\nimport { MutationSession } from './mutation/session';\nimport * as replay from './mutation/operations/replay';\nimport type { RuntimeWriteIntent } from './runtime/driver';\nimport { decodeChanges } from './mutation/changes';\nimport { MutationRejected, fail } from './mutation/issue';\nimport type { ChangeSet } from './changes';\nimport { checkValue, copyValue, ParseError } from './schema-value';\nimport {\n DocumentDisposedError,\n DocumentReentrancyError,\n TransactionRejected,\n} from './runtime/contract';\nimport type {\n CommitListener,\n CommitSource,\n DocumentCommit,\n DocumentRuntime,\n OperationResult,\n TransactionResult,\n} from './runtime/contract';\nimport { bindRuntimeAccess, accessOf } from './runtime/access';\nimport { assertRuntimeWritable, bindRuntimeDriver, disposeRuntimeDriver } from './runtime/driver';\nimport {\n bindDocumentReadable,\n createNotification,\n disposeNotification,\n notify,\n subscribeRoot,\n subscribeTargets,\n type RuntimeNotification,\n} from './runtime/notification';\n\nexport const createDocument = <S extends ObjectNode>(input: {\n readonly schema: S;\n readonly initial: Infer<S>;\n readonly history?: { readonly capacity?: number } | false;\n}): DocumentRuntime<S> => {\n if (input.schema.kind !== 'object')\n throw new TypeError('Document schema must be a root object node.');\n const invalid = checkValue(input.schema, input.initial);\n if (invalid) throw new ParseError(invalid);\n const state = {\n schema: input.schema,\n document: copyValue(input.schema, input.initial) as Infer<S>,\n disposed: false,\n };\n let revision = 0,\n busy = false;\n let runtime!: DocumentRuntime<S>, notification!: RuntimeNotification<S>;\n const idle = () => {\n if (state.disposed) throw new DocumentDisposedError();\n if (busy || accessOf(runtime).projectionLocks) throw new DocumentReentrancyError();\n };\n const writable = (intent: Parameters<typeof assertRuntimeWritable>[1]) => {\n idle();\n assertRuntimeWritable(runtime, intent);\n };\n const history = createHistory<DocumentCommit<S>>({\n capacity: input.history === false ? 0 : Math.max(0, input.history?.capacity ?? 100),\n revision: () => revision,\n apply: (changes, direction) =>\n mutate({ kind: 'apply', source: 'history' }, false, session => {\n for (const change of changes) replay.apply(session, change, direction);\n }),\n assertIdle: idle,\n notify: run => {\n busy = true;\n try {\n return run();\n } finally {\n busy = false;\n }\n },\n });\n const publish = (\n changes: ChangeSet,\n source: CommitSource,\n recordHistory: boolean\n ): Extract<OperationResult<DocumentCommit<S>>, { status: 'committed' }> => {\n const commit: DocumentCommit<S> = {\n revision: ++revision,\n source,\n changes,\n impact: createImpact(input.schema, changes),\n };\n if (source === 'remote') history.invalidate();\n else if (recordHistory && (source === 'local' || source === 'system')) history.record(changes);\n else if (source === 'history') history.publish();\n else history.endGroup();\n return {\n status: 'committed',\n commit,\n observerErrors: notify(notification, commit, history.flush),\n };\n };\n function mutate(\n intent: Extract<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }>;\n function mutate(\n intent: Exclude<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ): OperationResult<DocumentCommit<S>>;\n function mutate(\n intent: RuntimeWriteIntent,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }> {\n writable(intent);\n busy = true;\n try {\n const session = new MutationSession(state);\n let changes: ChangeSet;\n try {\n execute(session);\n changes = session.finish();\n } catch (error) {\n session.rollback();\n if (error instanceof MutationRejected)\n return { status: 'rejected', issues: [error.issue], revision };\n if (intent.kind === 'update' && error instanceof TransactionRejected)\n return { status: 'rejected', issues: error.issues, revision };\n throw error;\n }\n if (!changes.changes.length) return { status: 'unchanged', revision };\n // Publication is outside the rollback boundary: observers see accepted state.\n return publish(changes, intent.source, recordHistory);\n } finally {\n busy = false;\n }\n }\n runtime = {\n schema: input.schema,\n address: {\n resolve: at => resolveAddress(input.schema, at, state.document),\n read: at => read(state.document, at, input.schema),\n contains,\n overlaps,\n debugKey,\n },\n revision: () => revision,\n update: <V>(\n run: (draft: Draft<S>) => V,\n options?: { source?: Extract<CommitSource, 'local' | 'system'>; history?: boolean }\n ): TransactionResult<V, DocumentCommit<S>> => {\n const source = options?.source ?? 'local';\n let value!: V;\n const result = mutate({ kind: 'update', source }, options?.history ?? true, session => {\n // Draft is a trusted borrowed view. It must not escape this synchronous callback.\n const draft = createAccess({\n state,\n session,\n }) as Draft<S>;\n value = run(draft);\n if (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n throw new TypeError('Document updates must be synchronous.');\n });\n return result.status === 'rejected' ? result : { ...result, value };\n },\n apply: (inputChanges, options) =>\n mutate(\n { kind: 'apply', source: options?.source ?? 'local' },\n options?.history ?? true,\n session => {\n if (!options || options.expectedRevision !== revision)\n fail([], 'baseline-mismatch', 'apply requires the current expectedRevision.');\n replay.apply(session, decodeChanges(inputChanges), 'forward');\n }\n ),\n replace: (value, options) => {\n const source = options?.source ?? 'system';\n return mutate({ kind: 'replace', source }, source !== 'remote', session =>\n session.replace([], value)\n );\n },\n snapshot: () => {\n if (state.disposed) throw new DocumentDisposedError();\n return copyValue(input.schema, state.document) as Infer<S>;\n },\n subscribe: ((\n pick: PathPick<S> | readonly PathPick<S>[] | CommitListener<S>,\n listener?: CommitListener<S>\n ) => {\n if (state.disposed) throw new DocumentDisposedError();\n if (!listener) return subscribeRoot(notification, pick as CommitListener<S>);\n const picks: readonly PathPick<S>[] = Array.isArray(pick) ? pick : [pick as PathPick<S>];\n if (!picks.length) throw new TypeError('Expected at least one subscription path.');\n return subscribeTargets(\n notification,\n picks.map(p => compilePath<S['shape']>(input.schema, 'value', p)),\n listener\n );\n }) as DocumentRuntime<S>['subscribe'],\n history: history.api,\n dispose: () => {\n if (state.disposed) return;\n idle();\n state.disposed = true;\n try {\n disposeNotification(notification);\n } finally {\n history.dispose();\n disposeRuntimeDriver(runtime);\n }\n },\n };\n bindRuntimeAccess(runtime, state);\n bindRuntimeDriver(runtime);\n notification = createNotification(runtime);\n bindDocumentReadable(history.api, runtime);\n return runtime;\n};\n","import type { ObjectNode } from '../schema';\nimport type { DocumentReadable, DocumentRuntime } from './contract';\nimport { accessOf, bindRuntimeAccess } from './access';\nimport { shareNotification } from './notification';\n\n// A readable capability keeps the canonical runtime behind an explicit\n// mutation funnel while remaining fully compatible with selectors, views, and\n// framework subscriptions.\nexport const asReadable = <TSchema extends ObjectNode>(\n runtime: DocumentRuntime<TSchema>\n): DocumentReadable<TSchema> => {\n const readable: DocumentReadable<TSchema> = {\n address: runtime.address,\n revision: runtime.revision,\n subscribe: runtime.subscribe,\n };\n bindRuntimeAccess(readable, accessOf(runtime));\n shareNotification(runtime, readable);\n return Object.freeze(readable);\n};\n","import type { ObjectNode } from '../schema';\nimport type { Read } from '../access/scope';\nimport type { DocumentReadable } from '../runtime/contract';\nimport { readWith } from '../runtime/access';\n\nexport type DocumentSelector<TSchema extends ObjectNode, TResult> = (\n read: Read<TSchema>\n) => TResult;\n\nexport const read = <TSchema extends ObjectNode, TResult>(\n runtime: DocumentReadable<TSchema>,\n selector: DocumentSelector<TSchema, TResult>\n): TResult => readWith(runtime, selector);\n","import { profile } from '../profile';\nimport type { ValueContext } from './contract';\nimport { assertScope } from './scheduler';\n\nconst unset = Symbol('projection-value-unset');\n\nexport type ValueOutputEvaluation<T> = {\n readonly previous: T | undefined;\n readonly next: () => T | undefined;\n readonly output: { set(value: T): void };\n};\n\nexport type ValueOutputState<T> = {\n begin(active: () => boolean, initialize: boolean): ValueOutputEvaluation<T>;\n seal(reset: boolean, isEqual: (previous: T, next: T) => boolean): boolean;\n context(active: () => boolean, cause: unknown): ValueContext<T>;\n current(check: () => void): T;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n subscribe(listener: () => void): void;\n unsubscribe(listener: () => void): void;\n};\n\n/** Owns staged and published state for one scalar Projection output. */\nexport const createValueOutput = <T>(): ValueOutputState<T> => {\n let value!: T;\n let staged: T | typeof unset = unset;\n let next!: T;\n let initialized = false;\n let revision = 0;\n let changed = false;\n let reset = false;\n const listeners = new Set<() => void>();\n\n const begin = (active: () => boolean, initialize: boolean): ValueOutputEvaluation<T> => {\n staged = unset;\n next = value;\n changed = false;\n reset = initialize;\n return {\n previous: initialized ? value : undefined,\n next: () => {\n assertScope(active);\n if (staged !== unset) return staged;\n return initialize ? undefined : initialized ? value : undefined;\n },\n output: Object.freeze({\n set: (candidate: T) => {\n assertScope(active);\n staged = candidate;\n },\n }),\n };\n };\n\n const seal = (nextReset: boolean, isEqual: (previous: T, next: T) => boolean): boolean => {\n if (reset && staged === unset)\n throw new TypeError('Value output must be initialized on reset.');\n if (staged === unset) {\n reset = nextReset;\n changed = false;\n next = value;\n return false;\n }\n const candidate = staged;\n changed = !initialized || !isEqual(value, candidate);\n next = changed ? candidate : value;\n reset = nextReset;\n return changed;\n };\n\n return {\n begin,\n seal,\n context: (active, cause) => {\n assertScope(active);\n return Object.freeze({\n kind: 'value' as const,\n value: next,\n revision,\n reset,\n cause,\n });\n },\n current: check => {\n check();\n return value;\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (changed && initialized) revision++;\n if (changed) value = next;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n Array.from(listeners).forEach(listener => call(listener));\n },\n clear: () => {\n staged = unset;\n next = value;\n changed = false;\n reset = false;\n },\n release: () => {\n listeners.clear();\n staged = unset;\n value = next = undefined as T;\n initialized = false;\n revision = 0;\n changed = false;\n reset = false;\n },\n subscribe: listener => listeners.add(listener),\n unsubscribe: listener => listeners.delete(listener),\n };\n};\n","import { profile } from '../profile';\nimport { createCollectionOutput, type CollectionOutputState } from './collection-output';\nimport { ProjectionDisposedError } from './contract';\nimport type {\n CollectionOutputEvaluation,\n OutputDefinition,\n OutputEvaluation,\n ProcessorDefinition,\n ProcessorInstance,\n ValueOutputEvaluation,\n} from './definition';\nimport {\n assertSynchronous,\n type OutputRecord,\n type ProcessorRecord,\n type Scheduler,\n} from './scheduler';\nimport { createValueOutput, type ValueOutputState } from './value-output';\n\ntype BoundOutput =\n | {\n readonly kind: 'value';\n readonly definition: Extract<OutputDefinition, { readonly kind: 'value' }>;\n readonly state: ValueOutputState<unknown>;\n readonly output: OutputRecord;\n }\n | {\n readonly kind: 'collection';\n readonly definition: Extract<OutputDefinition, { readonly kind: 'collection' }>;\n readonly state: CollectionOutputState<string, unknown>;\n readonly output: OutputRecord;\n };\n\n/** Materializes every derive/incremental/group definition through one processor lifecycle. */\nexport const createProcessor = (\n scheduler: Scheduler,\n definition: ProcessorDefinition,\n dependencies: readonly OutputRecord[]\n): ProcessorRecord => {\n scheduler.assertIdle();\n let processor!: ProcessorRecord;\n let instance: ProcessorInstance | undefined;\n let cause: unknown;\n\n const check = () => {\n if (!scheduler.active || processor.disposed) throw new ProjectionDisposedError();\n if (processor.fault) throw processor.fault;\n };\n\n const bound: readonly BoundOutput[] = definition.outputs.map(outputDefinition => {\n if (outputDefinition.kind === 'value') {\n const state = createValueOutput<unknown>();\n const output: OutputRecord = {\n kind: 'value',\n get owner() {\n return processor;\n },\n consumers: new Set(),\n context: active => state.context(active, cause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = () => listener();\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n return { kind: 'value', definition: outputDefinition, state, output };\n }\n const state = createCollectionOutput<string, unknown>();\n const output: OutputRecord = {\n kind: 'collection',\n get owner() {\n return processor;\n },\n consumers: new Set(),\n context: active => state.context(active, cause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = (change: import('./contract').CollectionChange<string, unknown>) =>\n listener(change);\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n return { kind: 'collection', definition: outputDefinition, state, output };\n });\n\n const begin = (active: () => boolean, initialize: boolean): readonly OutputEvaluation[] =>\n Object.freeze(\n bound.map(entry => {\n if (entry.kind === 'value') {\n const evaluation = entry.state.begin(active, initialize);\n return Object.freeze({ kind: 'value' as const, ...evaluation }) as ValueOutputEvaluation;\n }\n const evaluation = entry.state.begin(active, initialize);\n return Object.freeze({\n kind: 'collection' as const,\n ...evaluation,\n }) as CollectionOutputEvaluation;\n })\n );\n\n const seal = (reset: boolean): readonly OutputRecord[] => {\n const changed: OutputRecord[] = [];\n for (const entry of bound) {\n const didChange = entry.state.seal(reset, entry.definition.equality);\n if (didChange) changed.push(entry.output);\n }\n return Object.freeze(changed);\n };\n\n const run = (reset: boolean, runCause: unknown): readonly OutputRecord[] => {\n cause = runCause;\n let active = true;\n try {\n const scopeActive = () => active;\n const sources = Object.freeze(dependencies.map(output => output.context(scopeActive)));\n let outputs = begin(scopeActive, reset);\n if (!instance) instance = definition.create();\n profile.materialized[reset ? 'rebuilt' : 'updated']();\n let result = instance.evaluate({ reset, cause: runCause, sources, outputs });\n assertSynchronous(result);\n if (result?.kind === 'rebuild') {\n if (reset) throw new TypeError('Initial or reset projection processor cannot rebuild.');\n instance.release?.();\n instance = definition.create();\n outputs = begin(scopeActive, true);\n result = instance.evaluate({ reset: true, cause: runCause, sources, outputs });\n assertSynchronous(result);\n if (result?.kind === 'rebuild')\n throw new TypeError('Reset projection processor cannot rebuild again.');\n return seal(true);\n }\n return seal(reset);\n } finally {\n active = false;\n }\n };\n\n const order = scheduler.order();\n processor = {\n kind: 'processor',\n order,\n name: definition.name ? `${definition.name} (${order})` : `projection-${order}`,\n dependencies: Object.freeze([...dependencies]),\n outputs: Object.freeze(bound.map(entry => entry.output)),\n fault: undefined,\n disposed: false,\n evaluate: run,\n publish: () => bound.forEach(entry => entry.state.publish()),\n clear: () => {\n bound.forEach(entry => entry.state.clear());\n cause = undefined;\n },\n release: () => {\n instance?.release?.();\n instance = undefined;\n bound.forEach(entry => {\n entry.output.consumers.clear();\n entry.state.release();\n });\n cause = undefined;\n },\n };\n\n try {\n scheduler.initialize(() => {\n const invalid = dependencies.find(output => output.owner.fault || output.owner.disposed);\n if (invalid) throw invalid.owner.fault ?? new ProjectionDisposedError();\n const changed = processor.evaluate(true, undefined);\n if (changed.length) processor.publish();\n processor.clear();\n });\n } catch (error) {\n processor.release();\n throw error;\n }\n scheduler.addProcessor(processor);\n return processor;\n};\n","import type { Unsubscribe } from '../runtime/contract';\nimport { collectionChangeBetween } from './collection-output';\nimport type { CollectionChange } from './contract';\nimport type { Readable } from './readable';\n\nexport type ProjectionReadableSource<T> = {\n readonly kind: 'value' | 'collection';\n current(): T;\n revision(): number;\n subscribe(listener: (change?: CollectionChange<string, unknown>) => void): Unsubscribe;\n};\n\ntype SelectionTracker = {\n readonly keys: Set<string>;\n all: boolean;\n structure: boolean;\n};\n\ntype Selection = {\n readonly keys: ReadonlySet<string>;\n readonly all: boolean;\n readonly structure: boolean;\n};\n\nlet activeTracker: SelectionTracker | undefined;\n\nconst trackKey = (key: string): void => {\n activeTracker?.keys.add(key);\n};\n\nconst trackStructure = (): void => {\n if (activeTracker) activeTracker.structure = true;\n};\n\nconst trackAll = (): void => {\n if (activeTracker) activeTracker.all = true;\n};\n\nexport const isMapLike = (value: unknown): value is ReadonlyMap<string, unknown> =>\n value instanceof Map ||\n (value !== null &&\n typeof value === 'object' &&\n typeof (value as { get?: unknown }).get === 'function' &&\n typeof (value as { keys?: unknown }).keys === 'function' &&\n typeof (value as { entries?: unknown }).entries === 'function');\n\nconst trackedMap = <K extends string, V>(source: ReadonlyMap<K, V>): ReadonlyMap<K, V> => {\n const view: ReadonlyMap<K, V> = {\n get: key => {\n trackKey(key);\n return source.get(key);\n },\n has: key => {\n trackKey(key);\n return source.has(key);\n },\n get size() {\n trackStructure();\n return source.size;\n },\n keys: () => {\n trackStructure();\n return source.keys();\n },\n values: () => {\n trackAll();\n return source.values();\n },\n entries: () => {\n trackAll();\n return source.entries();\n },\n forEach: (callback, thisArg) => {\n trackAll();\n source.forEach((value, key) => callback.call(thisArg, value, key, view));\n },\n [Symbol.iterator]: () => {\n trackAll();\n return source[Symbol.iterator]();\n },\n };\n return Object.freeze(view);\n};\n\nconst selectionAffects = (\n selection: Selection,\n change: CollectionChange<string, unknown> | undefined\n): boolean => {\n if (!change || change.kind === 'reset') return true;\n if (\n selection.all &&\n (change.added.length || change.removed.length || change.updated.length || change.order)\n )\n return true;\n if (selection.structure && (change.added.length || change.removed.length || change.order))\n return true;\n for (const key of selection.keys) {\n if (\n change.added.some(entry => entry.key === key) ||\n change.removed.some(entry => entry.key === key) ||\n change.updated.some(entry => entry.key === key)\n )\n return true;\n }\n return false;\n};\n\nexport const createDirectReadable = <T>(source: ProjectionReadableSource<T>): Readable<T> =>\n Object.freeze({\n current: source.current,\n revision: source.revision,\n subscribe: (listener: () => void) => source.subscribe(() => listener()),\n });\n\n/** Consumer-side selector tracking; it never mutates processor dependencies. */\nexport const createSelectorReadable = <T, R>(\n source: ProjectionReadableSource<T>,\n selector: (value: T) => R,\n equality: (previous: R, next: R) => boolean = Object.is\n): Readable<R> => {\n let initialized = false;\n let value!: R;\n let selectedRevision = 0;\n let sourceRevision = -1;\n let selection: Selection = Object.freeze({\n keys: new Set<string>(),\n all: true,\n structure: false,\n });\n let previousCollection: ReadonlyMap<string, unknown> | undefined;\n let unsubscribeSource: Unsubscribe | undefined;\n const listeners = new Set<() => void>();\n\n const updateCollectionSnapshot = (current?: T) => {\n const candidate = current ?? source.current();\n previousCollection = isMapLike(candidate) ? candidate : undefined;\n };\n\n const evaluate = (): boolean => {\n const tracker: SelectionTracker = { keys: new Set(), all: false, structure: false };\n const previousTracker = activeTracker;\n activeTracker = tracker;\n let current!: T;\n let next!: R;\n try {\n current = source.current();\n const selectedSource = isMapLike(current) ? (trackedMap(current) as unknown as T) : current;\n next = selector(selectedSource);\n } finally {\n activeTracker = previousTracker;\n }\n const nextSelection: Selection = Object.freeze({\n keys: new Set(tracker.keys),\n all: tracker.all || (isMapLike(current) && tracker.keys.size === 0 && !tracker.structure),\n structure: tracker.structure,\n });\n const changed = !initialized || !equality(value, next);\n if (changed) {\n if (initialized) selectedRevision++;\n value = next;\n }\n selection = nextSelection;\n initialized = true;\n sourceRevision = source.revision();\n updateCollectionSnapshot(current);\n return changed;\n };\n\n const ensureCurrent = (): R => {\n const revision = source.revision();\n if (!initialized || (!unsubscribeSource && sourceRevision !== revision)) evaluate();\n return value;\n };\n\n const onProjectionChange = (incoming?: CollectionChange<string, unknown>) => {\n let change = incoming;\n if (!change && previousCollection) {\n const current = source.current();\n if (isMapLike(current)) {\n change = collectionChangeBetween(previousCollection, current);\n previousCollection = current;\n if (!change) {\n sourceRevision = source.revision();\n return;\n }\n } else previousCollection = undefined;\n }\n if (!selectionAffects(selection, change)) {\n sourceRevision = source.revision();\n updateCollectionSnapshot();\n return;\n }\n if (evaluate()) Array.from(listeners).forEach(listener => listener());\n };\n\n const installSource = () => {\n if (!unsubscribeSource) unsubscribeSource = source.subscribe(onProjectionChange);\n };\n\n return Object.freeze({\n current: ensureCurrent,\n revision: () => {\n ensureCurrent();\n return selectedRevision;\n },\n subscribe: (listener: () => void) => {\n ensureCurrent();\n listeners.add(listener);\n installSource();\n return () => {\n listeners.delete(listener);\n if (!listeners.size && unsubscribeSource) {\n unsubscribeSource();\n unsubscribeSource = undefined;\n }\n };\n },\n });\n};\n","import { read as readAddress, nodeAt } from '../address';\nimport { collectionAccess, snapshot } from '../access/scope';\nimport { affectsTarget, collectionImpact } from '../impact';\nimport { accessOf } from '../runtime/access';\nimport { attachProjection, documentReadableOwner } from '../runtime/notification';\nimport type { DocumentCommit, DocumentReadable, Unsubscribe } from '../runtime/contract';\nimport type { CollectionSelector, ObjectNode, ValueSelector } from '../schema';\nimport { collectionEntryNode } from '../schema';\nimport { copyValue, equalValue } from '../schema-value';\nimport {\n createCollectionOutput,\n mapRead,\n stageCollectionRead,\n type CollectionOutputState,\n} from './collection-output';\nimport type {\n CollectionChange,\n CollectionRead,\n ExternalCollectionSource,\n ExternalValueSource,\n} from './contract';\nimport { ProjectionDisposedError, ProjectionError } from './contract';\nimport type { SourceDefinition } from './definition';\nimport type { Readable } from './readable';\nimport {\n assertScope,\n assertSynchronous,\n type OutputRecord,\n type Scheduler,\n type SourceBoundaryRecord,\n} from './scheduler';\nimport { createValueOutput, type ValueOutputState } from './value-output';\n\nexport type KeyedInputDraft<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n set(key: K, value: V): void;\n remove(key: K): void;\n};\n\nexport type SourceWrite =\n | { readonly kind: 'value'; set(value: unknown): void }\n | {\n readonly kind: 'collection';\n update(run: (draft: KeyedInputDraft<string, unknown>) => void): void;\n };\n\nexport type SourceMaterialization = {\n readonly producer: SourceBoundaryRecord;\n readonly output: OutputRecord;\n readonly write?: SourceWrite;\n};\n\ntype SourceMark = { readonly reset?: boolean; readonly cause?: unknown };\ntype CollectionMark = SourceMark & {\n readonly candidates?: Iterable<string>;\n readonly fullScan?: boolean;\n readonly orderMayChange?: boolean;\n};\n\ntype ValueBoundary = SourceMaterialization & {\n readonly setLatest: (value: unknown) => void;\n readonly mark: (metadata?: SourceMark) => void;\n readonly fail: (cause: unknown) => void;\n readonly detach: (cleanup: Unsubscribe) => void;\n};\n\ntype CollectionBoundary = SourceMaterialization & {\n readonly mark: (metadata?: CollectionMark) => void;\n readonly fail: (cause: unknown) => void;\n readonly detach: (cleanup: Unsubscribe) => void;\n};\n\nconst sourceError = (source: SourceBoundaryRecord, cause: unknown): ProjectionError =>\n new ProjectionError('source', source.name, [source.outputs[0].revision()], cause);\n\nconst createValueBoundary = (\n scheduler: Scheduler,\n name: string,\n initial: unknown,\n equality: (previous: unknown, next: unknown) => boolean\n): ValueBoundary => {\n const state: ValueOutputState<unknown> = createValueOutput();\n let boundary!: SourceBoundaryRecord;\n let latest = initial;\n let pendingReset = false;\n let pendingCause: unknown;\n let contextCause: unknown;\n let recovering = false;\n let cleanup: Unsubscribe | undefined;\n\n const check = () => {\n if (!scheduler.active || boundary.disposed) throw new ProjectionDisposedError();\n if (boundary.fault) throw boundary.fault;\n };\n\n const output: OutputRecord = {\n kind: 'value',\n get owner() {\n return boundary;\n },\n consumers: new Set(),\n context: active => state.context(active, contextCause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = () => listener();\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n\n boundary = {\n kind: 'source',\n name,\n outputs: Object.freeze([output]) as readonly [OutputRecord],\n fault: undefined,\n disposed: false,\n pendingCause: () => pendingCause,\n recovering: () => recovering,\n prepare: cause => {\n contextCause = cause;\n let active = true;\n try {\n const evaluation = state.begin(() => active, pendingReset);\n evaluation.output.set(latest);\n const changed = state.seal(pendingReset, equality);\n recovering = false;\n return { changed, force: pendingReset };\n } finally {\n active = false;\n }\n },\n publish: state.publish,\n clear: () => {\n state.clear();\n pendingReset = false;\n pendingCause = undefined;\n contextCause = undefined;\n recovering = false;\n },\n release: () => {\n cleanup?.();\n cleanup = undefined;\n state.release();\n output.consumers.clear();\n },\n };\n\n scheduler.initialize(() => {\n let active = true;\n try {\n const evaluation = state.begin(() => active, true);\n evaluation.output.set(initial);\n state.seal(true, equality);\n state.publish();\n state.clear();\n } finally {\n active = false;\n }\n });\n scheduler.addSource(boundary);\n\n const mark = (metadata: SourceMark = {}) => {\n scheduler.assertIdle();\n pendingReset ||= metadata.reset ?? false;\n if (metadata.cause !== undefined) pendingCause ??= metadata.cause;\n if (boundary.fault) recovering = true;\n scheduler.capture(boundary);\n };\n const fail = (cause: unknown) => {\n boundary.fault = sourceError(boundary, cause);\n recovering = false;\n scheduler.capture(boundary);\n };\n return {\n producer: boundary,\n output,\n setLatest: value => {\n latest = value;\n },\n mark,\n fail,\n detach: next => {\n cleanup = next;\n },\n };\n};\n\nconst createCollectionBoundary = (\n scheduler: Scheduler,\n name: string,\n readLatest: (active: () => boolean) => CollectionRead<string, unknown>,\n equality: (previous: unknown, next: unknown) => boolean\n): CollectionBoundary => {\n const state: CollectionOutputState<string, unknown> = createCollectionOutput();\n let boundary!: SourceBoundaryRecord;\n let pendingReset = false;\n let pendingCause: unknown;\n let contextCause: unknown;\n let recovering = false;\n let fullScan = false;\n let orderMayChange = false;\n const candidates = new Set<string>();\n let cleanup: Unsubscribe | undefined;\n\n const check = () => {\n if (!scheduler.active || boundary.disposed) throw new ProjectionDisposedError();\n if (boundary.fault) throw boundary.fault;\n };\n\n const output: OutputRecord = {\n kind: 'collection',\n get owner() {\n return boundary;\n },\n consumers: new Set(),\n context: active => state.context(active, contextCause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = (change: CollectionChange<string, unknown>) => listener(change);\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n\n boundary = {\n kind: 'source',\n name,\n outputs: Object.freeze([output]) as readonly [OutputRecord],\n fault: undefined,\n disposed: false,\n pendingCause: () => pendingCause,\n recovering: () => recovering,\n prepare: cause => {\n contextCause = cause;\n let active = true;\n try {\n const changed = stageCollectionRead(\n state,\n readLatest(() => active),\n () => active,\n {\n reset: pendingReset,\n ...(fullScan ? {} : { candidates }),\n orderMayChange,\n isEqual: equality,\n }\n );\n recovering = false;\n return { changed, force: pendingReset };\n } finally {\n active = false;\n }\n },\n publish: state.publish,\n clear: () => {\n state.clear();\n pendingReset = false;\n pendingCause = undefined;\n contextCause = undefined;\n recovering = false;\n fullScan = false;\n orderMayChange = false;\n candidates.clear();\n },\n release: () => {\n cleanup?.();\n cleanup = undefined;\n state.release();\n output.consumers.clear();\n },\n };\n\n scheduler.initialize(() => {\n let active = true;\n try {\n stageCollectionRead(\n state,\n readLatest(() => active),\n () => active,\n {\n reset: true,\n isEqual: equality,\n }\n );\n state.publish();\n state.clear();\n } finally {\n active = false;\n }\n });\n scheduler.addSource(boundary);\n\n const mark = (metadata: CollectionMark = {}) => {\n scheduler.assertIdle();\n pendingReset ||= metadata.reset ?? false;\n if (metadata.cause !== undefined) pendingCause ??= metadata.cause;\n fullScan ||= metadata.fullScan ?? false;\n orderMayChange ||= metadata.orderMayChange ?? false;\n if (metadata.candidates) for (const key of metadata.candidates) candidates.add(key);\n if (boundary.fault) recovering = true;\n scheduler.capture(boundary);\n };\n const fail = (cause: unknown) => {\n boundary.fault = sourceError(boundary, cause);\n recovering = false;\n scheduler.capture(boundary);\n };\n return {\n producer: boundary,\n output,\n mark,\n fail,\n detach: next => {\n cleanup = next;\n },\n };\n};\n\ntype DocumentBinding = {\n matches(commit: DocumentCommit<ObjectNode>): boolean;\n capture(commit: DocumentCommit<ObjectNode>): void;\n dispose(): void;\n};\n\ntype DocumentConnection = {\n add(binding: DocumentBinding): Unsubscribe;\n close(): void;\n};\n\ntype ValueMember = {\n readonly boundary: ValueBoundary;\n receive(value: unknown, metadata?: SourceMark): void;\n};\n\nexport const createSourceRegistry = (scheduler: Scheduler) => {\n const documents = new Map<object, DocumentConnection>();\n const readables = new Map<object, { members: Set<ValueMember>; close(): void }>();\n const externalValues = new WeakMap<object, { members: Set<ValueMember>; close(): void }>();\n const externalCollections = new WeakMap<\n object,\n { members: Set<CollectionBoundary>; close(): void }\n >();\n\n const documentConnection = <S extends ObjectNode>(\n runtime: DocumentReadable<S>\n ): DocumentConnection => {\n const state = accessOf(runtime);\n const cached = documents.get(state);\n if (cached) return cached;\n if (state.disposed) throw new Error('Document has been disposed.');\n const bindings = new Set<DocumentBinding>();\n const guard = (locked: boolean) => {\n state.projectionLocks = (state.projectionLocks ?? 0) + (locked ? 1 : -1);\n };\n scheduler.guards.add(guard);\n let closed = false;\n let detach: Unsubscribe = () => undefined;\n const connection: DocumentConnection = {\n add(binding) {\n if (closed) throw new Error('Document projection connection is closed.');\n bindings.add(binding);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n bindings.delete(binding);\n if (!bindings.size) connection.close();\n };\n },\n close() {\n if (closed) return;\n closed = true;\n detach();\n bindings.clear();\n scheduler.guards.delete(guard);\n documents.delete(state);\n },\n };\n detach = attachProjection(runtime, {\n capture: commit => {\n for (const binding of bindings)\n if (binding.matches(commit as DocumentCommit<ObjectNode>))\n binding.capture(commit as DocumentCommit<ObjectNode>);\n },\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n for (const binding of bindings) binding.dispose();\n scheduler.run();\n },\n });\n documents.set(state, connection);\n return connection;\n };\n\n const valueInput = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'value-input') throw new Error('Invalid value input source.');\n const source = definition.source;\n const boundary = createValueBoundary(\n scheduler,\n 'projection input',\n source.initial,\n source.equality\n );\n return {\n ...boundary,\n write: {\n kind: 'value',\n set(value) {\n scheduler.assertIdle();\n boundary.setLatest(value);\n boundary.mark();\n scheduler.run();\n },\n },\n };\n };\n\n const collectionInput = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'collection-input')\n throw new Error('Invalid collection input source.');\n const values = new Map(definition.source.initial);\n const boundary = createCollectionBoundary(\n scheduler,\n 'projection collection input',\n () => mapRead(values),\n definition.output.equality\n );\n return {\n ...boundary,\n write: {\n kind: 'collection',\n update(run) {\n scheduler.assertIdle();\n const staged = new Map<\n string,\n { readonly present: true; readonly value: unknown } | { readonly present: false }\n >();\n const operations: (\n | { readonly kind: 'set'; readonly key: string; readonly value: unknown }\n | { readonly kind: 'remove'; readonly key: string }\n )[] = [];\n let active = true;\n const draft: KeyedInputDraft<string, unknown> = Object.freeze({\n get: key => {\n assertScope(() => active);\n const entry = staged.get(key);\n return entry ? (entry.present ? entry.value : undefined) : values.get(key);\n },\n has: key => {\n assertScope(() => active);\n const entry = staged.get(key);\n return entry ? entry.present : values.has(key);\n },\n set: (key, value) => {\n assertScope(() => active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: true, value });\n operations.push({ kind: 'set', key, value });\n },\n remove: key => {\n assertScope(() => active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: false });\n operations.push({ kind: 'remove', key });\n },\n });\n try {\n assertSynchronous(run(draft));\n } finally {\n active = false;\n }\n\n const candidates = new Set<string>();\n let structural = false;\n let changed = false;\n for (const operation of operations) {\n const present = values.has(operation.key);\n if (operation.kind === 'set') {\n if (present && Object.is(values.get(operation.key), operation.value)) continue;\n structural ||= !present;\n values.set(operation.key, operation.value);\n } else {\n if (!present) continue;\n structural = true;\n values.delete(operation.key);\n }\n candidates.add(operation.key);\n changed = true;\n }\n if (!changed) return;\n boundary.mark({ candidates, orderMayChange: structural });\n scheduler.run();\n },\n },\n };\n };\n\n const documentValue = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'document-value')\n throw new Error('Invalid document value source.');\n const { document, selector } = definition.source;\n const state = accessOf(document);\n const address = selector?.address ?? Object.freeze([]);\n const schemaNode = () => nodeAt(state.schema, address, state.document);\n const read = () => {\n if (state.disposed) throw new Error('Document has been disposed.');\n const node = schemaNode();\n if (!node) return undefined;\n const value = selector ? readAddress(state.document, address, state.schema) : state.document;\n return copyValue(node, value);\n };\n const initial = read();\n const boundary = createValueBoundary(scheduler, 'document source', initial, (left, right) => {\n const node = schemaNode();\n return node ? equalValue(node, left, right) : Object.is(left, right);\n });\n const remove = documentConnection(document).add({\n matches: commit => !selector || affectsTarget(commit.impact, selector),\n capture: commit => {\n try {\n boundary.setLatest(read());\n boundary.mark({ reset: commit.impact.kind === 'reset' });\n } catch (cause) {\n boundary.fail(cause);\n }\n },\n dispose: () => boundary.fail(new Error('Document has been disposed.')),\n });\n boundary.detach(remove);\n return boundary;\n };\n\n const documentCollection = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'document-collection')\n throw new Error('Invalid document collection source.');\n const { document, selector } = definition.source;\n const state = accessOf(document);\n const read = (active: () => boolean): CollectionRead<string, unknown> => {\n if (state.disposed) throw new Error('Document has been disposed.');\n const raw = collectionAccess({ state, active }, selector.address) as CollectionRead<\n string,\n unknown\n >;\n const snapshots = new Map<string, unknown>();\n return Object.freeze({\n get: (key: string) => {\n assertScope(active);\n if (!snapshots.has(key)) snapshots.set(key, snapshot(raw.get(key)));\n return snapshots.get(key);\n },\n has: (key: string) => {\n assertScope(active);\n return raw.has(key);\n },\n ids: () => {\n assertScope(active);\n return raw.ids();\n },\n });\n };\n const collectionNode = () => nodeAt(state.schema, selector.address, state.document);\n const boundary = createCollectionBoundary(\n scheduler,\n 'document collection source',\n read,\n (left, right) => {\n const node = collectionNode();\n const entry = node && collectionEntryNode(node);\n return entry ? equalValue(entry, left, right) : Object.is(left, right);\n }\n );\n const remove = documentConnection(document).add({\n matches: commit => affectsTarget(commit.impact, selector),\n capture: commit => {\n const impact = collectionImpact(commit.impact, selector);\n if (impact.kind === 'reset') {\n boundary.mark({ reset: true });\n return;\n }\n const candidates = new Set<string>([...impact.added, ...impact.updated, ...impact.removed]);\n boundary.mark({\n candidates,\n orderMayChange: Boolean(impact.added.size || impact.removed.size || impact.orderChanged),\n });\n },\n dispose: () => boundary.fail(new Error('Document has been disposed.')),\n });\n boundary.detach(remove);\n return boundary;\n };\n\n const readable = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'readable') throw new Error('Invalid Readable source.');\n const { readable, equality } = definition.source;\n let initial = readable.current();\n const boundary = createValueBoundary(scheduler, 'external readable', initial, equality);\n const member: ValueMember = {\n boundary,\n receive(value, metadata) {\n initial = value;\n boundary.setLatest(value);\n boundary.mark(metadata);\n },\n };\n let connection = readables.get(readable);\n if (!connection) {\n const members = new Set<ValueMember>();\n let closed = false;\n let unsubscribe: Unsubscribe | undefined;\n let detachDocument: Unsubscribe | undefined;\n const receive = (settle: boolean) => {\n if (closed || !scheduler.active) return;\n try {\n const value = readable.current();\n members.forEach(next => next.receive(value));\n } catch (cause) {\n members.forEach(next => next.boundary.fail(cause));\n }\n if (settle) scheduler.run();\n };\n const created = {\n members,\n close() {\n if (closed) return;\n closed = true;\n unsubscribe?.();\n detachDocument?.();\n readables.delete(readable);\n },\n };\n const owner = documentReadableOwner(readable);\n if (owner) {\n detachDocument = documentConnection(owner).add({\n matches: () => true,\n capture: () => receive(false),\n dispose: () => {\n members.forEach(next => next.boundary.fail(new Error('Document has been disposed.')));\n },\n });\n }\n unsubscribe = readable.subscribe(() => receive(true));\n connection = created;\n readables.set(readable, connection);\n }\n connection.members.add(member);\n boundary.detach(() => {\n connection!.members.delete(member);\n if (!connection!.members.size) connection!.close();\n });\n void initial;\n return boundary;\n };\n\n const externalValue = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'external-value')\n throw new Error('Invalid external value source.');\n const { source, equality } = definition.source;\n const boundary = createValueBoundary(scheduler, 'external source', source.current(), equality);\n const member: ValueMember = {\n boundary,\n receive(value, metadata) {\n boundary.setLatest(value);\n boundary.mark(metadata);\n },\n };\n let connection = externalValues.get(source);\n if (!connection) {\n const members = new Set<ValueMember>();\n let closed = false;\n let unsubscribe: Unsubscribe | undefined;\n const created = {\n members,\n close() {\n if (closed) return;\n closed = true;\n unsubscribe?.();\n externalValues.delete(source);\n },\n };\n try {\n unsubscribe = source.subscribe(event => {\n try {\n members.forEach(next =>\n next.receive(event.value, { reset: event.reset, cause: event.cause })\n );\n } catch (cause) {\n members.forEach(next => next.boundary.fail(cause));\n }\n scheduler.run();\n });\n } catch (cause) {\n created.close();\n throw cause;\n }\n connection = created;\n externalValues.set(source, connection);\n }\n connection.members.add(member);\n boundary.detach(() => {\n connection!.members.delete(member);\n if (!connection!.members.size) connection!.close();\n });\n return boundary;\n };\n\n const externalCollection = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'external-collection')\n throw new Error('Invalid external collection source.');\n const source = definition.source.source as ExternalCollectionSource<string, unknown>;\n const boundary = createCollectionBoundary(\n scheduler,\n 'external collection source',\n () => {\n const current = source.current();\n return Object.freeze({\n get: key => current.get(key),\n has: key => current.has(key),\n ids: () => current.ids(),\n });\n },\n definition.output.equality\n );\n let connection = externalCollections.get(source);\n if (!connection) {\n const members = new Set<CollectionBoundary>();\n let closed = false;\n let unsubscribe: Unsubscribe | undefined;\n const created = {\n members,\n close() {\n if (closed) return;\n closed = true;\n unsubscribe?.();\n externalCollections.delete(source);\n },\n };\n try {\n unsubscribe = source.subscribe(event => {\n try {\n const impact = event.impact;\n if (impact?.kind === 'reset') {\n members.forEach(next => next.mark({ reset: true, cause: event.cause }));\n } else if (impact?.kind === 'incremental') {\n const candidates = new Set<string>([\n ...impact.added,\n ...impact.updated,\n ...impact.removed,\n ]);\n members.forEach(next =>\n next.mark({\n candidates,\n orderMayChange: Boolean(\n impact.added.size || impact.removed.size || impact.orderChanged\n ),\n cause: event.cause,\n })\n );\n } else {\n members.forEach(next =>\n next.mark({ fullScan: true, orderMayChange: true, cause: event.cause })\n );\n }\n } catch (cause) {\n members.forEach(next => next.fail(cause));\n }\n scheduler.run();\n });\n } catch (cause) {\n created.close();\n throw cause;\n }\n connection = created;\n externalCollections.set(source, connection);\n }\n connection.members.add(boundary);\n boundary.detach(() => {\n connection!.members.delete(boundary);\n if (!connection!.members.size) connection!.close();\n });\n return boundary;\n };\n\n return {\n materialize(definition: SourceDefinition): SourceMaterialization {\n switch (definition.source.kind) {\n case 'value-input':\n return valueInput(definition);\n case 'collection-input':\n return collectionInput(definition);\n case 'document-value':\n return documentValue(definition);\n case 'document-collection':\n return documentCollection(definition);\n case 'readable':\n return readable(definition);\n case 'external-value':\n return externalValue(definition);\n case 'external-collection':\n return externalCollection(definition);\n }\n },\n dispose() {\n documents.forEach(connection => connection.close());\n readables.forEach(connection => connection.close());\n documents.clear();\n readables.clear();\n },\n };\n};\n","import type { Unsubscribe } from '../runtime/contract';\nimport {\n incremental,\n type IncrementalCollectionProcessor,\n type IncrementalGroupDefine,\n type IncrementalGroupOutputTree,\n type IncrementalGroupProcessor,\n type IncrementalValueProcessor,\n} from './advanced';\nimport { collectionView, mapRead, snapshotCollectionView } from './collection-output';\nimport type { CollectionChange, CollectionRead } from './contract';\nimport { ProjectionDisposedError } from './contract';\nimport {\n derive,\n input,\n isProjection,\n ownProjection,\n producerOf,\n projectionRef,\n type Input,\n type ProducerDefinition,\n type Projection,\n} from './definition';\nimport { createProcessor } from './processor';\nimport {\n createDirectReadable,\n createSelectorReadable,\n isMapLike,\n type ProjectionReadableSource,\n} from './projection-readable';\nimport type { Readable } from './readable';\nimport { createScheduler, type OutputRecord, type ProducerRecord } from './scheduler';\nimport { createSourceRegistry, type KeyedInputDraft, type SourceWrite } from './source';\n\ntype KeyedDraft<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n set(key: K, value: V): void;\n remove(key: K): void;\n};\n\nexport type ProjectionRuntime = {\n get<T>(projection: Projection<T, unknown>): T;\n readable<T>(projection: Projection<T, unknown>): Readable<T>;\n readable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n set<T>(input: Input<T>, value: T): void;\n update<K extends string, V>(\n input: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void\n ): void;\n batch<T>(run: () => T): T;\n batch<T>(options: { readonly cause?: unknown }, run: () => T): T;\n scope(): ProjectionScope;\n dispose(): void;\n};\n\nexport type ProjectionScope = {\n readonly input: typeof input;\n readonly derive: typeof derive;\n readonly incremental: typeof incremental;\n get<T>(projection: Projection<T, unknown>): T;\n readable<T>(projection: Projection<T, unknown>): Readable<T>;\n readable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n set<T>(input: Input<T>, value: T): void;\n update<K extends string, V>(\n input: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void\n ): void;\n batch: ProjectionRuntime['batch'];\n dispose(): void;\n};\n\ntype MaterializedProducer = {\n readonly record: ProducerRecord;\n readonly outputs: readonly OutputRecord[];\n readonly write?: SourceWrite;\n};\n\ntype ScopeState = {\n active: boolean;\n readonly materialized: ProducerDefinition[];\n readonly subscriptions: Set<Unsubscribe>;\n};\n\nexport const createProjectionRuntime = (options?: {\n readonly onError?: (error: import('./contract').ProjectionError) => void;\n}): ProjectionRuntime => {\n const scheduler = createScheduler(options?.onError ?? (() => undefined));\n const sources = createSourceRegistry(scheduler);\n const materialized = new WeakMap<ProducerDefinition, MaterializedProducer>();\n const publicViews = new WeakMap<\n OutputRecord,\n { readonly revision: number; readonly value: ReadonlyMap<string, unknown> }\n >();\n const scopes = new Set<ScopeState>();\n\n const assertAccess = (definition: ProducerDefinition, requester?: ScopeState): void => {\n scheduler.assertActive();\n const owner = definition.owner;\n if (owner === undefined) return;\n if (owner !== requester) throw new TypeError('Projection belongs to another scope.');\n if (!requester?.active) throw new ProjectionDisposedError();\n };\n\n const rememberScoped = (\n definition: ProducerDefinition,\n requester: ScopeState | undefined\n ): void => {\n if (requester && definition.owner === requester) requester.materialized.push(definition);\n };\n\n const materializeProducer = (\n definition: ProducerDefinition,\n requester?: ScopeState\n ): MaterializedProducer => {\n assertAccess(definition, requester);\n const existing = materialized.get(definition);\n if (existing) return existing;\n\n let result: MaterializedProducer;\n if (definition.kind === 'source') {\n const source = sources.materialize(definition);\n result = Object.freeze({\n record: source.producer,\n outputs: Object.freeze([source.output]),\n ...(source.write ? { write: source.write } : {}),\n });\n } else {\n if (\n definition.owner === undefined &&\n definition.dependencies.some(dependency => producerOf(dependency).owner !== undefined)\n )\n throw new TypeError('A root projection cannot depend on a scoped projection.');\n const dependencies = definition.dependencies.map(dependency =>\n resolveOutput(dependency, requester)\n );\n const processor = createProcessor(scheduler, definition, Object.freeze(dependencies));\n result = Object.freeze({\n record: processor,\n outputs: processor.outputs,\n });\n }\n\n materialized.set(definition, result);\n rememberScoped(definition, requester);\n return result;\n };\n\n const resolveOutput = (\n projection: Projection<unknown, unknown>,\n requester?: ScopeState\n ): OutputRecord => {\n const ref = projectionRef(projection);\n const producer = materializeProducer(ref.producer, requester);\n const output = producer.outputs[ref.output];\n if (!output) throw new TypeError('Projection output does not exist.');\n return output;\n };\n\n const assertOutput = (output: OutputRecord): void => {\n scheduler.assertActive();\n if (output.owner.disposed) throw new ProjectionDisposedError();\n if (output.owner.fault) throw output.owner.fault;\n };\n\n const publicCurrent = (output: OutputRecord): unknown => {\n assertOutput(output);\n const current = output.current();\n const revision = output.revision();\n const cached = publicViews.get(output);\n if (cached?.revision === revision) return cached.value;\n\n if (output.kind === 'collection') {\n const value = collectionView(current as CollectionRead<string, unknown>);\n publicViews.set(output, { revision, value });\n return value;\n }\n if (isMapLike(current)) {\n const value = snapshotCollectionView(mapRead(current));\n publicViews.set(output, { revision, value });\n return value;\n }\n publicViews.delete(output);\n return current;\n };\n\n const get = <T>(projection: Projection<T, unknown>, requester?: ScopeState): T =>\n publicCurrent(resolveOutput(projection as Projection<unknown, unknown>, requester)) as T;\n\n const readableSource = <T>(\n projection: Projection<T, unknown>,\n requester?: ScopeState\n ): ProjectionReadableSource<T> => {\n const output = resolveOutput(projection as Projection<unknown, unknown>, requester);\n return Object.freeze({\n kind: output.kind,\n current: () => get(projection, requester),\n revision: () => {\n assertOutput(output);\n return output.revision();\n },\n subscribe: output.subscribe,\n });\n };\n\n const makeReadable = <T, R>(\n projection: Projection<T, unknown>,\n selector?: (value: T) => R,\n equality?: (previous: R, next: R) => boolean,\n requester?: ScopeState\n ): Readable<T | R> => {\n const source = readableSource(projection, requester);\n return selector\n ? createSelectorReadable(source, selector, equality)\n : createDirectReadable(source);\n };\n\n function readable<T>(projection: Projection<T, unknown>): Readable<T>;\n function readable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n function readable<T, R>(\n projection: Projection<T, unknown>,\n selector?: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<T | R> {\n return makeReadable(projection, selector, equality);\n }\n\n const inputWrite = (\n target: Projection<unknown, unknown>,\n requester?: ScopeState\n ): SourceWrite => {\n const ref = projectionRef(target);\n if (ref.output !== 0 || ref.producer.kind !== 'source')\n throw new TypeError('Projection is not an input.');\n if (\n ref.producer.source.kind !== 'value-input' &&\n ref.producer.source.kind !== 'collection-input'\n )\n throw new TypeError('Projection is not an input.');\n const write = materializeProducer(ref.producer, requester).write;\n if (!write) throw new TypeError('Projection input is not writable.');\n return write;\n };\n\n const setInput = <T>(target: Input<T>, value: T, requester?: ScopeState): void => {\n const write = inputWrite(target as Projection<unknown, unknown>, requester);\n if (write.kind !== 'value') throw new TypeError('Projection is not a value input.');\n write.set(value);\n };\n\n const updateInput = <K extends string, V>(\n target: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void,\n requester?: ScopeState\n ): void => {\n const write = inputWrite(target as Projection<unknown, unknown>, requester);\n if (write.kind !== 'collection') throw new TypeError('Projection is not a collection input.');\n write.update(run as (draft: KeyedInputDraft<string, unknown>) => void);\n };\n\n function batch<T>(run: () => T): T;\n function batch<T>(options: { readonly cause?: unknown }, run: () => T): T;\n function batch<T>(\n optionsOrCallback: { readonly cause?: unknown } | (() => T),\n maybeCallback?: () => T\n ): T {\n return typeof optionsOrCallback === 'function'\n ? scheduler.batch(optionsOrCallback)\n : scheduler.batch(optionsOrCallback, maybeCallback);\n }\n\n const disposeScope = (state: ScopeState): void => {\n if (!state.active) return;\n scheduler.assertIdle();\n state.active = false;\n state.subscriptions.forEach(unsubscribe => unsubscribe());\n state.subscriptions.clear();\n for (let index = state.materialized.length - 1; index >= 0; index--) {\n const definition = state.materialized[index];\n const current = materialized.get(definition);\n if (!current) continue;\n scheduler.releaseProducer(current.record);\n materialized.delete(definition);\n }\n state.materialized.length = 0;\n scopes.delete(state);\n };\n\n const createScope = (): ProjectionScope => {\n scheduler.assertIdle();\n const state: ScopeState = {\n active: true,\n materialized: [],\n subscriptions: new Set(),\n };\n scopes.add(state);\n\n const assertActive = () => {\n if (!state.active) throw new ProjectionDisposedError();\n scheduler.assertActive();\n };\n const own = <P extends Projection<unknown, unknown>>(projection: P): P => {\n assertActive();\n return ownProjection(projection, state);\n };\n const ownOutputTree = <T>(tree: T): T => {\n if (isProjection(tree)) return own(tree as Projection<unknown, unknown>) as T;\n if (!tree || typeof tree !== 'object')\n throw new TypeError('Incremental group output tree must be an object.');\n for (const value of Object.values(tree as Record<string, unknown>)) ownOutputTree(value);\n return tree;\n };\n\n const scopedInput: typeof input = Object.assign(\n <T>(initial: T, equality?: (previous: T, next: T) => boolean) =>\n own(input(initial, equality)),\n {\n collection: <K extends string, V>(initial?: ReadonlyMap<K, V>) =>\n own(input.collection(initial)),\n }\n );\n const scopedDerive: typeof derive = (dependencies, compute, equality) =>\n own(derive(dependencies, compute, equality));\n const scopedIncremental: typeof incremental = Object.assign(\n <const D extends readonly Projection<unknown, unknown>[], T>(\n dependencies: D,\n processor: IncrementalValueProcessor<D, T>\n ) => own(incremental(dependencies, processor)),\n {\n collection: <const D extends readonly Projection<unknown, unknown>[], K extends string, V>(\n dependencies: D,\n processor: IncrementalCollectionProcessor<D, K, V>\n ) => own(incremental.collection(dependencies, processor)),\n group: <\n const D extends readonly Projection<unknown, unknown>[],\n const O extends IncrementalGroupOutputTree,\n >(\n dependencies: D,\n defineOutputs: (define: IncrementalGroupDefine) => O,\n processor: IncrementalGroupProcessor<D, O>\n ) => ownOutputTree(incremental.group(dependencies, defineOutputs, processor)),\n }\n );\n\n function scopeReadable<T>(projection: Projection<T, unknown>): Readable<T>;\n function scopeReadable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n function scopeReadable<T, R>(\n projection: Projection<T, unknown>,\n selector?: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<T | R> {\n assertActive();\n const source = makeReadable(projection, selector, equality, state);\n return Object.freeze({\n current: () => {\n assertActive();\n return source.current();\n },\n revision: () => {\n assertActive();\n return source.revision();\n },\n subscribe: listener => {\n assertActive();\n const stop = source.subscribe(listener);\n let subscribed = true;\n const unsubscribe = () => {\n if (!subscribed) return;\n subscribed = false;\n state.subscriptions.delete(unsubscribe);\n stop();\n };\n state.subscriptions.add(unsubscribe);\n return unsubscribe;\n },\n });\n }\n\n function scopeBatch<T>(run: () => T): T;\n function scopeBatch<T>(options: { readonly cause?: unknown }, run: () => T): T;\n function scopeBatch<T>(\n optionsOrCallback: { readonly cause?: unknown } | (() => T),\n maybeCallback?: () => T\n ): T {\n assertActive();\n return typeof optionsOrCallback === 'function'\n ? batch(optionsOrCallback)\n : batch(optionsOrCallback, maybeCallback!);\n }\n\n return Object.freeze({\n input: scopedInput,\n derive: scopedDerive,\n incremental: scopedIncremental,\n get: <T>(projection: Projection<T, unknown>) => {\n assertActive();\n return get(projection, state);\n },\n readable: scopeReadable,\n set: <T>(target: Input<T>, value: T) => {\n assertActive();\n setInput(target, value, state);\n },\n update: <K extends string, V>(\n target: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void\n ) => {\n assertActive();\n updateInput(target, run, state);\n },\n batch: scopeBatch,\n dispose: () => disposeScope(state),\n });\n };\n\n return Object.freeze({\n get,\n readable,\n set: setInput,\n update: updateInput,\n batch,\n scope: createScope,\n dispose: () => {\n if (!scheduler.active) return;\n scheduler.assertIdle();\n for (const scope of scopes) {\n scope.active = false;\n scope.subscriptions.forEach(unsubscribe => unsubscribe());\n scope.subscriptions.clear();\n scope.materialized.length = 0;\n }\n scopes.clear();\n sources.dispose();\n scheduler.dispose();\n },\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["sequence.indexedKeys","tree.is","issue.fail","remove","issue.fail","anchor.valid","index","anchor.index","remove","replace","insert","issue.fail","keys","sequence.keys","anchor.valid","anchor.index","replace","sequence.indexedKeys","remove","node","issue.fail","treeTopology.contains","replace","move","issue.fail","anchor.moveSelection","sequence.equal","sequence.listSequence","sequence.matches","tree","target.tree","schemaValue.copyValue","address.resolveChild","address.resolveLocated","address.nodeAt","sequence.indexedKeys","tree.contains","tree.parent","children","tree.children","target.belongs","target.affected","target.indexedAddress","relation.contains","sequence.toArray","sequence.indexedKeys","schemaValue.equalValue","schemaValue.copyValue","sequence.equal","address.resolveLocated","address.resolveValue","schemaValue.copyTreeNode","address.memberKey","sequence.indexedKeys","state.orderOf","schemaValue.equalTreeNode","relation.contains","changeSet.sealChanges","address.createAddressResolver","schemaValue.checkValue","issue.fail","address.resolveContainer","address.resolveTreeContainer","address.resolveValue","schemaValue.copyValue","address.memberKey","schemaValue.checkKey","issue.invalidValue","issue.fail","state.orderOf","sequence.matches","schemaValue.checkTreePayload","schemaValue.copyTreeNode","tree.validate","target.SubscriptionIndex","schemaValue.checkValue","schemaValue.ParseError","schemaValue.copyValue","issue.MutationRejected","changeSet.decodeChanges","target.same","target.same","schemaValue.equalValue","schemaValue.copyValue","sequence.equal","sequence.listSequence","sequence.indexedKeys","schemaValue.equalTreeNode","schemaValue.copyTreeNode","relation.contains","impactTarget.SubscriptionIndex","address.resolveValue","schemaValue.equalTreeNode","schemaValue.copyTreeNode","schemaValue.copyValue","sequence.toArray","sequence.indexedKeys"],"sources":["../core/src/address/resolve.ts","../core/src/mutation/operations/map.ts","../core/src/order/anchor.ts","../core/src/mutation/operations/table.ts","../core/src/mutation/operations/list.ts","../core/src/mutation/operations/tree.ts","../core/src/mutation/operations/order.ts","../core/src/impact/target.ts","../core/src/access/scope.ts","../core/src/address/relation.ts","../core/src/impact.ts","../core/src/runtime/contract.ts","../core/src/history.ts","../core/src/mutation/state.ts","../core/src/mutation/recorder.ts","../core/src/mutation/session.ts","../core/src/mutation/operations/replay.ts","../core/src/runtime/notification.ts","../core/src/runtime.ts","../core/src/runtime/readable.ts","../core/src/access/dependency.ts","../core/src/runtime/access.ts","../core/src/runtime/select.ts","../core/src/projection/collection/change.ts","../core/src/projection/collection/index.ts","../core/src/projection/output/collection.ts","../core/src/projection/output/value.ts","../core/src/projection/graph/processor.ts","../core/src/projection/readable/selection.ts","../core/src/projection/source/materialization.ts","../core/src/projection/source/dirty.ts","../core/src/projection/source/boundary.ts","../core/src/projection/source/document.ts","../core/src/projection/source/registry.ts","../core/src/projection/runtime.ts"],"sourcesContent":["import * as sequence from '../order/sequence';\nimport { profile } from '../profile';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport { compiledLayout, type MemberLayout } from '../schema/layout';\nimport * as tree from '../tree/topology';\nimport { isRecord } from '../value/record';\n\nconst variantNode = (\n node: Extract<DocumentNode, { kind: 'variant' }>,\n value: unknown\n): DocumentNode | undefined => {\n const tag = isRecord(value) && typeof value[node.tag] === 'string' ? value[node.tag] : undefined;\n return node.variants[String(tag ?? Object.keys(node.variants)[0] ?? '')];\n};\n\nconst step = (\n nodeInput: DocumentNode | undefined,\n value: unknown,\n segment: string\n): DocumentNode | undefined => {\n let node = nodeInput;\n if (!node) return undefined;\n if (node.kind === 'variant') {\n node = variantNode(node, value);\n }\n if (!node) return undefined;\n if (node.kind === 'object')\n return Object.hasOwn(node.shape, segment) ? node.shape[segment] : undefined;\n if (node.kind === 'table' || node.kind === 'map') return node.value;\n // List items use stable keys; tree topology remains a structural unit.\n if (node.kind === 'list') return node.value;\n return undefined;\n};\n\nexport const nodeAt = (\n schema: DocumentNode,\n address: DocumentAddress,\n document?: unknown\n): DocumentNode | undefined => {\n let node: DocumentNode | undefined = schema;\n let value = document;\n for (const segment of address) {\n const resolved = step(node, value, segment);\n value = readSegment(value, segment, node);\n node = resolved;\n if (!node) return undefined;\n }\n return node;\n};\n\nconst readSegment = (value: unknown, segment: string, node?: DocumentNode): unknown => {\n if (!isRecord(value) && !Array.isArray(value)) return undefined;\n if (node?.kind === 'list' && Array.isArray(value))\n return value[sequence.indexedKeys(value, node.keyOf).index(segment)];\n if (node?.kind === 'table' && isRecord(value) && isRecord(value.byId)) {\n return Object.hasOwn(value.byId, segment) ? value.byId[segment] : undefined;\n }\n return Object.prototype.hasOwnProperty.call(value, segment)\n ? (value as Record<string, unknown>)[segment]\n : undefined;\n};\n\ntype ResolvedAddress = {\n readonly parent: Record<string, unknown> | unknown[];\n readonly key: string | number;\n readonly node: DocumentNode;\n};\n\n/** Immutable location facts, valid only for the resolving session generation. */\nexport type ResolvedContainer = {\n readonly owner: object;\n readonly generation: number;\n readonly at: DocumentAddress;\n readonly node: Exclude<DocumentNode, { kind: 'tree' }>;\n readonly parent: Record<string, unknown> | unknown[];\n readonly value: unknown;\n readonly layout: MemberLayout;\n};\nexport type ResolvedTreeContainer = {\n readonly owner: object;\n readonly generation: number;\n readonly at: DocumentAddress;\n readonly node: Extract<DocumentNode, { kind: 'tree' }>;\n readonly value: tree.MutableTree;\n};\nexport const resolveContainer = (\n owner: object,\n generation: number,\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n): ResolvedContainer | undefined => {\n if (!node || (!isRecord(value) && !Array.isArray(value))) return undefined;\n const parent = node.kind === 'table' && isRecord(value) ? value.byId : value;\n if (!isRecord(parent) && !Array.isArray(parent)) return undefined;\n if (node.kind === 'tree') return undefined;\n const layout = compiledLayout(node, value);\n if (!layout) return undefined;\n return { owner, generation, at, node, parent, value, layout };\n};\nexport const resolveTreeContainer = (\n owner: object,\n generation: number,\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n): ResolvedTreeContainer | undefined =>\n node?.kind === 'tree' && tree.is(value) ? { owner, generation, at, node, value } : undefined;\nexport const memberKey = (\n container: { readonly node: DocumentNode; readonly parent: Record<string, unknown> | unknown[] },\n key: string\n): string | number =>\n container.node.kind === 'list'\n ? sequence.indexedKeys(container.parent as unknown[], container.node.keyOf).index(key)\n : key;\n\ntype ResolutionPrefix = {\n segment: string;\n node: DocumentNode;\n value: unknown;\n};\n\n/** One recent path per transaction; structural writes invalidate all retained locations. */\nexport const createAddressResolver = (schema: DocumentNode, root: unknown) => {\n const prefix: ResolutionPrefix[] = [];\n return {\n container: (owner: object, generation: number, at: DocumentAddress) => {\n if (!at.length) return resolveContainer(owner, generation, at, schema, root);\n const location = resolveWithPrefix(schema, root, at, prefix);\n if (!location || !Object.hasOwn(location.parent, location.key)) return undefined;\n return resolveContainer(\n owner,\n generation,\n at,\n location.node,\n (location.parent as Record<string | number, unknown>)[location.key]\n );\n },\n invalidate: () => {\n prefix.length = 0;\n },\n };\n};\n\n/** A subtree root is a value, not a fabricated member of an ObjectNode. */\nexport const resolveValue = (\n schema: DocumentNode,\n root: unknown,\n address: DocumentAddress,\n prefix?: ResolutionPrefix[]\n): { node: DocumentNode; value: unknown } | undefined => {\n if (!address.length) return { node: schema, value: root };\n const location = resolveWithPrefix(schema, root, address, prefix);\n return (\n location && {\n node: location.node,\n value: Object.hasOwn(location.parent, location.key)\n ? (location.parent as Record<string | number, unknown>)[location.key]\n : undefined,\n }\n );\n};\n\n/** Resolves schema and document location in one address traversal. */\nexport const resolveLocated = (\n schema: DocumentNode,\n root: unknown,\n address: DocumentAddress\n): ResolvedAddress | undefined => resolveWithPrefix(schema, root, address);\n\nconst resolveWithPrefix = (\n schema: DocumentNode,\n root: unknown,\n address: DocumentAddress,\n prefix?: ResolutionPrefix[]\n): ResolvedAddress | undefined => {\n if (address.length === 0) return undefined;\n let node: DocumentNode | undefined = schema;\n let current: unknown = root;\n let start = 0;\n if (prefix) {\n while (\n start < prefix.length &&\n start < address.length - 1 &&\n prefix[start].segment === address[start]\n )\n start++;\n prefix.length = start;\n if (start) {\n const retained = prefix[start - 1];\n node = retained.node;\n current = retained.value;\n }\n }\n let cacheable = true;\n for (let index = start; index < address.length - 1; index += 1) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, current, address[index]);\n if (!resolved) return undefined;\n if (node?.kind !== 'object' && node?.kind !== 'table' && node?.kind !== 'map')\n cacheable = false;\n current = readSegment(current, address[index], node);\n node = resolved;\n if (prefix && cacheable)\n prefix.push({\n segment: address[index],\n node: resolved,\n value: current,\n });\n if (!node) return undefined;\n }\n const last = address[address.length - 1];\n return resolveChild(node, current, last);\n};\n\n/** Resolves one member from an already current schema/container pair. */\nexport const resolveChild = (\n node: DocumentNode | undefined,\n current: unknown,\n last: string\n): ResolvedAddress | undefined => {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, current, last);\n if (!resolved || (!isRecord(current) && !Array.isArray(current))) return undefined;\n if (node?.kind === 'table' && isRecord(current) && isRecord(current.byId))\n return {\n node: resolved,\n parent: current.byId,\n key: last,\n };\n return {\n node: resolved,\n parent: current,\n key:\n node?.kind === 'list' && Array.isArray(current)\n ? sequence.indexedKeys(current, node.keyOf).index(last)\n : last,\n };\n};\n","import type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address/resolve';\nimport * as issue from '../issue';\n\nexport function put(\n session: MutationSession,\n container: ResolvedContainer,\n id: string,\n value: unknown\n): void {\n if (container.node.kind !== 'map')\n return issue.fail(container.at, 'invalid-collection', 'Expected a map.');\n session.writeMember(container, id, value, 'set');\n}\n\nexport function remove(session: MutationSession, container: ResolvedContainer, id: string): void {\n if (container.node.kind !== 'map')\n return issue.fail(container.at, 'invalid-collection', 'Expected a map.');\n session.writeMember(container, id, undefined, 'remove');\n}\n","import type { DocumentAnchor } from '../schema';\nimport type { KeyOrder, OrderedKeys } from './sequence';\n\ntype MoveSelection =\n | { readonly kind: 'ok'; readonly order: readonly string[] }\n | { readonly kind: 'duplicate' }\n | { readonly kind: 'missing' }\n | { readonly kind: 'invalid-anchor' };\n\nconst length = (keys: OrderedKeys): number => keys.length;\nconst keyIndex = (keys: OrderedKeys, key: string): number =>\n Array.isArray(keys) ? keys.indexOf(key) : (keys as KeyOrder).index(key);\n\n/** Plan one relative move against the order that remains after removing the selection. */\nexport const moveSelection = (\n current: readonly string[],\n selection: readonly string[],\n position?: DocumentAnchor\n): MoveSelection => {\n if (!selection.length) return { kind: 'ok', order: current };\n const selected = new Set<string>();\n for (const key of selection) {\n if (selected.has(key)) return { kind: 'duplicate' };\n selected.add(key);\n }\n const moved: string[] = [];\n const remaining: string[] = [];\n for (const key of current) (selected.has(key) ? moved : remaining).push(key);\n if (moved.length !== selected.size) return { kind: 'missing' };\n if (!valid(remaining, position)) return { kind: 'invalid-anchor' };\n const insertion = index(remaining, position);\n return {\n kind: 'ok',\n order: [...remaining.slice(0, insertion), ...moved, ...remaining.slice(insertion)],\n };\n};\n\nexport const index = (keys: OrderedKeys, anchor?: DocumentAnchor): number => {\n if (!anchor) return length(keys);\n if ('at' in anchor) return anchor.at === 'start' ? 0 : length(keys);\n if ('before' in anchor) return keyIndex(keys, anchor.before);\n return keyIndex(keys, anchor.after) + 1;\n};\n\nexport const valid = (keys: OrderedKeys, anchor?: DocumentAnchor): boolean => {\n if (!anchor) return true;\n if (typeof anchor !== 'object' || anchor === null) return false;\n if (Number('at' in anchor) + Number('before' in anchor) + Number('after' in anchor) !== 1)\n return false;\n if ('at' in anchor) return anchor.at === 'start' || anchor.at === 'end';\n return keyIndex(keys, 'before' in anchor ? anchor.before : anchor.after) >= 0;\n};\n","import type { DocumentAnchor } from '../../schema';\nimport type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address/resolve';\nimport * as anchor from '../../order/anchor';\nimport * as issue from '../issue';\nexport function create(\n session: MutationSession,\n container: ResolvedContainer,\n entries: readonly { id: string; value: unknown }[],\n position?: DocumentAnchor\n): void {\n const { at, node, value } = container;\n if (node.kind !== 'table') return issue.fail(at, 'invalid-collection', 'Expected a table.');\n const table = value as { ids: string[]; byId: Record<string, unknown> };\n if (!anchor.valid(table.ids, position))\n return issue.fail(at, 'invalid-anchor', 'Unknown table anchor.');\n const ids = new Set<string>();\n for (const entry of entries) {\n if (Object.hasOwn(table.byId, entry.id) || ids.has(entry.id))\n return issue.fail(at, 'duplicate-entity', 'Table key already exists.');\n ids.add(entry.id);\n }\n if (!entries.length) return;\n const index = anchor.index(table.ids, position);\n for (const entry of entries) session.writeMember(container, entry.id, entry.value, 'set');\n const length = table.ids.length;\n table.ids.length += entries.length;\n table.ids.copyWithin(index + entries.length, index, length);\n for (let i = 0; i < entries.length; i++) table.ids[index + i] = entries[i].id;\n}\nexport function remove(\n session: MutationSession,\n container: ResolvedContainer,\n ids: readonly string[]\n): void {\n const { at, node, value } = container;\n if (node.kind !== 'table') return issue.fail(at, 'invalid-collection', 'Expected a table.');\n const table = value as { ids: string[]; byId: Record<string, unknown> };\n for (const id of ids)\n if (!Object.hasOwn(table.byId, id))\n return issue.fail(at, 'missing-entity', 'Table key does not exist.');\n if (!ids.length) return;\n const removed = new Set(ids);\n for (const id of removed) session.writeMember(container, id, undefined, 'remove');\n table.ids = table.ids.filter(id => !removed.has(id));\n}\n\nexport function replace(\n session: MutationSession,\n container: ResolvedContainer,\n id: string,\n value: unknown\n): void {\n const { at, node, value: tableValue } = container;\n if (node.kind !== 'table') return issue.fail(at, 'invalid-collection', 'Expected a table.');\n const table = tableValue as { byId: Record<string, unknown> };\n if (!Object.hasOwn(table.byId, id))\n return issue.fail(at.concat(id), 'missing-entity', 'Table key does not exist.');\n session.writeMember(container, id, value, 'set');\n}\n","import type { DocumentAnchor } from '../../schema';\nimport type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address/resolve';\nimport * as anchor from '../../order/anchor';\nimport * as sequence from '../../order/sequence';\nimport * as issue from '../issue';\nexport function insert(\n session: MutationSession,\n container: ResolvedContainer,\n value: unknown,\n position?: DocumentAnchor\n): void {\n const { at, node, value: current } = container;\n if (node.kind !== 'list') return issue.fail(at, 'invalid-list-key', 'Expected a list.');\n session.validate(node.value, value, at);\n const id = node.keyOf(value);\n if (typeof id !== 'string')\n return issue.fail(at, 'invalid-list-key', 'List key must be a string.');\n const items = current as unknown[],\n keys = sequence.keys(items, node.keyOf);\n if (keys.index(id) >= 0) return issue.fail(at, 'duplicate-list-item', 'List key already exists.');\n if (!anchor.valid(keys, position))\n return issue.fail(at, 'invalid-anchor', 'Unknown list anchor.');\n session.recorder.order(container);\n session.recorder.member(container, id, session.definition(container, id), -1);\n sequence.insert(items, anchor.index(keys, position), value);\n session.invalidate();\n}\nexport function replace(\n session: MutationSession,\n container: ResolvedContainer,\n id: string,\n value: unknown\n): void {\n const { at, node, value: items } = container;\n if (node.kind !== 'list') return issue.fail(at, 'invalid-list-key', 'Expected a list.');\n const index = sequence.indexedKeys(items as unknown[], node.keyOf).index(id);\n if (index < 0) return issue.fail(at, 'missing-list-item', 'List key does not exist.');\n session.writeMember(container, id, value, 'set', index);\n}\nexport function remove(session: MutationSession, container: ResolvedContainer, id: string): void {\n const { at, node, value } = container;\n if (node.kind !== 'list') return issue.fail(at, 'missing-list-item', 'List key does not exist.');\n const index = sequence.keys(value as unknown[], node.keyOf).index(id);\n if (index < 0) return issue.fail(at, 'missing-list-item', 'List key does not exist.');\n session.writeMember(container, id, undefined, 'remove', index);\n}\n","import type { DocumentAddress } from '../../schema';\nimport type { ResolvedTreeContainer } from '../../address/resolve';\nimport type { MutationSession } from '../session';\nimport * as treeTopology from '../../tree/topology';\nimport type { MutableTree, TreePosition } from '../../tree/topology';\nimport * as issue from '../issue';\nconst node = (tree: MutableTree, id: string) =>\n Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : undefined;\nconst positionIndex = (index: number | undefined, length: number, at: DocumentAddress): number => {\n if (index !== undefined && (!Number.isInteger(index) || index < 0))\n return issue.fail(at, 'invalid-tree-index', 'Tree index must be nonnegative.');\n return Math.min(index ?? length, length);\n};\nexport const insert = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string,\n value: unknown,\n position: TreePosition | undefined\n): void => {\n const { at, node: schema, value: tree } = container;\n if (typeof id !== 'string') return issue.fail(at, 'invalid-key', 'Tree keys must be strings.');\n if (treeTopology.contains(tree, id))\n return issue.fail(at, 'duplicate-tree-node', 'Tree node already exists.');\n const parentId = position?.parentId;\n const parent = parentId === undefined ? undefined : node(tree, parentId);\n if (\n (tree.rootId !== undefined && !parent) ||\n (tree.rootId === undefined && parentId !== undefined)\n )\n return issue.fail(at, 'missing-tree-parent', 'A nonempty tree requires an existing parent.');\n const index = positionIndex(position?.index, parent?.children.length ?? 0, at);\n session.validate(schema.value, value, at.concat(id));\n session.recorder.tree(container, id);\n if (parentId !== undefined) session.recorder.tree(container, parentId);\n Object.defineProperty(tree.nodes, id, {\n value: { ...(parentId === undefined ? {} : { parentId }), children: [], value },\n writable: true,\n configurable: true,\n enumerable: true,\n });\n if (parent) parent.children.splice(index, 0, id);\n else tree.rootId = id;\n session.invalidate();\n};\nexport const replace = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string,\n value: unknown\n): void => {\n const { at, node: schema, value: tree } = container;\n const entry = node(tree, id);\n if (!entry) return issue.fail(at, 'missing-tree-node', 'Tree node does not exist.');\n if (Object.is(entry.value, value) && Object.hasOwn(entry, 'value')) return;\n session.validate(schema.value, value, at.concat(id));\n session.recorder.tree(container, id);\n entry.value = value;\n};\nexport const remove = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string\n): void => {\n const { at, value: tree } = container;\n const entry = node(tree, id);\n if (!entry) return issue.fail(at, 'missing-tree-node', 'Tree node does not exist.');\n const ids: string[] = [],\n stack = [id];\n while (stack.length) {\n const current = stack.pop()!;\n ids.push(current);\n for (const child of tree.nodes[current].children) stack.push(child);\n }\n for (const key of ids) session.recorder.tree(container, key);\n if (entry.parentId !== undefined) session.recorder.tree(container, entry.parentId);\n if (entry.parentId === undefined) delete tree.rootId;\n else {\n const children = tree.nodes[entry.parentId].children;\n children.splice(children.indexOf(id), 1);\n }\n for (const key of ids) delete tree.nodes[key];\n session.invalidate();\n};\nexport const move = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string,\n position: TreePosition | undefined\n): void => {\n const { at, value: tree } = container;\n const entry = node(tree, id),\n parentId = position?.parentId;\n if (!entry) return issue.fail(at, 'missing-tree-node', 'Tree node does not exist.');\n if (\n entry.parentId === undefined ||\n parentId === undefined ||\n !treeTopology.contains(tree, parentId)\n )\n return issue.fail(\n at,\n 'missing-tree-parent',\n 'Moving requires a non-root node and an existing parent.'\n );\n for (\n let ancestor: string | undefined = parentId;\n ancestor !== undefined;\n ancestor = tree.nodes[ancestor].parentId\n )\n if (ancestor === id)\n return issue.fail(at, 'tree-cycle', 'Cannot move a node under its descendant.');\n const old = tree.nodes[entry.parentId],\n next = tree.nodes[parentId];\n const index = positionIndex(position?.index, next.children.length - (old === next ? 1 : 0), at);\n const previous = old.children.indexOf(id);\n if (old === next && previous === index) return;\n session.recorder.tree(container, id);\n session.recorder.tree(container, entry.parentId);\n session.recorder.tree(container, parentId);\n old.children.splice(previous, 1);\n next.children.splice(index, 0, id);\n entry.parentId = parentId;\n session.invalidate();\n};\n","import type { DocumentAnchor } from '../../schema';\nimport type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address/resolve';\nimport * as sequence from '../../order/sequence';\nimport * as anchor from '../../order/anchor';\nimport * as issue from '../issue';\n\nconst assertOrdered = (\n container: ResolvedContainer\n): Extract<ResolvedContainer['node'], { kind: 'table' | 'list' }> => {\n const { at, node } = container;\n if (node.kind !== 'table' && node.kind !== 'list')\n return issue.fail(at, 'invalid-collection', 'Expected an ordered container.');\n return node;\n};\n\nconst plannedOrder = (\n at: ResolvedContainer['at'],\n current: readonly string[],\n selection: readonly string[],\n position?: DocumentAnchor\n): readonly string[] => {\n const plan = anchor.moveSelection(current, selection, position);\n switch (plan.kind) {\n case 'ok':\n return plan.order;\n case 'duplicate':\n return issue.fail(at, 'invalid-key', 'Moved keys must be unique.');\n case 'missing':\n return issue.fail(at, 'missing-entity', 'Ordered key does not exist.');\n case 'invalid-anchor':\n return issue.fail(at, 'invalid-anchor', 'Unknown order anchor.');\n }\n};\n\nexport function move(\n session: MutationSession,\n container: ResolvedContainer,\n ids: string | readonly string[],\n position?: DocumentAnchor\n): void {\n const node = assertOrdered(container);\n const selection = typeof ids === 'string' ? [ids] : ids;\n if (!selection.length) return;\n\n if (node.kind === 'table') {\n const order = (container.value as { ids: string[] }).ids;\n const next = plannedOrder(container.at, order, selection, position);\n if (sequence.equal(order, next)) return;\n session.recorder.order(container);\n sequence.installKeys(order, next);\n } else {\n const items = container.value as unknown[];\n const current = sequence.listSequence(items, node.keyOf);\n const next = plannedOrder(container.at, current.order, selection, position);\n if (sequence.equal(current.order, next)) return;\n session.recorder.order(container);\n sequence.installList(items, node.keyOf, current, next);\n }\n session.invalidate();\n}\n\nexport function reorder(\n session: MutationSession,\n container: ResolvedContainer,\n next: readonly string[]\n): void {\n const node = assertOrdered(container);\n if (node.kind === 'table') {\n const current = (container.value as { ids: string[] }).ids;\n if (!sequence.matches(next, current))\n return issue.fail(\n container.at,\n 'invalid-collection',\n 'Order must contain every key exactly once.'\n );\n if (sequence.equal(current, next)) return;\n session.recorder.order(container);\n sequence.installKeys(current, next);\n } else {\n const items = container.value as unknown[];\n const current = sequence.listSequence(items, node.keyOf);\n if (!sequence.matches(next, current.order))\n return issue.fail(\n container.at,\n 'invalid-collection',\n 'Order must contain every key exactly once.'\n );\n if (sequence.equal(current.order, next)) return;\n session.recorder.order(container);\n sequence.installList(items, node.keyOf, current, next);\n }\n session.invalidate();\n}\n","import type { ChangeSet } from '../changes';\nimport type { DocumentAddress, ImpactTarget, ObjectNode, TreeTarget } from '../schema';\nimport { AddressIndex } from '../address/index';\n\nconst treeRootSegment = 'rootId';\nconst treeNodesSegment = 'nodes';\nconst ordinaryNamespace = '\\0value';\nconst treeNamespace = '\\0tree';\n\nexport const tree = (\n at: DocumentAddress,\n selection: Exclude<TreeTarget, { readonly kind: 'nodes' }>\n): ImpactTarget => ({ kind: 'value', at, tree: selection });\n\nexport const address = (target: ImpactTarget<unknown>): DocumentAddress =>\n 'at' in target ? target.at : target.address;\n\nexport const id = (target: ImpactTarget<unknown>): string | undefined =>\n target.kind === 'collection' && 'id' in target ? target.id : undefined;\n\nexport const belongs = (target: ImpactTarget<unknown>, schema: ObjectNode): boolean =>\n !('schema' in target) || target.schema === schema;\n\nconst treeTarget = (target: ImpactTarget<unknown>): TreeTarget | undefined =>\n 'tree' in target ? target.tree : undefined;\n\nconst sameTreeTarget = (left: TreeTarget | undefined, right: TreeTarget | undefined): boolean => {\n if (!left || !right) return left === right;\n if (left.kind !== right.kind) return false;\n return left.kind !== 'node' || (right.kind === 'node' && left.id === right.id);\n};\n\nexport const same = (left: ImpactTarget<unknown>, right: ImpactTarget<unknown>): boolean => {\n if ('schema' in left && 'schema' in right && left.schema !== right.schema) return false;\n if (!sameTreeTarget(treeTarget(left), treeTarget(right))) return false;\n if (left.kind !== right.kind) return false;\n const leftAddress = address(left);\n const rightAddress = address(right);\n if (leftAddress.length !== rightAddress.length) return false;\n for (let index = 0; index < leftAddress.length; index += 1)\n if (leftAddress[index] !== rightAddress[index]) return false;\n return left.kind !== 'collection' || id(left) === id(right);\n};\n\nexport const indexedAddress = (target: ImpactTarget<unknown>): DocumentAddress => {\n const tree = treeTarget(target);\n if (tree?.kind === 'root') return [treeNamespace, ...address(target), treeRootSegment];\n if (tree?.kind === 'nodes') return [treeNamespace, ...address(target), treeNodesSegment];\n if (tree?.kind === 'node') return [treeNamespace, ...address(target), treeNodesSegment, tree.id];\n const key = id(target);\n return key === undefined\n ? [ordinaryNamespace, ...address(target)]\n : [ordinaryNamespace, ...address(target), key];\n};\n\nexport const visitChangedLocations = (\n changes: ChangeSet,\n value: (at: DocumentAddress) => void,\n order: (at: DocumentAddress) => void\n): void => {\n for (const change of changes.changes) {\n if (change.kind === 'reset') continue;\n if (change.kind === 'members') {\n for (const member of change.members) {\n value([ordinaryNamespace, ...change.at, member.key]);\n value([treeNamespace, ...change.at, member.key]);\n }\n if (change.order) order([ordinaryNamespace, ...change.at]);\n continue;\n }\n value([ordinaryNamespace, ...change.at]);\n if (change.before !== change.after) value([treeNamespace, ...change.at, treeRootSegment]);\n for (const node of change.nodes)\n value([treeNamespace, ...change.at, treeNodesSegment, node.id]);\n }\n};\n\nexport const affected = (\n target: ImpactTarget,\n values: AddressIndex<true>,\n orders: AddressIndex<true>\n): boolean => {\n const at = indexedAddress(target);\n return id(target) !== undefined\n ? values.hasAncestor(at)\n : values.overlaps(at) || orders.hasDescendant(at);\n};\n\n/** Targets are classified once; commit matching never builds a reverse impact index. */\nexport class SubscriptionIndex<T> {\n private readonly ordinary = new AddressIndex<T>();\n private readonly membership = new AddressIndex<T>();\n constructor(private readonly schema: ObjectNode) {}\n add(target: ImpactTarget, value: T): void {\n if (!belongs(target, this.schema)) return;\n (id(target) === undefined ? this.ordinary : this.membership).add(indexedAddress(target), value);\n }\n delete(target: ImpactTarget, value: T): void {\n if (!belongs(target, this.schema)) return;\n (id(target) === undefined ? this.ordinary : this.membership).delete(\n indexedAddress(target),\n value\n );\n }\n collect(changes: ChangeSet, visit: (value: T) => void): void {\n const values = this.ordinary.query(visit);\n const members = this.membership.query(visit, 'descendants');\n const orders = this.ordinary.query(visit, 'ancestors');\n if (changes.changes.some(change => change.kind === 'reset')) {\n values([]);\n members([]);\n return;\n }\n visitChangedLocations(\n changes,\n at => {\n values(at);\n members(at);\n },\n orders\n );\n }\n clear(): void {\n this.ordinary.clear();\n this.membership.clear();\n }\n}\n","import type {\n DocumentAddress,\n DocumentAnchor,\n DocumentNode,\n DocumentTreeValue,\n FieldNode,\n Infer,\n ListNode,\n MapNode,\n ObjectNode,\n ObjectShape,\n ReadonlyValue,\n TableNode,\n TreeNode,\n ValueSchemaNode,\n VariantNode,\n} from '../schema';\nimport * as address from '../address/resolve';\nimport { compiledShape, type FixedMember } from '../schema/layout';\nimport * as schemaValue from '../schema/value';\nimport type { DependencyTracker } from './dependency';\nimport type { CanonicalState } from '../mutation/state';\nimport type { MutationSession } from '../mutation/session';\nimport * as mapOperations from '../mutation/operations/map';\nimport * as tableOperations from '../mutation/operations/table';\nimport * as listOperations from '../mutation/operations/list';\nimport * as treeOperations from '../mutation/operations/tree';\nimport * as orderOperations from '../mutation/operations/order';\nimport * as sequence from '../order/sequence';\nimport * as tree from '../tree/topology';\nimport { profile } from '../profile';\nimport * as target from '../impact/target';\n\ndeclare const scopeValue: unique symbol;\ntype Scoped<N extends DocumentNode, W extends boolean, V = Infer<N>> = {\n readonly [scopeValue]?: readonly [node: N, writable: W, value: V];\n};\ntype ShapeAccess<S extends ObjectShape, W extends boolean> = W extends true\n ? { -readonly [K in keyof S]: Access<S[K], W> }\n : { readonly [K in keyof S]: Access<S[K], W> };\ntype MapAccess<K extends string, N extends ValueSchemaNode, W extends boolean> = {\n get(id: K): Access<N, W> | undefined;\n has(id: K): boolean;\n ids(): readonly K[];\n} & (W extends true\n ? {\n put(id: K, value: Infer<N>): void;\n remove(id: K): void;\n replace(value: Readonly<Record<K, Infer<N>>>): void;\n }\n : {});\ntype TableAccess<K extends string, N extends ValueSchemaNode, W extends boolean> = {\n get(id: K): Access<N, W> | undefined;\n has(id: K): boolean;\n ids(): readonly K[];\n} & (W extends true\n ? {\n create(id: K, value: Infer<N>, anchor?: DocumentAnchor<K>): void;\n create(\n entries: readonly { readonly id: K; readonly value: Infer<N> }[],\n anchor?: DocumentAnchor<K>\n ): void;\n remove(ids: K | readonly K[]): void;\n move(ids: K | readonly K[], anchor?: DocumentAnchor<K>): void;\n reorder(ids: readonly K[]): void;\n replace(value: {\n readonly ids: readonly K[];\n readonly byId: Readonly<Record<K, Infer<N>>>;\n }): void;\n replace(id: K, value: Infer<N>): void;\n }\n : {});\ntype ListAccess<T, W extends boolean> = {\n get(key: string): ReadonlyValue<T> | undefined;\n has(key: string): boolean;\n ids(): readonly string[];\n} & (W extends true\n ? {\n insert(value: ReadonlyValue<T>, anchor?: DocumentAnchor): void;\n remove(key: string): void;\n move(keys: string | readonly string[], anchor?: DocumentAnchor): void;\n reorder(keys: readonly string[]): void;\n replace(value: readonly ReadonlyValue<T>[]): void;\n replace(key: string, value: ReadonlyValue<T>): void;\n }\n : {});\ntype TreeAccess<T, O extends boolean, W extends boolean> = {\n rootId(): string | undefined;\n get(id: string): ReadonlyValue<T> | undefined;\n has(id: string): boolean;\n parent(id: string): string | undefined;\n children(id: string): readonly string[] | undefined;\n} & (W extends true\n ? {\n insert(\n id: string,\n value: O extends true ? ReadonlyValue<T> | undefined : ReadonlyValue<T>,\n position?: tree.TreePosition\n ): void;\n move(id: string, position?: tree.TreePosition): void;\n remove(id: string): void;\n replace(value: DocumentTreeValue<T, O>): void;\n replace(\n id: string,\n value: O extends true ? ReadonlyValue<T> | undefined : ReadonlyValue<T>\n ): void;\n }\n : {});\ntype NodeAccess<N extends DocumentNode, W extends boolean> =\n N extends FieldNode<infer T, boolean>\n ? ReadonlyValue<T>\n : N extends ObjectNode<infer S>\n ? ShapeAccess<S, W> & Scoped<N, W>\n : N extends VariantNode<infer Tag, infer V>\n ? {\n [K in keyof V & string]: ShapeAccess<V[K]['shape'], W> & {\n readonly [P in Tag]: K;\n } & Scoped<N, W, Extract<Infer<N>, Record<Tag, K>>>;\n }[keyof V & string]\n : N extends MapNode<infer V, infer K>\n ? MapAccess<K, V, W> & Scoped<N, W>\n : N extends TableNode<infer V, infer K>\n ? TableAccess<K, V, W> & Scoped<N, W>\n : N extends ListNode<infer T>\n ? ListAccess<T, W> & Scoped<N, W>\n : N extends TreeNode<infer T, infer O>\n ? TreeAccess<T, O, W> & Scoped<N, W>\n : never;\ntype Access<N extends DocumentNode, W extends boolean> = N extends { readonly optional: true }\n ? NodeAccess<N, W> | undefined\n : NodeAccess<N, W>;\nexport type Read<N extends DocumentNode> = Access<N, false>;\nexport type Draft<N extends DocumentNode> = Access<N, true>;\ntype Snapshot<T> = T extends {\n readonly [scopeValue]?: readonly [DocumentNode, boolean, infer V];\n}\n ? V\n : ReadonlyValue<T>;\ntype Target = {\n at?: DocumentAddress;\n parent?: Target;\n key: string;\n node: DocumentNode | undefined;\n value: unknown;\n generation: number;\n children:\n | { kind: 'fixed'; schema: DocumentNode; slots: (Target | undefined)[] }\n | { kind: 'dynamic'; keys: Map<string, Target> }\n | undefined;\n proxy: object | undefined;\n container?: address.ResolvedContainer | address.ResolvedTreeContainer;\n};\ntype Location = { readonly context: AccessContext; readonly target: Target };\nconst locations = new WeakMap<object, Location>();\nconst locationOf = (value: object): Location | undefined => locations.get(value);\nconst addressOf = (target: Target): DocumentAddress => {\n if (target.at) return target.at;\n profile.access('addresses');\n return (target.at = addressOf(target.parent!).concat(target.key));\n};\nexport type AccessContext = {\n readonly state: CanonicalState;\n /** Omitted for borrowed synchronous Draft and readers that must not escape. */\n readonly active?: () => boolean;\n readonly dependencies?: DependencyTracker;\n readonly session?: MutationSession;\n};\nconst assertActive = (context: AccessContext) => {\n if (context.active && !context.active()) throw new Error('Document access scope has expired.');\n};\nconst collect = (\n context: AccessContext,\n at: DocumentAddress,\n kind: 'value' | 'collection' = 'value',\n id?: string\n) => {\n context.dependencies?.record(\n kind === 'value' ? { kind, at } : { kind, at, ...(id === undefined ? {} : { id }) }\n );\n};\nconst collectTree = (\n context: AccessContext,\n at: DocumentAddress,\n selection: { readonly kind: 'root' } | { readonly kind: 'node'; readonly id: string }\n) => context.dependencies?.record(target.tree(at, selection));\nexport const snapshot = <T>(value: T): Snapshot<T> => {\n const location = value && typeof value === 'object' ? locationOf(value) : undefined;\n if (!location) return value as Snapshot<T>;\n const { context } = location;\n const at = addressOf(location.target);\n profile.access('snapshots');\n collect(context, at);\n const resolved = resolve(context, location.target);\n if (!resolved.node) throw new Error('The selected schema address no longer exists.');\n return schemaValue.copyValue(resolved.node, resolved.value) as Snapshot<T>;\n};\n/** Replace a member with its plain Infer value through the owning draft session. */\ntype ReplaceParentAccess = {\n readonly [scopeValue]?: readonly [\n Extract<DocumentNode, { readonly kind: 'object' | 'variant' }>,\n true,\n unknown,\n ];\n};\nexport const replace = <T extends object & ReplaceParentAccess, K extends keyof Snapshot<T>>(\n container: T,\n key: K,\n value: NoInfer<Snapshot<T>[K]>\n): void => {\n const location = locationOf(container);\n if (!location) throw new TypeError('replace requires scoped document access.');\n if (typeof key !== 'string') throw new TypeError('Document keys must be strings.');\n Reflect.set(container, key, value);\n};\nconst resolve = (context: AccessContext, target: Target): Target => {\n assertActive(context);\n const generation = context.session?.generation ?? 0;\n if (target.generation !== generation) {\n profile.access('resolutions');\n if (!target.parent && !target.at!.length) {\n target.node = context.state.schema;\n target.value = context.state.document;\n } else {\n const parent = target.parent && resolve(context, target.parent);\n const location = parent\n ? address.resolveChild(parent.node, parent.value, target.key)\n : address.resolveLocated(context.state.schema, context.state.document, target.at!);\n target.node =\n location?.node ??\n address.nodeAt(context.state.schema, addressOf(target), context.state.document);\n target.value =\n location && Object.hasOwn(location.parent, location.key)\n ? (location.parent as Record<string | number, unknown>)[location.key]\n : undefined;\n }\n target.generation = generation;\n }\n return target;\n};\n\nexport const createAccess = (context: AccessContext, initial: DocumentAddress = []): unknown => {\n profile.access('scopes');\n const mutable = (): MutationSession => {\n assertActive(context);\n if (!context.session) throw new TypeError('Cannot modify read-only document access.');\n return context.session;\n };\n const writableContainer = (\n target: Target,\n session: MutationSession\n ): address.ResolvedContainer => {\n if (target.container?.generation === session.generation && 'layout' in target.container)\n return target.container;\n return (target.container = session.bind(addressOf(target), target.node, target.value));\n };\n const childAt = (target: Target, key: string): DocumentAddress => {\n profile.access('addresses');\n return addressOf(target).concat(key);\n };\n const access = (target: Target): unknown => {\n if (target.proxy) return target.proxy;\n const proxy = new Proxy(target, handler);\n profile.access('proxies');\n locations.set(proxy, { context, target });\n target.proxy = proxy;\n return proxy;\n };\n const createTarget = (\n at: DocumentAddress | undefined,\n parent: Target | undefined,\n key: string\n ): Target => ({\n at,\n parent,\n key,\n node: undefined,\n value: undefined,\n generation: -1,\n children: undefined,\n proxy: undefined,\n });\n const childAccess = (\n target: Target,\n member: string | FixedMember,\n node: DocumentNode,\n value: unknown\n ) => {\n const key = typeof member === 'string' ? member : member.key;\n if (node.kind === 'field' || value === undefined) {\n if (context.dependencies) collect(context, childAt(target, key));\n return value;\n }\n let children = target.children;\n let child: Target;\n if (typeof member !== 'string') {\n if (children?.kind !== 'fixed' || children.schema !== target.node)\n children = {\n kind: 'fixed',\n schema: target.node!,\n slots: new Array(compiledShape(target.node!, target.value)!.members.size),\n };\n child = children.slots[member.slot] ??= createTarget(undefined, target, key);\n } else {\n if (children?.kind !== 'dynamic') children = { kind: 'dynamic', keys: new Map() };\n const retained = children.keys.get(key);\n child = retained ?? createTarget(undefined, target, key);\n if (!retained) children.keys.set(key, child);\n }\n target.children = children;\n if (child.generation === target.generation) return child.proxy;\n child.node = node;\n child.value = value;\n child.generation = target.generation;\n return access(child);\n };\n const collectionValue = (target: Target, node: DocumentNode) => {\n const current = resolve(context, target);\n if (current.node !== node || current.value === undefined)\n throw new TypeError('The collection method belongs to a replaced schema branch.');\n return current.value;\n };\n const writableCollection = (target: Target, node: DocumentNode): address.ResolvedContainer => {\n const session = mutable();\n collectionValue(target, node);\n return writableContainer(target, session);\n };\n const writableTree = (target: Target, node: DocumentNode): address.ResolvedTreeContainer => {\n const session = mutable();\n collectionValue(target, node);\n if (target.container?.generation === session.generation && !('layout' in target.container))\n return target.container;\n return (target.container = session.bindTree(addressOf(target), target.node, target.value));\n };\n const replaceCollection = (target: Target, node: DocumentNode, value: unknown) => {\n const session = mutable();\n collectionValue(target, node);\n session.replace(addressOf(target), value);\n };\n const mapMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'map' }>\n ): unknown => {\n if (property === 'ids')\n return () => {\n const current = collectionValue(target, node) as Record<string, unknown>;\n if (context.dependencies) collect(context, addressOf(target), 'collection');\n return Object.keys(current);\n };\n if (property === 'has')\n return (id: string) => {\n const current = collectionValue(target, node) as Record<string, unknown>;\n if (context.dependencies) collect(context, addressOf(target), 'collection', id);\n return Object.hasOwn(current, id);\n };\n if (property === 'get')\n return (id: string) => {\n const current = collectionValue(target, node) as Record<string, unknown>;\n if (context.dependencies) collect(context, addressOf(target), 'collection', id);\n if (!Object.hasOwn(current, id)) return undefined;\n if (node.value.kind === 'field') {\n if (context.dependencies) collect(context, childAt(target, id));\n return current[id];\n }\n return childAccess(target, id, node.value, current[id]);\n };\n if (property === 'put')\n return (id: string, value: unknown) => {\n const writable = writableCollection(target, node);\n mapOperations.put(context.session!, writable, id, value);\n };\n if (property === 'remove')\n return (id: string) => {\n const writable = writableCollection(target, node);\n mapOperations.remove(context.session!, writable, id);\n };\n if (property === 'replace') return (value: unknown) => replaceCollection(target, node, value);\n return undefined;\n };\n const orderedMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'table' | 'list' }>\n ): unknown => {\n const at = addressOf(target);\n if (property === 'ids')\n return () => {\n const current = collectionValue(target, node);\n collect(context, at, 'collection');\n return node.kind === 'table'\n ? [...(current as { ids: string[] }).ids]\n : (current as unknown[]).map(node.keyOf);\n };\n if (property === 'has')\n return (id: string) => {\n const current = collectionValue(target, node);\n collect(context, at, 'collection', id);\n return node.kind === 'table'\n ? Object.hasOwn((current as { byId: object }).byId, id)\n : sequence.indexedKeys(current as unknown[], node.keyOf).index(id) >= 0;\n };\n if (property === 'get')\n return (id: string) => {\n const current = collectionValue(target, node);\n collect(context, at, 'collection', id);\n const location = address.resolveChild(node, current, id);\n if (!location || !Object.hasOwn(location.parent, location.key)) return undefined;\n return childAccess(\n target,\n id,\n location.node,\n (location.parent as Record<string | number, unknown>)[location.key]\n );\n };\n if (property === 'move')\n return (ids: string | readonly string[], position?: DocumentAnchor) => {\n const writable = writableCollection(target, node);\n orderOperations.move(context.session!, writable, ids, position);\n };\n if (property === 'reorder')\n return (ids: readonly string[]) => {\n const writable = writableCollection(target, node);\n orderOperations.reorder(context.session!, writable, ids);\n };\n return undefined;\n };\n const tableMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'table' }>\n ): unknown => {\n if (property === 'create')\n return (\n input: string | readonly { id: string; value: unknown }[],\n valueOrPosition?: unknown,\n position?: DocumentAnchor\n ) => {\n const writable = writableCollection(target, node);\n tableOperations.create(\n context.session!,\n writable,\n Array.isArray(input) ? input : [{ id: input as string, value: valueOrPosition }],\n Array.isArray(input) ? (valueOrPosition as DocumentAnchor | undefined) : position\n );\n };\n if (property === 'remove')\n return (ids: string | readonly string[]) => {\n const writable = writableCollection(target, node);\n tableOperations.remove(context.session!, writable, typeof ids === 'string' ? [ids] : ids);\n };\n if (property === 'replace')\n return (...args: [unknown, unknown?]) => {\n const [valueOrId, value] = args;\n if (args.length === 1) return replaceCollection(target, node, valueOrId);\n const writable = writableCollection(target, node);\n tableOperations.replace(context.session!, writable, valueOrId as string, value);\n };\n return orderedMethod(target, property, node);\n };\n const listMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'list' }>\n ): unknown => {\n if (property === 'insert')\n return (value: unknown, position?: DocumentAnchor) => {\n const writable = writableCollection(target, node);\n listOperations.insert(context.session!, writable, value, position);\n };\n if (property === 'remove')\n return (id: string) => {\n const writable = writableCollection(target, node);\n listOperations.remove(context.session!, writable, id);\n };\n if (property === 'replace')\n return (...args: [unknown, unknown?]) => {\n const [valueOrId, value] = args;\n if (args.length === 1) return replaceCollection(target, node, valueOrId);\n const writable = writableCollection(target, node);\n listOperations.replace(context.session!, writable, valueOrId as string, value);\n };\n return orderedMethod(target, property, node);\n };\n const treeMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'tree' }>\n ): unknown => {\n const at = addressOf(target);\n if (property === 'insert')\n return (id: string, value: unknown, position?: tree.TreePosition) => {\n const writable = writableTree(target, node);\n treeOperations.insert(context.session!, writable, id, value, position);\n };\n if (property === 'remove')\n return (id: string) => {\n const writable = writableTree(target, node);\n treeOperations.remove(context.session!, writable, id);\n };\n if (property === 'move')\n return (id: string, position?: tree.TreePosition) => {\n const writable = writableTree(target, node);\n treeOperations.move(context.session!, writable, id, position);\n };\n if (property === 'replace')\n return (...args: [unknown, unknown?]) => {\n const [valueOrId, value] = args;\n if (args.length === 1) return replaceCollection(target, node, valueOrId);\n const writable = writableTree(target, node);\n treeOperations.replace(context.session!, writable, valueOrId as string, value);\n };\n const current = () => collectionValue(target, node) as tree.MutableTree;\n if (property === 'rootId')\n return () => {\n collectTree(context, at, { kind: 'root' });\n return current().rootId;\n };\n if (property === 'get')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n const value = current();\n return tree.contains(value, id) ? value.nodes[id].value : undefined;\n };\n if (property === 'has')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n return tree.contains(current(), id);\n };\n if (property === 'parent')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n return tree.parent(current(), id);\n };\n if (property === 'children')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n const children = tree.children(current(), id);\n return children ? [...children] : undefined;\n };\n return undefined;\n };\n const handler: ProxyHandler<Target> = {\n get: (target, property) => {\n const { node, value } = resolve(context, target);\n if (!node || value === undefined) return undefined;\n if (typeof property !== 'string') return undefined;\n if (node.kind === 'map') return mapMethod(target, property, node);\n if (node.kind === 'table') return tableMethod(target, property, node);\n if (node.kind === 'list') return listMethod(target, property, node);\n if (node.kind === 'tree') return treeMethod(target, property, node);\n if (node.kind === 'variant' && property === node.tag) {\n collect(context, childAt(target, property));\n return (value as Record<string, unknown>)[property];\n }\n const member = compiledShape(node, value)?.members.get(property);\n if (!member) return undefined;\n if (member.field) {\n if (context.dependencies) collect(context, childAt(target, property));\n return (value as Record<string, unknown>)[property];\n }\n return childAccess(\n target,\n node.kind === 'object' ? member : property,\n member.node,\n (value as Record<string, unknown>)[property]\n );\n },\n set: (target, property, value) => {\n const session = mutable(),\n { node } = resolve(context, target);\n if (\n typeof property !== 'string' ||\n !node ||\n (node.kind !== 'object' && node.kind !== 'variant')\n )\n throw new TypeError('Invalid structural assignment.');\n if (node.kind === 'variant' && node.tag === property)\n throw new TypeError('Variant discriminants are read-only.');\n session.assignMember(writableContainer(target, session), property, value);\n return true;\n },\n deleteProperty: (target, property) => {\n const session = mutable(),\n { node } = resolve(context, target);\n if (\n typeof property !== 'string' ||\n node?.kind === 'map' ||\n (node?.kind === 'variant' && node.tag === property)\n )\n throw new TypeError('Invalid structural deletion.');\n session.removeMember(writableContainer(target, session), property);\n return true;\n },\n has: (target, property) => {\n const { node, value } = resolve(context, target);\n if (typeof property !== 'string') return false;\n if (node?.kind === 'map') return false;\n collect(context, addressOf(target));\n return value !== undefined && Object.hasOwn(value as object, property);\n },\n ownKeys: target => {\n const { node, value } = resolve(context, target);\n if (node?.kind === 'map') return [];\n if (context.dependencies) collect(context, addressOf(target));\n return value && typeof value === 'object' ? Object.keys(value) : [];\n },\n getOwnPropertyDescriptor: (target, property) => {\n const { node, value } = resolve(context, target);\n if (node?.kind === 'map') return undefined;\n return value && Object.hasOwn(value as object, property)\n ? { enumerable: true, configurable: true }\n : undefined;\n },\n defineProperty: () => {\n assertActive(context);\n throw new TypeError('Use schema assignments.');\n },\n setPrototypeOf: () => {\n assertActive(context);\n throw new TypeError('Document prototypes are immutable.');\n },\n preventExtensions: () => {\n assertActive(context);\n throw new TypeError('Document access cannot be frozen.');\n },\n };\n const root = resolve(context, createTarget(initial, undefined, ''));\n if (!root.node || root.node.kind === 'field' || root.value === undefined) {\n if (context.dependencies) collect(context, initial);\n return root.value;\n }\n return access(root);\n};\n","import { profile } from '../profile';\nimport type { DocumentAddress } from '../schema';\n\nexport const contains = (parent: DocumentAddress, child: DocumentAddress): boolean => {\n profile.address.prefixComparison();\n if (parent.length > child.length) return false;\n for (let index = 0; index < parent.length; index += 1) {\n profile.address.segmentCompared();\n if (parent[index] !== child[index]) return false;\n }\n return true;\n};\n","import type {\n CollectionId,\n CollectionPath,\n CollectionSelector,\n ObjectNode,\n ImpactTarget,\n PathPick,\n SchemaPath,\n} from './schema';\nimport { compilePath } from './schema';\nimport type { ChangeSet } from './changes';\nimport { AddressIndex } from './address/index';\nimport * as relation from './address/relation';\nimport * as target from './impact/target';\nimport { profile } from './profile';\n\nexport type CollectionImpact<K> =\n | { readonly kind: 'reset' }\n | {\n readonly kind: 'incremental';\n readonly added: ReadonlySet<K>;\n readonly removed: ReadonlySet<K>;\n readonly updated: ReadonlySet<K>;\n readonly orderChanged: boolean;\n };\nexport type DocumentImpact<S extends ObjectNode> = {\n readonly kind: 'incremental' | 'reset';\n affects(pick: PathPick<S>): boolean;\n collection<P extends CollectionPath>(\n pick: (path: SchemaPath<S['shape']>) => P\n ): CollectionImpact<CollectionId<P>>;\n};\nexport const createImpact = <S extends ObjectNode>(\n schema: S,\n changes: ChangeSet\n): DocumentImpact<S> => {\n const reset = changes.changes.some(change => change.kind === 'reset');\n let values: AddressIndex<true> | undefined;\n let orders: AddressIndex<true> | undefined;\n const index = () => {\n if (!values) {\n profile.impact.index();\n values = new AddressIndex();\n orders = new AddressIndex();\n target.visitChangedLocations(\n changes,\n at => values!.add(at, true),\n at => orders!.add(at, true)\n );\n }\n return values;\n };\n const cache = new Map<string, CollectionImpact<string>>();\n const affects = (value: ImpactTarget): boolean => {\n profile.impact.affects();\n if (!target.belongs(value, schema)) return false;\n if (reset) return true;\n return target.affected(value, index(), orders!);\n };\n const collection = (selector: CollectionSelector): CollectionImpact<string> => {\n if (selector.schema !== schema)\n throw new TypeError('Collection belongs to another root model.');\n const key = JSON.stringify(target.indexedAddress(selector)),\n cached = cache.get(key);\n if (cached) return cached;\n if (reset) {\n const result = { kind: 'reset' } as const;\n cache.set(key, result);\n return result;\n }\n const at = selector.address;\n const tree = selector.tree;\n const added = new Set<string>(),\n removed = new Set<string>(),\n updated = new Set<string>();\n let orderChanged = false;\n for (const change of changes.changes) {\n if (change.kind === 'reset') continue;\n if (change.kind === 'members') {\n if (change.at.length < at.length && relation.contains(change.at, at)) {\n if (change.members.some(member => member.key === at[change.at.length])) {\n const result = { kind: 'reset' } as const;\n cache.set(key, result);\n return result;\n }\n } else if (relation.contains(at, change.at)) {\n if (change.at.length === at.length) {\n if (change.order) {\n const positions = new Map(change.order.after.map((id, i) => [id, i]));\n let previous = -1;\n for (const id of change.order.before) {\n const position = positions.get(id);\n if (position === undefined) continue;\n if (position < previous) orderChanged = true;\n previous = position;\n }\n }\n for (const member of change.members) {\n if (member.kind === 'added') added.add(member.key);\n else if (member.kind === 'removed') removed.add(member.key);\n else updated.add(member.key);\n }\n } else updated.add(change.at[at.length]);\n }\n continue;\n }\n if (change.kind === 'tree' && relation.contains(change.at, at)) {\n if (\n tree?.kind === 'nodes' &&\n change.at.length === at.length &&\n relation.contains(at, change.at)\n ) {\n for (const node of change.nodes) {\n if (node.kind === 'added') added.add(node.id);\n else if (node.kind === 'removed') removed.add(node.id);\n else updated.add(node.id);\n }\n continue;\n }\n const result = { kind: 'reset' } as const;\n cache.set(key, result);\n return result;\n }\n if (!relation.contains(at, change.at)) continue;\n if (change.at.length === at.length) continue;\n const id = change.at[at.length];\n updated.add(id);\n }\n added.forEach(id => updated.delete(id));\n removed.forEach(id => updated.delete(id));\n const result = { kind: 'incremental', added, removed, updated, orderChanged } as const;\n cache.set(key, result);\n return result;\n };\n const impact: DocumentImpact<S> = Object.freeze({\n kind: reset ? 'reset' : 'incremental',\n affects: (pick: PathPick<S>) => affects(compilePath<S['shape']>(schema, 'value', pick)),\n collection: <P extends CollectionPath>(pick: (path: SchemaPath<S['shape']>) => P) =>\n collection(\n compilePath<S['shape']>(schema, 'collection', pick) as CollectionSelector\n ) as CollectionImpact<CollectionId<P>>,\n });\n return impact;\n};\n","import type { DocumentAddress, ObjectNode, PathPick, Infer } from '../schema';\nimport type { ChangeSet } from '../changes';\nimport type { DocumentImpact } from '../impact';\nimport type { Draft } from '../access/scope';\nimport type { MutationIssue } from '../mutation/issue';\nimport type { Readable, Unsubscribe } from '../readable';\nexport type { Unsubscribe } from '../readable';\nexport type Synchronous<T> = T extends PromiseLike<unknown> ? never : T;\nexport type CommitSource = 'local' | 'system' | 'history' | 'remote';\nexport class DocumentReentrancyError extends Error {\n constructor() {\n super('Document writes cannot be re-entered during an update or notification.');\n this.name = 'DocumentReentrancyError';\n }\n}\nexport class DocumentDisposedError extends Error {\n constructor() {\n super('Doxum runtime has been disposed.');\n this.name = 'DocumentDisposedError';\n }\n}\nexport type DiagnosticInput = {\n readonly code: string;\n readonly message: string;\n readonly address?: DocumentAddress;\n};\nexport type DocumentDiagnostic = DiagnosticInput & { readonly source: 'application' };\nexport type DocumentProblem = DocumentDiagnostic | MutationIssue;\nexport class TransactionRejected extends Error {\n readonly issues: readonly DocumentDiagnostic[];\n constructor(input: DiagnosticInput | readonly DiagnosticInput[]) {\n super('Document update rejected.');\n this.name = 'TransactionRejected';\n const issues: readonly DiagnosticInput[] = Array.isArray(input)\n ? input\n : [input as DiagnosticInput];\n this.issues = Object.freeze(\n issues.map(issue =>\n Object.freeze({\n code: issue.code,\n message: issue.message,\n source: 'application' as const,\n ...(issue.address === undefined ? {} : { address: Object.freeze([...issue.address]) }),\n })\n )\n );\n }\n}\nexport type DocumentCommit<S extends ObjectNode> = {\n readonly revision: number;\n readonly source: CommitSource;\n readonly changes: ChangeSet;\n readonly impact: DocumentImpact<S>;\n};\nexport type ObserverError = {\n readonly phase: 'processor' | 'flush' | 'listener';\n readonly error: unknown;\n};\nexport type TransactionResult<V, C> =\n | {\n readonly status: 'committed';\n readonly value: V;\n readonly commit: C;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly value: V; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n readonly revision: number;\n };\nexport type OperationResult<C> =\n | {\n readonly status: 'committed';\n readonly commit: C;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly MutationIssue[];\n readonly revision: number;\n };\nexport type HistoryState = { readonly undoDepth: number; readonly redoDepth: number };\nexport type LocalHistory<C> = Readable<HistoryState> & {\n undo(): OperationResult<C>;\n redo(): OperationResult<C>;\n clear(): void;\n group(): { end(): void; cancel(): OperationResult<C> };\n};\nexport type CommitListener<S extends ObjectNode> = (commit: DocumentCommit<S>) => void;\nexport type DocumentReadable<S extends ObjectNode> = {\n revision(): number;\n subscribe(listener: CommitListener<S>): Unsubscribe;\n subscribe(\n pick: PathPick<S> | readonly [PathPick<S>, ...PathPick<S>[]],\n listener: CommitListener<S>\n ): Unsubscribe;\n};\nexport type DocumentRuntime<S extends ObjectNode> = DocumentReadable<S> & {\n readonly schema: S;\n update<V>(\n run: (draft: Draft<S>) => Synchronous<V>,\n options?: {\n readonly source?: Extract<CommitSource, 'local' | 'system'>;\n readonly history?: boolean;\n }\n ): TransactionResult<V, DocumentCommit<S>>;\n apply(\n changes: unknown,\n options: {\n readonly expectedRevision: number;\n readonly source?: Exclude<CommitSource, 'history'>;\n readonly history?: boolean;\n }\n ): OperationResult<DocumentCommit<S>>;\n replace(\n value: Infer<S>,\n options?: { readonly source?: Extract<CommitSource, 'system' | 'remote'> }\n ): OperationResult<DocumentCommit<S>>;\n snapshot(): Infer<S>;\n readonly history: LocalHistory<DocumentCommit<S>>;\n dispose(): void;\n};\n","import type { ChangeSet, ChangeDirection } from './changes';\nimport type {\n HistoryState,\n LocalHistory,\n ObserverError,\n OperationResult,\n} from './runtime/contract';\nimport { DocumentDisposedError } from './runtime/contract';\n\ntype Entry = { readonly batches: ChangeSet[] };\ntype Group = { entry?: Entry; readonly undos: Entry[]; readonly redos: Entry[] };\n\nexport const createHistory = <TCommit>(input: {\n readonly capacity: number;\n readonly apply: (\n changes: readonly ChangeSet[],\n direction: ChangeDirection\n ) => OperationResult<TCommit>;\n readonly revision: () => number;\n readonly assertIdle: () => void;\n readonly notify: (run: () => readonly ObserverError[]) => readonly ObserverError[];\n}) => {\n let undos: Entry[] = [];\n let redos: Entry[] = [];\n const listeners = new Set<() => void>();\n let state: HistoryState = Object.freeze({ undoDepth: 0, redoDepth: 0 });\n let revision = 0;\n let pending = false;\n let disposed = false;\n let group: Group | undefined;\n const unchanged = (): OperationResult<TCommit> => ({\n status: 'unchanged',\n revision: input.revision(),\n });\n const publish = () => {\n if (state.undoDepth === undos.length && state.redoDepth === redos.length) return;\n state = Object.freeze({ undoDepth: undos.length, redoDepth: redos.length });\n revision++;\n pending = true;\n };\n const flush = (): readonly ObserverError[] => {\n if (!pending) return [];\n pending = false;\n const errors: ObserverError[] = [];\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue;\n try {\n listener();\n } catch (error) {\n errors.push({ phase: 'listener', error });\n }\n }\n return errors;\n };\n const clear = () => {\n group = undefined;\n undos.length = redos.length = 0;\n publish();\n };\n const travel = (direction: 'undo' | 'redo' | 'cancel'): OperationResult<TCommit> => {\n input.assertIdle();\n const from = direction === 'redo' ? redos : undos;\n const to = direction === 'redo' ? undos : redos;\n const previousUndos = undos;\n const previousRedos = redos;\n const entry = direction === 'cancel' ? from.at(-1) : from.pop();\n if (!entry) return unchanged();\n if (direction === 'cancel') {\n if (!group || group.entry !== entry)\n throw new Error('History group no longer owns its entry.');\n undos = group.undos;\n redos = group.redos;\n } else to.push(entry);\n let committed = false;\n try {\n const changes = direction === 'redo' ? entry.batches : entry.batches.slice().reverse();\n const result = input.apply(changes, direction === 'redo' ? 'forward' : 'backward');\n committed = result.status !== 'rejected';\n if (committed && direction === 'cancel') group = undefined;\n if (result.status === 'unchanged') {\n publish();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n }\n return result;\n } finally {\n if (!committed) {\n if (direction === 'cancel') {\n undos = previousUndos;\n redos = previousRedos;\n } else {\n to.pop();\n from.push(entry);\n }\n }\n }\n };\n const api: LocalHistory<TCommit> = {\n current: () => state,\n revision: () => revision,\n subscribe: listener => {\n if (disposed) throw new DocumentDisposedError();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n undo: () => {\n input.assertIdle();\n group = undefined;\n return travel('undo');\n },\n redo: () => {\n input.assertIdle();\n group = undefined;\n return travel('redo');\n },\n clear: () => {\n input.assertIdle();\n clear();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n },\n group: () => {\n input.assertIdle();\n if (group) throw new Error('A history group is already active.');\n if (input.capacity <= 0) throw new Error('History is disabled.');\n const scope: Group = { undos: undos.slice(), redos: redos.slice() };\n group = scope;\n return Object.freeze({\n end: () => {\n input.assertIdle();\n if (group === scope) group = undefined;\n },\n cancel: () => {\n input.assertIdle();\n if (group !== scope) return unchanged();\n if (!scope.entry) {\n group = undefined;\n return unchanged();\n }\n const result = travel('cancel');\n if (result.status !== 'rejected') group = undefined;\n return result;\n },\n });\n },\n };\n return {\n api,\n record: (batch: ChangeSet) => {\n if (input.capacity <= 0) return;\n if (group?.entry) group.entry.batches.push(batch);\n else {\n const entry: Entry = { batches: [batch] };\n undos.push(entry);\n if (group) group.entry = entry;\n if (undos.length > input.capacity) undos.shift();\n }\n redos.length = 0;\n publish();\n },\n publish,\n flush,\n endGroup: () => {\n group = undefined;\n },\n invalidate: clear,\n dispose: () => {\n disposed = true;\n listeners.clear();\n clear();\n pending = false;\n },\n };\n};\n","import type { DocumentNode, ObjectNode } from '../schema';\nimport * as sequence from '../order/sequence';\nimport { installOwn } from '../value/record';\n\nexport type CanonicalState = { schema: ObjectNode; document: unknown };\n\n/** Install validated values, or captured before values during rollback. */\nexport const installMember = (\n parent: Record<string, unknown> | unknown[],\n key: string | number,\n present: boolean,\n value: unknown\n): void => {\n if (Array.isArray(parent)) {\n const index = Number(key);\n if (present) {\n if (index < 0) sequence.insert(parent, parent.length, value);\n else parent[index] = value;\n } else if (index >= 0) sequence.remove(parent, index);\n } else installOwn(parent, key, present, value);\n};\n\nexport const orderOf = (node: DocumentNode, value: unknown): string[] => {\n if (node.kind === 'list')\n return sequence.toArray(sequence.indexedKeys(value as unknown[], node.keyOf));\n if (node.kind === 'table') return [...(value as { ids: string[] }).ids];\n throw new Error('Order requires a table or list.');\n};\n\nexport const installOrder = (\n node: DocumentNode,\n value: unknown,\n order: readonly string[]\n): void => {\n if (node.kind === 'list') sequence.install(value as unknown[], node.keyOf, order);\n else if (node.kind === 'table') (value as { ids: string[] }).ids = [...order];\n else throw new Error('Order requires a table or list.');\n};\n","import type { Change, ChangeSet, MemberChange } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport { AddressIndex } from '../address/index';\nimport * as address from '../address/resolve';\nimport * as relation from '../address/relation';\nimport * as sequence from '../order/sequence';\nimport { profile } from '../profile';\nimport { compiledShape, type CompiledMember, type FixedLayout } from '../schema/layout';\nimport * as schemaValue from '../schema/value';\nimport type { MutableTree, MutableTreeNode } from '../tree/topology';\nimport * as changeSet from './changes';\nimport * as state from './state';\ntype MemberFact = { key: string; node: DocumentNode; present: boolean; value: unknown };\ntype MemberGroup = {\n kind: 'members';\n at: DocumentAddress;\n node: DocumentNode;\n parent: Record<string, unknown> | unknown[];\n value: unknown;\n order?: readonly string[];\n} & (\n | { layout: 'fixed'; definitions: FixedLayout['members']; members: (MemberFact | undefined)[] }\n | { layout: 'dynamic'; members: Map<string, MemberFact> | undefined }\n);\ntype TreeFact = {\n kind: 'tree';\n at: DocumentAddress;\n before: string | null;\n nodes: Map<string, MutableTreeNode | undefined>;\n};\ntype Fact = MemberGroup | TreeFact;\ntype RestoreFact =\n | { kind: 'order'; at: DocumentAddress; group: MemberGroup }\n | TreeFact\n | { kind: 'member'; at: DocumentAddress; group: MemberGroup; member: MemberFact };\nconst firstMember = (group: MemberGroup, key: string): MemberFact | undefined => {\n if (group.layout === 'dynamic') return group.members?.get(key);\n const member = group.definitions.get(key);\n return member && group.members[member.slot];\n};\n\nconst forgetMember = (group: MemberGroup, key: string): void => {\n if (group.layout === 'dynamic') group.members?.delete(key);\n else {\n const definition = group.definitions.get(key);\n if (definition) group.members[definition.slot] = undefined;\n }\n};\nconst emptyGroup = (group: MemberGroup): boolean =>\n !group.order && (group.layout === 'fixed' ? !group.members.some(Boolean) : !group.members?.size);\n\nconst transition = (\n node: DocumentNode,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): MemberChange | undefined => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (\n node.kind !== 'field' &&\n beforePresent === afterPresent &&\n schemaValue.equalValue(node, before, after)\n )\n return;\n const value = afterPresent\n ? node.kind === 'field'\n ? after\n : schemaValue.copyValue(node, after)\n : undefined;\n profile.recorder('transitions');\n return !beforePresent\n ? { key, kind: 'added', after: value }\n : !afterPresent\n ? { key, kind: 'removed', before }\n : { key, kind: 'updated', before, after: value };\n};\n\nconst publishMembers = (\n changes: Change[],\n at: DocumentAddress,\n members: MemberChange[],\n order?: { before: readonly string[]; after: readonly string[] }\n): void => {\n if (!members.length && !order) return;\n for (let i = 1; i < members.length; i++)\n if (members[i - 1].key > members[i].key) {\n members.sort((a, b) => lexical(a.key, b.key));\n break;\n }\n changes.push(order ? { kind: 'members', at, members, order } : { kind: 'members', at, members });\n};\n\n/** Diff only the captured subtree; this algorithm has no recorder or session state. */\nconst diffMember = (\n changes: Change[],\n members: MemberChange[],\n node: DocumentNode,\n at: DocumentAddress,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): void => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (beforePresent && afterPresent && before !== undefined && after !== undefined) {\n const sameShape =\n node.kind === 'object' ||\n (node.kind === 'variant' &&\n (before as Record<string, unknown>)[node.tag] ===\n (after as Record<string, unknown>)[node.tag]);\n if (sameShape) {\n const left = before as Record<string, unknown>,\n right = after as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const [child, definition] of compiledShape(node, before)!.members)\n diffMember(\n changes,\n children,\n definition.node,\n childAt,\n child,\n Object.hasOwn(left, child),\n left[child],\n Object.hasOwn(right, child),\n right[child]\n );\n publishMembers(changes, childAt, children);\n return;\n }\n if (node.kind === 'map' || node.kind === 'table') {\n const a = before as Record<string, unknown>,\n b = after as typeof a;\n const left = (node.kind === 'table' ? a.byId : a) as Record<string, unknown>;\n const right = (node.kind === 'table' ? b.byId : b) as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const id of Object.keys(left))\n diffMember(\n changes,\n children,\n node.value,\n childAt,\n id,\n true,\n left[id],\n Object.hasOwn(right, id),\n right[id]\n );\n for (const id of Object.keys(right))\n if (!Object.hasOwn(left, id))\n diffMember(changes, children, node.value, childAt, id, false, undefined, true, right[id]);\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (node.kind === 'table' && !sequence.equal(a.ids as string[], b.ids as string[])) {\n profile.recorder('publishedOrderItems', (b.ids as string[]).length);\n order = { before: a.ids as string[], after: [...(b.ids as string[])] };\n }\n publishMembers(changes, childAt, children, order);\n return;\n }\n }\n const member = transition(node, key, beforePresent, before, afterPresent, after);\n if (member) members.push(member);\n};\nconst restore = (fact: RestoreFact, schema: DocumentNode, root: unknown, skip = 0): unknown => {\n const at = skip ? fact.at.slice(skip) : fact.at;\n if (fact.kind === 'member') {\n const member = fact.member;\n const value = member.present ? schemaValue.copyValue(member.node, member.value) : undefined;\n if (!at.length) return value;\n const location = address.resolveLocated(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved member.');\n state.installMember(location.parent, location.key, member.present, value);\n return root;\n }\n const location = address.resolveValue(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved subtree.');\n if (fact.kind === 'order') state.installOrder(location.node, location.value, fact.group.order!);\n else {\n const tree = location.value as MutableTree;\n if (fact.before === null) delete tree.rootId;\n else tree.rootId = fact.before;\n for (const [id, node] of fact.nodes)\n state.installMember(\n tree.nodes,\n id,\n node !== undefined,\n node && schemaValue.copyTreeNode(node)\n );\n }\n return root;\n};\n\nconst reconstructBefore = (\n node: DocumentNode,\n current: unknown,\n records: readonly RestoreFact[],\n offset: number\n): unknown => {\n let before = schemaValue.copyValue(node, current);\n for (let i = records.length - 1; i >= 0; i--)\n if (records[i].kind !== 'order') before = restore(records[i], node, before, offset);\n for (const record of records)\n if (record.kind === 'order') before = restore(record, node, before, offset);\n return before;\n};\n\nconst sealMembers = (fact: MemberGroup, changes: Change[]): void => {\n const members: MemberChange[] = [];\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const key = address.memberKey(fact, member.key);\n const present = Object.hasOwn(fact.parent, key);\n const value = (fact.parent as Record<string | number, unknown>)[key];\n if (member.node.kind === 'field') {\n const change = transition(\n member.node,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n if (change) members.push(change);\n } else\n diffMember(\n changes,\n members,\n member.node,\n fact.at,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n }\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (fact.order) {\n const current =\n fact.node.kind === 'list'\n ? sequence.indexedKeys(fact.value as unknown[], fact.node.keyOf)\n : (fact.value as { ids: string[] }).ids;\n if (!sequence.equal(fact.order, current)) {\n const after = state.orderOf(fact.node, fact.value);\n profile.recorder('publishedOrderItems', after.length);\n order = { before: fact.order, after };\n }\n }\n publishMembers(changes, fact.at, members, order);\n};\n\nconst sealTree = (fact: TreeFact, canonical: state.CanonicalState, changes: Change[]): void => {\n const location = address.resolveValue(canonical.schema, canonical.document, fact.at);\n const tree = location?.value as MutableTree;\n const node = location?.node;\n if (node?.kind !== 'tree') throw new Error('Tree schema disappeared before sealing.');\n const nodes: Extract<Change, { kind: 'tree' }>['nodes'][number][] = [];\n for (const [id, before] of fact.nodes) {\n const after = Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : undefined;\n if (!before && !after) continue;\n if (before && after && schemaValue.equalTreeNode(before, after)) continue;\n nodes.push(\n !before\n ? { id, kind: 'added', after: schemaValue.copyTreeNode(after!) }\n : !after\n ? { id, kind: 'removed', before }\n : { id, kind: 'updated', before, after: schemaValue.copyTreeNode(after) }\n );\n }\n const after = tree.rootId ?? null;\n if (nodes.length || fact.before !== after)\n changes.push({\n kind: 'tree',\n at: fact.at,\n before: fact.before,\n after,\n nodes: nodes.sort((a, b) => lexical(a.id, b.id)),\n });\n};\n\n/** One first-touch record per owning container, never a per-write operation log. */\nexport class ChangeRecorder {\n private readonly facts = new Set<Fact>();\n private groups = new WeakMap<object, MemberGroup>();\n private index?: AddressIndex<Fact>;\n private indexedGroups = false;\n private resetBefore?: { value: unknown };\n constructor(private readonly state: state.CanonicalState) {}\n private indexGroups(): AddressIndex<Fact> {\n const index = (this.index ??= new AddressIndex());\n if (!this.indexedGroups) {\n this.indexedGroups = true;\n for (const fact of this.facts) {\n if (fact.kind === 'members') {\n index.add(fact.at, fact);\n profile.recorder('indexedGroups');\n }\n }\n }\n return index;\n }\n private covered(at: DocumentAddress): boolean {\n return (\n this.resetBefore !== undefined ||\n (this.indexedGroups &&\n this.index!.someAncestor(\n at,\n fact =>\n fact.kind === 'members' &&\n fact.at.length < at.length &&\n firstMember(fact, at[fact.at.length]) !== undefined\n ))\n );\n }\n private absorb(\n at: DocumentAddress,\n node: DocumentNode,\n value: unknown,\n present: boolean\n ): unknown {\n const index = this.indexGroups();\n const children: RestoreFact[] = [];\n index.query(fact => {\n if (fact.kind === 'members') {\n // An ancestor group can contribute only its one directly addressed member.\n if (fact.at.length < at.length) {\n if (fact.at.length + 1 === at.length) {\n const member = firstMember(fact, at[fact.at.length]);\n if (member) children.push({ kind: 'member', at, group: fact, member });\n }\n return;\n }\n if (fact.order && relation.contains(at, fact.at))\n children.push({ kind: 'order', at: fact.at, group: fact });\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const memberAt = fact.at.concat(member.key);\n if (relation.contains(at, memberAt))\n children.push({ kind: 'member', at: memberAt, group: fact, member });\n }\n } else if (relation.contains(at, fact.at)) children.push(fact);\n })(at);\n if (present) value = reconstructBefore(node, value, children, at.length);\n this.releaseCovered(children);\n return value;\n }\n private releaseCovered(children: readonly RestoreFact[]): void {\n let changedGroups: Set<MemberGroup> | undefined;\n for (const child of children) {\n profile.recorder('absorbed');\n if (child.kind === 'member') {\n const { group, member } = child;\n forgetMember(group, member.key);\n (changedGroups ??= new Set()).add(group);\n } else if (child.kind === 'order') {\n child.group.order = undefined;\n (changedGroups ??= new Set()).add(child.group);\n } else {\n this.unregister(child);\n }\n }\n for (const group of changedGroups ?? []) {\n if (emptyGroup(group)) {\n this.unregister(group);\n }\n }\n }\n private register(fact: Fact): void {\n this.facts.add(fact);\n if (fact.kind === 'members') {\n this.groups.set(fact.parent, fact);\n profile.recorder('groups');\n if (!this.indexedGroups) return;\n profile.recorder('indexedGroups');\n }\n (this.index ??= new AddressIndex()).add(fact.at, fact);\n }\n private unregister(fact: Fact): void {\n this.facts.delete(fact);\n this.index?.delete(fact.at, fact);\n if (fact.kind === 'members') this.groups.delete(fact.parent);\n }\n member(\n container: address.ResolvedContainer,\n key: string,\n definition: CompiledMember,\n physicalKey: string | number\n ): void {\n if (this.resetBefore) return;\n const { node } = definition;\n let group = this.groups.get(container.parent);\n if (group?.layout === 'dynamic' && group.members?.has(key)) return;\n if (group?.layout === 'fixed' && definition.kind === 'fixed' && group.members[definition.slot])\n return;\n const at = this.indexedGroups || node.kind !== 'field' ? container.at.concat(key) : undefined;\n if (at && this.covered(at)) return;\n const present = Object.hasOwn(container.parent, physicalKey);\n let value = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (node.kind !== 'field') value = this.absorb(at!, node, value, present);\n if (!group || !this.facts.has(group)) {\n group = this.createGroup(container);\n }\n const member: MemberFact = { key, node, present, value };\n if (group.layout === 'dynamic') (group.members ??= new Map()).set(key, member);\n else if (definition.kind === 'fixed') group.members[definition.slot] = member;\n else throw new Error('A fixed member group requires a fixed schema member.');\n profile.recorder('facts');\n }\n reset(): void {\n if (this.resetBefore) return;\n const value = this.absorb([], this.state.schema, this.state.document, true);\n this.resetBefore = { value };\n this.groups = new WeakMap();\n profile.recorder('facts');\n }\n private createGroup(container: address.ResolvedContainer): MemberGroup {\n const group: MemberGroup =\n container.layout.kind === 'fixed'\n ? {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'fixed',\n definitions: container.layout.members,\n members: new Array<MemberFact | undefined>(container.layout.members.size),\n }\n : {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'dynamic',\n members: undefined,\n };\n this.register(group);\n return group;\n }\n order(container: address.ResolvedContainer): void {\n profile.recorder('orderCaptures');\n let group = this.groups.get(container.parent);\n if (group?.order || this.covered(container.at)) return;\n group ??= this.createGroup(container);\n group.order = state.orderOf(container.node, container.value);\n profile.recorder('orderSnapshots');\n profile.recorder('orderItems', group.order.length);\n }\n tree(container: address.ResolvedTreeContainer, id?: string): void {\n const { at, value: tree } = container;\n if (this.covered(at)) return;\n const index = (this.index ??= new AddressIndex());\n let fact: TreeFact | undefined;\n for (const item of index.exact(at) ?? []) if (item.kind === 'tree') fact = item;\n if (!fact) {\n fact = { kind: 'tree', at, before: tree.rootId ?? null, nodes: new Map() };\n this.register(fact);\n }\n if (id !== undefined && !fact.nodes.has(id)) {\n profile.recorder('treeNodes');\n fact.nodes.set(\n id,\n Object.hasOwn(tree.nodes, id) ? schemaValue.copyTreeNode(tree.nodes[id]) : undefined\n );\n }\n }\n rollback(): void {\n if (this.resetBefore) {\n this.state.document = this.resetBefore.value;\n return;\n }\n const facts = [...this.facts];\n for (let i = facts.length - 1; i >= 0; i--) {\n const fact = facts[i];\n if (fact.kind === 'members') {\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n state.installMember(\n fact.parent,\n address.memberKey(fact, member.key),\n member.present,\n member.present ? schemaValue.copyValue(member.node, member.value) : undefined\n );\n }\n } else if (fact.kind === 'tree') restore(fact, this.state.schema, this.state.document);\n }\n for (const fact of facts)\n if (fact.kind === 'members' && fact.order)\n state.installOrder(fact.node, fact.value, fact.order);\n }\n seal(): ChangeSet {\n if (this.resetBefore) {\n if (schemaValue.equalValue(this.state.schema, this.resetBefore.value, this.state.document))\n return changeSet.sealChanges([]);\n profile.recorder('sealed');\n return changeSet.sealChanges([\n {\n kind: 'reset',\n before: this.resetBefore.value,\n after: schemaValue.copyValue(this.state.schema, this.state.document),\n },\n ]);\n }\n const changes: Change[] = [];\n for (const fact of this.facts) {\n if (fact.kind === 'members') sealMembers(fact, changes);\n else sealTree(fact, this.state, changes);\n }\n const result = changeSet.sealChanges(changes);\n profile.recorder('sealed', result.changes.length);\n return result;\n }\n}\nconst lexical = (a: string, b: string): number => (a < b ? -1 : a === b ? 0 : 1);\n","import type { ChangeSet } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport * as address from '../address/resolve';\nimport type { CompiledMember } from '../schema/layout';\nimport * as schemaValue from '../schema/value';\nimport { ChangeRecorder } from './recorder';\nimport * as state from './state';\nimport * as issue from './issue';\n\nexport class MutationSession {\n readonly identity = {};\n generation = 0;\n readonly recorder: ChangeRecorder;\n private resolver;\n private resolvedRoot: unknown;\n constructor(readonly state: state.CanonicalState) {\n this.recorder = new ChangeRecorder(state);\n this.resolver = address.createAddressResolver(state.schema, state.document);\n this.resolvedRoot = state.document;\n }\n validate(node: DocumentNode, value: unknown, at: DocumentAddress): void {\n const failure = schemaValue.checkValue(node, value, at);\n if (failure) issue.invalidValue(failure);\n }\n resolveContainer(at: DocumentAddress): address.ResolvedContainer {\n return (\n this.resolver.container(this.identity, this.generation, at) ??\n issue.fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n /** Bind access-resolved canonical facts without walking the address again. */\n bind(\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n ): address.ResolvedContainer {\n return (\n address.resolveContainer(this.identity, this.generation, at, node, value) ??\n issue.fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n bindTree(\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n ): address.ResolvedTreeContainer {\n return (\n address.resolveTreeContainer(this.identity, this.generation, at, node, value) ??\n issue.fail(at, 'invalid-tree', 'Expected a tree.')\n );\n }\n resolveTree(at: DocumentAddress): address.ResolvedTreeContainer {\n const location = address.resolveValue(this.state.schema, this.state.document, at);\n return this.bindTree(at, location?.node, location?.value);\n }\n replace(at: DocumentAddress, value: unknown): void {\n if (!at.length) {\n this.validate(this.state.schema, value, at);\n if (Object.is(this.state.document, value)) return;\n this.recorder.reset();\n this.state.document = schemaValue.copyValue(this.state.schema, value);\n this.invalidate();\n return;\n }\n this.writeMember(this.resolveContainer(at.slice(0, -1)), at[at.length - 1], value, 'set');\n }\n assignMember(container: address.ResolvedContainer, key: string, value: unknown): void {\n container = this.refresh(container);\n const member = this.definition(container, key);\n if (\n container.layout.kind === 'fixed' &&\n member.node.kind !== 'field' &&\n member.node.kind !== 'variant' &&\n !member.node.optional\n )\n return issue.fail(\n container.at.concat(key),\n 'invalid-value',\n 'Replace fields, variants, or collection entries; edit object members individually.'\n );\n this.writeLocatedMember(\n container,\n key,\n member,\n address.memberKey(container, key),\n value,\n 'set'\n );\n }\n removeMember(container: address.ResolvedContainer, key: string): void {\n this.writeMember(this.refresh(container), key, undefined, 'remove');\n }\n private refresh(container: address.ResolvedContainer): address.ResolvedContainer {\n if (container.owner !== this.identity)\n return issue.fail(\n container.at,\n 'invalid-address',\n 'Container belongs to another mutation session.'\n );\n return container.generation === this.generation\n ? container\n : this.resolveContainer(container.at);\n }\n definition(container: address.ResolvedContainer, key: string): CompiledMember {\n const layout = container.layout;\n const member = layout.kind === 'dynamic' ? layout.entry : layout.members.get(key);\n if (!member)\n return issue.fail(container.at.concat(key), 'invalid-address', 'Address does not exist.');\n return member;\n }\n /** Consume a current command-local container; bulk writes retain its storage. */\n writeMember(\n container: address.ResolvedContainer,\n key: string,\n value: unknown,\n operation: 'set' | 'remove',\n physicalKey = address.memberKey(container, key)\n ): boolean {\n const member = this.definition(container, key);\n return this.writeLocatedMember(container, key, member, physicalKey, value, operation);\n }\n /** Location and definition are resolved once by the calling operation. */\n private writeLocatedMember(\n container: address.ResolvedContainer,\n key: string,\n member: CompiledMember,\n physicalKey: string | number,\n value: unknown,\n operation: 'set' | 'remove'\n ): boolean {\n const parentNode = container.node;\n const node = member.node;\n const present = operation === 'set';\n if (parentNode.kind === 'variant' && parentNode.tag === key)\n return issue.fail(\n container.at.concat(key),\n 'invalid-value',\n 'Variant discriminants are read-only.'\n );\n const entry = container.layout.kind === 'dynamic';\n if (!present && !node.optional && !entry)\n return issue.fail(\n container.at.concat(key),\n 'required-field',\n 'A required value cannot be removed.'\n );\n const existed = Object.hasOwn(container.parent, physicalKey);\n const previous = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (existed === present && (!present || Object.is(previous, value))) return false;\n if (parentNode.kind === 'map' || parentNode.kind === 'table') {\n const failure = schemaValue.checkKey(parentNode.key, key, []);\n if (failure)\n return issue.fail(\n container.at.concat(key, ...failure.address),\n 'invalid-key',\n failure.message\n );\n }\n if (present) {\n if (node.kind === 'field') {\n const failure = schemaValue.checkValue(node, value, []);\n if (failure)\n return issue.invalidValue(failure, container.at.concat(key, ...failure.address));\n } else this.validate(node, value, container.at.concat(key));\n if (parentNode.kind === 'list' && parentNode.keyOf(value) !== key)\n return issue.fail(\n container.at.concat(key),\n 'invalid-list-key',\n 'Replacing an item must retain its addressed key.'\n );\n }\n const membershipChanged = entry && existed !== present;\n if (membershipChanged && (parentNode.kind === 'list' || parentNode.kind === 'table'))\n this.recorder.order(container);\n this.recorder.member(container, key, member, physicalKey);\n const next = present\n ? node.kind === 'field'\n ? value\n : schemaValue.copyValue(node, value)\n : undefined;\n state.installMember(container.parent, physicalKey, present, next);\n if (node.kind !== 'field' || membershipChanged) this.invalidate();\n return membershipChanged;\n }\n invalidate(): void {\n this.generation++;\n if (this.resolvedRoot !== this.state.document) {\n this.resolvedRoot = this.state.document;\n this.resolver = address.createAddressResolver(this.state.schema, this.state.document);\n } else this.resolver.invalidate();\n }\n finish(): ChangeSet {\n return this.recorder.seal();\n }\n rollback(): void {\n this.recorder.rollback();\n this.invalidate();\n }\n}\n","import type { ChangeDirection, ChangeSet } from '../../changes';\nimport type { MutationSession } from '../session';\nimport * as state from '../state';\nimport * as sequence from '../../order/sequence';\nimport * as issue from '../issue';\nimport * as schemaValue from '../../schema/value';\nimport * as tree from '../../tree/topology';\nexport function apply(\n session: MutationSession,\n changes: ChangeSet,\n direction: ChangeDirection\n): void {\n const side = direction === 'forward' ? 'after' : 'before';\n for (const change of changes.changes) {\n if (change.kind === 'reset') {\n session.replace([], change[side]);\n } else if (change.kind === 'members') {\n const container = session.resolveContainer(change.at);\n const { node, value: current } = container;\n if (change.order) {\n if (node.kind !== 'table' && node.kind !== 'list')\n return issue.fail(change.at, 'invalid-changes', 'Order requires an ordered container.');\n session.recorder.order(container);\n }\n let membershipChanged = false;\n for (const member of change.members) {\n const present = side === 'after' ? member.kind !== 'removed' : member.kind !== 'added';\n const value =\n side === 'after'\n ? member.kind !== 'removed'\n ? member.after\n : undefined\n : member.kind !== 'added'\n ? member.before\n : undefined;\n membershipChanged =\n session.writeMember(container, member.key, value, present ? 'set' : 'remove') ||\n membershipChanged;\n }\n if (change.order) {\n const keys =\n node.kind === 'table' ? Object.keys(container.parent) : state.orderOf(node, current);\n if (!sequence.matches(change.order[side], keys))\n return issue.fail(\n change.at,\n 'invalid-changes',\n 'Order must contain exactly the resulting keys.'\n );\n state.installOrder(node, current, change.order[side]);\n session.invalidate();\n } else if (membershipChanged && node.kind === 'table') {\n const ids = (current as { ids: string[] }).ids;\n if (!sequence.matches(ids, Object.keys(container.parent)))\n return issue.fail(\n change.at,\n 'invalid-changes',\n 'Table membership changes require a matching order.'\n );\n }\n } else {\n const container = session.resolveTree(change.at);\n const { value: current, node } = container;\n session.recorder.tree(container);\n for (const item of change.nodes) session.recorder.tree(container, item.id);\n const root = change[side];\n if (root === null) delete current.rootId;\n else current.rootId = root;\n for (const item of change.nodes) {\n const next =\n side === 'after'\n ? item.kind !== 'removed'\n ? item.after\n : undefined\n : item.kind !== 'added'\n ? item.before\n : undefined;\n if (next !== undefined) {\n const diagnostic = schemaValue.checkTreePayload(\n node.value,\n next,\n change.at.concat(item.id)\n );\n if (diagnostic) issue.invalidValue(diagnostic);\n }\n state.installMember(\n current.nodes,\n item.id,\n next !== undefined,\n next && schemaValue.copyTreeNode(next)\n );\n }\n if (!tree.validate(current))\n return issue.fail(change.at, 'invalid-tree', 'Invalid tree structure.');\n session.invalidate();\n }\n }\n}\n","import type { ObjectNode, ImpactTarget } from '../schema';\nimport type { CommitListener, DocumentCommit, Unsubscribe, ObserverError } from './contract';\nimport * as target from '../impact/target';\n\ntype ProjectionAttachment<TSchema extends ObjectNode> = {\n capture(commit: DocumentCommit<TSchema>): void;\n settle(): void;\n flush(): readonly ObserverError[];\n dispose(): void;\n};\ntype ProcessorEntry<TSchema extends ObjectNode> = {\n readonly processor: ProjectionAttachment<TSchema>;\n active: boolean;\n};\ntype RootEntry<TSchema extends ObjectNode> = {\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\ntype FilteredEntry<TSchema extends ObjectNode> = {\n readonly targets: readonly ImpactTarget<unknown>[];\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\ntype NotificationState<TSchema extends ObjectNode> = {\n readonly root: Set<RootEntry<TSchema>>;\n readonly filtered: Set<FilteredEntry<TSchema>>;\n readonly index: target.SubscriptionIndex<FilteredEntry<TSchema>>;\n readonly cleanups: Set<() => void>;\n readonly processors: ProcessorEntry<TSchema>[];\n readonly candidates: Set<FilteredEntry<TSchema>>;\n readonly rootSnapshot: RootEntry<TSchema>[];\n notifying: boolean;\n};\nexport type NotificationCenter<TSchema extends ObjectNode> = {\n subscribe(listener: CommitListener<TSchema>): Unsubscribe;\n subscribeTargets(\n targets: readonly ImpactTarget<unknown>[],\n listener: CommitListener<TSchema>\n ): Unsubscribe;\n attachProjection(processor: ProjectionAttachment<TSchema>): Unsubscribe;\n publish(\n commit: DocumentCommit<TSchema>,\n afterSettle?: () => readonly ObserverError[]\n ): readonly ObserverError[];\n dispose(): void;\n};\n\nconst attachProjection = <TSchema extends ObjectNode>(\n notification: NotificationState<TSchema>,\n processor: ProjectionAttachment<TSchema>\n): Unsubscribe => {\n const entry: ProcessorEntry<TSchema> = { processor, active: true };\n notification.processors.push(entry);\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (!notification.notifying) {\n const index = notification.processors.indexOf(entry);\n if (index >= 0) notification.processors.splice(index, 1);\n }\n };\n};\n\nconst addRoot = <TSchema extends ObjectNode>(\n notification: NotificationState<TSchema>,\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: RootEntry<TSchema> = { listener, active: true };\n notification.root.add(entry);\n return () => {\n entry.active = false;\n if (!notification.notifying) notification.root.delete(entry);\n else\n notification.cleanups.add(() => {\n notification.root.delete(entry);\n });\n };\n};\n\nconst addFiltered = <TSchema extends ObjectNode>(\n notification: NotificationState<TSchema>,\n targets: readonly ImpactTarget<unknown>[],\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: FilteredEntry<TSchema> = {\n targets: Object.freeze(targets.slice()),\n listener,\n active: true,\n };\n notification.filtered.add(entry);\n entry.targets.forEach(value => notification.index.add(value, entry));\n const remove = () => {\n notification.filtered.delete(entry);\n entry.targets.forEach(value => notification.index.delete(value, entry));\n };\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (notification.notifying) notification.cleanups.add(remove);\n else remove();\n };\n};\n\nconst publishState = <TSchema extends ObjectNode>(\n notification: NotificationState<TSchema>,\n commit: DocumentCommit<TSchema>,\n afterSettle?: () => readonly ObserverError[]\n): readonly ObserverError[] => {\n notification.notifying = true;\n const errors: ObserverError[] = [];\n const call = (listener: CommitListener<TSchema>): void => {\n try {\n listener(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'listener', error }));\n }\n };\n try {\n const processorCount = notification.processors.length;\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.capture(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.settle();\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n errors.push(...entry.processor.flush());\n } catch (error) {\n errors.push(Object.freeze({ phase: 'flush', error }));\n }\n }\n\n if (afterSettle) errors.push(...afterSettle());\n const candidates = notification.candidates;\n candidates.clear();\n if (notification.filtered.size)\n notification.index.collect(commit.changes, entry => candidates.add(entry));\n candidates.forEach(entry => {\n if (entry.active) call(entry.listener);\n });\n const rootSnapshot = notification.rootSnapshot;\n rootSnapshot.length = 0;\n notification.root.forEach(entry => rootSnapshot.push(entry));\n for (const entry of rootSnapshot) if (entry.active) call(entry.listener);\n } finally {\n notification.notifying = false;\n let writeIndex = 0;\n for (const entry of notification.processors)\n if (entry.active) notification.processors[writeIndex++] = entry;\n notification.processors.length = writeIndex;\n notification.cleanups.forEach(cleanup => cleanup());\n notification.cleanups.clear();\n }\n return Object.freeze(errors);\n};\n\nconst disposeState = <TSchema extends ObjectNode>(\n notification: NotificationState<TSchema>\n): void => {\n const attachments = notification.processors.slice();\n notification.root.clear();\n notification.filtered.clear();\n notification.index.clear();\n notification.cleanups.clear();\n notification.processors.length = 0;\n notification.candidates.clear();\n notification.rootSnapshot.length = 0;\n const errors: unknown[] = [];\n attachments.forEach(entry => {\n if (!entry.active) return;\n try {\n entry.processor.dispose();\n } catch (error) {\n errors.push(error);\n }\n });\n if (errors.length) throw new AggregateError(errors, 'Projection disposal notification failed.');\n};\n\nexport const createNotificationCenter = <TSchema extends ObjectNode>(\n schema: TSchema\n): NotificationCenter<TSchema> => {\n const state: NotificationState<TSchema> = {\n root: new Set(),\n filtered: new Set(),\n index: new target.SubscriptionIndex(schema),\n cleanups: new Set(),\n processors: [],\n candidates: new Set(),\n rootSnapshot: [],\n notifying: false,\n };\n return Object.freeze({\n subscribe: (listener: CommitListener<TSchema>) => addRoot(state, listener),\n subscribeTargets: (\n targets: readonly ImpactTarget<unknown>[],\n listener: CommitListener<TSchema>\n ) => addFiltered(state, targets, listener),\n attachProjection: (processor: ProjectionAttachment<TSchema>) =>\n attachProjection(state, processor),\n publish: (commit: DocumentCommit<TSchema>, afterSettle?: () => readonly ObserverError[]) =>\n publishState(state, commit, afterSettle),\n dispose: () => disposeState(state),\n });\n};\n","import type { ObjectNode, Infer, PathPick } from './schema';\nimport { compilePath } from './schema';\nimport { createImpact } from './impact';\nimport { createHistory } from './history';\nimport { createAccess, type Draft } from './access/scope';\nimport { MutationSession } from './mutation/session';\nimport * as replay from './mutation/operations/replay';\nimport type { RuntimeWriteIntent } from './runtime/driver';\nimport * as changeSet from './mutation/changes';\nimport * as issue from './mutation/issue';\nimport type { ChangeSet } from './changes';\nimport * as schemaValue from './schema/value';\nimport {\n DocumentDisposedError,\n DocumentReentrancyError,\n TransactionRejected,\n} from './runtime/contract';\nimport type {\n CommitListener,\n CommitSource,\n DocumentCommit,\n DocumentRuntime,\n OperationResult,\n TransactionResult,\n} from './runtime/contract';\nimport { assertRuntimeWritable } from './runtime/driver';\nimport { bindContext, type RuntimeContext, type RuntimeState } from './runtime/context';\nimport { createNotificationCenter } from './runtime/notification';\n\nexport const createDocument = <S extends ObjectNode>(input: {\n readonly schema: S;\n readonly initial: Infer<S>;\n readonly history?: { readonly capacity?: number } | false;\n}): DocumentRuntime<S> => {\n if (input.schema.kind !== 'object')\n throw new TypeError('Document schema must be a root object node.');\n const invalid = schemaValue.checkValue(input.schema, input.initial);\n if (invalid) throw new schemaValue.ParseError(invalid);\n const state: RuntimeState<S> = {\n schema: input.schema,\n document: schemaValue.copyValue(input.schema, input.initial) as Infer<S>,\n disposed: false,\n projectionLocks: 0,\n };\n let revision = 0,\n busy = false;\n const notifications = createNotificationCenter(input.schema);\n let runtime!: DocumentRuntime<S>, context!: RuntimeContext<S>;\n const idle = () => {\n if (state.disposed) throw new DocumentDisposedError();\n if (busy || state.projectionLocks) throw new DocumentReentrancyError();\n };\n const writable = (intent: Parameters<typeof assertRuntimeWritable>[1]) => {\n idle();\n assertRuntimeWritable(runtime, intent);\n };\n const history = createHistory<DocumentCommit<S>>({\n capacity: input.history === false ? 0 : Math.max(0, input.history?.capacity ?? 100),\n revision: () => revision,\n apply: (changes, direction) =>\n mutate({ kind: 'apply', source: 'history' }, false, session => {\n for (const change of changes) replay.apply(session, change, direction);\n }),\n assertIdle: idle,\n notify: run => {\n busy = true;\n try {\n return run();\n } finally {\n busy = false;\n }\n },\n });\n const publish = (\n changes: ChangeSet,\n source: CommitSource,\n recordHistory: boolean\n ): Extract<OperationResult<DocumentCommit<S>>, { status: 'committed' }> => {\n const commit: DocumentCommit<S> = {\n revision: ++revision,\n source,\n changes,\n impact: createImpact(input.schema, changes),\n };\n if (source === 'remote') history.invalidate();\n else if (recordHistory && (source === 'local' || source === 'system')) history.record(changes);\n else if (source === 'history') history.publish();\n else history.endGroup();\n return {\n status: 'committed',\n commit,\n observerErrors: notifications.publish(commit, history.flush),\n };\n };\n function mutate(\n intent: Extract<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }>;\n function mutate(\n intent: Exclude<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ): OperationResult<DocumentCommit<S>>;\n function mutate(\n intent: RuntimeWriteIntent,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }> {\n writable(intent);\n busy = true;\n try {\n const session = new MutationSession(state);\n let changes: ChangeSet;\n try {\n execute(session);\n changes = session.finish();\n } catch (error) {\n session.rollback();\n if (error instanceof issue.MutationRejected)\n return { status: 'rejected', issues: [error.issue], revision };\n if (intent.kind === 'update' && error instanceof TransactionRejected)\n return { status: 'rejected', issues: error.issues, revision };\n throw error;\n }\n if (!changes.changes.length) return { status: 'unchanged', revision };\n // Publication is outside the rollback boundary: observers see accepted state.\n return publish(changes, intent.source, recordHistory);\n } finally {\n busy = false;\n }\n }\n runtime = {\n schema: input.schema,\n revision: () => revision,\n update: <V>(\n run: (draft: Draft<S>) => V,\n options?: { source?: Extract<CommitSource, 'local' | 'system'>; history?: boolean }\n ): TransactionResult<V, DocumentCommit<S>> => {\n const source = options?.source ?? 'local';\n let value!: V;\n const result = mutate({ kind: 'update', source }, options?.history ?? true, session => {\n // Draft is a trusted borrowed view. It must not escape this synchronous callback.\n const draft = createAccess({\n state,\n session,\n }) as Draft<S>;\n value = run(draft);\n if (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n throw new TypeError('Document updates must be synchronous.');\n });\n return result.status === 'rejected' ? result : { ...result, value };\n },\n apply: (inputChanges, options) =>\n mutate(\n { kind: 'apply', source: options?.source ?? 'local' },\n options?.history ?? true,\n session => {\n if (!options || options.expectedRevision !== revision)\n issue.fail([], 'baseline-mismatch', 'apply requires the current expectedRevision.');\n replay.apply(session, changeSet.decodeChanges(inputChanges), 'forward');\n }\n ),\n replace: (value, options) => {\n const source = options?.source ?? 'system';\n return mutate({ kind: 'replace', source }, source !== 'remote', session =>\n session.replace([], value)\n );\n },\n snapshot: () => {\n if (state.disposed) throw new DocumentDisposedError();\n return schemaValue.copyValue(input.schema, state.document) as Infer<S>;\n },\n subscribe: ((\n pick: PathPick<S> | readonly PathPick<S>[] | CommitListener<S>,\n listener?: CommitListener<S>\n ) => {\n if (state.disposed) throw new DocumentDisposedError();\n if (!listener) return notifications.subscribe(pick as CommitListener<S>);\n const picks: readonly PathPick<S>[] = Array.isArray(pick) ? pick : [pick as PathPick<S>];\n if (!picks.length) throw new TypeError('Expected at least one subscription path.');\n return notifications.subscribeTargets(\n picks.map(p => compilePath<S['shape']>(input.schema, 'value', p)),\n listener\n );\n }) as DocumentRuntime<S>['subscribe'],\n history: history.api,\n dispose: () => {\n if (state.disposed) return;\n idle();\n state.disposed = true;\n try {\n notifications.dispose();\n } finally {\n history.dispose();\n context.driver = undefined;\n }\n },\n };\n context = {\n state,\n owner: runtime,\n notifications,\n driver: undefined,\n bypassDepth: 0,\n };\n bindContext(runtime, context);\n bindContext(history.api, context);\n return runtime;\n};\n","import type { ObjectNode } from '../schema';\nimport type { DocumentReadable, DocumentRuntime } from './contract';\nimport { bindContext, contextOf } from './context';\n\n// A readable capability keeps the canonical runtime behind an explicit\n// mutation funnel while remaining fully compatible with selectors, views, and\n// framework subscriptions.\nexport const asReadable = <TSchema extends ObjectNode>(\n runtime: DocumentRuntime<TSchema>\n): DocumentReadable<TSchema> => {\n const readable: DocumentReadable<TSchema> = {\n revision: runtime.revision,\n subscribe: runtime.subscribe,\n };\n bindContext(readable, contextOf(runtime));\n return Object.freeze(readable);\n};\n","import type { ImpactTarget } from '../schema';\nimport * as target from '../impact/target';\n\nexport type DependencyTracker = {\n readonly record: (target: ImpactTarget<unknown>) => void;\n readonly snapshot: () => readonly ImpactTarget<unknown>[];\n};\n\nexport const createDependencyTracker = (): DependencyTracker => {\n const targets: ImpactTarget<unknown>[] = [];\n return {\n record: value => {\n if (!targets.some(entry => target.same(entry, value))) targets.push(value);\n },\n snapshot: () => Object.freeze(targets.slice()),\n };\n};\n","import type { ObjectNode } from '../schema';\nimport { createAccess, type Read } from '../access/scope';\nimport type { DependencyTracker } from '../access/dependency';\nimport { DocumentDisposedError } from './contract';\nimport type { DocumentReadable } from './contract';\nimport { contextOf } from './context';\n\nexport const readWith = <TSchema extends ObjectNode, TResult>(\n runtime: DocumentReadable<TSchema>,\n run: (read: Read<TSchema>) => TResult,\n dependencies?: DependencyTracker\n): TResult => {\n const state = contextOf<TSchema>(runtime).state;\n if (state.disposed) throw new DocumentDisposedError();\n state.projectionLocks += 1;\n try {\n const reader = createAccess({\n state,\n dependencies,\n }) as Read<TSchema>;\n return run(reader);\n } finally {\n // readWith is an internal borrowed-reader boundary. Retaining its reader or\n // collection methods after this callback is undefined behavior.\n state.projectionLocks--;\n }\n};\n","import { createDependencyTracker } from '../access/dependency';\nimport type { Read } from '../access/scope';\nimport * as target from '../impact/target';\nimport type { Readable, Unsubscribe } from '../readable';\nimport type { ImpactTarget, ObjectNode } from '../schema';\nimport { readWith } from './access';\nimport { DocumentDisposedError, type DocumentReadable } from './contract';\nimport { contextOf } from './context';\n\nexport type DocumentSelector<TSchema extends ObjectNode, TResult> = (\n read: Read<TSchema>\n) => TResult;\n\nexport const read = <TSchema extends ObjectNode, TResult>(\n document: DocumentReadable<TSchema>,\n selector: DocumentSelector<TSchema, TResult>\n): TResult => readWith(document, selector);\n\nconst sameDependencySet = (\n left: readonly ImpactTarget<unknown>[],\n right: readonly ImpactTarget<unknown>[]\n): boolean => {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1)\n if (!target.same(left[index], right[index])) return false;\n return true;\n};\n\nexport const select = <TSchema extends ObjectNode, TResult>(\n document: DocumentReadable<TSchema>,\n selector: DocumentSelector<TSchema, TResult>,\n equality: (previous: TResult, next: TResult) => boolean = Object.is\n): Readable<TResult> => {\n const context = contextOf<TSchema>(document);\n let initialized = false;\n let value!: TResult;\n let selectedRevision = 0;\n let documentRevision = -1;\n let dependencies: readonly ImpactTarget<unknown>[] = Object.freeze([]);\n let unsubscribeDocument: Unsubscribe | undefined;\n const listeners = new Set<() => void>();\n\n const evaluate = (): { readonly changed: boolean; readonly rebound: boolean } => {\n const tracker = createDependencyTracker();\n const next = readWith(document, selector, tracker);\n const nextDependencies = tracker.snapshot();\n const changed = !initialized || !equality(value, next);\n const rebound = !sameDependencySet(dependencies, nextDependencies);\n if (changed) {\n if (initialized) selectedRevision += 1;\n value = next;\n }\n dependencies = nextDependencies;\n initialized = true;\n documentRevision = document.revision();\n return { changed, rebound };\n };\n\n const installSubscription = (): void => {\n unsubscribeDocument?.();\n unsubscribeDocument =\n dependencies.length > 0\n ? context.notifications.subscribeTargets(dependencies, () => {\n const result = evaluate();\n if (result.rebound) installSubscription();\n if (result.changed) for (const listener of [...listeners]) listener();\n })\n : undefined;\n };\n\n const ensureCurrent = (): TResult => {\n if (context.state.disposed) throw new DocumentDisposedError();\n if (!initialized || (!unsubscribeDocument && documentRevision !== document.revision()))\n evaluate();\n return value;\n };\n\n return Object.freeze({\n current: ensureCurrent,\n revision: () => {\n ensureCurrent();\n return selectedRevision;\n },\n subscribe: (listener: () => void) => {\n ensureCurrent();\n listeners.add(listener);\n if (listeners.size === 1) installSubscription();\n return () => {\n listeners.delete(listener);\n if (!listeners.size) {\n unsubscribeDocument?.();\n unsubscribeDocument = undefined;\n }\n };\n },\n });\n};\n","import type { CollectionChange } from '../contract';\n\ntype Added<K extends string, V> = { readonly key: K; readonly after: V };\ntype Updated<K extends string, V> = {\n readonly key: K;\n readonly before: V;\n readonly after: V;\n};\ntype Removed<K extends string, V> = { readonly key: K; readonly before: V };\n\nconst commonOrderChanged = <K extends string>(\n before: readonly K[],\n after: readonly K[],\n added: ReadonlySet<K>,\n removed: ReadonlySet<K>\n): boolean => {\n const beforeCommon = before.filter(key => !removed.has(key));\n const afterCommon = after.filter(key => !added.has(key));\n return beforeCommon.some((key, index) => afterCommon[index] !== key);\n};\n\n/** Builds the canonical incremental CollectionChange from already-known net transitions. */\nexport const createCollectionChange = <K extends string, V>(input: {\n readonly added: readonly Added<K, V>[];\n readonly updated: readonly Updated<K, V>[];\n readonly removed: readonly Removed<K, V>[];\n readonly beforeOrder: readonly K[];\n readonly afterOrder: readonly K[];\n}): CollectionChange<K, V> | undefined => {\n const addedKeys = new Set(input.added.map(entry => entry.key));\n const removedKeys = new Set(input.removed.map(entry => entry.key));\n const orderChanged =\n input.beforeOrder !== input.afterOrder &&\n commonOrderChanged(input.beforeOrder, input.afterOrder, addedKeys, removedKeys);\n if (!input.added.length && !input.updated.length && !input.removed.length && !orderChanged)\n return undefined;\n return Object.freeze({\n kind: 'incremental' as const,\n added: Object.freeze([...input.added]),\n updated: Object.freeze([...input.updated]),\n removed: Object.freeze([...input.removed]),\n ...(orderChanged\n ? {\n order: Object.freeze({\n before: Object.freeze([...input.beforeOrder]),\n after: Object.freeze([...input.afterOrder]),\n }),\n }\n : {}),\n });\n};\n\n/** Exact fallback diff between two published map-like snapshots. */\nexport const diffCollection = <K extends string, V>(\n previous: ReadonlyMap<K, V>,\n current: ReadonlyMap<K, V>,\n isEqual: (previous: V, next: V) => boolean = Object.is\n): CollectionChange<K, V> | undefined => {\n const added: Added<K, V>[] = [];\n const updated: Updated<K, V>[] = [];\n const removed: Removed<K, V>[] = [];\n for (const [key, before] of previous) {\n if (!current.has(key)) removed.push({ key, before });\n else {\n const after = current.get(key) as V;\n if (!isEqual(before, after)) updated.push({ key, before, after });\n }\n }\n for (const [key, after] of current) if (!previous.has(key)) added.push({ key, after });\n return createCollectionChange({\n added,\n updated,\n removed,\n beforeOrder: [...previous.keys()],\n afterOrder: [...current.keys()],\n });\n};\n\nexport const collectionChangedKeys = <K extends string, V>(\n change: CollectionChange<K, V>\n): ReadonlySet<K> =>\n change.kind === 'reset'\n ? new Set<K>()\n : new Set([\n ...change.added.map(entry => entry.key),\n ...change.updated.map(entry => entry.key),\n ...change.removed.map(entry => entry.key),\n ]);\n\nexport const collectionHasStructuralChange = <K extends string, V>(\n change: CollectionChange<K, V>\n): boolean =>\n change.kind === 'reset' || Boolean(change.added.length || change.removed.length || change.order);\n\nexport const collectionHasAnyChange = <K extends string, V>(\n change: CollectionChange<K, V>\n): boolean =>\n change.kind === 'reset' ||\n Boolean(change.added.length || change.updated.length || change.removed.length || change.order);\n","import { profile } from '../../profile';\n\ntype IndexNode<K extends string, V> = {\n readonly key: K;\n readonly value: V;\n readonly height: number;\n readonly left?: IndexNode<K, V>;\n readonly right?: IndexNode<K, V>;\n};\n\nconst height = <K extends string, V>(node: IndexNode<K, V> | undefined): number =>\n node?.height ?? 0;\n\nconst node = <K extends string, V>(\n key: K,\n value: V,\n left?: IndexNode<K, V>,\n right?: IndexNode<K, V>\n): IndexNode<K, V> => {\n profile.collectionIndex.node();\n return Object.freeze({\n key,\n value,\n left,\n right,\n height: Math.max(height(left), height(right)) + 1,\n });\n};\n\nconst rotateLeft = <K extends string, V>(current: IndexNode<K, V>): IndexNode<K, V> => {\n const right = current.right!;\n return node(\n right.key,\n right.value,\n node(current.key, current.value, current.left, right.left),\n right.right\n );\n};\n\nconst rotateRight = <K extends string, V>(current: IndexNode<K, V>): IndexNode<K, V> => {\n const left = current.left!;\n return node(\n left.key,\n left.value,\n left.left,\n node(current.key, current.value, left.right, current.right)\n );\n};\n\nconst rebalance = <K extends string, V>(current: IndexNode<K, V>): IndexNode<K, V> => {\n const balance = height(current.left) - height(current.right);\n if (balance > 1) {\n if (height(current.left!.left) < height(current.left!.right))\n return rotateRight(\n node(current.key, current.value, rotateLeft(current.left!), current.right)\n );\n return rotateRight(current);\n }\n if (balance < -1) {\n if (height(current.right!.right) < height(current.right!.left))\n return rotateLeft(\n node(current.key, current.value, current.left, rotateRight(current.right!))\n );\n return rotateLeft(current);\n }\n return current;\n};\n\nconst setNode = <K extends string, V>(\n current: IndexNode<K, V> | undefined,\n key: K,\n value: V\n): IndexNode<K, V> => {\n if (!current) return node(key, value);\n if (key === current.key) return node(key, value, current.left, current.right);\n if (key < current.key)\n return rebalance(\n node(current.key, current.value, setNode(current.left, key, value), current.right)\n );\n return rebalance(\n node(current.key, current.value, current.left, setNode(current.right, key, value))\n );\n};\n\nconst minNode = <K extends string, V>(current: IndexNode<K, V>): IndexNode<K, V> =>\n current.left ? minNode(current.left) : current;\n\nconst removeNode = <K extends string, V>(\n current: IndexNode<K, V> | undefined,\n key: K\n): IndexNode<K, V> | undefined => {\n if (!current) return undefined;\n if (key < current.key)\n return rebalance(\n node(current.key, current.value, removeNode(current.left, key), current.right)\n );\n if (key > current.key)\n return rebalance(\n node(current.key, current.value, current.left, removeNode(current.right, key))\n );\n if (!current.left) return current.right;\n if (!current.right) return current.left;\n const next = minNode(current.right);\n return rebalance(node(next.key, next.value, current.left, removeNode(current.right, next.key)));\n};\n\nconst fromSorted = <K extends string, V>(\n entries: readonly (readonly [K, V])[],\n start = 0,\n end = entries.length\n): IndexNode<K, V> | undefined => {\n if (start >= end) return undefined;\n const middle = (start + end) >> 1;\n const [key, value] = entries[middle];\n return node(key, value, fromSorted(entries, start, middle), fromSorted(entries, middle + 1, end));\n};\n\n/** Immutable keyed lookup used to keep published collection snapshots durable across revisions. */\nexport class PersistentKeyedIndex<K extends string, V> {\n private constructor(private readonly root?: IndexNode<K, V>) {}\n\n static empty<K extends string, V>(): PersistentKeyedIndex<K, V> {\n return new PersistentKeyedIndex<K, V>();\n }\n\n static from<K extends string, V>(entries: Iterable<readonly [K, V]>): PersistentKeyedIndex<K, V> {\n const sorted = [...entries].sort(([left], [right]) =>\n left < right ? -1 : left > right ? 1 : 0\n );\n profile.collectionIndex.build(sorted.length);\n return new PersistentKeyedIndex(fromSorted(sorted));\n }\n\n get(key: K): V | undefined {\n let current = this.root;\n while (current) {\n if (key === current.key) return current.value;\n current = key < current.key ? current.left : current.right;\n }\n return undefined;\n }\n\n has(key: K): boolean {\n let current = this.root;\n while (current) {\n if (key === current.key) return true;\n current = key < current.key ? current.left : current.right;\n }\n return false;\n }\n\n set(key: K, value: V): PersistentKeyedIndex<K, V> {\n return new PersistentKeyedIndex(setNode(this.root, key, value));\n }\n\n remove(key: K): PersistentKeyedIndex<K, V> {\n return new PersistentKeyedIndex(removeNode(this.root, key));\n }\n}\n","import { profile } from '../../profile';\nimport { createCollectionChange } from '../collection/change';\nimport { PersistentKeyedIndex } from '../collection/index';\nimport type {\n CollectionChange,\n CollectionContext,\n CollectionDraft,\n CollectionRead,\n} from '../contract';\nimport { assertScope } from '../graph/scheduler';\n\ntype Entry<V> = { readonly present: true; readonly value: V } | { readonly present: false };\n\ntype PublishedCollection<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n keys(): IterableIterator<K>;\n size(): number;\n ids(): readonly K[];\n read(check: () => void): CollectionRead<K, V>;\n publish(staged: ReadonlyMap<K, Entry<V>>, ids: readonly K[], reset: boolean): void;\n release(): void;\n};\n\nconst createPublishedCollection = <K extends string, V>(): PublishedCollection<K, V> => {\n const values = new Map<K, V>();\n let ids: readonly K[] = Object.freeze([]);\n let index = PersistentKeyedIndex.empty<K, V>();\n\n return {\n get: key => values.get(key),\n has: key => values.has(key),\n keys: () => values.keys(),\n size: () => values.size,\n ids: () => ids,\n read: check => {\n const snapshotIndex = index;\n const snapshotIds = ids;\n return Object.freeze({\n get: key => {\n check();\n return snapshotIndex.get(key);\n },\n has: key => {\n check();\n return snapshotIndex.has(key);\n },\n ids: () => {\n check();\n return snapshotIds;\n },\n });\n },\n publish: (staged, nextIds, reset) => {\n if (reset) {\n const entries: [K, V][] = [];\n for (const [key, entry] of staged) if (entry.present) entries.push([key, entry.value]);\n index = PersistentKeyedIndex.from(entries);\n values.clear();\n } else {\n for (const [key, entry] of staged)\n index = entry.present ? index.set(key, entry.value) : index.remove(key);\n }\n for (const [key, entry] of staged) {\n if (entry.present) values.set(key, entry.value);\n else values.delete(key);\n }\n ids = nextIds;\n },\n release: () => {\n values.clear();\n ids = Object.freeze([]);\n index = PersistentKeyedIndex.empty<K, V>();\n },\n };\n};\n\nexport type CollectionOutputEvaluation<K extends string, V> = {\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly output: CollectionDraft<K, V>;\n};\n\nexport type CollectionOutputState<K extends string, V> = {\n begin(active: () => boolean, initialize: boolean): CollectionOutputEvaluation<K, V>;\n seal(reset: boolean, isEqual: (previous: V, next: V) => boolean): boolean;\n context(active: () => boolean, cause: unknown): CollectionContext<K, V>;\n current(check: () => void): CollectionRead<K, V>;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n subscribe(listener: (change: CollectionChange<K, V>) => void): void;\n unsubscribe(listener: (change: CollectionChange<K, V>) => void): void;\n};\n\n/** Owns staged keyed intent, exact transitions and published collection state. */\nexport const createCollectionOutput = <K extends string, V>(): CollectionOutputState<K, V> => {\n const published = createPublishedCollection<K, V>();\n let staged = new Map<K, Entry<V>>();\n let nextIds = published.ids();\n let change: CollectionChange<K, V> | undefined;\n let initialized = false;\n let reset = false;\n let revision = 0;\n let explicitOrder: readonly K[] | undefined;\n let cleared = false;\n const listeners = new Set<(change: CollectionChange<K, V>) => void>();\n\n const hasNext = (key: K): boolean =>\n staged.has(key) ? staged.get(key)!.present : !cleared && published.has(key);\n\n const getNext = (key: K): V | undefined => {\n const entry = staged.get(key);\n return entry\n ? entry.present\n ? entry.value\n : undefined\n : cleared\n ? undefined\n : published.get(key);\n };\n\n const deriveIds = (): readonly K[] => {\n const result = cleared ? [] : published.ids().filter(hasNext);\n for (const [key, entry] of staged)\n if (entry.present && (cleared || !published.has(key))) result.push(key);\n return result;\n };\n\n const begin = (active: () => boolean, initialize: boolean): CollectionOutputEvaluation<K, V> => {\n staged = new Map();\n nextIds = published.ids();\n change = undefined;\n explicitOrder = undefined;\n cleared = initialize;\n reset = initialize;\n const read = (next: boolean): CollectionRead<K, V> => ({\n get: key => {\n assertScope(active);\n return next ? getNext(key) : published.get(key);\n },\n has: key => {\n assertScope(active);\n return next ? hasNext(key) : published.has(key);\n },\n ids: () => {\n assertScope(active);\n return next\n ? Object.freeze(explicitOrder ? [...explicitOrder] : [...deriveIds()])\n : published.ids();\n },\n });\n const output: CollectionDraft<K, V> = {\n set: (key, value) => {\n assertScope(active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: true, value });\n },\n remove: key => {\n assertScope(active);\n staged.set(key, { present: false });\n },\n order: order => {\n assertScope(active);\n explicitOrder = Object.freeze([...order]);\n },\n };\n return { previous: read(false), next: read(true), output };\n };\n\n const seal = (nextReset: boolean, isEqual: (previous: V, next: V) => boolean): boolean => {\n if (cleared)\n for (const key of published.keys()) if (!staged.has(key)) staged.set(key, { present: false });\n\n profile.projection('touchedKeys', staged.size);\n const added = new Set<K>();\n const removed = new Set<K>();\n const updated = new Set<K>();\n for (const [key, entry] of staged) {\n const existed = published.has(key);\n if (entry.present) {\n if (!existed) added.add(key);\n else if (!isEqual(published.get(key) as V, entry.value)) updated.add(key);\n else if (!nextReset) staged.delete(key);\n } else if (existed) removed.add(key);\n else staged.delete(key);\n }\n\n const ids = published.ids();\n if (explicitOrder || added.size || removed.size) {\n const order = explicitOrder ?? [...ids.filter(key => !removed.has(key)), ...added];\n const seen = new Set(order);\n if (\n seen.size !== order.length ||\n order.length !== published.size() + added.size - removed.size ||\n order.some(key => !hasNext(key))\n )\n throw new TypeError('Projection order must contain every key exactly once.');\n nextIds =\n ids.length === order.length && ids.every((key, index) => key === order[index])\n ? ids\n : Object.freeze([...order]);\n } else nextIds = ids;\n\n const changedKeys = new Set<K>([...added, ...removed, ...updated]);\n profile.projection('changedKeys', changedKeys.size);\n const addedEntries: { readonly key: K; readonly after: V }[] = [];\n const updatedEntries: { readonly key: K; readonly before: V; readonly after: V }[] = [];\n const removedEntries: { readonly key: K; readonly before: V }[] = [];\n for (const key of changedKeys) {\n const beforePresent = published.has(key);\n const afterPresent = hasNext(key);\n if (beforePresent === afterPresent) {\n if (!beforePresent || isEqual(published.get(key) as V, getNext(key) as V)) continue;\n }\n if (!beforePresent) addedEntries.push({ key, after: getNext(key) as V });\n else if (!afterPresent) removedEntries.push({ key, before: published.get(key) as V });\n else\n updatedEntries.push({\n key,\n before: published.get(key) as V,\n after: getNext(key) as V,\n });\n }\n\n change = nextReset\n ? Object.freeze({ kind: 'reset' as const })\n : createCollectionChange({\n added: addedEntries,\n updated: updatedEntries,\n removed: removedEntries,\n beforeOrder: ids,\n afterOrder: nextIds,\n });\n reset = nextReset;\n return change !== undefined;\n };\n\n const context = (active: () => boolean, cause: unknown): CollectionContext<K, V> =>\n Object.freeze({\n kind: 'collection' as const,\n read: {\n get: key => {\n assertScope(active);\n return getNext(key);\n },\n has: key => {\n assertScope(active);\n return hasNext(key);\n },\n ids: () => {\n assertScope(active);\n return nextIds;\n },\n },\n change,\n revision,\n reset,\n cause,\n });\n\n return {\n begin,\n seal,\n context,\n current: check => published.read(check),\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (change) published.publish(staged, nextIds, change.kind === 'reset');\n if (change && initialized) revision++;\n initialized = true;\n },\n emit: call => {\n const resetEvent = Object.freeze({ kind: 'reset' as const });\n Array.from(listeners).forEach(listener => call(() => listener(change ?? resetEvent)));\n },\n clear: () => {\n staged.clear();\n nextIds = published.ids();\n change = undefined;\n reset = false;\n explicitOrder = undefined;\n cleared = false;\n },\n release: () => {\n published.release();\n staged.clear();\n listeners.clear();\n nextIds = Object.freeze([]);\n change = undefined;\n initialized = false;\n revision = 0;\n reset = false;\n explicitOrder = undefined;\n cleared = false;\n },\n subscribe: listener => listeners.add(listener),\n unsubscribe: listener => listeners.delete(listener),\n };\n};\n","import { profile } from '../../profile';\nimport type { ValueContext } from '../contract';\nimport { assertScope } from '../graph/scheduler';\n\nconst unset = Symbol('projection-value-unset');\n\nexport type ValueOutputEvaluation<T> = {\n readonly previous: T | undefined;\n readonly next: () => T | undefined;\n readonly output: { set(value: T): void };\n};\n\nexport type ValueOutputState<T> = {\n begin(active: () => boolean, initialize: boolean): ValueOutputEvaluation<T>;\n seal(reset: boolean, isEqual: (previous: T, next: T) => boolean): boolean;\n context(active: () => boolean, cause: unknown): ValueContext<T>;\n current(check: () => void): T;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n subscribe(listener: () => void): void;\n unsubscribe(listener: () => void): void;\n};\n\n/** Owns staged and published state for one scalar Projection output. */\nexport const createValueOutput = <T>(): ValueOutputState<T> => {\n let value!: T;\n let staged: T | typeof unset = unset;\n let next!: T;\n let initialized = false;\n let revision = 0;\n let changed = false;\n let reset = false;\n const listeners = new Set<() => void>();\n\n const begin = (active: () => boolean, initialize: boolean): ValueOutputEvaluation<T> => {\n staged = unset;\n next = value;\n changed = false;\n reset = initialize;\n return {\n previous: initialized ? value : undefined,\n next: () => {\n assertScope(active);\n if (staged !== unset) return staged;\n return initialize ? undefined : initialized ? value : undefined;\n },\n output: Object.freeze({\n set: (candidate: T) => {\n assertScope(active);\n staged = candidate;\n },\n }),\n };\n };\n\n const seal = (nextReset: boolean, isEqual: (previous: T, next: T) => boolean): boolean => {\n if (reset && staged === unset)\n throw new TypeError('Value output must be initialized on reset.');\n if (staged === unset) {\n reset = nextReset;\n changed = false;\n next = value;\n return false;\n }\n const candidate = staged;\n changed = !initialized || !isEqual(value, candidate);\n next = changed ? candidate : value;\n reset = nextReset;\n return changed;\n };\n\n return {\n begin,\n seal,\n context: (active, cause) => {\n assertScope(active);\n return Object.freeze({\n kind: 'value' as const,\n value: next,\n revision,\n reset,\n cause,\n });\n },\n current: check => {\n check();\n return value;\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (changed && initialized) revision++;\n if (changed) value = next;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n Array.from(listeners).forEach(listener => call(listener));\n },\n clear: () => {\n staged = unset;\n next = value;\n changed = false;\n reset = false;\n },\n release: () => {\n listeners.clear();\n staged = unset;\n value = next = undefined as T;\n initialized = false;\n revision = 0;\n changed = false;\n reset = false;\n },\n subscribe: listener => listeners.add(listener),\n unsubscribe: listener => listeners.delete(listener),\n };\n};\n","import { profile } from '../../profile';\nimport { createCollectionOutput, type CollectionOutputState } from '../output/collection';\nimport { ProjectionDisposedError } from '../contract';\nimport type {\n CollectionOutputEvaluation,\n OutputDefinition,\n OutputEvaluation,\n ProcessorDefinition,\n ProcessorInstance,\n ValueOutputEvaluation,\n} from '../definition';\nimport {\n assertSynchronous,\n type OutputRecord,\n type ProcessorRecord,\n type Scheduler,\n} from './scheduler';\nimport { createValueOutput, type ValueOutputState } from '../output/value';\n\ntype BoundOutput =\n | {\n readonly kind: 'value';\n readonly definition: Extract<OutputDefinition, { readonly kind: 'value' }>;\n readonly state: ValueOutputState<unknown>;\n readonly output: OutputRecord;\n }\n | {\n readonly kind: 'collection';\n readonly definition: Extract<OutputDefinition, { readonly kind: 'collection' }>;\n readonly state: CollectionOutputState<string, unknown>;\n readonly output: OutputRecord;\n };\n\n/** Materializes every derive/incremental/group definition through one processor lifecycle. */\nexport const createProcessor = (\n scheduler: Scheduler,\n definition: ProcessorDefinition,\n dependencies: readonly OutputRecord[]\n): ProcessorRecord => {\n scheduler.assertIdle();\n let processor!: ProcessorRecord;\n let instance: ProcessorInstance | undefined;\n let cause: unknown;\n\n const check = () => {\n if (!scheduler.active || processor.disposed) throw new ProjectionDisposedError();\n if (processor.fault) throw processor.fault;\n };\n\n const bound: readonly BoundOutput[] = definition.outputs.map(outputDefinition => {\n if (outputDefinition.kind === 'value') {\n const state = createValueOutput<unknown>();\n const output: OutputRecord = {\n kind: 'value',\n get owner() {\n return processor;\n },\n consumers: new Set(),\n context: active => state.context(active, cause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = () => listener();\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n return { kind: 'value', definition: outputDefinition, state, output };\n }\n const state = createCollectionOutput<string, unknown>();\n const output: OutputRecord = {\n kind: 'collection',\n get owner() {\n return processor;\n },\n consumers: new Set(),\n context: active => state.context(active, cause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = (change: import('../contract').CollectionChange<string, unknown>) =>\n listener(change);\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n return { kind: 'collection', definition: outputDefinition, state, output };\n });\n\n const begin = (active: () => boolean, initialize: boolean): readonly OutputEvaluation[] =>\n Object.freeze(\n bound.map(entry => {\n if (entry.kind === 'value') {\n const evaluation = entry.state.begin(active, initialize);\n return Object.freeze({ kind: 'value' as const, ...evaluation }) as ValueOutputEvaluation;\n }\n const evaluation = entry.state.begin(active, initialize);\n return Object.freeze({\n kind: 'collection' as const,\n ...evaluation,\n }) as CollectionOutputEvaluation;\n })\n );\n\n const seal = (reset: boolean): readonly OutputRecord[] => {\n const changed: OutputRecord[] = [];\n for (const entry of bound) {\n const didChange = entry.state.seal(reset, entry.definition.equality);\n if (didChange) changed.push(entry.output);\n }\n return Object.freeze(changed);\n };\n\n const run = (reset: boolean, runCause: unknown): readonly OutputRecord[] => {\n cause = runCause;\n let active = true;\n try {\n const scopeActive = () => active;\n const sources = Object.freeze(dependencies.map(output => output.context(scopeActive)));\n let outputs = begin(scopeActive, reset);\n if (!instance) instance = definition.create();\n profile.materialized[reset ? 'rebuilt' : 'updated']();\n let result = instance.evaluate({ reset, cause: runCause, sources, outputs });\n assertSynchronous(result);\n if (result?.kind === 'rebuild') {\n if (reset) throw new TypeError('Initial or reset projection processor cannot rebuild.');\n instance.release?.();\n instance = definition.create();\n outputs = begin(scopeActive, true);\n result = instance.evaluate({ reset: true, cause: runCause, sources, outputs });\n assertSynchronous(result);\n if (result?.kind === 'rebuild')\n throw new TypeError('Reset projection processor cannot rebuild again.');\n return seal(true);\n }\n return seal(reset);\n } finally {\n active = false;\n }\n };\n\n const order = scheduler.order();\n processor = {\n kind: 'processor',\n order,\n name: definition.name ? `${definition.name} (${order})` : `projection-${order}`,\n dependencies: Object.freeze([...dependencies]),\n outputs: Object.freeze(bound.map(entry => entry.output)),\n fault: undefined,\n disposed: false,\n evaluate: run,\n publish: () => bound.forEach(entry => entry.state.publish()),\n clear: () => {\n bound.forEach(entry => entry.state.clear());\n cause = undefined;\n },\n release: () => {\n instance?.release?.();\n instance = undefined;\n bound.forEach(entry => {\n entry.output.consumers.clear();\n entry.state.release();\n });\n cause = undefined;\n },\n };\n\n try {\n scheduler.initialize(() => {\n const invalid = dependencies.find(output => output.owner.fault || output.owner.disposed);\n if (invalid) throw invalid.owner.fault ?? new ProjectionDisposedError();\n const changed = processor.evaluate(true, undefined);\n if (changed.length) processor.publish();\n processor.clear();\n });\n } catch (error) {\n processor.release();\n throw error;\n }\n scheduler.addProcessor(processor);\n return processor;\n};\n","import type { Unsubscribe } from '../../runtime/contract';\nimport {\n collectionChangedKeys,\n collectionHasAnyChange,\n collectionHasStructuralChange,\n diffCollection,\n} from '../collection/change';\nimport type { CollectionChange } from '../contract';\nimport type { Readable } from '../../readable';\n\nexport type ProjectionReadableSource<T> = {\n readonly kind: 'value' | 'collection';\n current(): T;\n revision(): number;\n subscribe(listener: (change?: CollectionChange<string, unknown>) => void): Unsubscribe;\n};\n\ntype SelectionTracker = {\n readonly keys: Set<string>;\n all: boolean;\n structure: boolean;\n};\n\ntype Selection = {\n readonly keys: ReadonlySet<string>;\n readonly all: boolean;\n readonly structure: boolean;\n};\n\nlet activeTracker: SelectionTracker | undefined;\n\nconst trackKey = (key: string): void => {\n activeTracker?.keys.add(key);\n};\n\nconst trackStructure = (): void => {\n if (activeTracker) activeTracker.structure = true;\n};\n\nconst trackAll = (): void => {\n if (activeTracker) activeTracker.all = true;\n};\n\nexport const isMapLike = (value: unknown): value is ReadonlyMap<string, unknown> =>\n value instanceof Map ||\n (value !== null &&\n typeof value === 'object' &&\n typeof (value as { get?: unknown }).get === 'function' &&\n typeof (value as { keys?: unknown }).keys === 'function' &&\n typeof (value as { entries?: unknown }).entries === 'function');\n\nconst trackedMap = <K extends string, V>(source: ReadonlyMap<K, V>): ReadonlyMap<K, V> => {\n const view: ReadonlyMap<K, V> = {\n get: key => {\n trackKey(key);\n return source.get(key);\n },\n has: key => {\n trackKey(key);\n return source.has(key);\n },\n get size() {\n trackStructure();\n return source.size;\n },\n keys: () => {\n trackStructure();\n return source.keys();\n },\n values: () => {\n trackAll();\n return source.values();\n },\n entries: () => {\n trackAll();\n return source.entries();\n },\n forEach: (callback, thisArg) => {\n trackAll();\n source.forEach((value, key) => callback.call(thisArg, value, key, view));\n },\n [Symbol.iterator]: () => {\n trackAll();\n return source[Symbol.iterator]();\n },\n };\n return Object.freeze(view);\n};\n\nconst selectionAffects = (\n selection: Selection,\n change: CollectionChange<string, unknown> | undefined\n): boolean => {\n if (!change || change.kind === 'reset') return true;\n if (selection.all && collectionHasAnyChange(change)) return true;\n if (selection.structure && collectionHasStructuralChange(change)) return true;\n const changedKeys = collectionChangedKeys(change);\n for (const key of selection.keys) if (changedKeys.has(key)) return true;\n return false;\n};\n\nexport const createDirectReadable = <T>(source: ProjectionReadableSource<T>): Readable<T> =>\n Object.freeze({\n current: source.current,\n revision: source.revision,\n subscribe: (listener: () => void) => source.subscribe(() => listener()),\n });\n\n/** Consumer-side selector tracking; it never mutates processor dependencies. */\nexport const createSelectorReadable = <T, R>(\n source: ProjectionReadableSource<T>,\n selector: (value: T) => R,\n equality: (previous: R, next: R) => boolean = Object.is\n): Readable<R> => {\n let initialized = false;\n let value!: R;\n let selectedRevision = 0;\n let sourceRevision = -1;\n let selection: Selection = Object.freeze({\n keys: new Set<string>(),\n all: true,\n structure: false,\n });\n let previousCollection: ReadonlyMap<string, unknown> | undefined;\n let unsubscribeSource: Unsubscribe | undefined;\n const listeners = new Set<() => void>();\n\n const updateCollectionSnapshot = (current?: T) => {\n const candidate = current ?? source.current();\n previousCollection = isMapLike(candidate) ? candidate : undefined;\n };\n\n const evaluate = (): boolean => {\n const tracker: SelectionTracker = { keys: new Set(), all: false, structure: false };\n const previousTracker = activeTracker;\n activeTracker = tracker;\n let current!: T;\n let next!: R;\n try {\n current = source.current();\n const selectedSource = isMapLike(current) ? (trackedMap(current) as unknown as T) : current;\n next = selector(selectedSource);\n } finally {\n activeTracker = previousTracker;\n }\n const nextSelection: Selection = Object.freeze({\n keys: new Set(tracker.keys),\n all: tracker.all || (isMapLike(current) && tracker.keys.size === 0 && !tracker.structure),\n structure: tracker.structure,\n });\n const changed = !initialized || !equality(value, next);\n if (changed) {\n if (initialized) selectedRevision++;\n value = next;\n }\n selection = nextSelection;\n initialized = true;\n sourceRevision = source.revision();\n updateCollectionSnapshot(current);\n return changed;\n };\n\n const ensureCurrent = (): R => {\n const revision = source.revision();\n if (!initialized || (!unsubscribeSource && sourceRevision !== revision)) evaluate();\n return value;\n };\n\n const onProjectionChange = (incoming?: CollectionChange<string, unknown>) => {\n let change = incoming;\n if (!change && previousCollection) {\n const current = source.current();\n if (isMapLike(current)) {\n change = diffCollection(previousCollection, current);\n previousCollection = current;\n if (!change) {\n sourceRevision = source.revision();\n return;\n }\n } else previousCollection = undefined;\n }\n if (!selectionAffects(selection, change)) {\n sourceRevision = source.revision();\n updateCollectionSnapshot();\n return;\n }\n if (evaluate()) Array.from(listeners).forEach(listener => listener());\n };\n\n const installSource = () => {\n if (!unsubscribeSource) unsubscribeSource = source.subscribe(onProjectionChange);\n };\n\n return Object.freeze({\n current: ensureCurrent,\n revision: () => {\n ensureCurrent();\n return selectedRevision;\n },\n subscribe: (listener: () => void) => {\n ensureCurrent();\n listeners.add(listener);\n installSource();\n return () => {\n listeners.delete(listener);\n if (!listeners.size && unsubscribeSource) {\n unsubscribeSource();\n unsubscribeSource = undefined;\n }\n };\n },\n });\n};\n","import * as sequence from '../../order/sequence';\nimport { profile } from '../../profile';\nimport type { DocumentNode, DocumentTreeNode } from '../../schema';\nimport { compiledShape } from '../../schema/layout';\nimport * as schemaValue from '../../schema/value';\nimport { installOwn, isRecord } from '../../value/record';\n\nexport type DocumentDirty = {\n replace: boolean;\n order: boolean;\n treeRoot: boolean;\n readonly treeNodes: Set<string>;\n readonly children: Map<string, DocumentDirty>;\n};\n\nexport const createDocumentDirty = (): DocumentDirty => ({\n replace: false,\n order: false,\n treeRoot: false,\n treeNodes: new Set(),\n children: new Map(),\n});\n\nexport const clearDocumentDirty = (dirty: DocumentDirty): void => {\n dirty.replace = false;\n dirty.order = false;\n dirty.treeRoot = false;\n dirty.treeNodes.clear();\n dirty.children.clear();\n};\n\nconst hasDocumentDirty = (dirty: DocumentDirty): boolean =>\n dirty.replace ||\n dirty.order ||\n dirty.treeRoot ||\n dirty.treeNodes.size > 0 ||\n dirty.children.size > 0;\n\nconst locate = (dirty: DocumentDirty, path: readonly string[]): DocumentDirty | undefined => {\n let current = dirty;\n for (const key of path) {\n if (current.replace) return undefined;\n let child = current.children.get(key);\n if (!child) {\n child = createDocumentDirty();\n current.children.set(key, child);\n }\n current = child;\n }\n return current;\n};\n\nexport const markDocumentReplace = (dirty: DocumentDirty, path: readonly string[]): void => {\n const current = locate(dirty, path);\n if (!current) return;\n current.replace = true;\n current.order = false;\n current.treeRoot = false;\n current.treeNodes.clear();\n current.children.clear();\n};\n\nexport const markDocumentOrder = (dirty: DocumentDirty, path: readonly string[]): void => {\n const current = locate(dirty, path);\n if (current && !current.replace) current.order = true;\n};\n\nexport const markDocumentTree = (\n dirty: DocumentDirty,\n path: readonly string[],\n root: boolean,\n nodes: Iterable<string>\n): void => {\n const current = locate(dirty, path);\n if (!current || current.replace) return;\n current.treeRoot ||= root;\n for (const id of nodes) current.treeNodes.add(id);\n};\n\nconst equivalent = (node: DocumentNode, left: unknown, right: unknown): boolean =>\n node.kind === 'field' ? Object.is(left, right) : schemaValue.equalValue(node, left, right);\n\nconst replaceValue = (node: DocumentNode, previous: unknown, current: unknown): unknown =>\n equivalent(node, previous, current) ? previous : schemaValue.copyValue(node, current);\n\nconst cloneRecord = (value: Record<string, unknown>): Record<string, unknown> => {\n profile.copy.shallowRecord(Object.getOwnPropertyNames(value).length);\n return Object.create(\n Object.getPrototypeOf(value),\n Object.getOwnPropertyDescriptors(value)\n ) as Record<string, unknown>;\n};\n\nconst materializeRecordChild = (\n node: DocumentNode,\n previous: Record<string, unknown>,\n current: Record<string, unknown>,\n key: string,\n dirty: DocumentDirty\n):\n | { readonly changed: false }\n | { readonly changed: true; readonly present: boolean; readonly value: unknown } => {\n const before = Object.hasOwn(previous, key);\n const after = Object.hasOwn(current, key);\n if (!before && !after) return { changed: false };\n if (!after) return { changed: true, present: false, value: undefined };\n const next = before\n ? materializeDocumentValue(node, previous[key], current[key], dirty)\n : schemaValue.copyValue(node, current[key]);\n if (before && next === previous[key]) return { changed: false };\n return { changed: true, present: true, value: next };\n};\n\nconst materializeObject = (\n node: Extract<DocumentNode, { kind: 'object' | 'variant' }>,\n previous: Record<string, unknown>,\n current: Record<string, unknown>,\n dirty: DocumentDirty\n): unknown => {\n if (node.kind === 'variant' && previous[node.tag] !== current[node.tag])\n return replaceValue(node, previous, current);\n const layout = compiledShape(node, current);\n if (!layout) return replaceValue(node, previous, current);\n let result: Record<string, unknown> | undefined;\n for (const [key, childDirty] of dirty.children) {\n const member = layout.members.get(key);\n if (!member) return replaceValue(node, previous, current);\n const child = materializeRecordChild(member.node, previous, current, key, childDirty);\n if (!child.changed) continue;\n result ??= cloneRecord(previous);\n installOwn(result, key, child.present, child.value);\n }\n return result ?? previous;\n};\n\nconst materializeMap = (\n node: Extract<DocumentNode, { kind: 'map' }>,\n previous: Record<string, unknown>,\n current: Record<string, unknown>,\n dirty: DocumentDirty\n): unknown => {\n let result: Record<string, unknown> | undefined;\n for (const [key, childDirty] of dirty.children) {\n const child = materializeRecordChild(node.value, previous, current, key, childDirty);\n if (!child.changed) continue;\n result ??= cloneRecord(previous);\n installOwn(result, key, child.present, child.value);\n }\n return result ?? previous;\n};\n\nconst materializeTable = (\n node: Extract<DocumentNode, { kind: 'table' }>,\n previous: Record<string, unknown>,\n current: Record<string, unknown>,\n dirty: DocumentDirty\n): unknown => {\n if (!isRecord(previous.byId) || !isRecord(current.byId))\n return replaceValue(node, previous, current);\n const beforeById = previous.byId;\n const afterById = current.byId;\n let result: Record<string, unknown> | undefined;\n let nextById: Record<string, unknown> | undefined;\n for (const [key, childDirty] of dirty.children) {\n const child = materializeRecordChild(node.value, beforeById, afterById, key, childDirty);\n if (!child.changed) continue;\n nextById ??= cloneRecord(beforeById);\n installOwn(nextById, key, child.present, child.value);\n }\n if (nextById) {\n result = cloneRecord(previous);\n installOwn(result, 'byId', true, nextById);\n }\n if (dirty.order) {\n const beforeIds = previous.ids;\n const afterIds = current.ids;\n if (!Array.isArray(beforeIds) || !Array.isArray(afterIds))\n return replaceValue(node, previous, current);\n if (!sequence.equal(beforeIds as string[], afterIds as string[])) {\n result ??= cloneRecord(previous);\n installOwn(result, 'ids', true, [...(afterIds as string[])]);\n }\n }\n return result ?? previous;\n};\n\nconst materializeList = (\n node: Extract<DocumentNode, { kind: 'list' }>,\n previous: readonly unknown[],\n current: readonly unknown[],\n dirty: DocumentDirty\n): unknown => {\n if (dirty.order) {\n const before = sequence.listSequence(previous, node.keyOf);\n const after = sequence.listSequence(current, node.keyOf);\n const sameOrder = sequence.equal(before.order, after.order);\n let changed = !sameOrder;\n const result = new Array<unknown>(after.order.length);\n for (let index = 0; index < after.order.length; index++) {\n const key = after.order[index];\n const currentValue = after.values.get(key);\n if (!before.values.has(key)) {\n changed = true;\n result[index] = currentValue;\n continue;\n }\n const previousValue = before.values.get(key);\n const childDirty = dirty.children.get(key);\n const next = childDirty\n ? materializeDocumentValue(node.value, previousValue, currentValue, childDirty)\n : previousValue;\n changed ||= next !== previousValue;\n result[index] = next;\n }\n return changed ? result : previous;\n }\n\n let result: unknown[] | undefined;\n const before = sequence.indexedKeys(previous, node.keyOf);\n const after = sequence.indexedKeys(current, node.keyOf);\n for (const [key, childDirty] of dirty.children) {\n const previousIndex = before.index(key);\n const currentIndex = after.index(key);\n if (previousIndex < 0 || currentIndex < 0) return replaceValue(node, previous, current);\n const next = materializeDocumentValue(\n node.value,\n previous[previousIndex],\n current[currentIndex],\n childDirty\n );\n if (next === previous[previousIndex] && previousIndex === currentIndex) continue;\n result ??= [...previous];\n result[currentIndex] = next;\n }\n return result ?? previous;\n};\n\nconst materializeTree = (\n node: Extract<DocumentNode, { kind: 'tree' }>,\n previous: Record<string, unknown>,\n current: Record<string, unknown>,\n dirty: DocumentDirty\n): unknown => {\n if (!isRecord(previous.nodes) || !isRecord(current.nodes))\n return replaceValue(node, previous, current);\n let result: Record<string, unknown> | undefined;\n\n if (dirty.treeRoot) {\n const beforePresent = Object.hasOwn(previous, 'rootId');\n const afterPresent = Object.hasOwn(current, 'rootId');\n if (beforePresent !== afterPresent || !Object.is(previous.rootId, current.rootId)) {\n result = cloneRecord(previous);\n installOwn(result, 'rootId', afterPresent, current.rootId);\n }\n }\n\n let nodes: Record<string, unknown> | undefined;\n for (const id of dirty.treeNodes) {\n const beforePresent = Object.hasOwn(previous.nodes, id);\n const afterPresent = Object.hasOwn(current.nodes, id);\n const before = beforePresent\n ? (previous.nodes[id] as DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>)\n : undefined;\n const after = afterPresent\n ? (current.nodes[id] as DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>)\n : undefined;\n if (beforePresent === afterPresent && schemaValue.equalTreeNode(before, after)) continue;\n nodes ??= cloneRecord(previous.nodes);\n installOwn(nodes, id, afterPresent, after && schemaValue.copyTreeNode(after));\n }\n if (nodes) {\n result ??= cloneRecord(previous);\n installOwn(result, 'nodes', true, nodes);\n }\n return result ?? previous;\n};\n\nexport const materializeDocumentValue = (\n node: DocumentNode,\n previous: unknown,\n current: unknown,\n dirty: DocumentDirty\n): unknown => {\n if (!hasDocumentDirty(dirty)) return previous;\n if (dirty.replace || previous === undefined || current === undefined || node.kind === 'field')\n return replaceValue(node, previous, current);\n if (node.kind === 'object' || node.kind === 'variant') {\n if (!isRecord(previous) || !isRecord(current)) return replaceValue(node, previous, current);\n return materializeObject(node, previous, current, dirty);\n }\n if (node.kind === 'map') {\n if (!isRecord(previous) || !isRecord(current)) return replaceValue(node, previous, current);\n return materializeMap(node, previous, current, dirty);\n }\n if (node.kind === 'table') {\n if (!isRecord(previous) || !isRecord(current)) return replaceValue(node, previous, current);\n return materializeTable(node, previous, current, dirty);\n }\n if (node.kind === 'list') {\n if (!Array.isArray(previous) || !Array.isArray(current))\n return replaceValue(node, previous, current);\n return materializeList(node, previous, current, dirty);\n }\n if (!isRecord(previous) || !isRecord(current)) return replaceValue(node, previous, current);\n return materializeTree(node, previous, current, dirty);\n};\n","import * as relation from '../../address/relation';\nimport type { ChangeSet } from '../../changes';\nimport type { CollectionSelector, ValueSelector } from '../../schema';\nimport {\n createDocumentDirty,\n markDocumentOrder,\n markDocumentReplace,\n markDocumentTree,\n type DocumentDirty,\n} from './materialization';\n\ntype DocumentCollectionPending = {\n reset: boolean;\n order: boolean;\n readonly entries: Map<string, DocumentDirty>;\n};\n\nexport const createCollectionPending = (): DocumentCollectionPending => ({\n reset: false,\n order: false,\n entries: new Map(),\n});\n\nexport const resetCollectionPending = (pending: DocumentCollectionPending): void => {\n pending.reset = true;\n pending.order = false;\n pending.entries.clear();\n};\n\nexport const clearCollectionPending = (pending: DocumentCollectionPending): void => {\n pending.reset = false;\n pending.order = false;\n pending.entries.clear();\n};\n\nconst dirtyEntry = (pending: DocumentCollectionPending, key: string): DocumentDirty => {\n let dirty = pending.entries.get(key);\n if (!dirty) {\n dirty = createDocumentDirty();\n pending.entries.set(key, dirty);\n }\n return dirty;\n};\n\nexport const mergeValueChanges = (\n selector: ValueSelector,\n dirty: DocumentDirty,\n changes: ChangeSet\n): void => {\n if (selector.tree) return;\n const at = selector.address;\n for (const change of changes.changes) {\n if (change.kind === 'reset') {\n markDocumentReplace(dirty, []);\n return;\n }\n if (change.kind === 'members') {\n for (const member of change.members) {\n const changed = [...change.at, member.key];\n if (relation.contains(changed, at)) markDocumentReplace(dirty, []);\n else if (relation.contains(at, changed))\n markDocumentReplace(dirty, changed.slice(at.length));\n }\n if (change.order && relation.contains(at, change.at))\n markDocumentOrder(dirty, change.at.slice(at.length));\n continue;\n }\n if (relation.contains(at, change.at))\n markDocumentTree(\n dirty,\n change.at.slice(at.length),\n change.before !== change.after,\n change.nodes.map(node => node.id)\n );\n }\n};\n\nexport const mergeCollectionChanges = (\n selector: CollectionSelector,\n pending: DocumentCollectionPending,\n changes: ChangeSet\n): void => {\n if (pending.reset) return;\n const at = selector.address;\n for (const change of changes.changes) {\n if (change.kind === 'reset') {\n resetCollectionPending(pending);\n return;\n }\n\n if (selector.tree?.kind === 'nodes') {\n if (change.kind === 'members') {\n for (const member of change.members) {\n const changed = [...change.at, member.key];\n if (relation.contains(changed, at)) {\n resetCollectionPending(pending);\n return;\n }\n }\n } else if (change.at.length === at.length && relation.contains(change.at, at)) {\n for (const node of change.nodes) {\n markDocumentReplace(dirtyEntry(pending, node.id), []);\n pending.order ||= node.kind !== 'updated';\n }\n } else if (relation.contains(change.at, at)) {\n resetCollectionPending(pending);\n return;\n }\n continue;\n }\n\n if (change.kind === 'members') {\n for (const member of change.members) {\n const changed = [...change.at, member.key];\n if (relation.contains(changed, at)) {\n resetCollectionPending(pending);\n return;\n }\n if (!relation.contains(at, changed)) continue;\n const relative = changed.slice(at.length);\n if (!relative.length) {\n resetCollectionPending(pending);\n return;\n }\n const entry = dirtyEntry(pending, relative[0]);\n markDocumentReplace(entry, relative.slice(1));\n if (relative.length === 1 && member.kind !== 'updated') pending.order = true;\n }\n if (change.order && relation.contains(at, change.at)) {\n const relative = change.at.slice(at.length);\n if (!relative.length) pending.order = true;\n else markDocumentOrder(dirtyEntry(pending, relative[0]), relative.slice(1));\n }\n continue;\n }\n\n if (!relation.contains(at, change.at)) continue;\n const relative = change.at.slice(at.length);\n if (!relative.length) {\n resetCollectionPending(pending);\n return;\n }\n markDocumentTree(\n dirtyEntry(pending, relative[0]),\n relative.slice(1),\n change.before !== change.after,\n change.nodes.map(node => node.id)\n );\n }\n};\n","import { profile } from '../../profile';\nimport type { Unsubscribe } from '../../runtime/contract';\nimport { createCollectionOutput, type CollectionOutputState } from '../output/collection';\nimport type { CollectionChange, CollectionRead } from '../contract';\nimport { ProjectionDisposedError, ProjectionError } from '../contract';\nimport type { OutputRecord, Scheduler, SourceBoundaryRecord } from '../graph/scheduler';\nimport { createValueOutput, type ValueOutputState } from '../output/value';\n\nexport type KeyedInputDraft<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n set(key: K, value: V): void;\n remove(key: K): void;\n};\n\nexport type SourceWrite =\n | { readonly kind: 'value'; set(value: unknown): void }\n | {\n readonly kind: 'collection';\n update(run: (draft: KeyedInputDraft<string, unknown>) => void): void;\n };\n\nexport type SourceMaterialization = {\n readonly producer: SourceBoundaryRecord;\n readonly output: OutputRecord;\n readonly write?: SourceWrite;\n};\n\nexport type SourceMark = { readonly reset?: boolean; readonly cause?: unknown };\ntype CollectionMark = SourceMark & {\n readonly candidates?: Iterable<string>;\n readonly fullScan?: boolean;\n readonly orderMayChange?: boolean;\n};\n\nexport type ValueBoundary = SourceMaterialization & {\n readonly mark: (metadata?: SourceMark) => void;\n readonly fail: (cause: unknown) => void;\n readonly detach: (cleanup: Unsubscribe) => void;\n};\n\nexport type CollectionBoundary = SourceMaterialization & {\n readonly mark: (metadata?: CollectionMark) => void;\n readonly fail: (cause: unknown) => void;\n readonly detach: (cleanup: Unsubscribe) => void;\n};\n\nconst sourceError = (source: SourceBoundaryRecord, cause: unknown): ProjectionError =>\n new ProjectionError('source', source.name, [source.outputs[0].revision()], cause);\n\nexport const createValueBoundary = (\n scheduler: Scheduler,\n name: string,\n initial: unknown,\n equality: (previous: unknown, next: unknown) => boolean,\n prepare: (previous: unknown) => unknown,\n clearSource: (failed: boolean) => void\n): ValueBoundary => {\n const state: ValueOutputState<unknown> = createValueOutput();\n let boundary!: SourceBoundaryRecord;\n let pendingReset = false;\n let pendingCause: unknown;\n let contextCause: unknown;\n let recovering = false;\n let cleanup: Unsubscribe | undefined;\n\n const check = () => {\n if (!scheduler.active || boundary.disposed) throw new ProjectionDisposedError();\n if (boundary.fault) throw boundary.fault;\n };\n\n const output: OutputRecord = {\n kind: 'value',\n get owner() {\n return boundary;\n },\n consumers: new Set(),\n context: active => state.context(active, contextCause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = () => listener();\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n\n boundary = {\n kind: 'source',\n name,\n outputs: Object.freeze([output]) as readonly [OutputRecord],\n fault: undefined,\n disposed: false,\n pendingCause: () => pendingCause,\n recovering: () => recovering,\n prepare: cause => {\n contextCause = cause;\n let active = true;\n try {\n const evaluation = state.begin(() => active, pendingReset);\n evaluation.output.set(prepare(evaluation.previous));\n const changed = state.seal(pendingReset, equality);\n recovering = false;\n return { changed, force: pendingReset };\n } finally {\n active = false;\n }\n },\n publish: state.publish,\n clear: () => {\n const failed = boundary.fault !== undefined;\n state.clear();\n pendingReset = false;\n pendingCause = undefined;\n contextCause = undefined;\n recovering = false;\n clearSource(failed);\n },\n release: () => {\n cleanup?.();\n cleanup = undefined;\n state.release();\n output.consumers.clear();\n },\n };\n\n scheduler.initialize(() => {\n let active = true;\n try {\n const evaluation = state.begin(() => active, true);\n evaluation.output.set(initial);\n state.seal(true, equality);\n state.publish();\n state.clear();\n } finally {\n active = false;\n }\n });\n scheduler.addSource(boundary);\n\n const mark = (metadata: SourceMark = {}) => {\n scheduler.assertIdle();\n pendingReset ||= metadata.reset ?? false;\n if (metadata.cause !== undefined) pendingCause ??= metadata.cause;\n if (boundary.fault) recovering = true;\n scheduler.capture(boundary);\n };\n const fail = (cause: unknown) => {\n boundary.fault = sourceError(boundary, cause);\n recovering = false;\n scheduler.capture(boundary);\n };\n return {\n producer: boundary,\n output,\n mark,\n fail,\n detach: next => {\n cleanup = next;\n },\n };\n};\n\ntype CollectionStageOptions<K extends string, V> = {\n readonly reset: boolean;\n readonly candidates?: Iterable<K>;\n readonly orderMayChange?: boolean;\n readonly isEqual?: (previous: V, next: V) => boolean;\n};\n\n/** Applies source hints to an output draft; exact net change semantics remain in the output. */\nconst stageCollectionRead = <K extends string, V>(\n state: CollectionOutputState<K, V>,\n read: CollectionRead<K, V>,\n active: () => boolean,\n options: CollectionStageOptions<K, V>\n): boolean => {\n const evaluation = state.begin(active, options.reset);\n if (options.reset) {\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n for (const key of ids) {\n profile.collectionView.mapped();\n evaluation.output.set(key, read.get(key) as V);\n }\n evaluation.output.order(ids);\n } else {\n const previous = state.current(() => undefined);\n const keys = options.candidates\n ? [...new Set(options.candidates)]\n : [...new Set([...previous.ids(), ...read.ids()])];\n if (!options.candidates) profile.collectionView.idsScanned(keys.length);\n for (const key of keys) {\n if (read.has(key)) {\n profile.collectionView.mapped();\n evaluation.output.set(key, read.get(key) as V);\n } else evaluation.output.remove(key);\n }\n if (options.orderMayChange || !options.candidates) {\n const ids = read.ids();\n if (options.candidates) profile.collectionView.idsScanned(ids.length);\n evaluation.output.order(ids);\n }\n }\n return state.seal(options.reset, options.isEqual ?? Object.is);\n};\n\nexport const createCollectionBoundary = (\n scheduler: Scheduler,\n name: string,\n readLatest: (\n active: () => boolean,\n previous: CollectionRead<string, unknown>\n ) => CollectionRead<string, unknown>,\n equality: (previous: unknown, next: unknown) => boolean,\n clearSource: (failed: boolean) => void\n): CollectionBoundary => {\n const state: CollectionOutputState<string, unknown> = createCollectionOutput();\n let boundary!: SourceBoundaryRecord;\n let pendingReset = false;\n let pendingCause: unknown;\n let contextCause: unknown;\n let recovering = false;\n let fullScan = false;\n let orderMayChange = false;\n const candidates = new Set<string>();\n let cleanup: Unsubscribe | undefined;\n\n const check = () => {\n if (!scheduler.active || boundary.disposed) throw new ProjectionDisposedError();\n if (boundary.fault) throw boundary.fault;\n };\n\n const output: OutputRecord = {\n kind: 'collection',\n get owner() {\n return boundary;\n },\n consumers: new Set(),\n context: active => state.context(active, contextCause),\n current: () => state.current(check),\n revision: state.revision,\n reset: state.reset,\n subscribe: listener => {\n check();\n const wrapped = (change: CollectionChange<string, unknown>) => listener(change);\n state.subscribe(wrapped);\n return () => state.unsubscribe(wrapped);\n },\n emit: state.emit,\n clear: state.clear,\n release: state.release,\n };\n\n boundary = {\n kind: 'source',\n name,\n outputs: Object.freeze([output]) as readonly [OutputRecord],\n fault: undefined,\n disposed: false,\n pendingCause: () => pendingCause,\n recovering: () => recovering,\n prepare: cause => {\n contextCause = cause;\n let active = true;\n try {\n const changed = stageCollectionRead(\n state,\n readLatest(\n () => active,\n state.current(() => undefined)\n ),\n () => active,\n {\n reset: pendingReset,\n ...(fullScan ? {} : { candidates }),\n orderMayChange,\n isEqual: equality,\n }\n );\n recovering = false;\n return { changed, force: pendingReset };\n } finally {\n active = false;\n }\n },\n publish: state.publish,\n clear: () => {\n const failed = boundary.fault !== undefined;\n state.clear();\n pendingReset = false;\n pendingCause = undefined;\n contextCause = undefined;\n recovering = false;\n fullScan = false;\n orderMayChange = false;\n candidates.clear();\n clearSource(failed);\n },\n release: () => {\n cleanup?.();\n cleanup = undefined;\n state.release();\n output.consumers.clear();\n },\n };\n\n scheduler.initialize(() => {\n let active = true;\n try {\n stageCollectionRead(\n state,\n readLatest(\n () => active,\n state.current(() => undefined)\n ),\n () => active,\n { reset: true, isEqual: equality }\n );\n state.publish();\n state.clear();\n } finally {\n active = false;\n }\n });\n scheduler.addSource(boundary);\n\n const mark = (metadata: CollectionMark = {}) => {\n scheduler.assertIdle();\n pendingReset ||= metadata.reset ?? false;\n if (metadata.cause !== undefined) pendingCause ??= metadata.cause;\n fullScan ||= metadata.fullScan ?? false;\n orderMayChange ||= metadata.orderMayChange ?? false;\n if (metadata.candidates) for (const key of metadata.candidates) candidates.add(key);\n if (boundary.fault) recovering = true;\n scheduler.capture(boundary);\n };\n const fail = (cause: unknown) => {\n boundary.fault = sourceError(boundary, cause);\n recovering = false;\n scheduler.capture(boundary);\n };\n return {\n producer: boundary,\n output,\n mark,\n fail,\n detach: next => {\n cleanup = next;\n },\n };\n};\n","import * as address from '../../address/resolve';\nimport * as impactTarget from '../../impact/target';\nimport * as sequence from '../../order/sequence';\nimport { contextOf } from '../../runtime/context';\nimport type { DocumentCommit, DocumentReadable, Unsubscribe } from '../../runtime/contract';\nimport { collectionEntryNode } from '../../schema';\nimport type { DocumentTreeNode, ImpactTarget, ObjectNode } from '../../schema';\nimport * as schemaValue from '../../schema/value';\nimport { isRecord } from '../../value/record';\nimport type { CollectionRead } from '../contract';\nimport type { SourceDefinition } from '../definition';\nimport {\n clearDocumentDirty,\n createDocumentDirty,\n markDocumentReplace,\n materializeDocumentValue,\n} from './materialization';\nimport {\n clearCollectionPending,\n createCollectionPending,\n mergeCollectionChanges,\n mergeValueChanges,\n resetCollectionPending,\n} from './dirty';\nimport { assertScope, type Scheduler } from '../graph/scheduler';\nimport {\n createCollectionBoundary,\n createValueBoundary,\n type CollectionBoundary,\n type SourceMaterialization,\n type ValueBoundary,\n} from './boundary';\n\ntype DocumentBinding = {\n readonly target: ImpactTarget;\n capture(commit: DocumentCommit<ObjectNode>): void;\n dispose(): void;\n};\n\ntype DocumentConnection = {\n add(binding: DocumentBinding): Unsubscribe;\n close(): void;\n};\n\nconst documentRootTarget: ImpactTarget = Object.freeze({\n kind: 'value' as const,\n at: Object.freeze([]),\n});\n\nexport const createDocumentSourceRegistry = (scheduler: Scheduler) => {\n const documents = new Map<object, DocumentConnection>();\n\n const connection = <S extends ObjectNode>(runtime: DocumentReadable<S>): DocumentConnection => {\n const context = contextOf<S>(runtime);\n const state = context.state;\n const cached = documents.get(state);\n if (cached) return cached;\n if (state.disposed) throw new Error('Document has been disposed.');\n const bindings = new Set<DocumentBinding>();\n const index = new impactTarget.SubscriptionIndex<DocumentBinding>(state.schema);\n const candidates = new Set<DocumentBinding>();\n const guard = (locked: boolean) => {\n state.projectionLocks += locked ? 1 : -1;\n };\n scheduler.guards.add(guard);\n let closed = false;\n let detach: Unsubscribe = () => undefined;\n const documentConnection: DocumentConnection = {\n add(binding) {\n if (closed) throw new Error('Document projection connection is closed.');\n bindings.add(binding);\n index.add(binding.target, binding);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n bindings.delete(binding);\n index.delete(binding.target, binding);\n if (!bindings.size) documentConnection.close();\n };\n },\n close() {\n if (closed) return;\n closed = true;\n detach();\n bindings.clear();\n candidates.clear();\n index.clear();\n scheduler.guards.delete(guard);\n documents.delete(state);\n },\n };\n detach = context.notifications.attachProjection({\n capture: commit => {\n candidates.clear();\n index.collect(commit.changes, binding => candidates.add(binding));\n candidates.forEach(binding => binding.capture(commit as DocumentCommit<ObjectNode>));\n },\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n for (const binding of bindings) binding.dispose();\n scheduler.run();\n },\n });\n documents.set(state, documentConnection);\n return documentConnection;\n };\n\n const materialize = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'document') throw new Error('Invalid document source.');\n const { document, selector } = definition.source;\n const state = contextOf(document).state;\n const current = () => address.resolveValue(state.schema, state.document, selector.address);\n const disposed = () => {\n if (state.disposed) throw new Error('Document has been disposed.');\n };\n\n if (selector.kind === 'value') {\n const dirty = createDocumentDirty();\n const read = (previous?: unknown): unknown => {\n disposed();\n const resolved = current();\n const node = resolved?.node;\n const value = resolved?.value;\n if (selector.tree?.kind === 'root')\n return node?.kind === 'tree' && isRecord(value) && typeof value.rootId === 'string'\n ? value.rootId\n : undefined;\n if (selector.tree?.kind === 'node') {\n if (node?.kind !== 'tree' || !isRecord(value) || !isRecord(value.nodes)) return undefined;\n const entry = Object.hasOwn(value.nodes, selector.tree.id)\n ? (value.nodes[selector.tree.id] as\n DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>)\n : undefined;\n if (\n schemaValue.equalTreeNode(\n previous as\n DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true> | undefined,\n entry\n )\n )\n return previous;\n return entry ? schemaValue.copyTreeNode(entry) : undefined;\n }\n if (!node) return undefined;\n return previous === undefined\n ? schemaValue.copyValue(node, value)\n : materializeDocumentValue(node, previous, value, dirty);\n };\n\n const initial = read();\n let boundary!: ValueBoundary;\n boundary = createValueBoundary(\n scheduler,\n 'document source',\n initial,\n Object.is,\n previous => read(previous),\n failed => {\n if (failed) markDocumentReplace(dirty, []);\n else clearDocumentDirty(dirty);\n }\n );\n const remove = connection(document).add({\n target: selector,\n capture: commit => {\n try {\n mergeValueChanges(selector, dirty, commit.changes);\n boundary.mark({\n reset: commit.changes.changes.some(change => change.kind === 'reset'),\n });\n } catch (cause) {\n boundary.fail(cause);\n }\n },\n dispose: () => boundary.fail(new Error('Document has been disposed.')),\n });\n boundary.detach(remove);\n return boundary;\n }\n\n const pending = createCollectionPending();\n const read = (\n active: () => boolean,\n previous: CollectionRead<string, unknown>\n ): CollectionRead<string, unknown> => {\n disposed();\n const resolved = current();\n const node = resolved?.node;\n const value = resolved?.value;\n const treeNodes = selector.tree?.kind === 'nodes';\n const entryNode = !treeNodes && node ? collectionEntryNode(node) : undefined;\n const snapshots = new Map<string, unknown>();\n const replacement = createDocumentDirty();\n if (pending.reset) markDocumentReplace(replacement, []);\n\n const ids = (): readonly string[] => {\n assertScope(active);\n if (treeNodes)\n return node?.kind === 'tree' && isRecord(value) && isRecord(value.nodes)\n ? Object.freeze(Object.keys(value.nodes))\n : Object.freeze([]);\n if (node?.kind === 'map' && isRecord(value)) return Object.freeze(Object.keys(value));\n if (node?.kind === 'table' && isRecord(value) && Array.isArray(value.ids))\n return Object.freeze([...(value.ids as string[])]);\n if (node?.kind === 'list' && Array.isArray(value))\n return Object.freeze(sequence.toArray(sequence.indexedKeys(value, node.keyOf)));\n return Object.freeze([]);\n };\n\n const has = (key: string): boolean => {\n assertScope(active);\n if (treeNodes)\n return Boolean(\n node?.kind === 'tree' &&\n isRecord(value) &&\n isRecord(value.nodes) &&\n Object.hasOwn(value.nodes, key)\n );\n if (node?.kind === 'map' && isRecord(value)) return Object.hasOwn(value, key);\n if (node?.kind === 'table' && isRecord(value) && isRecord(value.byId))\n return Object.hasOwn(value.byId, key);\n if (node?.kind === 'list' && Array.isArray(value))\n return sequence.indexedKeys(value, node.keyOf).index(key) >= 0;\n return false;\n };\n\n const raw = (key: string): unknown => {\n if (treeNodes) {\n if (node?.kind !== 'tree' || !isRecord(value) || !isRecord(value.nodes)) return undefined;\n return Object.hasOwn(value.nodes, key) ? value.nodes[key] : undefined;\n }\n if (node?.kind === 'map' && isRecord(value))\n return Object.hasOwn(value, key) ? value[key] : undefined;\n if (node?.kind === 'table' && isRecord(value) && isRecord(value.byId))\n return Object.hasOwn(value.byId, key) ? value.byId[key] : undefined;\n if (node?.kind === 'list' && Array.isArray(value)) {\n const index = sequence.indexedKeys(value, node.keyOf).index(key);\n return index < 0 ? undefined : value[index];\n }\n return undefined;\n };\n\n return Object.freeze({\n get: (key: string) => {\n assertScope(active);\n if (!snapshots.has(key)) {\n if (!has(key)) snapshots.set(key, undefined);\n else {\n const current = raw(key);\n if (treeNodes) {\n const entry = current as\n DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>;\n const before = previous.has(key)\n ? (previous.get(key) as\n DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>)\n : undefined;\n snapshots.set(\n key,\n schemaValue.equalTreeNode(before, entry)\n ? before\n : schemaValue.copyTreeNode(entry)\n );\n } else if (!entryNode) snapshots.set(key, current);\n else if (!previous.has(key))\n snapshots.set(key, schemaValue.copyValue(entryNode, current));\n else {\n const dirty = pending.entries.get(key) ?? (pending.reset ? replacement : undefined);\n snapshots.set(\n key,\n dirty\n ? materializeDocumentValue(entryNode, previous.get(key), current, dirty)\n : previous.get(key)\n );\n }\n }\n }\n return snapshots.get(key);\n },\n has,\n ids,\n });\n };\n\n let boundary!: CollectionBoundary;\n boundary = createCollectionBoundary(\n scheduler,\n 'document collection source',\n read,\n Object.is,\n failed => {\n if (failed) resetCollectionPending(pending);\n else clearCollectionPending(pending);\n }\n );\n const remove = connection(document).add({\n target: selector,\n capture: commit => {\n try {\n mergeCollectionChanges(selector, pending, commit.changes);\n boundary.mark({\n reset: pending.reset,\n ...(pending.reset ? {} : { candidates: pending.entries.keys() }),\n orderMayChange: pending.order,\n });\n } catch (cause) {\n boundary.fail(cause);\n }\n },\n dispose: () => boundary.fail(new Error('Document has been disposed.')),\n });\n boundary.detach(remove);\n return boundary;\n };\n\n return {\n materialize,\n attachRoot<S extends ObjectNode>(\n runtime: DocumentReadable<S>,\n handlers: { readonly capture: () => void; readonly dispose: () => void }\n ): Unsubscribe {\n return connection(runtime).add({\n target: documentRootTarget,\n capture: handlers.capture,\n dispose: handlers.dispose,\n });\n },\n dispose() {\n documents.forEach(document => document.close());\n documents.clear();\n },\n };\n};\n","import { contextOf } from '../../runtime/context';\nimport type { Unsubscribe } from '../../runtime/contract';\nimport type { ExternalCollectionSource } from '../contract';\nimport { mapRead } from '../collection/view';\nimport type { SourceDefinition } from '../definition';\nimport { createDocumentSourceRegistry } from './document';\nimport { assertScope, assertSynchronous, type Scheduler } from '../graph/scheduler';\nimport {\n createCollectionBoundary,\n createValueBoundary,\n type CollectionBoundary,\n type KeyedInputDraft,\n type SourceMark,\n type SourceMaterialization,\n type ValueBoundary,\n} from './boundary';\n\ntype ValueMember = {\n readonly boundary: ValueBoundary;\n receive(value: unknown, metadata?: SourceMark): void;\n};\n\nexport const createSourceRegistry = (scheduler: Scheduler) => {\n const documents = createDocumentSourceRegistry(scheduler);\n const readables = new Map<object, { members: Set<ValueMember>; close(): void }>();\n const externalValues = new WeakMap<object, { members: Set<ValueMember>; close(): void }>();\n const externalCollections = new WeakMap<\n object,\n { members: Set<CollectionBoundary>; close(): void }\n >();\n\n const valueInput = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'value-input') throw new Error('Invalid value input source.');\n const source = definition.source;\n let latest = source.initial;\n const boundary = createValueBoundary(\n scheduler,\n 'projection input',\n source.initial,\n source.equality,\n () => latest,\n () => undefined\n );\n return {\n ...boundary,\n write: {\n kind: 'value',\n set(value) {\n scheduler.assertIdle();\n latest = value;\n boundary.mark();\n scheduler.run();\n },\n },\n };\n };\n\n const collectionInput = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'collection-input')\n throw new Error('Invalid collection input source.');\n const values = new Map(definition.source.initial);\n const boundary = createCollectionBoundary(\n scheduler,\n 'projection collection input',\n () => mapRead(values),\n definition.output.equality,\n () => undefined\n );\n return {\n ...boundary,\n write: {\n kind: 'collection',\n update(run) {\n scheduler.assertIdle();\n const staged = new Map<\n string,\n { readonly present: true; readonly value: unknown } | { readonly present: false }\n >();\n const operations: (\n | { readonly kind: 'set'; readonly key: string; readonly value: unknown }\n | { readonly kind: 'remove'; readonly key: string }\n )[] = [];\n let active = true;\n const draft: KeyedInputDraft<string, unknown> = Object.freeze({\n get: key => {\n assertScope(() => active);\n const entry = staged.get(key);\n return entry ? (entry.present ? entry.value : undefined) : values.get(key);\n },\n has: key => {\n assertScope(() => active);\n const entry = staged.get(key);\n return entry ? entry.present : values.has(key);\n },\n set: (key, value) => {\n assertScope(() => active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: true, value });\n operations.push({ kind: 'set', key, value });\n },\n remove: key => {\n assertScope(() => active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: false });\n operations.push({ kind: 'remove', key });\n },\n });\n try {\n assertSynchronous(run(draft));\n } finally {\n active = false;\n }\n\n const candidates = new Set<string>();\n let structural = false;\n let changed = false;\n for (const operation of operations) {\n const present = values.has(operation.key);\n if (operation.kind === 'set') {\n if (present && Object.is(values.get(operation.key), operation.value)) continue;\n structural ||= !present;\n values.set(operation.key, operation.value);\n } else {\n if (!present) continue;\n structural = true;\n values.delete(operation.key);\n }\n candidates.add(operation.key);\n changed = true;\n }\n if (!changed) return;\n boundary.mark({ candidates, orderMayChange: structural });\n scheduler.run();\n },\n },\n };\n };\n\n const readable = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'readable') throw new Error('Invalid Readable source.');\n const { readable, equality } = definition.source;\n let latest = readable.current();\n const boundary = createValueBoundary(\n scheduler,\n 'external readable',\n latest,\n equality,\n () => latest,\n () => undefined\n );\n const member: ValueMember = {\n boundary,\n receive(value, metadata) {\n latest = value;\n boundary.mark(metadata);\n },\n };\n let connection = readables.get(readable);\n if (!connection) {\n const members = new Set<ValueMember>();\n let closed = false;\n let unsubscribe: Unsubscribe | undefined;\n let detachDocument: Unsubscribe | undefined;\n const receive = (settle: boolean) => {\n if (closed || !scheduler.active) return;\n try {\n const value = readable.current();\n members.forEach(next => next.receive(value));\n } catch (cause) {\n members.forEach(next => next.boundary.fail(cause));\n }\n if (settle) scheduler.run();\n };\n const created = {\n members,\n close() {\n if (closed) return;\n closed = true;\n unsubscribe?.();\n detachDocument?.();\n readables.delete(readable);\n },\n };\n const owner = contextOf(readable, false)?.owner;\n if (owner) {\n detachDocument = documents.attachRoot(owner, {\n capture: () => receive(false),\n dispose: () => {\n members.forEach(next => next.boundary.fail(new Error('Document has been disposed.')));\n },\n });\n }\n unsubscribe = readable.subscribe(() => receive(true));\n connection = created;\n readables.set(readable, connection);\n }\n connection.members.add(member);\n boundary.detach(() => {\n connection!.members.delete(member);\n if (!connection!.members.size) connection!.close();\n });\n return boundary;\n };\n\n const externalValue = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'external-value')\n throw new Error('Invalid external value source.');\n const { source, equality } = definition.source;\n let latest = source.current();\n const boundary = createValueBoundary(\n scheduler,\n 'external source',\n latest,\n equality,\n () => latest,\n () => undefined\n );\n const member: ValueMember = {\n boundary,\n receive(value, metadata) {\n latest = value;\n boundary.mark(metadata);\n },\n };\n let connection = externalValues.get(source);\n if (!connection) {\n const members = new Set<ValueMember>();\n let closed = false;\n let unsubscribe: Unsubscribe | undefined;\n const created = {\n members,\n close() {\n if (closed) return;\n closed = true;\n unsubscribe?.();\n externalValues.delete(source);\n },\n };\n try {\n unsubscribe = source.subscribe(event => {\n try {\n members.forEach(next =>\n next.receive(event.value, { reset: event.reset, cause: event.cause })\n );\n } catch (cause) {\n members.forEach(next => next.boundary.fail(cause));\n }\n scheduler.run();\n });\n } catch (cause) {\n created.close();\n throw cause;\n }\n connection = created;\n externalValues.set(source, connection);\n }\n connection.members.add(member);\n boundary.detach(() => {\n connection!.members.delete(member);\n if (!connection!.members.size) connection!.close();\n });\n return boundary;\n };\n\n const externalCollection = (definition: SourceDefinition): SourceMaterialization => {\n if (definition.source.kind !== 'external-collection')\n throw new Error('Invalid external collection source.');\n const source = definition.source.source as ExternalCollectionSource<string, unknown>;\n const boundary = createCollectionBoundary(\n scheduler,\n 'external collection source',\n () => {\n const current = source.current();\n return Object.freeze({\n get: key => current.get(key),\n has: key => current.has(key),\n ids: () => current.ids(),\n });\n },\n definition.output.equality,\n () => undefined\n );\n let connection = externalCollections.get(source);\n if (!connection) {\n const members = new Set<CollectionBoundary>();\n let closed = false;\n let unsubscribe: Unsubscribe | undefined;\n const created = {\n members,\n close() {\n if (closed) return;\n closed = true;\n unsubscribe?.();\n externalCollections.delete(source);\n },\n };\n try {\n unsubscribe = source.subscribe(event => {\n try {\n const impact = event.impact;\n if (impact?.kind === 'reset') {\n members.forEach(next => next.mark({ reset: true, cause: event.cause }));\n } else if (impact?.kind === 'incremental') {\n const candidates = new Set<string>([\n ...impact.added,\n ...impact.updated,\n ...impact.removed,\n ]);\n members.forEach(next =>\n next.mark({\n candidates,\n orderMayChange: Boolean(\n impact.added.size || impact.removed.size || impact.orderChanged\n ),\n cause: event.cause,\n })\n );\n } else {\n members.forEach(next =>\n next.mark({ fullScan: true, orderMayChange: true, cause: event.cause })\n );\n }\n } catch (cause) {\n members.forEach(next => next.fail(cause));\n }\n scheduler.run();\n });\n } catch (cause) {\n created.close();\n throw cause;\n }\n connection = created;\n externalCollections.set(source, connection);\n }\n connection.members.add(boundary);\n boundary.detach(() => {\n connection!.members.delete(boundary);\n if (!connection!.members.size) connection!.close();\n });\n return boundary;\n };\n\n return {\n materialize(definition: SourceDefinition): SourceMaterialization {\n switch (definition.source.kind) {\n case 'value-input':\n return valueInput(definition);\n case 'collection-input':\n return collectionInput(definition);\n case 'document':\n return documents.materialize(definition);\n case 'readable':\n return readable(definition);\n case 'external-value':\n return externalValue(definition);\n case 'external-collection':\n return externalCollection(definition);\n }\n },\n dispose() {\n documents.dispose();\n readables.forEach(connection => connection.close());\n readables.clear();\n },\n };\n};\n","import type { Unsubscribe } from '../runtime/contract';\nimport {\n incremental,\n type IncrementalCollectionProcessor,\n type IncrementalGroupDefine,\n type IncrementalGroupOutputTree,\n type IncrementalGroupProcessor,\n type IncrementalValueProcessor,\n} from './advanced';\nimport { collectionView, mapRead, snapshotCollectionView } from './collection/view';\nimport type { CollectionChange, CollectionRead } from './contract';\nimport { ProjectionDisposedError } from './contract';\nimport {\n derive,\n input,\n isProjection,\n ownProjection,\n producerOf,\n projectionRef,\n type Input,\n type ProducerDefinition,\n type Projection,\n} from './definition';\nimport { createProcessor } from './graph/processor';\nimport {\n createDirectReadable,\n createSelectorReadable,\n isMapLike,\n type ProjectionReadableSource,\n} from './readable/selection';\nimport type { Readable } from '../readable';\nimport { createScheduler, type OutputRecord, type ProducerRecord } from './graph/scheduler';\nimport { createSourceRegistry } from './source/registry';\nimport type { KeyedInputDraft, SourceWrite } from './source/boundary';\n\ntype KeyedDraft<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n set(key: K, value: V): void;\n remove(key: K): void;\n};\n\nexport type ProjectionRuntime = {\n get<T>(projection: Projection<T, unknown>): T;\n readable<T>(projection: Projection<T, unknown>): Readable<T>;\n readable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n set<T>(input: Input<T>, value: T): void;\n update<K extends string, V>(\n input: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void\n ): void;\n batch<T>(run: () => T): T;\n batch<T>(options: { readonly cause?: unknown }, run: () => T): T;\n scope(): ProjectionScope;\n dispose(): void;\n};\n\nexport type ProjectionScope = {\n readonly input: typeof input;\n readonly derive: typeof derive;\n readonly incremental: typeof incremental;\n get<T>(projection: Projection<T, unknown>): T;\n readable<T>(projection: Projection<T, unknown>): Readable<T>;\n readable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n set<T>(input: Input<T>, value: T): void;\n update<K extends string, V>(\n input: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void\n ): void;\n batch: ProjectionRuntime['batch'];\n dispose(): void;\n};\n\ntype MaterializedProducer = {\n readonly record: ProducerRecord;\n readonly outputs: readonly OutputRecord[];\n readonly write?: SourceWrite;\n};\n\ntype ScopeState = {\n active: boolean;\n readonly materialized: ProducerDefinition[];\n readonly subscriptions: Set<Unsubscribe>;\n};\n\nexport const createProjectionRuntime = (options?: {\n readonly onError?: (error: import('./contract').ProjectionError) => void;\n}): ProjectionRuntime => {\n const scheduler = createScheduler(options?.onError ?? (() => undefined));\n const sources = createSourceRegistry(scheduler);\n const materialized = new WeakMap<ProducerDefinition, MaterializedProducer>();\n const publicViews = new WeakMap<\n OutputRecord,\n { readonly revision: number; readonly value: ReadonlyMap<string, unknown> }\n >();\n const scopes = new Set<ScopeState>();\n\n const assertAccess = (definition: ProducerDefinition, requester?: ScopeState): void => {\n scheduler.assertActive();\n const owner = definition.owner;\n if (owner === undefined) return;\n if (owner !== requester) throw new TypeError('Projection belongs to another scope.');\n if (!requester?.active) throw new ProjectionDisposedError();\n };\n\n const rememberScoped = (\n definition: ProducerDefinition,\n requester: ScopeState | undefined\n ): void => {\n if (requester && definition.owner === requester) requester.materialized.push(definition);\n };\n\n const materializeProducer = (\n definition: ProducerDefinition,\n requester?: ScopeState\n ): MaterializedProducer => {\n assertAccess(definition, requester);\n const existing = materialized.get(definition);\n if (existing) return existing;\n\n let result: MaterializedProducer;\n if (definition.kind === 'source') {\n const source = sources.materialize(definition);\n result = Object.freeze({\n record: source.producer,\n outputs: Object.freeze([source.output]),\n ...(source.write ? { write: source.write } : {}),\n });\n } else {\n if (\n definition.owner === undefined &&\n definition.dependencies.some(dependency => producerOf(dependency).owner !== undefined)\n )\n throw new TypeError('A root projection cannot depend on a scoped projection.');\n const dependencies = definition.dependencies.map(dependency =>\n resolveOutput(dependency, requester)\n );\n const processor = createProcessor(scheduler, definition, Object.freeze(dependencies));\n result = Object.freeze({\n record: processor,\n outputs: processor.outputs,\n });\n }\n\n materialized.set(definition, result);\n rememberScoped(definition, requester);\n return result;\n };\n\n const resolveOutput = (\n projection: Projection<unknown, unknown>,\n requester?: ScopeState\n ): OutputRecord => {\n const ref = projectionRef(projection);\n const producer = materializeProducer(ref.producer, requester);\n const output = producer.outputs[ref.output];\n if (!output) throw new TypeError('Projection output does not exist.');\n return output;\n };\n\n const assertOutput = (output: OutputRecord): void => {\n scheduler.assertActive();\n if (output.owner.disposed) throw new ProjectionDisposedError();\n if (output.owner.fault) throw output.owner.fault;\n };\n\n const publicCurrent = (output: OutputRecord): unknown => {\n assertOutput(output);\n const current = output.current();\n const revision = output.revision();\n const cached = publicViews.get(output);\n if (cached?.revision === revision) return cached.value;\n\n if (output.kind === 'collection') {\n const value = collectionView(current as CollectionRead<string, unknown>);\n publicViews.set(output, { revision, value });\n return value;\n }\n if (isMapLike(current)) {\n const value = snapshotCollectionView(mapRead(current));\n publicViews.set(output, { revision, value });\n return value;\n }\n publicViews.delete(output);\n return current;\n };\n\n const get = <T>(projection: Projection<T, unknown>, requester?: ScopeState): T =>\n publicCurrent(resolveOutput(projection as Projection<unknown, unknown>, requester)) as T;\n\n const readableSource = <T>(\n projection: Projection<T, unknown>,\n requester?: ScopeState\n ): ProjectionReadableSource<T> => {\n const output = resolveOutput(projection as Projection<unknown, unknown>, requester);\n return Object.freeze({\n kind: output.kind,\n current: () => get(projection, requester),\n revision: () => {\n assertOutput(output);\n return output.revision();\n },\n subscribe: output.subscribe,\n });\n };\n\n const makeReadable = <T, R>(\n projection: Projection<T, unknown>,\n selector?: (value: T) => R,\n equality?: (previous: R, next: R) => boolean,\n requester?: ScopeState\n ): Readable<T | R> => {\n const source = readableSource(projection, requester);\n return selector\n ? createSelectorReadable(source, selector, equality)\n : createDirectReadable(source);\n };\n\n function readable<T>(projection: Projection<T, unknown>): Readable<T>;\n function readable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n function readable<T, R>(\n projection: Projection<T, unknown>,\n selector?: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<T | R> {\n return makeReadable(projection, selector, equality);\n }\n\n const inputWrite = (\n target: Projection<unknown, unknown>,\n requester?: ScopeState\n ): SourceWrite => {\n const ref = projectionRef(target);\n if (ref.output !== 0 || ref.producer.kind !== 'source')\n throw new TypeError('Projection is not an input.');\n if (\n ref.producer.source.kind !== 'value-input' &&\n ref.producer.source.kind !== 'collection-input'\n )\n throw new TypeError('Projection is not an input.');\n const write = materializeProducer(ref.producer, requester).write;\n if (!write) throw new TypeError('Projection input is not writable.');\n return write;\n };\n\n const setInput = <T>(target: Input<T>, value: T, requester?: ScopeState): void => {\n const write = inputWrite(target as Projection<unknown, unknown>, requester);\n if (write.kind !== 'value') throw new TypeError('Projection is not a value input.');\n write.set(value);\n };\n\n const updateInput = <K extends string, V>(\n target: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void,\n requester?: ScopeState\n ): void => {\n const write = inputWrite(target as Projection<unknown, unknown>, requester);\n if (write.kind !== 'collection') throw new TypeError('Projection is not a collection input.');\n write.update(run as (draft: KeyedInputDraft<string, unknown>) => void);\n };\n\n function batch<T>(run: () => T): T;\n function batch<T>(options: { readonly cause?: unknown }, run: () => T): T;\n function batch<T>(\n optionsOrCallback: { readonly cause?: unknown } | (() => T),\n maybeCallback?: () => T\n ): T {\n return typeof optionsOrCallback === 'function'\n ? scheduler.batch(optionsOrCallback)\n : scheduler.batch(optionsOrCallback, maybeCallback);\n }\n\n const disposeScope = (state: ScopeState): void => {\n if (!state.active) return;\n scheduler.assertIdle();\n state.active = false;\n state.subscriptions.forEach(unsubscribe => unsubscribe());\n state.subscriptions.clear();\n for (let index = state.materialized.length - 1; index >= 0; index--) {\n const definition = state.materialized[index];\n const current = materialized.get(definition);\n if (!current) continue;\n scheduler.releaseProducer(current.record);\n materialized.delete(definition);\n }\n state.materialized.length = 0;\n scopes.delete(state);\n };\n\n const createScope = (): ProjectionScope => {\n scheduler.assertIdle();\n const state: ScopeState = {\n active: true,\n materialized: [],\n subscriptions: new Set(),\n };\n scopes.add(state);\n\n const assertActive = () => {\n if (!state.active) throw new ProjectionDisposedError();\n scheduler.assertActive();\n };\n const own = <P extends Projection<unknown, unknown>>(projection: P): P => {\n assertActive();\n return ownProjection(projection, state);\n };\n const ownOutputTree = <T>(tree: T): T => {\n if (isProjection(tree)) return own(tree as Projection<unknown, unknown>) as T;\n if (!tree || typeof tree !== 'object')\n throw new TypeError('Incremental group output tree must be an object.');\n for (const value of Object.values(tree as Record<string, unknown>)) ownOutputTree(value);\n return tree;\n };\n\n const scopedInput: typeof input = Object.assign(\n <T>(initial: T, equality?: (previous: T, next: T) => boolean) =>\n own(input(initial, equality)),\n {\n collection: <K extends string, V>(initial?: ReadonlyMap<K, V>) =>\n own(input.collection(initial)),\n }\n );\n const scopedDerive: typeof derive = (dependencies, compute, equality) =>\n own(derive(dependencies, compute, equality));\n const scopedIncremental: typeof incremental = Object.assign(\n <const D extends readonly Projection<unknown, unknown>[], T>(\n dependencies: D,\n processor: IncrementalValueProcessor<D, T>\n ) => own(incremental(dependencies, processor)),\n {\n collection: <const D extends readonly Projection<unknown, unknown>[], K extends string, V>(\n dependencies: D,\n processor: IncrementalCollectionProcessor<D, K, V>\n ) => own(incremental.collection(dependencies, processor)),\n group: <\n const D extends readonly Projection<unknown, unknown>[],\n const O extends IncrementalGroupOutputTree,\n >(\n dependencies: D,\n defineOutputs: (define: IncrementalGroupDefine) => O,\n processor: IncrementalGroupProcessor<D, O>\n ) => ownOutputTree(incremental.group(dependencies, defineOutputs, processor)),\n }\n );\n\n function scopeReadable<T>(projection: Projection<T, unknown>): Readable<T>;\n function scopeReadable<T, R>(\n projection: Projection<T, unknown>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n function scopeReadable<T, R>(\n projection: Projection<T, unknown>,\n selector?: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<T | R> {\n assertActive();\n const source = makeReadable(projection, selector, equality, state);\n return Object.freeze({\n current: () => {\n assertActive();\n return source.current();\n },\n revision: () => {\n assertActive();\n return source.revision();\n },\n subscribe: listener => {\n assertActive();\n const stop = source.subscribe(listener);\n let subscribed = true;\n const unsubscribe = () => {\n if (!subscribed) return;\n subscribed = false;\n state.subscriptions.delete(unsubscribe);\n stop();\n };\n state.subscriptions.add(unsubscribe);\n return unsubscribe;\n },\n });\n }\n\n function scopeBatch<T>(run: () => T): T;\n function scopeBatch<T>(options: { readonly cause?: unknown }, run: () => T): T;\n function scopeBatch<T>(\n optionsOrCallback: { readonly cause?: unknown } | (() => T),\n maybeCallback?: () => T\n ): T {\n assertActive();\n return typeof optionsOrCallback === 'function'\n ? batch(optionsOrCallback)\n : batch(optionsOrCallback, maybeCallback!);\n }\n\n return Object.freeze({\n input: scopedInput,\n derive: scopedDerive,\n incremental: scopedIncremental,\n get: <T>(projection: Projection<T, unknown>) => {\n assertActive();\n return get(projection, state);\n },\n readable: scopeReadable,\n set: <T>(target: Input<T>, value: T) => {\n assertActive();\n setInput(target, value, state);\n },\n update: <K extends string, V>(\n target: Input<ReadonlyMap<K, V>, CollectionChange<K, V>>,\n run: (draft: KeyedDraft<K, V>) => void\n ) => {\n assertActive();\n updateInput(target, run, state);\n },\n batch: scopeBatch,\n dispose: () => disposeScope(state),\n });\n };\n\n return Object.freeze({\n get,\n readable,\n set: setInput,\n update: updateInput,\n batch,\n scope: createScope,\n dispose: () => {\n if (!scheduler.active) return;\n scheduler.assertIdle();\n for (const scope of scopes) {\n scope.active = false;\n scope.subscriptions.forEach(unsubscribe => unsubscribe());\n scope.subscriptions.clear();\n scope.materialized.length = 0;\n }\n scopes.clear();\n sources.dispose();\n scheduler.dispose();\n },\n });\n};\n"],"mappings":"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"}