doxum 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +218 -0
- package/dist/chunk-pbuEa-1d.js +13 -0
- package/dist/contract-DwNiKioc.d.ts +480 -0
- package/dist/contract-Otb5W6cQ.d.cts +480 -0
- package/dist/dependency-BdEMyquf.js +735 -0
- package/dist/dependency-BdEMyquf.js.map +1 -0
- package/dist/dependency-DLcCvNKq.cjs +1015 -0
- package/dist/dependency-DLcCvNKq.cjs.map +1 -0
- package/dist/index.cjs +2718 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +89 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +2689 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.cjs +15 -0
- package/dist/integration.cjs.map +1 -0
- package/dist/integration.d.cts +11 -0
- package/dist/integration.d.ts +11 -0
- package/dist/integration.js +14 -0
- package/dist/integration.js.map +1 -0
- package/dist/react.cjs +99 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +16 -0
- package/dist/react.d.ts +16 -0
- package/dist/react.js +96 -0
- package/dist/react.js.map +1 -0
- package/package.json +89 -0
- package/skills/doxum-runtime/SKILL.md +51 -0
- package/skills/doxum-runtime/agents/openai.yaml +4 -0
- package/skills/doxum-runtime/references/guide.en.md +295 -0
- package/skills/doxum-runtime/references/guide.zh-CN.md +240 -0
- package/skills/doxum-runtime/references/invariants.en.md +147 -0
- package/skills/doxum-runtime/references/invariants.zh-CN.md +97 -0
- package/skills/doxum-runtime/references/patterns.en.md +287 -0
- package/skills/doxum-runtime/references/patterns.zh-CN.md +240 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["target.belongs","target.address","id","target.id","ownAddress","at","rejected","issue.from","anchor.validPositions","anchor.valid","anchor.index","anchor.afterRemove","anchor.at","rejected","issue.from","anchor.keys","anchor.valid","anchor.index","anchor.at","anchor.afterRemove","has","rejected","sameOrder","contains","issue.from","tree.is","tree.replace","tree.insert","tree.set","tree.remove","tree.move","rejected","issue.from","issue.from","tree.restoreChange","tree.changeChanged","anchor.index","anchor.valid","anchor.afterRemove","tree.is","tree.recordChange","issue.input","input","operation.decode","operation.normalize","operation.publish","inverse","operation.inverse","operation.decodeBatch","target.bucket","tree.invalidDocument","readAddress","issue.at","nodeAt"],"sources":["../core/src/impact.ts","../core/src/history.ts","../core/src/access/writer.ts","../core/src/mutation/issue.ts","../core/src/mutation/anchor.ts","../core/src/mutation/execute-entity.ts","../core/src/mutation/execute-list.ts","../core/src/mutation/tree.ts","../core/src/mutation/execute-tree.ts","../core/src/mutation/execute-value.ts","../core/src/mutation/execute.ts","../core/src/mutation/journal.ts","../core/src/mutation/operation.ts","../core/src/mutation/session.ts","../core/src/runtime/notification.ts","../core/src/runtime.ts","../core/src/projection/select.ts","../core/src/projection/collection-view.ts","../core/src/projection/materialized-view.ts"],"sourcesContent":["import type { CollectionSelector, DocumentAddress, DocumentSchema, ImpactTarget } from './schema';\nimport type { DocumentOperationUnion } from './operations';\nimport { contains, overlaps } from './address';\nimport type { MutationCollectionChange } from './mutation/contract';\nimport { profile } from './profile';\nimport * as target from './impact-target';\n\nexport type CollectionImpact<TId> =\n | { readonly kind: 'reset' }\n | {\n readonly kind: 'incremental';\n readonly added: ReadonlySet<TId>;\n readonly removed: ReadonlySet<TId>;\n readonly updated: ReadonlySet<TId>;\n readonly orderChanged: boolean;\n };\n\nexport type DocumentImpact<TSchema extends DocumentSchema> = {\n readonly kind: 'incremental' | 'reset';\n readonly affects: (target: ImpactTarget<unknown>) => boolean;\n readonly collection: <TId extends string, TEntry>(\n selector: CollectionSelector<TId, TEntry>\n ) => CollectionImpact<TId>;\n readonly operations: readonly DocumentOperationUnion<TSchema>[];\n};\n\nconst emptyCollectionImpact: CollectionImpact<string> = Object.freeze({\n kind: 'incremental',\n added: new Set<string>(),\n removed: new Set<string>(),\n updated: new Set<string>(),\n orderChanged: false,\n});\nconst resetCollectionImpact: CollectionImpact<never> = Object.freeze({\n kind: 'reset',\n});\n\nexport const createImpact = <TSchema extends DocumentSchema>(input: {\n readonly schema: TSchema;\n readonly operations: readonly DocumentOperationUnion<TSchema>[];\n readonly paths?: readonly DocumentAddress[];\n readonly collections?: readonly MutationCollectionChange[];\n readonly reset?: boolean;\n}): DocumentImpact<TSchema> => {\n const kind = input.reset ? 'reset' : 'incremental';\n const paths = input.paths ?? input.operations.map(operation => operation.at);\n let pathBuckets: Map<string | undefined, DocumentAddress[]> | undefined;\n const somePath = (\n address: DocumentAddress,\n test: (changed: DocumentAddress) => boolean\n ): boolean => {\n if (address.length === 0 || paths.length <= 8) return paths.some(test);\n if (!pathBuckets) {\n pathBuckets = new Map();\n for (const changed of paths) {\n const first = changed[0];\n const bucket = pathBuckets.get(first) ?? [];\n bucket.push(changed);\n pathBuckets.set(first, bucket);\n }\n }\n const root = pathBuckets.get(undefined);\n if (root?.some(test)) return true;\n return pathBuckets.get(address[0])?.some(test) ?? false;\n };\n const pathsAffect = (address: DocumentAddress): boolean =>\n address.length === 0\n ? paths.length > 0\n : somePath(address, changed => overlaps(changed, address));\n let collectionCache:\n | {\n readonly address: DocumentAddress;\n readonly value: CollectionImpact<unknown>;\n }[]\n | undefined;\n const findCollection = (address: DocumentAddress) =>\n input.collections?.find(\n entry =>\n entry.address.length === address.length &&\n entry.address.every((segment, index) => segment === address[index])\n );\n return {\n kind,\n operations: input.operations,\n affects: value => {\n profile.impact.affects();\n if (kind === 'reset') return true;\n if (!target.belongs(value, input.schema)) return false;\n const address = target.address(value);\n if (pathsAffect(address)) return true;\n if (value.kind === 'collection') {\n const collectionAddress = target.address(value);\n const collection = findCollection(collectionAddress);\n if (!collection) return false;\n const id = target.id(value);\n if (id !== undefined)\n return (\n collection.added.has(id) || collection.removed.has(id) || collection.updated.has(id)\n );\n return (\n collection.added.size > 0 ||\n collection.removed.size > 0 ||\n collection.updated.size > 0 ||\n collection.orderChanged\n );\n }\n return false;\n },\n collection: <TId extends string, TEntry>(\n selector: CollectionSelector<TId, TEntry>\n ): CollectionImpact<TId> => {\n if (selector.schema !== input.schema)\n throw new Error('Collection selector belongs to another schema.');\n if (kind === 'reset') return resetCollectionImpact as CollectionImpact<TId>;\n const cached = collectionCache?.find(\n entry =>\n entry.address.length === selector.address.length &&\n entry.address.every((segment, index) => segment === selector.address[index])\n )?.value;\n if (cached) return cached as CollectionImpact<TId>;\n const exact = findCollection(selector.address);\n const subtreeReset = somePath(\n selector.address,\n changed => contains(changed, selector.address) && changed.length < selector.address.length\n );\n if (subtreeReset) {\n const reset = { kind: 'reset' } as const;\n (collectionCache ??= []).push({\n address: selector.address,\n value: reset,\n });\n return reset;\n }\n if (!exact) {\n const empty = emptyCollectionImpact as CollectionImpact<TId>;\n (collectionCache ??= []).push({\n address: selector.address,\n value: empty as CollectionImpact<unknown>,\n });\n return empty;\n }\n const incremental = {\n kind: 'incremental' as const,\n added: exact.added as ReadonlySet<TId>,\n removed: exact.removed as ReadonlySet<TId>,\n updated: exact.updated as ReadonlySet<TId>,\n orderChanged: exact.orderChanged,\n };\n (collectionCache ??= []).push({\n address: selector.address,\n value: incremental as CollectionImpact<unknown>,\n });\n return incremental;\n },\n };\n};\n","import type { DocumentOperationUnion } from './operations';\nimport type { HistoryState, LocalHistory, OperationResult } from './runtime/contract';\n\ntype Entry = {\n readonly operations: readonly DocumentOperationUnion[];\n readonly inverse: readonly DocumentOperationUnion[];\n};\nexport const createHistory = <TCommit>(input: {\n readonly capacity: number;\n readonly apply: (operations: readonly DocumentOperationUnion[]) => OperationResult<TCommit>;\n readonly revision: () => number;\n}): {\n readonly api: LocalHistory<TCommit>;\n readonly record: (\n operations: readonly DocumentOperationUnion[],\n inverse: readonly DocumentOperationUnion[]\n ) => void;\n readonly invalidate: () => void;\n} => {\n const undos: Entry[] = [];\n const redos: Entry[] = [];\n const listeners = new Set<() => void>();\n let state: HistoryState = Object.freeze({ undoDepth: 0, redoDepth: 0 });\n const current = () => {\n if (state.undoDepth !== undos.length || state.redoDepth !== redos.length)\n state = Object.freeze({\n undoDepth: undos.length,\n redoDepth: redos.length,\n });\n return state;\n };\n const emit = () => {\n if (listeners.size === 0) return;\n current();\n Array.from(listeners).forEach(listener => listener());\n };\n const clear = () => {\n if (undos.length || redos.length) {\n undos.length = 0;\n redos.length = 0;\n emit();\n }\n };\n const api: LocalHistory<TCommit> = {\n current,\n subscribe: listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n undo: () => {\n const entry = undos.pop();\n if (!entry) return { status: 'unchanged', revision: input.revision() };\n const result = input.apply(entry.inverse);\n if (result.status === 'committed') {\n redos.push(entry);\n emit();\n } else undos.push(entry);\n return result;\n },\n redo: () => {\n const entry = redos.pop();\n if (!entry) return { status: 'unchanged', revision: input.revision() };\n const result = input.apply(entry.operations);\n if (result.status === 'committed') {\n undos.push(entry);\n emit();\n } else redos.push(entry);\n return result;\n },\n clear,\n };\n return {\n api,\n record: (operations, inverse) => {\n if (input.capacity <= 0) return;\n undos.push({ operations, inverse });\n if (undos.length > input.capacity) undos.shift();\n redos.length = 0;\n emit();\n },\n invalidate: clear,\n };\n};\n","import { object } from '../schema';\nimport type {\n DictNode,\n DocumentAddress,\n DocumentNode,\n DocumentSchema,\n DocumentValueOfNode,\n ListNode,\n MapNode,\n ObjectNode,\n SingleNode,\n TableNode,\n TreeNode,\n VariantNode,\n} from '../schema';\nimport type { DocumentAnchor, DocumentOperationUnion } from '../operations';\n\nexport type FieldWriter<T> = {\n readonly set: (value: T) => void;\n readonly clear?: () => void;\n};\nexport type DictionaryWriter<TKey extends string, TValue> = {\n readonly set: (key: TKey, value: TValue) => void;\n readonly delete: (key: TKey) => void;\n readonly replace: (value: Readonly<Partial<Record<TKey, TValue>>>) => void;\n};\nexport type CollectionWriter<TId, TEntry> = {\n readonly create: (\n entry:\n | { readonly id: TId; readonly value: TEntry }\n | readonly { readonly id: TId; readonly value: TEntry }[],\n anchor?: DocumentAnchor\n ) => void;\n readonly item: (id: TId) => EntityWriter<TEntry>;\n readonly remove: (id: TId | readonly TId[]) => void;\n readonly move: (id: TId, anchor?: DocumentAnchor) => void;\n};\nexport type MapWriter<TId, TEntry> = {\n readonly create: (\n entry:\n | { readonly id: TId; readonly value: TEntry }\n | readonly { readonly id: TId; readonly value: TEntry }[]\n ) => void;\n readonly item: (id: TId) => EntityWriter<TEntry>;\n readonly remove: (id: TId | readonly TId[]) => void;\n};\nexport type ListWriter<T> = {\n readonly insert: (value: T, anchor?: DocumentAnchor) => void;\n readonly move: (key: string, anchor?: DocumentAnchor) => void;\n readonly remove: (key: string) => void;\n readonly replace: (value: readonly T[]) => void;\n};\nexport type TreeWriter<T> = {\n readonly insert: (id: string, value: T, parentId?: string, index?: number) => void;\n readonly move: (id: string, parentId?: string, index?: number) => void;\n readonly remove: (id: string) => void;\n readonly set: (id: string, value: T) => void;\n readonly replace: (value: unknown) => void;\n};\nexport type EntityWriter<T> = T extends object\n ? { readonly [K in keyof T]: WriterValue<T[K]> }\n : FieldWriter<T>;\nexport type WriterValue<T> = T extends readonly (infer TItem)[]\n ? ListWriter<TItem>\n : T extends object\n ? EntityWriter<T>\n : FieldWriter<T>;\nexport type WriterOfNode<TNode extends DocumentNode> = TNode extends {\n kind: 'field';\n}\n ? FieldWriter<DocumentValueOfNode<TNode>>\n : TNode extends ObjectNode<infer TShape>\n ? { readonly [K in keyof TShape]: WriterOfNode<TShape[K]> }\n : TNode extends VariantNode<string, infer _TVariants>\n ? { readonly replace: (value: DocumentValueOfNode<TNode>) => void }\n : TNode extends SingleNode<infer TValue>\n ? WriterOfNode<TValue>\n : TNode extends TableNode<infer TValue>\n ? CollectionWriter<string, DocumentValueOfNode<TValue>>\n : TNode extends MapNode<infer TValue>\n ? MapWriter<string, DocumentValueOfNode<TValue>>\n : TNode extends DictNode<infer TKey, infer TValue>\n ? DictionaryWriter<TKey, TValue>\n : TNode extends ListNode<infer TItem>\n ? ListWriter<TItem>\n : TNode extends TreeNode<infer TValue>\n ? TreeWriter<TValue>\n : FieldWriter<DocumentValueOfNode<TNode>>;\nexport type DocumentWriter<TSchema extends DocumentSchema> = WriterOfNode<\n ObjectNode<TSchema['shape']>\n>;\n\nexport type OperationSink = (operation: DocumentOperationUnion) => void;\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => object(schema.shape);\n\nconst emit = (sink: OperationSink, operation: DocumentOperationUnion): void => sink(operation);\n\nexport const writerFor = (\n node: DocumentNode,\n inputAddress: DocumentAddress,\n sink: OperationSink\n): unknown => {\n const address = Object.freeze(inputAddress);\n if (node.kind === 'field')\n return {\n set: (value: unknown) => emit(sink, { type: 'field.set', at: address, value }),\n clear: node.optional ? () => emit(sink, { type: 'field.clear', at: address }) : undefined,\n };\n if (node.kind === 'dict' || node.kind === 'record')\n return {\n set: (key: string, value: unknown) =>\n emit(sink, { type: 'dict.set', at: address, key, value }),\n delete: (key: string) => emit(sink, { type: 'dict.delete', at: address, key }),\n replace: (value: Readonly<Record<string, unknown>>) =>\n emit(sink, { type: 'dict.replace', at: address, value }),\n };\n if (node.kind === 'list')\n return {\n insert: (value: unknown, anchor?: DocumentAnchor) =>\n emit(sink, {\n type: 'list.insert',\n at: address,\n key: node.keyOf(value),\n value,\n anchor,\n }),\n move: (key: string, anchor?: DocumentAnchor) =>\n emit(sink, { type: 'list.move', at: address, key, anchor }),\n remove: (key: string) => emit(sink, { type: 'list.remove', at: address, key }),\n replace: (value: readonly unknown[]) =>\n emit(sink, {\n type: 'list.replace',\n at: address,\n value,\n keys: value.map(node.keyOf),\n }),\n };\n if (node.kind === 'tree')\n return {\n insert: (treeNodeId: string, value: unknown, parentId?: string, index?: number) =>\n emit(sink, {\n type: 'tree.insert',\n at: address,\n treeNodeId,\n value,\n parentId,\n index,\n }),\n move: (treeNodeId: string, parentId?: string, index?: number) =>\n emit(sink, {\n type: 'tree.move',\n at: address,\n treeNodeId,\n parentId,\n index,\n }),\n remove: (treeNodeId: string) => emit(sink, { type: 'tree.remove', at: address, treeNodeId }),\n set: (treeNodeId: string, value: unknown) =>\n emit(sink, {\n type: 'tree.set',\n at: address,\n treeNodeId,\n value,\n }),\n replace: (value: unknown) => emit(sink, { type: 'tree.replace', at: address, value }),\n };\n if (node.kind === 'table') {\n let items: Map<string, unknown> | undefined;\n return {\n create: (\n input:\n | { readonly id: string; readonly value: unknown }\n | readonly { readonly id: string; readonly value: unknown }[],\n anchor?: DocumentAnchor\n ) => {\n const entries = Array.isArray(input) ? input : [input];\n emit(sink, {\n type: 'entity.create',\n at: address,\n entries: entries.map(({ id, value }) => ({ id, value })),\n anchor,\n });\n },\n item: (id: string) => {\n const cached = items?.get(id);\n if (cached) return cached;\n const writer = writerFor(node.value, [...address, id], sink);\n (items ??= new Map()).set(id, writer);\n return writer;\n },\n remove: (input: string | readonly string[]) =>\n emit(sink, {\n type: 'entity.remove',\n at: address,\n ids: Array.isArray(input) ? [...input] : [input],\n }),\n move: (id: string, anchor?: DocumentAnchor) =>\n emit(sink, { type: 'entity.move', at: address, id, anchor }),\n };\n }\n if (node.kind === 'map') {\n let items: Map<string, unknown> | undefined;\n return {\n create: (\n input:\n | { readonly id: string; readonly value: unknown }\n | readonly { readonly id: string; readonly value: unknown }[]\n ) => {\n const entries = Array.isArray(input) ? input : [input];\n emit(sink, {\n type: 'entity.create',\n at: address,\n entries: entries.map(({ id, value }) => ({ id, value })),\n });\n },\n item: (id: string) => {\n const cached = items?.get(id);\n if (cached) return cached;\n const writer = writerFor(node.value, [...address, id], sink);\n (items ??= new Map()).set(id, writer);\n return writer;\n },\n remove: (input: string | readonly string[]) =>\n emit(sink, {\n type: 'entity.remove',\n at: address,\n ids: Array.isArray(input) ? [...input] : [input],\n }),\n };\n }\n if (node.kind === 'single') return writerFor(node.value, address, sink);\n if (node.kind === 'variant')\n return {\n replace: (value: unknown) => emit(sink, { type: 'variant.replace', at: address, value }),\n };\n\n let children: Map<string, unknown> | undefined;\n return new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property !== 'string' || !node.shape[property]) return undefined;\n const cached = children?.get(property);\n if (cached) return cached;\n const writer = writerFor(node.shape[property], [...address, property], sink);\n (children ??= new Map()).set(property, writer);\n return writer;\n },\n }\n );\n};\n\nexport const documentWriter = <TSchema extends DocumentSchema>(\n schema: TSchema,\n sink: OperationSink\n): DocumentWriter<TSchema> => writerFor(schemaRoot(schema), [], sink) as DocumentWriter<TSchema>;\n","import type { DocumentAddress } from '../schema';\nimport type { DocumentOperationUnion } from '../operations';\n\nexport type MutationIssueCode =\n | 'invalid-address'\n | 'invalid-operation'\n | 'unknown-operation'\n | 'required-field'\n | 'invalid-anchor'\n | 'duplicate-entity'\n | 'missing-entity'\n | 'invalid-collection'\n | 'invalid-list-keys'\n | 'invalid-list-key'\n | 'duplicate-list-item'\n | 'missing-list-item'\n | 'invalid-tree'\n | 'duplicate-tree-node'\n | 'missing-tree-parent'\n | 'invalid-tree-index'\n | 'missing-tree-node'\n | 'tree-cycle';\n\nexport type MutationIssue = {\n readonly source: 'mutation';\n readonly code: MutationIssueCode;\n readonly address: DocumentAddress;\n readonly message: string;\n readonly operation?: DocumentOperationUnion['type'];\n};\n\nconst ownAddress = (address: DocumentAddress): DocumentAddress => Object.freeze(address.slice());\n\nexport const at = (\n address: DocumentAddress,\n code: MutationIssueCode,\n message: string,\n operation?: DocumentOperationUnion['type']\n): MutationIssue =>\n Object.freeze({\n source: 'mutation',\n code,\n address: ownAddress(address),\n message,\n ...(operation === undefined ? {} : { operation }),\n });\n\nexport const from = (\n operation: DocumentOperationUnion,\n code: MutationIssueCode,\n message: string\n): MutationIssue => at(operation.at, code, message, operation.type);\n\nexport const input = (code: MutationIssueCode, message: string): MutationIssue =>\n at([], code, message);\n","import type { DocumentAnchor } from '../operations';\n\nexport type KeyOrder = {\n readonly length: number;\n readonly at: (index: number) => string | undefined;\n readonly index: (key: string) => number;\n};\n\ntype Keys = readonly string[] | KeyOrder;\n\nconst length = (keys: Keys): number => keys.length;\nconst keyAt = (keys: Keys, index: number): string | undefined =>\n Array.isArray(keys) ? keys[index] : keys.at(index);\nconst keyIndex = (keys: Keys, key: string): number =>\n Array.isArray(keys) ? keys.indexOf(key) : (keys as KeyOrder).index(key);\n\nexport const keys = (values: readonly unknown[], keyOf: (value: unknown) => string): KeyOrder => ({\n length: values.length,\n at: index => (index >= 0 && index < values.length ? keyOf(values[index]) : undefined),\n index: key => {\n for (let index = 0; index < values.length; index += 1)\n if (keyOf(values[index]) === key) return index;\n return -1;\n },\n});\n\nexport const index = (keys: Keys, anchor?: DocumentAnchor): number => {\n if (!anchor) return length(keys);\n if ('at' in anchor) return anchor.at === 'start' ? 0 : length(keys);\n if ('before' in anchor) return keyIndex(keys, anchor.before);\n return keyIndex(keys, anchor.after) + 1;\n};\n\nexport const at = (keys: Keys, position: number): DocumentAnchor =>\n position <= 0 ? { at: 'start' } : { after: keyAt(keys, position - 1) as string };\n\nexport const valid = (keys: Keys, anchor?: DocumentAnchor): boolean => {\n if (!anchor) return true;\n if (typeof anchor !== 'object' || anchor === null) return false;\n if (Number('at' in anchor) + Number('before' in anchor) + Number('after' in anchor) !== 1)\n return false;\n if ('at' in anchor) return anchor.at === 'start' || anchor.at === 'end';\n return keyIndex(keys, 'before' in anchor ? anchor.before : anchor.after) >= 0;\n};\n\nexport const afterRemove = (keys: Keys, removedIndex: number, anchor?: DocumentAnchor): number => {\n const position = index(keys, anchor);\n return position > removedIndex ? position - 1 : position;\n};\n\nexport const validPositions = (length: number, positions: readonly number[]): boolean => {\n let previous = -1;\n for (let index = 0; index < positions.length; index += 1) {\n const position = positions[index];\n if (\n !Number.isInteger(position) ||\n position < 0 ||\n position <= previous ||\n position > length + index\n )\n return false;\n previous = position;\n }\n return true;\n};\n\nexport const restore = (\n keys: string[],\n inserted: readonly string[],\n positions: readonly number[]\n): void => {\n const currentLength = keys.length;\n if (inserted.length !== positions.length || !validPositions(currentLength, positions))\n throw new Error('Ordered restore positions are invalid.');\n let readIndex = currentLength - 1;\n let insertedIndex = inserted.length - 1;\n keys.length = currentLength + inserted.length;\n for (let writeIndex = keys.length - 1; writeIndex >= 0; writeIndex -= 1) {\n if (insertedIndex >= 0 && positions[insertedIndex] === writeIndex) {\n keys[writeIndex] = inserted[insertedIndex];\n insertedIndex -= 1;\n } else {\n keys[writeIndex] = keys[readIndex];\n readIndex -= 1;\n }\n }\n};\n","import type { ResolvedAddress } from '../address';\nimport type { DocumentOperationUnion, EntityCreateOperation } from '../operations';\nimport type { DocumentNode } from '../schema';\nimport type { MutationOutcome } from './contract';\nimport * as anchor from './anchor';\nimport type { MutationIssueCode } from './issue';\nimport * as issue from './issue';\nimport { cloneValue, isRecord, transferPayload } from '../value/ownership';\n\ntype EntityOperation = Extract<\n DocumentOperationUnion,\n { type: 'entity.create' | 'entity.remove' | 'entity.move' }\n>;\n\ntype EntityNode = Extract<DocumentNode, { readonly kind: 'table' | 'map' }>;\n\nexport type EntityCollection =\n | {\n readonly kind: 'table';\n readonly ids: string[];\n readonly byId: Record<string, unknown>;\n }\n | {\n readonly kind: 'map';\n readonly byId: Record<string, unknown>;\n };\n\nexport type EntityCollectionResolution =\n | { readonly status: 'resolved'; readonly collection: EntityCollection }\n | { readonly status: 'invalid' };\n\nexport const resolveEntityCollection = (\n node: EntityNode,\n value: unknown\n): EntityCollectionResolution => {\n if (node.kind === 'table') {\n if (!isRecord(value) || !Array.isArray(value.ids) || !isRecord(value.byId))\n return { status: 'invalid' };\n // Table ids are canonical schema data. Validating every existing id for\n // each operation would turn a constant-address mutation into a full\n // collection scan; operation semantics validate the ids they touch.\n const ids = value.ids as string[];\n return {\n status: 'resolved',\n collection: { kind: 'table', ids, byId: value.byId },\n };\n }\n return isRecord(value)\n ? { status: 'resolved', collection: { kind: 'map', byId: value } }\n : { status: 'invalid' };\n};\n\nconst rejected = (\n operation: EntityOperation,\n code: MutationIssueCode,\n message: string\n): MutationOutcome => ({\n status: 'rejected',\n issue: issue.from(operation, code, message),\n});\n\nexport const executeEntity = (\n target: ResolvedAddress,\n operation: EntityOperation,\n copyPayload: boolean\n): MutationOutcome => {\n if (target.node.kind !== 'table' && target.node.kind !== 'map')\n return rejected(operation, 'invalid-address', 'Collection target is invalid.');\n const resolution = resolveEntityCollection(target.node, target.value);\n if (resolution.status === 'invalid')\n return rejected(operation, 'invalid-address', 'Collection target is invalid.');\n const collection = resolution.collection;\n const ids = collection.kind === 'table' ? collection.ids : undefined;\n if (operation.type === 'entity.move' && collection.kind === 'map')\n return rejected(operation, 'invalid-operation', 'Map entries are unordered.');\n const byId = collection.byId;\n\n if (operation.type === 'entity.create') {\n if (operation.entries.length === 0) return { status: 'unchanged' };\n const seen = new Set<string>();\n for (const entry of operation.entries) {\n if (seen.has(entry.id))\n return rejected(operation, 'duplicate-entity', 'Entity ids must be unique within a batch.');\n seen.add(entry.id);\n if (Object.prototype.hasOwnProperty.call(byId, entry.id))\n return rejected(operation, 'duplicate-entity', `Entity '${entry.id}' already exists.`);\n }\n if (collection.kind === 'map' && (operation.anchor || operation.positions))\n return rejected(operation, 'invalid-anchor', 'Map entries do not support ordering metadata.');\n if (ids && operation.positions) {\n if (\n operation.positions.length !== operation.entries.length ||\n !anchor.validPositions(ids.length, operation.positions)\n )\n return rejected(operation, 'invalid-operation', 'Entity restore positions are invalid.');\n } else if (ids && !anchor.valid(ids, operation.anchor))\n return rejected(operation, 'invalid-anchor', 'Collection anchor is invalid.');\n\n for (const entry of operation.entries)\n byId[entry.id] = copyPayload\n ? cloneValue(entry.value, 'canonical')\n : transferPayload(entry.value);\n if (ids) {\n if (operation.positions) {\n anchor.restore(\n ids,\n operation.entries.map(entry => entry.id),\n operation.positions\n );\n } else {\n if (!operation.anchor || ('at' in operation.anchor && operation.anchor.at === 'end')) {\n for (const entry of operation.entries) ids.push(entry.id);\n } else {\n const insertion = anchor.index(ids, operation.anchor);\n const currentLength = ids.length;\n ids.length = currentLength + operation.entries.length;\n for (let index = currentLength - 1; index >= insertion; index -= 1)\n ids[index + operation.entries.length] = ids[index];\n for (let index = 0; index < operation.entries.length; index += 1)\n ids[insertion + index] = operation.entries[index].id;\n }\n }\n }\n return {\n status: 'changed',\n inverse: [\n {\n type: 'entity.remove',\n at: operation.at,\n ids: operation.entries.map(entry => entry.id),\n },\n ],\n };\n }\n\n if (operation.type === 'entity.remove') {\n if (operation.ids.length === 0) return { status: 'unchanged' };\n const seen = new Set<string>();\n for (const id of operation.ids) {\n if (seen.has(id))\n return rejected(operation, 'duplicate-entity', 'Entity ids must be unique within a batch.');\n seen.add(id);\n if (!Object.prototype.hasOwnProperty.call(byId, id))\n return rejected(operation, 'missing-entity', `Entity '${id}' does not exist.`);\n }\n\n const entries: { id: string; value: unknown }[] = [];\n const positions: number[] = [];\n if (ids) {\n const positionsById = new Map<string, number>();\n for (let index = 0; index < ids.length; index += 1) {\n const id = ids[index];\n if (seen.has(id)) positionsById.set(id, index);\n }\n for (const id of operation.ids)\n if (!positionsById.has(id))\n return rejected(operation, 'invalid-collection', `Collection index is missing '${id}'.`);\n\n let writeIndex = 0;\n for (let index = 0; index < ids.length; index += 1) {\n const id = ids[index];\n if (seen.has(id)) {\n entries.push({ id, value: cloneValue(byId[id], 'inverse') });\n positions.push(index);\n delete byId[id];\n } else {\n ids[writeIndex++] = id;\n }\n }\n ids.length = writeIndex;\n } else {\n for (const id of operation.ids) {\n entries.push({ id, value: cloneValue(byId[id], 'inverse') });\n delete byId[id];\n }\n }\n const inverse: EntityCreateOperation = {\n type: 'entity.create',\n at: operation.at,\n entries,\n ...(ids ? { positions } : {}),\n };\n return { status: 'changed', inverse: [inverse] };\n }\n\n const exists = Object.prototype.hasOwnProperty.call(byId, operation.id);\n const position = ids?.indexOf(operation.id) ?? -1;\n if (!exists)\n return rejected(operation, 'missing-entity', `Entity '${operation.id}' does not exist.`);\n if (!ids || position < 0)\n return rejected(\n operation,\n 'invalid-collection',\n `Collection index is missing '${operation.id}'.`\n );\n if (!anchor.valid(ids, operation.anchor))\n return rejected(operation, 'invalid-anchor', 'Collection anchor is invalid.');\n if (\n operation.anchor &&\n (('before' in operation.anchor && operation.anchor.before === operation.id) ||\n ('after' in operation.anchor && operation.anchor.after === operation.id))\n )\n return rejected(operation, 'invalid-anchor', 'An entity cannot be moved relative to itself.');\n const nextIndex = anchor.afterRemove(ids, position, operation.anchor);\n if (nextIndex === position) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'entity.move',\n at: operation.at,\n id: operation.id,\n anchor: anchor.at(ids, position),\n };\n ids.splice(position, 1);\n ids.splice(nextIndex, 0, operation.id);\n return { status: 'changed', inverse: [inverse] };\n};\n","import type { ResolvedAddress } from '../address';\nimport type { DocumentOperationUnion } from '../operations';\nimport type { MutationOutcome } from './contract';\nimport * as anchor from './anchor';\nimport type { MutationIssueCode } from './issue';\nimport * as issue from './issue';\nimport { cloneValue, ownPayload, sameStructuralValue } from '../value/ownership';\n\ntype ListOperation = Extract<\n DocumentOperationUnion,\n { type: 'list.insert' | 'list.move' | 'list.remove' | 'list.replace' }\n>;\n\nconst rejected = (\n operation: ListOperation,\n code: MutationIssueCode,\n message: string\n): MutationOutcome => ({\n status: 'rejected',\n issue: issue.from(operation, code, message),\n});\n\nexport const executeList = (\n target: ResolvedAddress,\n operation: ListOperation,\n copyPayload: boolean\n): MutationOutcome => {\n if (!Array.isArray(target.value) || target.node.kind !== 'list')\n return rejected(operation, 'invalid-address', 'List target is invalid.');\n const list = target.value;\n const orderedKeys = anchor.keys(list, target.node.keyOf);\n const own = <T>(value: T): T => (copyPayload ? ownPayload(value) : value);\n\n if (operation.type === 'list.replace') {\n if (operation.keys.length !== operation.value.length)\n return rejected(operation, 'invalid-list-keys', 'List replacement keys are invalid.');\n const seen = new Set<string>();\n for (let index = 0; index < operation.value.length; index += 1) {\n const key = operation.keys[index];\n if (seen.has(key) || target.node.keyOf(operation.value[index]) !== key)\n return rejected(operation, 'invalid-list-keys', 'List replacement keys are invalid.');\n seen.add(key);\n }\n if (sameStructuralValue(list, operation.value)) return { status: 'unchanged' };\n const keys = new Array<string>(list.length);\n for (let index = 0; index < list.length; index += 1)\n keys[index] = target.node.keyOf(list[index]);\n const inverse: DocumentOperationUnion = {\n type: 'list.replace',\n at: operation.at,\n value: cloneValue(list, 'inverse'),\n keys,\n };\n const owned = own(operation.value) as unknown[];\n list.length = owned.length;\n for (let index = 0; index < owned.length; index += 1) list[index] = owned[index];\n return { status: 'changed', inverse: [inverse] };\n }\n\n if (operation.type === 'list.insert') {\n if (target.node.keyOf(operation.value) !== operation.key)\n return rejected(operation, 'invalid-list-key', 'List item key does not match schema.');\n if (orderedKeys.index(operation.key) >= 0)\n return rejected(\n operation,\n 'duplicate-list-item',\n `List item '${operation.key}' already exists.`\n );\n if (!anchor.valid(orderedKeys, operation.anchor))\n return rejected(operation, 'invalid-anchor', 'List anchor is invalid.');\n list.splice(anchor.index(orderedKeys, operation.anchor), 0, own(operation.value));\n return {\n status: 'changed',\n inverse: [{ type: 'list.remove', at: operation.at, key: operation.key }],\n };\n }\n\n const position = orderedKeys.index(operation.key);\n if (position < 0)\n return rejected(operation, 'missing-list-item', `List item '${operation.key}' does not exist.`);\n if (operation.type === 'list.remove') {\n const inverse: DocumentOperationUnion = {\n type: 'list.insert',\n at: operation.at,\n key: operation.key,\n value: cloneValue(list[position], 'inverse'),\n anchor: anchor.at(orderedKeys, position),\n };\n list.splice(position, 1);\n return { status: 'changed', inverse: [inverse] };\n }\n if (!anchor.valid(orderedKeys, operation.anchor))\n return rejected(operation, 'invalid-anchor', 'List anchor is invalid.');\n if (\n operation.anchor &&\n (('before' in operation.anchor && operation.anchor.before === operation.key) ||\n ('after' in operation.anchor && operation.anchor.after === operation.key))\n )\n return rejected(operation, 'invalid-anchor', 'A list item cannot be moved relative to itself.');\n const nextIndex = anchor.afterRemove(orderedKeys, position, operation.anchor);\n if (nextIndex === position) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'list.move',\n at: operation.at,\n key: operation.key,\n anchor: anchor.at(orderedKeys, position),\n };\n const [entry] = list.splice(position, 1);\n list.splice(nextIndex, 0, entry);\n return { status: 'changed', inverse: [inverse] };\n};\n","import type { DocumentAddress, DocumentNode, DocumentSchema } from '../schema';\nimport type { DocumentOperationUnion } from '../operations';\nimport { cloneValue, isRecord, ownPayload, sameStructuralValue } from '../value/ownership';\n\ntype TreeOperation = Extract<\n DocumentOperationUnion,\n {\n type: 'tree.insert' | 'tree.move' | 'tree.remove' | 'tree.set' | 'tree.replace';\n }\n>;\n\ntype MutableTreeNode = {\n parentId?: string;\n children: string[];\n value?: unknown;\n};\n\nexport type MutableTree = {\n rootId?: string;\n nodes: Record<string, MutableTreeNode>;\n};\n\nexport type TreeOutcome =\n | {\n readonly status: 'changed';\n readonly inverse: readonly DocumentOperationUnion[];\n }\n | { readonly status: 'unchanged' }\n | {\n readonly status: 'rejected';\n readonly code:\n | 'invalid-tree'\n | 'duplicate-tree-node'\n | 'missing-tree-parent'\n | 'invalid-tree-index'\n | 'missing-tree-node'\n | 'tree-cycle';\n readonly message: string;\n };\n\ntype TreeNodePresence =\n | { readonly status: 'absent' }\n | {\n readonly status: 'present';\n readonly parentId?: string;\n readonly children: readonly string[];\n readonly value: unknown;\n };\n\ntype TreeRootPresence =\n { readonly status: 'absent' } | { readonly status: 'present'; readonly id: string };\n\nexport type TreeChange =\n | {\n readonly mode: 'incremental';\n readonly root: TreeRootPresence;\n readonly nodes: Map<string, TreeNodePresence>;\n }\n | { readonly mode: 'whole'; readonly value: unknown };\n\nconst has = (value: object, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\nconst validIndex = (index: number | undefined): boolean =>\n index === undefined || (Number.isInteger(index) && index >= 0);\nconst rejected = (\n code: Extract<TreeOutcome, { status: 'rejected' }>['code'],\n message: string\n): TreeOutcome => ({ status: 'rejected', code, message });\n\nconst node = (tree: MutableTree, id: string): MutableTreeNode | undefined => tree.nodes[id];\nconst childIndex = (parent: MutableTreeNode, id: string): number => parent.children.indexOf(id);\nconst sameOrder = (left: readonly string[], right: readonly string[]): boolean => {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1)\n if (left[index] !== right[index]) return false;\n return true;\n};\n\nconst rootPresence = (id: string | undefined): TreeRootPresence =>\n id === undefined ? { status: 'absent' } : { status: 'present', id };\n\nconst capture = (\n change: Extract<TreeChange, { readonly mode: 'incremental' }>,\n id: string,\n presence: TreeNodePresence\n): void => {\n if (!change.nodes.has(id)) change.nodes.set(id, presence);\n};\n\nconst without = (values: readonly string[], id: string): string[] => {\n const result: string[] = [];\n for (const value of values) if (value !== id) result.push(value);\n return result;\n};\n\nconst inserted = (values: readonly string[], id: string, index: number): string[] => {\n const result = [...values];\n result.splice(Math.min(index, result.length), 0, id);\n return result;\n};\n\nconst moved = (values: readonly string[], id: string, index: number): string[] => {\n const result = without(values, id);\n result.splice(Math.min(index, result.length), 0, id);\n return result;\n};\n\nconst parentPresence = (\n tree: MutableTree,\n id: string,\n children: readonly string[]\n): TreeNodePresence => {\n const entry = node(tree, id);\n return entry\n ? {\n status: 'present',\n ...(entry.parentId === undefined ? {} : { parentId: entry.parentId }),\n children,\n value: entry.value,\n }\n : { status: 'absent' };\n};\n\nconst restoreIncremental = (\n value: unknown,\n change: Extract<TreeChange, { readonly mode: 'incremental' }>\n): unknown => {\n if (!is(value)) return value;\n if (change.root.status === 'absent') delete value.rootId;\n else value.rootId = change.root.id;\n for (const [id, before] of change.nodes) {\n if (before.status === 'absent') {\n delete value.nodes[id];\n continue;\n }\n value.nodes[id] = {\n ...(before.parentId === undefined ? {} : { parentId: before.parentId }),\n children: [...before.children],\n value: before.value,\n };\n }\n return value;\n};\n\nexport const restoreChange = (value: unknown, change: TreeChange): unknown =>\n change.mode === 'whole' ? ownPayload(change.value, 'journal') : restoreIncremental(value, change);\n\nconst wholeChange = (\n inverse: Extract<TreeOperation, { readonly type: 'tree.replace' }>,\n previous?: TreeChange\n): TreeChange => {\n if (!previous) return { mode: 'whole', value: inverse.value };\n if (previous.mode === 'whole') return previous;\n return {\n mode: 'whole',\n value: restoreIncremental(ownPayload(inverse.value, 'journal'), previous),\n };\n};\n\nconst removedNodePresences = (\n inverses: readonly Extract<TreeOperation, { readonly type: 'tree.insert' }>[]\n): Map<string, TreeNodePresence> => {\n const children = new Map<string, Array<{ readonly id: string; readonly index: number }>>();\n for (const inverse of inverses) {\n if (inverse.parentId === undefined) continue;\n const entries = children.get(inverse.parentId);\n const child = { id: inverse.treeNodeId, index: inverse.index ?? Number.MAX_SAFE_INTEGER };\n if (entries) entries.push(child);\n else children.set(inverse.parentId, [child]);\n }\n const result = new Map<string, TreeNodePresence>();\n for (const inverse of inverses) {\n const ordered = children.get(inverse.treeNodeId) ?? [];\n ordered.sort((left, right) => left.index - right.index);\n result.set(inverse.treeNodeId, {\n status: 'present',\n ...(inverse.parentId === undefined ? {} : { parentId: inverse.parentId }),\n children: ordered.map(entry => entry.id),\n value: inverse.value,\n });\n }\n return result;\n};\n\nexport const recordChange = (\n previous: TreeChange | undefined,\n current: MutableTree,\n forward: TreeOperation,\n inverses: readonly TreeOperation[]\n): TreeChange => {\n const replacement = inverses[0];\n if (replacement?.type === 'tree.replace') return wholeChange(replacement, previous);\n if (previous?.mode === 'whole') return previous;\n\n const change: Extract<TreeChange, { readonly mode: 'incremental' }> = previous ?? {\n mode: 'incremental',\n root:\n forward.type === 'tree.insert' && forward.parentId === undefined\n ? { status: 'absent' }\n : forward.type === 'tree.remove' && inverses[0]?.type === 'tree.insert'\n ? rootPresence(\n inverses[0].parentId === undefined ? inverses[0].treeNodeId : current.rootId\n )\n : rootPresence(current.rootId),\n nodes: new Map(),\n };\n\n if (forward.type === 'tree.insert') {\n capture(change, forward.treeNodeId, { status: 'absent' });\n if (forward.parentId !== undefined) {\n const parentNode = node(current, forward.parentId);\n if (parentNode)\n capture(\n change,\n forward.parentId,\n parentPresence(\n current,\n forward.parentId,\n without(parentNode.children, forward.treeNodeId)\n )\n );\n }\n return change;\n }\n\n if (forward.type === 'tree.remove') {\n const inserts = inverses.filter(\n (inverse): inverse is Extract<TreeOperation, { readonly type: 'tree.insert' }> =>\n inverse.type === 'tree.insert'\n );\n const removed = removedNodePresences(inserts);\n for (const [id, presence] of removed) capture(change, id, presence);\n const first = inserts[0];\n if (first?.parentId !== undefined) {\n const parentNode = node(current, first.parentId);\n if (parentNode)\n capture(\n change,\n first.parentId,\n parentPresence(\n current,\n first.parentId,\n inserted(\n parentNode.children,\n first.treeNodeId,\n first.index ?? parentNode.children.length\n )\n )\n );\n }\n return change;\n }\n\n if (forward.type === 'tree.set') {\n const inverse = inverses[0];\n const entry = node(current, forward.treeNodeId);\n if (entry && inverse?.type === 'tree.set')\n capture(change, forward.treeNodeId, {\n status: 'present',\n ...(entry.parentId === undefined ? {} : { parentId: entry.parentId }),\n children: [...entry.children],\n value: inverse.value,\n });\n return change;\n }\n\n if (forward.type === 'tree.move') {\n const inverse = inverses[0];\n const entry = node(current, forward.treeNodeId);\n if (!entry || inverse?.type !== 'tree.move' || inverse.parentId === undefined) return change;\n capture(change, forward.treeNodeId, {\n status: 'present',\n parentId: inverse.parentId,\n children: [...entry.children],\n value: entry.value,\n });\n const oldParent = node(current, inverse.parentId);\n if (oldParent) {\n const children =\n inverse.parentId === forward.parentId\n ? moved(\n oldParent.children,\n forward.treeNodeId,\n inverse.index ?? oldParent.children.length\n )\n : inserted(\n oldParent.children,\n forward.treeNodeId,\n inverse.index ?? oldParent.children.length\n );\n capture(change, inverse.parentId, parentPresence(current, inverse.parentId, children));\n }\n if (forward.parentId !== undefined && forward.parentId !== inverse.parentId) {\n const nextParent = node(current, forward.parentId);\n if (nextParent)\n capture(\n change,\n forward.parentId,\n parentPresence(\n current,\n forward.parentId,\n without(nextParent.children, forward.treeNodeId)\n )\n );\n }\n }\n return change;\n};\n\nconst sameNodePresence = (\n before: TreeNodePresence,\n value: MutableTreeNode | undefined\n): boolean => {\n if (before.status === 'absent') return value === undefined;\n return (\n value !== undefined &&\n before.parentId === value.parentId &&\n sameOrder(before.children, value.children) &&\n sameStructuralValue(before.value, value.value)\n );\n};\n\nexport const changeChanged = (change: TreeChange, value: unknown): boolean => {\n if (change.mode === 'whole') return !sameStructuralValue(change.value, value);\n if (!is(value)) return true;\n const rootId = change.root.status === 'present' ? change.root.id : undefined;\n if (rootId !== value.rootId) return true;\n for (const [id, before] of change.nodes)\n if (!sameNodePresence(before, node(value, id))) return true;\n return false;\n};\n\nexport const is = (value: unknown): value is MutableTree =>\n isRecord(value) && isRecord(value.nodes);\n\nexport const contains = (tree: MutableTree, id: string): boolean => has(tree.nodes, id);\n\nexport const parent = (tree: MutableTree, id: string): string | undefined =>\n node(tree, id)?.parentId;\n\nexport const children = (tree: MutableTree, id: string): readonly string[] | undefined =>\n node(tree, id)?.children;\n\nexport const validate = (value: unknown): value is MutableTree => {\n if (!is(value)) return false;\n const ids = Object.keys(value.nodes);\n if (ids.length === 0) return value.rootId === undefined;\n if (typeof value.rootId !== 'string' || !has(value.nodes, value.rootId)) return false;\n\n for (const id of ids) {\n const entry = value.nodes[id];\n if (!isRecord(entry) || !Array.isArray(entry.children)) return false;\n if (\n entry.children.some(child => typeof child !== 'string') ||\n new Set(entry.children).size !== entry.children.length\n )\n return false;\n if (entry.parentId !== undefined && typeof entry.parentId !== 'string') return false;\n if (id === value.rootId) {\n if (entry.parentId !== undefined) return false;\n } else if (entry.parentId === undefined || !has(value.nodes, entry.parentId)) return false;\n for (const child of entry.children) {\n const childNode = value.nodes[child];\n if (!childNode || childNode.parentId !== id) return false;\n }\n }\n\n const seen = new Set<string>();\n const stack = [value.rootId];\n while (stack.length) {\n const id = stack.pop() as string;\n if (seen.has(id)) return false;\n seen.add(id);\n const entry = value.nodes[id];\n if (!entry) return false;\n for (const child of entry.children) stack.push(child);\n }\n return seen.size === ids.length;\n};\n\nconst documentTreeError = (\n node: DocumentNode,\n value: unknown,\n address: DocumentAddress\n): DocumentAddress | undefined => {\n if ('optional' in node && node.optional && value === undefined) return undefined;\n if (node.kind === 'tree') return validate(value) ? undefined : address;\n if (node.kind === 'object') {\n if (!isRecord(value)) return undefined;\n for (const [key, child] of Object.entries(node.shape)) {\n const error = documentTreeError(child, value[key], [...address, key]);\n if (error) return error;\n }\n return undefined;\n }\n if (node.kind === 'single') return documentTreeError(node.value, value, address);\n if (node.kind === 'variant') {\n if (!isRecord(value) || typeof value[node.tag] !== 'string') return undefined;\n const variant = node.variants[value[node.tag] as keyof typeof node.variants];\n return variant ? documentTreeError(variant, value, address) : undefined;\n }\n if (node.kind === 'table') {\n if (!isRecord(value) || !isRecord(value.byId)) return undefined;\n for (const [id, entry] of Object.entries(value.byId)) {\n const error = documentTreeError(node.value, entry, [...address, id]);\n if (error) return error;\n }\n return undefined;\n }\n if (node.kind === 'map') {\n if (!isRecord(value)) return undefined;\n for (const [id, entry] of Object.entries(value)) {\n const error = documentTreeError(node.value, entry, [...address, id]);\n if (error) return error;\n }\n }\n return undefined;\n};\n\nexport const invalidDocument = (\n schema: DocumentSchema,\n value: unknown\n): DocumentAddress | undefined =>\n documentTreeError({ kind: 'object', shape: schema.shape }, value, []);\n\nexport const replace = (\n current: MutableTree,\n operation: Extract<TreeOperation, { type: 'tree.replace' }>\n): TreeOutcome => {\n if (!validate(operation.value)) return rejected('invalid-tree', 'Tree replacement is malformed.');\n if (sameStructuralValue(current, operation.value)) return { status: 'unchanged' };\n return {\n status: 'changed',\n inverse: [\n {\n type: 'tree.replace',\n at: operation.at,\n value: cloneValue(current, 'inverse'),\n },\n ],\n };\n};\n\nexport const insert = (\n tree: MutableTree,\n operation: Extract<TreeOperation, { type: 'tree.insert' }>,\n value: unknown\n): TreeOutcome => {\n if (contains(tree, operation.treeNodeId))\n return rejected('duplicate-tree-node', `Tree node '${operation.treeNodeId}' already exists.`);\n if (!validIndex(operation.index)) return rejected('invalid-tree-index', 'Tree index is invalid.');\n\n if (tree.rootId === undefined) {\n if (operation.parentId !== undefined)\n return rejected('missing-tree-parent', `Tree parent '${operation.parentId}' does not exist.`);\n tree.nodes[operation.treeNodeId] = { children: [], value };\n tree.rootId = operation.treeNodeId;\n } else {\n if (operation.parentId === undefined)\n return rejected('invalid-tree', 'A non-empty tree has exactly one root.');\n const parentNode = node(tree, operation.parentId);\n if (!parentNode)\n return rejected('missing-tree-parent', `Tree parent '${operation.parentId}' does not exist.`);\n tree.nodes[operation.treeNodeId] = {\n parentId: operation.parentId,\n children: [],\n value,\n };\n parentNode.children.splice(\n Math.min(operation.index ?? parentNode.children.length, parentNode.children.length),\n 0,\n operation.treeNodeId\n );\n }\n return {\n status: 'changed',\n inverse: [\n {\n type: 'tree.remove',\n at: operation.at,\n treeNodeId: operation.treeNodeId,\n },\n ],\n };\n};\n\nexport const set = (\n tree: MutableTree,\n operation: Extract<TreeOperation, { type: 'tree.set' }>,\n value: unknown\n): TreeOutcome => {\n const entry = node(tree, operation.treeNodeId);\n if (!entry)\n return rejected('missing-tree-node', `Tree node '${operation.treeNodeId}' does not exist.`);\n if (Object.is(entry.value, value)) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'tree.set',\n at: operation.at,\n treeNodeId: operation.treeNodeId,\n value: cloneValue(entry.value, 'inverse'),\n };\n entry.value = value;\n return { status: 'changed', inverse: [inverse] };\n};\n\nexport const remove = (\n tree: MutableTree,\n operation: Extract<TreeOperation, { type: 'tree.remove' }>\n): TreeOutcome => {\n const first = node(tree, operation.treeNodeId);\n if (!first)\n return rejected('missing-tree-node', `Tree node '${operation.treeNodeId}' does not exist.`);\n const parentId = first.parentId;\n const parentNode = parentId === undefined ? undefined : node(tree, parentId);\n const originalIndex = parentNode ? childIndex(parentNode, operation.treeNodeId) : 0;\n if (\n (parentId !== undefined && (!parentNode || originalIndex < 0)) ||\n (parentId === undefined && tree.rootId !== operation.treeNodeId)\n )\n return rejected('invalid-tree', 'Tree parent links are inconsistent.');\n\n const entries: Array<{\n readonly id: string;\n readonly parentId?: string;\n readonly index: number;\n readonly value: unknown;\n }> = [];\n const seen = new Set<string>();\n const stack: Array<{\n readonly id: string;\n readonly parentId?: string;\n readonly index: number;\n }> = [{ id: operation.treeNodeId, parentId, index: originalIndex }];\n while (stack.length) {\n const frame = stack.pop() as (typeof stack)[number];\n const entry = node(tree, frame.id);\n if (!entry || seen.has(frame.id) || entry.parentId !== frame.parentId)\n return rejected('invalid-tree', 'Tree contains an invalid descendant.');\n seen.add(frame.id);\n entries.push({\n id: frame.id,\n parentId: frame.parentId,\n index: frame.index,\n value: cloneValue(entry.value, 'inverse'),\n });\n for (let index = entry.children.length - 1; index >= 0; index -= 1) {\n const childId = entry.children[index];\n const child = node(tree, childId);\n if (!child || child.parentId !== frame.id)\n return rejected('invalid-tree', 'Tree child links are inconsistent.');\n stack.push({ id: childId, parentId: frame.id, index });\n }\n }\n\n if (parentNode) parentNode.children.splice(originalIndex, 1);\n for (let index = entries.length - 1; index >= 0; index -= 1) delete tree.nodes[entries[index].id];\n if (tree.rootId === operation.treeNodeId) delete tree.rootId;\n return {\n status: 'changed',\n inverse: entries.map(entry => ({\n type: 'tree.insert' as const,\n at: operation.at,\n treeNodeId: entry.id,\n ...(entry.parentId === undefined ? {} : { parentId: entry.parentId }),\n index: entry.index,\n value: entry.value,\n })),\n };\n};\n\nexport const move = (\n tree: MutableTree,\n operation: Extract<TreeOperation, { type: 'tree.move' }>\n): TreeOutcome => {\n const entry = node(tree, operation.treeNodeId);\n if (!entry)\n return rejected('missing-tree-node', `Tree node '${operation.treeNodeId}' does not exist.`);\n if (!validIndex(operation.index)) return rejected('invalid-tree-index', 'Tree index is invalid.');\n if (tree.rootId === operation.treeNodeId)\n return rejected('invalid-tree', 'The root cannot be moved.');\n if (operation.parentId === undefined) {\n return rejected('invalid-tree', 'Only the root can have no parent.');\n }\n const nextParent = node(tree, operation.parentId);\n if (!nextParent)\n return rejected('missing-tree-parent', `Tree parent '${operation.parentId}' does not exist.`);\n if (operation.parentId === operation.treeNodeId)\n return rejected('tree-cycle', 'A tree node cannot parent itself.');\n\n const descendants = [operation.treeNodeId];\n const seen = new Set<string>();\n while (descendants.length) {\n const id = descendants.pop() as string;\n if (seen.has(id)) return rejected('invalid-tree', 'Tree contains a cycle.');\n seen.add(id);\n const current = node(tree, id);\n if (!current) return rejected('invalid-tree', 'Tree contains a missing node.');\n for (const childId of current.children) {\n const child = node(tree, childId);\n if (!child || child.parentId !== id)\n return rejected('invalid-tree', 'Tree child links are inconsistent.');\n if (childId === operation.parentId)\n return rejected('tree-cycle', 'Tree move would create a cycle.');\n descendants.push(childId);\n }\n }\n\n const parentId = entry.parentId;\n const currentParent = parentId === undefined ? undefined : node(tree, parentId);\n if (!currentParent || parentId === undefined)\n return rejected('invalid-tree', 'Tree parent links are inconsistent.');\n const originalIndex = childIndex(currentParent, operation.treeNodeId);\n if (originalIndex < 0) return rejected('invalid-tree', 'Tree parent links are inconsistent.');\n let nextIndex = Math.min(\n operation.index ?? nextParent.children.length,\n nextParent.children.length\n );\n currentParent.children.splice(originalIndex, 1);\n if (parentId === operation.parentId && nextIndex > originalIndex) nextIndex -= 1;\n if (parentId === operation.parentId && nextIndex === originalIndex) {\n currentParent.children.splice(originalIndex, 0, operation.treeNodeId);\n return { status: 'unchanged' };\n }\n nextParent.children.splice(nextIndex, 0, operation.treeNodeId);\n entry.parentId = operation.parentId;\n return {\n status: 'changed',\n inverse: [\n {\n type: 'tree.move',\n at: operation.at,\n treeNodeId: operation.treeNodeId,\n parentId,\n index: originalIndex,\n },\n ],\n };\n};\n","import { set as setAddress } from '../address';\nimport type { ResolvedAddress } from '../address';\nimport type { DocumentOperationUnion } from '../operations';\nimport type { MutationOutcome } from './contract';\nimport * as issue from './issue';\nimport * as tree from './tree';\nimport { ownPayload } from '../value/ownership';\n\ntype TreeOperation = Extract<\n DocumentOperationUnion,\n {\n type: 'tree.insert' | 'tree.move' | 'tree.remove' | 'tree.set' | 'tree.replace';\n }\n>;\n\nconst outcome = (operation: TreeOperation, value: tree.TreeOutcome): MutationOutcome =>\n value.status === 'rejected'\n ? {\n status: 'rejected',\n issue: issue.from(operation, value.code, value.message),\n }\n : value;\n\nexport const executeTree = (\n root: unknown,\n target: ResolvedAddress,\n operation: TreeOperation,\n copyPayload: boolean\n): MutationOutcome => {\n if (!tree.is(target.value))\n return {\n status: 'rejected',\n issue: issue.from(operation, 'invalid-address', 'Tree target is invalid.'),\n };\n const own = <T>(value: T): T => (copyPayload ? ownPayload(value) : value);\n if (operation.type === 'tree.replace') {\n const result = tree.replace(target.value, operation);\n if (result.status === 'changed') setAddress(root, operation.at, ownPayload(operation.value));\n return outcome(operation, result);\n }\n if (operation.type === 'tree.insert')\n return outcome(operation, tree.insert(target.value, operation, own(operation.value)));\n if (operation.type === 'tree.set')\n return outcome(operation, tree.set(target.value, operation, own(operation.value)));\n if (operation.type === 'tree.remove')\n return outcome(operation, tree.remove(target.value, operation));\n return outcome(operation, tree.move(target.value, operation));\n};\n","import type { ResolvedAddress } from '../address';\nimport type { DocumentOperationUnion } from '../operations';\nimport type { MutationOutcome } from './contract';\nimport * as issue from './issue';\nimport { cloneValue, isRecord, ownPayload, sameStructuralValue } from '../value/ownership';\n\ntype ValueOperation = Extract<\n DocumentOperationUnion,\n {\n type:\n 'field.set' | 'field.clear' | 'variant.replace' | 'dict.set' | 'dict.delete' | 'dict.replace';\n }\n>;\n\nconst rejected = (\n operation: ValueOperation,\n code: Extract<import('./issue').MutationIssueCode, 'invalid-address' | 'required-field'>,\n message: string\n): MutationOutcome => ({\n status: 'rejected',\n issue: issue.from(operation, code, message),\n});\n\nexport const executeValue = (\n target: ResolvedAddress,\n operation: ValueOperation,\n copyPayload: boolean\n): MutationOutcome => {\n const own = <T>(value: T): T => (copyPayload ? ownPayload(value) : value);\n\n if (operation.type === 'field.set' || operation.type === 'field.clear') {\n const existed = Object.prototype.hasOwnProperty.call(target.parent, target.key);\n if (operation.type === 'field.clear') {\n if (target.node.kind !== 'field' || !target.node.optional)\n return rejected(operation, 'required-field', 'Only optional fields can be cleared.');\n if (!existed) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'field.set',\n at: operation.at,\n value: target.value,\n };\n delete (target.parent as Record<string | number, unknown>)[target.key];\n return { status: 'changed', inverse: [inverse] };\n }\n if (existed && Object.is(target.value, operation.value)) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = existed\n ? { type: 'field.set', at: operation.at, value: target.value }\n : { type: 'field.clear', at: operation.at };\n (target.parent as Record<string | number, unknown>)[target.key] = operation.value;\n return { status: 'changed', inverse: [inverse] };\n }\n\n if (operation.type === 'variant.replace') {\n if (sameStructuralValue(target.value, operation.value)) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'variant.replace',\n at: operation.at,\n value: ownPayload(target.value, 'inverse'),\n };\n (target.parent as Record<string | number, unknown>)[target.key] = own(operation.value);\n return { status: 'changed', inverse: [inverse] };\n }\n\n if (!isRecord(target.value))\n return rejected(operation, 'invalid-address', 'Dictionary target is invalid.');\n if (operation.type === 'dict.replace') {\n if (sameStructuralValue(target.value, operation.value)) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'dict.replace',\n at: operation.at,\n value: cloneValue(target.value, 'inverse'),\n };\n (target.parent as Record<string | number, unknown>)[target.key] = own(operation.value);\n return { status: 'changed', inverse: [inverse] };\n }\n const existed = Object.prototype.hasOwnProperty.call(target.value, operation.key);\n if (operation.type === 'dict.delete') {\n if (!existed) return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = {\n type: 'dict.set',\n at: operation.at,\n key: operation.key,\n value: target.value[operation.key],\n };\n delete target.value[operation.key];\n return { status: 'changed', inverse: [inverse] };\n }\n if (existed && Object.is(target.value[operation.key], operation.value))\n return { status: 'unchanged' };\n const inverse: DocumentOperationUnion = existed\n ? {\n type: 'dict.set',\n at: operation.at,\n key: operation.key,\n value: target.value[operation.key],\n }\n : { type: 'dict.delete', at: operation.at, key: operation.key };\n target.value[operation.key] = operation.value;\n return { status: 'changed', inverse: [inverse] };\n};\n","import type { ResolvedAddress } from '../address';\nimport type { DocumentOperationUnion } from '../operations';\nimport type { MutationOutcome } from './contract';\nimport * as issue from './issue';\nimport { executeEntity } from './execute-entity';\nimport { executeList } from './execute-list';\nimport { executeTree } from './execute-tree';\nimport { executeValue } from './execute-value';\n\nconst invalidTarget = (operation: DocumentOperationUnion): MutationOutcome => ({\n status: 'rejected',\n issue: issue.from(\n operation,\n 'invalid-address',\n `Operation '${operation.type}' does not match the schema address.`\n ),\n});\n\n// Operations reach this dispatcher only after operation.decode and\n// operation.normalize. Executors therefore only validate their domain-specific\n// semantics against one resolved schema address.\nexport const execute = (\n root: unknown,\n operation: DocumentOperationUnion,\n target: ResolvedAddress | undefined,\n copyPayload: boolean\n): MutationOutcome => {\n if (operation.type === 'field.set' || operation.type === 'field.clear')\n return !target || target.node.kind !== 'field'\n ? invalidTarget(operation)\n : executeValue(target, operation, copyPayload);\n\n if (operation.type === 'variant.replace')\n return !target || target.node.kind !== 'variant'\n ? invalidTarget(operation)\n : executeValue(target, operation, copyPayload);\n\n if (\n operation.type === 'dict.set' ||\n operation.type === 'dict.delete' ||\n operation.type === 'dict.replace'\n )\n return !target || (target.node.kind !== 'dict' && target.node.kind !== 'record')\n ? invalidTarget(operation)\n : executeValue(target, operation, copyPayload);\n\n if (\n operation.type === 'entity.create' ||\n operation.type === 'entity.remove' ||\n operation.type === 'entity.move'\n )\n return !target || (target.node.kind !== 'table' && target.node.kind !== 'map')\n ? invalidTarget(operation)\n : executeEntity(target, operation, copyPayload);\n\n if (\n operation.type === 'list.insert' ||\n operation.type === 'list.move' ||\n operation.type === 'list.remove' ||\n operation.type === 'list.replace'\n )\n return !target || target.node.kind !== 'list'\n ? invalidTarget(operation)\n : executeList(target, operation, copyPayload);\n\n if (\n operation.type === 'tree.insert' ||\n operation.type === 'tree.move' ||\n operation.type === 'tree.remove' ||\n operation.type === 'tree.set' ||\n operation.type === 'tree.replace'\n )\n return !target || target.node.kind !== 'tree'\n ? invalidTarget(operation)\n : executeTree(root, target, operation, copyPayload);\n\n return {\n status: 'rejected',\n issue: issue.from(operation, 'unknown-operation', 'Unknown document operation.'),\n };\n};\n","import { locate, read } from '../address';\nimport type { ResolvedAddress } from '../address';\nimport type { DocumentAnchor, DocumentOperationUnion } from '../operations';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport { profile } from '../profile';\nimport { isRecord, ownPayload, sameStructuralValue } from '../value/ownership';\nimport * as anchor from './anchor';\nimport type { MutationCollectionChange } from './contract';\nimport {\n resolveEntityCollection,\n type EntityCollection,\n type EntityCollectionResolution,\n} from './execute-entity';\nimport * as tree from './tree';\n\ntype CollectionContext = NonNullable<ResolvedAddress['collection']>;\ntype ListNode = Extract<DocumentNode, { readonly kind: 'list' }>;\ntype EntityNode = Extract<DocumentNode, { readonly kind: 'table' | 'map' }>;\n\ntype Presence =\n { readonly status: 'absent' } | { readonly status: 'present'; readonly value: unknown };\n\ntype SubjectBase = {\n readonly address: DocumentAddress;\n readonly addressHash: number;\n readonly collection?: CollectionContext;\n};\n\ntype ValueSubject = SubjectBase & {\n readonly kind: 'value';\n readonly before: Presence;\n};\n\ntype VariantSubject = SubjectBase & {\n readonly kind: 'variant';\n readonly before: unknown;\n};\n\ntype DictState =\n | { readonly mode: 'incremental'; readonly entries: Map<string, Presence> }\n | { readonly mode: 'whole'; readonly value: Readonly<Record<string, unknown>> };\n\ntype DictSubject = SubjectBase & {\n readonly kind: 'dict';\n state: DictState;\n};\n\ntype EntityOrderInverse =\n | { readonly kind: 'remove'; readonly ids: readonly string[] }\n | {\n readonly kind: 'restore';\n readonly ids: readonly string[];\n readonly positions: readonly number[];\n }\n | { readonly kind: 'move'; readonly id: string; readonly anchor?: DocumentAnchor };\n\ntype EntityOrder =\n | { readonly kind: 'unordered' }\n | { readonly kind: 'stable'; readonly inverses: EntityOrderInverse[] }\n | { readonly kind: 'tracked'; readonly before: readonly string[] };\n\ntype EntitySubject = SubjectBase & {\n readonly kind: 'entity';\n readonly node: EntityNode;\n readonly entries: Map<string, Presence>;\n order: EntityOrder;\n};\n\ntype ListState =\n | {\n readonly mode: 'incremental';\n readonly items: Map<string, Presence>;\n readonly order: readonly string[];\n }\n | { readonly mode: 'whole'; readonly value: readonly unknown[] };\n\ntype ListSubject = SubjectBase & {\n readonly kind: 'list';\n readonly node: ListNode;\n state: ListState;\n};\n\ntype TreeSubject = SubjectBase & {\n readonly kind: 'tree';\n state: tree.TreeChange;\n};\n\ntype ChangeSubject =\n ValueSubject | VariantSubject | DictSubject | EntitySubject | ListSubject | TreeSubject;\n\ntype EntityAnalysis = {\n readonly changed: boolean;\n readonly added: ReadonlySet<string>;\n readonly removed: ReadonlySet<string>;\n readonly updated: ReadonlySet<string>;\n readonly orderChanged: boolean;\n};\n\ntype JournalFinish =\n | { readonly status: 'unchanged' }\n | {\n readonly status: 'changed';\n readonly paths: readonly DocumentAddress[];\n readonly collections: readonly MutationCollectionChange[];\n };\n\ntype ChangeJournal = {\n readonly record: (\n resolved: ResolvedAddress,\n operation: DocumentOperationUnion,\n inverse: readonly DocumentOperationUnion[]\n ) => void;\n readonly finish: () => JournalFinish;\n};\n\ntype AddressIndexNode = {\n readonly children: Map<string, AddressIndexNode>;\n subject?: ChangeSubject;\n};\n\nconst indexNode = (): AddressIndexNode => ({ children: new Map() });\nconst hasOwn = (value: object, key: string | number): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\n\nconst sameAddress = (left: DocumentAddress, right: DocumentAddress): boolean => {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1)\n if (left[index] !== right[index]) return false;\n return true;\n};\n\nconst sameOrder = (left: readonly string[], right: readonly string[]): boolean => {\n if (left.length !== right.length) return false;\n for (let index = 0; index < left.length; index += 1)\n if (left[index] !== right[index]) return false;\n return true;\n};\n\nconst replaceArray = <T>(target: T[], value: readonly T[]): void => {\n target.length = value.length;\n for (let index = 0; index < value.length; index += 1) target[index] = value[index];\n};\n\nconst present = (value: unknown): Presence => ({ status: 'present', value });\nconst absent: Presence = Object.freeze({ status: 'absent' });\nconst inverseMismatch = (operation: DocumentOperationUnion): never => {\n throw new Error(`Mutation inverse does not match '${operation.type}'.`);\n};\n\nconst ownsDescendant = (subject: ChangeSubject, address: DocumentAddress): boolean => {\n if (subject.address.length >= address.length) return false;\n if (subject.kind === 'variant') return true;\n if (subject.kind !== 'entity') return false;\n return subject.entries.has(address[subject.address.length]);\n};\n\nconst nodeAt = (root: AddressIndexNode, address: DocumentAddress): AddressIndexNode | undefined => {\n let node: AddressIndexNode | undefined = root;\n for (const segment of address) {\n node = node.children.get(segment);\n if (!node) return undefined;\n }\n return node;\n};\n\nconst indexedSubjects = (root: AddressIndexNode, address: DocumentAddress): ChangeSubject[] => {\n const start = nodeAt(root, address);\n if (!start) return [];\n const subjects: ChangeSubject[] = [];\n const stack = [start];\n while (stack.length) {\n const node = stack.pop();\n if (!node) break;\n if (node.subject) subjects.push(node.subject);\n for (const child of node.children.values()) stack.push(child);\n }\n return subjects;\n};\n\nconst writePresence = (root: unknown, address: DocumentAddress, before: Presence): void => {\n const target = locate(root, address);\n if (!target) return;\n if (before.status === 'present')\n (target.parent as Record<string | number, unknown>)[target.key] = before.value;\n else if (Array.isArray(target.parent)) target.parent.splice(Number(target.key), 1);\n else delete target.parent[String(target.key)];\n};\n\nconst writeContainer = (root: unknown, address: DocumentAddress, value: unknown): void => {\n const target = locate(root, address);\n if (!target) return;\n (target.parent as Record<string | number, unknown>)[target.key] = value;\n};\n\nconst restoreDict = (value: Record<string, unknown>, state: DictState): void => {\n if (state.mode === 'whole') {\n for (const key of Object.keys(value)) delete value[key];\n for (const [key, entry] of Object.entries(state.value)) value[key] = entry;\n return;\n }\n for (const [key, before] of state.entries) {\n if (before.status === 'present') value[key] = before.value;\n else delete value[key];\n }\n};\n\nconst restoreList = (value: unknown[], subject: ListSubject): void => {\n if (subject.state.mode === 'whole') {\n replaceArray(value, subject.state.value);\n return;\n }\n const entries = new Map<string, unknown>();\n for (const entry of value) entries.set(subject.node.keyOf(entry), entry);\n for (const [key, before] of subject.state.items) {\n if (before.status === 'present') entries.set(key, before.value);\n else entries.delete(key);\n }\n const restored = new Array<unknown>(subject.state.order.length);\n for (let index = 0; index < subject.state.order.length; index += 1)\n restored[index] = entries.get(subject.state.order[index]);\n replaceArray(value, restored);\n};\n\nconst entityCollection = (subject: EntitySubject, value: unknown): EntityCollectionResolution =>\n resolveEntityCollection(subject.node, value);\n\nconst restoreEntity = (value: unknown, subject: EntitySubject): void => {\n const resolution = entityCollection(subject, value);\n if (resolution.status === 'invalid') return;\n const collection = resolution.collection;\n for (const [id, before] of subject.entries) {\n if (before.status === 'present') collection.byId[id] = before.value;\n else delete collection.byId[id];\n }\n if (collection.kind !== 'table') return;\n if (subject.order.kind === 'tracked') {\n replaceArray(collection.ids, subject.order.before);\n return;\n }\n if (subject.order.kind === 'stable') restoreEntityOrder(collection.ids, subject.order.inverses);\n};\n\nconst restoreRootSubject = (value: unknown, subject: ChangeSubject): unknown => {\n if (subject.kind === 'value')\n return subject.before.status === 'present' ? subject.before.value : undefined;\n if (subject.kind === 'variant') return subject.before;\n if (subject.kind === 'dict') {\n if (isRecord(value)) restoreDict(value, subject.state);\n return value;\n }\n if (subject.kind === 'entity') {\n restoreEntity(value, subject);\n return value;\n }\n if (subject.kind === 'list') {\n if (Array.isArray(value)) restoreList(value, subject);\n return value;\n }\n return tree.restoreChange(value, subject.state);\n};\n\nconst restoreSubject = (\n value: unknown,\n prefix: DocumentAddress,\n subject: ChangeSubject\n): unknown => {\n if (sameAddress(prefix, subject.address)) return restoreRootSubject(value, subject);\n const address = subject.address.slice(prefix.length);\n if (subject.kind === 'value') {\n writePresence(value, address, subject.before);\n return value;\n }\n if (subject.kind === 'variant') {\n writeContainer(value, address, subject.before);\n return value;\n }\n const current = read(value, address);\n if (subject.kind === 'dict') {\n if (isRecord(current)) restoreDict(current, subject.state);\n return value;\n }\n if (subject.kind === 'entity') {\n restoreEntity(current, subject);\n return value;\n }\n if (subject.kind === 'list') {\n if (Array.isArray(current)) restoreList(current, subject);\n return value;\n }\n const restored = tree.restoreChange(current, subject.state);\n if (restored !== current) writeContainer(value, address, restored);\n return value;\n};\n\nconst valueChanged = (root: unknown, subject: ValueSubject): boolean => {\n const target = locate(root, subject.address);\n const exists = !!target && hasOwn(target.parent, target.key);\n if (subject.before.status === 'absent') return exists;\n return !exists || !Object.is(subject.before.value, target?.value);\n};\n\nconst dictChanged = (root: unknown, subject: DictSubject): boolean => {\n const value = read(root, subject.address);\n if (!isRecord(value)) return true;\n if (subject.state.mode === 'whole') return !sameStructuralValue(subject.state.value, value);\n for (const [key, before] of subject.state.entries) {\n const exists = hasOwn(value, key);\n if (before.status === 'absent' ? exists : !exists || !Object.is(before.value, value[key]))\n return true;\n }\n return false;\n};\n\nconst listChanged = (root: unknown, subject: ListSubject): boolean => {\n const value = read(root, subject.address);\n if (!Array.isArray(value)) return true;\n if (subject.state.mode === 'whole') return !sameStructuralValue(subject.state.value, value);\n const positions = new Map<string, number>();\n const order = new Array<string>(value.length);\n for (let index = 0; index < value.length; index += 1) {\n const key = subject.node.keyOf(value[index]);\n order[index] = key;\n positions.set(key, index);\n }\n if (!sameOrder(subject.state.order, order)) return true;\n for (const [key, before] of subject.state.items) {\n const position = positions.get(key);\n if (before.status === 'absent') {\n if (position !== undefined) return true;\n } else if (position === undefined || !sameStructuralValue(before.value, value[position]))\n return true;\n }\n return false;\n};\n\nconst commonOrderChanged = (before: readonly string[], after: readonly string[]): boolean => {\n const finalPositions = new Map<string, number>();\n for (let index = 0; index < after.length; index += 1) finalPositions.set(after[index], index);\n let previous = -1;\n for (const id of before) {\n const position = finalPositions.get(id);\n if (position === undefined) continue;\n if (position < previous) return true;\n previous = position;\n }\n return false;\n};\n\nconst analyzeEntity = (root: unknown, subject: EntitySubject): EntityAnalysis => {\n const resolution = entityCollection(subject, read(root, subject.address));\n const added = new Set<string>();\n const removed = new Set<string>();\n const updated = new Set<string>();\n if (resolution.status === 'invalid')\n return { changed: true, added, removed, updated, orderChanged: false };\n const collection = resolution.collection;\n for (const [id, before] of subject.entries) {\n const exists = hasOwn(collection.byId, id);\n if (before.status === 'absent') {\n if (exists) added.add(id);\n } else if (!exists) removed.add(id);\n else if (!sameStructuralValue(before.value, collection.byId[id])) updated.add(id);\n }\n const beforeOrder = subject.order.kind === 'tracked' ? subject.order.before : undefined;\n const finalOrder = collection.kind === 'table' ? collection.ids : [];\n const netOrderChanged = beforeOrder !== undefined && !sameOrder(beforeOrder, finalOrder);\n return {\n changed: added.size > 0 || removed.size > 0 || updated.size > 0 || netOrderChanged,\n added,\n removed,\n updated,\n orderChanged: beforeOrder !== undefined && commonOrderChanged(beforeOrder, finalOrder),\n };\n};\n\nconst subjectChanged = (root: unknown, subject: Exclude<ChangeSubject, EntitySubject>): boolean => {\n if (subject.kind === 'value') return valueChanged(root, subject);\n if (subject.kind === 'variant')\n return !sameStructuralValue(subject.before, read(root, subject.address));\n if (subject.kind === 'dict') return dictChanged(root, subject);\n if (subject.kind === 'list') return listChanged(root, subject);\n return tree.changeChanged(subject.state, read(root, subject.address));\n};\n\nconst listOrderBefore = (\n value: readonly unknown[],\n node: ListNode,\n inverse: DocumentOperationUnion\n): readonly string[] => {\n const order = value.map(node.keyOf);\n if (inverse.type === 'list.remove') return order.filter(key => key !== inverse.key);\n if (inverse.type === 'list.insert') {\n order.splice(anchor.index(order, inverse.anchor), 0, inverse.key);\n return order;\n }\n if (inverse.type === 'list.move') {\n const position = order.indexOf(inverse.key);\n if (position >= 0) order.splice(position, 1);\n order.splice(anchor.index(order, inverse.anchor), 0, inverse.key);\n }\n return order;\n};\n\nconst recordListPresence = (\n state: Extract<ListState, { readonly mode: 'incremental' }>,\n inverse: DocumentOperationUnion\n): void => {\n if (inverse.type === 'list.remove' && !state.items.has(inverse.key))\n state.items.set(inverse.key, absent);\n else if (inverse.type === 'list.insert' && !state.items.has(inverse.key))\n state.items.set(inverse.key, present(inverse.value));\n};\n\nconst entityOrderInverse = (\n operation: DocumentOperationUnion,\n inverse: DocumentOperationUnion\n): EntityOrderInverse => {\n if (inverse.type === 'entity.remove') return { kind: 'remove', ids: inverse.ids };\n if (inverse.type === 'entity.create') {\n if (!inverse.positions || inverse.positions.length !== inverse.entries.length)\n return inverseMismatch(operation);\n return {\n kind: 'restore',\n ids: inverse.entries.map(entry => entry.id),\n positions: inverse.positions,\n };\n }\n if (inverse.type === 'entity.move')\n return {\n kind: 'move',\n id: inverse.id,\n ...(inverse.anchor ? { anchor: inverse.anchor } : {}),\n };\n return inverseMismatch(operation);\n};\n\nconst removeEntityIds = (order: string[], ids: readonly string[]): void => {\n const removed = new Set(ids);\n let writeIndex = 0;\n for (const id of order) if (!removed.has(id)) order[writeIndex++] = id;\n order.length = writeIndex;\n};\n\nconst restoreEntityOrder = (order: string[], inverses: readonly EntityOrderInverse[]): void => {\n for (let index = inverses.length - 1; index >= 0; index -= 1) {\n const inverse = inverses[index];\n if (inverse.kind === 'remove') {\n removeEntityIds(order, inverse.ids);\n continue;\n }\n if (inverse.kind === 'restore') {\n anchor.restore(order, inverse.ids, inverse.positions);\n continue;\n }\n const position = order.indexOf(inverse.id);\n if (position < 0 || !anchor.valid(order, inverse.anchor))\n throw new Error(`Entity order inverse cannot restore '${inverse.id}'.`);\n const nextIndex = anchor.afterRemove(order, position, inverse.anchor);\n order.splice(position, 1);\n order.splice(nextIndex, 0, inverse.id);\n }\n};\n\nconst treeOperation = (\n operation: DocumentOperationUnion\n): operation is Extract<\n DocumentOperationUnion,\n {\n readonly type: 'tree.insert' | 'tree.move' | 'tree.remove' | 'tree.set' | 'tree.replace';\n }\n> => operation.type.startsWith('tree.');\n\nexport const createChangeJournal = (root: unknown): ChangeJournal => {\n const active = new Set<ChangeSubject>();\n const index = indexNode();\n const buckets = new Map<number, ChangeSubject[]>();\n\n const add = <TSubject extends ChangeSubject>(subject: TSubject): TSubject => {\n active.add(subject);\n const candidates = buckets.get(subject.addressHash);\n if (candidates) candidates.push(subject);\n else buckets.set(subject.addressHash, [subject]);\n let node = index;\n for (const segment of subject.address) {\n const existing = node.children.get(segment);\n if (existing) node = existing;\n else {\n const created = indexNode();\n node.children.set(segment, created);\n node = created;\n }\n }\n if (node.subject)\n throw new Error(`Change journal already owns '${subject.address.join('.')}'.`);\n node.subject = subject;\n profile.journal.subject();\n return subject;\n };\n\n const remove = (subject: ChangeSubject): void => {\n if (!active.delete(subject)) return;\n const candidates = buckets.get(subject.addressHash);\n if (candidates) {\n const position = candidates.indexOf(subject);\n if (position >= 0) candidates.splice(position, 1);\n if (candidates.length === 0) buckets.delete(subject.addressHash);\n }\n const nodes: AddressIndexNode[] = [index];\n let node = index;\n for (const segment of subject.address) {\n const child = node.children.get(segment);\n if (!child) return;\n nodes.push(child);\n node = child;\n }\n if (node.subject === subject) delete node.subject;\n for (let position = subject.address.length - 1; position >= 0; position -= 1) {\n const child = nodes[position + 1];\n if (child.subject || child.children.size > 0) break;\n nodes[position].children.delete(subject.address[position]);\n }\n };\n\n function find(\n kind: 'value',\n address: DocumentAddress,\n addressHash: number\n ): ValueSubject | undefined;\n function find(\n kind: 'variant',\n address: DocumentAddress,\n addressHash: number\n ): VariantSubject | undefined;\n function find(\n kind: 'dict',\n address: DocumentAddress,\n addressHash: number\n ): DictSubject | undefined;\n function find(\n kind: 'entity',\n address: DocumentAddress,\n addressHash: number\n ): EntitySubject | undefined;\n function find(\n kind: 'list',\n address: DocumentAddress,\n addressHash: number\n ): ListSubject | undefined;\n function find(\n kind: 'tree',\n address: DocumentAddress,\n addressHash: number\n ): TreeSubject | undefined;\n function find(\n kind: ChangeSubject['kind'],\n address: DocumentAddress,\n addressHash: number\n ): ChangeSubject | undefined {\n const candidates = buckets.get(addressHash) ?? [];\n for (const subject of candidates) {\n profile.journal.comparison();\n if (subject.kind === kind && sameAddress(subject.address, address)) return subject;\n }\n return undefined;\n }\n\n const ownerOf = (address: DocumentAddress): ChangeSubject | undefined => {\n let node = index;\n for (let position = 0; position < address.length; position += 1) {\n if (node.subject && ownsDescendant(node.subject, address)) return node.subject;\n const child = node.children.get(address[position]);\n if (!child) return undefined;\n node = child;\n }\n return undefined;\n };\n\n const absorb = (value: unknown, address: DocumentAddress): unknown => {\n const subjects = indexedSubjects(index, address);\n if (subjects.length === 0) return value;\n subjects.sort((left, right) => left.address.length - right.address.length);\n let before = ownPayload(value, 'journal');\n for (const subject of subjects) before = restoreSubject(before, address, subject);\n for (const subject of subjects) {\n remove(subject);\n profile.journal.absorbed();\n }\n return before;\n };\n\n const base = (resolved: ResolvedAddress, operation: DocumentOperationUnion): SubjectBase => ({\n address: operation.at,\n addressHash: resolved.addressHash,\n ...(resolved.collection ? { collection: resolved.collection } : {}),\n });\n\n const recordValue = (\n resolved: ResolvedAddress,\n operation: Extract<DocumentOperationUnion, { readonly type: 'field.set' | 'field.clear' }>,\n inverse: readonly DocumentOperationUnion[]\n ): void => {\n if (find('value', operation.at, resolved.addressHash)) return;\n const first = inverse[0];\n if (first?.type !== 'field.set' && first?.type !== 'field.clear')\n return inverseMismatch(operation);\n add<ValueSubject>({\n ...base(resolved, operation),\n kind: 'value',\n before: first.type === 'field.set' ? present(first.value) : absent,\n });\n };\n\n const recordVariant = (\n resolved: ResolvedAddress,\n operation: Extract<DocumentOperationUnion, { readonly type: 'variant.replace' }>,\n inverse: readonly DocumentOperationUnion[]\n ): void => {\n if (find('variant', operation.at, resolved.addressHash)) return;\n const first = inverse[0];\n if (first?.type !== 'variant.replace') return inverseMismatch(operation);\n add<VariantSubject>({\n ...base(resolved, operation),\n kind: 'variant',\n before: absorb(first.value, operation.at),\n });\n };\n\n const recordDict = (\n resolved: ResolvedAddress,\n operation: Extract<\n DocumentOperationUnion,\n { readonly type: 'dict.set' | 'dict.delete' | 'dict.replace' }\n >,\n inverse: readonly DocumentOperationUnion[]\n ): void => {\n const first = inverse[0];\n if (!first) return inverseMismatch(operation);\n const subject =\n find('dict', operation.at, resolved.addressHash) ??\n add<DictSubject>({\n ...base(resolved, operation),\n kind: 'dict',\n state: { mode: 'incremental', entries: new Map() },\n });\n if (subject.state.mode === 'whole') return;\n if (first.type === 'dict.replace') {\n const value = ownPayload(first.value, 'journal');\n restoreDict(value, subject.state);\n subject.state = { mode: 'whole', value };\n return;\n }\n if (first.type !== 'dict.set' && first.type !== 'dict.delete')\n return inverseMismatch(operation);\n if (!subject.state.entries.has(first.key))\n subject.state.entries.set(\n first.key,\n first.type === 'dict.set' ? present(first.value) : absent\n );\n };\n\n const recordList = (\n resolved: ResolvedAddress,\n operation: Extract<\n DocumentOperationUnion,\n { readonly type: 'list.insert' | 'list.move' | 'list.remove' | 'list.replace' }\n >,\n inverse: readonly DocumentOperationUnion[]\n ): void => {\n if (resolved.node.kind !== 'list') return inverseMismatch(operation);\n const first = inverse[0];\n if (!first) return inverseMismatch(operation);\n let subject = find('list', operation.at, resolved.addressHash);\n if (!subject) {\n if (first.type === 'list.replace') {\n add<ListSubject>({\n ...base(resolved, operation),\n kind: 'list',\n node: resolved.node,\n state: { mode: 'whole', value: first.value },\n });\n return;\n }\n const value = read(root, operation.at);\n if (!Array.isArray(value)) return inverseMismatch(operation);\n subject = add<ListSubject>({\n ...base(resolved, operation),\n kind: 'list',\n node: resolved.node,\n state: {\n mode: 'incremental',\n items: new Map(),\n order: listOrderBefore(value, resolved.node, first),\n },\n });\n }\n if (subject.state.mode === 'whole') return;\n if (first.type === 'list.replace') {\n const value = Array.from(ownPayload(first.value, 'journal'));\n restoreList(value, subject);\n subject.state = { mode: 'whole', value };\n return;\n }\n if (first.type !== 'list.insert' && first.type !== 'list.move' && first.type !== 'list.remove')\n return inverseMismatch(operation);\n recordListPresence(subject.state, first);\n };\n\n const trackEntityOrder = (\n subject: EntitySubject,\n collection: Extract<EntityCollection, { readonly kind: 'table' }>\n ): void => {\n if (subject.order.kind !== 'stable') return;\n profile.journal.orderSnapshot(collection.ids.length);\n const before = [...collection.ids];\n restoreEntityOrder(before, subject.order.inverses);\n subject.order = { kind: 'tracked', before };\n };\n\n const recordEntity = (\n resolved: ResolvedAddress,\n operation: Extract<\n DocumentOperationUnion,\n { readonly type: 'entity.create' | 'entity.remove' | 'entity.move' }\n >,\n inverse: readonly DocumentOperationUnion[]\n ): void => {\n if (resolved.node.kind !== 'table' && resolved.node.kind !== 'map')\n return inverseMismatch(operation);\n const resolution = resolveEntityCollection(resolved.node, read(root, operation.at));\n if (resolution.status === 'invalid') return inverseMismatch(operation);\n const collection = resolution.collection;\n const subject =\n find('entity', operation.at, resolved.addressHash) ??\n add<EntitySubject>({\n ...base(resolved, operation),\n kind: 'entity',\n node: resolved.node,\n entries: new Map(),\n order:\n collection.kind === 'table' ? { kind: 'stable', inverses: [] } : { kind: 'unordered' },\n });\n const first = inverse[0];\n if (!first) return inverseMismatch(operation);\n\n if (collection.kind === 'table' && subject.order.kind === 'stable')\n subject.order.inverses.push(entityOrderInverse(operation, first));\n\n if (first.type === 'entity.remove') {\n for (const id of first.ids) if (!subject.entries.has(id)) subject.entries.set(id, absent);\n if (\n collection.kind === 'table' &&\n first.ids.some(id => subject.entries.get(id)?.status === 'present')\n )\n trackEntityOrder(subject, collection);\n return;\n }\n\n if (first.type === 'entity.create') {\n for (const entry of first.entries) {\n if (subject.entries.has(entry.id)) continue;\n const address = [...operation.at, entry.id];\n subject.entries.set(entry.id, present(absorb(entry.value, address)));\n }\n return;\n }\n\n if (first.type === 'entity.move') {\n if (collection.kind === 'table' && subject.entries.get(first.id)?.status !== 'absent')\n trackEntityOrder(subject, collection);\n return;\n }\n return inverseMismatch(operation);\n };\n\n const recordTree = (\n resolved: ResolvedAddress,\n operation: Extract<\n DocumentOperationUnion,\n {\n readonly type: 'tree.insert' | 'tree.move' | 'tree.remove' | 'tree.set' | 'tree.replace';\n }\n >,\n inverse: readonly DocumentOperationUnion[]\n ): void => {\n const current = read(root, operation.at);\n if (!tree.is(current)) return inverseMismatch(operation);\n const inverses = inverse.filter(treeOperation);\n if (inverses.length === 0 || inverses.length !== inverse.length)\n return inverseMismatch(operation);\n const subject = find('tree', operation.at, resolved.addressHash);\n const state = tree.recordChange(subject?.state, current, operation, inverses);\n if (subject) subject.state = state;\n else add<TreeSubject>({ ...base(resolved, operation), kind: 'tree', state });\n };\n\n return {\n record: (resolved, operation, inverse) => {\n profile.batch.journalRecord();\n if (ownerOf(operation.at)) return;\n if (operation.type === 'field.set' || operation.type === 'field.clear') {\n recordValue(resolved, operation, inverse);\n return;\n }\n if (operation.type === 'variant.replace') {\n recordVariant(resolved, operation, inverse);\n return;\n }\n if (\n operation.type === 'dict.set' ||\n operation.type === 'dict.delete' ||\n operation.type === 'dict.replace'\n ) {\n recordDict(resolved, operation, inverse);\n return;\n }\n if (\n operation.type === 'entity.create' ||\n operation.type === 'entity.remove' ||\n operation.type === 'entity.move'\n ) {\n recordEntity(resolved, operation, inverse);\n return;\n }\n if (\n operation.type === 'list.insert' ||\n operation.type === 'list.move' ||\n operation.type === 'list.remove' ||\n operation.type === 'list.replace'\n ) {\n recordList(resolved, operation, inverse);\n return;\n }\n recordTree(resolved, operation, inverse);\n },\n finish: () => {\n const changed: ChangeSubject[] = [];\n const entityChanges = new Map<EntitySubject, EntityAnalysis>();\n for (const subject of active) {\n profile.journal.comparison();\n if (subject.kind === 'entity') {\n const analysis = analyzeEntity(root, subject);\n if (!analysis.changed) continue;\n entityChanges.set(subject, analysis);\n changed.push(subject);\n } else if (subjectChanged(root, subject)) changed.push(subject);\n }\n if (changed.length === 0) return { status: 'unchanged' };\n\n const collections: Array<{\n address: DocumentAddress;\n added: Set<string>;\n removed: Set<string>;\n updated: Set<string>;\n orderChanged: boolean;\n }> = [];\n const collectionBuckets = new Map<number, (typeof collections)[number][]>();\n const changeAt = (address: DocumentAddress, addressHash: number) => {\n const candidates = collectionBuckets.get(addressHash) ?? [];\n collectionBuckets.set(addressHash, candidates);\n let change = candidates.find(entry => sameAddress(entry.address, address));\n if (!change) {\n change = {\n address,\n added: new Set(),\n removed: new Set(),\n updated: new Set(),\n orderChanged: false,\n };\n candidates.push(change);\n collections.push(change);\n }\n return change;\n };\n\n for (const subject of changed) {\n if (subject.kind === 'entity') {\n const analysis = entityChanges.get(subject);\n if (analysis) {\n const change = changeAt(subject.address, subject.addressHash);\n analysis.added.forEach(id => change.added.add(id));\n analysis.removed.forEach(id => change.removed.add(id));\n analysis.updated.forEach(id => change.updated.add(id));\n if (analysis.orderChanged) change.orderChanged = true;\n }\n }\n for (let collection = subject.collection; collection; collection = collection.parent)\n changeAt(collection.address, collection.addressHash).updated.add(collection.id);\n }\n for (const change of collections) {\n change.added.forEach(id => change.updated.delete(id));\n change.removed.forEach(id => change.updated.delete(id));\n }\n\n return {\n status: 'changed',\n paths: Object.freeze(changed.map(subject => subject.address)),\n collections,\n };\n },\n };\n};\n","import type { DocumentAddress, DocumentSchema } from '../schema';\nimport type { DocumentAnchor, DocumentOperationUnion } from '../operations';\nimport { profile } from '../profile';\nimport {\n isRecord,\n isStablePayload,\n operationOwnsStructuralPayload,\n snapshotPayload,\n} from '../value/ownership';\nimport type { MutationIssue } from './issue';\nimport * as issue from './issue';\n\nexport type OperationDecode =\n | { readonly status: 'decoded'; readonly operation: DocumentOperationUnion }\n | { readonly status: 'rejected'; readonly issue: MutationIssue };\nexport type OperationBatchDecode =\n | { readonly status: 'decoded'; readonly operations: readonly unknown[] }\n | { readonly status: 'rejected'; readonly issue: MutationIssue };\n\nconst has = (value: Record<string, unknown>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\nconst stringArray = (value: unknown): value is readonly string[] =>\n Array.isArray(value) && value.every(entry => typeof entry === 'string');\nconst positions = (value: unknown): value is readonly number[] =>\n Array.isArray(value) && value.every(entry => Number.isInteger(entry) && entry >= 0);\nconst address = (value: unknown): value is DocumentAddress => stringArray(value);\nconst anchor = (value: unknown): value is DocumentAnchor => {\n if (!isRecord(value)) return false;\n const count =\n Number(has(value, 'at')) + Number(has(value, 'before')) + Number(has(value, 'after'));\n if (count !== 1) return false;\n if (has(value, 'at')) return value.at === 'start' || value.at === 'end';\n return typeof (has(value, 'before') ? value.before : value.after) === 'string';\n};\nconst optionalAnchor = (value: Record<string, unknown>): boolean =>\n !has(value, 'anchor') || value.anchor === undefined || anchor(value.anchor);\nconst optionalParent = (value: Record<string, unknown>): boolean =>\n !has(value, 'parentId') || value.parentId === undefined || typeof value.parentId === 'string';\nconst optionalIndex = (value: Record<string, unknown>): boolean =>\n !has(value, 'index') ||\n value.index === undefined ||\n (Number.isInteger(value.index) && (value.index as number) >= 0);\nconst entries = (value: unknown): boolean =>\n Array.isArray(value) &&\n value.every(entry => isRecord(entry) && typeof entry.id === 'string' && has(entry, 'value'));\n\nconst decoded = (operation: DocumentOperationUnion): OperationDecode => ({\n status: 'decoded',\n operation,\n});\nconst rejected = (code: MutationIssue['code'], message: string): OperationDecode => ({\n status: 'rejected',\n issue: issue.input(code, message),\n});\n\nexport const decode = (input: unknown): OperationDecode => {\n if (!isRecord(input)) return rejected('invalid-operation', 'Operation must be an object.');\n if (!address(input.at)) return rejected('invalid-address', 'Operation address is malformed.');\n if (typeof input.type !== 'string')\n return rejected('invalid-operation', 'Operation type must be a string.');\n\n switch (input.type) {\n case 'field.set':\n case 'variant.replace':\n return has(input, 'value')\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Operation value is required.');\n case 'field.clear':\n return decoded(input as DocumentOperationUnion);\n case 'dict.set':\n return typeof input.key === 'string' && has(input, 'value')\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Dictionary set requires a string key and value.');\n case 'dict.delete':\n return typeof input.key === 'string'\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Dictionary delete requires a string key.');\n case 'dict.replace':\n return isRecord(input.value)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Dictionary replacement must be an object.');\n case 'entity.create':\n return entries(input.entries) &&\n optionalAnchor(input) &&\n (!has(input, 'positions') || input.positions === undefined || positions(input.positions))\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Entity create payload is malformed.');\n case 'entity.remove':\n return stringArray(input.ids)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Entity remove requires string ids.');\n case 'entity.move':\n return typeof input.id === 'string' && optionalAnchor(input)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Entity move payload is malformed.');\n case 'list.insert':\n return typeof input.key === 'string' && has(input, 'value') && optionalAnchor(input)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'List insert payload is malformed.');\n case 'list.move':\n return typeof input.key === 'string' && optionalAnchor(input)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'List move payload is malformed.');\n case 'list.remove':\n return typeof input.key === 'string'\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'List remove requires a string key.');\n case 'list.replace':\n return Array.isArray(input.value) && stringArray(input.keys)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'List replacement payload is malformed.');\n case 'tree.insert':\n return typeof input.treeNodeId === 'string' && optionalParent(input) && optionalIndex(input)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Tree insert payload is malformed.');\n case 'tree.move':\n return typeof input.treeNodeId === 'string' && optionalParent(input) && optionalIndex(input)\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Tree move payload is malformed.');\n case 'tree.remove':\n return typeof input.treeNodeId === 'string'\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Tree remove requires a node id.');\n case 'tree.set':\n return typeof input.treeNodeId === 'string' && has(input, 'value')\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Tree set payload is malformed.');\n case 'tree.replace':\n return has(input, 'value')\n ? decoded(input as DocumentOperationUnion)\n : rejected('invalid-operation', 'Tree replacement value is required.');\n default:\n return rejected('unknown-operation', 'Unknown document operation.');\n }\n};\n\nexport const decodeBatch = (input: unknown): OperationBatchDecode =>\n Array.isArray(input)\n ? { status: 'decoded', operations: input }\n : {\n status: 'rejected',\n issue: issue.input('invalid-operation', 'Operation batch must be an array.'),\n };\n\nconst ownAddress = (value: DocumentAddress): DocumentAddress => {\n if (Object.isFrozen(value)) return value;\n profile.address.arrayCopied();\n return Object.freeze(value.slice());\n};\n\nexport const normalize = <TSchema extends DocumentSchema>(\n operation: DocumentOperationUnion<TSchema>\n): DocumentOperationUnion<TSchema> => {\n profile.mutation.normalized();\n const copy = {\n ...operation,\n at: ownAddress(operation.at),\n } as DocumentOperationUnion<TSchema> & {\n anchor?: DocumentAnchor;\n keys?: readonly string[];\n entries?: readonly { readonly id: string; readonly value: unknown }[];\n ids?: readonly string[];\n positions?: readonly number[];\n };\n if (copy.anchor) copy.anchor = Object.freeze({ ...copy.anchor });\n if (copy.keys) copy.keys = Object.freeze([...copy.keys]);\n if (copy.entries)\n copy.entries = Object.freeze(copy.entries.map(entry => Object.freeze({ ...entry })));\n if (copy.ids) copy.ids = Object.freeze([...copy.ids]);\n if (copy.positions) copy.positions = Object.freeze([...copy.positions]);\n return Object.freeze(copy);\n};\n\nexport const publish = <TSchema extends DocumentSchema>(\n operation: DocumentOperationUnion<TSchema>\n): DocumentOperationUnion<TSchema> => {\n if (!operationOwnsStructuralPayload(operation)) return operation;\n if (\n operation.type === 'entity.create' &&\n operation.entries.every(entry => isStablePayload(entry.value))\n )\n return operation;\n const copy = { ...operation } as DocumentOperationUnion<TSchema> & {\n value?: unknown;\n entries?: readonly { readonly id: string; readonly value: unknown }[];\n };\n if (copy.entries)\n copy.entries = Object.freeze(\n copy.entries.map(entry =>\n Object.freeze({\n id: entry.id,\n value: isStablePayload(entry.value)\n ? entry.value\n : snapshotPayload(entry.value, 'commit'),\n })\n )\n );\n else if ('value' in copy)\n copy.value = isStablePayload(copy.value) ? copy.value : snapshotPayload(copy.value, 'commit');\n return Object.freeze(copy);\n};\n\nexport const inverse = <TSchema extends DocumentSchema>(\n operation: DocumentOperationUnion<TSchema>\n): DocumentOperationUnion<TSchema> => {\n const copy = { ...operation } as DocumentOperationUnion<TSchema> & {\n anchor?: DocumentAnchor;\n keys?: readonly string[];\n entries?: readonly { readonly id: string; readonly value: unknown }[];\n ids?: readonly string[];\n positions?: readonly number[];\n };\n if (copy.anchor) copy.anchor = Object.freeze({ ...copy.anchor });\n if (copy.keys) copy.keys = Object.freeze([...copy.keys]);\n if (copy.entries)\n copy.entries = Object.freeze(copy.entries.map(entry => Object.freeze({ ...entry })));\n if (copy.ids) copy.ids = Object.freeze([...copy.ids]);\n if (copy.positions) copy.positions = Object.freeze([...copy.positions]);\n return Object.freeze(copy);\n};\n","import { resolveLocated } from '../address';\nimport type { DocumentSchema } from '../schema';\nimport type { DocumentOperationUnion } from '../operations';\nimport { profile } from '../profile';\nimport type { MutationBatch } from './contract';\nimport type { MutationIssue } from './issue';\nimport { execute } from './execute';\nimport { createChangeJournal } from './journal';\nimport * as operation from './operation';\n\nexport type MutationSession<TSchema extends DocumentSchema> = {\n readonly apply: (input: unknown) => MutationIssue | undefined;\n readonly finish: () => MutationBatch<TSchema>;\n readonly rollback: () => void;\n};\n\ntype AppliedStep<TSchema extends DocumentSchema> = {\n readonly forward: DocumentOperationUnion<TSchema>;\n readonly inverse: readonly DocumentOperationUnion<TSchema>[];\n};\n\nexport const createMutationSession = <TSchema extends DocumentSchema>(\n root: unknown,\n schema: TSchema,\n options: { readonly copyPayload?: boolean } = {}\n): MutationSession<TSchema> => {\n const steps: AppliedStep<TSchema>[] = [];\n const journal = createChangeJournal(root);\n let closed = false;\n\n const rollback = (): void => {\n if (closed) return;\n for (let stepIndex = steps.length - 1; stepIndex >= 0; stepIndex -= 1) {\n for (const inverse of steps[stepIndex].inverse) {\n const target = resolveLocated(schema, root, inverse.at);\n const result = execute(root, inverse, target, true);\n if (result.status === 'rejected')\n throw new Error(`Document rollback failed: ${result.issue.message}`);\n }\n }\n closed = true;\n };\n\n return {\n apply: input => {\n if (closed) throw new Error('Mutation session is closed.');\n profile.batch.operation();\n const decoded = operation.decode(input);\n if (decoded.status === 'rejected') {\n profile.batch.rejected();\n return decoded.issue;\n }\n const normalized = operation.normalize(decoded.operation as DocumentOperationUnion<TSchema>);\n profile.batch.entry(\n normalized.type === 'entity.create'\n ? normalized.entries.length\n : normalized.type === 'entity.remove'\n ? normalized.ids.length\n : 1\n );\n const resolved = resolveLocated(schema, root, normalized.at);\n if (resolved?.collection) profile.batch.collectionResolved();\n profile.mutation.executed();\n const result = execute(root, normalized, resolved, options.copyPayload === true);\n if (result.status === 'rejected') {\n profile.batch.rejected();\n return result.issue;\n }\n if (result.status === 'unchanged') return undefined;\n\n const published = operation.publish(normalized);\n const group: DocumentOperationUnion<TSchema>[] = [];\n for (const rawInverse of result.inverse) {\n const inverse = operation.inverse(rawInverse as DocumentOperationUnion<TSchema>);\n group.push(inverse);\n profile.mutation.inverse();\n profile.batch.inverse();\n }\n steps.push({ forward: published, inverse: Object.freeze(group) });\n try {\n if (!resolved) throw new Error(`Changed operation '${normalized.type}' was not resolved.`);\n journal.record(resolved, normalized, result.inverse);\n } catch (error) {\n rollback();\n throw error;\n }\n return undefined;\n },\n finish: () => {\n if (closed) throw new Error('Mutation session is closed.');\n closed = true;\n const changes = journal.finish();\n if (changes.status === 'unchanged') return { status: 'unchanged' };\n\n let inverseCount = 0;\n for (const step of steps) inverseCount += step.inverse.length;\n const inverse = new Array<DocumentOperationUnion<TSchema>>(inverseCount);\n let writeIndex = 0;\n for (let stepIndex = steps.length - 1; stepIndex >= 0; stepIndex -= 1)\n for (const entry of steps[stepIndex].inverse) inverse[writeIndex++] = entry;\n return {\n status: 'changed',\n operations: Object.freeze(steps.map(step => step.forward)),\n inverse: Object.freeze(inverse),\n paths: changes.paths,\n collections: changes.collections,\n };\n },\n rollback,\n };\n};\n\nexport const mutateOperations = <TSchema extends DocumentSchema>(\n root: unknown,\n schema: TSchema,\n operations: unknown,\n options: { readonly copyPayload?: boolean } = {}\n): MutationBatch<TSchema> => {\n const decodedBatch = operation.decodeBatch(operations);\n if (decodedBatch.status === 'rejected')\n return { status: 'rejected', issues: Object.freeze([decodedBatch.issue]) };\n const session = createMutationSession(root, schema, options);\n for (const input of decodedBatch.operations) {\n const issue = session.apply(input);\n if (!issue) continue;\n session.rollback();\n return { status: 'rejected', issues: Object.freeze([issue]) };\n }\n return session.finish();\n};\n","import type { DocumentSchema, ImpactTarget } from '../schema';\nimport type {\n CommitListener,\n DocumentCommit,\n DocumentRuntime,\n RuntimeProcessor,\n Unsubscribe,\n ObserverError,\n} from './contract';\nimport * as target from '../impact-target';\n\ntype ProcessorEntry<TSchema extends DocumentSchema> = {\n readonly processor: RuntimeProcessor<TSchema>;\n active: boolean;\n};\ntype RootEntry<TSchema extends DocumentSchema> = {\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\ntype FilteredEntry<TSchema extends DocumentSchema> = {\n readonly targets: readonly ImpactTarget<unknown>[];\n readonly listener: CommitListener<TSchema>;\n active: boolean;\n};\nexport type RuntimeNotification<TSchema extends DocumentSchema> = {\n readonly root: Set<RootEntry<TSchema>>;\n readonly filtered: Set<FilteredEntry<TSchema>>;\n readonly buckets: Map<BucketKey, Set<FilteredEntry<TSchema>>>;\n readonly processors: ProcessorEntry<TSchema>[];\n readonly candidates: Set<FilteredEntry<TSchema>>;\n readonly rootSnapshot: RootEntry<TSchema>[];\n notifying: boolean;\n};\n\nconst ROOT_BUCKET = Symbol('document-root');\ntype BucketKey = string | typeof ROOT_BUCKET;\nconst notifications = new WeakMap<object, RuntimeNotification<DocumentSchema>>();\n\nconst key = (value: ImpactTarget<unknown>): BucketKey => target.bucket(value) ?? ROOT_BUCKET;\n\nexport const createNotification = <TSchema extends DocumentSchema>(\n runtime: DocumentRuntime<TSchema>\n): RuntimeNotification<TSchema> => {\n const notification: RuntimeNotification<TSchema> = {\n root: new Set(),\n filtered: new Set(),\n buckets: new Map(),\n processors: [],\n candidates: new Set(),\n rootSnapshot: [],\n notifying: false,\n };\n notifications.set(runtime as object, notification as RuntimeNotification<DocumentSchema>);\n return notification;\n};\n\nconst notificationOf = <TSchema extends DocumentSchema>(\n runtime: DocumentRuntime<TSchema>\n): RuntimeNotification<TSchema> => {\n const value = notifications.get(runtime as object);\n if (!value) throw new Error('Unknown Doxum runtime.');\n return value as RuntimeNotification<TSchema>;\n};\n\nexport const registerProcessor = <TSchema extends DocumentSchema>(\n runtime: DocumentRuntime<TSchema>,\n processor: RuntimeProcessor<TSchema>\n): Unsubscribe => {\n const notification = notificationOf(runtime);\n const entry: ProcessorEntry<TSchema> = { processor, active: true };\n notification.processors.push(entry);\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (!notification.notifying) {\n const index = notification.processors.indexOf(entry);\n if (index >= 0) notification.processors.splice(index, 1);\n }\n };\n};\n\nexport const subscribeRoot = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: RootEntry<TSchema> = { listener, active: true };\n notification.root.add(entry);\n return () => {\n entry.active = false;\n if (!notification.notifying) notification.root.delete(entry);\n };\n};\n\nexport const subscribeTargets = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n targets: readonly ImpactTarget<unknown>[],\n listener: CommitListener<TSchema>\n): Unsubscribe => {\n const entry: FilteredEntry<TSchema> = {\n targets: Object.freeze(targets.slice()),\n listener,\n active: true,\n };\n notification.filtered.add(entry);\n const keys = new Set(targets.map(key));\n keys.forEach(key => {\n const bucket = notification.buckets.get(key) ?? new Set();\n bucket.add(entry);\n notification.buckets.set(key, bucket);\n });\n return () => {\n if (!entry.active) return;\n entry.active = false;\n if (notification.notifying) return;\n notification.filtered.delete(entry);\n keys.forEach(key => {\n const bucket = notification.buckets.get(key);\n bucket?.delete(entry);\n if (bucket?.size === 0) notification.buckets.delete(key);\n });\n };\n};\n\nexport const notify = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>,\n commit: DocumentCommit<TSchema>\n): readonly ObserverError[] => {\n notification.notifying = true;\n const errors: ObserverError[] = [];\n const call = (listener: CommitListener<TSchema>): void => {\n try {\n listener(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'listener', error }));\n }\n };\n try {\n const processorCount = notification.processors.length;\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.process(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.flush();\n } catch (error) {\n errors.push(Object.freeze({ phase: 'flush', error }));\n }\n }\n\n const candidates = notification.candidates;\n candidates.clear();\n if (commit.impact.kind === 'reset') {\n notification.filtered.forEach(entry => candidates.add(entry));\n } else {\n for (const operation of commit.operations) {\n const key = operation.at[0] ?? ROOT_BUCKET;\n notification.buckets.get(key)?.forEach(entry => candidates.add(entry));\n notification.buckets.get(ROOT_BUCKET)?.forEach(entry => candidates.add(entry));\n }\n }\n candidates.forEach(entry => {\n if (entry.active && entry.targets.some(commit.impact.affects)) call(entry.listener);\n });\n const rootSnapshot = notification.rootSnapshot;\n rootSnapshot.length = 0;\n notification.root.forEach(entry => rootSnapshot.push(entry));\n for (const entry of rootSnapshot) if (entry.active) call(entry.listener);\n } finally {\n notification.notifying = false;\n let writeIndex = 0;\n for (const entry of notification.processors)\n if (entry.active) notification.processors[writeIndex++] = entry;\n notification.processors.length = writeIndex;\n notification.root.forEach(entry => {\n if (!entry.active) notification.root.delete(entry);\n });\n notification.filtered.forEach(entry => {\n if (!entry.active) notification.filtered.delete(entry);\n });\n notification.buckets.forEach((bucket, key) => {\n bucket.forEach(entry => {\n if (!entry.active) bucket.delete(entry);\n });\n if (bucket.size === 0) notification.buckets.delete(key);\n });\n }\n return Object.freeze(errors);\n};\n\nexport const disposeNotification = <TSchema extends DocumentSchema>(\n notification: RuntimeNotification<TSchema>\n): void => {\n notification.root.clear();\n notification.filtered.clear();\n notification.buckets.clear();\n notification.processors.length = 0;\n notification.candidates.clear();\n notification.rootSnapshot.length = 0;\n};\n","import type { DocumentSchema, ImpactTarget, ReadonlyDocument } from './schema';\nimport { contains, debugKey, overlaps, read as readAddress, resolveAddress } from './address';\nimport { createImpact } from './impact';\nimport { createHistory } from './history';\nimport { documentReader } from './access/reader';\nimport { documentWriter } from './access/writer';\nimport { createMutationSession, mutateOperations } from './mutation/session';\nimport type { MutationBatch } from './mutation/contract';\nimport * as issue from './mutation/issue';\nimport * as tree from './mutation/tree';\nimport { cloneValue, deepEqual } from './value/ownership';\nimport { profile } from './profile';\nimport { DocumentDisposedError, DocumentReentrancyError } from './runtime/contract';\nimport type {\n CommitListener,\n CommitSource,\n DocumentCommit,\n DocumentDiagnostic,\n DocumentProblem,\n DocumentRuntime,\n DocumentTransaction,\n OperationResult,\n TransactionResult,\n} from './runtime/contract';\nimport { bindRuntimeAccess } from './runtime/access';\nimport {\n createNotification,\n disposeNotification,\n notify,\n subscribeRoot,\n subscribeTargets,\n type RuntimeNotification,\n} from './runtime/notification';\n\nclass RejectedUpdate extends Error {\n readonly issues: readonly DocumentProblem[];\n\n constructor(issues: readonly DocumentProblem[]) {\n super('Document update rejected.');\n this.issues = Object.freeze(issues.slice());\n }\n}\n\nconst EMPTY: readonly never[] = Object.freeze([]) as readonly never[];\n\nconst publishDiagnostic = (value: DocumentDiagnostic): DocumentDiagnostic =>\n Object.freeze({\n ...value,\n ...(value.address === undefined ? {} : { address: Object.freeze(value.address.slice()) }),\n });\n\nexport const createDocument = <TSchema extends DocumentSchema>(input: {\n readonly schema: TSchema;\n readonly initial: ReadonlyDocument<TSchema>;\n readonly history?: { readonly capacity?: number } | false;\n}): DocumentRuntime<TSchema> => {\n const initialTreeError = tree.invalidDocument(input.schema, input.initial);\n if (initialTreeError)\n throw new TypeError(\n `Initial document contains an invalid tree at '${initialTreeError.join('.')}'.`\n );\n profile.clone.initialDocument();\n const state = {\n schema: input.schema,\n document: cloneValue(input.initial, 'initial'),\n disposed: false,\n };\n let revision = 0;\n let busy = false;\n let runtime!: DocumentRuntime<TSchema>;\n let notification!: RuntimeNotification<TSchema>;\n\n const assertWritable = (): void => {\n if (state.disposed) throw new DocumentDisposedError();\n if (busy) throw new DocumentReentrancyError();\n };\n\n const history = createHistory<DocumentCommit<TSchema>>({\n capacity: input.history === false ? 0 : Math.max(0, input.history?.capacity ?? 100),\n revision: () => revision,\n apply: operations => applyBatch(operations, 'history', false),\n });\n\n const publish = (\n batch: Extract<MutationBatch<TSchema>, { readonly status: 'changed' }>,\n source: CommitSource,\n kind: 'operations' | 'replace',\n recordHistory: boolean\n ): Extract<OperationResult<DocumentCommit<TSchema>>, { readonly status: 'committed' }> => {\n revision += 1;\n const commit: DocumentCommit<TSchema> = Object.freeze({\n revision,\n kind,\n source,\n operations: batch.operations,\n inverse: batch.inverse,\n impact: createImpact({\n schema: input.schema,\n operations: batch.operations,\n paths: batch.paths,\n collections: batch.collections,\n reset: kind === 'replace',\n }),\n });\n if (kind === 'replace' || source === 'remote') history.invalidate();\n else if (recordHistory && (source === 'local' || source === 'system'))\n history.record(batch.operations, batch.inverse);\n busy = true;\n let observerErrors;\n try {\n observerErrors = notify(notification, commit);\n } finally {\n busy = false;\n }\n return { status: 'committed', commit, observerErrors };\n };\n\n function applyBatch(\n operations: unknown,\n source: CommitSource,\n recordHistory: boolean\n ): OperationResult<DocumentCommit<TSchema>> {\n assertWritable();\n const batch = mutateOperations(state.document, input.schema, operations, {\n copyPayload: source === 'history',\n });\n if (batch.status === 'rejected') return { status: 'rejected', issues: batch.issues, revision };\n if (batch.status === 'unchanged') return { status: 'unchanged', revision };\n return publish(batch, source, 'operations', recordHistory);\n }\n\n runtime = {\n address: {\n resolve: address => resolveAddress(input.schema, address, state.document),\n read: address => readAddress(state.document, address),\n contains,\n overlaps,\n debugKey,\n },\n revision: () => revision,\n update: <TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => TResult,\n options?: {\n readonly source?: Extract<CommitSource, 'local' | 'system'>;\n readonly history?: boolean;\n }\n ): TransactionResult<TResult, DocumentCommit<TSchema>> => {\n assertWritable();\n busy = true;\n const session = createMutationSession(state.document, input.schema);\n let reports: DocumentDiagnostic[] | undefined;\n let active = true;\n const transaction: DocumentTransaction<TSchema> = {\n read: documentReader(\n input.schema,\n () => state.document,\n () => active\n ),\n write: documentWriter(input.schema, operation => {\n if (!active) throw new Error('Document writer is no longer active.');\n const rejected = session.apply(operation);\n if (rejected) throw new RejectedUpdate([rejected]);\n }),\n reject: diagnostic => {\n throw new RejectedUpdate(\n (Array.isArray(diagnostic) ? diagnostic : [diagnostic]).map(entry =>\n publishDiagnostic(entry)\n )\n );\n },\n report: diagnostic => {\n if (!active) throw new Error('Document transaction is no longer active.');\n (reports ??= []).push(publishDiagnostic(diagnostic));\n },\n };\n try {\n const value = run(transaction);\n if (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n throw new TypeError('Document update callback must be synchronous.');\n active = false;\n busy = false;\n const batch = session.finish();\n if (batch.status === 'unchanged')\n return {\n status: 'unchanged',\n value,\n revision,\n reports: Object.freeze(reports ?? EMPTY),\n };\n if (batch.status === 'rejected')\n return { status: 'rejected', issues: batch.issues, revision };\n const result = publish(\n batch,\n options?.source ?? 'local',\n 'operations',\n options?.history ?? true\n );\n return {\n status: 'committed',\n value,\n commit: result.commit,\n reports: Object.freeze(reports ?? EMPTY),\n observerErrors: result.observerErrors,\n };\n } catch (error) {\n active = false;\n try {\n session.rollback();\n } finally {\n busy = false;\n }\n if (error instanceof RejectedUpdate)\n return { status: 'rejected', issues: error.issues, revision };\n throw error;\n } finally {\n active = false;\n busy = false;\n }\n },\n apply: (operations, options) =>\n applyBatch(operations, options?.source ?? 'local', options?.history ?? true),\n replace: (document, options) => {\n assertWritable();\n const invalidTree = tree.invalidDocument(input.schema, document);\n if (invalidTree)\n return {\n status: 'rejected',\n issues: [\n issue.at(invalidTree, 'invalid-tree', 'Document replacement contains an invalid tree.'),\n ],\n revision,\n };\n if (deepEqual(state.document, document)) return { status: 'unchanged', revision };\n state.document = cloneValue(document, 'replace');\n const batch: Extract<MutationBatch<TSchema>, { readonly status: 'changed' }> = {\n status: 'changed',\n operations: EMPTY,\n inverse: EMPTY,\n paths: EMPTY,\n collections: EMPTY,\n };\n return publish(batch, options?.source ?? 'system', 'replace', false);\n },\n subscribe: ((\n targetOrListener:\n ImpactTarget<unknown> | readonly ImpactTarget<unknown>[] | CommitListener<TSchema>,\n listener?: CommitListener<TSchema>\n ) => {\n if (state.disposed) throw new DocumentDisposedError();\n if (typeof targetOrListener === 'function')\n return subscribeRoot(notification, targetOrListener);\n const targets = Array.isArray(targetOrListener)\n ? targetOrListener\n : [targetOrListener as ImpactTarget<unknown>];\n if (targets.length === 0 || !listener)\n throw new TypeError('Filtered subscribe requires at least one target and a listener.');\n return subscribeTargets(notification, targets, listener);\n }) as DocumentRuntime<TSchema>['subscribe'],\n history: history.api,\n dispose: () => {\n if (state.disposed) return;\n state.disposed = true;\n disposeNotification(notification);\n history.api.clear();\n },\n };\n\n bindRuntimeAccess(runtime, state);\n notification = createNotification(runtime);\n return runtime;\n};\n","import type { DocumentSchema } from '../schema';\nimport type { DocumentReader } from '../access/reader';\nimport type { DocumentRuntime } from '../runtime/contract';\nimport { readWith } from '../runtime/access';\n\nexport type DocumentSelector<TSchema extends DocumentSchema, TResult> = (\n read: DocumentReader<TSchema>\n) => TResult;\n\nexport const select = <TSchema extends DocumentSchema, TResult>(\n runtime: DocumentRuntime<TSchema>,\n selector: DocumentSelector<TSchema, TResult>\n): TResult => readWith(runtime, selector);\n","import type { CollectionSelector, DocumentSchema } from '../schema';\nimport type { EntityReader } from '../access/reader';\nimport { readerFor } from '../access/reader';\nimport type { DocumentRuntime } from '../runtime/contract';\nimport { documentOf, schemaOf } from '../runtime/access';\nimport { nodeAt, read } from '../address';\nimport { profile } from '../profile';\nimport type { Readable } from './readable';\n\ntype CollectionState<TId extends string, TValue> = {\n ids: readonly TId[];\n values: Map<TId, TValue>;\n all: readonly TValue[] | undefined;\n allDirty: boolean;\n};\n\nexport type CollectionView<TId extends string, TValue> = {\n readonly ids: Readable<readonly TId[]>;\n readonly all: Readable<readonly TValue[]>;\n readonly item: (id: TId) => Readable<TValue | undefined>;\n revision(): number;\n dispose(): void;\n};\n\nexport const createCollectionView = <\n TSchema extends DocumentSchema,\n TId extends string,\n TEntry,\n TValue,\n>(input: {\n readonly runtime: DocumentRuntime<TSchema>;\n readonly source: CollectionSelector<TId, TEntry>;\n readonly map: (id: TId, entry: EntityReader<TEntry>) => TValue;\n readonly isEqual?: (previous: TValue, next: TValue) => boolean;\n}): CollectionView<TId, TValue> => {\n if (schemaOf(input.runtime) !== input.source.schema)\n throw new Error('Collection selector belongs to another schema.');\n const idsListeners = new Set<() => void>();\n const allListeners = new Set<() => void>();\n const itemListeners = new Map<TId, Set<() => void>>();\n const itemReadables = new Map<TId, Readable<TValue | undefined>>();\n let disposed = false;\n const sourceNode = nodeAt(input.source.schema, input.source.address);\n const entryNode =\n sourceNode?.kind === 'table' || sourceNode?.kind === 'map'\n ? sourceNode.value\n : { kind: 'object' as const, shape: {} };\n\n const mapEntry = (document: unknown, id: TId): TValue => {\n profile.collectionView.mapped();\n const address = [...input.source.address, String(id)];\n let active = true;\n try {\n return input.map(\n id,\n readerFor(\n entryNode,\n { root: () => document, active: () => active },\n address\n ) as EntityReader<TEntry>\n );\n } finally {\n active = false;\n }\n };\n\n const build = (\n previous?: CollectionState<TId, TValue>,\n changed?: Set<TId>\n ): CollectionState<TId, TValue> => {\n const document = documentOf(input.runtime);\n const collection = read(document, input.source.address) as\n | {\n readonly ids?: readonly TId[];\n readonly byId?: Readonly<Record<string, unknown>>;\n }\n | Readonly<Record<string, unknown>>\n | undefined;\n const ids =\n collection &&\n typeof collection === 'object' &&\n 'ids' in collection &&\n Array.isArray(collection.ids)\n ? [...collection.ids]\n : (Object.keys(collection ?? {}) as TId[]);\n profile.collectionView.idsScanned(ids.length);\n const values = previous && changed ? previous.values : new Map<TId, TValue>();\n if (previous && changed) {\n const nextIds = new Set(ids);\n for (const id of previous.ids) if (!nextIds.has(id)) values.delete(id);\n }\n for (const id of ids) {\n if (previous && changed && previous.values.has(id) && !changed.has(id)) continue;\n const next = mapEntry(document, id);\n if (previous && changed && previous.values.has(id)) {\n const before = previous.values.get(id) as TValue;\n const equal = input.isEqual ? input.isEqual(before, next) : Object.is(before, next);\n if (equal) {\n changed.delete(id);\n continue;\n }\n }\n values.set(id, next);\n }\n const stableIds = Object.freeze(ids) as readonly TId[];\n return {\n ids: stableIds,\n values,\n all: undefined,\n allDirty: true,\n };\n };\n\n let state = build();\n const ensureAll = (): readonly TValue[] => {\n if (!state.allDirty && state.all) return state.all;\n profile.collectionView.arrayCopied();\n const all = new Array<TValue>(state.ids.length);\n for (let index = 0; index < state.ids.length; index += 1)\n all[index] = state.values.get(state.ids[index]) as TValue;\n const stable = Object.freeze(all) as readonly TValue[];\n state.all = stable;\n state.allDirty = false;\n return stable;\n };\n const emit = (listeners: Set<() => void>): void => {\n Array.from(listeners).forEach(listener => listener());\n };\n\n const unsubscribe = input.runtime.subscribe(input.source, commit => {\n if (disposed) return;\n const impact = commit.impact.collection(input.source);\n if (\n impact.kind === 'incremental' &&\n impact.added.size === 0 &&\n impact.removed.size === 0 &&\n !impact.orderChanged\n ) {\n const previous = state;\n const changes: Array<readonly [TId, TValue]> = [];\n const document = documentOf(input.runtime);\n impact.updated.forEach(id => {\n if (!previous.values.has(id)) return;\n const before = previous.values.get(id) as TValue;\n const after = mapEntry(document, id);\n if (input.isEqual ? input.isEqual(before, after) : Object.is(before, after)) return;\n changes.push([id, after]);\n });\n if (changes.length === 0) return;\n // Updated-only commits preserve ids and the values Map. The\n // aggregate array remains lazy until a consumer reads `all` again.\n for (const [id, value] of changes) previous.values.set(id, value);\n previous.all = undefined;\n previous.allDirty = true;\n emit(allListeners);\n for (const [id] of changes) {\n const listeners = itemListeners.get(id);\n if (listeners) emit(listeners);\n }\n return;\n }\n\n const changed =\n impact.kind === 'reset' ? undefined : new Set<TId>([...impact.added, ...impact.updated]);\n const previous = state;\n const next = build(previous, changed);\n const changedIds = new Set<TId>();\n if (changed) {\n changed.forEach(id => changedIds.add(id));\n previous.ids.forEach(id => {\n if (!next.values.has(id)) changedIds.add(id);\n });\n next.ids.forEach(id => {\n if (!previous.values.has(id)) changedIds.add(id);\n });\n } else {\n previous.ids.forEach(id => {\n if (!next.values.has(id)) changedIds.add(id);\n else {\n const equal = input.isEqual\n ? input.isEqual(previous.values.get(id) as TValue, next.values.get(id) as TValue)\n : Object.is(previous.values.get(id), next.values.get(id));\n if (!equal) changedIds.add(id);\n }\n });\n next.ids.forEach(id => {\n if (!previous.values.has(id)) changedIds.add(id);\n });\n }\n const idsChanged =\n impact.kind === 'incremental'\n ? impact.added.size > 0 || impact.removed.size > 0 || impact.orderChanged\n : previous.ids.length !== next.ids.length ||\n previous.ids.some((id, index) => next.ids[index] !== id);\n state = idsChanged || changedIds.size ? next : previous;\n if (idsChanged) emit(idsListeners);\n if (idsChanged || changedIds.size) emit(allListeners);\n changedIds.forEach(id => {\n const listeners = itemListeners.get(id);\n if (listeners) emit(listeners);\n });\n });\n\n return {\n ids: {\n current: () => state.ids,\n revision: () => input.runtime.revision(),\n subscribe: listener => {\n if (disposed) return () => undefined;\n idsListeners.add(listener);\n return () => idsListeners.delete(listener);\n },\n },\n all: {\n current: ensureAll,\n revision: () => input.runtime.revision(),\n subscribe: listener => {\n if (disposed) return () => undefined;\n allListeners.add(listener);\n return () => allListeners.delete(listener);\n },\n },\n item: id => {\n const cached = itemReadables.get(id);\n if (cached) return cached;\n const readable: Readable<TValue | undefined> = {\n current: () => state.values.get(id),\n revision: () => input.runtime.revision(),\n subscribe: listener => {\n if (disposed) return () => undefined;\n const listeners = itemListeners.get(id) ?? new Set<() => void>();\n itemListeners.set(id, listeners);\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) itemListeners.delete(id);\n };\n },\n };\n itemReadables.set(id, readable);\n return readable;\n },\n revision: () => input.runtime.revision(),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n unsubscribe();\n idsListeners.clear();\n allListeners.clear();\n itemListeners.clear();\n itemReadables.clear();\n state.values.clear();\n state = {\n ids: Object.freeze([]),\n values: new Map(),\n all: Object.freeze([]),\n allDirty: false,\n };\n },\n };\n};\n","import type { DocumentSchema, ImpactTarget } from '../schema';\nimport type { DocumentReader } from '../access/reader';\nimport { documentReader } from '../access/reader';\nimport { createDependencyTracker } from '../access/dependency';\nimport type { DocumentImpact } from '../impact';\nimport type { CommitSource, DocumentCommit, DocumentRuntime } from '../runtime/contract';\nimport { documentOf, schemaOf } from '../runtime/access';\nimport { registerProcessor } from '../runtime/notification';\nimport { profile } from '../profile';\nimport type { Readable } from './readable';\n\nexport type MaterializedSource<TValue, TChange> = {\n readonly value: TValue;\n readonly change: TChange | undefined;\n};\nexport type MaterializedSources = Readonly<Record<string, MaterializedView<unknown, unknown>>>;\nexport type MaterializedSourceValues<TSources extends MaterializedSources> = {\n readonly [K in keyof TSources]: TSources[K] extends MaterializedView<infer TValue, infer TChange>\n ? MaterializedSource<TValue, TChange>\n : never;\n};\nexport type MaterializedUpdateResult<TValue, TChange> =\n | {\n readonly kind: 'changed';\n readonly value: TValue;\n readonly change: TChange;\n }\n | { readonly kind: 'unchanged' }\n | { readonly kind: 'rebuild' };\nexport type MaterializedViewUpdate<\n TSchema extends DocumentSchema,\n TSources extends MaterializedSources,\n> = {\n readonly read: DocumentReader<TSchema>;\n readonly revision: number;\n readonly source: CommitSource;\n readonly impact: DocumentImpact<TSchema>;\n readonly sources: MaterializedSourceValues<TSources>;\n};\nexport type MaterializedViewSpec<\n TSchema extends DocumentSchema,\n TValue,\n TChange,\n TSources extends MaterializedSources,\n> = {\n readonly sources?: TSources;\n readonly build: (input: {\n readonly read: DocumentReader<TSchema>;\n readonly sources: MaterializedSourceValues<TSources>;\n }) => {\n readonly value: TValue;\n readonly update: (\n update: MaterializedViewUpdate<TSchema, TSources>\n ) => MaterializedUpdateResult<TValue, TChange>;\n };\n};\nexport type MaterializedView<TValue, TChange = void> = Readable<TValue> & {\n readonly __change?: TChange;\n rebuild(): void;\n dispose(): void;\n};\n\nconst materializedMeta = new WeakMap<\n object,\n {\n runtime: object;\n value: unknown;\n change: unknown;\n revision: number;\n changedRevision: number;\n }\n>();\n\nexport const createMaterializedView = <\n TSchema extends DocumentSchema,\n TValue,\n TChange = void,\n TSources extends MaterializedSources = {},\n>(\n runtime: DocumentRuntime<TSchema>,\n spec: MaterializedViewSpec<TSchema, TValue, TChange, TSources>\n): MaterializedView<TValue, TChange> => {\n const listeners = new Set<() => void>();\n let disposed = false;\n let fault: unknown;\n let revision = runtime.revision();\n let instance!: ReturnType<MaterializedViewSpec<TSchema, TValue, TChange, TSources>['build']>;\n let currentValue!: TValue;\n let pendingEmit = false;\n const dependencies = createDependencyTracker();\n const sources = (spec.sources ?? {}) as TSources;\n const sourceEntries = Object.keys(sources).map(\n key => [key, sources[key as keyof TSources]] as const\n );\n sourceEntries.forEach(([, source]) => {\n const meta = materializedMeta.get(source as object);\n if (!meta || meta.runtime !== (runtime as object))\n throw new Error('Materialized sources must belong to the same runtime and be created first.');\n });\n const sourceValuesRecord: Record<string, { value: unknown; change: unknown }> = {};\n let sourceChanged = false;\n for (const [key] of sourceEntries)\n sourceValuesRecord[key] = { value: undefined, change: undefined };\n const sourceValues = (commitRevision?: number): MaterializedSourceValues<TSources> => {\n sourceChanged = false;\n for (const [key, source] of sourceEntries) {\n const meta = materializedMeta.get(source as object);\n const entry = sourceValuesRecord[key];\n entry.value = meta?.value ?? source.current();\n entry.change = meta?.change;\n if (commitRevision !== undefined && meta?.changedRevision === commitRevision) {\n sourceChanged = true;\n profile.materialized.sourceChanged();\n }\n }\n return sourceValuesRecord as MaterializedSourceValues<TSources>;\n };\n\n let activeImpact: DocumentImpact<TSchema> | undefined;\n const assertImpact = (): DocumentImpact<TSchema> => {\n if (!activeImpact) throw new Error('Materialized impact is no longer active.');\n return activeImpact;\n };\n const trackedImpact: DocumentImpact<TSchema> = {\n get kind() {\n return assertImpact().kind;\n },\n affects: target => {\n dependencies.record(target);\n return assertImpact().affects(target);\n },\n collection: selector => {\n dependencies.record(selector);\n return assertImpact().collection(selector);\n },\n get operations() {\n dependencies.record({ kind: 'value', at: [] });\n return assertImpact().operations;\n },\n };\n\n let view!: MaterializedView<TValue, TChange>;\n const writeMeta = (\n change: unknown,\n value: unknown,\n nextRevision: number,\n changed: boolean\n ): void => {\n const meta = materializedMeta.get(view as object);\n if (meta) {\n meta.value = value;\n meta.change = change;\n meta.revision = nextRevision;\n if (changed) meta.changedRevision = nextRevision;\n } else {\n materializedMeta.set(view as object, {\n runtime: runtime as object,\n value,\n change,\n revision: nextRevision,\n changedRevision: changed ? nextRevision : -1,\n });\n }\n };\n const build = (): void => {\n profile.materialized.rebuilt();\n dependencies.clear();\n let active = true;\n try {\n instance = spec.build({\n read: documentReader(\n schemaOf(runtime),\n () => documentOf(runtime),\n () => active\n ),\n sources: sourceValues(),\n });\n currentValue = instance.value;\n fault = undefined;\n revision = runtime.revision();\n } finally {\n active = false;\n }\n };\n build();\n\n const emit = (): void => {\n profile.materialized.notification();\n Array.from(listeners).forEach(listener => listener());\n };\n const process = (commit: DocumentCommit<TSchema>): void => {\n if (disposed) return;\n try {\n if (commit.kind === 'replace' || fault) {\n build();\n writeMeta(undefined, currentValue, commit.revision, true);\n pendingEmit = true;\n return;\n }\n const sourceSnapshot = sourceValues(commit.revision);\n if (!sourceChanged && dependencies.size() > 0 && !dependencies.some(commit.impact.affects)) {\n profile.materialized.skipped();\n revision = commit.revision;\n writeMeta(undefined, currentValue, commit.revision, false);\n return;\n }\n dependencies.clear();\n profile.materialized.updated();\n let active = true;\n let result: MaterializedUpdateResult<TValue, TChange>;\n try {\n activeImpact = commit.impact;\n result = instance.update({\n read: documentReader(\n schemaOf(runtime),\n () => documentOf(runtime),\n () => active\n ),\n revision: commit.revision,\n source: commit.source,\n impact: trackedImpact,\n sources: sourceSnapshot,\n });\n } finally {\n activeImpact = undefined;\n active = false;\n }\n if (result.kind === 'rebuild') {\n build();\n writeMeta(undefined, currentValue, commit.revision, true);\n pendingEmit = true;\n } else if (result.kind === 'changed') {\n currentValue = result.value;\n revision = commit.revision;\n writeMeta(result.change, currentValue, commit.revision, true);\n pendingEmit = true;\n } else {\n revision = commit.revision;\n writeMeta(undefined, currentValue, commit.revision, false);\n }\n } catch (error) {\n try {\n build();\n writeMeta(undefined, currentValue, commit.revision, true);\n pendingEmit = true;\n } catch (rebuildError) {\n fault = rebuildError;\n throw rebuildError;\n }\n throw error;\n }\n };\n\n view = {\n current: () => {\n if (fault) throw fault;\n return currentValue;\n },\n revision: () => revision,\n subscribe: listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n rebuild: () => {\n build();\n writeMeta(undefined, currentValue, runtime.revision(), true);\n emit();\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n unregister();\n listeners.clear();\n materializedMeta.delete(view as object);\n },\n };\n materializedMeta.set(view as object, {\n runtime: runtime as object,\n value: currentValue,\n change: undefined,\n revision,\n changedRevision: -1,\n });\n // Runtime notification processes the complete source graph first, then\n // flushes external listeners so downstream views see upstream state/change\n // from the same commit without observing an intermediate pipeline state.\n const unregister = registerProcessor(runtime, {\n process,\n flush: () => {\n if (!pendingEmit) return;\n pendingEmit = false;\n emit();\n },\n });\n return view;\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_dependency = require("./dependency-DLcCvNKq.cjs");
|
|
3
|
+
//#region core/src/integration.ts
|
|
4
|
+
const track = (runtime, selector) => {
|
|
5
|
+
const dependencies = require_dependency.createDependencyTracker();
|
|
6
|
+
const value = require_dependency.readWith(runtime, selector, dependencies);
|
|
7
|
+
return Object.freeze({
|
|
8
|
+
value,
|
|
9
|
+
targets: dependencies.snapshot()
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
exports.track = track;
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=integration.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.cjs","names":["createDependencyTracker","readWith"],"sources":["../core/src/integration.ts"],"sourcesContent":["import type { DocumentSchema, ImpactTarget } from './schema';\nimport type { DocumentReader } from './access/reader';\nimport type { DocumentRuntime } from './runtime/contract';\nimport { createDependencyTracker } from './access/dependency';\nimport { readWith } from './runtime/access';\n\nexport type TrackedSelection<TValue> = {\n readonly value: TValue;\n readonly targets: readonly ImpactTarget<unknown>[];\n};\n\n// Framework adapters receive one immutable result instead of coordinating a\n// mutable collector with the reader's scoped lifetime themselves.\nexport const track = <TSchema extends DocumentSchema, TValue>(\n runtime: DocumentRuntime<TSchema>,\n selector: (read: DocumentReader<TSchema>) => TValue\n): TrackedSelection<TValue> => {\n const dependencies = createDependencyTracker();\n const value = readWith(runtime, selector, dependencies);\n return Object.freeze({ value, targets: dependencies.snapshot() });\n};\n"],"mappings":";;;AAaA,MAAa,SACX,SACA,aAC6B;CAC7B,MAAM,eAAeA,mBAAAA,yBAAyB;CAC9C,MAAM,QAAQC,mBAAAA,SAAS,SAAS,UAAU,aAAa;AACvD,QAAO,OAAO,OAAO;EAAE;EAAO,SAAS,aAAa,UAAU;EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { F as DocumentReader, bt as ImpactTarget, mt as DocumentSchema, s as DocumentRuntime } from "./contract-Otb5W6cQ.cjs";
|
|
2
|
+
|
|
3
|
+
//#region core/src/integration.d.ts
|
|
4
|
+
type TrackedSelection<TValue> = {
|
|
5
|
+
readonly value: TValue;
|
|
6
|
+
readonly targets: readonly ImpactTarget<unknown>[];
|
|
7
|
+
};
|
|
8
|
+
declare const track: <TSchema extends DocumentSchema, TValue>(runtime: DocumentRuntime<TSchema>, selector: (read: DocumentReader<TSchema>) => TValue) => TrackedSelection<TValue>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { TrackedSelection, track };
|
|
11
|
+
//# sourceMappingURL=integration.d.cts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { F as DocumentReader, bt as ImpactTarget, mt as DocumentSchema, s as DocumentRuntime } from "./contract-DwNiKioc.js";
|
|
2
|
+
|
|
3
|
+
//#region core/src/integration.d.ts
|
|
4
|
+
type TrackedSelection<TValue> = {
|
|
5
|
+
readonly value: TValue;
|
|
6
|
+
readonly targets: readonly ImpactTarget<unknown>[];
|
|
7
|
+
};
|
|
8
|
+
declare const track: <TSchema extends DocumentSchema, TValue>(runtime: DocumentRuntime<TSchema>, selector: (read: DocumentReader<TSchema>) => TValue) => TrackedSelection<TValue>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { TrackedSelection, track };
|
|
11
|
+
//# sourceMappingURL=integration.d.ts.map
|