doxum 0.1.13 → 0.1.15

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 (57) hide show
  1. package/README.md +10 -2
  2. package/dist/advanced.cjs +3 -2
  3. package/dist/advanced.cjs.map +1 -1
  4. package/dist/advanced.d.cts +1 -1
  5. package/dist/advanced.d.ts +1 -1
  6. package/dist/advanced.js +2 -1
  7. package/dist/advanced.js.map +1 -1
  8. package/dist/{contract-BT53Gg94.d.ts → contract-CATCCVu5.d.ts} +1 -1
  9. package/dist/{definition-BlMeHwdz.d.ts → definition-B6J0SSNa.d.ts} +38 -37
  10. package/dist/{definition-kxnWUvX9.d.cts → definition-DN6yW2vi.d.cts} +37 -36
  11. package/dist/definition-Z6TagMup.cjs +107 -0
  12. package/dist/definition-Z6TagMup.cjs.map +1 -0
  13. package/dist/definition-c6XQXzvK.js +72 -0
  14. package/dist/definition-c6XQXzvK.js.map +1 -0
  15. package/dist/index.cjs +2054 -55
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +16 -3
  18. package/dist/index.d.ts +17 -4
  19. package/dist/index.js +2001 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/integration-B7VDgAOJ.cjs +30 -0
  22. package/dist/integration-B7VDgAOJ.cjs.map +1 -0
  23. package/dist/{integration-Bco8ZB16.js → integration-CxVhq-KD.js} +3 -7
  24. package/dist/integration-CxVhq-KD.js.map +1 -0
  25. package/dist/integration.cjs +4 -9
  26. package/dist/integration.d.cts +2 -7
  27. package/dist/integration.d.ts +2 -7
  28. package/dist/integration.js +3 -3
  29. package/dist/local-sync.d.ts +1 -1
  30. package/dist/notification-CDSUfiip.cjs +398 -0
  31. package/dist/notification-CDSUfiip.cjs.map +1 -0
  32. package/dist/notification-IQIJyH3Q.js +285 -0
  33. package/dist/notification-IQIJyH3Q.js.map +1 -0
  34. package/dist/react.cjs +6 -52
  35. package/dist/react.cjs.map +1 -1
  36. package/dist/react.js +4 -50
  37. package/dist/react.js.map +1 -1
  38. package/dist/{definition-177L4Amk.cjs → scope-Ezs-Y3TY.cjs} +1 -118
  39. package/dist/scope-Ezs-Y3TY.cjs.map +1 -0
  40. package/dist/{definition-DXrKMVs7.js → scope-d-L87NeC.js} +2 -65
  41. package/dist/scope-d-L87NeC.js.map +1 -0
  42. package/package.json +1 -1
  43. package/skills/doxum-runtime/references/guide.en.md +2 -1
  44. package/skills/doxum-runtime/references/guide.zh-CN.md +2 -1
  45. package/skills/doxum-runtime/references/projections.en.md +15 -6
  46. package/skills/doxum-runtime/references/projections.zh-CN.md +13 -5
  47. package/dist/definition-177L4Amk.cjs.map +0 -1
  48. package/dist/definition-DXrKMVs7.js.map +0 -1
  49. package/dist/integration-Bco8ZB16.js.map +0 -1
  50. package/dist/integration-CEUn96tx.cjs +0 -52
  51. package/dist/integration-CEUn96tx.cjs.map +0 -1
  52. package/dist/store-CDeqZEE3.d.cts +0 -28
  53. package/dist/store-CtgvCVFg.js +0 -2222
  54. package/dist/store-CtgvCVFg.js.map +0 -1
  55. package/dist/store-DcDpDgjk.cjs +0 -2401
  56. package/dist/store-DcDpDgjk.cjs.map +0 -1
  57. package/dist/store-P5dJ7TVe.d.ts +0 -28
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["DocumentDisposedError","equalValue","copyValue","compiledShape","resolveLocated","resolveValue","memberKey","AddressIndex","contains","sealChanges","createAddressResolver","checkValue","fail","resolveContainer","resolveTreeContainer","resolveValue","copyValue","memberKey","checkKey","invalidValue","fail","checkValue","ParseError","copyValue","DocumentDisposedError","accessOf","DocumentReentrancyError","createImpact","notify","MutationRejected","TransactionRejected","resolveAddress","read","createAccess","decodeChanges","subscribeRoot","subscribeTargets","compilePath","createNotification","accessOf","readWith"],"sources":["../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"],"sourcesContent":["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') return (value as unknown[]).map(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.keys(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"],"mappings":";;;;;;AAYA,MAAa,iBAA0B,UASjC;CACJ,IAAI,QAAiB,EAAE;CACvB,IAAI,QAAiB,EAAE;CACvB,MAAM,4BAAY,IAAI,KAAiB;CACvC,IAAI,QAAsB,OAAO,OAAO;EAAE,WAAW;EAAG,WAAW;EAAG,CAAC;CACvE,IAAI,WAAW;CACf,IAAI,UAAU;CACd,IAAI,WAAW;CACf,IAAI;CACJ,MAAM,mBAA6C;EACjD,QAAQ;EACR,UAAU,MAAM,UAAU;EAC3B;CACD,MAAM,gBAAgB;AACpB,MAAI,MAAM,cAAc,MAAM,UAAU,MAAM,cAAc,MAAM,OAAQ;AAC1E,UAAQ,OAAO,OAAO;GAAE,WAAW,MAAM;GAAQ,WAAW,MAAM;GAAQ,CAAC;AAC3E;AACA,YAAU;;CAEZ,MAAM,cAAwC;AAC5C,MAAI,CAAC,QAAS,QAAO,EAAE;AACvB,YAAU;EACV,MAAM,SAA0B,EAAE;AAClC,OAAK,MAAM,YAAY,CAAC,GAAG,UAAU,EAAE;AACrC,OAAI,CAAC,UAAU,IAAI,SAAS,CAAE;AAC9B,OAAI;AACF,cAAU;YACH,OAAO;AACd,WAAO,KAAK;KAAE,OAAO;KAAY;KAAO,CAAC;;;AAG7C,SAAO;;CAET,MAAM,cAAc;AAClB,UAAQ,KAAA;AACR,QAAM,SAAS,MAAM,SAAS;AAC9B,WAAS;;CAEX,MAAM,UAAU,cAAoE;AAClF,QAAM,YAAY;EAClB,MAAM,OAAO,cAAc,SAAS,QAAQ;EAC5C,MAAM,KAAK,cAAc,SAAS,QAAQ;EAC1C,MAAM,gBAAgB;EACtB,MAAM,gBAAgB;EACtB,MAAM,QAAQ,cAAc,WAAW,KAAK,GAAG,GAAG,GAAG,KAAK,KAAK;AAC/D,MAAI,CAAC,MAAO,QAAO,WAAW;AAC9B,MAAI,cAAc,UAAU;AAC1B,OAAI,CAAC,SAAS,MAAM,UAAU,MAC5B,OAAM,IAAI,MAAM,0CAA0C;AAC5D,WAAQ,MAAM;AACd,WAAQ,MAAM;QACT,IAAG,KAAK,MAAM;EACrB,IAAI,YAAY;AAChB,MAAI;GACF,MAAM,UAAU,cAAc,SAAS,MAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,SAAS;GACtF,MAAM,SAAS,MAAM,MAAM,SAAS,cAAc,SAAS,YAAY,WAAW;AAClF,eAAY,OAAO,WAAW;AAC9B,OAAI,aAAa,cAAc,SAAU,SAAQ,KAAA;AACjD,OAAI,OAAO,WAAW,aAAa;AACjC,aAAS;IACT,MAAM,SAAS,MAAM,OAAO,MAAM;AAClC,QAAI,OAAO,OACT,OAAM,IAAI,eACR,OAAO,KAAI,UAAS,MAAM,MAAM,EAChC,4BACD;;AAEL,UAAO;YACC;AACR,OAAI,CAAC,UACH,KAAI,cAAc,UAAU;AAC1B,YAAQ;AACR,YAAQ;UACH;AACL,OAAG,KAAK;AACR,SAAK,KAAK,MAAM;;;;AA4DxB,QAAO;EACL,KAAA;GAvDA,eAAe;GACf,gBAAgB;GAChB,YAAW,aAAY;AACrB,QAAI,SAAU,OAAM,IAAIA,cAAAA,uBAAuB;AAC/C,cAAU,IAAI,SAAS;AACvB,iBAAa;AACX,eAAU,OAAO,SAAS;;;GAG9B,YAAY;AACV,UAAM,YAAY;AAClB,YAAQ,KAAA;AACR,WAAO,OAAO,OAAO;;GAEvB,YAAY;AACV,UAAM,YAAY;AAClB,YAAQ,KAAA;AACR,WAAO,OAAO,OAAO;;GAEvB,aAAa;AACX,UAAM,YAAY;AAClB,WAAO;IACP,MAAM,SAAS,MAAM,OAAO,MAAM;AAClC,QAAI,OAAO,OACT,OAAM,IAAI,eACR,OAAO,KAAI,UAAS,MAAM,MAAM,EAChC,4BACD;;GAEL,aAAa;AACX,UAAM,YAAY;AAClB,QAAI,MAAO,OAAM,IAAI,MAAM,qCAAqC;AAChE,QAAI,MAAM,YAAY,EAAG,OAAM,IAAI,MAAM,uBAAuB;IAChE,MAAM,QAAe;KAAE,OAAO,MAAM,OAAO;KAAE,OAAO,MAAM,OAAO;KAAE;AACnE,YAAQ;AACR,WAAO,OAAO,OAAO;KACnB,WAAW;AACT,YAAM,YAAY;AAClB,UAAI,UAAU,MAAO,SAAQ,KAAA;;KAE/B,cAAc;AACZ,YAAM,YAAY;AAClB,UAAI,UAAU,MAAO,QAAO,WAAW;AACvC,UAAI,CAAC,MAAM,OAAO;AAChB,eAAQ,KAAA;AACR,cAAO,WAAW;;MAEpB,MAAM,SAAS,OAAO,SAAS;AAC/B,UAAI,OAAO,WAAW,WAAY,SAAQ,KAAA;AAC1C,aAAO;;KAEV,CAAC;;GAID;EACH,SAAS,UAAqB;AAC5B,OAAI,MAAM,YAAY,EAAG;AACzB,OAAI,OAAO,MAAO,OAAM,MAAM,QAAQ,KAAK,MAAM;QAC5C;IACH,MAAM,QAAe,EAAE,SAAS,CAAC,MAAM,EAAE;AACzC,UAAM,KAAK,MAAM;AACjB,QAAI,MAAO,OAAM,QAAQ;AACzB,QAAI,MAAM,SAAS,MAAM,SAAU,OAAM,OAAO;;AAElD,SAAM,SAAS;AACf,YAAS;;EAEX;EACA;EACA,gBAAgB;AACd,WAAQ,KAAA;;EAEV,YAAY;EACZ,eAAe;AACb,cAAW;AACX,aAAU,OAAO;AACjB,UAAO;AACP,aAAU;;EAEb;;;;;AChLH,MAAa,iBACX,QACA,KACA,SACA,UACS;AACT,KAAI,MAAM,QAAQ,OAAO,EAAE;EACzB,MAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,QACF,KAAI,QAAQ,EAAG,eAAA,OAAc,QAAQ,OAAO,QAAQ,MAAM;MACrD,QAAO,SAAS;WACZ,SAAS,EAAG,eAAA,OAAc,QAAQ,MAAM;YAC1C,CAAC,QAAS,QAAO,OAAO;UAC1B,OAAO,OAAO,QAAQ,IAAI,CAAE,QAAO,OAAO;KAEjD,QAAO,eAAe,QAAQ,KAAK;EACjC;EACA,UAAU;EACV,cAAc;EACd,YAAY;EACb,CAAC;;AAGN,MAAa,WAAW,MAAoB,UAA6B;AACvE,KAAI,KAAK,SAAS,OAAQ,QAAQ,MAAoB,IAAI,KAAK,MAAM;AACrE,KAAI,KAAK,SAAS,QAAS,QAAO,CAAC,GAAI,MAA4B,IAAI;AACvE,OAAM,IAAI,MAAM,kCAAkC;;AAGpD,MAAa,gBACX,MACA,OACA,UACS;AACT,KAAI,KAAK,SAAS,OAAQ,eAAA,QAAe,OAAoB,KAAK,OAAO,MAAM;UACtE,KAAK,SAAS,QAAU,OAA4B,MAAM,CAAC,GAAG,MAAM;KACxE,OAAM,IAAI,MAAM,kCAAkC;;;;ACCzD,MAAM,eAAe,OAAoB,QAAwC;AAC/E,KAAI,MAAM,WAAW,UAAW,QAAO,MAAM,SAAS,IAAI,IAAI;CAC9D,MAAM,SAAS,MAAM,YAAY,IAAI,IAAI;AACzC,QAAO,UAAU,MAAM,QAAQ,OAAO;;AAGxC,MAAM,gBAAgB,OAAoB,QAAsB;AAC9D,KAAI,MAAM,WAAW,UAAW,OAAM,SAAS,OAAO,IAAI;MACrD;EACH,MAAM,aAAa,MAAM,YAAY,IAAI,IAAI;AAC7C,MAAI,WAAY,OAAM,QAAQ,WAAW,QAAQ,KAAA;;;AAGrD,MAAM,cAAc,UAClB,CAAC,MAAM,UAAU,MAAM,WAAW,UAAU,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG,CAAC,MAAM,SAAS;AAE7F,MAAM,YAAY,UAA4C;CAC5D,GAAG;CACH,UAAU,CAAC,GAAG,KAAK,SAAS;CAC7B;AACD,MAAM,cACJ,MACA,KACA,eACA,QACA,cACA,UAC6B;AAC7B,KAAI,kBAAkB,iBAAiB,CAAC,iBAAiB,OAAO,GAAG,QAAQ,MAAM,EAAG;AACpF,KAAI,KAAK,SAAS,WAAW,kBAAkB,gBAAgBC,mBAAAA,WAAW,MAAM,QAAQ,MAAM,CAC5F;CACF,MAAM,QAAQ,eAAgB,KAAK,SAAS,UAAU,QAAQC,mBAAAA,UAAU,MAAM,MAAM,GAAI,KAAA;AACxF,eAAA,QAAQ,SAAS,cAAc;AAC/B,QAAO,CAAC,gBACJ;EAAE;EAAK,MAAM;EAAS,OAAO;EAAO,GACpC,CAAC,eACC;EAAE;EAAK,MAAM;EAAW;EAAQ,GAChC;EAAE;EAAK,MAAM;EAAW;EAAQ,OAAO;EAAO;;AAGtD,MAAM,kBACJ,SACA,IACA,SACA,UACS;AACT,KAAI,CAAC,QAAQ,UAAU,CAAC,MAAO;AAC/B,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,KAAI,QAAQ,IAAI,GAAG,MAAM,QAAQ,GAAG,KAAK;AACvC,UAAQ,MAAM,GAAG,MAAM,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC;AAC7C;;AAEJ,SAAQ,KAAK,QAAQ;EAAE,MAAM;EAAW;EAAI;EAAS;EAAO,GAAG;EAAE,MAAM;EAAW;EAAI;EAAS,CAAC;;;AAIlG,MAAM,cACJ,SACA,SACA,MACA,IACA,KACA,eACA,QACA,cACA,UACS;AACT,KAAI,kBAAkB,iBAAiB,CAAC,iBAAiB,OAAO,GAAG,QAAQ,MAAM,EAAG;AACpF,KAAI,iBAAiB,gBAAgB,WAAW,KAAA,KAAa,UAAU,KAAA,GAAW;AAMhF,MAJE,KAAK,SAAS,YACb,KAAK,SAAS,aACZ,OAAmC,KAAK,SACtC,MAAkC,KAAK,MAC/B;GACb,MAAM,OAAO,QACX,QAAQ;GACV,MAAM,UAAU,GAAG,OAAO,IAAI;GAC9B,MAAM,WAA2B,EAAE;AACnC,QAAK,MAAM,CAAC,OAAO,eAAeC,cAAAA,cAAc,MAAM,OAAO,CAAE,QAC7D,YACE,SACA,UACA,WAAW,MACX,SACA,OACA,OAAO,OAAO,MAAM,MAAM,EAC1B,KAAK,QACL,OAAO,OAAO,OAAO,MAAM,EAC3B,MAAM,OACP;AACH,kBAAe,SAAS,SAAS,SAAS;AAC1C;;AAEF,MAAI,KAAK,SAAS,SAAS,KAAK,SAAS,SAAS;GAChD,MAAM,IAAI,QACR,IAAI;GACN,MAAM,OAAQ,KAAK,SAAS,UAAU,EAAE,OAAO;GAC/C,MAAM,QAAS,KAAK,SAAS,UAAU,EAAE,OAAO;GAChD,MAAM,UAAU,GAAG,OAAO,IAAI;GAC9B,MAAM,WAA2B,EAAE;AACnC,QAAK,MAAM,MAAM,OAAO,KAAK,KAAK,CAChC,YACE,SACA,UACA,KAAK,OACL,SACA,IACA,MACA,KAAK,KACL,OAAO,OAAO,OAAO,GAAG,EACxB,MAAM,IACP;AACH,QAAK,MAAM,MAAM,OAAO,KAAK,MAAM,CACjC,KAAI,CAAC,OAAO,OAAO,MAAM,GAAG,CAC1B,YAAW,SAAS,UAAU,KAAK,OAAO,SAAS,IAAI,OAAO,KAAA,GAAW,MAAM,MAAM,IAAI;GAC7F,IAAI;AACJ,OAAI,KAAK,SAAS,WAAW,CAAA,cAAA,MAAc,EAAE,KAAiB,EAAE,IAAgB,EAAE;AAChF,kBAAA,QAAQ,SAAS,uBAAwB,EAAE,IAAiB,OAAO;AACnE,YAAQ;KAAE,QAAQ,EAAE;KAAiB,OAAO,CAAC,GAAI,EAAE,IAAiB;KAAE;;AAExE,kBAAe,SAAS,SAAS,UAAU,MAAM;AACjD;;;CAGJ,MAAM,SAAS,WAAW,MAAM,KAAK,eAAe,QAAQ,cAAc,MAAM;AAChF,KAAI,OAAQ,SAAQ,KAAK,OAAO;;AAElC,MAAM,WAAW,MAAmB,QAAsB,MAAe,OAAO,MAAe;CAC7F,MAAM,KAAK,OAAO,KAAK,GAAG,MAAM,KAAK,GAAG,KAAK;AAC7C,KAAI,KAAK,SAAS,UAAU;EAC1B,MAAM,SAAS,KAAK;EACpB,MAAM,QAAQ,OAAO,UAAUD,mBAAAA,UAAU,OAAO,MAAM,OAAO,MAAM,GAAG,KAAA;AACtE,MAAI,CAAC,GAAG,OAAQ,QAAO;EACvB,MAAM,WAAWE,cAAAA,eAAe,QAAQ,MAAM,GAAG;AACjD,MAAI,CAAC,SAAU,OAAM,IAAI,MAAM,uCAAuC;AACtE,gBAAc,SAAS,QAAQ,SAAS,KAAK,OAAO,SAAS,MAAM;AACnE,SAAO;;CAET,MAAM,WAAWC,cAAAA,aAAa,QAAQ,MAAM,GAAG;AAC/C,KAAI,CAAC,SAAU,OAAM,IAAI,MAAM,wCAAwC;AACvE,KAAI,KAAK,SAAS,QAAS,cAAa,SAAS,MAAM,SAAS,OAAO,KAAK,MAAM,MAAO;MACpF;EACH,MAAM,OAAO,SAAS;AACtB,MAAI,KAAK,WAAW,KAAM,QAAO,KAAK;MACjC,MAAK,SAAS,KAAK;AACxB,OAAK,MAAM,CAAC,IAAI,SAAS,KAAK,MAC5B,eAAc,KAAK,OAAO,IAAI,SAAS,KAAA,GAAW,QAAQ,SAAS,KAAK,CAAC;;AAE7E,QAAO;;AAGT,MAAM,qBACJ,MACA,SACA,SACA,WACY;CACZ,IAAI,SAASH,mBAAAA,UAAU,MAAM,QAAQ;AACrC,MAAK,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,IACvC,KAAI,QAAQ,GAAG,SAAS,QAAS,UAAS,QAAQ,QAAQ,IAAI,MAAM,QAAQ,OAAO;AACrF,MAAK,MAAM,UAAU,QACnB,KAAI,OAAO,SAAS,QAAS,UAAS,QAAQ,QAAQ,MAAM,QAAQ,OAAO;AAC7E,QAAO;;AAGT,MAAM,eAAe,MAAmB,YAA4B;CAClE,MAAM,UAA0B,EAAE;AAClC,MAAK,MAAM,UAAU,KAAK,SAAS,QAAQ,IAAI,EAAE,EAAE;AACjD,MAAI,CAAC,OAAQ;EACb,MAAM,MAAMI,cAAAA,UAAU,MAAM,OAAO,IAAI;EACvC,MAAM,UAAU,OAAO,OAAO,KAAK,QAAQ,IAAI;EAC/C,MAAM,QAAS,KAAK,OAA4C;AAChE,MAAI,OAAO,KAAK,SAAS,SAAS;GAChC,MAAM,SAAS,WACb,OAAO,MACP,OAAO,KACP,OAAO,SACP,OAAO,OACP,SACA,MACD;AACD,OAAI,OAAQ,SAAQ,KAAK,OAAO;QAEhC,YACE,SACA,SACA,OAAO,MACP,KAAK,IACL,OAAO,KACP,OAAO,SACP,OAAO,OACP,SACA,MACD;;CAEL,IAAI;AACJ,KAAI,KAAK,OAAO;EACd,MAAM,UACJ,KAAK,KAAK,SAAS,SAAA,cAAA,KACH,KAAK,OAAoB,KAAK,KAAK,MAAM,GACpD,KAAK,MAA4B;AACxC,MAAI,CAAA,cAAA,MAAc,KAAK,OAAO,QAAQ,EAAE;GACtC,MAAM,QAAQ,QAAQ,KAAK,MAAM,KAAK,MAAM;AAC5C,iBAAA,QAAQ,SAAS,uBAAuB,MAAM,OAAO;AACrD,WAAQ;IAAE,QAAQ,KAAK;IAAO;IAAO;;;AAGzC,gBAAe,SAAS,KAAK,IAAI,SAAS,MAAM;;AAGlD,MAAM,YAAY,MAAgB,OAAuB,YAA4B;CACnF,MAAM,WAAWD,cAAAA,aAAa,MAAM,QAAQ,MAAM,UAAU,KAAK,GAAG;CACpE,MAAM,OAAO,UAAU;CACvB,MAAM,OAAO,UAAU;AACvB,KAAI,MAAM,SAAS,OAAQ,OAAM,IAAI,MAAM,0CAA0C;CACrF,MAAM,QAA8D,EAAE;AACtE,MAAK,MAAM,CAAC,IAAI,WAAW,KAAK,OAAO;EACrC,MAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,GAAG,GAAG,KAAK,MAAM,MAAM,KAAA;AAC/D,MAAI,CAAC,UAAU,CAAC,MAAO;AACvB,MACE,UACA,SACA,OAAO,aAAa,MAAM,YAAA,cAAA,MACb,OAAO,UAAU,MAAM,SAAS,IAC7C,OAAO,OAAO,QAAQ,QAAQ,KAAK,OAAO,OAAO,OAAO,QAAQ,IAChEJ,mBAAAA,WAAW,KAAK,OAAO,OAAO,OAAO,MAAM,MAAM,CAEjD;AACF,QAAM,KACJ,CAAC,SACG;GAAE;GAAI,MAAM;GAAS,OAAO,SAAS,MAAO;GAAE,GAC9C,CAAC,QACC;GAAE;GAAI,MAAM;GAAW;GAAQ,GAC/B;GAAE;GAAI,MAAM;GAAW;GAAQ,OAAO,SAAS,MAAM;GAAE,CAC9D;;CAEH,MAAM,QAAQ,KAAK,UAAU;AAC7B,KAAI,MAAM,UAAU,KAAK,WAAW,MAClC,SAAQ,KAAK;EACX,MAAM;EACN,IAAI,KAAK;EACT,QAAQ,KAAK;EACb;EACA,OAAO,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;EACjD,CAAC;;;AAIN,IAAa,iBAAb,MAA4B;CAC1B,wBAAyB,IAAI,KAAW;CACxC,yBAAiB,IAAI,SAA8B;CACnD;CACA,gBAAwB;CACxB;CACA,YAAY,OAAwC;AAAvB,OAAA,QAAA;;CAC7B,cAA0C;EACxC,MAAM,QAAS,KAAK,UAAU,IAAIM,cAAAA,cAAc;AAChD,MAAI,CAAC,KAAK,eAAe;AACvB,QAAK,gBAAgB;AACrB,QAAK,MAAM,QAAQ,KAAK,MACtB,KAAI,KAAK,SAAS,WAAW;AAC3B,UAAM,IAAI,KAAK,IAAI,KAAK;AACxB,kBAAA,QAAQ,SAAS,gBAAgB;;;AAIvC,SAAO;;CAET,QAAgB,IAA8B;AAC5C,SACE,KAAK,gBAAgB,KAAA,KACpB,KAAK,iBACJ,KAAK,MAAO,aACV,KACA,SACE,KAAK,SAAS,aACd,KAAK,GAAG,SAAS,GAAG,UACpB,YAAY,MAAM,GAAG,KAAK,GAAG,QAAQ,KAAK,KAAA,EAC7C;;CAGP,OACE,IACA,MACA,OACA,SACS;EACT,MAAM,QAAQ,KAAK,aAAa;EAChC,MAAM,WAA0B,EAAE;AAClC,QAAM,OAAM,SAAQ;AAClB,OAAI,KAAK,SAAS,WAAW;AAE3B,QAAI,KAAK,GAAG,SAAS,GAAG,QAAQ;AAC9B,SAAI,KAAK,GAAG,SAAS,MAAM,GAAG,QAAQ;MACpC,MAAM,SAAS,YAAY,MAAM,GAAG,KAAK,GAAG,QAAQ;AACpD,UAAI,OAAQ,UAAS,KAAK;OAAE,MAAM;OAAU;OAAI,OAAO;OAAM;OAAQ,CAAC;;AAExE;;AAEF,QAAI,KAAK,SAASC,cAAAA,SAAS,IAAI,KAAK,GAAG,CACrC,UAAS,KAAK;KAAE,MAAM;KAAS,IAAI,KAAK;KAAI,OAAO;KAAM,CAAC;AAC5D,SAAK,MAAM,UAAU,KAAK,SAAS,QAAQ,IAAI,EAAE,EAAE;AACjD,SAAI,CAAC,OAAQ;KACb,MAAM,WAAW,KAAK,GAAG,OAAO,OAAO,IAAI;AAC3C,SAAIA,cAAAA,SAAS,IAAI,SAAS,CACxB,UAAS,KAAK;MAAE,MAAM;MAAU,IAAI;MAAU,OAAO;MAAM;MAAQ,CAAC;;cAE/DA,cAAAA,SAAS,IAAI,KAAK,GAAG,CAAE,UAAS,KAAK,KAAK;IACrD,CAAC,GAAG;AACN,MAAI,QAAS,SAAQ,kBAAkB,MAAM,OAAO,UAAU,GAAG,OAAO;AACxE,OAAK,eAAe,SAAS;AAC7B,SAAO;;CAET,eAAuB,UAAwC;EAC7D,IAAI;AACJ,OAAK,MAAM,SAAS,UAAU;AAC5B,iBAAA,QAAQ,SAAS,WAAW;AAC5B,OAAI,MAAM,SAAS,UAAU;IAC3B,MAAM,EAAE,OAAO,WAAW;AAC1B,iBAAa,OAAO,OAAO,IAAI;AAC/B,KAAC,kCAAkB,IAAI,KAAK,EAAE,IAAI,MAAM;cAC/B,MAAM,SAAS,SAAS;AACjC,UAAM,MAAM,QAAQ,KAAA;AACpB,KAAC,kCAAkB,IAAI,KAAK,EAAE,IAAI,MAAM,MAAM;SAE9C,MAAK,WAAW,MAAM;;AAG1B,OAAK,MAAM,SAAS,iBAAiB,EAAE,CACrC,KAAI,WAAW,MAAM,CACnB,MAAK,WAAW,MAAM;;CAI5B,SAAiB,MAAkB;AACjC,OAAK,MAAM,IAAI,KAAK;AACpB,MAAI,KAAK,SAAS,WAAW;AAC3B,QAAK,OAAO,IAAI,KAAK,QAAQ,KAAK;AAClC,iBAAA,QAAQ,SAAS,SAAS;AAC1B,OAAI,CAAC,KAAK,cAAe;AACzB,iBAAA,QAAQ,SAAS,gBAAgB;;AAEnC,GAAC,KAAK,UAAU,IAAID,cAAAA,cAAc,EAAE,IAAI,KAAK,IAAI,KAAK;;CAExD,WAAmB,MAAkB;AACnC,OAAK,MAAM,OAAO,KAAK;AACvB,OAAK,OAAO,OAAO,KAAK,IAAI,KAAK;AACjC,MAAI,KAAK,SAAS,UAAW,MAAK,OAAO,OAAO,KAAK,OAAO;;CAE9D,OACE,WACA,KACA,YACA,aACM;AACN,MAAI,KAAK,YAAa;EACtB,MAAM,EAAE,SAAS;EACjB,IAAI,QAAQ,KAAK,OAAO,IAAI,UAAU,OAAO;AAC7C,MAAI,OAAO,WAAW,aAAa,MAAM,SAAS,IAAI,IAAI,CAAE;AAC5D,MAAI,OAAO,WAAW,WAAW,WAAW,SAAS,WAAW,MAAM,QAAQ,WAAW,MACvF;EACF,MAAM,KAAK,KAAK,iBAAiB,KAAK,SAAS,UAAU,UAAU,GAAG,OAAO,IAAI,GAAG,KAAA;AACpF,MAAI,MAAM,KAAK,QAAQ,GAAG,CAAE;EAC5B,MAAM,UAAU,OAAO,OAAO,UAAU,QAAQ,YAAY;EAC5D,IAAI,QAAS,UAAU,OAA4C;AACnE,MAAI,KAAK,SAAS,QAAS,SAAQ,KAAK,OAAO,IAAK,MAAM,OAAO,QAAQ;AACzE,MAAI,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,MAAM,CAClC,SAAQ,KAAK,YAAY,UAAU;EAErC,MAAM,SAAqB;GAAE;GAAK;GAAM;GAAS;GAAO;AACxD,MAAI,MAAM,WAAW,UAAW,EAAC,MAAM,4BAAY,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO;WACrE,WAAW,SAAS,QAAS,OAAM,QAAQ,WAAW,QAAQ;MAClE,OAAM,IAAI,MAAM,uDAAuD;AAC5E,gBAAA,QAAQ,SAAS,QAAQ;;CAE3B,QAAc;AACZ,MAAI,KAAK,YAAa;EACtB,MAAM,QAAQ,KAAK,OAAO,EAAE,EAAE,KAAK,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK;AAC3E,OAAK,cAAc,EAAE,OAAO;AAC5B,OAAK,yBAAS,IAAI,SAAS;AAC3B,gBAAA,QAAQ,SAAS,QAAQ;;CAE3B,YAAoB,WAA2C;EAC7D,MAAM,QACJ,UAAU,OAAO,SAAS,UACtB;GACE,MAAM;GACN,IAAI,UAAU;GACd,MAAM,UAAU;GAChB,QAAQ,UAAU;GAClB,OAAO,UAAU;GACjB,QAAQ;GACR,aAAa,UAAU,OAAO;GAC9B,SAAS,IAAI,MAA8B,UAAU,OAAO,QAAQ,KAAK;GAC1E,GACD;GACE,MAAM;GACN,IAAI,UAAU;GACd,MAAM,UAAU;GAChB,QAAQ,UAAU;GAClB,OAAO,UAAU;GACjB,QAAQ;GACR,SAAS,KAAA;GACV;AACP,OAAK,SAAS,MAAM;AACpB,SAAO;;CAET,MAAM,WAAoC;AACxC,gBAAA,QAAQ,SAAS,gBAAgB;EACjC,IAAI,QAAQ,KAAK,OAAO,IAAI,UAAU,OAAO;AAC7C,MAAI,OAAO,SAAS,KAAK,QAAQ,UAAU,GAAG,CAAE;AAChD,YAAU,KAAK,YAAY,UAAU;AACrC,QAAM,QAAQ,QAAQ,UAAU,MAAM,UAAU,MAAM;AACtD,gBAAA,QAAQ,SAAS,iBAAiB;AAClC,gBAAA,QAAQ,SAAS,cAAc,MAAM,MAAM,OAAO;;CAEpD,KAAK,WAAkC,IAAmB;EACxD,MAAM,EAAE,IAAI,OAAO,SAAS;AAC5B,MAAI,KAAK,QAAQ,GAAG,CAAE;EACtB,MAAM,QAAS,KAAK,UAAU,IAAIA,cAAAA,cAAc;EAChD,IAAI;AACJ,OAAK,MAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,EAAE,CAAE,KAAI,KAAK,SAAS,OAAQ,QAAO;AAC3E,MAAI,CAAC,MAAM;AACT,UAAO;IAAE,MAAM;IAAQ;IAAI,QAAQ,KAAK,UAAU;IAAM,uBAAO,IAAI,KAAK;IAAE;AAC1E,QAAK,SAAS,KAAK;;AAErB,MAAI,OAAO,KAAA,KAAa,CAAC,KAAK,MAAM,IAAI,GAAG,EAAE;AAC3C,iBAAA,QAAQ,SAAS,YAAY;AAC7B,QAAK,MAAM,IAAI,IAAI,OAAO,OAAO,KAAK,OAAO,GAAG,GAAG,SAAS,KAAK,MAAM,IAAI,GAAG,KAAA,EAAU;;;CAG5F,WAAiB;AACf,MAAI,KAAK,aAAa;AACpB,QAAK,MAAM,WAAW,KAAK,YAAY;AACvC;;EAEF,MAAM,QAAQ,CAAC,GAAG,KAAK,MAAM;AAC7B,OAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;GAC1C,MAAM,OAAO,MAAM;AACnB,OAAI,KAAK,SAAS,UAChB,MAAK,MAAM,UAAU,KAAK,SAAS,QAAQ,IAAI,EAAE,EAAE;AACjD,QAAI,CAAC,OAAQ;AACb,kBACE,KAAK,QACLD,cAAAA,UAAU,MAAM,OAAO,IAAI,EAC3B,OAAO,SACP,OAAO,UAAUJ,mBAAAA,UAAU,OAAO,MAAM,OAAO,MAAM,GAAG,KAAA,EACzD;;YAEM,KAAK,SAAS,OAAQ,SAAQ,MAAM,KAAK,MAAM,QAAQ,KAAK,MAAM,SAAS;;AAExF,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,aAAa,KAAK,MAAO,cAAa,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM;;CAE9F,OAAkB;AAChB,MAAI,KAAK,aAAa;AACpB,OAAID,mBAAAA,WAAW,KAAK,MAAM,QAAQ,KAAK,YAAY,OAAO,KAAK,MAAM,SAAS,CAC5E,QAAOQ,eAAAA,YAAY,EAAE,CAAC;AACxB,iBAAA,QAAQ,SAAS,SAAS;AAC1B,UAAOA,eAAAA,YAAY,CACjB;IACE,MAAM;IACN,QAAQ,KAAK,YAAY;IACzB,OAAOP,mBAAAA,UAAU,KAAK,MAAM,QAAQ,KAAK,MAAM,SAAS;IACzD,CACF,CAAC;;EAEJ,MAAM,UAAoB,EAAE;AAC5B,OAAK,MAAM,QAAQ,KAAK,MACtB,KAAI,KAAK,SAAS,UAAW,aAAY,MAAM,QAAQ;MAClD,UAAS,MAAM,KAAK,OAAO,QAAQ;EAE1C,MAAM,SAASO,eAAAA,YAAY,QAAQ;AACnC,gBAAA,QAAQ,SAAS,UAAU,OAAO,QAAQ,OAAO;AACjD,SAAO;;;AAGX,MAAM,WAAW,GAAW,MAAuB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI;;;ACxf9E,IAAa,kBAAb,MAA6B;CAC3B,WAAoB,EAAE;CACtB,aAAa;CACb;CACA;CACA;CACA,YAAY,OAAgC;AAAvB,OAAA,QAAA;AACnB,OAAK,WAAW,IAAI,eAAe,MAAM;AACzC,OAAK,WAAWC,cAAAA,sBAAsB,MAAM,QAAQ,MAAM,SAAS;AACnE,OAAK,eAAe,MAAM;;CAE5B,SAAS,MAAoB,OAAgB,IAA2B;EACtE,MAAM,QAAQC,mBAAAA,WAAW,MAAM,OAAO,GAAG;AACzC,MAAI,MAAO,eAAA,aAAa,MAAM;;CAEhC,iBAAiB,IAAwC;AACvD,SACE,KAAK,SAAS,UAAU,KAAK,UAAU,KAAK,YAAY,GAAG,IAC3DC,cAAAA,KAAK,IAAI,mBAAmB,4BAA4B;;;CAI5D,KAAK,IAAqB,MAAgC,OAAmC;AAC3F,SACEC,cAAAA,iBAAiB,KAAK,UAAU,KAAK,YAAY,IAAI,MAAM,MAAM,IACjED,cAAAA,KAAK,IAAI,mBAAmB,4BAA4B;;CAG5D,SACE,IACA,MACA,OACuB;AACvB,SACEE,cAAAA,qBAAqB,KAAK,UAAU,KAAK,YAAY,IAAI,MAAM,MAAM,IACrEF,cAAAA,KAAK,IAAI,gBAAgB,mBAAmB;;CAGhD,YAAY,IAA4C;EACtD,MAAM,WAAWG,cAAAA,aAAa,KAAK,MAAM,QAAQ,KAAK,MAAM,UAAU,GAAG;AACzE,SAAO,KAAK,SAAS,IAAI,UAAU,MAAM,UAAU,MAAM;;CAE3D,QAAQ,IAAqB,OAAsB;AACjD,MAAI,CAAC,GAAG,QAAQ;AACd,QAAK,SAAS,KAAK,MAAM,QAAQ,OAAO,GAAG;AAC3C,OAAI,OAAO,GAAG,KAAK,MAAM,UAAU,MAAM,CAAE;AAC3C,QAAK,SAAS,OAAO;AACrB,QAAK,MAAM,WAAWC,mBAAAA,UAAU,KAAK,MAAM,QAAQ,MAAM;AACzD,QAAK,YAAY;AACjB;;AAEF,OAAK,YAAY,KAAK,iBAAiB,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,IAAI,OAAO,MAAM;;CAE3F,aAAa,WAA8B,KAAa,OAAsB;AAC5E,cAAY,KAAK,QAAQ,UAAU;EACnC,MAAM,SAAS,KAAK,WAAW,WAAW,IAAI;AAC9C,MACE,UAAU,OAAO,SAAS,WAC1B,OAAO,KAAK,SAAS,WACrB,OAAO,KAAK,SAAS,aACrB,CAAC,OAAO,KAAK,SAEb,QAAOJ,cAAAA,KACL,UAAU,GAAG,OAAO,IAAI,EACxB,iBACA,qFACD;AACH,OAAK,mBAAmB,WAAW,KAAK,QAAQK,cAAAA,UAAU,WAAW,IAAI,EAAE,OAAO,MAAM;;CAE1F,aAAa,WAA8B,KAAmB;AAC5D,OAAK,YAAY,KAAK,QAAQ,UAAU,EAAE,KAAK,KAAA,GAAW,SAAS;;CAErE,QAAgB,WAAiD;AAC/D,MAAI,UAAU,UAAU,KAAK,SAC3B,QAAOL,cAAAA,KACL,UAAU,IACV,mBACA,iDACD;AACH,SAAO,UAAU,eAAe,KAAK,aACjC,YACA,KAAK,iBAAiB,UAAU,GAAG;;CAEzC,WAAW,WAA8B,KAA6B;EACpE,MAAM,SAAS,UAAU;EACzB,MAAM,SAAS,OAAO,SAAS,YAAY,OAAO,QAAQ,OAAO,QAAQ,IAAI,IAAI;AACjF,MAAI,CAAC,OACH,QAAOA,cAAAA,KAAK,UAAU,GAAG,OAAO,IAAI,EAAE,mBAAmB,0BAA0B;AACrF,SAAO;;;CAGT,YACE,WACA,KACA,OACA,WACA,cAAcK,cAAAA,UAAU,WAAW,IAAI,EAC9B;EACT,MAAM,SAAS,KAAK,WAAW,WAAW,IAAI;AAC9C,SAAO,KAAK,mBAAmB,WAAW,KAAK,QAAQ,aAAa,OAAO,UAAU;;;CAGvF,mBACE,WACA,KACA,QACA,aACA,OACA,WACS;EACT,MAAM,aAAa,UAAU;EAC7B,MAAM,OAAO,OAAO;EACpB,MAAM,UAAU,cAAc;AAC9B,MAAI,WAAW,SAAS,aAAa,WAAW,QAAQ,IACtD,QAAOL,cAAAA,KACL,UAAU,GAAG,OAAO,IAAI,EACxB,iBACA,uCACD;EACH,MAAM,QAAQ,UAAU,OAAO,SAAS;AACxC,MAAI,CAAC,WAAW,CAAC,KAAK,YAAY,CAAC,MACjC,QAAOA,cAAAA,KACL,UAAU,GAAG,OAAO,IAAI,EACxB,kBACA,sCACD;EACH,MAAM,UAAU,OAAO,OAAO,UAAU,QAAQ,YAAY;EAC5D,MAAM,WAAY,UAAU,OAA4C;AACxE,MAAI,YAAY,YAAY,CAAC,WAAW,OAAO,GAAG,UAAU,MAAM,EAAG,QAAO;AAC5E,MAAI,WAAW,SAAS,SAAS,WAAW,SAAS,SAAS;GAC5D,MAAM,QAAQM,mBAAAA,SAAS,WAAW,KAAK,KAAK,EAAE,CAAC;AAC/C,OAAI,MACF,QAAON,cAAAA,KAAK,UAAU,GAAG,OAAO,KAAK,GAAG,MAAM,QAAQ,EAAE,eAAe,MAAM,QAAQ;;AAEzF,MAAI,SAAS;AACX,OAAI,KAAK,SAAS,SAAS;IACzB,MAAM,QAAQD,mBAAAA,WAAW,MAAM,OAAO,EAAE,CAAC;AACzC,QAAI,MAAO,QAAOQ,cAAAA,aAAa,OAAO,UAAU,GAAG,OAAO,KAAK,GAAG,MAAM,QAAQ,CAAC;SAC5E,MAAK,SAAS,MAAM,OAAO,UAAU,GAAG,OAAO,IAAI,CAAC;AAC3D,OAAI,WAAW,SAAS,UAAU,WAAW,MAAM,MAAM,KAAK,IAC5D,QAAOP,cAAAA,KACL,UAAU,GAAG,OAAO,IAAI,EACxB,oBACA,mDACD;;EAEL,MAAM,oBAAoB,SAAS,YAAY;AAC/C,MAAI,sBAAsB,WAAW,SAAS,UAAU,WAAW,SAAS,SAC1E,MAAK,SAAS,MAAM,UAAU;AAChC,OAAK,SAAS,OAAO,WAAW,KAAK,QAAQ,YAAY;EACzD,MAAM,OAAO,UAAW,KAAK,SAAS,UAAU,QAAQI,mBAAAA,UAAU,MAAM,MAAM,GAAI,KAAA;AAClF,gBAAc,UAAU,QAAQ,aAAa,SAAS,KAAK;AAC3D,MAAI,KAAK,SAAS,WAAW,kBAAmB,MAAK,YAAY;AACjE,SAAO;;CAET,aAAmB;AACjB,OAAK;AACL,MAAI,KAAK,iBAAiB,KAAK,MAAM,UAAU;AAC7C,QAAK,eAAe,KAAK,MAAM;AAC/B,QAAK,WAAWN,cAAAA,sBAAsB,KAAK,MAAM,QAAQ,KAAK,MAAM,SAAS;QACxE,MAAK,SAAS,YAAY;;CAEnC,SAAoB;AAClB,SAAO,KAAK,SAAS,MAAM;;CAE7B,WAAiB;AACf,OAAK,SAAS,UAAU;AACxB,OAAK,YAAY;;;;;ACnLrB,SAAgB,MACd,SACA,SACA,WACM;CACN,MAAM,OAAO,cAAc,YAAY,UAAU;AACjD,MAAK,MAAM,UAAU,QAAQ,QAC3B,KAAI,OAAO,SAAS,QAClB,SAAQ,QAAQ,EAAE,EAAE,OAAO,MAAM;UACxB,OAAO,SAAS,WAAW;EACpC,MAAM,YAAY,QAAQ,iBAAiB,OAAO,GAAG;EACrD,MAAM,EAAE,MAAM,OAAO,YAAY;AACjC,MAAI,OAAO,OAAO;AAChB,OAAI,KAAK,SAAS,WAAW,KAAK,SAAS,OACzC,QAAOU,cAAAA,KAAK,OAAO,IAAI,mBAAmB,uCAAuC;AACnF,WAAQ,SAAS,MAAM,UAAU;;EAEnC,IAAI,oBAAoB;AACxB,OAAK,MAAM,UAAU,OAAO,SAAS;GACnC,MAAM,UAAU,SAAS,UAAU,OAAO,SAAS,YAAY,OAAO,SAAS;GAC/E,MAAM,QACJ,SAAS,UACL,OAAO,SAAS,YACd,OAAO,QACP,KAAA,IACF,OAAO,SAAS,UACd,OAAO,SACP,KAAA;AACR,uBACE,QAAQ,YAAY,WAAW,OAAO,KAAK,OAAO,UAAU,QAAQ,SAAS,IAC7E;;AAEJ,MAAI,OAAO,OAAO;GAChB,MAAM,OAAO,KAAK,SAAS,UAAU,OAAO,KAAK,UAAU,OAAO,GAAG,QAAQ,MAAM,QAAQ;AAC3F,OAAI,CAAA,cAAA,QAAgB,OAAO,MAAM,OAAO,KAAK,CAC3C,QAAOA,cAAAA,KACL,OAAO,IACP,mBACA,iDACD;AACH,gBAAa,MAAM,SAAS,OAAO,MAAM,MAAM;AAC/C,WAAQ,YAAY;aACX,qBAAqB,KAAK,SAAS,SAAS;GACrD,MAAM,MAAO,QAA8B;AAC3C,OAAI,CAAA,cAAA,QAAgB,KAAK,OAAO,KAAK,UAAU,OAAO,CAAC,CACrD,QAAOA,cAAAA,KACL,OAAO,IACP,mBACA,qDACD;;QAEA;EACL,MAAM,YAAY,QAAQ,YAAY,OAAO,GAAG;EAChD,MAAM,EAAE,OAAO,SAAS,SAAS;AACjC,UAAQ,SAAS,KAAK,UAAU;AAChC,OAAK,MAAM,QAAQ,OAAO,MAAO,SAAQ,SAAS,KAAK,WAAW,KAAK,GAAG;EAC1E,MAAM,OAAO,OAAO;AACpB,MAAI,SAAS,KAAM,QAAO,QAAQ;MAC7B,SAAQ,SAAS;AACtB,OAAK,MAAM,QAAQ,OAAO,OAAO;GAC/B,MAAM,OACJ,SAAS,UACL,KAAK,SAAS,YACZ,KAAK,QACL,KAAA,IACF,KAAK,SAAS,UACZ,KAAK,SACL,KAAA;AACR,iBACE,QAAQ,OACR,KAAK,IACL,SAAS,KAAA,GACT,QAAQ;IAAE,GAAG;IAAM,UAAU,CAAC,GAAG,KAAK,SAAS;IAAE,CAClD;;AAEH,UAAQ,SAAS,MAAM,SAAS,OAAO,GAAG;AAC1C,UAAQ,YAAY;;;;;AC3C1B,MAAa,kBAAwC,UAI3B;AACxB,KAAI,MAAM,OAAO,SAAS,SACxB,OAAM,IAAI,UAAU,8CAA8C;CACpE,MAAM,UAAUC,mBAAAA,WAAW,MAAM,QAAQ,MAAM,QAAQ;AACvD,KAAI,QAAS,OAAM,IAAIC,mBAAAA,WAAW,QAAQ;CAC1C,MAAM,QAAQ;EACZ,QAAQ,MAAM;EACd,UAAUC,mBAAAA,UAAU,MAAM,QAAQ,MAAM,QAAQ;EAChD,UAAU;EACX;CACD,IAAI,WAAW,GACb,OAAO;CACT,IAAI,SAA8B;CAClC,MAAM,aAAa;AACjB,MAAI,MAAM,SAAU,OAAM,IAAIC,cAAAA,uBAAuB;AACrD,MAAI,QAAQC,cAAAA,SAAS,QAAQ,CAAC,gBAAiB,OAAM,IAAIC,cAAAA,yBAAyB;;CAEpF,MAAM,YAAY,WAAwD;AACxE,QAAM;AACN,iBAAA,sBAAsB,SAAS,OAAO;;CAExC,MAAM,UAAU,cAAiC;EAC/C,UAAU,MAAM,YAAY,QAAQ,IAAI,KAAK,IAAI,GAAG,MAAM,SAAS,YAAY,IAAI;EACnF,gBAAgB;EAChB,QAAQ,SAAS,cACf,OAAO;GAAE,MAAM;GAAS,QAAQ;GAAW,EAAE,QAAO,YAAW;AAC7D,QAAK,MAAM,UAAU,QAAS,OAAa,SAAS,QAAQ,UAAU;IACtE;EACJ,YAAY;EACZ,SAAQ,QAAO;AACb,UAAO;AACP,OAAI;AACF,WAAO,KAAK;aACJ;AACR,WAAO;;;EAGZ,CAAC;CACF,MAAM,WACJ,SACA,QACA,kBACyE;EACzE,MAAM,SAA4B;GAChC,UAAU,EAAE;GACZ;GACA;GACA,QAAQC,cAAAA,aAAa,MAAM,QAAQ,QAAQ;GAC5C;AACD,MAAI,WAAW,SAAU,SAAQ,YAAY;WACpC,kBAAkB,WAAW,WAAW,WAAW,UAAW,SAAQ,OAAO,QAAQ;WACrF,WAAW,UAAW,SAAQ,SAAS;MAC3C,SAAQ,UAAU;AACvB,SAAO;GACL,QAAQ;GACR;GACA,gBAAgBC,cAAAA,OAAO,cAAc,QAAQ,QAAQ,MAAM;GAC5D;;CAcH,SAAS,OACP,QACA,eACA,SAGmE;AACnE,WAAS,OAAO;AAChB,SAAO;AACP,MAAI;GACF,MAAM,UAAU,IAAI,gBAAgB,MAAM;GAC1C,IAAI;AACJ,OAAI;AACF,YAAQ,QAAQ;AAChB,cAAU,QAAQ,QAAQ;YACnB,OAAO;AACd,YAAQ,UAAU;AAClB,QAAI,iBAAiBC,cAAAA,iBACnB,QAAO;KAAE,QAAQ;KAAY,QAAQ,CAAC,MAAM,MAAM;KAAE;KAAU;AAChE,QAAI,OAAO,SAAS,YAAY,iBAAiBC,cAAAA,oBAC/C,QAAO;KAAE,QAAQ;KAAY,QAAQ,MAAM;KAAQ;KAAU;AAC/D,UAAM;;AAER,OAAI,CAAC,QAAQ,QAAQ,OAAQ,QAAO;IAAE,QAAQ;IAAa;IAAU;AAErE,UAAO,QAAQ,SAAS,OAAO,QAAQ,cAAc;YAC7C;AACR,UAAO;;;AAGX,WAAU;EACR,QAAQ,MAAM;EACd,SAAS;GACP,UAAS,OAAMC,cAAAA,eAAe,MAAM,QAAQ,IAAI,MAAM,SAAS;GAC/D,OAAM,OAAMC,cAAAA,KAAK,MAAM,UAAU,IAAI,MAAM,OAAO;GAClD,UAAA,cAAA;GACA,UAAA,cAAA;GACA,UAAA,cAAA;GACD;EACD,gBAAgB;EAChB,SACE,KACA,YAC4C;GAC5C,MAAM,SAAS,SAAS,UAAU;GAClC,IAAI;GACJ,MAAM,SAAS,OAAO;IAAE,MAAM;IAAU;IAAQ,EAAE,SAAS,WAAW,OAAM,YAAW;AAMrF,YAAQ,IAJMC,mBAAAA,aAAa;KACzB;KACA;KACD,CACgB,CAAC;AAClB,QACE,UAAU,SACT,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,OAAQ,MAA6B,SAAS,WAE9C,OAAM,IAAI,UAAU,wCAAwC;KAC9D;AACF,UAAO,OAAO,WAAW,aAAa,SAAS;IAAE,GAAG;IAAQ;IAAO;;EAErE,QAAQ,cAAc,YACpB,OACE;GAAE,MAAM;GAAS,QAAQ,SAAS,UAAU;GAAS,EACrD,SAAS,WAAW,OACpB,YAAW;AACT,OAAI,CAAC,WAAW,QAAQ,qBAAqB,SAC3C,eAAA,KAAK,EAAE,EAAE,qBAAqB,+CAA+C;AAC/E,SAAa,SAASC,eAAAA,cAAc,aAAa,EAAE,UAAU;IAEhE;EACH,UAAU,OAAO,YAAY;GAC3B,MAAM,SAAS,SAAS,UAAU;AAClC,UAAO,OAAO;IAAE,MAAM;IAAW;IAAQ,EAAE,WAAW,WAAU,YAC9D,QAAQ,QAAQ,EAAE,EAAE,MAAM,CAC3B;;EAEH,gBAAgB;AACd,OAAI,MAAM,SAAU,OAAM,IAAIV,cAAAA,uBAAuB;AACrD,UAAOD,mBAAAA,UAAU,MAAM,QAAQ,MAAM,SAAS;;EAEhD,aACE,MACA,aACG;AACH,OAAI,MAAM,SAAU,OAAM,IAAIC,cAAAA,uBAAuB;AACrD,OAAI,CAAC,SAAU,QAAOW,cAAAA,cAAc,cAAc,KAA0B;GAC5E,MAAM,QAAgC,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,KAAoB;AACxF,OAAI,CAAC,MAAM,OAAQ,OAAM,IAAI,UAAU,2CAA2C;AAClF,UAAOC,cAAAA,iBACL,cACA,MAAM,KAAI,MAAKC,cAAAA,YAAwB,MAAM,QAAQ,SAAS,EAAE,CAAC,EACjE,SACD;;EAEH,SAAS,QAAQ;EACjB,eAAe;AACb,OAAI,MAAM,SAAU;AACpB,SAAM;AACN,SAAM,WAAW;AACjB,OAAI;AACF,kBAAA,oBAAoB,aAAa;aACzB;AACR,YAAQ,SAAS;AACjB,mBAAA,qBAAqB,QAAQ;;;EAGlC;AACD,eAAA,kBAAkB,SAAS,MAAM;AACjC,gBAAA,kBAAkB,QAAQ;AAC1B,gBAAeC,cAAAA,mBAAmB,QAAQ;AAC1C,eAAA,qBAAqB,QAAQ,KAAK,QAAQ;AAC1C,QAAO;;;;AC1NT,MAAa,cACX,YAC8B;CAC9B,MAAM,WAAsC;EAC1C,SAAS,QAAQ;EACjB,UAAU,QAAQ;EAClB,WAAW,QAAQ;EACpB;AACD,eAAA,kBAAkB,UAAUC,cAAAA,SAAS,QAAQ,CAAC;AAC9C,eAAA,kBAAkB,SAAS,SAAS;AACpC,QAAO,OAAO,OAAO,SAAS;;;;ACThC,MAAa,QACX,SACA,aACYC,cAAAA,SAAS,SAAS,SAAS"}
1
+ {"version":3,"file":"index.cjs","names":["checkKey","AddressIndex","contains","DocumentDisposedError","equalValue","copyValue","compiledShape","resolveLocated","resolveValue","memberKey","AddressIndex","contains","sealChanges","createAddressResolver","checkValue","fail","resolveContainer","resolveTreeContainer","resolveValue","copyValue","memberKey","checkKey","invalidValue","fail","checkValue","ParseError","copyValue","DocumentDisposedError","accessOf","DocumentReentrancyError","notify","MutationRejected","TransactionRejected","resolveAddress","read","createAccess","decodeChanges","subscribeRoot","subscribeTargets","createNotification","accessOf","readWith","accessOf","collectionAccess","createAccess","attachProjection","documentReadableOwner","snapshot","definitionOf","accessOf","readAddress"],"sources":["../core/src/schema.ts","../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/contract.ts","../core/src/projection/scheduler.ts","../core/src/projection/node.ts","../core/src/projection/collection.ts","../core/src/projection/source.ts","../core/src/projection/value.ts","../core/src/projection/runtime.ts","../core/src/projection/store.ts"],"sourcesContent":["import type { Validator } from './schema-value';\nimport { checkKey } from './schema-value';\nexport type DocumentAddress = readonly string[];\n\n/** Shared payloads are immutable through every alias, including builtin methods. */\nexport type ReadonlyValue<T> = T extends (...args: never[]) => unknown\n ? T\n : T extends ReadonlyMap<infer K, infer V>\n ? ReadonlyMap<ReadonlyValue<K>, ReadonlyValue<V>>\n : T extends ReadonlySet<infer V>\n ? ReadonlySet<ReadonlyValue<V>>\n : T extends Date\n ? Omit<Date, `set${string}`>\n : T extends object\n ? { readonly [K in keyof T]: ReadonlyValue<T[K]> }\n : T;\n\nexport type DocumentListConfig<TItem> = {\n readonly keyOf: (item: ReadonlyValue<TItem>) => string;\n};\nexport type DocumentTreeNode<TValue> = {\n readonly parentId?: string;\n readonly children: readonly string[];\n readonly value?: ReadonlyValue<TValue>;\n};\nexport type DocumentTreeValue<TValue> = {\n readonly rootId?: string;\n readonly nodes: Readonly<Record<string, DocumentTreeNode<TValue>>>;\n};\n\ntype BaseNode<K extends string> = {\n readonly kind: K;\n readonly optional?: boolean;\n};\nexport type FieldNode<T, Optional extends boolean = false> = BaseNode<'field'> & {\n readonly __value?: T;\n readonly validator?: Validator<T>;\n} & (Optional extends true ? { readonly optional: true } : { readonly optional?: false });\n/** A node with optional presence. The marker replaces, rather than intersects, a field marker. */\nexport type OptionalNode<TNode extends DocumentNode> =\n TNode extends FieldNode<infer TValue, boolean>\n ? FieldNode<TValue, true>\n : TNode & { readonly optional: true };\nexport interface ObjectShape {\n readonly [key: string]: DocumentNode;\n}\nexport type ObjectNode<TShape extends ObjectShape = ObjectShape> = BaseNode<'object'> & {\n readonly shape: TShape;\n};\nexport interface VariantShape {\n readonly [key: string]: ObjectNode<ObjectShape>;\n}\nexport type VariantNode<\n TTag extends string,\n TVariants extends VariantShape,\n> = BaseNode<'variant'> & {\n readonly tag: TTag;\n readonly variants: TVariants;\n};\nexport type TableNode<\n TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>,\n TKey extends string = string,\n> = BaseNode<'table'> & {\n readonly value: TValue;\n readonly key?: Validator<TKey>;\n};\nexport type MapNode<\n TValue extends ValueSchemaNode,\n TKey extends string = string,\n> = BaseNode<'map'> & {\n readonly value: TValue;\n readonly key?: Validator<TKey>;\n};\nexport type ListNode<TItem> = BaseNode<'list'> & {\n readonly value: FieldNode<TItem, boolean>;\n keyOf(item: ReadonlyValue<TItem>): string;\n};\nexport type TreeNode<TValue> = BaseNode<'tree'> & {\n readonly value: FieldNode<TValue, boolean>;\n};\n\nexport type DocumentNode =\n | FieldNode<unknown, false>\n | FieldNode<unknown, true>\n | ObjectNode<ObjectShape>\n | VariantNode<string, VariantShape>\n | TableNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | MapNode<ValueSchemaNode>\n | ListNode<unknown>\n | TreeNode<unknown>;\n\n// Flatten only schema-generated objects; user-supplied field values stay opaque.\ntype SchemaObject<T> = { [K in keyof T]: T[K] } & {};\n\n/** Infer a document or node value, including optional node presence. */\nexport type Infer<T extends DocumentNode> = T extends { readonly optional: true }\n ? NodeValue<T> | undefined\n : NodeValue<T>;\n\ntype NodeValue<N> =\n N extends FieldNode<infer T, infer O>\n ? O extends true\n ? ReadonlyValue<T> | undefined\n : ReadonlyValue<T>\n : N extends ObjectNode<infer S>\n ? ShapeValue<S>\n : N extends VariantNode<infer T, infer V>\n ? {\n [K in keyof V & string]: SchemaObject<{ readonly [P in T]: K } & NodeValue<V[K]>>;\n }[keyof V & string]\n : N extends TableNode<infer V, infer K>\n ? {\n readonly ids: readonly K[];\n readonly byId: Readonly<Record<K, NodeValue<V>>>;\n }\n : N extends MapNode<infer V, infer K>\n ? Readonly<Record<K, NodeValue<V>>>\n : N extends ListNode<infer I>\n ? readonly ReadonlyValue<I>[]\n : N extends TreeNode<infer T>\n ? DocumentTreeValue<T>\n : never;\n\ntype OptionalKeys<S extends ObjectShape> = {\n [K in keyof S]: S[K] extends { readonly optional: true } ? K : never;\n}[keyof S];\ntype RequiredKeys<S extends ObjectShape> = Exclude<keyof S, OptionalKeys<S>>;\ntype ShapeValue<S extends ObjectShape> = SchemaObject<\n { readonly [K in RequiredKeys<S>]: NodeValue<S[K]> } & {\n readonly [K in OptionalKeys<S>]?: NodeValue<S[K]>;\n }\n>;\n\nexport type EntitySchemaNode = ObjectNode<ObjectShape> | VariantNode<string, VariantShape>;\nexport type ValueSchemaNode = EntitySchemaNode | FieldNode<unknown, boolean>;\nexport type DocumentAnchor<K extends string = string> =\n { readonly at: 'start' | 'end' } | { readonly before: K } | { readonly after: K };\n\nexport type CollectionSelector<\n TId extends string = string,\n TNode extends ValueSchemaNode = ValueSchemaNode,\n> = {\n readonly kind: 'collection';\n readonly schema: ObjectNode;\n readonly address: DocumentAddress;\n readonly __id?: TId;\n /** Compile-time entry schema carried by schema selectors. */\n readonly __node?: TNode;\n};\nexport type ValueSelector<TResult = unknown> = {\n readonly kind: 'value';\n readonly schema: ObjectNode;\n readonly address: DocumentAddress;\n readonly __value?: TResult;\n};\nexport type ImpactTarget<T = unknown> =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | ValueSelector<T>\n | {\n readonly kind: 'collection';\n readonly at: DocumentAddress;\n readonly id?: string;\n }\n | CollectionSelector<string>;\ndeclare const pathValue: unique symbol;\ndeclare const collectionNode: unique symbol;\ndeclare const collectionKey: unique symbol;\ntype PathMarker<TValue> = { readonly [pathValue]: TValue };\nexport type PathValueOf<T> = T extends { readonly [pathValue]: infer TValue } ? TValue : never;\n\ntype SchemaPathFor<S extends ObjectShape = ObjectShape, TValue = unknown> = {\n readonly [K in keyof S]: PathValue<S[K]>;\n} & PathMarker<TValue>;\n\nexport type SchemaPath<S extends ObjectShape = ObjectShape> = SchemaPathFor<S, ShapeValue<S>>;\nexport type PathPick<S extends ObjectNode = ObjectNode> = (\n path: SchemaPath<S['shape']>\n) => PathMarker<unknown>;\n\ntype VariantKeys<V extends VariantShape> = {\n [K in keyof V & string]: keyof (V[K] extends ObjectNode<infer S> ? S : {});\n}[keyof V & string] &\n string;\ntype VariantFieldPath<V extends VariantShape, K extends string> = {\n [P in keyof V & string]: V[P] extends ObjectNode<infer S>\n ? K extends keyof S\n ? PathValue<S[K]>\n : never\n : never;\n}[keyof V & string];\ntype VariantPath<T extends string, V extends VariantShape, TValue> = {\n readonly [K in VariantKeys<V>]: VariantFieldPath<V, K>;\n} & { readonly [K in T]: PathMarker<keyof V & string> } & PathMarker<TValue>;\nexport type CollectionPath<\n N extends ValueSchemaNode = ValueSchemaNode,\n TValue = unknown,\n K extends string = string,\n> = PathMarker<TValue> & {\n item(id: K): PathValue<N>;\n readonly [collectionNode]: N;\n readonly [collectionKey]: K;\n};\n\ntype PathValue<N extends DocumentNode> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, Infer<N>>\n : N extends VariantNode<infer TTag, infer V>\n ? VariantPath<TTag, V, Infer<N>>\n : N extends TableNode<infer V, infer K>\n ? CollectionPath<V, Infer<N>, K>\n : N extends MapNode<infer V, infer K>\n ? CollectionPath<V, Infer<N>, K>\n : PathMarker<Infer<N>>;\ntype CollectionInfo<T> = T extends {\n readonly [collectionNode]: infer TNode extends ValueSchemaNode;\n readonly [collectionKey]: infer K extends string;\n}\n ? { readonly id: K; readonly node: TNode }\n : never;\nexport type CollectionId<T> =\n CollectionInfo<T> extends { readonly id: infer TId extends string } ? TId : string;\nexport type CollectionNode<T> =\n CollectionInfo<T> extends { readonly node: infer TNode extends ValueSchemaNode }\n ? TNode\n : ValueSchemaNode;\n\nconst node = <T extends DocumentNode>(value: T): T => Object.freeze(value);\nexport const field = <T>(validator?: Validator<T>): FieldNode<T> =>\n node({ kind: 'field', ...(validator ? { validator } : {}) });\ntype OptionalLeaf =\n | FieldNode<unknown, boolean>\n | VariantNode<string, VariantShape>\n | MapNode<ValueSchemaNode>\n | ListNode<unknown>\n | TreeNode<unknown>;\nexport const optional = <T extends OptionalLeaf>(value: T): OptionalNode<T> => {\n if (!['field', 'variant', 'map', 'list', 'tree'].includes(value.kind))\n throw new TypeError('Only field, variant, map, list and tree nodes support optional presence.');\n return node({ ...value, optional: true } as OptionalNode<T>);\n};\nexport const object = <S extends ObjectShape>(shape: S): ObjectNode<S> =>\n node({ kind: 'object', shape: Object.freeze({ ...shape }) });\nexport const variant = <T extends string, V extends VariantShape>(\n tag: T,\n variants: V\n): VariantNode<T, V> => node({ kind: 'variant', tag, variants: Object.freeze({ ...variants }) });\nexport const table = <V extends EntitySchemaNode, K extends string = string>(\n value: V,\n options?: { readonly key: Validator<K> }\n): TableNode<V, K> => node({ kind: 'table', value, ...options });\nexport const map = <V extends ValueSchemaNode, K extends string = string>(\n value: V,\n options?: { readonly key: Validator<K> }\n): MapNode<V, K> => node({ kind: 'map', value, ...options });\nexport const list = <TItem>(\n value: FieldNode<TItem, boolean>,\n config: DocumentListConfig<TItem>\n): ListNode<TItem> => node({ kind: 'list', keyOf: config.keyOf, value });\nexport const tree = <TValue>(value: FieldNode<TValue, boolean>): TreeNode<TValue> =>\n node({ kind: 'tree', value });\n\nconst paths = new WeakMap<\n object,\n {\n readonly address: DocumentAddress;\n readonly nodes: readonly DocumentNode[];\n readonly owner: object;\n }\n>();\n\nconst pathProxy = (\n nodes: readonly DocumentNode[],\n address: DocumentAddress,\n owner: object\n): object => {\n const proxy = new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property !== 'string') return undefined;\n const collection = nodes.every(node => node.kind === 'table' || node.kind === 'map');\n if (collection && property === 'item')\n return (id: string) => {\n if (typeof id !== 'string') throw new TypeError('Collection keys must be strings.');\n for (const node of nodes)\n if (node.kind === 'table' || node.kind === 'map') {\n const invalid = checkKey(node.key, id, [...address, id]);\n if (invalid) throw new TypeError(invalid.message);\n }\n return pathProxy(\n nodes.map(node => (node as TableNode<EntitySchemaNode>).value),\n [...address, id],\n owner\n );\n };\n const children = nodes.flatMap(node => {\n if (node.kind === 'object')\n return Object.hasOwn(node.shape, property) ? [node.shape[property]] : [];\n if (node.kind !== 'variant') return [];\n if (property === node.tag) return [field<string>()];\n return Object.values(node.variants).flatMap(branch =>\n Object.hasOwn(branch.shape, property) ? [branch.shape[property]] : []\n );\n });\n if (!children.length) throw new TypeError(`Invalid schema path segment: ${property}`);\n return pathProxy(children, [...address, property], owner);\n },\n }\n );\n paths.set(proxy, { nodes, address, owner });\n return proxy;\n};\n\nexport const compilePath = <S extends ObjectShape>(\n owner: ObjectNode<S>,\n kind: 'collection' | 'value',\n pick: (path: SchemaPath<S>) => unknown\n): CollectionSelector | ValueSelector => {\n const scope = {};\n const value = pick(pathProxy([owner], [], scope) as SchemaPath<S>);\n const selected = typeof value === 'object' && value !== null ? paths.get(value) : undefined;\n if (!selected || selected.owner !== scope)\n throw new TypeError('Selector must return a path from its callback.');\n if (\n kind === 'collection' &&\n !selected.nodes.every(node => node.kind === 'table' || node.kind === 'map')\n )\n throw new TypeError('Collection selectors require a table or map path.');\n const result = Object.freeze({\n kind,\n schema: owner,\n address: Object.freeze([...selected.address]),\n }) as CollectionSelector | ValueSelector;\n return result;\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, 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') return (value as unknown[]).map(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.keys(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 type { CollectionAccess, Read } from '../access/scope';\nimport type { CollectionImpact } from '../impact';\nimport type {\n DocumentCommit,\n DocumentReadable,\n Synchronous,\n Unsubscribe,\n} from '../runtime/contract';\nimport type {\n CollectionNode as SchemaCollectionNode,\n CollectionId,\n CollectionPath,\n ObjectNode,\n ValueSchemaNode,\n PathPick,\n SchemaPath,\n} from '../schema';\nimport type { Readable } from './readable';\n\ndeclare const sourceContext: unique symbol;\nexport type GraphSource<T> = { readonly [sourceContext]: T };\nexport type GraphSources = Readonly<Record<string, GraphSource<unknown>>>;\nexport type InputHandles<S extends GraphSources> = {\n readonly [K in keyof S]: S[K] extends GraphSource<infer T> ? T : never;\n};\n/** Opaque application metadata identifying the action that produced a source event. */\nexport type Cause = unknown;\nexport type BatchContext = {\n readonly id: number;\n readonly cause?: Cause;\n};\nexport type BatchOptions = {\n readonly cause?: Cause;\n};\nexport type CollectionEntryTransition<K extends string, V> = {\n readonly key: K;\n readonly kind: 'added' | 'updated' | 'removed';\n readonly before: V | undefined;\n readonly after: V | undefined;\n};\nexport type DocumentContext<S extends ObjectNode> = {\n readonly read: Read<S>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n readonly cause?: Cause;\n readonly batch?: BatchContext;\n};\nexport type DocumentCollectionContext<\n S extends ObjectNode,\n N extends ValueSchemaNode,\n K extends string = string,\n> = {\n readonly read: CollectionAccess<K, N>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly K[]; readonly orderDirty: boolean };\n readonly cause?: Cause;\n readonly batch?: BatchContext;\n};\nexport type DocumentHandle<S extends ObjectNode> = GraphSource<DocumentContext<S>> & {\n collection<P extends CollectionPath>(\n pick: (path: SchemaPath<S['shape']>) => P\n ): DocumentCollectionSource<S, SchemaCollectionNode<P>, CollectionId<P>>;\n targets(...targets: readonly [PathPick<S>, ...PathPick<S>[]]): GraphSource<DocumentContext<S>>;\n};\nexport type DocumentCollectionSource<\n S extends ObjectNode,\n N extends ValueSchemaNode,\n K extends string = string,\n> = GraphSource<DocumentCollectionContext<S, N, K>>;\nexport type ValueContext<T, D = unknown> = {\n readonly value: T;\n readonly previous: T;\n readonly changed: boolean;\n readonly revision: number;\n readonly reset: boolean;\n readonly detail?: D;\n readonly cause?: Cause;\n readonly batch?: BatchContext;\n};\nexport type InputHandle<T> = {\n readonly source: GraphSource<ValueContext<T>>;\n set(value: T): void;\n};\nexport type NodeUpdate<T> =\n | { readonly kind: 'unchanged' }\n | { readonly kind: 'changed'; readonly value: T }\n | { readonly kind: 'rebuild' };\nexport type ValueNodeSpec<S extends GraphSources, T> = {\n readonly name?: string;\n readonly sources: S;\n readonly build: (sources: InputHandles<S>) => {\n readonly value: T;\n readonly update: (sources: InputHandles<S>) => NodeUpdate<NoInfer<T>>;\n };\n};\nexport type ValueNode<T> = Readable<T> &\n GraphSource<ValueContext<T>> & { rebuild(): void; dispose(): void };\nexport type CollectionRead<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n ids(): readonly K[];\n};\nexport type ExternalCollectionRead<K extends string, V> = {\n readonly get: (key: K) => V | undefined;\n readonly has: (key: K) => boolean;\n readonly ids: () => readonly K[];\n};\nexport type CollectionContext<K extends string, V, D = unknown> = CollectionRead<K, V> & {\n readonly previous: CollectionRead<K, V>;\n readonly change: CollectionImpact<K> | undefined;\n readonly revision: number;\n readonly reset: boolean;\n readonly transitions: (keys?: Iterable<K>) => readonly CollectionEntryTransition<K, V>[];\n readonly detail?: D;\n readonly cause?: Cause;\n readonly batch?: BatchContext;\n};\nexport type CollectionHandle<K extends string, V> = {\n current(): CollectionRead<K, V>;\n readonly ids: Readable<readonly K[]>;\n readonly all: Readable<readonly V[]>;\n item(key: K): Readable<V | undefined>;\n revision(): number;\n subscribe(listener: (change: CollectionImpact<K>) => void): Unsubscribe;\n};\nexport type CollectionNode<K extends string, V> = GraphSource<CollectionContext<K, V>> &\n CollectionHandle<K, V> & {\n rebuild(): void;\n dispose(): void;\n };\nexport type ExternalValueSource<T, D = unknown> = {\n readonly kind: 'value';\n current(): T;\n revision(): number;\n subscribe(listener: (event: ExternalValueEvent<T, D>) => void): Unsubscribe;\n};\nexport type ExternalCollectionSource<K extends string, V, D = unknown> = {\n readonly kind: 'collection';\n current(): ExternalCollectionRead<K, V>;\n revision(): number;\n subscribe(listener: (event: ExternalCollectionEvent<K, V, D>) => void): Unsubscribe;\n};\nexport type ExternalValueEvent<T, D = unknown> = {\n readonly value: T;\n readonly revision: number;\n readonly reset?: boolean;\n readonly detail?: D;\n readonly cause?: Cause;\n readonly batch?: { readonly id: number; readonly cause?: Cause };\n};\nexport type ExternalCollectionEvent<K extends string, V, D = unknown> = {\n readonly previous: ExternalCollectionRead<K, V>;\n readonly revision: number;\n readonly reset?: boolean;\n readonly change?: CollectionImpact<K>;\n readonly detail?: D;\n readonly cause?: Cause;\n readonly batch?: { readonly id: number; readonly cause?: Cause };\n};\nexport type CollectionDraft<K extends string, V> = {\n set(key: K, value: V): void;\n remove(key: K): void;\n order(ids: readonly K[]): void;\n replace(entries: readonly (readonly [K, V])[]): void;\n};\nexport type CollectionProcess<S extends GraphSources, K extends string, V> = {\n readonly sources: InputHandles<S>;\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly writer: CollectionDraft<K, V>;\n};\nexport type CollectionNodeSpec<S extends GraphSources, K extends string, V> = {\n readonly name?: string;\n readonly sources: S;\n readonly isEqual?: (previous: V, next: V) => boolean;\n readonly build: (input: CollectionProcess<S, K, V>) => {\n readonly update: (input: CollectionProcess<S, K, V>) => void | { readonly kind: 'rebuild' };\n };\n};\nexport class ProjectionError extends Error {\n constructor(\n readonly phase: 'processor' | 'listener' | 'source' | 'blocked',\n readonly identity: string,\n readonly revisions: readonly number[],\n cause: unknown\n ) {\n super(`Projection ${phase} failed: ${identity}`, { cause });\n this.name = 'ProjectionError';\n }\n}\nexport class ProjectionDisposedError extends Error {\n constructor() {\n super('Projection has been disposed.');\n this.name = 'ProjectionDisposedError';\n }\n}\nexport type RuntimeExecutor = {\n document<S extends ObjectNode>(runtime: DocumentReadable<S>): DocumentHandle<S>;\n fromSource<T, D = unknown>(\n source: ExternalValueSource<T, D>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): GraphSource<ValueContext<T, D>>;\n fromCollectionSource<K extends string, V, D = unknown>(\n source: ExternalCollectionSource<K, V, D>\n ): GraphSource<CollectionContext<K, V, D>>;\n fromReadable<T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): GraphSource<ValueContext<T>>;\n input<T>(initial: T, options?: { readonly isEqual?: (a: T, b: T) => boolean }): InputHandle<T>;\n value<S extends GraphSources, T>(\n sources: S,\n compute: (sources: InputHandles<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ValueNode<T>;\n value<S extends GraphSources, T>(\n spec: ValueNodeSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ValueNode<T>;\n collection<V, K extends string = string>(): <S extends GraphSources>(\n spec: CollectionNodeSpec<S, K, V>\n ) => CollectionNode<K, V>;\n map<S extends ObjectNode, N extends ValueSchemaNode, K extends string, V>(\n source: DocumentCollectionSource<S, N, K>,\n mapper: (id: K, entry: Read<N>) => Synchronous<V>,\n options?: { readonly isEqual?: (a: V, b: V) => boolean }\n ): CollectionNode<K, V>;\n map<K extends string, V, R>(\n source: CollectionNode<K, V>,\n mapper: (id: K, entry: V) => Synchronous<R>,\n options?: { readonly isEqual?: (a: NoInfer<R>, b: NoInfer<R>) => boolean }\n ): CollectionNode<K, R>;\n batch<T>(run: () => Synchronous<T>): T;\n batch<T>(options: BatchOptions, run: () => Synchronous<T>): T;\n dispose(): void;\n};\n","import type { ObserverError } from '../runtime/contract';\nimport {\n ProjectionDisposedError,\n ProjectionError,\n type BatchContext,\n type BatchOptions,\n} from './contract';\nimport { profile } from '../profile';\n\nexport type SourceRecord = {\n readonly consumers: Set<NodeRecord>;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n fault: ProjectionError | undefined;\n disposed: boolean;\n clear(): void;\n};\nexport type NodeRecord = SourceRecord & {\n readonly order: number;\n readonly name: string;\n readonly sources: readonly SourceRecord[];\n forced: boolean;\n statusChanged: boolean;\n evaluate(build: boolean): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n release(): void;\n};\n\n// Sources and nodes share one registry. Public structural lookalikes are never accepted.\nexport const projectionHandles = new WeakSet<object>();\nexport const createScheduler = (onError: (error: ProjectionError) => void) => {\n let disposed = false;\n let depth = 0;\n let batchSequence = 0;\n let activeBatch: BatchContext | undefined;\n let phase: 'idle' | 'compute' | 'notify' = 'idle';\n let sequence = 0;\n const records = new Map<object, SourceRecord>();\n const nodes = new Set<NodeRecord>();\n const pending = new Set<SourceRecord>();\n const heap: NodeRecord[] = [];\n const queued = new Set<NodeRecord>();\n const completed: NodeRecord[] = [];\n const emissions = new Set<NodeRecord>();\n const errors: ProjectionError[] = [];\n let reportingFailures: unknown[] = [];\n const guards = new Set<(locked: boolean) => void>();\n const cleanups = new Set<() => void>();\n const assertActive = () => {\n if (disposed) throw new ProjectionDisposedError();\n };\n const assertIdle = () => {\n assertActive();\n if (phase !== 'idle')\n throw new Error('Projection cannot be re-entered during processing or notification.');\n };\n const lock = (value: boolean) => guards.forEach(guard => guard(value));\n const enqueue = (node: NodeRecord) => {\n if (node.disposed || queued.has(node)) return;\n queued.add(node);\n profile.projection('scheduledNodes');\n let i = heap.length;\n heap.push(node);\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (heap[p].order < node.order) break;\n heap[i] = heap[p];\n i = p;\n }\n heap[i] = node;\n };\n const pop = () => {\n const first = heap[0];\n const last = heap.pop()!;\n if (heap.length) {\n let i = 0;\n while (i * 2 + 1 < heap.length) {\n let c = i * 2 + 1;\n if (c + 1 < heap.length && heap[c + 1].order < heap[c].order) c++;\n if (last.order < heap[c].order) break;\n heap[i] = heap[c];\n i = c;\n }\n heap[i] = last;\n }\n return first;\n };\n const errorFor = (\n node: NodeRecord,\n cause: unknown,\n kind: ProjectionError['phase'] = 'processor'\n ) =>\n new ProjectionError(\n kind,\n node.name,\n node.sources.map(source => source.revision()),\n cause\n );\n const capture = (source: SourceRecord) => {\n if (disposed) return;\n if (phase !== 'idle') {\n source.fault = new ProjectionError(\n 'source',\n 'reentrant source',\n [source.revision()],\n new Error('Source changed while projection was running.')\n );\n errors.push(source.fault);\n throw source.fault;\n }\n pending.add(source);\n profile.projection('sourceEvents');\n if (source.fault) errors.push(source.fault);\n };\n const settle = () => {\n if (disposed || depth || phase !== 'idle') return;\n phase = 'compute';\n lock(true);\n try {\n pending.forEach(source => source.consumers.forEach(enqueue));\n while (heap.length) {\n const node = pop();\n if (node.disposed) continue;\n const wasFaulted = node.fault !== undefined;\n profile.projection('processedNodes');\n let changed = false;\n const blocked = node.sources.find(source => source.fault || source.disposed);\n if (blocked) {\n node.fault = errorFor(node, blocked.fault ?? new ProjectionDisposedError(), 'blocked');\n } else {\n const build = node.forced || wasFaulted || node.sources.some(source => source.reset());\n try {\n changed = node.evaluate(build);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n const error = errorFor(node, cause);\n errors.push(error);\n node.fault = error;\n if (!build) {\n try {\n changed = node.evaluate(true);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n node.fault = errorFor(node, cause);\n errors.push(node.fault);\n }\n }\n }\n }\n node.forced = false;\n node.statusChanged = wasFaulted !== (node.fault !== undefined);\n completed.push(node);\n if (changed || wasFaulted || node.fault) {\n profile.projection('publishedNodes');\n emissions.add(node);\n node.consumers.forEach(enqueue);\n }\n }\n completed.forEach(node => node.publish());\n } finally {\n lock(false);\n phase = 'idle';\n }\n };\n const flush = (): readonly ObserverError[] => {\n if (disposed || depth) return [];\n if (pending.size || completed.length) profile.projection('flushes');\n phase = 'notify';\n lock(true);\n const reportFailures: unknown[] = [];\n try {\n emissions.forEach(node =>\n node.emit(listener => {\n try {\n listener();\n } catch (cause) {\n errors.push(errorFor(node, cause, 'listener'));\n }\n })\n );\n for (const error of errors.slice()) {\n try {\n onError(error);\n } catch (cause) {\n reportFailures.push(cause);\n }\n }\n return Object.freeze([\n ...errors.map(error =>\n Object.freeze({\n phase: error.phase === 'listener' ? ('listener' as const) : ('processor' as const),\n error,\n })\n ),\n ...reportFailures.map(error => Object.freeze({ phase: 'listener' as const, error })),\n ]);\n } finally {\n pending.forEach(source => source.clear());\n completed.forEach(node => node.clear());\n pending.clear();\n queued.clear();\n completed.length = 0;\n emissions.clear();\n errors.length = 0;\n reportingFailures = reportFailures;\n lock(false);\n phase = 'idle';\n }\n };\n const run = () => {\n settle();\n const result = flush();\n const failures = reportingFailures;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection error reporter failed.');\n return result;\n };\n const batch = <T>(optionsOrCallback: BatchOptions | (() => T), maybeCallback?: () => T): T => {\n assertIdle();\n const options = typeof optionsOrCallback === 'function' ? undefined : optionsOrCallback;\n const callback = typeof optionsOrCallback === 'function' ? optionsOrCallback : maybeCallback;\n if (!callback) throw new TypeError('Projection batch requires a callback.');\n const outer = depth === 0;\n if (outer)\n activeBatch = Object.freeze({\n id: ++batchSequence,\n ...(options?.cause === undefined ? {} : { cause: options.cause }),\n });\n depth++;\n let failed = false;\n try {\n const value = callback();\n assertSynchronous(value);\n return value;\n } catch (error) {\n failed = true;\n throw error;\n } finally {\n depth--;\n if (!depth) {\n try {\n if (failed) {\n try {\n run();\n } catch {\n /* The original application error retains priority. */\n }\n } else run();\n } finally {\n activeBatch = undefined;\n }\n }\n }\n };\n return {\n assertActive,\n assertIdle,\n capture,\n settle,\n flush,\n run,\n records,\n guards,\n cleanups,\n get active() {\n return !disposed;\n },\n register(handle: object, record: SourceRecord) {\n assertIdle();\n records.set(handle, record);\n projectionHandles.add(handle);\n },\n unregisterSource(handle: object) {\n const record = records.get(handle);\n if (record) {\n record.disposed = true;\n pending.delete(record);\n record.clear();\n records.delete(handle);\n }\n },\n source(handle: object) {\n assertActive();\n const source = records.get(handle);\n if (!source || source.disposed)\n throw new Error('Unknown, disposed, or foreign projection source.');\n return source;\n },\n addNode(node: NodeRecord) {\n nodes.add(node);\n node.sources.forEach(source => source.consumers.add(node));\n },\n order: () => sequence++,\n initialize<T>(run: () => T): T {\n assertIdle();\n phase = 'compute';\n lock(true);\n try {\n return run();\n } finally {\n lock(false);\n phase = 'idle';\n }\n },\n rebuild(node: NodeRecord) {\n assertIdle();\n if (node.disposed) throw new ProjectionDisposedError();\n node.forced = true;\n enqueue(node);\n run();\n },\n disposeNode(node: NodeRecord) {\n if (node.disposed) return;\n assertIdle();\n if (node.consumers.size)\n throw new Error('Cannot dispose a projection node with downstream consumers.');\n node.disposed = true;\n node.sources.forEach(source => source.consumers.delete(node));\n nodes.delete(node);\n node.release();\n for (const [handle, record] of records) if (record === node) records.delete(handle);\n },\n batch,\n batchContext: () => activeBatch,\n dispose() {\n if (disposed) return;\n assertIdle();\n disposed = true;\n const failures: unknown[] = [];\n cleanups.forEach(cleanup => {\n try {\n cleanup();\n } catch (error) {\n failures.push(error);\n }\n });\n cleanups.clear();\n nodes.forEach(node => {\n node.disposed = true;\n node.release();\n node.consumers.clear();\n });\n records.forEach(source => {\n source.disposed = true;\n source.consumers.clear();\n source.clear();\n });\n nodes.clear();\n records.clear();\n pending.clear();\n heap.length = 0;\n completed.length = 0;\n queued.clear();\n emissions.clear();\n guards.clear();\n errors.length = 0;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection cleanup failed.');\n },\n debug: () => ({\n nodes: nodes.size,\n sources: records.size - nodes.size,\n subscriptions: cleanups.size,\n pending: pending.size + heap.length,\n }),\n };\n};\nexport type Scheduler = ReturnType<typeof createScheduler>;\nexport const assertSynchronous = (value: unknown): void => {\n if (\n value != null &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'then' in value &&\n typeof value.then === 'function'\n )\n throw new TypeError('Projection callbacks must be synchronous.');\n};\nexport const assertScope = (active: () => boolean) => {\n if (!active()) throw new Error('Projection reader or writer is no longer active.');\n};\n","import type { InputHandles, GraphSources } from './contract';\nimport { ProjectionDisposedError } from './contract';\nimport type { NodeRecord, Scheduler } from './scheduler';\n\nexport const createNode = <S extends GraphSources>(\n scheduler: Scheduler,\n spec: { name?: string; sources: S },\n behavior: {\n evaluate(sources: InputHandles<S>, build: boolean, active: () => boolean): boolean;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n }\n) => {\n scheduler.assertIdle();\n const entries = Object.entries(spec.sources).map(\n ([key, handle]) => [key, scheduler.source(handle)] as const\n );\n const order = scheduler.order();\n const node: NodeRecord = {\n ...behavior,\n publish: () => {\n if (node.fault) behavior.clear();\n else behavior.publish();\n },\n order,\n name: spec.name ? `${spec.name} (${order})` : `projection-${order}`,\n sources: entries.map(([, source]) => source),\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n forced: false,\n statusChanged: false,\n evaluate: build => {\n let active = true;\n try {\n const scopeActive = () => active;\n // Heterogeneous source contexts are typed at the registered capability boundary.\n const inputs = Object.fromEntries(\n entries.map(([key, source]) => [key, source.context(scopeActive)])\n ) as InputHandles<S>;\n return behavior.evaluate(inputs, build, scopeActive);\n } finally {\n active = false;\n }\n },\n };\n scheduler.initialize(() => {\n const invalid = node.sources.find(source => source.fault || source.disposed);\n if (invalid) throw invalid.fault ?? new ProjectionDisposedError();\n node.evaluate(true);\n node.publish();\n node.clear();\n });\n const check = () => {\n if (node.disposed || !scheduler.active) throw new ProjectionDisposedError();\n if (node.fault) throw node.fault;\n };\n return {\n node,\n check,\n install(handle: object) {\n scheduler.register(handle, node);\n scheduler.addNode(node);\n },\n rebuild: () => scheduler.rebuild(node),\n dispose: () => scheduler.disposeNode(node),\n };\n};\n","import type { CollectionImpact } from '../impact';\nimport { profile } from '../profile';\nimport type {\n CollectionEntryTransition,\n CollectionContext,\n CollectionRead,\n CollectionNodeSpec,\n CollectionDraft,\n CollectionNode,\n GraphSources,\n} from './contract';\nimport type { Readable } from './readable';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, projectionHandles, type Scheduler } from './scheduler';\n\nexport const collectionHandles = new WeakSet<object>();\n\nconst readonlySet = <T>(values: Iterable<T>): ReadonlySet<T> => {\n const set = new Set(values);\n const view: ReadonlySet<T> = Object.freeze({\n get size() {\n return set.size;\n },\n has: (value: T) => set.has(value),\n entries: () => set.entries(),\n keys: () => set.keys(),\n values: () => set.values(),\n [Symbol.iterator]: () => set.values(),\n forEach: (callback: (value: T, key: T, set: ReadonlySet<T>) => void, thisArg?: unknown) =>\n set.forEach(value => callback.call(thisArg, value, value, view)),\n });\n return view;\n};\ntype Entry<V> = { present: true; value: V } | { present: false };\nexport const createCollection = <S extends GraphSources, K extends string, V>(\n scheduler: Scheduler,\n spec: CollectionNodeSpec<S, K, V>\n): CollectionNode<K, V> => {\n const values = new Map<K, V>();\n let ids: readonly K[] = Object.freeze([]);\n let staged = new Map<K, Entry<V>>();\n let nextIds = ids;\n let change: CollectionImpact<K> | undefined;\n let instance: ReturnType<typeof spec.build> | undefined;\n let initialized = false;\n let reset = false;\n let revision = 0;\n let idsRevision = 0;\n let batch: import('./contract').BatchContext | undefined;\n let cause: import('./contract').Cause | undefined;\n let publishedTransitions: readonly CollectionEntryTransition<K, V>[] = Object.freeze([]);\n let all: readonly V[] | undefined;\n type Item = { readable: Readable<V | undefined>; revision: number; listeners?: Set<() => void> };\n const items = new Map<K, Item>();\n const subscribedItems = new Set<Item>();\n const idsListeners = new Set<() => void>();\n const allListeners = new Set<() => void>();\n const listeners = new Set<(change: CollectionImpact<K>) => void>();\n const changedKeys = new Set<K>();\n let orderChanged = false;\n const current: CollectionRead<K, V> = Object.freeze({\n get: (key: K) => {\n owner.check();\n return values.get(key);\n },\n has: (key: K) => {\n owner.check();\n return values.has(key);\n },\n ids: () => {\n owner.check();\n return ids;\n },\n });\n const hasNext = (key: K) => (staged.has(key) ? staged.get(key)!.present : values.has(key));\n const getNext = (key: K) => {\n const entry = staged.get(key);\n return entry ? (entry.present ? entry.value : undefined) : values.get(key);\n };\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build, active) => {\n const metadata = Object.values(sources as Record<string, unknown>).find(\n value =>\n value &&\n typeof value === 'object' &&\n (('batch' in value && (value as { readonly batch?: unknown }).batch !== undefined) ||\n ('cause' in value && (value as { readonly cause?: unknown }).cause !== undefined))\n ) as\n | {\n readonly batch?: import('./contract').BatchContext;\n readonly cause?: import('./contract').Cause;\n }\n | undefined;\n batch = scheduler.batchContext() ?? metadata?.batch;\n cause = metadata?.cause ?? batch?.cause;\n staged = new Map();\n nextIds = ids;\n change = undefined;\n changedKeys.clear();\n let explicitOrder: readonly K[] | undefined;\n let cleared = false;\n const nextHas = (key: K) =>\n staged.has(key) ? staged.get(key)!.present : !cleared && values.has(key);\n const nextGet = (key: K) => {\n const entry = staged.get(key);\n return entry\n ? entry.present\n ? entry.value\n : undefined\n : cleared\n ? undefined\n : values.get(key);\n };\n const deriveIds = () => {\n const result = cleared ? [] : ids.filter(nextHas);\n for (const [key, entry] of staged)\n if (entry.present && (cleared || !values.has(key))) result.push(key);\n return result;\n };\n const read = (next: boolean): CollectionRead<K, V> => ({\n get: key => {\n assertScope(active);\n return next ? nextGet(key) : values.get(key);\n },\n has: key => {\n assertScope(active);\n return next ? nextHas(key) : values.has(key);\n },\n ids: () => {\n assertScope(active);\n return next ? Object.freeze(explicitOrder ? explicitOrder.slice() : deriveIds()) : ids;\n },\n });\n const writer: 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 = order.slice();\n },\n replace: entries => {\n assertScope(active);\n staged.clear();\n cleared = true;\n const order: K[] = [];\n for (const [key, value] of entries) {\n if (staged.has(key)) throw new TypeError('Duplicate projection key.');\n writer.set(key, value);\n order.push(key);\n }\n explicitOrder = order;\n },\n };\n const input = { sources, previous: read(false), next: read(true), writer };\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n cleared = true;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n } else {\n profile.materialized.updated();\n const result = instance.update(input);\n assertSynchronous(result);\n if (result?.kind === 'rebuild') {\n staged.clear();\n cleared = true;\n explicitOrder = undefined;\n instance = undefined;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n build = true;\n }\n }\n if (cleared)\n for (const key of values.keys()) if (!staged.has(key)) staged.set(key, { present: false });\n const added = new Set<K>();\n const removed = new Set<K>();\n const updated = new Set<K>();\n profile.projection('touchedKeys', staged.size);\n for (const [key, entry] of staged) {\n const existed = values.has(key);\n if (entry.present) {\n if (!existed) added.add(key);\n else if (!(spec.isEqual ?? Object.is)(values.get(key) as V, entry.value))\n updated.add(key);\n else staged.delete(key);\n } else if (existed) removed.add(key);\n else staged.delete(key);\n }\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 !== values.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, i) => key === order[i])\n ? ids\n : Object.freeze(order.slice());\n }\n orderChanged = nextIds !== ids;\n if (added.size || removed.size || updated.size || orderChanged) {\n let commonOrderChanged = false;\n if (orderChanged) {\n const before = ids.filter(key => !removed.has(key));\n const after = nextIds.filter(key => !added.has(key));\n commonOrderChanged = before.some((key, i) => after[i] !== key);\n }\n change = Object.freeze({\n kind: 'incremental',\n added: readonlySet(added),\n removed: readonlySet(removed),\n updated: readonlySet(updated),\n orderChanged: commonOrderChanged,\n });\n [...added, ...removed, ...updated].forEach(key => changedKeys.add(key));\n profile.projection('changedKeys', changedKeys.size);\n }\n publishedTransitions = Object.freeze(\n [...changedKeys].flatMap(key => {\n const beforePresent = values.has(key);\n const afterPresent = hasNext(key);\n if (beforePresent === afterPresent) {\n if (!beforePresent) return [];\n if ((spec.isEqual ?? Object.is)(values.get(key) as V, getNext(key) as V)) return [];\n }\n return [\n {\n key,\n kind: !beforePresent ? 'added' : !afterPresent ? 'removed' : 'updated',\n before: beforePresent ? values.get(key) : undefined,\n after: afterPresent ? getNext(key) : undefined,\n } satisfies CollectionEntryTransition<K, V>,\n ];\n })\n );\n reset = build;\n return change !== undefined;\n },\n context: active => {\n const transitions = (keys?: Iterable<K>): readonly CollectionEntryTransition<K, V>[] => {\n assertScope(active);\n const selected = keys ? new Set(keys) : undefined;\n return Object.freeze(\n publishedTransitions.filter(transition => !selected || selected.has(transition.key))\n );\n };\n const previous: CollectionRead<K, V> = Object.freeze({\n get: key => {\n assertScope(active);\n return values.get(key);\n },\n has: key => {\n assertScope(active);\n return values.has(key);\n },\n ids: () => {\n assertScope(active);\n return ids;\n },\n });\n const input: CollectionContext<K, V> = {\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 previous,\n change,\n revision: revision + (change ? 1 : 0),\n reset,\n transitions,\n batch,\n cause,\n };\n return Object.freeze(input);\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n for (const [key, entry] of staged) {\n if (entry.present) values.set(key, entry.value);\n else values.delete(key);\n }\n if (change) {\n if (initialized) revision++;\n if (orderChanged && initialized) idsRevision++;\n all = undefined;\n changedKeys.forEach(key => {\n const item = items.get(key);\n if (item && initialized) item.revision++;\n });\n }\n ids = nextIds;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n const fault = owner.node.fault !== undefined;\n const resetEvent = Object.freeze({ kind: 'reset' as const });\n Array.from(listeners).forEach(listener => call(() => listener(change ?? resetEvent)));\n if (orderChanged || !change || fault || owner.node.statusChanged)\n Array.from(idsListeners).forEach(listener => call(listener));\n Array.from(allListeners).forEach(listener => call(listener));\n if (!change || fault || owner.node.statusChanged) {\n for (const item of subscribedItems)\n Array.from(item.listeners ?? []).forEach(listener => call(listener));\n } else {\n for (const key of changedKeys)\n Array.from(items.get(key)?.listeners ?? []).forEach(listener => call(listener));\n }\n },\n clear: () => {\n staged.clear();\n nextIds = ids;\n change = undefined;\n reset = false;\n changedKeys.clear();\n publishedTransitions = Object.freeze([]);\n batch = undefined;\n cause = undefined;\n orderChanged = false;\n },\n release: () => {\n values.clear();\n staged.clear();\n items.clear();\n subscribedItems.clear();\n idsListeners.clear();\n allListeners.clear();\n listeners.clear();\n ids = nextIds = Object.freeze([]);\n all = undefined;\n instance = undefined;\n },\n });\n const handle = {\n current: () => {\n owner.check();\n return current;\n },\n ids: {\n current: () => {\n owner.check();\n return ids;\n },\n revision: () => {\n owner.check();\n return idsRevision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n idsListeners.add(listener);\n return () => {\n idsListeners.delete(listener);\n };\n },\n },\n all: {\n current: () => {\n owner.check();\n if (!all) {\n profile.collectionView.arrayCopied();\n all = Object.freeze(ids.map(key => values.get(key) as V));\n }\n return all;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n allListeners.add(listener);\n return () => {\n allListeners.delete(listener);\n };\n },\n },\n item: (key: K) => {\n owner.check();\n const old = items.get(key);\n if (old) return old.readable;\n const readable: Readable<V | undefined> = Object.freeze({\n current: () => {\n owner.check();\n return values.get(key);\n },\n revision: () => {\n owner.check();\n return item.revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n const set = (item.listeners ??= new Set());\n set.add(listener);\n subscribedItems.add(item);\n return () => {\n set.delete(listener);\n if (!set.size) subscribedItems.delete(item);\n };\n },\n });\n const item: Item = { readable, revision: 0 };\n projectionHandles.add(readable);\n items.set(key, item);\n return readable;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: (change: CollectionImpact<K>) => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n } as CollectionNode<K, V>;\n projectionHandles.add(handle.ids);\n projectionHandles.add(handle.all);\n collectionHandles.add(handle);\n owner.install(handle);\n return Object.freeze(handle);\n};\n","import { createAccess, collectionAccess } from '../access/scope';\nimport { affectsTarget, collectionImpact } from '../impact';\nimport type { CollectionImpact } from '../impact';\nimport * as target from '../impact-target';\nimport { accessOf } from '../runtime/access';\nimport { attachProjection, documentReadableOwner } from '../runtime/notification';\nimport type { DocumentCommit, DocumentReadable } from '../runtime/contract';\nimport type { ObjectNode, ImpactTarget, CollectionSelector, PathPick } from '../schema';\nimport { compilePath } from '../schema';\nimport type {\n CollectionContext,\n CollectionRead,\n DocumentHandle,\n GraphSource,\n ExternalCollectionSource,\n ExternalValueSource,\n ValueContext,\n} from './contract';\nimport { ProjectionError } from './contract';\nimport { collectionHandles } from './collection';\nimport type { Readable } from './readable';\nimport { assertScope, projectionHandles, type Scheduler, type SourceRecord } from './scheduler';\n\nexport const createSources = (scheduler: Scheduler) => {\n const documents = new Map<object, object>();\n const readables = new Map<\n object,\n Map<\n object,\n {\n readonly source: object;\n readonly accept: (value: unknown) => void;\n }\n >\n >();\n const collections = new WeakSet<object>();\n const externalSources = new WeakMap<object, object>();\n const document = <S extends ObjectNode>(runtime: DocumentReadable<S>): DocumentHandle<S> => {\n scheduler.assertIdle();\n const state = accessOf(runtime);\n if (state.disposed) throw new Error('Document has been disposed.');\n const existing = documents.get(state);\n if (existing) return existing as DocumentHandle<S>;\n const bindings: {\n handle: object;\n targets: readonly ImpactTarget[];\n record: SourceRecord;\n receive: (commit: DocumentCommit<S>) => void;\n }[] = [];\n let batch: import('./contract').BatchContext | undefined;\n const make = (\n input:\n { readonly targets: readonly ImpactTarget[] } | { readonly collection: CollectionSelector }\n ): object => {\n const collection = 'collection' in input ? input.collection : undefined;\n const targets = 'targets' in input ? input.targets : [input.collection];\n if (state.disposed) throw new Error('Document has been disposed.');\n targets.forEach(value => {\n if (!target.belongs(value, state.schema))\n throw new Error('Projection target belongs to another schema.');\n });\n const old = bindings.find(\n entry =>\n Boolean(collection) === collections.has(entry.handle) &&\n entry.targets.length === targets.length &&\n entry.targets.every((value, i) => target.same(value, targets[i]))\n );\n if (old) return old.handle;\n let commits: DocumentCommit<S>[] = [];\n let reset = false;\n let orderDirty = false;\n const keys = new Set<string>();\n let candidates:\n { readonly keys: readonly string[]; readonly orderDirty: boolean } | undefined;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: runtime.revision,\n reset: () => reset,\n clear: () => {\n commits = [];\n reset = orderDirty = false;\n batch = undefined;\n keys.clear();\n candidates = undefined;\n },\n context: active => {\n assertScope(active);\n if (state.disposed) throw new Error('Document has been disposed.');\n const context = { state, active };\n const read = collection\n ? collectionAccess(context, collection.address)\n : createAccess(context);\n return Object.freeze({\n read,\n revision: runtime.revision(),\n commits: Object.freeze(commits.slice()),\n reset: record.reset(),\n batch,\n cause: batch?.cause,\n ...(collection\n ? {\n candidates: (candidates ??= Object.freeze({\n keys: Object.freeze([...keys]),\n orderDirty,\n })),\n }\n : {}),\n });\n },\n };\n const handle = collection\n ? {}\n : {\n collection: (pick: PathPick<S>) => {\n scheduler.assertIdle();\n const selector = compilePath<S['shape']>(\n state.schema,\n 'collection',\n pick\n ) as CollectionSelector;\n return make({ collection: selector });\n },\n targets: (...selected: PathPick<S>[]) => {\n scheduler.assertIdle();\n if (!selected.length) throw new TypeError('Expected at least one target.');\n return make({\n targets: selected.map(pick => compilePath<S['shape']>(state.schema, 'value', pick)),\n });\n },\n };\n Object.freeze(handle);\n if (collection) collections.add(handle);\n scheduler.register(handle, record);\n // The attachment delivers to all local bindings without extra document subscriptions.\n const receive = (commit: DocumentCommit<S>) => {\n commits.push(commit);\n reset ||= commit.impact.kind === 'reset';\n if (collection) {\n const change = collectionImpact(commit.impact, collection);\n if (change.kind === 'reset') reset = true;\n else {\n change.added.forEach(key => keys.add(key));\n change.removed.forEach(key => keys.add(key));\n change.updated.forEach(key => keys.add(key));\n orderDirty ||= Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n candidates = undefined;\n }\n };\n bindings.push({ handle, targets, record, receive });\n return handle;\n };\n const handle = make({ targets: [] }) as DocumentHandle<S>;\n const guard = (locked: boolean) => {\n state.projectionLocks = (state.projectionLocks ?? 0) + (locked ? 1 : -1);\n };\n scheduler.guards.add(guard);\n const unsubscribe = attachProjection(runtime, {\n capture: commit => {\n for (const binding of bindings) {\n if (\n !binding.targets.length ||\n binding.targets.some(value => affectsTarget(commit.impact, value))\n ) {\n binding.receive(commit);\n batch = scheduler.batchContext();\n scheduler.capture(binding.record);\n }\n }\n },\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n bindings.forEach(({ record }) => {\n record.fault = new ProjectionError(\n 'source',\n 'document disposed',\n [runtime.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n });\n scheduler.run();\n },\n });\n scheduler.cleanups.add(() => {\n unsubscribe();\n scheduler.guards.delete(guard);\n });\n documents.set(state, handle);\n return handle;\n };\n const valueSource = <T, D = unknown>(initial: T, equal: (a: T, b: T) => boolean) => {\n let value = initial;\n let previous = initial;\n let revision = 0;\n let detail: D | undefined;\n let cause: import('./contract').Cause | undefined;\n let batch: import('./contract').BatchContext | undefined;\n let reset = false;\n let pending = false;\n const handle = Object.freeze({}) as GraphSource<ValueContext<T, D>>;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: () => revision,\n reset: () => reset,\n clear: () => {\n previous = value;\n pending = false;\n detail = undefined;\n cause = undefined;\n batch = undefined;\n reset = false;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value,\n previous,\n revision,\n changed: !equal(previous, value),\n reset,\n detail,\n cause,\n batch,\n });\n },\n };\n scheduler.register(handle, record);\n const accept = (next: T, metadata?: Partial<ValueContext<T, D>>) => {\n scheduler.assertIdle();\n const recovering = record.fault !== undefined;\n const eventful =\n metadata !== undefined &&\n (metadata.reset === true ||\n (metadata.revision !== undefined && metadata.revision !== revision) ||\n metadata.detail !== undefined ||\n metadata.cause !== undefined ||\n metadata.batch !== undefined);\n if (equal(value, next) && !recovering && !eventful) return;\n record.fault = undefined;\n if (!pending) previous = value;\n value = next;\n revision = metadata?.revision ?? revision + 1;\n detail = metadata?.detail;\n cause = metadata?.cause ?? cause;\n batch = scheduler.batchContext() ?? metadata?.batch ?? batch;\n reset ||= metadata?.reset ?? false;\n scheduler.capture(record);\n pending = true;\n };\n return {\n source: handle,\n accept,\n set(next: T) {\n accept(next);\n scheduler.run();\n },\n };\n };\n const externalValueSource = <T, D>(\n port: ExternalValueSource<T, D>,\n equal: (a: T, b: T) => boolean\n ): GraphSource<ValueContext<T, D>> => {\n scheduler.assertIdle();\n const old = externalSources.get(port);\n if (old) return old as GraphSource<ValueContext<T, D>>;\n const input = valueSource<T, D>(port.current(), equal);\n const fail = (cause: unknown) => {\n const record = scheduler.source(input.source);\n record.fault = new ProjectionError('source', 'external source', [record.revision()], cause);\n scheduler.capture(record);\n };\n let unsubscribe: (() => void) | undefined;\n try {\n unsubscribe = port.subscribe(event => {\n try {\n input.accept(event.value, {\n revision: event.revision,\n reset: event.reset,\n detail: event.detail,\n cause: event.cause,\n batch: event.batch,\n });\n } catch (cause) {\n fail(cause);\n }\n scheduler.run();\n });\n } catch (cause) {\n unsubscribe?.();\n scheduler.unregisterSource(input.source);\n throw cause;\n }\n scheduler.cleanups.add(() => unsubscribe?.());\n externalSources.set(port, input.source);\n return input.source;\n };\n const externalCollectionSource = <K extends string, V, D>(\n port: ExternalCollectionSource<K, V, D>\n ): GraphSource<CollectionContext<K, V, D>> => {\n scheduler.assertIdle();\n const old = externalSources.get(port);\n if (old) return old as GraphSource<CollectionContext<K, V, D>>;\n let read = port.current();\n let previous = read;\n let revision = port.revision();\n let change: CollectionContext<K, V, D>['change'];\n let reset = false;\n let detail: D | undefined;\n let cause: import('./contract').Cause | undefined;\n let batch: import('./contract').BatchContext | undefined;\n let publishedTransitions: readonly import('./contract').CollectionEntryTransition<K, V>[] =\n Object.freeze([]);\n let transitionKeys = new Set<K>();\n let pending = false;\n const handle = Object.freeze({}) as GraphSource<CollectionContext<K, V, D>>;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: () => revision,\n reset: () => reset,\n clear: () => {\n previous = read;\n pending = false;\n change = undefined;\n reset = false;\n detail = undefined;\n cause = undefined;\n batch = undefined;\n publishedTransitions = Object.freeze([]);\n transitionKeys.clear();\n },\n context: active => {\n assertScope(active);\n const currentRead: CollectionRead<K, V> = Object.freeze({\n get: key => {\n assertScope(active);\n return read.get(key);\n },\n has: key => {\n assertScope(active);\n return read.has(key);\n },\n ids: () => {\n assertScope(active);\n return read.ids();\n },\n });\n const previousRead: CollectionRead<K, V> = Object.freeze({\n get: key => {\n assertScope(active);\n return previous.get(key);\n },\n has: key => {\n assertScope(active);\n return previous.has(key);\n },\n ids: () => {\n assertScope(active);\n return previous.ids();\n },\n });\n return Object.freeze({\n ...currentRead,\n previous: previousRead,\n change,\n revision,\n reset,\n transitions: (keys?: Iterable<K>) => {\n assertScope(active);\n const selected = keys ? new Set(keys) : undefined;\n return Object.freeze(\n publishedTransitions.filter(transition => !selected || selected.has(transition.key))\n );\n },\n detail,\n cause,\n batch,\n });\n },\n };\n scheduler.register(handle, record);\n collections.add(handle);\n const fail = (error: unknown) => {\n record.fault = new ProjectionError('source', 'external collection source', [revision], error);\n scheduler.capture(record);\n };\n const addTransitionKeys = (impact: CollectionContext<K, V>['change']) => {\n if (impact?.kind === 'incremental') {\n impact.added.forEach(key => transitionKeys.add(key));\n impact.removed.forEach(key => transitionKeys.add(key));\n impact.updated.forEach(key => transitionKeys.add(key));\n }\n };\n const recomputeTransitions = () => {\n const transitions: import('./contract').CollectionEntryTransition<K, V>[] = [];\n for (const key of transitionKeys) {\n const beforePresent = previous.has(key);\n const afterPresent = read.has(key);\n const before = beforePresent ? previous.get(key) : undefined;\n const after = afterPresent ? read.get(key) : undefined;\n if (beforePresent === afterPresent && Object.is(before, after)) continue;\n transitions.push({\n key,\n kind: !beforePresent ? 'added' : !afterPresent ? 'removed' : 'updated',\n before,\n after,\n });\n }\n publishedTransitions = Object.freeze(transitions);\n };\n const deriveChange = (): CollectionImpact<K> | undefined => {\n if (reset) return Object.freeze({ kind: 'reset' as const });\n const added = new Set<K>();\n const removed = new Set<K>();\n const updated = new Set<K>();\n publishedTransitions.forEach(transition => {\n if (transition.kind === 'added') added.add(transition.key);\n else if (transition.kind === 'removed') removed.add(transition.key);\n else updated.add(transition.key);\n });\n const beforeIds = previous.ids();\n const afterIds = read.ids();\n const beforeCommon = beforeIds.filter(key => read.has(key));\n const afterCommon = afterIds.filter(key => previous.has(key));\n const orderChanged =\n beforeCommon.length !== afterCommon.length ||\n beforeCommon.some((key, index) => afterCommon[index] !== key);\n if (!added.size && !removed.size && !updated.size && !orderChanged) return undefined;\n return Object.freeze({\n kind: 'incremental' as const,\n added,\n removed,\n updated,\n orderChanged,\n });\n };\n let unsubscribe: (() => void) | undefined;\n try {\n unsubscribe = port.subscribe(event => {\n try {\n scheduler.assertIdle();\n if (!pending) previous = event.previous;\n read = port.current();\n revision = event.revision;\n addTransitionKeys(event.change);\n reset ||= event.reset || event.change?.kind === 'reset';\n detail = event.detail;\n cause = event.cause ?? cause;\n batch = scheduler.batchContext() ?? event.batch;\n recomputeTransitions();\n change = deriveChange();\n record.fault = undefined;\n scheduler.capture(record);\n pending = true;\n } catch (error) {\n fail(error);\n }\n scheduler.run();\n });\n } catch (error) {\n unsubscribe?.();\n scheduler.unregisterSource(handle);\n throw error;\n }\n scheduler.cleanups.add(() => unsubscribe?.());\n externalSources.set(port, handle);\n return handle;\n };\n return {\n dispose: () => {\n documents.clear();\n readables.clear();\n },\n document,\n fromSource: <T, D>(\n source: ExternalValueSource<T, D>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ) => externalValueSource(source, options?.isEqual ?? Object.is),\n fromCollectionSource: <K extends string, V, D>(source: ExternalCollectionSource<K, V, D>) =>\n externalCollectionSource(source),\n input: <T>(initial: T, options?: { readonly isEqual?: (a: T, b: T) => boolean }) => {\n const { source, set } = valueSource(initial, options?.isEqual ?? Object.is);\n return Object.freeze({ source, set });\n },\n fromReadable: <T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): GraphSource<ValueContext<T>> => {\n scheduler.assertIdle();\n if (projectionHandles.has(readable))\n throw new Error('Projection nodes must be declared directly as sources.');\n const equal = options?.isEqual ?? Object.is;\n let bindings = readables.get(readable);\n const old = bindings?.get(equal);\n if (old) return old.source as GraphSource<ValueContext<T>>;\n const input = valueSource(readable.current(), equal);\n if (bindings) {\n bindings.set(equal, { source: input.source, accept: value => input.accept(value as T) });\n return input.source;\n }\n bindings = new Map([\n [equal, { source: input.source, accept: (value: unknown) => input.accept(value as T) }],\n ]);\n const members = bindings;\n const receive = (settle = true) => {\n if (!scheduler.active) return;\n let value: T;\n try {\n value = readable.current();\n } catch (cause) {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n if (settle) scheduler.run();\n return;\n }\n for (const member of members.values()) {\n try {\n member.accept(value);\n } catch (cause) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n }\n if (settle) scheduler.run();\n };\n let unsubscribe: (() => void) | undefined;\n let detach: (() => void) | undefined;\n try {\n const owner = documentReadableOwner(readable);\n if (owner) {\n document(owner);\n detach = attachProjection(owner, {\n capture: () => receive(false),\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'document readable disposed',\n [record.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n }\n scheduler.run();\n },\n });\n }\n unsubscribe = readable.subscribe(() => receive());\n input.accept(readable.current());\n } catch (error) {\n try {\n unsubscribe?.();\n detach?.();\n } finally {\n scheduler.unregisterSource(input.source);\n }\n throw error;\n }\n scheduler.cleanups.add(unsubscribe);\n if (detach) scheduler.cleanups.add(detach);\n readables.set(readable, bindings);\n scheduler.run();\n return input.source;\n },\n assertCollection: (handle: object) => {\n scheduler.source(handle);\n if (!collections.has(handle) && !collectionHandles.has(handle))\n throw new Error('map requires a collection source.');\n },\n };\n};\n","import type { GraphSources, ValueNode, ValueNodeSpec } from './contract';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, type Scheduler } from './scheduler';\nimport { profile } from '../profile';\n\nexport const createValue = <S extends GraphSources, T>(\n scheduler: Scheduler,\n spec: ValueNodeSpec<S, T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n): ValueNode<T> => {\n let instance: ReturnType<typeof spec.build> | undefined;\n let value!: T;\n let next!: T;\n let previous!: T;\n let initialized = false;\n let revision = 0;\n let changed = false;\n let reset = false;\n let batch: import('./contract').BatchContext | undefined;\n let cause: import('./contract').Cause | undefined;\n const listeners = new Set<() => void>();\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build) => {\n const metadata = Object.values(sources as Record<string, unknown>).find(\n value =>\n value &&\n typeof value === 'object' &&\n (('batch' in value && (value as { readonly batch?: unknown }).batch !== undefined) ||\n ('cause' in value && (value as { readonly cause?: unknown }).cause !== undefined))\n ) as\n | {\n readonly batch?: import('./contract').BatchContext;\n readonly cause?: import('./contract').Cause;\n }\n | undefined;\n batch = scheduler.batchContext() ?? metadata?.batch;\n cause = metadata?.cause ?? batch?.cause;\n let candidate: T;\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n } else {\n profile.materialized.updated();\n const result = instance.update(sources);\n assertSynchronous(result);\n if (result.kind === 'rebuild') {\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n build = true;\n } else candidate = result.kind === 'changed' ? result.value : value;\n }\n previous = value;\n changed = !initialized || !(options?.isEqual ?? Object.is)(value, candidate);\n next = changed ? candidate : value;\n reset = build;\n return changed;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value: next,\n previous,\n changed,\n revision: revision + (changed ? 1 : 0),\n reset,\n cause,\n batch,\n });\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (changed && initialized) revision++;\n 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 next = value;\n previous = value;\n changed = false;\n reset = false;\n batch = undefined;\n cause = undefined;\n },\n release: () => {\n listeners.clear();\n instance = undefined;\n value = next = previous = undefined as T;\n },\n });\n const handle = Object.freeze({\n current: () => {\n owner.check();\n return value;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n }) as ValueNode<T>;\n owner.install(handle);\n return handle;\n};\n","import type {\n CollectionContext,\n CollectionRead,\n InputHandles,\n RuntimeExecutor,\n GraphSource,\n GraphSources,\n ValueNode,\n ValueNodeSpec,\n ExternalCollectionSource,\n ExternalValueSource,\n} from './contract';\nimport type { Synchronous } from '../runtime/contract';\nimport { assertSynchronous, createScheduler } from './scheduler';\nimport { createSources } from './source';\nimport { createValue } from './value';\nimport { createCollection } from './collection';\nimport type { ProjectionError } from './contract';\nimport { profile } from '../profile';\nexport const createRuntimeExecutor = (options: {\n readonly onError: (error: ProjectionError) => void;\n}): RuntimeExecutor => {\n const scheduler = createScheduler(options.onError);\n const sources = createSources(scheduler);\n function value<S extends GraphSources, T>(\n sources: S,\n compute: (sources: InputHandles<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ValueNode<T>;\n function value<S extends GraphSources, T>(\n spec: ValueNodeSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ValueNode<T>;\n function value<S extends GraphSources, T>(\n input: S | ValueNodeSpec<S, T>,\n computeOrOptions?:\n ((sources: InputHandles<S>) => T) | { readonly isEqual?: (a: T, b: T) => boolean },\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ValueNode<T> {\n if (typeof computeOrOptions !== 'function')\n return createValue(scheduler, input as ValueNodeSpec<S, T>, computeOrOptions);\n const compute = (input: InputHandles<S>) => {\n const result = computeOrOptions(input);\n assertSynchronous(result);\n return result;\n };\n return createValue(\n scheduler,\n {\n sources: input as S,\n build: input => ({\n value: compute(input),\n update: input => ({ kind: 'changed', value: compute(input) }),\n }),\n },\n options\n );\n }\n const map = <K extends string, V, R>(\n source: GraphSource<\n | CollectionContext<K, V>\n | {\n readonly read: CollectionRead<K, V>;\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly K[]; readonly orderDirty: boolean };\n }\n >,\n mapper: (id: K, entry: V) => R,\n options?: { readonly isEqual?: (a: R, b: R) => boolean }\n ) => {\n sources.assertCollection(source);\n const calculate = (id: K, entry: V): R => {\n const value = mapper(id, entry);\n assertSynchronous(value);\n return value;\n };\n return createCollection(scheduler, {\n sources: { source },\n isEqual: options?.isEqual,\n build: ({ sources, writer }) => {\n const input = sources.source;\n const read = 'read' in input ? input.read : input;\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n for (const id of ids) {\n profile.collectionView.mapped();\n writer.set(id, calculate(id, read.get(id)!));\n }\n writer.order(ids);\n return {\n update: ({ sources, writer }) => {\n const input = sources.source;\n if (input.reset) return { kind: 'rebuild' };\n const read = 'read' in input ? input.read : input;\n let keys: Iterable<K>;\n let structural: boolean;\n if ('candidates' in input) {\n keys = input.candidates.keys;\n structural = input.candidates.orderDirty;\n } else {\n const change = input.change;\n if (!change) return;\n if (change.kind === 'reset') return { kind: 'rebuild' };\n keys = new Set([...change.added, ...change.removed, ...change.updated]);\n structural = Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n for (const key of keys) {\n if (!read.has(key)) writer.remove(key);\n else {\n profile.collectionView.mapped();\n writer.set(key, calculate(key, read.get(key)!));\n }\n }\n if (structural) {\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n writer.order(ids);\n }\n },\n };\n },\n });\n };\n const runtime: RuntimeExecutor = {\n document: sources.document,\n fromSource: <T, D>(\n source: ExternalValueSource<T, D>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ) => sources.fromSource(source, options),\n fromCollectionSource: <K extends string, V, D>(source: ExternalCollectionSource<K, V, D>) =>\n sources.fromCollectionSource(source),\n input: sources.input,\n fromReadable: sources.fromReadable,\n value,\n collection: () => spec => createCollection(scheduler, spec),\n map,\n batch: scheduler.batch,\n dispose: () => {\n try {\n scheduler.dispose();\n } finally {\n if (!scheduler.active) sources.dispose();\n }\n },\n };\n return Object.freeze(runtime);\n};\n","import { read as readAddress } from '../address';\nimport { snapshot } from '../access/scope';\nimport { accessOf } from '../runtime/access';\nimport { compilePath } from '../schema';\nimport type { Unsubscribe } from '../runtime/contract';\nimport type { CollectionImpact } from '../impact';\nimport type {\n CollectionRead,\n CollectionNode,\n RuntimeExecutor,\n BatchOptions,\n ValueNode,\n GraphSource,\n} from './contract';\nimport type { Readable } from './readable';\nimport { definitionOf, type Input, type Projection, type PublicCollection } from './definition';\nimport { createRuntimeExecutor } from './runtime';\n\ntype RuntimeNode = ValueNode<unknown> | CollectionNode<string, unknown>;\ntype RuntimeValue = RuntimeNode;\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\nexport type ProjectionRuntime = {\n get<T>(projection: Projection<T>): T;\n readable<T>(projection: Projection<T>): Readable<T>;\n readable<T, R>(\n projection: Projection<T>,\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 batch<T>(run: () => T): T;\n batch<T>(options: BatchOptions, run: () => T): T;\n dispose(): void;\n};\n\nlet activeTracker: SelectionTracker | undefined;\n\nconst trackKey = (key: string): void => {\n activeTracker?.keys.add(key);\n};\nconst trackStructure = (): void => {\n if (!activeTracker) return;\n activeTracker.structure = true;\n};\nconst trackAll = (): void => {\n if (!activeTracker) return;\n activeTracker.all = true;\n};\n\nconst mapView = <K extends string, V>(read: CollectionRead<K, V>): PublicCollection<K, V> => {\n const keys = read.ids();\n const source = new Map<K, V>();\n for (const key of keys) source.set(key, read.get(key) as V);\n const view: PublicCollection<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 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 mapRead = (value: ReadonlyMap<string, unknown>): CollectionRead<string, unknown> => ({\n get: key => value.get(key),\n has: key => value.has(key),\n ids: () => Object.freeze([...value.keys()]),\n});\n\nconst mapChange = (\n previous: ReadonlyMap<string, unknown>,\n current: ReadonlyMap<string, unknown>\n): CollectionImpact<string> | undefined => {\n const added = new Set<string>();\n const removed = new Set<string>();\n const updated = new Set<string>();\n for (const key of previous.keys()) {\n if (!current.has(key)) removed.add(key);\n else if (!Object.is(previous.get(key), current.get(key))) updated.add(key);\n }\n for (const key of current.keys()) if (!previous.has(key)) added.add(key);\n const before = [...previous.keys()].filter(key => current.has(key));\n const after = [...current.keys()].filter(key => previous.has(key));\n const orderChanged =\n before.length !== after.length || before.some((key, index) => key !== after[index]);\n if (!added.size && !removed.size && !updated.size && !orderChanged) return undefined;\n return { kind: 'incremental', added, removed, updated, orderChanged };\n};\n\nconst sameSelection = (left: Selection, right: Selection): boolean => {\n if (\n left.all !== right.all ||\n left.structure !== right.structure ||\n left.keys.size !== right.keys.size\n )\n return false;\n for (const key of left.keys) if (!right.keys.has(key)) return false;\n return true;\n};\n\nconst selectionAffects = (\n selection: Selection,\n change: CollectionImpact<string> | undefined\n): boolean => {\n if (!change || change.kind === 'reset') return true;\n if (\n selection.all &&\n (change.added.size || change.removed.size || change.updated.size || change.orderChanged)\n )\n return true;\n if (selection.structure && (change.added.size || change.removed.size || change.orderChanged))\n return true;\n for (const key of selection.keys) {\n if (change.added.has(key) || change.removed.has(key) || change.updated.has(key)) return true;\n }\n return false;\n};\n\nconst currentValue = (event: unknown): unknown => {\n if (!event || typeof event !== 'object') return event;\n if ('value' in event) return (event as { readonly value: unknown }).value;\n if ('read' in event) return snapshot((event as { readonly read: unknown }).read);\n if ('ids' in event && typeof (event as { ids?: unknown }).ids === 'function')\n return mapView(event as CollectionRead<string, unknown>);\n return event;\n};\n\nconst sourceOf = (instance: RuntimeNode): GraphSource<unknown> => instance as GraphSource<unknown>;\n\nexport const createProjectionRuntime = (options?: {\n readonly onError?: (error: import('./contract').ProjectionError) => void;\n}): ProjectionRuntime => {\n const runtime = createRuntimeExecutor({ onError: options?.onError ?? (() => undefined) });\n const instances = new WeakMap<object, RuntimeValue>();\n const inputs = new WeakMap<object, { readonly source: object; set(value: unknown): void }>();\n const collections = new WeakMap<\n object,\n { revision: number; value: PublicCollection<string, unknown> }\n >();\n\n const materialize = (projection: Projection<unknown>): RuntimeValue => {\n const old = instances.get(projection);\n if (old) return old;\n const definition = definitionOf(projection);\n let instance: RuntimeValue;\n switch (definition.kind) {\n case 'input': {\n const input = runtime.input(definition.initial, { isEqual: definition.isEqual });\n inputs.set(projection, input);\n instance = runtime.value({ input: input.source }, ({ input }) => input.value);\n break;\n }\n case 'readable': {\n const source = runtime.fromReadable(definition.readable, { isEqual: definition.isEqual });\n instance = runtime.value({ source }, ({ source }) => source.value);\n break;\n }\n case 'source-value':\n {\n const source = runtime.fromSource(definition.source);\n instance = runtime.value({ source }, ({ source }) => source.value);\n }\n break;\n case 'source-collection': {\n const source = runtime.fromCollectionSource(definition.source);\n instance = runtime.map(source as never, (_key, value) => value);\n break;\n }\n case 'document': {\n const document = runtime.document(definition.document);\n if (!definition.selector) {\n instance = runtime.value({ document }, ({ document }) => snapshot(document.read));\n break;\n }\n const state = accessOf(definition.document);\n try {\n const collection = document.collection(definition.selector as never);\n instance = runtime.map(collection, (_id, entry) => snapshot(entry));\n break;\n } catch {\n const selected = document.targets(definition.selector as never);\n const address = compilePath(state.schema, 'value', definition.selector as never).address;\n instance = runtime.value({ selected }, () => {\n const root = snapshot(state.document);\n return readAddress(root, address, state.schema);\n });\n }\n break;\n }\n case 'derive': {\n const sources = Object.fromEntries(\n definition.dependencies.map((dependency, index) => [\n `d${index}`,\n sourceOf(materialize(dependency)),\n ])\n );\n instance = runtime.value(\n sources,\n values => definition.compute(...Object.values(values).map(currentValue)),\n { isEqual: definition.isEqual }\n );\n break;\n }\n case 'incremental-value': {\n const sources = Object.fromEntries(\n Object.entries(definition.dependencies).map(([key, dependency]) => [\n key,\n sourceOf(materialize(dependency as never)),\n ])\n );\n instance = runtime.value(\n { sources, build: definition.build as never },\n { isEqual: definition.isEqual as never }\n );\n break;\n }\n case 'incremental-collection': {\n const sources = Object.fromEntries(\n Object.entries(definition.dependencies).map(([key, dependency]) => [\n key,\n sourceOf(materialize(dependency as never)),\n ])\n );\n instance = runtime.collection<unknown>()({\n sources,\n build: definition.build as never,\n isEqual: definition.isEqual as never,\n name: definition.name,\n });\n break;\n }\n }\n instances.set(projection, instance);\n return instance;\n };\n\n const get = <T>(projection: Projection<T>): T => {\n const instance = materialize(projection as Projection<unknown>);\n const current: unknown = instance.current();\n if (\n current &&\n typeof current === 'object' &&\n 'ids' in current &&\n typeof (current as { ids?: unknown }).ids === 'function'\n ) {\n const existing = collections.get(instance);\n const revision = instance.revision();\n if (existing?.revision === revision) return existing.value as T;\n const value = mapView(current as CollectionRead<string, unknown>);\n collections.set(instance, { revision, value });\n return value as T;\n }\n if (isMapLike(current)) {\n const existing = collections.get(instance);\n const revision = instance.revision();\n if (existing?.revision === revision) return existing.value as T;\n const value = mapView(mapRead(current));\n collections.set(instance, { revision, value });\n return value as T;\n }\n return current as T;\n };\n\n function readable<T>(projection: Projection<T>): Readable<T>;\n function readable<T, R>(\n projection: Projection<T>,\n selector: (value: T) => R,\n equality?: (previous: R, next: R) => boolean\n ): Readable<R>;\n function readable<T, R>(\n projection: Projection<T>,\n selector?: (value: T) => R,\n equality: (previous: R, next: R) => boolean = Object.is\n ): Readable<T | R> {\n if (!selector) {\n return Object.freeze({\n current: () => get(projection),\n revision: () => materialize(projection).revision(),\n subscribe: (listener: () => void) => materialize(projection).subscribe(listener as never),\n });\n }\n\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: PublicCollection<string, unknown> | undefined;\n let unsubscribeSource: Unsubscribe | undefined;\n const listeners = new Set<() => void>();\n\n const updateCollectionSnapshot = () => {\n const current = get(projection);\n previousCollection = isMapLike(current) ? current : 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 source: T;\n let next: R;\n try {\n source = get(projection);\n next = selector(source);\n } finally {\n activeTracker = previousTracker;\n }\n const nextSelection: Selection = Object.freeze({\n keys: new Set(tracker.keys),\n all: tracker.all || (isMapLike(source) && tracker.keys.size === 0),\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 = materialize(projection).revision();\n updateCollectionSnapshot();\n return changed;\n };\n\n const ensureCurrent = (): R => {\n const revision = materialize(projection).revision();\n if (!initialized || (!unsubscribeSource && sourceRevision !== revision)) evaluate();\n return value;\n };\n\n const onProjectionChange = (incoming?: CollectionImpact<string>) => {\n let change = incoming;\n if (!change && previousCollection) {\n const current = get(projection);\n if (isMapLike(current)) {\n change = mapChange(previousCollection, current);\n previousCollection = current;\n if (!change) {\n sourceRevision = materialize(projection).revision();\n return;\n }\n } else previousCollection = undefined;\n }\n if (!selectionAffects(selection, change)) {\n sourceRevision = materialize(projection).revision();\n updateCollectionSnapshot();\n return;\n }\n const previousSelection = selection;\n const changed = evaluate();\n if (unsubscribeSource && !sameSelection(previousSelection, selection)) {\n unsubscribeSource();\n unsubscribeSource = materialize(projection).subscribe(onProjectionChange as never);\n }\n if (changed) Array.from(listeners).forEach(listener => listener());\n };\n\n const installSource = () => {\n if (!unsubscribeSource) {\n unsubscribeSource = materialize(projection).subscribe(onProjectionChange as never);\n }\n };\n\n const handle: Readable<R> = {\n current: ensureCurrent,\n revision: () => {\n ensureCurrent();\n return selectedRevision;\n },\n subscribe: listener => {\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 return Object.freeze(handle);\n }\n\n const store: ProjectionRuntime = {\n get,\n readable,\n set: ((input: Input<unknown>, value: unknown) => {\n materialize(input);\n const target = inputs.get(input);\n if (!target) throw new TypeError('Projection is not an input.');\n target.set(value);\n }) as ProjectionRuntime['set'],\n batch: runtime.batch,\n dispose: runtime.dispose,\n };\n return Object.freeze(store);\n};\n"],"mappings":"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"}