doxum 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +38 -13
  2. package/dist/{contract-I99DUMbN.d.ts → contract-DNZ4D53r.d.ts} +87 -76
  3. package/dist/{contract-uYJTmT8o.d.cts → contract-j3SLGAwh.d.cts} +87 -76
  4. package/dist/index.cjs +221 -349
  5. package/dist/index.cjs.map +1 -1
  6. package/dist/index.d.cts +3 -3
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.js +209 -327
  9. package/dist/index.js.map +1 -1
  10. package/dist/{integration-xupBIKjU.js → integration-B56u1l9V.js} +2 -2
  11. package/dist/integration-B56u1l9V.js.map +1 -0
  12. package/dist/{integration-Bs3pOk65.cjs → integration-CZwCwFBS.cjs} +2 -2
  13. package/dist/integration-CZwCwFBS.cjs.map +1 -0
  14. package/dist/integration.cjs +10 -2
  15. package/dist/integration.d.cts +3 -3
  16. package/dist/integration.d.ts +3 -3
  17. package/dist/integration.js +3 -3
  18. package/dist/local-sync.cjs +56 -17
  19. package/dist/local-sync.cjs.map +1 -1
  20. package/dist/local-sync.d.cts +2 -2
  21. package/dist/local-sync.d.ts +2 -2
  22. package/dist/local-sync.js +56 -17
  23. package/dist/local-sync.js.map +1 -1
  24. package/dist/react.cjs +27 -19
  25. package/dist/react.cjs.map +1 -1
  26. package/dist/react.js +27 -19
  27. package/dist/react.js.map +1 -1
  28. package/dist/{runtime-CRijXjYp.cjs → runtime-0mOFbe_H.cjs} +899 -451
  29. package/dist/runtime-0mOFbe_H.cjs.map +1 -0
  30. package/dist/{runtime-CUcvhFNP.d.ts → runtime-B22tuj9A.d.cts} +18 -20
  31. package/dist/{runtime-C_vKHmhy.d.cts → runtime-BFmhzPpZ.d.ts} +18 -20
  32. package/dist/{runtime-BJRXF0gq.js → runtime-DF1q9Gje.js} +823 -429
  33. package/dist/runtime-DF1q9Gje.js.map +1 -0
  34. package/package.json +1 -1
  35. package/skills/doxum-runtime/SKILL.md +2 -1
  36. package/skills/doxum-runtime/references/guide.en.md +18 -18
  37. package/skills/doxum-runtime/references/guide.zh-CN.md +12 -17
  38. package/skills/doxum-runtime/references/invariants.en.md +1 -1
  39. package/skills/doxum-runtime/references/invariants.zh-CN.md +1 -1
  40. package/skills/doxum-runtime/references/patterns.en.md +9 -20
  41. package/skills/doxum-runtime/references/patterns.zh-CN.md +5 -18
  42. package/dist/integration-Bs3pOk65.cjs.map +0 -1
  43. package/dist/integration-xupBIKjU.js.map +0 -1
  44. package/dist/runtime-BJRXF0gq.js.map +0 -1
  45. package/dist/runtime-CRijXjYp.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-DF1q9Gje.js","names":["schemaRoot","address","readAddress","isRecord","anchor.keys","target.bucket","target.belongs","target.same"],"sources":["../core/src/schema.ts","../core/src/address.ts","../core/src/impact-target.ts","../core/src/runtime/contract.ts","../core/src/mutation/anchor.ts","../core/src/access/reader.ts","../core/src/mutation/footprint.ts","../core/src/runtime/access.ts","../core/src/runtime/notification.ts","../core/src/projection/contract.ts","../core/src/projection/scheduler.ts","../core/src/projection/node.ts","../core/src/projection/collection.ts","../core/src/projection/source.ts","../core/src/projection/value.ts","../core/src/projection/runtime.ts"],"sourcesContent":["export type DocumentAddress = readonly string[];\n\nexport type DocumentListConfig<TItem> = {\n readonly keyOf: (item: TItem) => string;\n};\nexport type DocumentTreeNode<TValue> = {\n readonly parentId?: string;\n readonly children: readonly string[];\n readonly value?: TValue;\n};\nexport type DocumentTreeValue<TValue> = {\n readonly rootId?: string;\n readonly nodes: Readonly<Record<string, DocumentTreeNode<TValue>>>;\n};\n\ntype BaseNode<K extends string> = {\n readonly kind: K;\n readonly optional?: boolean;\n};\nexport type FieldNode<T, Optional extends boolean = false> = BaseNode<'field'> & {\n readonly __value?: T;\n} & (Optional extends true ? { readonly optional: true } : { readonly optional?: false });\n/** A node with optional presence. The marker replaces, rather than intersects, a field marker. */\nexport type OptionalNode<TNode extends DocumentNode> =\n TNode extends FieldNode<infer TValue, boolean>\n ? FieldNode<TValue, true>\n : TNode & { readonly optional: true };\nexport interface ObjectShape {\n readonly [key: string]: DocumentNode;\n}\nexport type ObjectNode<TShape extends ObjectShape> = BaseNode<'object'> & {\n readonly shape: TShape;\n};\nexport interface VariantShape {\n readonly [key: string]: ObjectNode<ObjectShape>;\n}\nexport type VariantNode<\n TTag extends string,\n TVariants extends VariantShape,\n> = BaseNode<'variant'> & {\n readonly tag: TTag;\n readonly variants: TVariants;\n};\nexport type TableNode<TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n BaseNode<'table'> & {\n readonly value: TValue;\n };\nexport type MapNode<TValue extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n BaseNode<'map'> & {\n readonly value: TValue;\n };\nexport type DictNode<TKey extends string, TValue> = BaseNode<'dict'> & {\n readonly __key?: TKey;\n readonly __value?: TValue;\n};\nexport type ListNode<TItem> = BaseNode<'list'> & {\n readonly __item?: TItem;\n keyOf(item: TItem): string;\n};\nexport type TreeNode<TValue> = BaseNode<'tree'> & {\n readonly __value?: TValue;\n};\n\nexport type DocumentNode =\n | FieldNode<unknown, false>\n | FieldNode<unknown, true>\n | ObjectNode<ObjectShape>\n | VariantNode<string, VariantShape>\n | TableNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | MapNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>\n | DictNode<string, unknown>\n | ListNode<unknown>\n | TreeNode<unknown>;\n\ntype EntityValue<N extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n N extends ObjectNode<infer S>\n ? DocumentValueOfShape<S>\n : N extends VariantNode<infer T, infer V>\n ? {\n [K in keyof V & string]: { [P in T]: K } & DocumentValueOfShape<\n V[K] extends ObjectNode<infer S> ? S : never\n >;\n }[keyof V & string]\n : never;\n\nexport type DocumentValueOfNode<N> =\n N extends FieldNode<infer T, infer O>\n ? O extends true\n ? T | undefined\n : T\n : N extends ObjectNode<infer S>\n ? DocumentValueOfShape<S>\n : N extends VariantNode<infer T, infer V>\n ? EntityValue<VariantNode<T, V>>\n : N extends TableNode<infer V>\n ? {\n readonly ids: readonly string[];\n readonly byId: Readonly<Record<string, EntityValue<V>>>;\n }\n : N extends MapNode<infer V>\n ? Readonly<Record<string, EntityValue<V>>>\n : N extends DictNode<infer K, infer T>\n ? Readonly<Partial<Record<K, T>>>\n : N extends ListNode<infer I>\n ? readonly I[]\n : N extends TreeNode<infer T>\n ? DocumentTreeValue<T>\n : never;\n\ntype OptionalKeys<S extends ObjectShape> = {\n [K in keyof S]: S[K] extends { readonly optional: true } ? K : never;\n}[keyof S];\ntype RequiredKeys<S extends ObjectShape> = Exclude<keyof S, OptionalKeys<S>>;\nexport type DocumentValueOfShape<S extends ObjectShape> = {\n readonly [K in RequiredKeys<S>]: DocumentValueOfNode<S[K]>;\n} & { readonly [K in OptionalKeys<S>]?: DocumentValueOfNode<S[K]> };\nexport type ReadonlyDocument<S extends DocumentSchema> = DocumentValueOfShape<S['shape']>;\n\nexport type EntitySchemaNode = ObjectNode<ObjectShape> | VariantNode<string, VariantShape>;\n\nexport type CollectionSelector<\n TId extends string = string,\n TNode extends EntitySchemaNode = EntitySchemaNode,\n> = {\n readonly kind: 'collection';\n readonly schema: DocumentSchema;\n readonly address: DocumentAddress;\n readonly __id?: TId;\n /** Compile-time entry schema carried by schema selectors. */\n readonly __node?: TNode;\n};\nexport type ValueSelector<TResult = unknown> = {\n readonly kind: 'value';\n readonly schema: DocumentSchema;\n readonly address: DocumentAddress;\n readonly __value?: TResult;\n};\nexport type ImpactTarget<T = unknown> =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | ValueSelector<T>\n | {\n readonly kind: 'collection';\n readonly at: DocumentAddress;\n readonly id?: string;\n }\n | CollectionSelector<string>;\ndeclare const pathValue: unique symbol;\ndeclare const collectionNode: unique symbol;\ntype PathMarker<TValue> = { readonly [pathValue]: TValue };\n\ntype SchemaPathFor<S extends ObjectShape = ObjectShape, TValue = unknown> = {\n readonly [K in keyof S]: PathValue<S[K]>;\n} & PathMarker<TValue>;\n\nexport type DocumentSchema<TShape extends ObjectShape = {}> = {\n readonly kind: 'schema';\n readonly shape: TShape;\n collection<TPath extends CollectionPath>(\n pick: (path: SchemaPath<TShape>) => TPath\n ): CollectionSelector<CollectionId<TPath>, CollectionNode<TPath>>;\n value<TPath extends PathMarker<unknown>>(\n pick: (path: SchemaPath<TShape>) => TPath\n ): ValueSelector<PathValueResult<TPath>>;\n};\n\nexport type SchemaPath<S extends ObjectShape = {}> = SchemaPathFor<S, DocumentValueOfShape<S>>;\n\ntype VariantKeys<V extends VariantShape> = {\n [K in keyof V & string]: keyof (V[K] extends ObjectNode<infer S> ? S : {});\n}[keyof V & string] &\n string;\ntype VariantFieldPath<V extends VariantShape, K extends string> = {\n [P in keyof V & string]: V[P] extends ObjectNode<infer S>\n ? K extends keyof S\n ? PathValue<S[K]>\n : never\n : never;\n}[keyof V & string];\ntype VariantPath<T extends string, V extends VariantShape> = {\n readonly [K in VariantKeys<V>]: VariantFieldPath<V, K>;\n} & { readonly [K in T]: PathMarker<keyof V & string> } & PathMarker<\n EntityValue<VariantNode<T, V>>\n >;\ntype PathNodeValue<N extends DocumentNode> = N extends { readonly optional: true }\n ? DocumentValueOfNode<N> | undefined\n : DocumentValueOfNode<N>;\ntype EntityPath<N extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, PathNodeValue<N>>\n : N extends VariantNode<infer T, infer V>\n ? VariantPath<T, V>\n : never;\nexport type CollectionPath<\n N extends EntitySchemaNode = EntitySchemaNode,\n TValue = unknown,\n> = PathMarker<TValue> & {\n readonly item: (id: string) => EntityPath<N>;\n readonly [collectionNode]: N;\n};\n\ntype PathValue<N extends DocumentNode> =\n N extends ObjectNode<infer S>\n ? SchemaPathFor<S, PathNodeValue<N>>\n : N extends VariantNode<infer TTag, infer V>\n ? VariantPath<TTag, V>\n : N extends TableNode<infer V> | MapNode<infer V>\n ? CollectionPath<V, PathNodeValue<N>>\n : PathMarker<PathNodeValue<N>>;\ntype CollectionInfo<T> = T extends {\n readonly [collectionNode]: infer TNode extends EntitySchemaNode;\n}\n ? { readonly id: string; readonly node: TNode }\n : never;\ntype CollectionId<T> =\n CollectionInfo<T> extends { readonly id: infer TId extends string } ? TId : string;\nexport type CollectionNode<T> =\n CollectionInfo<T> extends { readonly node: infer TNode extends EntitySchemaNode }\n ? TNode\n : EntitySchemaNode;\ntype PathValueResult<T> = T extends PathMarker<infer TValue> ? TValue : unknown;\n\nconst node = <T extends DocumentNode>(value: T): T => Object.freeze(value);\nexport const field = <T>(): FieldNode<T> => node({ kind: 'field' });\ntype OptionalLeaf =\n | FieldNode<unknown, boolean>\n | VariantNode<string, VariantShape>\n | DictNode<string, unknown>\n | ListNode<unknown>\n | TreeNode<unknown>;\nexport const optional = <T extends OptionalLeaf>(value: T): OptionalNode<T> => {\n if (!['field', 'variant', 'dict', 'list', 'tree'].includes(value.kind))\n throw new TypeError(\n 'Only field, variant, dict, list and tree nodes support optional presence.'\n );\n return node({ ...value, optional: true } as OptionalNode<T>);\n};\nexport const object = <S extends ObjectShape>(shape: S): ObjectNode<S> =>\n node({ kind: 'object', shape });\nexport const variant = <T extends string, V extends VariantShape>(\n tag: T,\n variants: V\n): VariantNode<T, V> => node({ kind: 'variant', tag, variants });\nexport const table = <V extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>(\n value: V\n): TableNode<V> => node({ kind: 'table', value });\nexport const map = <V extends ObjectNode<ObjectShape> | VariantNode<string, VariantShape>>(\n value: V\n): MapNode<V> => node({ kind: 'map', value });\nexport const dict = <TKey extends string = string, TValue = unknown>(): DictNode<TKey, TValue> =>\n node({ kind: 'dict' });\nexport const list = <TItem>(config: DocumentListConfig<TItem>): ListNode<TItem> =>\n ({ kind: 'list', keyOf: config.keyOf }) as ListNode<TItem>;\nexport const tree = <TValue = unknown>(): TreeNode<TValue> => node({ kind: 'tree' });\n\nconst paths = new WeakMap<\n object,\n {\n readonly address: DocumentAddress;\n readonly nodes: readonly DocumentNode[];\n readonly owner: object;\n }\n>();\nconst collectionSchemas = new WeakMap<\n object,\n TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode>\n>();\nexport const collectionSchema = (\n selector: CollectionSelector\n): TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode> => {\n const node = collectionSchemas.get(selector);\n if (!node) throw new TypeError('Expected a schema-owned collection selector.');\n return node;\n};\n\nconst pathProxy = (\n nodes: readonly DocumentNode[],\n address: DocumentAddress,\n owner: object\n): object => {\n const proxy = new Proxy(\n {},\n {\n get: (_target, property: string | symbol) => {\n if (typeof property !== 'string') return undefined;\n const collection = nodes.every(node => node.kind === 'table' || node.kind === 'map');\n if (collection && property === 'item')\n return (id: string) => {\n if (typeof id !== 'string') throw new TypeError('Collection keys must be strings.');\n return pathProxy(\n nodes.map(node => (node as TableNode<EntitySchemaNode>).value),\n [...address, id],\n owner\n );\n };\n const children = nodes.flatMap(node => {\n if (node.kind === 'object') return node.shape[property] ? [node.shape[property]] : [];\n if (node.kind !== 'variant') return [];\n if (property === node.tag) return [field<string>()];\n return Object.values(node.variants).flatMap(branch =>\n branch.shape[property] ? [branch.shape[property]] : []\n );\n });\n if (!children.length) throw new TypeError(`Invalid schema path segment: ${property}`);\n return pathProxy(children, [...address, property], owner);\n },\n }\n );\n paths.set(proxy, { nodes, address, owner });\n return proxy;\n};\n\nconst select = <S extends ObjectShape>(\n owner: DocumentSchema<S>,\n kind: 'collection' | 'value',\n pick: (path: SchemaPath<S>) => unknown\n): CollectionSelector | ValueSelector => {\n const scope = {};\n const value = pick(pathProxy([object(owner.shape)], [], scope) as SchemaPath<S>);\n const selected = typeof value === 'object' && value !== null ? paths.get(value) : undefined;\n if (!selected || selected.owner !== scope)\n throw new TypeError('Selector must return a path from its callback.');\n if (\n kind === 'collection' &&\n !selected.nodes.every(node => node.kind === 'table' || node.kind === 'map')\n )\n throw new TypeError('Collection selectors require a table or map path.');\n const result = Object.freeze({\n kind,\n schema: owner,\n address: Object.freeze([...selected.address]),\n }) as CollectionSelector | ValueSelector;\n if (kind === 'collection')\n collectionSchemas.set(\n result,\n selected.nodes[0] as TableNode<EntitySchemaNode> | MapNode<EntitySchemaNode>\n );\n return result;\n};\n\nexport const schema = <S extends ObjectShape>(shape: S): DocumentSchema<S> => {\n const result: DocumentSchema<S> = {\n kind: 'schema',\n shape,\n collection: <TPath extends CollectionPath>(pick: (path: SchemaPath<S>) => TPath) =>\n select(result, 'collection', pick) as CollectionSelector<\n CollectionId<TPath>,\n CollectionNode<TPath>\n >,\n value: <TPath extends PathMarker<unknown>>(pick: (path: SchemaPath<S>) => TPath) =>\n select(result, 'value', pick) as ValueSelector<PathValueResult<TPath>>,\n };\n return Object.freeze(result);\n};\n","import type { DocumentAddress, DocumentNode, DocumentSchema, ObjectShape } from './schema';\nimport { profile } from './profile';\n\n/** The only resolved address representation used inside the runtime. */\nexport type AddressRef = {\n readonly path: number;\n readonly address: DocumentAddress;\n};\n\ntype RegistryNode = {\n readonly static: Map<string, RegistryNode>;\n dynamic?: RegistryNode;\n path?: number;\n};\n\ntype Registry = {\n readonly root: RegistryNode;\n nextPath: number;\n};\n\nconst registries = new WeakMap<object, Registry>();\nconst registryNode = (): RegistryNode => ({ static: new Map() });\nconst registryFor = (schema: DocumentSchema): Registry => {\n const cached = registries.get(schema as object);\n if (cached) return cached;\n const registry: Registry = { root: registryNode(), nextPath: 0 };\n registries.set(schema as object, registry);\n return registry;\n};\n\nconst hashText = (value: string, seed: number): number => {\n let hash = seed;\n for (let index = 0; index < value.length; index += 1)\n hash = Math.imul(hash ^ value.charCodeAt(index), 16_777_619);\n return hash >>> 0;\n};\n\nconst appendAddressHash = (hash: number, segment: string): number =>\n hashText(segment, hashText('/', hash));\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst variantNode = (\n node: Extract<DocumentNode, { kind: 'variant' }>,\n value: unknown\n): DocumentNode | undefined => {\n const tag = isRecord(value) && typeof value[node.tag] === 'string' ? value[node.tag] : undefined;\n return node.variants[String(tag ?? Object.keys(node.variants)[0] ?? '')];\n};\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => ({\n kind: 'object',\n shape: schema.shape,\n});\n\ntype Step = {\n readonly node: DocumentNode | undefined;\n readonly dynamic: boolean;\n};\n\nconst step = (nodeInput: DocumentNode | undefined, value: unknown, segment: string): Step => {\n let node = nodeInput;\n if (!node) return { node: undefined, dynamic: false };\n if (node.kind === 'variant') {\n node = variantNode(node, value);\n }\n if (!node) return { node: undefined, dynamic: false };\n if (node.kind === 'object') return { node: node.shape[segment], dynamic: false };\n if (node.kind === 'table' || node.kind === 'map') return { node: node.value, dynamic: true };\n // These nodes use operation-specific keys rather than address segments, but\n // accepting a dynamic step keeps address resolution total for user targets.\n if (node.kind === 'dict' || node.kind === 'list' || node.kind === 'tree')\n return { node, dynamic: true };\n return { node: undefined, dynamic: false };\n};\n\nconst pathFor = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): number | undefined => {\n const registry = registryFor(schema);\n let trie = registry.root;\n let node: DocumentNode | undefined = schemaRoot(schema);\n let value: unknown = document;\n for (const segment of address) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, value, segment);\n if (!resolved.node) return undefined;\n const next = resolved.dynamic\n ? (trie.dynamic ??= registryNode())\n : (() => {\n const existing = trie.static.get(segment);\n if (existing) return existing;\n const created = registryNode();\n trie.static.set(segment, created);\n return created;\n })();\n trie = next;\n node = resolved.node;\n value = readSegment(value, segment);\n }\n if (trie.path === undefined) trie.path = registry.nextPath++;\n return trie.path;\n};\n\nexport const resolveAddress = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): AddressRef | undefined => {\n if (!Array.isArray(address)) return undefined;\n for (const segment of address) if (typeof segment !== 'string') return undefined;\n profile.address.arrayCopied();\n const owned = Object.freeze(address.slice()) as DocumentAddress;\n const path = pathFor(schema, owned, document);\n return path === undefined ? undefined : { path, address: owned };\n};\n\nexport const nodeAt = (\n schema: DocumentSchema,\n address: DocumentAddress,\n document?: unknown\n): DocumentNode | undefined => {\n let node: DocumentNode | undefined = schemaRoot(schema);\n let value = document;\n for (const segment of address) {\n const resolved = step(node, value, segment);\n node = resolved.node;\n value = readSegment(value, segment);\n if (!node) return undefined;\n }\n return node;\n};\n\nexport const readSegment = (value: unknown, segment: string): unknown => {\n if (!isRecord(value) && !Array.isArray(value)) return undefined;\n if (isRecord(value) && 'byId' in value && isRecord(value.byId)) {\n const entity = value.byId[segment];\n if (entity !== undefined || Object.prototype.hasOwnProperty.call(value.byId, segment))\n return entity;\n }\n return (value as Record<string, unknown>)[segment];\n};\n\nexport const read = (root: unknown, address: DocumentAddress): unknown => {\n let value = root;\n for (const segment of address) {\n value = readSegment(value, segment);\n if (value === undefined) return undefined;\n }\n return value;\n};\n\nexport type Located = {\n readonly parent: Record<string, unknown> | unknown[];\n readonly key: string | number;\n readonly value: unknown;\n};\n\ntype ResolvedCollection = {\n readonly address: DocumentAddress;\n readonly addressHash: number;\n readonly id: string;\n readonly parent?: ResolvedCollection;\n};\n\nexport type ResolvedAddress = Located & {\n readonly addressHash: number;\n readonly node: DocumentNode;\n readonly collection?: ResolvedCollection;\n};\n\n/** Resolves schema and document location in one address traversal. */\nexport const resolveLocated = (\n schema: DocumentSchema,\n root: unknown,\n address: DocumentAddress\n): ResolvedAddress | undefined => {\n if (address.length === 0) return undefined;\n let node: DocumentNode | undefined = schemaRoot(schema);\n let current: unknown = root;\n let collection: ResolvedCollection | undefined;\n let addressHash = 2_166_136_261;\n for (let index = 0; index < address.length - 1; index += 1) {\n profile.address.schemaStep();\n profile.address.documentStep();\n const resolved = step(node, current, address[index]);\n if (!resolved.node) return undefined;\n if (node?.kind === 'table' || node?.kind === 'map')\n collection = {\n address: address.slice(0, index),\n addressHash,\n id: address[index],\n ...(collection ? { parent: collection } : {}),\n };\n addressHash = appendAddressHash(addressHash, address[index]);\n node = resolved.node;\n current = readSegment(current, address[index]);\n if (!node) return undefined;\n }\n profile.address.schemaStep();\n profile.address.documentStep();\n const last = address[address.length - 1];\n const resolved = step(node, current, last);\n if (!resolved.node || (!isRecord(current) && !Array.isArray(current))) return undefined;\n if (node?.kind === 'table' || node?.kind === 'map')\n collection = {\n address: address.slice(0, -1),\n addressHash,\n id: last,\n ...(collection ? { parent: collection } : {}),\n };\n addressHash = appendAddressHash(addressHash, last);\n if (isRecord(current) && 'byId' in current && isRecord(current.byId) && last in current.byId)\n return {\n addressHash,\n node: resolved.node,\n parent: current.byId,\n key: last,\n value: current.byId[last],\n ...(collection ? { collection } : {}),\n };\n return {\n addressHash,\n node: resolved.node,\n parent: current,\n key: Array.isArray(current) && /^\\d+$/.test(last) ? Number(last) : last,\n value: readSegment(current, last),\n ...(collection ? { collection } : {}),\n };\n};\n\nexport const locate = (root: unknown, address: DocumentAddress): Located | undefined => {\n if (address.length === 0) return undefined;\n let current: unknown = root;\n for (let index = 0; index < address.length - 1; index += 1)\n current = readSegment(current, address[index]);\n if (!isRecord(current) && !Array.isArray(current)) return undefined;\n const last = address[address.length - 1];\n if (isRecord(current) && 'byId' in current && isRecord(current.byId) && last in current.byId)\n return { parent: current.byId, key: last, value: current.byId[last] };\n return {\n parent: current,\n key: Array.isArray(current) && /^\\d+$/.test(last) ? Number(last) : last,\n value: readSegment(current, last),\n };\n};\n\nexport const set = (root: unknown, address: DocumentAddress, value: unknown): boolean => {\n const target = locate(root, address);\n if (!target) return false;\n (target.parent as Record<string | number, unknown>)[target.key] = value;\n return true;\n};\n\nexport const remove = (root: unknown, address: DocumentAddress): boolean => {\n const target = locate(root, address);\n if (!target || !Object.prototype.hasOwnProperty.call(target.parent, target.key)) return false;\n if (Array.isArray(target.parent)) target.parent.splice(Number(target.key), 1);\n else delete target.parent[String(target.key)];\n return true;\n};\n\nexport const contains = (parent: DocumentAddress, child: DocumentAddress): boolean => {\n profile.address.prefixComparison();\n if (parent.length > child.length) return false;\n for (let index = 0; index < parent.length; index += 1) {\n profile.address.segmentCompared();\n if (parent[index] !== child[index]) return false;\n }\n return true;\n};\n\nexport const overlaps = (a: DocumentAddress, b: DocumentAddress): boolean =>\n contains(a, b) || contains(b, a);\n\nexport const debugKey = (address: DocumentAddress): string => {\n let result = '';\n for (let index = 0; index < address.length; index += 1) {\n if (index > 0) result += '/';\n result += address[index].replaceAll('~', '~~').replaceAll('/', '~/');\n }\n return result;\n};\n\nexport const same = (a: AddressRef, b: AddressRef): boolean => {\n if (a.path !== b.path || a.address.length !== b.address.length) return false;\n for (let index = 0; index < a.address.length; index += 1) {\n profile.address.segmentCompared();\n if (a.address[index] !== b.address[index]) return false;\n }\n return true;\n};\n\nexport type { DocumentAddress } from './schema';\n","import type { DocumentAddress, DocumentSchema, ImpactTarget } from './schema';\n\nexport const address = (target: ImpactTarget<unknown>): DocumentAddress =>\n 'at' in target ? target.at : target.address;\n\nexport const id = (target: ImpactTarget<unknown>): string | undefined =>\n target.kind === 'collection' && 'id' in target ? target.id : undefined;\n\nexport const belongs = (target: ImpactTarget<unknown>, schema: DocumentSchema): boolean =>\n !('schema' in target) || target.schema === schema;\n\nexport const same = (left: ImpactTarget<unknown>, right: ImpactTarget<unknown>): boolean => {\n if (left.kind !== right.kind) return false;\n if ('schema' in left && 'schema' in right && left.schema !== right.schema) return false;\n const leftAddress = address(left);\n const rightAddress = address(right);\n if (leftAddress.length !== rightAddress.length) return false;\n for (let index = 0; index < leftAddress.length; index += 1)\n if (leftAddress[index] !== rightAddress[index]) return false;\n return left.kind !== 'collection' || id(left) === id(right);\n};\n\nexport const bucket = (target: ImpactTarget<unknown>): string | undefined => address(target)[0];\n","import type { DocumentAddress, DocumentSchema, ImpactTarget, ReadonlyDocument } from '../schema';\nimport type { AddressRef } from '../address';\nimport type { DocumentOperation } from '../operations';\nimport type { DocumentImpact } from '../impact';\nimport type { DocumentReader } from '../access/reader';\nimport type { DocumentWriter } from '../access/writer';\nimport type { MutationIssue } from '../mutation/issue';\nimport type { CommandFootprint } from '../mutation/footprint';\nimport type { Readable } from '../projection/readable';\n\nexport type Unsubscribe = () => void;\nexport type Synchronous<T> = T extends PromiseLike<unknown> ? never : T;\nexport type CommitSource = 'local' | 'system' | 'history' | 'remote';\n\nexport class DocumentReentrancyError extends Error {\n constructor() {\n super('Document writes cannot be re-entered during an update or notification.');\n this.name = 'DocumentReentrancyError';\n }\n}\n\nexport class DocumentDisposedError extends Error {\n constructor() {\n super('Doxum runtime has been disposed.');\n this.name = 'DocumentDisposedError';\n }\n}\nexport type DocumentCommit<TSchema extends DocumentSchema> = {\n readonly revision: number;\n readonly kind: 'operations' | 'replace';\n readonly source: CommitSource;\n readonly operations: readonly DocumentOperation[];\n readonly inverse: readonly DocumentOperation[];\n readonly impact: DocumentImpact<TSchema>;\n};\nexport type DiagnosticInput = {\n readonly code: string;\n readonly message: string;\n readonly address?: DocumentAddress;\n};\nexport type DocumentDiagnostic = DiagnosticInput & { readonly source: 'application' };\nexport type DocumentProblem = DocumentDiagnostic | MutationIssue;\nexport type ObserverError = {\n readonly phase: 'processor' | 'flush' | 'listener';\n readonly error: unknown;\n};\nexport type TransactionResult<TValue, TCommit> =\n | {\n readonly status: 'committed';\n readonly value: TValue;\n readonly commit: TCommit;\n readonly reports: readonly DocumentDiagnostic[];\n readonly observerErrors: readonly ObserverError[];\n }\n | {\n readonly status: 'unchanged';\n readonly value: TValue;\n readonly revision: number;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n readonly revision: number;\n };\nexport type PreparedUpdateResult<TValue, TSchema extends DocumentSchema> =\n | {\n readonly status: 'prepared';\n readonly value: TValue;\n readonly operations: readonly DocumentOperation[];\n readonly inverse: readonly DocumentOperation[];\n readonly impact: DocumentImpact<TSchema>;\n readonly footprint: CommandFootprint;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'unchanged';\n readonly value: TValue;\n readonly reports: readonly DocumentDiagnostic[];\n }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n };\nexport type OperationResult<TCommit> =\n | {\n readonly status: 'committed';\n readonly commit: TCommit;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly MutationIssue[];\n readonly revision: number;\n };\n\nexport type HistoryState = {\n readonly undoDepth: number;\n readonly redoDepth: number;\n};\nexport type LocalHistory<TCommit> = Readable<HistoryState> & {\n undo(): OperationResult<TCommit>;\n redo(): OperationResult<TCommit>;\n clear(): void;\n group(): { end(): void; cancel(): OperationResult<TCommit> };\n};\n\nexport type DocumentTransaction<TSchema extends DocumentSchema> = {\n readonly read: DocumentReader<TSchema>;\n readonly write: DocumentWriter<TSchema>;\n readonly reject: (issue: DiagnosticInput | readonly DiagnosticInput[]) => never;\n readonly report: (issue: DiagnosticInput) => void;\n};\nexport type CommitListener<TSchema extends DocumentSchema> = (\n commit: DocumentCommit<TSchema>\n) => void;\n\nexport type DocumentReadable<TSchema extends DocumentSchema> = {\n readonly address: {\n readonly resolve: (address: DocumentAddress) => AddressRef | undefined;\n readonly read: (address: DocumentAddress) => unknown;\n readonly contains: (parent: DocumentAddress, child: DocumentAddress) => boolean;\n readonly overlaps: (left: DocumentAddress, right: DocumentAddress) => boolean;\n readonly debugKey: (address: DocumentAddress) => string;\n };\n revision(): number;\n subscribe(listener: CommitListener<TSchema>): Unsubscribe;\n subscribe(\n target: ImpactTarget<unknown> | readonly [ImpactTarget<unknown>, ...ImpactTarget<unknown>[]],\n listener: CommitListener<TSchema>\n ): Unsubscribe;\n};\n\nexport type DocumentRuntime<TSchema extends DocumentSchema> = DocumentReadable<TSchema> & {\n /** Schema configuration captured when this runtime was created. */\n readonly schema: TSchema;\n update<TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => Synchronous<TResult>,\n options?: {\n readonly source?: Extract<CommitSource, 'local' | 'system'>;\n readonly history?: boolean;\n }\n ): TransactionResult<TResult, DocumentCommit<TSchema>>;\n prepare<TResult>(\n run: (transaction: DocumentTransaction<TSchema>) => Synchronous<TResult>\n ): PreparedUpdateResult<TResult, TSchema>;\n apply(\n operations: unknown,\n options?: {\n readonly source?: Exclude<CommitSource, 'history'>;\n readonly history?: boolean;\n }\n ): OperationResult<DocumentCommit<TSchema>>;\n replace(\n document: ReadonlyDocument<TSchema>,\n options?: { readonly source?: Extract<CommitSource, 'system' | 'remote'> }\n ): OperationResult<DocumentCommit<TSchema>>;\n snapshot(): ReadonlyDocument<TSchema>;\n readonly history: LocalHistory<DocumentCommit<TSchema>>;\n dispose(): void;\n};\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 { object } from '../schema';\nimport type {\n DictNode,\n DocumentAddress,\n DocumentNode,\n DocumentSchema,\n DocumentValueOfNode,\n EntitySchemaNode,\n ImpactTarget,\n ListNode,\n MapNode,\n ObjectNode,\n ReadonlyDocument,\n TableNode,\n TreeNode,\n VariantNode,\n} from '../schema';\nimport { read as readAddress } from '../address';\nimport { cloneValue, isRecord } from '../value/ownership';\nimport { profile } from '../profile';\nimport type { DependencyTracker } from './dependency';\nimport * as anchor from '../mutation/anchor';\n\nexport type FieldReader<T> = { readonly get: () => T };\nexport type DictionaryReader<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n keys(): readonly K[];\n values(): Readonly<Partial<Record<K, V>>>;\n};\nexport type CollectionReader<TId, TNode extends EntitySchemaNode> = {\n readonly ids: () => readonly TId[];\n readonly has: (id: TId) => boolean;\n readonly get: (id: TId) => ReaderOfNode<TNode> | undefined;\n};\nexport type ListReader<T> = {\n readonly get: (key: string) => T | undefined;\n readonly has: (key: string) => boolean;\n readonly values: () => readonly T[];\n readonly length: () => number;\n readonly at: (index: number) => T | undefined;\n};\nexport type TreeReader<T> = {\n readonly rootId: () => string | undefined;\n readonly has: (id: string) => boolean;\n readonly value: (id: string) => T | undefined;\n readonly parent: (id: string) => string | undefined;\n readonly children: (id: string) => readonly string[];\n};\n\nexport type ReaderOfNode<TNode extends DocumentNode> = TNode extends {\n kind: 'field';\n}\n ? FieldReader<DocumentValueOfNode<TNode>>\n : TNode extends ObjectNode<infer TShape>\n ? { readonly [K in keyof TShape]: ReaderOfNode<TShape[K]> }\n : TNode extends VariantNode<string, infer _TVariants>\n ? FieldReader<\n | DocumentValueOfNode<TNode>\n | (TNode extends { readonly optional: true } ? undefined : never)\n >\n : TNode extends TableNode<infer TValue>\n ? CollectionReader<string, TValue>\n : TNode extends MapNode<infer TValue>\n ? CollectionReader<string, TValue>\n : TNode extends DictNode<infer TKey, infer TValue>\n ? DictionaryReader<TKey, TValue>\n : TNode extends ListNode<infer TItem>\n ? ListReader<TItem>\n : TNode extends TreeNode<infer TValue>\n ? TreeReader<TValue>\n : FieldReader<DocumentValueOfNode<TNode>>;\nexport type DocumentReader<TSchema extends DocumentSchema> = ReaderOfNode<\n ObjectNode<TSchema['shape']>\n>;\n\nexport type ReaderContext = {\n readonly root: () => unknown;\n readonly active: () => boolean;\n readonly dependencies?: DependencyTracker;\n};\n\nconst schemaRoot = (schema: DocumentSchema): DocumentNode => object(schema.shape);\n\nconst assertActive = (context: ReaderContext): void => {\n if (!context.active()) throw new Error('Document reader is no longer active.');\n};\n\nconst readAt = (context: ReaderContext, address: DocumentAddress): unknown => {\n assertActive(context);\n profile.reader.lookup();\n return readAddress(context.root(), address);\n};\n\nconst collectValue = (context: ReaderContext, address: DocumentAddress): void => {\n context.dependencies?.record({ kind: 'value', at: address });\n};\n\nconst collectCollection = (context: ReaderContext, address: DocumentAddress, id?: string): void => {\n const target: ImpactTarget<unknown> = {\n kind: 'collection',\n at: address,\n ...(id === undefined ? {} : { id }),\n };\n context.dependencies?.record(target);\n};\n\nexport const readerFor = (\n node: DocumentNode,\n context: ReaderContext,\n address: DocumentAddress = []\n): unknown => {\n if (node.kind === 'field')\n return {\n get: () => {\n collectValue(context, address);\n return readAt(context, address);\n },\n };\n if (node.kind === 'dict')\n return {\n get: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return cloneValue(\n isRecord(value) && Object.prototype.hasOwnProperty.call(value, key)\n ? value[key]\n : undefined,\n 'reader'\n );\n },\n has: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) && Object.prototype.hasOwnProperty.call(value, key);\n },\n keys: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) ? Object.keys(value) : [];\n },\n values: () => {\n collectValue(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(readAt(context, address) ?? {}, 'reader');\n },\n };\n if (node.kind === 'list')\n return {\n get: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n if (!Array.isArray(value)) return undefined;\n return cloneValue(value[anchor.keys(value, node.keyOf).index(key)], 'reader');\n },\n has: (key: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return Array.isArray(value) && anchor.keys(value, node.keyOf).index(key) >= 0;\n },\n values: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(Array.isArray(value) ? value : [], 'reader');\n },\n length: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return Array.isArray(value) ? value.length : 0;\n },\n at: (index: number) => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(Array.isArray(value) ? value[index] : undefined, 'reader');\n },\n };\n if (node.kind === 'tree')\n return {\n rootId: () => {\n collectValue(context, address);\n const value = readAt(context, address);\n return isRecord(value) && typeof value.rootId === 'string' ? value.rootId : undefined;\n },\n has: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n return (\n isRecord(value) &&\n isRecord(value.nodes) &&\n Object.prototype.hasOwnProperty.call(value.nodes, id)\n );\n },\n value: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n profile.reader.structuralSnapshot();\n return cloneValue(\n isRecord(value) && isRecord(value.nodes) && isRecord(value.nodes[id])\n ? value.nodes[id].value\n : undefined,\n 'reader'\n );\n },\n parent: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n const entry = isRecord(value) && isRecord(value.nodes) ? value.nodes[id] : undefined;\n return isRecord(entry) && typeof entry.parentId === 'string' ? entry.parentId : undefined;\n },\n children: (id: string) => {\n collectValue(context, address);\n const value = readAt(context, address);\n const entry = isRecord(value) && isRecord(value.nodes) ? value.nodes[id] : undefined;\n return isRecord(entry) && Array.isArray(entry.children) ? [...entry.children] : [];\n },\n };\n if (node.kind === 'table' || node.kind === 'map') {\n let items: Map<string, unknown> | undefined;\n return {\n ids: () => {\n collectCollection(context, address);\n const value = readAt(context, address);\n const ids =\n node.kind === 'table' && isRecord(value) && Array.isArray(value.ids)\n ? [...value.ids]\n : isRecord(value)\n ? Object.keys(value)\n : [];\n profile.reader.collectionIds(ids.length);\n return ids;\n },\n has: (id: string) => {\n collectCollection(context, address, id);\n const value = readAt(context, address);\n const byId =\n node.kind === 'table' && isRecord(value) && isRecord(value.byId) ? value.byId : value;\n return isRecord(byId) && Object.prototype.hasOwnProperty.call(byId, id);\n },\n get: (id: string) => {\n collectCollection(context, address, id);\n const value = readAt(context, address);\n const byId =\n node.kind === 'table' && isRecord(value) && isRecord(value.byId) ? value.byId : value;\n if (!isRecord(byId) || !Object.prototype.hasOwnProperty.call(byId, id)) return undefined;\n const cached = items?.get(id);\n if (cached) return cached as ReaderOfNode<typeof node.value>;\n const reader = readerFor(node.value, context, [...address, id]);\n (items ??= new Map()).set(id, reader);\n return reader;\n },\n };\n }\n if (node.kind === 'variant')\n return {\n get: () => {\n collectValue(context, address);\n return cloneValue(readAt(context, address), 'reader');\n },\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 === 'symbol') return undefined;\n const child = node.shape[property];\n if (!child) return undefined;\n const cached = children?.get(property);\n if (cached) return cached;\n const reader = readerFor(child, context, [...address, property]);\n (children ??= new Map()).set(property, reader);\n return reader;\n },\n }\n );\n};\n\nexport const documentReader = <TSchema extends DocumentSchema>(\n schema: TSchema,\n root: () => ReadonlyDocument<TSchema>,\n active: () => boolean,\n dependencies?: DependencyTracker\n): DocumentReader<TSchema> => {\n profile.reader.session();\n return readerFor(schemaRoot(schema), {\n root,\n active,\n dependencies,\n }) as DocumentReader<TSchema>;\n};\n","import type { DocumentAddress } from '../schema';\nimport type { DocumentOperation } from '../operations';\n\nexport type CommandFootprintTarget =\n | { readonly kind: 'value'; readonly at: DocumentAddress }\n | { readonly kind: 'dictionary'; readonly at: DocumentAddress }\n | { readonly kind: 'dictionary-key'; readonly at: DocumentAddress; readonly key: string }\n | { readonly kind: 'collection'; readonly at: DocumentAddress }\n | { readonly kind: 'entity'; readonly at: DocumentAddress; readonly id: string }\n | { readonly kind: 'list'; readonly at: DocumentAddress }\n | { readonly kind: 'list-item'; readonly at: DocumentAddress; readonly key: string }\n | { readonly kind: 'tree'; readonly at: DocumentAddress }\n | { readonly kind: 'tree-node'; readonly at: DocumentAddress; readonly id: string };\n\nexport type CommandFootprint = readonly CommandFootprintTarget[];\n\nconst sameAddress = (left: DocumentAddress, right: DocumentAddress): boolean =>\n left.length === right.length && left.every((segment, index) => segment === right[index]);\n\nconst containsAddress = (parent: DocumentAddress, child: DocumentAddress): boolean =>\n parent.length <= child.length && parent.every((segment, index) => segment === child[index]);\n\nconst address = (value: unknown): DocumentAddress | undefined =>\n Array.isArray(value) && value.every(segment => typeof segment === 'string')\n ? Object.freeze(value.slice())\n : undefined;\n\nconst targetKey = (target: CommandFootprintTarget): string => {\n const at = target.at.join('\\u0000');\n if (target.kind === 'dictionary-key' || target.kind === 'list-item')\n return `${target.kind}:${at}:${target.key}`;\n if (target.kind === 'entity' || target.kind === 'tree-node')\n return `${target.kind}:${at}:${target.id}`;\n return `${target.kind}:${at}`;\n};\n\nconst freezeTarget = (target: CommandFootprintTarget): CommandFootprintTarget =>\n Object.freeze({ ...target, at: Object.freeze(target.at.slice()) }) as CommandFootprintTarget;\n\nconst add = (\n targets: Map<string, CommandFootprintTarget>,\n target: CommandFootprintTarget\n): void => {\n const stable = freezeTarget(target);\n targets.set(targetKey(stable), stable);\n};\n\nexport const commandFootprint = (operations: readonly DocumentOperation[]): CommandFootprint => {\n const targets = new Map<string, CommandFootprintTarget>();\n for (const operation of operations) {\n switch (operation.type) {\n case 'field.set':\n case 'field.clear':\n case 'value.clear':\n case 'variant.replace':\n add(targets, { kind: 'value', at: operation.at });\n break;\n case 'dict.replace':\n add(targets, { kind: 'dictionary', at: operation.at });\n break;\n case 'dict.set':\n case 'dict.delete':\n add(targets, { kind: 'dictionary-key', at: operation.at, key: operation.key });\n break;\n case 'entity.create':\n add(targets, { kind: 'collection', at: operation.at });\n for (const entry of operation.entries)\n add(targets, { kind: 'entity', at: operation.at, id: entry.id });\n break;\n case 'entity.remove':\n add(targets, { kind: 'collection', at: operation.at });\n for (const id of operation.ids) add(targets, { kind: 'entity', at: operation.at, id });\n break;\n case 'entity.move':\n add(targets, { kind: 'collection', at: operation.at });\n add(targets, { kind: 'entity', at: operation.at, id: operation.id });\n break;\n case 'list.insert':\n case 'list.move':\n case 'list.remove':\n add(targets, { kind: 'list', at: operation.at });\n add(targets, { kind: 'list-item', at: operation.at, key: operation.key });\n break;\n case 'list.replace':\n add(targets, { kind: 'list', at: operation.at });\n for (const key of operation.keys)\n add(targets, { kind: 'list-item', at: operation.at, key });\n break;\n case 'tree.insert':\n case 'tree.move':\n case 'tree.remove':\n case 'tree.set':\n add(targets, { kind: 'tree', at: operation.at });\n add(targets, { kind: 'tree-node', at: operation.at, id: operation.treeNodeId });\n break;\n case 'tree.replace':\n add(targets, { kind: 'tree', at: operation.at });\n break;\n }\n }\n return Object.freeze(Array.from(targets.values()));\n};\n\nconst overlapsValueAndEntity = (\n value: Extract<CommandFootprintTarget, { readonly kind: 'value' }>,\n entity: Extract<CommandFootprintTarget, { readonly kind: 'entity' }>\n): boolean =>\n containsAddress([...entity.at, entity.id], value.at) ||\n containsAddress(value.at, [...entity.at, entity.id]);\n\nconst targetsOverlap = (left: CommandFootprintTarget, right: CommandFootprintTarget): boolean => {\n if (left.kind === 'value' && right.kind === 'value')\n return containsAddress(left.at, right.at) || containsAddress(right.at, left.at);\n if (left.kind === 'value' && right.kind === 'entity') return overlapsValueAndEntity(left, right);\n if (left.kind === 'entity' && right.kind === 'value') return overlapsValueAndEntity(right, left);\n if (left.kind === 'dictionary' && right.kind === 'dictionary')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary' && right.kind === 'dictionary-key')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary-key' && right.kind === 'dictionary')\n return sameAddress(left.at, right.at);\n if (left.kind === 'dictionary-key' && right.kind === 'dictionary-key')\n return sameAddress(left.at, right.at) && left.key === right.key;\n if (left.kind === 'collection' && right.kind === 'collection')\n return sameAddress(left.at, right.at);\n if (left.kind === 'collection' && right.kind === 'entity') return sameAddress(left.at, right.at);\n if (left.kind === 'entity' && right.kind === 'collection') return sameAddress(left.at, right.at);\n if (left.kind === 'entity' && right.kind === 'entity')\n return sameAddress(left.at, right.at) && left.id === right.id;\n if (left.kind === 'list' && (right.kind === 'list' || right.kind === 'list-item'))\n return sameAddress(left.at, right.at);\n if (right.kind === 'list' && left.kind === 'list-item') return sameAddress(left.at, right.at);\n if (left.kind === 'list-item' && right.kind === 'list-item')\n return sameAddress(left.at, right.at) && left.key === right.key;\n if (left.kind === 'tree' && (right.kind === 'tree' || right.kind === 'tree-node'))\n return sameAddress(left.at, right.at);\n if (right.kind === 'tree' && left.kind === 'tree-node') return sameAddress(left.at, right.at);\n if (left.kind === 'tree-node' && right.kind === 'tree-node')\n return sameAddress(left.at, right.at) && left.id === right.id;\n return false;\n};\n\nexport const footprintsOverlap = (left: CommandFootprint, right: CommandFootprint): boolean =>\n left.some(leftTarget => right.some(rightTarget => targetsOverlap(leftTarget, rightTarget)));\n\nconst decodedTarget = (value: unknown): CommandFootprintTarget | undefined => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined;\n const record = value as Record<string, unknown>;\n const at = address(record.at);\n if (!at || typeof record.kind !== 'string') return undefined;\n switch (record.kind) {\n case 'value':\n case 'dictionary':\n case 'collection':\n case 'list':\n case 'tree':\n return freezeTarget({ kind: record.kind, at });\n case 'dictionary-key':\n case 'list-item':\n return typeof record.key === 'string'\n ? freezeTarget({ kind: record.kind, at, key: record.key })\n : undefined;\n case 'entity':\n case 'tree-node':\n return typeof record.id === 'string'\n ? freezeTarget({ kind: record.kind, at, id: record.id })\n : undefined;\n default:\n return undefined;\n }\n};\n\nexport const decodeCommandFootprint = (value: unknown): CommandFootprint | undefined => {\n if (!Array.isArray(value)) return undefined;\n const targets = new Map<string, CommandFootprintTarget>();\n for (const entry of value) {\n const target = decodedTarget(entry);\n if (!target) return undefined;\n targets.set(targetKey(target), target);\n }\n return Object.freeze(Array.from(targets.values()));\n};\n","import type { DocumentSchema, ReadonlyDocument } from '../schema';\nimport type { DocumentReader } from '../access/reader';\nimport { documentReader } from '../access/reader';\nimport type { DependencyTracker } from '../access/dependency';\nimport { DocumentDisposedError } from './contract';\nimport type { DocumentReadable } from './contract';\n\nexport type RuntimeAccessState<TSchema extends DocumentSchema> = {\n readonly schema: TSchema;\n document: ReadonlyDocument<TSchema>;\n disposed: boolean;\n projectionLocks?: number;\n};\n\nconst states = new WeakMap<object, RuntimeAccessState<DocumentSchema>>();\n\nexport const bindRuntimeAccess = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>,\n state: RuntimeAccessState<TSchema>\n): void => {\n states.set(runtime as object, state as RuntimeAccessState<DocumentSchema>);\n};\n\nexport const accessOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): RuntimeAccessState<TSchema> => {\n const state = states.get(runtime as object);\n if (!state) throw new Error('Unknown Doxum runtime.');\n return state as RuntimeAccessState<TSchema>;\n};\n\nexport const schemaOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): TSchema => accessOf(runtime).schema;\n\nexport const documentOf = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>\n): ReadonlyDocument<TSchema> => accessOf(runtime).document;\n\nexport const readWith = <TSchema extends DocumentSchema, TResult>(\n runtime: DocumentReadable<TSchema>,\n run: (read: DocumentReader<TSchema>) => TResult,\n dependencies?: DependencyTracker\n): TResult => {\n const state = accessOf(runtime);\n if (state.disposed) throw new DocumentDisposedError();\n let active = true;\n const reader = documentReader(\n state.schema,\n () => state.document,\n () => active,\n dependencies\n );\n try {\n return run(reader);\n } finally {\n // Readers are transaction-scoped; retaining one cannot expose later\n // mutable canonical state outside the coordinating operation.\n active = false;\n }\n};\n","import type { DocumentSchema, ImpactTarget } from '../schema';\nimport type {\n CommitListener,\n DocumentCommit,\n DocumentReadable,\n DocumentRuntime,\n Unsubscribe,\n ObserverError,\n} from './contract';\nimport * as target from '../impact-target';\n\nexport type ProjectionAttachment<TSchema extends DocumentSchema> = {\n capture(commit: DocumentCommit<TSchema>): void;\n settle(): void;\n flush(): readonly ObserverError[];\n dispose(): void;\n};\ntype ProcessorEntry<TSchema extends DocumentSchema> = {\n readonly processor: ProjectionAttachment<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>>();\nconst readableOwners = new WeakMap<object, DocumentReadable<DocumentSchema>>();\n\nexport const bindDocumentReadable = (\n readable: object,\n runtime: DocumentReadable<DocumentSchema>\n): void => {\n readableOwners.set(readable, runtime);\n};\nexport const documentReadableOwner = (\n readable: object\n): DocumentReadable<DocumentSchema> | undefined => readableOwners.get(readable);\n\nconst key = (value: ImpactTarget<unknown>): BucketKey => target.bucket(value) ?? ROOT_BUCKET;\n\nexport const createNotification = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<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: DocumentReadable<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 shareNotification = <TSchema extends DocumentSchema>(\n source: DocumentRuntime<TSchema>,\n target: DocumentReadable<TSchema>\n): void => {\n notifications.set(\n target as object,\n notificationOf(source) as RuntimeNotification<DocumentSchema>\n );\n};\n\nexport const attachProjection = <TSchema extends DocumentSchema>(\n runtime: DocumentReadable<TSchema>,\n processor: ProjectionAttachment<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 afterSettle?: () => readonly ObserverError[]\n): readonly ObserverError[] => {\n notification.notifying = true;\n const errors: ObserverError[] = [];\n const call = (listener: CommitListener<TSchema>): void => {\n try {\n listener(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'listener', error }));\n }\n };\n try {\n const processorCount = notification.processors.length;\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.capture(commit);\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n entry.processor.settle();\n } catch (error) {\n errors.push(Object.freeze({ phase: 'processor', error }));\n }\n }\n for (let index = 0; index < processorCount; index += 1) {\n const entry = notification.processors[index];\n if (!entry?.active) continue;\n try {\n errors.push(...entry.processor.flush());\n } catch (error) {\n errors.push(Object.freeze({ phase: 'flush', error }));\n }\n }\n\n if (afterSettle) errors.push(...afterSettle());\n const candidates = notification.candidates;\n candidates.clear();\n if (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 const attachments = notification.processors.slice();\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 const errors: unknown[] = [];\n attachments.forEach(entry => {\n if (!entry.active) return;\n try {\n entry.processor.dispose();\n } catch (error) {\n errors.push(error);\n }\n });\n if (errors.length) throw new AggregateError(errors, 'Projection disposal notification failed.');\n};\n","import type { CollectionReader, DocumentReader, ReaderOfNode } from '../access/reader';\nimport type { CollectionImpact } from '../impact';\nimport type {\n DocumentCommit,\n DocumentReadable,\n Synchronous,\n Unsubscribe,\n} from '../runtime/contract';\nimport type {\n CollectionNode,\n CollectionPath,\n CollectionSelector,\n DocumentSchema,\n EntitySchemaNode,\n ImpactTarget,\n SchemaPath,\n} from '../schema';\nimport type { Readable } from './readable';\n\ndeclare const sourceContext: unique symbol;\nexport type ProjectionSource<T> = { readonly [sourceContext]: T };\nexport type ProjectionSources = Readonly<Record<string, ProjectionSource<unknown>>>;\nexport type ProjectionInputs<S extends ProjectionSources> = {\n readonly [K in keyof S]: S[K] extends ProjectionSource<infer T> ? T : never;\n};\nexport type DocumentInput<S extends DocumentSchema> = {\n readonly read: DocumentReader<S>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n};\nexport type DocumentCollectionInput<S extends DocumentSchema, N extends EntitySchemaNode> = {\n readonly read: CollectionReader<string, N>;\n readonly target: CollectionSelector<string, N>;\n readonly revision: number;\n readonly commits: readonly DocumentCommit<S>[];\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly string[]; readonly orderDirty: boolean };\n};\nexport type DocumentSource<S extends DocumentSchema> = ProjectionSource<DocumentInput<S>> & {\n collection<P extends CollectionPath>(\n pick: (path: SchemaPath<S['shape']>) => P\n ): DocumentCollectionSource<S, CollectionNode<P>>;\n targets(\n ...targets: readonly [ImpactTarget, ...ImpactTarget[]]\n ): ProjectionSource<DocumentInput<S>>;\n};\nexport type DocumentCollectionSource<\n S extends DocumentSchema,\n N extends EntitySchemaNode,\n> = ProjectionSource<DocumentCollectionInput<S, N>>;\nexport type ValueInput<T> = {\n readonly value: T;\n readonly previous: T;\n readonly changed: boolean;\n readonly revision: number;\n readonly reset: boolean;\n};\nexport type ProjectionInput<T> = {\n readonly source: ProjectionSource<ValueInput<T>>;\n set(value: T): void;\n};\nexport type ValueUpdate<T> =\n | { readonly kind: 'unchanged' }\n | { readonly kind: 'changed'; readonly value: T }\n | { readonly kind: 'rebuild' };\nexport type ValueSpec<S extends ProjectionSources, T> = {\n readonly name?: string;\n readonly sources: S;\n readonly build: (sources: ProjectionInputs<S>) => {\n readonly value: T;\n readonly update: (sources: ProjectionInputs<S>) => ValueUpdate<NoInfer<T>>;\n };\n};\nexport type ProjectionValue<T> = Readable<T> &\n ProjectionSource<ValueInput<T>> & { rebuild(): void; dispose(): void };\nexport type CollectionRead<K extends string, V> = {\n get(key: K): V | undefined;\n has(key: K): boolean;\n ids(): readonly K[];\n};\nexport type CollectionInput<K extends string, V> = CollectionRead<K, V> & {\n readonly change: CollectionImpact<K> | undefined;\n readonly revision: number;\n readonly reset: boolean;\n};\nexport type ProjectionCollection<K extends string, V> = ProjectionSource<CollectionInput<K, V>> & {\n readonly ids: Readable<readonly K[]>;\n readonly all: Readable<readonly V[]>;\n item(key: K): Readable<V | undefined>;\n revision(): number;\n subscribe(listener: (change: CollectionImpact<K>) => void): Unsubscribe;\n rebuild(): void;\n dispose(): void;\n};\nexport type ProjectionCollectionWriter<K extends string, V> = {\n set(key: K, value: V): void;\n remove(key: K): void;\n order(ids: readonly K[]): void;\n replace(entries: readonly (readonly [K, V])[]): void;\n};\nexport type CollectionProcess<S extends ProjectionSources, K extends string, V> = {\n readonly sources: ProjectionInputs<S>;\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly writer: ProjectionCollectionWriter<K, V>;\n};\nexport type CollectionSpec<S extends ProjectionSources, K extends string, V> = {\n readonly name?: string;\n readonly sources: S;\n readonly isEqual?: (previous: V, next: V) => boolean;\n readonly build: (input: CollectionProcess<S, K, V>) => {\n readonly update: (input: CollectionProcess<S, K, V>) => void | { readonly kind: 'rebuild' };\n };\n};\nexport class ProjectionError extends Error {\n constructor(\n readonly phase: 'processor' | 'listener' | 'source' | 'blocked',\n readonly identity: string,\n readonly revisions: readonly number[],\n cause: unknown\n ) {\n super(`Projection ${phase} failed: ${identity}`, { cause });\n this.name = 'ProjectionError';\n }\n}\nexport class ProjectionDisposedError extends Error {\n constructor() {\n super('Projection has been disposed.');\n this.name = 'ProjectionDisposedError';\n }\n}\nexport type ProjectionRuntime = {\n document<S extends DocumentSchema>(runtime: DocumentReadable<S>): DocumentSource<S>;\n fromReadable<T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionSource<ValueInput<T>>;\n input<T>(\n initial: T,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionInput<T>;\n value<S extends ProjectionSources, T>(\n sources: S,\n compute: (sources: ProjectionInputs<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n value<S extends ProjectionSources, T>(\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n collection<V, K extends string = string>(): <S extends ProjectionSources>(\n spec: CollectionSpec<S, K, V>\n ) => ProjectionCollection<K, V>;\n map<S extends DocumentSchema, N extends EntitySchemaNode, V>(\n source: DocumentCollectionSource<S, N>,\n mapper: (id: string, entry: ReaderOfNode<N>) => Synchronous<V>,\n options?: { readonly isEqual?: (a: V, b: V) => boolean }\n ): ProjectionCollection<string, V>;\n map<K extends string, V, R>(\n source: ProjectionCollection<K, V>,\n mapper: (id: K, entry: V) => Synchronous<R>,\n options?: { readonly isEqual?: (a: NoInfer<R>, b: NoInfer<R>) => boolean }\n ): ProjectionCollection<K, R>;\n batch<T>(run: () => Synchronous<T>): T;\n dispose(): void;\n};\n","import type { ObserverError } from '../runtime/contract';\nimport { ProjectionDisposedError, ProjectionError } from './contract';\nimport { profile } from '../profile';\n\nexport type SourceRecord = {\n readonly consumers: Set<NodeRecord>;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n fault: ProjectionError | undefined;\n disposed: boolean;\n clear(): void;\n};\nexport type NodeRecord = SourceRecord & {\n readonly order: number;\n readonly name: string;\n readonly sources: readonly SourceRecord[];\n forced: boolean;\n statusChanged: boolean;\n evaluate(build: boolean): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n release(): void;\n};\n\n// Sources and nodes share one registry. Public structural lookalikes are never accepted.\nexport const projectionHandles = new WeakSet<object>();\nexport const createScheduler = (onError: (error: ProjectionError) => void) => {\n let disposed = false;\n let depth = 0;\n let phase: 'idle' | 'compute' | 'notify' = 'idle';\n let sequence = 0;\n const records = new Map<object, SourceRecord>();\n const nodes = new Set<NodeRecord>();\n const pending = new Set<SourceRecord>();\n const heap: NodeRecord[] = [];\n const queued = new Set<NodeRecord>();\n const completed: NodeRecord[] = [];\n const emissions = new Set<NodeRecord>();\n const errors: ProjectionError[] = [];\n let reportingFailures: unknown[] = [];\n const guards = new Set<(locked: boolean) => void>();\n const cleanups = new Set<() => void>();\n const assertActive = () => {\n if (disposed) throw new ProjectionDisposedError();\n };\n const assertIdle = () => {\n assertActive();\n if (phase !== 'idle')\n throw new Error('Projection cannot be re-entered during processing or notification.');\n };\n const lock = (value: boolean) => guards.forEach(guard => guard(value));\n const enqueue = (node: NodeRecord) => {\n if (node.disposed || queued.has(node)) return;\n queued.add(node);\n profile.projection('scheduledNodes');\n let i = heap.length;\n heap.push(node);\n while (i > 0) {\n const p = (i - 1) >> 1;\n if (heap[p].order < node.order) break;\n heap[i] = heap[p];\n i = p;\n }\n heap[i] = node;\n };\n const pop = () => {\n const first = heap[0];\n const last = heap.pop()!;\n if (heap.length) {\n let i = 0;\n while (i * 2 + 1 < heap.length) {\n let c = i * 2 + 1;\n if (c + 1 < heap.length && heap[c + 1].order < heap[c].order) c++;\n if (last.order < heap[c].order) break;\n heap[i] = heap[c];\n i = c;\n }\n heap[i] = last;\n }\n return first;\n };\n const errorFor = (\n node: NodeRecord,\n cause: unknown,\n kind: ProjectionError['phase'] = 'processor'\n ) =>\n new ProjectionError(\n kind,\n node.name,\n node.sources.map(source => source.revision()),\n cause\n );\n const capture = (source: SourceRecord) => {\n if (disposed) return;\n if (phase !== 'idle') {\n source.fault = new ProjectionError(\n 'source',\n 'reentrant source',\n [source.revision()],\n new Error('Source changed while projection was running.')\n );\n errors.push(source.fault);\n throw source.fault;\n }\n pending.add(source);\n profile.projection('sourceEvents');\n if (source.fault) errors.push(source.fault);\n };\n const settle = () => {\n if (disposed || depth || phase !== 'idle') return;\n phase = 'compute';\n lock(true);\n try {\n pending.forEach(source => source.consumers.forEach(enqueue));\n while (heap.length) {\n const node = pop();\n if (node.disposed) continue;\n const wasFaulted = node.fault !== undefined;\n profile.projection('processedNodes');\n let changed = false;\n const blocked = node.sources.find(source => source.fault || source.disposed);\n if (blocked) {\n node.fault = errorFor(node, blocked.fault ?? new ProjectionDisposedError(), 'blocked');\n } else {\n const build = node.forced || wasFaulted || node.sources.some(source => source.reset());\n try {\n changed = node.evaluate(build);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n const error = errorFor(node, cause);\n errors.push(error);\n node.fault = error;\n if (!build) {\n try {\n changed = node.evaluate(true);\n const failure = node.sources.find(source => source.fault)?.fault;\n if (failure) throw failure;\n node.fault = undefined;\n } catch (cause) {\n node.fault = errorFor(node, cause);\n errors.push(node.fault);\n }\n }\n }\n }\n node.forced = false;\n node.statusChanged = wasFaulted !== (node.fault !== undefined);\n completed.push(node);\n if (changed || wasFaulted || node.fault) {\n profile.projection('publishedNodes');\n emissions.add(node);\n node.consumers.forEach(enqueue);\n }\n }\n completed.forEach(node => node.publish());\n } finally {\n lock(false);\n phase = 'idle';\n }\n };\n const flush = (): readonly ObserverError[] => {\n if (disposed || depth) return [];\n if (pending.size || completed.length) profile.projection('flushes');\n phase = 'notify';\n lock(true);\n const reportFailures: unknown[] = [];\n try {\n emissions.forEach(node =>\n node.emit(listener => {\n try {\n listener();\n } catch (cause) {\n errors.push(errorFor(node, cause, 'listener'));\n }\n })\n );\n for (const error of errors.slice()) {\n try {\n onError(error);\n } catch (cause) {\n reportFailures.push(cause);\n }\n }\n return Object.freeze([\n ...errors.map(error =>\n Object.freeze({\n phase: error.phase === 'listener' ? ('listener' as const) : ('processor' as const),\n error,\n })\n ),\n ...reportFailures.map(error => Object.freeze({ phase: 'listener' as const, error })),\n ]);\n } finally {\n pending.forEach(source => source.clear());\n completed.forEach(node => node.clear());\n pending.clear();\n queued.clear();\n completed.length = 0;\n emissions.clear();\n errors.length = 0;\n reportingFailures = reportFailures;\n lock(false);\n phase = 'idle';\n }\n };\n const run = () => {\n settle();\n const result = flush();\n const failures = reportingFailures;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection error reporter failed.');\n return result;\n };\n return {\n assertActive,\n assertIdle,\n capture,\n settle,\n flush,\n run,\n records,\n guards,\n cleanups,\n get active() {\n return !disposed;\n },\n register(handle: object, record: SourceRecord) {\n assertIdle();\n records.set(handle, record);\n projectionHandles.add(handle);\n },\n unregisterSource(handle: object) {\n const record = records.get(handle);\n if (record) {\n record.disposed = true;\n pending.delete(record);\n record.clear();\n records.delete(handle);\n }\n },\n source(handle: object) {\n assertActive();\n const source = records.get(handle);\n if (!source || source.disposed)\n throw new Error('Unknown, disposed, or foreign projection source.');\n return source;\n },\n addNode(node: NodeRecord) {\n nodes.add(node);\n node.sources.forEach(source => source.consumers.add(node));\n },\n order: () => sequence++,\n initialize<T>(run: () => T): T {\n assertIdle();\n phase = 'compute';\n lock(true);\n try {\n return run();\n } finally {\n lock(false);\n phase = 'idle';\n }\n },\n rebuild(node: NodeRecord) {\n assertIdle();\n if (node.disposed) throw new ProjectionDisposedError();\n node.forced = true;\n enqueue(node);\n run();\n },\n disposeNode(node: NodeRecord) {\n if (node.disposed) return;\n assertIdle();\n if (node.consumers.size)\n throw new Error('Cannot dispose a projection node with downstream consumers.');\n node.disposed = true;\n node.sources.forEach(source => source.consumers.delete(node));\n nodes.delete(node);\n node.release();\n for (const [handle, record] of records) if (record === node) records.delete(handle);\n },\n batch<T>(callback: () => T): T {\n assertIdle();\n depth++;\n let failed = false;\n try {\n const value = callback();\n assertSynchronous(value);\n return value;\n } catch (error) {\n failed = true;\n throw error;\n } finally {\n depth--;\n if (!depth) {\n if (failed) {\n try {\n run();\n } catch {\n /* The original application error retains priority. */\n }\n } else run();\n }\n }\n },\n dispose() {\n if (disposed) return;\n assertIdle();\n disposed = true;\n const failures: unknown[] = [];\n cleanups.forEach(cleanup => {\n try {\n cleanup();\n } catch (error) {\n failures.push(error);\n }\n });\n cleanups.clear();\n nodes.forEach(node => {\n node.disposed = true;\n node.release();\n node.consumers.clear();\n });\n records.forEach(source => {\n source.disposed = true;\n source.consumers.clear();\n source.clear();\n });\n nodes.clear();\n records.clear();\n pending.clear();\n heap.length = 0;\n completed.length = 0;\n queued.clear();\n emissions.clear();\n guards.clear();\n errors.length = 0;\n reportingFailures = [];\n if (failures.length) throw new AggregateError(failures, 'Projection cleanup failed.');\n },\n debug: () => ({\n nodes: nodes.size,\n sources: records.size - nodes.size,\n subscriptions: cleanups.size,\n pending: pending.size + heap.length,\n }),\n };\n};\nexport type Scheduler = ReturnType<typeof createScheduler>;\nexport const assertSynchronous = (value: unknown): void => {\n if (\n value != null &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'then' in value &&\n typeof value.then === 'function'\n )\n throw new TypeError('Projection callbacks must be synchronous.');\n};\nexport const assertScope = (active: () => boolean) => {\n if (!active()) throw new Error('Projection reader or writer is no longer active.');\n};\n","import type { ProjectionInputs, ProjectionSources } from './contract';\nimport { ProjectionDisposedError } from './contract';\nimport type { NodeRecord, Scheduler } from './scheduler';\n\nexport const createNode = <S extends ProjectionSources>(\n scheduler: Scheduler,\n spec: { name?: string; sources: S },\n behavior: {\n evaluate(sources: ProjectionInputs<S>, build: boolean, active: () => boolean): boolean;\n context(active: () => boolean): unknown;\n revision(): number;\n reset(): boolean;\n publish(): void;\n emit(call: (listener: () => void) => void): void;\n clear(): void;\n release(): void;\n }\n) => {\n scheduler.assertIdle();\n const entries = Object.entries(spec.sources).map(\n ([key, handle]) => [key, scheduler.source(handle)] as const\n );\n const order = scheduler.order();\n const node: NodeRecord = {\n ...behavior,\n publish: () => {\n if (node.fault) behavior.clear();\n else behavior.publish();\n },\n order,\n name: spec.name ? `${spec.name} (${order})` : `projection-${order}`,\n sources: entries.map(([, source]) => source),\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n forced: false,\n statusChanged: false,\n evaluate: build => {\n let active = true;\n try {\n // Heterogeneous source contexts are typed at the registered capability boundary.\n const inputs = Object.fromEntries(\n entries.map(([key, source]) => [key, source.context(() => active)])\n ) as ProjectionInputs<S>;\n return behavior.evaluate(inputs, build, () => active);\n } finally {\n active = false;\n }\n },\n };\n scheduler.initialize(() => {\n const invalid = node.sources.find(source => source.fault || source.disposed);\n if (invalid) throw invalid.fault ?? new ProjectionDisposedError();\n node.evaluate(true);\n node.publish();\n node.clear();\n });\n const check = () => {\n if (node.disposed || !scheduler.active) throw new ProjectionDisposedError();\n if (node.fault) throw node.fault;\n };\n return {\n node,\n check,\n install(handle: object) {\n scheduler.register(handle, node);\n scheduler.addNode(node);\n },\n rebuild: () => scheduler.rebuild(node),\n dispose: () => scheduler.disposeNode(node),\n };\n};\n","import type { CollectionImpact } from '../impact';\nimport { profile } from '../profile';\nimport type {\n CollectionInput,\n CollectionRead,\n CollectionSpec,\n ProjectionCollectionWriter,\n ProjectionCollection,\n ProjectionSources,\n} from './contract';\nimport type { Readable } from './readable';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, projectionHandles, type Scheduler } from './scheduler';\n\nexport const collectionHandles = new WeakSet<object>();\n\nconst readonlySet = <T>(values: Iterable<T>): ReadonlySet<T> => {\n const set = new Set(values);\n const view: ReadonlySet<T> = Object.freeze({\n get size() {\n return set.size;\n },\n has: (value: T) => set.has(value),\n entries: () => set.entries(),\n keys: () => set.keys(),\n values: () => set.values(),\n [Symbol.iterator]: () => set.values(),\n forEach: (callback: (value: T, key: T, set: ReadonlySet<T>) => void, thisArg?: unknown) =>\n set.forEach(value => callback.call(thisArg, value, value, view)),\n });\n return view;\n};\ntype Entry<V> = { present: true; value: V } | { present: false };\nexport const createCollection = <S extends ProjectionSources, K extends string, V>(\n scheduler: Scheduler,\n spec: CollectionSpec<S, K, V>\n): ProjectionCollection<K, V> => {\n const values = new Map<K, V>();\n let ids: readonly K[] = Object.freeze([]);\n let staged = new Map<K, Entry<V>>();\n let nextIds = ids;\n let change: CollectionImpact<K> | undefined;\n let instance: ReturnType<typeof spec.build> | undefined;\n let initialized = false;\n let reset = false;\n let revision = 0;\n let idsRevision = 0;\n let all: readonly V[] | undefined;\n const itemVersions = new Map<K, number>();\n const items = new Map<K, Readable<V | undefined>>();\n const itemListeners = new Map<K, Set<() => void>>();\n const idsListeners = new Set<() => void>();\n const allListeners = new Set<() => void>();\n const listeners = new Set<(change: CollectionImpact<K>) => void>();\n const changedKeys = new Set<K>();\n let orderChanged = false;\n const hasNext = (key: K) => (staged.has(key) ? staged.get(key)!.present : values.has(key));\n const getNext = (key: K) => {\n const entry = staged.get(key);\n return entry ? (entry.present ? entry.value : undefined) : values.get(key);\n };\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build, active) => {\n staged = new Map();\n nextIds = ids;\n change = undefined;\n changedKeys.clear();\n let explicitOrder: readonly K[] | undefined;\n let cleared = false;\n const nextHas = (key: K) =>\n staged.has(key) ? staged.get(key)!.present : !cleared && values.has(key);\n const nextGet = (key: K) => {\n const entry = staged.get(key);\n return entry\n ? entry.present\n ? entry.value\n : undefined\n : cleared\n ? undefined\n : values.get(key);\n };\n const deriveIds = () => {\n const result = cleared ? [] : ids.filter(nextHas);\n for (const [key, entry] of staged)\n if (entry.present && (cleared || !values.has(key))) result.push(key);\n return result;\n };\n const read = (next: boolean): CollectionRead<K, V> => ({\n get: key => {\n assertScope(active);\n return next ? nextGet(key) : values.get(key);\n },\n has: key => {\n assertScope(active);\n return next ? nextHas(key) : values.has(key);\n },\n ids: () => {\n assertScope(active);\n return next ? Object.freeze(explicitOrder ? explicitOrder.slice() : deriveIds()) : ids;\n },\n });\n const writer: ProjectionCollectionWriter<K, V> = {\n set: (key, value) => {\n assertScope(active);\n if (typeof key !== 'string') throw new TypeError('Projection keys must be strings.');\n staged.set(key, { present: true, value });\n },\n remove: key => {\n assertScope(active);\n staged.set(key, { present: false });\n },\n order: order => {\n assertScope(active);\n explicitOrder = order.slice();\n },\n replace: entries => {\n assertScope(active);\n staged.clear();\n cleared = true;\n const order: K[] = [];\n for (const [key, value] of entries) {\n if (staged.has(key)) throw new TypeError('Duplicate projection key.');\n writer.set(key, value);\n order.push(key);\n }\n explicitOrder = order;\n },\n };\n const input = { sources, previous: read(false), next: read(true), writer };\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n cleared = true;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n } else {\n profile.materialized.updated();\n const result = instance.update(input);\n assertSynchronous(result);\n if (result?.kind === 'rebuild') {\n staged.clear();\n cleared = true;\n explicitOrder = undefined;\n instance = undefined;\n const built = spec.build(input);\n assertSynchronous(built);\n instance = built;\n build = true;\n }\n }\n if (cleared)\n for (const key of values.keys()) if (!staged.has(key)) staged.set(key, { present: false });\n const added = new Set<K>();\n const removed = new Set<K>();\n const updated = new Set<K>();\n profile.projection('touchedKeys', staged.size);\n for (const [key, entry] of staged) {\n const existed = values.has(key);\n if (entry.present) {\n if (!existed) added.add(key);\n else if (!(spec.isEqual ?? Object.is)(values.get(key) as V, entry.value))\n updated.add(key);\n else staged.delete(key);\n } else if (existed) removed.add(key);\n else staged.delete(key);\n }\n if (explicitOrder || added.size || removed.size) {\n const order = explicitOrder ?? [...ids.filter(key => !removed.has(key)), ...added];\n const seen = new Set(order);\n if (\n seen.size !== order.length ||\n order.length !== values.size + added.size - removed.size ||\n order.some(key => !hasNext(key))\n )\n throw new TypeError('Projection order must contain every key exactly once.');\n nextIds =\n ids.length === order.length && ids.every((key, i) => key === order[i])\n ? ids\n : Object.freeze(order.slice());\n }\n orderChanged = nextIds !== ids;\n if (added.size || removed.size || updated.size || orderChanged) {\n let commonOrderChanged = false;\n if (orderChanged) {\n const before = ids.filter(key => !removed.has(key));\n const after = nextIds.filter(key => !added.has(key));\n commonOrderChanged = before.some((key, i) => after[i] !== key);\n }\n change = Object.freeze({\n kind: 'incremental',\n added: readonlySet(added),\n removed: readonlySet(removed),\n updated: readonlySet(updated),\n orderChanged: commonOrderChanged,\n });\n [...added, ...removed, ...updated].forEach(key => changedKeys.add(key));\n profile.projection('changedKeys', changedKeys.size);\n }\n reset = build;\n return change !== undefined;\n },\n context: active => {\n const input: CollectionInput<K, V> = {\n get: key => {\n assertScope(active);\n return getNext(key);\n },\n has: key => {\n assertScope(active);\n return hasNext(key);\n },\n ids: () => {\n assertScope(active);\n return nextIds;\n },\n change,\n revision: revision + (change ? 1 : 0),\n reset,\n };\n return Object.freeze(input);\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n for (const [key, entry] of staged) {\n if (entry.present) values.set(key, entry.value);\n else values.delete(key);\n }\n if (change) {\n if (initialized) revision++;\n if (orderChanged && initialized) idsRevision++;\n all = undefined;\n changedKeys.forEach(key => {\n if (items.has(key))\n itemVersions.set(key, (itemVersions.get(key) ?? 0) + (initialized ? 1 : 0));\n });\n }\n ids = nextIds;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n const fault = owner.node.fault !== undefined;\n const resetEvent = Object.freeze({ kind: 'reset' as const });\n Array.from(listeners).forEach(listener => call(() => listener(change ?? resetEvent)));\n if (orderChanged || !change || fault || owner.node.statusChanged)\n Array.from(idsListeners).forEach(listener => call(listener));\n Array.from(allListeners).forEach(listener => call(listener));\n const keys =\n !change || fault || owner.node.statusChanged ? itemListeners.keys() : changedKeys;\n for (const key of keys)\n Array.from(itemListeners.get(key) ?? []).forEach(listener => call(listener));\n },\n clear: () => {\n staged.clear();\n nextIds = ids;\n change = undefined;\n reset = false;\n changedKeys.clear();\n orderChanged = false;\n },\n release: () => {\n values.clear();\n staged.clear();\n items.clear();\n itemVersions.clear();\n itemListeners.clear();\n idsListeners.clear();\n allListeners.clear();\n listeners.clear();\n ids = nextIds = Object.freeze([]);\n all = undefined;\n instance = undefined;\n },\n });\n const handle = {\n ids: {\n current: () => {\n owner.check();\n return ids;\n },\n revision: () => {\n owner.check();\n return idsRevision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n idsListeners.add(listener);\n return () => {\n idsListeners.delete(listener);\n };\n },\n },\n all: {\n current: () => {\n owner.check();\n if (!all) {\n profile.collectionView.arrayCopied();\n all = Object.freeze(ids.map(key => values.get(key) as V));\n }\n return all;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n allListeners.add(listener);\n return () => {\n allListeners.delete(listener);\n };\n },\n },\n item: (key: K) => {\n owner.check();\n const old = items.get(key);\n if (old) return old;\n itemVersions.set(key, 0);\n const readable: Readable<V | undefined> = Object.freeze({\n current: () => {\n owner.check();\n return values.get(key);\n },\n revision: () => {\n owner.check();\n return itemVersions.get(key) ?? 0;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n const set = itemListeners.get(key) ?? new Set();\n set.add(listener);\n itemListeners.set(key, set);\n return () => {\n set.delete(listener);\n if (!set.size) itemListeners.delete(key);\n };\n },\n });\n projectionHandles.add(readable);\n items.set(key, readable);\n return readable;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: (change: CollectionImpact<K>) => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n } as ProjectionCollection<K, V>;\n projectionHandles.add(handle.ids);\n projectionHandles.add(handle.all);\n collectionHandles.add(handle);\n owner.install(handle);\n return Object.freeze(handle);\n};\n","import { documentReader, readerFor } from '../access/reader';\nimport { nodeAt } from '../address';\nimport * as target from '../impact-target';\nimport { accessOf } from '../runtime/access';\nimport { attachProjection, documentReadableOwner } from '../runtime/notification';\nimport type { DocumentCommit, DocumentReadable } from '../runtime/contract';\nimport type { DocumentSchema, ImpactTarget, CollectionSelector } from '../schema';\nimport { collectionSchema } from '../schema';\nimport type { DocumentSource, ProjectionSource, ValueInput } from './contract';\nimport { ProjectionError } from './contract';\nimport { collectionHandles } from './collection';\nimport type { Readable } from './readable';\nimport { assertScope, projectionHandles, type Scheduler, type SourceRecord } from './scheduler';\n\nexport const createSources = (scheduler: Scheduler) => {\n const documents = new Map<object, object>();\n const readables = new Map<\n object,\n Map<\n object,\n {\n readonly source: object;\n readonly accept: (value: unknown) => void;\n }\n >\n >();\n const collections = new WeakSet<object>();\n const document = <S extends DocumentSchema>(runtime: DocumentReadable<S>): DocumentSource<S> => {\n scheduler.assertIdle();\n const state = accessOf(runtime);\n if (state.disposed) throw new Error('Document has been disposed.');\n const existing = documents.get(state);\n if (existing) return existing as DocumentSource<S>;\n const bindings: { handle: object; targets: readonly ImpactTarget[]; record: SourceRecord }[] =\n [];\n const make = (targets: readonly ImpactTarget[], collection?: CollectionSelector): object => {\n if (state.disposed) throw new Error('Document has been disposed.');\n targets.forEach(value => {\n if (!target.belongs(value, state.schema))\n throw new Error('Projection target belongs to another schema.');\n });\n const old = bindings.find(\n entry =>\n Boolean(collection) === collections.has(entry.handle) &&\n entry.targets.length === targets.length &&\n entry.targets.every((value, i) => target.same(value, targets[i]))\n );\n if (old) return old.handle;\n let commits: DocumentCommit<S>[] = [];\n let reset = false;\n let orderDirty = false;\n const keys = new Set<string>();\n let candidates:\n { readonly keys: readonly string[]; readonly orderDirty: boolean } | undefined;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: runtime.revision,\n reset: () => reset,\n clear: () => {\n commits = [];\n reset = orderDirty = false;\n keys.clear();\n candidates = undefined;\n },\n context: active => {\n assertScope(active);\n if (state.disposed) throw new Error('Document has been disposed.');\n const read = collection\n ? readerFor(\n nodeAt(state.schema, collection.address, state.document) ??\n collectionSchema(collection),\n { root: () => state.document, active },\n collection.address\n )\n : documentReader(state.schema, () => state.document, active);\n return Object.freeze({\n read,\n target: collection,\n revision: runtime.revision(),\n commits: Object.freeze(commits.slice()),\n reset: record.reset(),\n ...(collection\n ? {\n candidates: (candidates ??= Object.freeze({\n keys: Object.freeze([...keys]),\n orderDirty,\n })),\n }\n : {}),\n });\n },\n };\n const handle = collection\n ? {}\n : {\n collection: (pick: Parameters<S['collection']>[0]) => {\n scheduler.assertIdle();\n const selector = state.schema.collection(pick);\n return make([selector], selector);\n },\n targets: (...selected: ImpactTarget[]) => {\n scheduler.assertIdle();\n if (!selected.length) throw new TypeError('Expected at least one target.');\n return make(selected);\n },\n };\n Object.freeze(handle);\n bindings.push({ handle, targets, record });\n if (collection) collections.add(handle);\n scheduler.register(handle, record);\n // The attachment delivers to all local bindings without extra document subscriptions.\n receivers.set(record, commit => {\n commits.push(commit);\n reset ||= commit.kind === 'replace';\n if (collection) {\n const change = commit.impact.collection(collection);\n if (change.kind === 'reset') reset = true;\n else {\n change.added.forEach(key => keys.add(key));\n change.removed.forEach(key => keys.add(key));\n change.updated.forEach(key => keys.add(key));\n orderDirty ||= Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n candidates = undefined;\n }\n });\n return handle;\n };\n const receivers = new Map<SourceRecord, (commit: DocumentCommit<S>) => void>();\n const handle = make([]) as DocumentSource<S>;\n const guard = (locked: boolean) => {\n state.projectionLocks = (state.projectionLocks ?? 0) + (locked ? 1 : -1);\n };\n scheduler.guards.add(guard);\n const unsubscribe = attachProjection(runtime, {\n capture: commit => {\n for (const binding of bindings) {\n if (!binding.targets.length || binding.targets.some(commit.impact.affects)) {\n receivers.get(binding.record)!(commit);\n scheduler.capture(binding.record);\n }\n }\n },\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n bindings.forEach(({ record }) => {\n record.fault = new ProjectionError(\n 'source',\n 'document disposed',\n [runtime.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n });\n scheduler.run();\n },\n });\n scheduler.cleanups.add(() => {\n unsubscribe();\n scheduler.guards.delete(guard);\n });\n documents.set(state, handle);\n return handle;\n };\n const valueSource = <T>(initial: T, equal: (a: T, b: T) => boolean) => {\n let value = initial;\n let previous = initial;\n let revision = 0;\n const handle = Object.freeze({}) as ProjectionSource<ValueInput<T>>;\n const record: SourceRecord = {\n consumers: new Set(),\n disposed: false,\n fault: undefined,\n revision: () => revision,\n reset: () => false,\n clear: () => {\n previous = value;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value,\n previous,\n revision,\n changed: !equal(previous, value),\n reset: false,\n });\n },\n };\n scheduler.register(handle, record);\n const accept = (next: T) => {\n scheduler.assertIdle();\n const recovering = record.fault !== undefined;\n if (equal(value, next) && !recovering) return;\n record.fault = undefined;\n value = next;\n revision++;\n scheduler.capture(record);\n };\n return {\n source: handle,\n accept,\n set(next: T) {\n accept(next);\n scheduler.run();\n },\n };\n };\n return {\n dispose: () => {\n documents.clear();\n readables.clear();\n },\n document,\n input: <T>(initial: T, options?: { readonly isEqual?: (a: T, b: T) => boolean }) => {\n const { source, set } = valueSource(initial, options?.isEqual ?? Object.is);\n return Object.freeze({ source, set });\n },\n fromReadable: <T>(\n readable: Readable<T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionSource<ValueInput<T>> => {\n scheduler.assertIdle();\n if (projectionHandles.has(readable))\n throw new Error('Projection nodes must be declared directly as sources.');\n const equal = options?.isEqual ?? Object.is;\n let bindings = readables.get(readable);\n const old = bindings?.get(equal);\n if (old) return old.source as ProjectionSource<ValueInput<T>>;\n const input = valueSource(readable.current(), equal);\n if (bindings) {\n bindings.set(equal, { source: input.source, accept: value => input.accept(value as T) });\n return input.source;\n }\n bindings = new Map([\n [equal, { source: input.source, accept: (value: unknown) => input.accept(value as T) }],\n ]);\n const members = bindings;\n const receive = (settle = true) => {\n if (!scheduler.active) return;\n let value: T;\n try {\n value = readable.current();\n } catch (cause) {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n if (settle) scheduler.run();\n return;\n }\n for (const member of members.values()) {\n try {\n member.accept(value);\n } catch (cause) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'external readable',\n [record.revision()],\n cause\n );\n scheduler.capture(record);\n }\n }\n if (settle) scheduler.run();\n };\n let unsubscribe: (() => void) | undefined;\n let detach: (() => void) | undefined;\n try {\n const owner = documentReadableOwner(readable);\n if (owner) {\n document(owner);\n detach = attachProjection(owner, {\n capture: () => receive(false),\n settle: scheduler.settle,\n flush: scheduler.flush,\n dispose: () => {\n for (const member of members.values()) {\n const record = scheduler.source(member.source);\n record.fault = new ProjectionError(\n 'source',\n 'document readable disposed',\n [record.revision()],\n new Error('Document has been disposed.')\n );\n scheduler.capture(record);\n }\n scheduler.run();\n },\n });\n }\n unsubscribe = readable.subscribe(() => receive());\n input.accept(readable.current());\n } catch (error) {\n try {\n unsubscribe?.();\n detach?.();\n } finally {\n scheduler.unregisterSource(input.source);\n }\n throw error;\n }\n scheduler.cleanups.add(unsubscribe);\n if (detach) scheduler.cleanups.add(detach);\n readables.set(readable, bindings);\n scheduler.run();\n return input.source;\n },\n assertCollection: (handle: object) => {\n scheduler.source(handle);\n if (!collections.has(handle) && !collectionHandles.has(handle))\n throw new Error('map requires a collection source.');\n },\n };\n};\n","import type { ProjectionSources, ProjectionValue, ValueSpec } from './contract';\nimport { createNode } from './node';\nimport { assertScope, assertSynchronous, type Scheduler } from './scheduler';\nimport { profile } from '../profile';\n\nexport const createValue = <S extends ProjectionSources, T>(\n scheduler: Scheduler,\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n): ProjectionValue<T> => {\n let instance: ReturnType<typeof spec.build> | undefined;\n let value!: T;\n let next!: T;\n let previous!: T;\n let initialized = false;\n let revision = 0;\n let changed = false;\n let reset = false;\n const listeners = new Set<() => void>();\n const owner = createNode(scheduler, spec, {\n evaluate: (sources, build) => {\n let candidate: T;\n if (build || !instance) {\n profile.materialized.rebuilt();\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n } else {\n profile.materialized.updated();\n const result = instance.update(sources);\n assertSynchronous(result);\n if (result.kind === 'rebuild') {\n instance = undefined;\n const built = spec.build(sources);\n assertSynchronous(built);\n instance = built;\n candidate = built.value;\n build = true;\n } else candidate = result.kind === 'changed' ? result.value : value;\n }\n previous = value;\n changed = !initialized || !(options?.isEqual ?? Object.is)(value, candidate);\n next = changed ? candidate : value;\n reset = build;\n return changed;\n },\n context: active => {\n assertScope(active);\n return Object.freeze({\n value: next,\n previous,\n changed,\n revision: revision + (changed ? 1 : 0),\n reset,\n });\n },\n revision: () => revision,\n reset: () => reset,\n publish: () => {\n if (changed && initialized) revision++;\n value = next;\n initialized = true;\n },\n emit: call => {\n profile.materialized.notification();\n Array.from(listeners).forEach(listener => call(listener));\n },\n clear: () => {\n next = value;\n previous = value;\n changed = false;\n reset = false;\n },\n release: () => {\n listeners.clear();\n instance = undefined;\n value = next = previous = undefined as T;\n },\n });\n const handle = Object.freeze({\n current: () => {\n owner.check();\n return value;\n },\n revision: () => {\n owner.check();\n return revision;\n },\n subscribe: (listener: () => void) => {\n owner.check();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n rebuild: owner.rebuild,\n dispose: owner.dispose,\n }) as ProjectionValue<T>;\n owner.install(handle);\n return handle;\n};\n","import type {\n CollectionInput,\n CollectionRead,\n ProjectionInputs,\n ProjectionRuntime,\n ProjectionSource,\n ProjectionSources,\n ProjectionValue,\n ValueSpec,\n} from './contract';\nimport type { Synchronous } from '../runtime/contract';\nimport { assertSynchronous, createScheduler } from './scheduler';\nimport { createSources } from './source';\nimport { createValue } from './value';\nimport { createCollection } from './collection';\nimport type { ProjectionError } from './contract';\nimport { profile } from '../profile';\n\nconst debug = new WeakMap<\n object,\n () => { nodes: number; sources: number; subscriptions: number; pending: number }\n>();\nexport const projectionDebug = (runtime: ProjectionRuntime) => {\n const read = debug.get(runtime);\n if (!read) throw new Error('Unknown projection runtime.');\n return Object.freeze(read());\n};\nexport const createProjectionRuntime = (options: {\n readonly onError: (error: ProjectionError) => void;\n}): ProjectionRuntime => {\n const scheduler = createScheduler(options.onError);\n const sources = createSources(scheduler);\n function value<S extends ProjectionSources, T>(\n sources: S,\n compute: (sources: ProjectionInputs<S>) => Synchronous<T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n function value<S extends ProjectionSources, T>(\n spec: ValueSpec<S, T>,\n options?: { readonly isEqual?: (a: NoInfer<T>, b: NoInfer<T>) => boolean }\n ): ProjectionValue<T>;\n function value<S extends ProjectionSources, T>(\n input: S | ValueSpec<S, T>,\n computeOrOptions?:\n ((sources: ProjectionInputs<S>) => T) | { readonly isEqual?: (a: T, b: T) => boolean },\n options?: { readonly isEqual?: (a: T, b: T) => boolean }\n ): ProjectionValue<T> {\n if (typeof computeOrOptions !== 'function')\n return createValue(scheduler, input as ValueSpec<S, T>, computeOrOptions);\n const compute = (input: ProjectionInputs<S>) => {\n const result = computeOrOptions(input);\n assertSynchronous(result);\n return result;\n };\n return createValue(\n scheduler,\n {\n sources: input as S,\n build: input => ({\n value: compute(input),\n update: input => ({ kind: 'changed', value: compute(input) }),\n }),\n },\n options\n );\n }\n const map = <K extends string, V, R>(\n source: ProjectionSource<\n | CollectionInput<K, V>\n | {\n readonly read: CollectionRead<K, V>;\n readonly reset: boolean;\n readonly candidates: { readonly keys: readonly K[]; readonly orderDirty: boolean };\n }\n >,\n mapper: (id: K, entry: V) => R,\n options?: { readonly isEqual?: (a: R, b: R) => boolean }\n ) => {\n sources.assertCollection(source);\n const calculate = (id: K, entry: V): R => {\n const value = mapper(id, entry);\n assertSynchronous(value);\n return value;\n };\n return createCollection(scheduler, {\n sources: { source },\n isEqual: options?.isEqual,\n build: ({ sources, writer }) => {\n const input = sources.source;\n const read = 'read' in input ? input.read : input;\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n for (const id of ids) {\n profile.collectionView.mapped();\n writer.set(id, calculate(id, read.get(id)!));\n }\n writer.order(ids);\n return {\n update: ({ sources, writer }) => {\n const input = sources.source;\n if (input.reset) return { kind: 'rebuild' };\n const read = 'read' in input ? input.read : input;\n let keys: Iterable<K>;\n let structural: boolean;\n if ('candidates' in input) {\n keys = input.candidates.keys;\n structural = input.candidates.orderDirty;\n } else {\n const change = input.change;\n if (!change) return;\n if (change.kind === 'reset') return { kind: 'rebuild' };\n keys = new Set([...change.added, ...change.removed, ...change.updated]);\n structural = Boolean(change.added.size || change.removed.size || change.orderChanged);\n }\n for (const key of keys) {\n if (!read.has(key)) writer.remove(key);\n else {\n profile.collectionView.mapped();\n writer.set(key, calculate(key, read.get(key)!));\n }\n }\n if (structural) {\n const ids = read.ids();\n profile.collectionView.idsScanned(ids.length);\n writer.order(ids);\n }\n },\n };\n },\n });\n };\n const runtime: ProjectionRuntime = {\n document: sources.document,\n input: sources.input,\n fromReadable: sources.fromReadable,\n value,\n collection: () => spec => createCollection(scheduler, spec),\n map,\n batch: scheduler.batch,\n dispose: () => {\n try {\n scheduler.dispose();\n } finally {\n if (!scheduler.active) sources.dispose();\n }\n },\n };\n debug.set(runtime, scheduler.debug);\n return Object.freeze(runtime);\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doxum",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Doxum is a typed runtime for complex mutable documents.",
@@ -36,7 +36,8 @@ application happens to contain a Doxum runtime.
36
36
  synchronize derived data.
37
37
  - Handle expected mutation failure from the returned `rejected` result and its
38
38
  `MutationIssue` values. Use `tx.report` or `tx.reject` with
39
- `DocumentDiagnostic` for application validation. A thrown callback error
39
+ `{ code, message, address? }` for application validation; runtime adds the
40
+ application source to published `DocumentDiagnostic` values. A thrown callback error
40
41
  rolls back and is rethrown.
41
42
  - A committed result with `observerErrors` is still committed. Do not retry its
42
43
  write as if canonical state had been rolled back.
@@ -65,8 +65,8 @@ const runtime = createDocument({
65
65
  ```
66
66
 
67
67
  `table` preserves application-visible order through `{ ids, byId }`. `map`
68
- stores id-indexed entities without order. Use `single` for one structured
69
- entity, `dict` or `record` for scalar key/value data, `list` for an ordered
68
+ stores id-indexed entities without order. Use `object` for one structured
69
+ entity, `dict` for scalar key/value data, `list` for an ordered
70
70
  sequence with an application-supplied stable key, and `tree` for a validated
71
71
  single-root hierarchy. See [patterns.en.md](patterns.en.md) for modelling
72
72
  guidance.
@@ -108,7 +108,6 @@ const result = runtime.update(tx => {
108
108
  const task = tx.read.tasks.get('write-guide');
109
109
  if (!task) {
110
110
  tx.reject({
111
- source: 'application',
112
111
  code: 'task-not-found',
113
112
  message: 'The requested task no longer exists.',
114
113
  address: ['tasks', 'write-guide'],
@@ -165,8 +164,15 @@ collection and tree examples.
165
164
 
166
165
  Optional field, variant, dict, list, and tree writers expose `clear()`. Optional
167
166
  structured leaves can also be initialized from an absent state with `replace()`.
168
- Optional objects, tables, and maps have no whole-value clear; modify them through
169
- their child writers or collection operations.
167
+ Optional objects, tables, and maps are rejected by the schema constructor and
168
+ types. Model those containers as present and use their child or collection operations.
169
+ Variant readers expose get() as a discriminated union. Dictionary readers use
170
+ get(key), has(key), keys() and values(); lists also provide get(key)/has(key).
171
+
172
+ For one action spanning several updates, open `runtime.history.group()` and
173
+ call its `end()` to retain one undo entry or `cancel()` to revert the action.
174
+ Groups cannot nest. History implements Readable, and `localSync.state` is also
175
+ a Readable: both work with useReadable and projection.fromReadable.
170
176
 
171
177
  ## Replay operations at the boundary
172
178
 
@@ -243,7 +249,7 @@ const localSync = await attachLocalSync({
243
249
  documentId: 'project-1',
244
250
  });
245
251
 
246
- if (localSync.state().status === 'leader') {
252
+ if (localSync.state.current().status === 'leader') {
247
253
  runtime.update(tx => tx.write.title.set('Ship Doxum'));
248
254
  runtime.history.undo();
249
255
  }
@@ -254,7 +260,7 @@ await localSync.dispose();
254
260
 
255
261
  This is synchronous visibility with asynchronous persistence, not strict
256
262
  durability: a crash, storage failure, or invalid JSON payload can leave a
257
- visible leader commit unpersisted. Use `localSync.state()` and `onError` to show
263
+ visible leader commit unpersisted. Use `localSync.state.current()` and `onError` to show
258
264
  that condition. `flush()` is the explicit persistence/catch-up boundary. The
259
265
  attachment does not own or dispose the runtime and it does not expose an undo
260
266
  API: use `runtime.history.undo()` and `runtime.history.redo()` while the tab is
@@ -302,21 +308,15 @@ const noteSummaries = projection.map(
302
308
  (id, note) => ({ id, preview: note.body.get().slice(0, 80) }),
303
309
  { isEqual: (a, b) => a.id === b.id && a.preview === b.preview }
304
310
  );
305
- const noteCount = projection.value({
306
- sources: { notes },
307
- build: ({ notes }) => ({
308
- value: notes.read.ids().length,
309
- update: ({ notes }) => ({
310
- kind: 'changed',
311
- value: notes.read.ids().length,
312
- }),
313
- }),
314
- });
311
+ const noteCount = projection.value({ notes }, ({ notes }) => notes.read.ids().length);
315
312
  ```
316
313
 
317
314
  projection.map produces stable ids/item readables and lazy all. Declare a
318
315
  DocumentCollectionSource directly in any processor's sources, or use
319
- projection.value and projection.collection for explicit incremental logic.
316
+ `projection.value({ sources, build }, { isEqual }?)` and
317
+ `projection.collection<Item>()(spec)` for explicit incremental logic.
318
+ Map also accepts upstream projection collections. Document collection contexts
319
+ provide batch-wide `candidates.keys`, `candidates.orderDirty` and `reset`.
320
320
  There is no automatic keyed dependency tracking. All sources belong to the
321
321
  same projection owner, but may refer to different document runtimes.
322
322
 
@@ -54,7 +54,7 @@ const runtime = createDocument({
54
54
  });
55
55
  ```
56
56
 
57
- `table` 通过 `{ ids, byId }` 保留应用可见的顺序;`map` 存储无顺序的 id 索引实体。单个结构化实体用 `single`,标量键值数据用 `dict` 或 `record`,带应用稳定 key 的有序序列用 `list`,经过校验的单根层级结构用 `tree`。建模取舍见 [patterns.zh-CN.md](patterns.zh-CN.md)。
57
+ `table` 通过 `{ ids, byId }` 保留应用可见的顺序;`map` 存储无顺序的 id 索引实体。单个结构化实体用 `object`,标量键值数据用 `dict`,带应用稳定 key 的有序序列用 `list`,经过校验的单根层级结构用 `tree`。建模取舍见 [patterns.zh-CN.md](patterns.zh-CN.md)。
58
58
 
59
59
  ## 通过 reader 读取
60
60
 
@@ -89,7 +89,6 @@ const result = runtime.update(tx => {
89
89
  const task = tx.read.tasks.get('write-guide');
90
90
  if (!task) {
91
91
  tx.reject({
92
- source: 'application',
93
92
  code: 'task-not-found',
94
93
  message: 'The requested task no longer exists.',
95
94
  address: ['tasks', 'write-guide'],
@@ -136,8 +135,13 @@ runtime.update(tx => {
136
135
  table 支持 `create`、`item`、`remove` 和 `move`。map 与之相同,但没有 `move`,因为它无顺序。list 支持 `insert`、`move`、`remove` 与 `replace`;其身份来自 schema 中的 `keyOf`。完整的集合与 tree 模式见 [patterns.zh-CN.md](patterns.zh-CN.md)。
137
136
 
138
137
  optional 的 field、variant、dict、list 和 tree writer 提供 `clear()`;其中结构化叶子也可
139
- 在当前缺失时直接调用 `replace()` 建立值。optional object、table 和 map 没有整体 clear,
140
- 应通过子 writer 或集合操作修改。
138
+ 在当前缺失时直接调用 `replace()` 建立值。schema 构造器和类型均拒绝 optional object、table 和 map,
139
+ 这些容器应保持存在,通过子 writer 或集合操作修改。variant reader 的 get() 返回判别联合;
140
+ dict reader 提供 get(key)、has(key)、keys() 和 values(),list 也支持 get(key)/has(key)。
141
+
142
+ 一次动作跨越多个 update 时,打开 `runtime.history.group()`,结束后调用 end() 保留一个撤销项,
143
+ 或调用 cancel() 撤销整次动作。group 不能嵌套。history 实现 Readable,localSync.state 也是
144
+ Readable,两者都可以直接接入 useReadable 和 projection.fromReadable。
141
145
 
142
146
  ## 在边界回放 operation
143
147
 
@@ -200,7 +204,7 @@ const localSync = await attachLocalSync({
200
204
  documentId: 'project-1',
201
205
  });
202
206
 
203
- if (localSync.state().status === 'leader') {
207
+ if (localSync.state.current().status === 'leader') {
204
208
  runtime.update(tx => tx.write.title.set('Ship Doxum'));
205
209
  runtime.history.undo();
206
210
  }
@@ -211,7 +215,7 @@ await localSync.dispose();
211
215
 
212
216
  开始使用前必须等待 attachment,因为它会用 IndexedDB 恢复传入 runtime。这是“同步可见、
213
217
  异步持久化”而不是严格 durable:崩溃、存储失败或非 JSON payload,都可能让已经可见的
214
- leader commit 未持久化。用 `localSync.state()` 与 `onError` 显示该状态,`flush()` 是显式
218
+ leader commit 未持久化。用 `localSync.state.current()` 与 `onError` 显示该状态,`flush()` 是显式
215
219
  的持久化/追赶边界。attachment 不拥有也不会 dispose runtime,且不提供另一套 undo API:
216
220
  leader 使用 `runtime.history.undo()` 与 `runtime.history.redo()`。history 有意只在内存中
217
221
  存在;attachment 恢复及 remote tail apply 都会使它失效,因此不会跨重开或 leader 交接保留。
@@ -252,19 +256,10 @@ const noteSummaries = projection.map(
252
256
  (id, note) => ({ id, preview: note.body.get().slice(0, 80) }),
253
257
  { isEqual: (a, b) => a.id === b.id && a.preview === b.preview }
254
258
  );
255
- const noteCount = projection.value({
256
- sources: { notes },
257
- build: ({ notes }) => ({
258
- value: notes.read.ids().length,
259
- update: ({ notes }) => ({
260
- kind: 'changed',
261
- value: notes.read.ids().length,
262
- }),
263
- }),
264
- });
259
+ const noteCount = projection.value({ notes }, ({ notes }) => notes.read.ids().length);
265
260
  ```
266
261
 
267
- projection.map 提供稳定的 ids/item readable 和惰性 all。DocumentCollectionSource 可直接用于自定义 processor 的 sources;projection.value 和 projection.collection 承载显式增量计算。不自动跟踪 keyed 依赖。sources 属于同一 projection owner,但可接入不同 document runtime。
262
+ projection.map 提供稳定的 ids/item readable 和惰性 all,也能接入上游投影集合。DocumentCollectionSource 可直接用于自定义 processor 的 sources;有状态算法使用 `projection.value({ sources, build }, { isEqual }?)` 或 `projection.collection<Item>()(spec)`。document collection context 提供整个批次的 `candidates.keys`、`candidates.orderDirty` 和 `reset`。不自动跟踪 keyed 依赖。sources 属于同一 projection owner,但可接入不同 document runtime。
268
263
 
269
264
  projection.input(initial, { isEqual }) 用于边界值;应用保留 set,processor 只接收 source。fromReadable 接入已有外部 source,不取得其生命周期所有权。多 source 同步更新应在首次 commit 前进入 batch。projection 随 service 销毁,React unmount 只取消订阅,disposed handle 明确抛错。
270
265
 
@@ -145,7 +145,7 @@ attachment-specific undo API. While attached, external `replace` and external
145
145
  `apply` marked `remote` are rejected because only operation commands are
146
146
  appendable; the attachment's hydration and replay lease is the one trusted
147
147
  exception. Local-sync does not promise strict durability;
148
- application code uses `state()`, `onError`, and `flush()` when it needs to
148
+ application code uses `state.current()`, `onError`, and `flush()` when it needs to
149
149
  observe persistence or catch-up. Doxum intentionally does not decide network
150
150
  synchronization, authorization, retry, acknowledgement, ordering, or conflict
151
151
  resolution. An application must make those decisions before applying operations
@@ -84,7 +84,7 @@ ProjectionCollection 和 ProjectionValue 共用显式 source 图与发布机制
84
84
 
85
85
  ## Framework 与产品边界
86
86
 
87
- `core` 必须保持 framework-neutral。`doxum/react` 是从 core 到 React 的单向 adapter;core 不能 import React 或 UI 概念。`doxum/local-sync` 是附着到应用自有 runtime 的可选浏览器 attachment:它会恢复 IndexedDB checkpoint/tail,以 document Web Lock 选出唯一 leader,并通过一个很小的内部同步写入 policy 拒绝 follower mutation,而不改变 runtime API。leader 监听已完成的 local、system 与 history commit,将 JSON operation batch 异步追加到日志,并且只广播 head 提示。follower 从 durable tail 顺序读取并按 `remote` apply,因此 history 会失效。没有 pending queue、rebase、actor history 或 attachment 专属的 undo API。附着期间,外部 `replace` 与标记为 `remote` 的外部 `apply` 都会被拒绝,因为只有 operation command 能 append;attachment 的 hydration 与 replay lease 是唯一受信任例外。它不会承诺严格 durability;应用在需要观察持久化或追赶时使用 `state()`、`onError` 与 `flush()`。Doxum 有意不决定网络同步、authorization、retry、acknowledgement、ordering 或 conflict resolution。应用必须在 apply operation 或 replace snapshot 前做出这些决策。
87
+ `core` 必须保持 framework-neutral。`doxum/react` 是从 core 到 React 的单向 adapter;core 不能 import React 或 UI 概念。`doxum/local-sync` 是附着到应用自有 runtime 的可选浏览器 attachment:它会恢复 IndexedDB checkpoint/tail,以 document Web Lock 选出唯一 leader,并通过一个很小的内部同步写入 policy 拒绝 follower mutation,而不改变 runtime API。leader 监听已完成的 local、system 与 history commit,将 JSON operation batch 异步追加到日志,并且只广播 head 提示。follower 从 durable tail 顺序读取并按 `remote` apply,因此 history 会失效。没有 pending queue、rebase、actor history 或 attachment 专属的 undo API。附着期间,外部 `replace` 与标记为 `remote` 的外部 `apply` 都会被拒绝,因为只有 operation command 能 append;attachment 的 hydration 与 replay lease 是唯一受信任例外。它不会承诺严格 durability;应用在需要观察持久化或追赶时使用 `state.current()`、`onError` 与 `flush()`。Doxum 有意不决定网络同步、authorization、retry、acknowledgement、ordering 或 conflict resolution。应用必须在 apply operation 或 replace snapshot 前做出这些决策。
88
88
 
89
89
  ## 改动检查清单
90
90