doxum 0.1.25 → 0.1.27

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.
@@ -1 +1 @@
1
- {"version":3,"file":"advanced.js","names":[],"sources":["../core/src/projection/advanced.ts"],"sourcesContent":["import { collectionView } from './collection/view';\nimport type { CollectionChange, CollectionDraft, CollectionRead, SourceContext } from './contract';\nimport type {\n OutputDefinition,\n OutputEvaluation,\n Projection,\n ProjectionChange,\n ProjectionWithChange,\n} from './definition';\nimport { defineProcessor, isProjection, projectionRef } from './definition';\nimport { assertSynchronous } from './graph/scheduler';\nimport { isPlainObject } from '../value/record';\n\ntype ProjectionDependencies = Readonly<Record<string, Projection<unknown>>>;\n\ntype ProjectionValues<D extends ProjectionDependencies> = {\n readonly [K in keyof D]: D[K] extends Projection<infer T> ? T : never;\n};\n\ntype ProjectionChanges<D extends ProjectionDependencies> = {\n readonly [K in keyof D]: ProjectionChange<D[K]> extends undefined\n ? undefined\n : ProjectionChange<D[K]> | undefined;\n};\n\ntype RetainedStateContext<State> = [State] extends [never] ? {} : { readonly state: State };\ntype RetainedStateDefinition<State> = [State] extends [never]\n ? { readonly state?: never }\n : { readonly state: () => State };\n\nexport type IncrementalValueContext<D extends ProjectionDependencies, T, State = never> = {\n readonly values: ProjectionValues<D>;\n readonly changes: ProjectionChanges<D>;\n readonly previous: T | undefined;\n readonly reset: boolean;\n readonly cause: unknown;\n} & RetainedStateContext<State>;\n\nexport type IncrementalValueDefinition<D extends ProjectionDependencies, T, State = never> = {\n readonly process: (context: IncrementalValueContext<D, T, State>) => T;\n} & RetainedStateDefinition<State>;\n\nexport type IncrementalCollectionContext<\n D extends ProjectionDependencies,\n K extends string,\n V,\n State = never,\n> = {\n readonly values: ProjectionValues<D>;\n readonly changes: ProjectionChanges<D>;\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly reset: boolean;\n readonly cause: unknown;\n readonly output: CollectionDraft<K, V>;\n} & RetainedStateContext<State>;\n\nexport type IncrementalCollectionDefinition<\n D extends ProjectionDependencies,\n K extends string,\n V,\n State = never,\n> = {\n readonly process: (context: IncrementalCollectionContext<D, K, V, State>) => void;\n} & RetainedStateDefinition<State>;\n\ndeclare const groupOutput: unique symbol;\n\ntype GroupCollectionOutput<K extends string, V> = {\n readonly [groupOutput]: { readonly kind: 'collection'; readonly key: K; readonly value: V };\n};\n\ntype GroupValueOutput<T> = {\n readonly [groupOutput]: { readonly kind: 'value'; readonly value: T };\n};\n\ntype GroupOutputShape = {\n readonly [name: string]:\n GroupCollectionOutput<string, unknown> | GroupValueOutput<unknown> | GroupOutputShape;\n};\n\ntype GroupOutputBuilder = {\n collection<K extends string, V>(\n equality?: (previous: V, next: V) => boolean\n ): GroupCollectionOutput<K, V>;\n value<T>(equality?: (previous: T, next: T) => boolean): GroupValueOutput<T>;\n};\n\ntype GroupProjections<O> =\n O extends GroupCollectionOutput<infer K, infer V>\n ? ProjectionWithChange<ReadonlyMap<K, V>, CollectionChange<K, V>>\n : O extends GroupValueOutput<infer T>\n ? Projection<T>\n : { readonly [P in keyof O]: GroupProjections<O[P]> };\n\ntype GroupReads<O> =\n O extends GroupCollectionOutput<infer K, infer V>\n ? CollectionRead<K, V>\n : O extends GroupValueOutput<infer T>\n ? T | undefined\n : { readonly [P in keyof O]: GroupReads<O[P]> };\n\ntype GroupDrafts<O> =\n O extends GroupCollectionOutput<infer K, infer V>\n ? CollectionDraft<K, V>\n : O extends GroupValueOutput<infer T>\n ? { set(value: T): void }\n : { readonly [P in keyof O]: GroupDrafts<O[P]> };\n\nexport type IncrementalGroupContext<\n D extends ProjectionDependencies,\n O extends GroupOutputShape,\n State = never,\n> = {\n readonly values: ProjectionValues<D>;\n readonly changes: ProjectionChanges<D>;\n readonly previous: GroupReads<O>;\n readonly next: GroupReads<O>;\n readonly output: GroupDrafts<O>;\n readonly reset: boolean;\n readonly cause: unknown;\n} & RetainedStateContext<State>;\n\ntype IncrementalGroupDefinition<\n D extends ProjectionDependencies,\n O extends GroupOutputShape,\n State = never,\n> = {\n readonly output: (define: GroupOutputBuilder) => O;\n readonly process: (context: IncrementalGroupContext<D, O, State>) => void;\n} & RetainedStateDefinition<State>;\n\nconst resetCollectionChange = Object.freeze({ kind: 'reset' as const });\n\nconst publicValue = (source: SourceContext): unknown =>\n source.kind === 'value' ? source.value : collectionView(source.read);\n\nconst compileDependencies = <D extends ProjectionDependencies>(dependencies: D) => {\n if (!isPlainObject(dependencies) || isProjection(dependencies))\n throw new TypeError('Incremental dependencies must be a plain object.');\n const names: string[] = [];\n const projections: Projection<unknown>[] = [];\n for (const key of Reflect.ownKeys(dependencies)) {\n if (typeof key !== 'string')\n throw new TypeError('Incremental dependency names must be strings.');\n const descriptor = Object.getOwnPropertyDescriptor(dependencies, key);\n if (!descriptor?.enumerable || !('value' in descriptor))\n throw new TypeError('Incremental dependencies must be enumerable data properties.');\n projectionRef(descriptor.value as Projection<unknown>);\n names.push(key);\n projections.push(descriptor.value as Projection<unknown>);\n }\n return Object.freeze({ names: Object.freeze(names), projections: Object.freeze(projections) });\n};\n\nconst publicInputs = (\n sources: readonly SourceContext[],\n names: readonly string[],\n reset: boolean\n): {\n readonly values: Readonly<Record<string, unknown>>;\n readonly changes: Readonly<Record<string, unknown>>;\n} => {\n const values: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n const changes: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (let index = 0; index < names.length; index++) {\n const source = sources[index];\n values[names[index]] = publicValue(source);\n changes[names[index]] =\n source.kind === 'collection' ? (reset ? resetCollectionChange : source.change) : undefined;\n }\n return Object.freeze({ values: Object.freeze(values), changes: Object.freeze(changes) });\n};\n\nfunction validateDefinition(\n definition: unknown,\n allowed: readonly string[],\n label: string\n): asserts definition is Record<string, unknown> {\n if (!isPlainObject(definition))\n throw new TypeError(`${label} definition must be a plain object.`);\n const allowedKeys = new Set(allowed);\n for (const key of Reflect.ownKeys(definition)) {\n if (typeof key !== 'string' || !allowedKeys.has(key))\n throw new TypeError(`${label} definition contains an unknown property.`);\n const descriptor = Object.getOwnPropertyDescriptor(definition, key);\n if (!descriptor?.enumerable || !('value' in descriptor))\n throw new TypeError(`${label} definition must contain enumerable data properties.`);\n }\n}\n\nconst validateRetainedState = (definition: Record<string, unknown>, label: string): void => {\n if (\n Object.prototype.hasOwnProperty.call(definition, 'state') &&\n typeof definition.state !== 'function'\n )\n throw new TypeError(`${label} state must be a function when provided.`);\n};\n\nconst initializeRetainedState = (definition: {\n readonly state?: () => unknown;\n}): Readonly<Record<string, unknown>> => {\n if (definition.state === undefined) return Object.freeze({});\n const state = definition.state();\n assertSynchronous(state);\n return Object.freeze({ state });\n};\n\ntype RuntimeIncrementalDefinition<Result> = {\n readonly state?: () => unknown;\n readonly process: (context: never) => Result;\n};\n\nfunction createIncrementalValue<const D extends ProjectionDependencies, T>(\n dependencies: D,\n definition: IncrementalValueDefinition<D, T>\n): Projection<T>;\nfunction createIncrementalValue<const D extends ProjectionDependencies, T, State>(\n dependencies: D,\n definition: {\n readonly state: () => State;\n readonly process: (context: IncrementalValueContext<D, T, State>) => T;\n }\n): Projection<T>;\nfunction createIncrementalValue<const D extends ProjectionDependencies, T>(\n dependencies: D,\n definition: RuntimeIncrementalDefinition<T>\n): Projection<T> {\n const compiled = compileDependencies(dependencies);\n validateDefinition(definition, ['state', 'process'], 'Incremental value');\n validateRetainedState(definition, 'Incremental value');\n if (typeof definition.process !== 'function')\n throw new TypeError('Incremental value definition requires a process function.');\n const [projection] = defineProcessor({\n dependencies: compiled.projections,\n outputs: [{ kind: 'value', equality: Object.is }],\n create: () => {\n const state = initializeRetainedState(definition);\n return {\n evaluate: evaluation => {\n const output = evaluation.outputs[0];\n if (output.kind !== 'value') throw new Error('Incremental value output is invalid.');\n const publicInput = publicInputs(evaluation.sources, compiled.names, evaluation.reset);\n const result = definition.process({\n values: publicInput.values as ProjectionValues<D>,\n changes: publicInput.changes as ProjectionChanges<D>,\n previous: output.previous as T | undefined,\n reset: evaluation.reset,\n cause: evaluation.cause,\n ...state,\n } as never);\n assertSynchronous(result);\n output.output.set(result);\n },\n };\n },\n });\n return projection as Projection<T>;\n}\n\nfunction createIncrementalCollection<const D extends ProjectionDependencies, K extends string, V>(\n dependencies: D,\n definition: IncrementalCollectionDefinition<D, K, V>\n): ProjectionWithChange<ReadonlyMap<K, V>, CollectionChange<K, V>>;\nfunction createIncrementalCollection<\n const D extends ProjectionDependencies,\n K extends string,\n V,\n State,\n>(\n dependencies: D,\n definition: {\n readonly state: () => State;\n readonly process: (context: IncrementalCollectionContext<D, K, V, State>) => void;\n }\n): ProjectionWithChange<ReadonlyMap<K, V>, CollectionChange<K, V>>;\nfunction createIncrementalCollection<const D extends ProjectionDependencies, K extends string, V>(\n dependencies: D,\n definition: RuntimeIncrementalDefinition<void>\n): ProjectionWithChange<ReadonlyMap<K, V>, CollectionChange<K, V>> {\n const compiled = compileDependencies(dependencies);\n validateDefinition(definition, ['state', 'process'], 'Incremental collection');\n validateRetainedState(definition, 'Incremental collection');\n if (typeof definition.process !== 'function')\n throw new TypeError('Incremental collection definition requires a process function.');\n const [projection] = defineProcessor({\n dependencies: compiled.projections,\n outputs: [{ kind: 'collection', equality: Object.is }],\n create: () => {\n const state = initializeRetainedState(definition);\n return {\n evaluate: evaluation => {\n const output = evaluation.outputs[0];\n if (output.kind !== 'collection')\n throw new Error('Incremental collection output is invalid.');\n const publicInput = publicInputs(evaluation.sources, compiled.names, evaluation.reset);\n const result = definition.process({\n values: publicInput.values as ProjectionValues<D>,\n changes: publicInput.changes as ProjectionChanges<D>,\n previous: output.previous as CollectionRead<K, V>,\n next: output.next as CollectionRead<K, V>,\n reset: evaluation.reset,\n cause: evaluation.cause,\n output: output.output as CollectionDraft<K, V>,\n ...state,\n } as never);\n assertSynchronous(result);\n },\n };\n },\n });\n return projection as ProjectionWithChange<ReadonlyMap<K, V>, CollectionChange<K, V>>;\n}\n\ntype GroupShape = number | { readonly [key: string]: GroupShape };\ntype GroupOutputMetadata = {\n readonly kind: OutputDefinition['kind'];\n readonly equality: (a: unknown, b: unknown) => boolean;\n};\n\nconst isPlainGroupNamespace = (\n value: unknown,\n metadata: ReadonlyMap<object, GroupOutputMetadata>\n): value is Record<string, unknown> => isPlainObject(value) && !metadata.has(value);\n\nconst compileGroupShape = (\n value: unknown,\n path: readonly string[],\n metadata: ReadonlyMap<object, GroupOutputMetadata>,\n used: Set<object>,\n outputs: OutputDefinition[]\n): GroupShape => {\n if (value !== null && typeof value === 'object') {\n const output = metadata.get(value);\n if (output) {\n if (used.has(value)) throw new TypeError('An incremental group output cannot be reused.');\n used.add(value);\n const index = outputs.length;\n outputs.push({\n kind: output.kind,\n equality: output.equality,\n path: Object.freeze([...path]),\n });\n return index;\n }\n }\n if (!isPlainGroupNamespace(value, metadata))\n throw new TypeError('Incremental group outputs must be a static object tree.');\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string')\n throw new TypeError('Incremental group output names must be strings.');\n if (!Object.prototype.propertyIsEnumerable.call(value, key))\n throw new TypeError('Incremental group namespaces must contain enumerable properties.');\n }\n const keys = Object.keys(value);\n if (!keys.length) throw new TypeError('Incremental group namespaces cannot be empty.');\n const result: Record<string, GroupShape> = Object.create(null) as Record<string, GroupShape>;\n for (const key of keys) {\n if (key === '__proto__' || key === 'prototype' || key === 'constructor')\n throw new TypeError(`Invalid incremental group output name: ${key}`);\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || !('value' in descriptor))\n throw new TypeError('Incremental group namespaces cannot contain accessors.');\n result[key] = compileGroupShape(descriptor.value, [...path, key], metadata, used, outputs);\n }\n return Object.freeze(result);\n};\n\nconst hydrateGroupShape = <T>(shape: GroupShape, values: readonly T[]): unknown => {\n if (typeof shape === 'number') return values[shape];\n const result: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(shape)) result[key] = hydrateGroupShape(child, values);\n return Object.freeze(result);\n};\n\nconst hydrateGroupReads = (\n shape: GroupShape,\n outputs: readonly OutputEvaluation[],\n next: boolean\n): unknown => {\n if (typeof shape === 'number') {\n const output = outputs[shape];\n return next && output.kind === 'value' ? output.next() : next ? output.next : output.previous;\n }\n const result: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(shape)) {\n if (typeof child === 'number' && next && outputs[child].kind === 'value') {\n Object.defineProperty(result, key, {\n enumerable: true,\n configurable: false,\n get: () => (outputs[child] as Extract<OutputEvaluation, { kind: 'value' }>).next(),\n });\n } else result[key] = hydrateGroupReads(child, outputs, next);\n }\n return Object.freeze(result);\n};\n\nfunction createIncrementalGroup<\n const D extends ProjectionDependencies,\n const O extends GroupOutputShape,\n>(dependencies: D, definition: IncrementalGroupDefinition<D, O>): GroupProjections<O>;\nfunction createIncrementalGroup<\n const D extends ProjectionDependencies,\n const O extends GroupOutputShape,\n State,\n>(\n dependencies: D,\n definition: {\n readonly output: (define: GroupOutputBuilder) => O;\n readonly state: () => State;\n readonly process: (context: IncrementalGroupContext<D, O, State>) => void;\n }\n): GroupProjections<O>;\nfunction createIncrementalGroup<\n const D extends ProjectionDependencies,\n const O extends GroupOutputShape,\n>(\n dependencies: D,\n definition: RuntimeIncrementalDefinition<void> & {\n readonly output: (define: GroupOutputBuilder) => O;\n }\n): GroupProjections<O> {\n const compiled = compileDependencies(dependencies);\n validateDefinition(definition, ['output', 'state', 'process'], 'Incremental group');\n validateRetainedState(definition, 'Incremental group');\n if (typeof definition.output !== 'function' || typeof definition.process !== 'function')\n throw new TypeError('Incremental group definition requires output and process functions.');\n\n let active = true;\n const metadata = new Map<object, GroupOutputMetadata>();\n const defineOutput: GroupOutputBuilder = {\n collection: <K extends string, V>(equality: (previous: V, next: V) => boolean = Object.is) => {\n if (!active) throw new TypeError('Incremental group output declarations are synchronous.');\n const descriptor = Object.freeze({});\n metadata.set(descriptor, {\n kind: 'collection',\n equality: equality as (a: unknown, b: unknown) => boolean,\n });\n return descriptor as GroupCollectionOutput<K, V>;\n },\n value: <T>(equality: (previous: T, next: T) => boolean = Object.is) => {\n if (!active) throw new TypeError('Incremental group output declarations are synchronous.');\n const descriptor = Object.freeze({});\n metadata.set(descriptor, {\n kind: 'value',\n equality: equality as (a: unknown, b: unknown) => boolean,\n });\n return descriptor as GroupValueOutput<T>;\n },\n };\n const declared = definition.output(defineOutput);\n assertSynchronous(declared);\n active = false;\n const outputs: OutputDefinition[] = [];\n const used = new Set<object>();\n const shape = compileGroupShape(declared, [], metadata, used, outputs);\n if (typeof shape === 'number')\n throw new TypeError('Incremental group declarations must return an output namespace.');\n if (used.size === 0 || used.size !== metadata.size)\n throw new TypeError('Every incremental group output must be returned by the declaration.');\n\n const projections = defineProcessor({\n dependencies: compiled.projections,\n outputs,\n create: () => {\n const state = initializeRetainedState(definition);\n return {\n evaluate: evaluation => {\n const publicInput = publicInputs(evaluation.sources, compiled.names, evaluation.reset);\n const result = definition.process({\n values: publicInput.values as ProjectionValues<D>,\n changes: publicInput.changes as ProjectionChanges<D>,\n previous: hydrateGroupReads(shape, evaluation.outputs, false) as GroupReads<O>,\n next: hydrateGroupReads(shape, evaluation.outputs, true) as GroupReads<O>,\n output: hydrateGroupShape(\n shape,\n evaluation.outputs.map(output => output.output)\n ) as GroupDrafts<O>,\n reset: evaluation.reset,\n cause: evaluation.cause,\n ...state,\n } as never);\n assertSynchronous(result);\n },\n };\n },\n name: `processor-group:${outputs.map(output => output.path?.join('.') ?? '').join(',')}`,\n });\n return hydrateGroupShape(shape, projections) as GroupProjections<O>;\n}\n\nexport const incremental = Object.assign(createIncrementalValue, {\n collection: createIncrementalCollection,\n group: createIncrementalGroup,\n});\n\nexport type { CollectionChange } from './contract';\n"],"mappings":";;;AAoIA,MAAM,wBAAwB,OAAO,OAAO,EAAE,MAAM,SAAkB,CAAC;AAEvE,MAAM,eAAe,WACnB,OAAO,SAAS,UAAU,OAAO,QAAQ,eAAe,OAAO,KAAK;AAEtE,MAAM,uBAAyD,iBAAoB;AACjF,KAAI,CAAC,cAAc,aAAa,IAAI,aAAa,aAAa,CAC5D,OAAM,IAAI,UAAU,mDAAmD;CACzE,MAAM,QAAkB,EAAE;CAC1B,MAAM,cAAqC,EAAE;AAC7C,MAAK,MAAM,OAAO,QAAQ,QAAQ,aAAa,EAAE;AAC/C,MAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,UAAU,gDAAgD;EACtE,MAAM,aAAa,OAAO,yBAAyB,cAAc,IAAI;AACrE,MAAI,CAAC,YAAY,cAAc,EAAE,WAAW,YAC1C,OAAM,IAAI,UAAU,+DAA+D;AACrF,gBAAc,WAAW,MAA6B;AACtD,QAAM,KAAK,IAAI;AACf,cAAY,KAAK,WAAW,MAA6B;;AAE3D,QAAO,OAAO,OAAO;EAAE,OAAO,OAAO,OAAO,MAAM;EAAE,aAAa,OAAO,OAAO,YAAY;EAAE,CAAC;;AAGhG,MAAM,gBACJ,SACA,OACA,UAIG;CACH,MAAM,SAAkC,OAAO,OAAO,KAAK;CAC3D,MAAM,UAAmC,OAAO,OAAO,KAAK;AAC5D,MAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;EACjD,MAAM,SAAS,QAAQ;AACvB,SAAO,MAAM,UAAU,YAAY,OAAO;AAC1C,UAAQ,MAAM,UACZ,OAAO,SAAS,eAAgB,QAAQ,wBAAwB,OAAO,SAAU,KAAA;;AAErF,QAAO,OAAO,OAAO;EAAE,QAAQ,OAAO,OAAO,OAAO;EAAE,SAAS,OAAO,OAAO,QAAQ;EAAE,CAAC;;AAG1F,SAAS,mBACP,YACA,SACA,OAC+C;AAC/C,KAAI,CAAC,cAAc,WAAW,CAC5B,OAAM,IAAI,UAAU,GAAG,MAAM,qCAAqC;CACpE,MAAM,cAAc,IAAI,IAAI,QAAQ;AACpC,MAAK,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE;AAC7C,MAAI,OAAO,QAAQ,YAAY,CAAC,YAAY,IAAI,IAAI,CAClD,OAAM,IAAI,UAAU,GAAG,MAAM,2CAA2C;EAC1E,MAAM,aAAa,OAAO,yBAAyB,YAAY,IAAI;AACnE,MAAI,CAAC,YAAY,cAAc,EAAE,WAAW,YAC1C,OAAM,IAAI,UAAU,GAAG,MAAM,sDAAsD;;;AAIzF,MAAM,yBAAyB,YAAqC,UAAwB;AAC1F,KACE,OAAO,UAAU,eAAe,KAAK,YAAY,QAAQ,IACzD,OAAO,WAAW,UAAU,WAE5B,OAAM,IAAI,UAAU,GAAG,MAAM,0CAA0C;;AAG3E,MAAM,2BAA2B,eAEQ;AACvC,KAAI,WAAW,UAAU,KAAA,EAAW,QAAO,OAAO,OAAO,EAAE,CAAC;CAC5D,MAAM,QAAQ,WAAW,OAAO;AAChC,mBAAkB,MAAM;AACxB,QAAO,OAAO,OAAO,EAAE,OAAO,CAAC;;AAmBjC,SAAS,uBACP,cACA,YACe;CACf,MAAM,WAAW,oBAAoB,aAAa;AAClD,oBAAmB,YAAY,CAAC,SAAS,UAAU,EAAE,oBAAoB;AACzE,uBAAsB,YAAY,oBAAoB;AACtD,KAAI,OAAO,WAAW,YAAY,WAChC,OAAM,IAAI,UAAU,4DAA4D;CAClF,MAAM,CAAC,cAAc,gBAAgB;EACnC,cAAc,SAAS;EACvB,SAAS,CAAC;GAAE,MAAM;GAAS,UAAU,OAAO;GAAI,CAAC;EACjD,cAAc;GACZ,MAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAO,EACL,WAAU,eAAc;IACtB,MAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,OAAO,SAAS,QAAS,OAAM,IAAI,MAAM,uCAAuC;IACpF,MAAM,cAAc,aAAa,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM;IACtF,MAAM,SAAS,WAAW,QAAQ;KAChC,QAAQ,YAAY;KACpB,SAAS,YAAY;KACrB,UAAU,OAAO;KACjB,OAAO,WAAW;KAClB,OAAO,WAAW;KAClB,GAAG;KACJ,CAAU;AACX,sBAAkB,OAAO;AACzB,WAAO,OAAO,IAAI,OAAO;MAE5B;;EAEJ,CAAC;AACF,QAAO;;AAmBT,SAAS,4BACP,cACA,YACiE;CACjE,MAAM,WAAW,oBAAoB,aAAa;AAClD,oBAAmB,YAAY,CAAC,SAAS,UAAU,EAAE,yBAAyB;AAC9E,uBAAsB,YAAY,yBAAyB;AAC3D,KAAI,OAAO,WAAW,YAAY,WAChC,OAAM,IAAI,UAAU,iEAAiE;CACvF,MAAM,CAAC,cAAc,gBAAgB;EACnC,cAAc,SAAS;EACvB,SAAS,CAAC;GAAE,MAAM;GAAc,UAAU,OAAO;GAAI,CAAC;EACtD,cAAc;GACZ,MAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAO,EACL,WAAU,eAAc;IACtB,MAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,OAAO,SAAS,aAClB,OAAM,IAAI,MAAM,4CAA4C;IAC9D,MAAM,cAAc,aAAa,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM;AAWtF,sBAVe,WAAW,QAAQ;KAChC,QAAQ,YAAY;KACpB,SAAS,YAAY;KACrB,UAAU,OAAO;KACjB,MAAM,OAAO;KACb,OAAO,WAAW;KAClB,OAAO,WAAW;KAClB,QAAQ,OAAO;KACf,GAAG;KACJ,CACuB,CAAC;MAE5B;;EAEJ,CAAC;AACF,QAAO;;AAST,MAAM,yBACJ,OACA,aACqC,cAAc,MAAM,IAAI,CAAC,SAAS,IAAI,MAAM;AAEnF,MAAM,qBACJ,OACA,MACA,UACA,MACA,YACe;AACf,KAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,MAAM,SAAS,SAAS,IAAI,MAAM;AAClC,MAAI,QAAQ;AACV,OAAI,KAAK,IAAI,MAAM,CAAE,OAAM,IAAI,UAAU,gDAAgD;AACzF,QAAK,IAAI,MAAM;GACf,MAAM,QAAQ,QAAQ;AACtB,WAAQ,KAAK;IACX,MAAM,OAAO;IACb,UAAU,OAAO;IACjB,MAAM,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC;AACF,UAAO;;;AAGX,KAAI,CAAC,sBAAsB,OAAO,SAAS,CACzC,OAAM,IAAI,UAAU,0DAA0D;AAChF,MAAK,MAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE;AACxC,MAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,UAAU,kDAAkD;AACxE,MAAI,CAAC,OAAO,UAAU,qBAAqB,KAAK,OAAO,IAAI,CACzD,OAAM,IAAI,UAAU,mEAAmE;;CAE3F,MAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,UAAU,gDAAgD;CACtF,MAAM,SAAqC,OAAO,OAAO,KAAK;AAC9D,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,QAAQ,eAAe,QAAQ,eAAe,QAAQ,cACxD,OAAM,IAAI,UAAU,0CAA0C,MAAM;EACtE,MAAM,aAAa,OAAO,yBAAyB,OAAO,IAAI;AAC9D,MAAI,CAAC,cAAc,EAAE,WAAW,YAC9B,OAAM,IAAI,UAAU,yDAAyD;AAC/E,SAAO,OAAO,kBAAkB,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,UAAU,MAAM,QAAQ;;AAE5F,QAAO,OAAO,OAAO,OAAO;;AAG9B,MAAM,qBAAwB,OAAmB,WAAkC;AACjF,KAAI,OAAO,UAAU,SAAU,QAAO,OAAO;CAC7C,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAE,QAAO,OAAO,kBAAkB,OAAO,OAAO;AAChG,QAAO,OAAO,OAAO,OAAO;;AAG9B,MAAM,qBACJ,OACA,SACA,SACY;AACZ,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,SAAS,QAAQ;AACvB,SAAO,QAAQ,OAAO,SAAS,UAAU,OAAO,MAAM,GAAG,OAAO,OAAO,OAAO,OAAO;;CAEvF,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,OAAO,UAAU,YAAY,QAAQ,QAAQ,OAAO,SAAS,QAC/D,QAAO,eAAe,QAAQ,KAAK;EACjC,YAAY;EACZ,cAAc;EACd,WAAY,QAAQ,OAAwD,MAAM;EACnF,CAAC;KACG,QAAO,OAAO,kBAAkB,OAAO,SAAS,KAAK;AAE9D,QAAO,OAAO,OAAO,OAAO;;AAmB9B,SAAS,uBAIP,cACA,YAGqB;CACrB,MAAM,WAAW,oBAAoB,aAAa;AAClD,oBAAmB,YAAY;EAAC;EAAU;EAAS;EAAU,EAAE,oBAAoB;AACnF,uBAAsB,YAAY,oBAAoB;AACtD,KAAI,OAAO,WAAW,WAAW,cAAc,OAAO,WAAW,YAAY,WAC3E,OAAM,IAAI,UAAU,sEAAsE;CAE5F,IAAI,SAAS;CACb,MAAM,2BAAW,IAAI,KAAkC;CAqBvD,MAAM,WAAW,WAAW,OAAO;EAnBjC,aAAkC,WAA8C,OAAO,OAAO;AAC5F,OAAI,CAAC,OAAQ,OAAM,IAAI,UAAU,yDAAyD;GAC1F,MAAM,aAAa,OAAO,OAAO,EAAE,CAAC;AACpC,YAAS,IAAI,YAAY;IACvB,MAAM;IACI;IACX,CAAC;AACF,UAAO;;EAET,QAAW,WAA8C,OAAO,OAAO;AACrE,OAAI,CAAC,OAAQ,OAAM,IAAI,UAAU,yDAAyD;GAC1F,MAAM,aAAa,OAAO,OAAO,EAAE,CAAC;AACpC,YAAS,IAAI,YAAY;IACvB,MAAM;IACI;IACX,CAAC;AACF,UAAO;;EAGoC,CAAC;AAChD,mBAAkB,SAAS;AAC3B,UAAS;CACT,MAAM,UAA8B,EAAE;CACtC,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,QAAQ,kBAAkB,UAAU,EAAE,EAAE,UAAU,MAAM,QAAQ;AACtE,KAAI,OAAO,UAAU,SACnB,OAAM,IAAI,UAAU,kEAAkE;AACxF,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,SAAS,KAC5C,OAAM,IAAI,UAAU,sEAAsE;AA6B5F,QAAO,kBAAkB,OA3BL,gBAAgB;EAClC,cAAc,SAAS;EACvB;EACA,cAAc;GACZ,MAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAO,EACL,WAAU,eAAc;IACtB,MAAM,cAAc,aAAa,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM;AActF,sBAbe,WAAW,QAAQ;KAChC,QAAQ,YAAY;KACpB,SAAS,YAAY;KACrB,UAAU,kBAAkB,OAAO,WAAW,SAAS,MAAM;KAC7D,MAAM,kBAAkB,OAAO,WAAW,SAAS,KAAK;KACxD,QAAQ,kBACN,OACA,WAAW,QAAQ,KAAI,WAAU,OAAO,OAAO,CAChD;KACD,OAAO,WAAW;KAClB,OAAO,WAAW;KAClB,GAAG;KACJ,CACuB,CAAC;MAE5B;;EAEH,MAAM,mBAAmB,QAAQ,KAAI,WAAU,OAAO,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI;EACvF,CAC0C,CAAC;;AAG9C,MAAa,cAAc,OAAO,OAAO,wBAAwB;CAC/D,YAAY;CACZ,OAAO;CACR,CAAC"}
1
+ {"version":3,"file":"advanced.js","names":[],"sources":["../core/src/projection/advanced.ts"],"sourcesContent":["import { collectionView } from './collection/view';\nimport type { CollectionChange, CollectionDraft, CollectionRead, SourceContext } from './contract';\nimport type {\n KeyedProjection,\n OutputDefinition,\n OutputEvaluation,\n Projection,\n ProjectionChange,\n} from './definition';\nimport { defineProcessor } from './definition';\nimport { compileProjectionDependencies } from './dependency';\nimport { assertSynchronous } from './graph/scheduler';\nimport { isPlainObject } from '../value/record';\n\ntype ProjectionDependencies = Readonly<Record<string, Projection<unknown>>>;\n\ntype ProjectionValues<D extends ProjectionDependencies> = {\n readonly [K in keyof D]: D[K] extends Projection<infer T> ? T : never;\n};\n\ntype ProjectionChanges<D extends ProjectionDependencies> = {\n readonly [K in keyof D]: ProjectionChange<D[K]> extends undefined\n ? undefined\n : ProjectionChange<D[K]> | undefined;\n};\n\ntype RetainedStateContext<State> = [State] extends [never] ? {} : { readonly state: State };\ntype RetainedStateDefinition<State> = [State] extends [never]\n ? { readonly state?: never }\n : { readonly state: () => State };\n\nexport type IncrementalValueContext<D extends ProjectionDependencies, T, State = never> = {\n readonly values: ProjectionValues<D>;\n readonly changes: ProjectionChanges<D>;\n readonly previous: T | undefined;\n readonly reset: boolean;\n readonly cause: unknown;\n} & RetainedStateContext<State>;\n\nexport type IncrementalValueDefinition<D extends ProjectionDependencies, T, State = never> = {\n readonly process: (context: IncrementalValueContext<D, T, State>) => T;\n} & RetainedStateDefinition<State>;\n\nexport type IncrementalCollectionContext<\n D extends ProjectionDependencies,\n K extends string,\n V,\n State = never,\n> = {\n readonly values: ProjectionValues<D>;\n readonly changes: ProjectionChanges<D>;\n readonly previous: CollectionRead<K, V>;\n readonly next: CollectionRead<K, V>;\n readonly reset: boolean;\n readonly cause: unknown;\n readonly output: CollectionDraft<K, V>;\n} & RetainedStateContext<State>;\n\nexport type IncrementalCollectionDefinition<\n D extends ProjectionDependencies,\n K extends string,\n V,\n State = never,\n> = {\n readonly process: (context: IncrementalCollectionContext<D, K, V, State>) => void;\n} & RetainedStateDefinition<State>;\n\ndeclare const groupOutput: unique symbol;\n\n/** Type-only declaration token used by incremental.group output builders. */\nexport type IncrementalGroupOutput<P extends Projection<unknown>> = {\n readonly [groupOutput]: P;\n};\n\ntype GroupOutputShape = {\n readonly [name: string]: IncrementalGroupOutput<Projection<unknown>> | GroupOutputShape;\n};\n\ntype GroupOutputBuilder = {\n collection<K extends string, V>(\n equality?: (previous: V, next: V) => boolean\n ): IncrementalGroupOutput<KeyedProjection<K, V>>;\n value<T>(equality?: (previous: T, next: T) => boolean): IncrementalGroupOutput<Projection<T>>;\n};\n\n/** Portable projection tree returned from an incremental.group declaration. */\nexport type IncrementalGroupResult<O> =\n O extends IncrementalGroupOutput<infer P>\n ? P\n : O extends Readonly<Record<string, unknown>>\n ? { readonly [K in keyof O]: IncrementalGroupResult<O[K]> }\n : never;\n\ntype GroupReads<O> =\n O extends IncrementalGroupOutput<infer P>\n ? P extends KeyedProjection<infer K, infer V>\n ? CollectionRead<K, V>\n : P extends Projection<infer T>\n ? T | undefined\n : never\n : { readonly [K in keyof O]: GroupReads<O[K]> };\n\ntype GroupDrafts<O> =\n O extends IncrementalGroupOutput<infer P>\n ? P extends KeyedProjection<infer K, infer V>\n ? CollectionDraft<K, V>\n : P extends Projection<infer T>\n ? { set(value: T): void }\n : never\n : { readonly [K in keyof O]: GroupDrafts<O[K]> };\n\nexport type IncrementalGroupContext<\n D extends ProjectionDependencies,\n O extends GroupOutputShape,\n State = never,\n> = {\n readonly values: ProjectionValues<D>;\n readonly changes: ProjectionChanges<D>;\n readonly previous: GroupReads<O>;\n readonly next: GroupReads<O>;\n readonly output: GroupDrafts<O>;\n readonly reset: boolean;\n readonly cause: unknown;\n} & RetainedStateContext<State>;\n\ntype IncrementalGroupDefinition<\n D extends ProjectionDependencies,\n O extends GroupOutputShape,\n State = never,\n> = {\n readonly output: (define: GroupOutputBuilder) => O;\n readonly process: (context: IncrementalGroupContext<D, O, State>) => void;\n} & RetainedStateDefinition<State>;\n\nconst resetCollectionChange = Object.freeze({ kind: 'reset' as const });\n\nconst publicValue = (source: SourceContext): unknown =>\n source.kind === 'value' ? source.value : collectionView(source.read);\n\nconst publicInputs = (\n sources: readonly SourceContext[],\n names: readonly string[],\n reset: boolean\n): {\n readonly values: Readonly<Record<string, unknown>>;\n readonly changes: Readonly<Record<string, unknown>>;\n} => {\n const values: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n const changes: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (let index = 0; index < names.length; index++) {\n const source = sources[index];\n values[names[index]] = publicValue(source);\n changes[names[index]] =\n source.kind === 'collection' ? (reset ? resetCollectionChange : source.change) : undefined;\n }\n return Object.freeze({ values: Object.freeze(values), changes: Object.freeze(changes) });\n};\n\nfunction validateDefinition(\n definition: unknown,\n allowed: readonly string[],\n label: string\n): asserts definition is Record<string, unknown> {\n if (!isPlainObject(definition))\n throw new TypeError(`${label} definition must be a plain object.`);\n const allowedKeys = new Set(allowed);\n for (const key of Reflect.ownKeys(definition)) {\n if (typeof key !== 'string' || !allowedKeys.has(key))\n throw new TypeError(`${label} definition contains an unknown property.`);\n const descriptor = Object.getOwnPropertyDescriptor(definition, key);\n if (!descriptor?.enumerable || !('value' in descriptor))\n throw new TypeError(`${label} definition must contain enumerable data properties.`);\n }\n}\n\nconst validateRetainedState = (definition: Record<string, unknown>, label: string): void => {\n if (\n Object.prototype.hasOwnProperty.call(definition, 'state') &&\n typeof definition.state !== 'function'\n )\n throw new TypeError(`${label} state must be a function when provided.`);\n};\n\nconst initializeRetainedState = (definition: {\n readonly state?: () => unknown;\n}): Readonly<Record<string, unknown>> => {\n if (definition.state === undefined) return Object.freeze({});\n const state = definition.state();\n assertSynchronous(state);\n return Object.freeze({ state });\n};\n\ntype RuntimeIncrementalDefinition<Result> = {\n readonly state?: () => unknown;\n readonly process: (context: never) => Result;\n};\n\nfunction createIncrementalValue<const D extends ProjectionDependencies, T>(\n dependencies: D,\n definition: IncrementalValueDefinition<D, T>\n): Projection<T>;\nfunction createIncrementalValue<const D extends ProjectionDependencies, T, State>(\n dependencies: D,\n definition: {\n readonly state: () => State;\n readonly process: (context: IncrementalValueContext<D, T, State>) => T;\n }\n): Projection<T>;\nfunction createIncrementalValue<const D extends ProjectionDependencies, T>(\n dependencies: D,\n definition: RuntimeIncrementalDefinition<T>\n): Projection<T> {\n const compiled = compileProjectionDependencies(dependencies, 'Incremental');\n validateDefinition(definition, ['state', 'process'], 'Incremental value');\n validateRetainedState(definition, 'Incremental value');\n if (typeof definition.process !== 'function')\n throw new TypeError('Incremental value definition requires a process function.');\n const [projection] = defineProcessor({\n dependencies: compiled.projections,\n outputs: [{ kind: 'value', equality: Object.is }],\n create: () => {\n const state = initializeRetainedState(definition);\n return {\n evaluate: evaluation => {\n const output = evaluation.outputs[0];\n if (output.kind !== 'value') throw new Error('Incremental value output is invalid.');\n const publicInput = publicInputs(evaluation.sources, compiled.names, evaluation.reset);\n const result = definition.process({\n values: publicInput.values as ProjectionValues<D>,\n changes: publicInput.changes as ProjectionChanges<D>,\n previous: output.previous as T | undefined,\n reset: evaluation.reset,\n cause: evaluation.cause,\n ...state,\n } as never);\n assertSynchronous(result);\n output.output.set(result);\n },\n };\n },\n });\n return projection as Projection<T>;\n}\n\nfunction createIncrementalCollection<const D extends ProjectionDependencies, K extends string, V>(\n dependencies: D,\n definition: IncrementalCollectionDefinition<D, K, V>\n): KeyedProjection<K, V>;\nfunction createIncrementalCollection<\n const D extends ProjectionDependencies,\n K extends string,\n V,\n State,\n>(\n dependencies: D,\n definition: {\n readonly state: () => State;\n readonly process: (context: IncrementalCollectionContext<D, K, V, State>) => void;\n }\n): KeyedProjection<K, V>;\nfunction createIncrementalCollection<const D extends ProjectionDependencies, K extends string, V>(\n dependencies: D,\n definition: RuntimeIncrementalDefinition<void>\n): KeyedProjection<K, V> {\n const compiled = compileProjectionDependencies(dependencies, 'Incremental');\n validateDefinition(definition, ['state', 'process'], 'Incremental collection');\n validateRetainedState(definition, 'Incremental collection');\n if (typeof definition.process !== 'function')\n throw new TypeError('Incremental collection definition requires a process function.');\n const [projection] = defineProcessor({\n dependencies: compiled.projections,\n outputs: [{ kind: 'collection', equality: Object.is }],\n create: () => {\n const state = initializeRetainedState(definition);\n return {\n evaluate: evaluation => {\n const output = evaluation.outputs[0];\n if (output.kind !== 'collection')\n throw new Error('Incremental collection output is invalid.');\n const publicInput = publicInputs(evaluation.sources, compiled.names, evaluation.reset);\n const result = definition.process({\n values: publicInput.values as ProjectionValues<D>,\n changes: publicInput.changes as ProjectionChanges<D>,\n previous: output.previous as CollectionRead<K, V>,\n next: output.next as CollectionRead<K, V>,\n reset: evaluation.reset,\n cause: evaluation.cause,\n output: output.output as CollectionDraft<K, V>,\n ...state,\n } as never);\n assertSynchronous(result);\n },\n };\n },\n });\n return projection as KeyedProjection<K, V>;\n}\n\ntype GroupShape = number | { readonly [key: string]: GroupShape };\ntype GroupOutputMetadata = {\n readonly kind: OutputDefinition['kind'];\n readonly equality: (a: unknown, b: unknown) => boolean;\n};\n\nconst isPlainGroupNamespace = (\n value: unknown,\n metadata: ReadonlyMap<object, GroupOutputMetadata>\n): value is Record<string, unknown> => isPlainObject(value) && !metadata.has(value);\n\nconst compileGroupShape = (\n value: unknown,\n path: readonly string[],\n metadata: ReadonlyMap<object, GroupOutputMetadata>,\n used: Set<object>,\n outputs: OutputDefinition[]\n): GroupShape => {\n if (value !== null && typeof value === 'object') {\n const output = metadata.get(value);\n if (output) {\n if (used.has(value)) throw new TypeError('An incremental group output cannot be reused.');\n used.add(value);\n const index = outputs.length;\n outputs.push({\n kind: output.kind,\n equality: output.equality,\n path: Object.freeze([...path]),\n });\n return index;\n }\n }\n if (!isPlainGroupNamespace(value, metadata))\n throw new TypeError('Incremental group outputs must be a static object tree.');\n for (const key of Reflect.ownKeys(value)) {\n if (typeof key !== 'string')\n throw new TypeError('Incremental group output names must be strings.');\n if (!Object.prototype.propertyIsEnumerable.call(value, key))\n throw new TypeError('Incremental group namespaces must contain enumerable properties.');\n }\n const keys = Object.keys(value);\n if (!keys.length) throw new TypeError('Incremental group namespaces cannot be empty.');\n const result: Record<string, GroupShape> = Object.create(null) as Record<string, GroupShape>;\n for (const key of keys) {\n if (key === '__proto__' || key === 'prototype' || key === 'constructor')\n throw new TypeError(`Invalid incremental group output name: ${key}`);\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (!descriptor || !('value' in descriptor))\n throw new TypeError('Incremental group namespaces cannot contain accessors.');\n result[key] = compileGroupShape(descriptor.value, [...path, key], metadata, used, outputs);\n }\n return Object.freeze(result);\n};\n\nconst hydrateGroupShape = <T>(shape: GroupShape, values: readonly T[]): unknown => {\n if (typeof shape === 'number') return values[shape];\n const result: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(shape)) result[key] = hydrateGroupShape(child, values);\n return Object.freeze(result);\n};\n\nconst hydrateGroupReads = (\n shape: GroupShape,\n outputs: readonly OutputEvaluation[],\n next: boolean\n): unknown => {\n if (typeof shape === 'number') {\n const output = outputs[shape];\n return next && output.kind === 'value' ? output.next() : next ? output.next : output.previous;\n }\n const result: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(shape)) {\n if (typeof child === 'number' && next && outputs[child].kind === 'value') {\n Object.defineProperty(result, key, {\n enumerable: true,\n configurable: false,\n get: () => (outputs[child] as Extract<OutputEvaluation, { kind: 'value' }>).next(),\n });\n } else result[key] = hydrateGroupReads(child, outputs, next);\n }\n return Object.freeze(result);\n};\n\nfunction createIncrementalGroup<\n const D extends ProjectionDependencies,\n const O extends GroupOutputShape,\n>(dependencies: D, definition: IncrementalGroupDefinition<D, O>): IncrementalGroupResult<O>;\nfunction createIncrementalGroup<\n const D extends ProjectionDependencies,\n const O extends GroupOutputShape,\n State,\n>(\n dependencies: D,\n definition: {\n readonly output: (define: GroupOutputBuilder) => O;\n readonly state: () => State;\n readonly process: (context: IncrementalGroupContext<D, O, State>) => void;\n }\n): IncrementalGroupResult<O>;\nfunction createIncrementalGroup<\n const D extends ProjectionDependencies,\n const O extends GroupOutputShape,\n>(\n dependencies: D,\n definition: RuntimeIncrementalDefinition<void> & {\n readonly output: (define: GroupOutputBuilder) => O;\n }\n): IncrementalGroupResult<O> {\n const compiled = compileProjectionDependencies(dependencies, 'Incremental');\n validateDefinition(definition, ['output', 'state', 'process'], 'Incremental group');\n validateRetainedState(definition, 'Incremental group');\n if (typeof definition.output !== 'function' || typeof definition.process !== 'function')\n throw new TypeError('Incremental group definition requires output and process functions.');\n\n let active = true;\n const metadata = new Map<object, GroupOutputMetadata>();\n const defineOutput: GroupOutputBuilder = {\n collection: <K extends string, V>(equality: (previous: V, next: V) => boolean = Object.is) => {\n if (!active) throw new TypeError('Incremental group output declarations are synchronous.');\n const descriptor = Object.freeze({});\n metadata.set(descriptor, {\n kind: 'collection',\n equality: equality as (a: unknown, b: unknown) => boolean,\n });\n return descriptor as IncrementalGroupOutput<KeyedProjection<K, V>>;\n },\n value: <T>(equality: (previous: T, next: T) => boolean = Object.is) => {\n if (!active) throw new TypeError('Incremental group output declarations are synchronous.');\n const descriptor = Object.freeze({});\n metadata.set(descriptor, {\n kind: 'value',\n equality: equality as (a: unknown, b: unknown) => boolean,\n });\n return descriptor as IncrementalGroupOutput<Projection<T>>;\n },\n };\n const declared = definition.output(defineOutput);\n assertSynchronous(declared);\n active = false;\n const outputs: OutputDefinition[] = [];\n const used = new Set<object>();\n const shape = compileGroupShape(declared, [], metadata, used, outputs);\n if (typeof shape === 'number')\n throw new TypeError('Incremental group declarations must return an output namespace.');\n if (used.size === 0 || used.size !== metadata.size)\n throw new TypeError('Every incremental group output must be returned by the declaration.');\n\n const projections = defineProcessor({\n dependencies: compiled.projections,\n outputs,\n create: () => {\n const state = initializeRetainedState(definition);\n return {\n evaluate: evaluation => {\n const publicInput = publicInputs(evaluation.sources, compiled.names, evaluation.reset);\n const result = definition.process({\n values: publicInput.values as ProjectionValues<D>,\n changes: publicInput.changes as ProjectionChanges<D>,\n previous: hydrateGroupReads(shape, evaluation.outputs, false) as GroupReads<O>,\n next: hydrateGroupReads(shape, evaluation.outputs, true) as GroupReads<O>,\n output: hydrateGroupShape(\n shape,\n evaluation.outputs.map(output => output.output)\n ) as GroupDrafts<O>,\n reset: evaluation.reset,\n cause: evaluation.cause,\n ...state,\n } as never);\n assertSynchronous(result);\n },\n };\n },\n name: `processor-group:${outputs.map(output => output.path?.join('.') ?? '').join(',')}`,\n });\n return hydrateGroupShape(shape, projections) as IncrementalGroupResult<O>;\n}\n\nexport const incremental = Object.assign(createIncrementalValue, {\n collection: createIncrementalCollection,\n group: createIncrementalGroup,\n});\n\nexport { collectionChange } from './collection/change';\nexport type { CollectionChange } from './contract';\n"],"mappings":";;;AAsIA,MAAM,wBAAwB,OAAO,OAAO,EAAE,MAAM,SAAkB,CAAC;AAEvE,MAAM,eAAe,WACnB,OAAO,SAAS,UAAU,OAAO,QAAQ,eAAe,OAAO,KAAK;AAEtE,MAAM,gBACJ,SACA,OACA,UAIG;CACH,MAAM,SAAkC,OAAO,OAAO,KAAK;CAC3D,MAAM,UAAmC,OAAO,OAAO,KAAK;AAC5D,MAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;EACjD,MAAM,SAAS,QAAQ;AACvB,SAAO,MAAM,UAAU,YAAY,OAAO;AAC1C,UAAQ,MAAM,UACZ,OAAO,SAAS,eAAgB,QAAQ,wBAAwB,OAAO,SAAU,KAAA;;AAErF,QAAO,OAAO,OAAO;EAAE,QAAQ,OAAO,OAAO,OAAO;EAAE,SAAS,OAAO,OAAO,QAAQ;EAAE,CAAC;;AAG1F,SAAS,mBACP,YACA,SACA,OAC+C;AAC/C,KAAI,CAAC,cAAc,WAAW,CAC5B,OAAM,IAAI,UAAU,GAAG,MAAM,qCAAqC;CACpE,MAAM,cAAc,IAAI,IAAI,QAAQ;AACpC,MAAK,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE;AAC7C,MAAI,OAAO,QAAQ,YAAY,CAAC,YAAY,IAAI,IAAI,CAClD,OAAM,IAAI,UAAU,GAAG,MAAM,2CAA2C;EAC1E,MAAM,aAAa,OAAO,yBAAyB,YAAY,IAAI;AACnE,MAAI,CAAC,YAAY,cAAc,EAAE,WAAW,YAC1C,OAAM,IAAI,UAAU,GAAG,MAAM,sDAAsD;;;AAIzF,MAAM,yBAAyB,YAAqC,UAAwB;AAC1F,KACE,OAAO,UAAU,eAAe,KAAK,YAAY,QAAQ,IACzD,OAAO,WAAW,UAAU,WAE5B,OAAM,IAAI,UAAU,GAAG,MAAM,0CAA0C;;AAG3E,MAAM,2BAA2B,eAEQ;AACvC,KAAI,WAAW,UAAU,KAAA,EAAW,QAAO,OAAO,OAAO,EAAE,CAAC;CAC5D,MAAM,QAAQ,WAAW,OAAO;AAChC,mBAAkB,MAAM;AACxB,QAAO,OAAO,OAAO,EAAE,OAAO,CAAC;;AAmBjC,SAAS,uBACP,cACA,YACe;CACf,MAAM,WAAW,8BAA8B,cAAc,cAAc;AAC3E,oBAAmB,YAAY,CAAC,SAAS,UAAU,EAAE,oBAAoB;AACzE,uBAAsB,YAAY,oBAAoB;AACtD,KAAI,OAAO,WAAW,YAAY,WAChC,OAAM,IAAI,UAAU,4DAA4D;CAClF,MAAM,CAAC,cAAc,gBAAgB;EACnC,cAAc,SAAS;EACvB,SAAS,CAAC;GAAE,MAAM;GAAS,UAAU,OAAO;GAAI,CAAC;EACjD,cAAc;GACZ,MAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAO,EACL,WAAU,eAAc;IACtB,MAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,OAAO,SAAS,QAAS,OAAM,IAAI,MAAM,uCAAuC;IACpF,MAAM,cAAc,aAAa,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM;IACtF,MAAM,SAAS,WAAW,QAAQ;KAChC,QAAQ,YAAY;KACpB,SAAS,YAAY;KACrB,UAAU,OAAO;KACjB,OAAO,WAAW;KAClB,OAAO,WAAW;KAClB,GAAG;KACJ,CAAU;AACX,sBAAkB,OAAO;AACzB,WAAO,OAAO,IAAI,OAAO;MAE5B;;EAEJ,CAAC;AACF,QAAO;;AAmBT,SAAS,4BACP,cACA,YACuB;CACvB,MAAM,WAAW,8BAA8B,cAAc,cAAc;AAC3E,oBAAmB,YAAY,CAAC,SAAS,UAAU,EAAE,yBAAyB;AAC9E,uBAAsB,YAAY,yBAAyB;AAC3D,KAAI,OAAO,WAAW,YAAY,WAChC,OAAM,IAAI,UAAU,iEAAiE;CACvF,MAAM,CAAC,cAAc,gBAAgB;EACnC,cAAc,SAAS;EACvB,SAAS,CAAC;GAAE,MAAM;GAAc,UAAU,OAAO;GAAI,CAAC;EACtD,cAAc;GACZ,MAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAO,EACL,WAAU,eAAc;IACtB,MAAM,SAAS,WAAW,QAAQ;AAClC,QAAI,OAAO,SAAS,aAClB,OAAM,IAAI,MAAM,4CAA4C;IAC9D,MAAM,cAAc,aAAa,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM;AAWtF,sBAVe,WAAW,QAAQ;KAChC,QAAQ,YAAY;KACpB,SAAS,YAAY;KACrB,UAAU,OAAO;KACjB,MAAM,OAAO;KACb,OAAO,WAAW;KAClB,OAAO,WAAW;KAClB,QAAQ,OAAO;KACf,GAAG;KACJ,CACuB,CAAC;MAE5B;;EAEJ,CAAC;AACF,QAAO;;AAST,MAAM,yBACJ,OACA,aACqC,cAAc,MAAM,IAAI,CAAC,SAAS,IAAI,MAAM;AAEnF,MAAM,qBACJ,OACA,MACA,UACA,MACA,YACe;AACf,KAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,MAAM,SAAS,SAAS,IAAI,MAAM;AAClC,MAAI,QAAQ;AACV,OAAI,KAAK,IAAI,MAAM,CAAE,OAAM,IAAI,UAAU,gDAAgD;AACzF,QAAK,IAAI,MAAM;GACf,MAAM,QAAQ,QAAQ;AACtB,WAAQ,KAAK;IACX,MAAM,OAAO;IACb,UAAU,OAAO;IACjB,MAAM,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC;AACF,UAAO;;;AAGX,KAAI,CAAC,sBAAsB,OAAO,SAAS,CACzC,OAAM,IAAI,UAAU,0DAA0D;AAChF,MAAK,MAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE;AACxC,MAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,UAAU,kDAAkD;AACxE,MAAI,CAAC,OAAO,UAAU,qBAAqB,KAAK,OAAO,IAAI,CACzD,OAAM,IAAI,UAAU,mEAAmE;;CAE3F,MAAM,OAAO,OAAO,KAAK,MAAM;AAC/B,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,UAAU,gDAAgD;CACtF,MAAM,SAAqC,OAAO,OAAO,KAAK;AAC9D,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,QAAQ,eAAe,QAAQ,eAAe,QAAQ,cACxD,OAAM,IAAI,UAAU,0CAA0C,MAAM;EACtE,MAAM,aAAa,OAAO,yBAAyB,OAAO,IAAI;AAC9D,MAAI,CAAC,cAAc,EAAE,WAAW,YAC9B,OAAM,IAAI,UAAU,yDAAyD;AAC/E,SAAO,OAAO,kBAAkB,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,UAAU,MAAM,QAAQ;;AAE5F,QAAO,OAAO,OAAO,OAAO;;AAG9B,MAAM,qBAAwB,OAAmB,WAAkC;AACjF,KAAI,OAAO,UAAU,SAAU,QAAO,OAAO;CAC7C,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAE,QAAO,OAAO,kBAAkB,OAAO,OAAO;AAChG,QAAO,OAAO,OAAO,OAAO;;AAG9B,MAAM,qBACJ,OACA,SACA,SACY;AACZ,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,SAAS,QAAQ;AACvB,SAAO,QAAQ,OAAO,SAAS,UAAU,OAAO,MAAM,GAAG,OAAO,OAAO,OAAO,OAAO;;CAEvF,MAAM,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAC9C,KAAI,OAAO,UAAU,YAAY,QAAQ,QAAQ,OAAO,SAAS,QAC/D,QAAO,eAAe,QAAQ,KAAK;EACjC,YAAY;EACZ,cAAc;EACd,WAAY,QAAQ,OAAwD,MAAM;EACnF,CAAC;KACG,QAAO,OAAO,kBAAkB,OAAO,SAAS,KAAK;AAE9D,QAAO,OAAO,OAAO,OAAO;;AAmB9B,SAAS,uBAIP,cACA,YAG2B;CAC3B,MAAM,WAAW,8BAA8B,cAAc,cAAc;AAC3E,oBAAmB,YAAY;EAAC;EAAU;EAAS;EAAU,EAAE,oBAAoB;AACnF,uBAAsB,YAAY,oBAAoB;AACtD,KAAI,OAAO,WAAW,WAAW,cAAc,OAAO,WAAW,YAAY,WAC3E,OAAM,IAAI,UAAU,sEAAsE;CAE5F,IAAI,SAAS;CACb,MAAM,2BAAW,IAAI,KAAkC;CAqBvD,MAAM,WAAW,WAAW,OAAO;EAnBjC,aAAkC,WAA8C,OAAO,OAAO;AAC5F,OAAI,CAAC,OAAQ,OAAM,IAAI,UAAU,yDAAyD;GAC1F,MAAM,aAAa,OAAO,OAAO,EAAE,CAAC;AACpC,YAAS,IAAI,YAAY;IACvB,MAAM;IACI;IACX,CAAC;AACF,UAAO;;EAET,QAAW,WAA8C,OAAO,OAAO;AACrE,OAAI,CAAC,OAAQ,OAAM,IAAI,UAAU,yDAAyD;GAC1F,MAAM,aAAa,OAAO,OAAO,EAAE,CAAC;AACpC,YAAS,IAAI,YAAY;IACvB,MAAM;IACI;IACX,CAAC;AACF,UAAO;;EAGoC,CAAC;AAChD,mBAAkB,SAAS;AAC3B,UAAS;CACT,MAAM,UAA8B,EAAE;CACtC,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,QAAQ,kBAAkB,UAAU,EAAE,EAAE,UAAU,MAAM,QAAQ;AACtE,KAAI,OAAO,UAAU,SACnB,OAAM,IAAI,UAAU,kEAAkE;AACxF,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,SAAS,KAC5C,OAAM,IAAI,UAAU,sEAAsE;AA6B5F,QAAO,kBAAkB,OA3BL,gBAAgB;EAClC,cAAc,SAAS;EACvB;EACA,cAAc;GACZ,MAAM,QAAQ,wBAAwB,WAAW;AACjD,UAAO,EACL,WAAU,eAAc;IACtB,MAAM,cAAc,aAAa,WAAW,SAAS,SAAS,OAAO,WAAW,MAAM;AActF,sBAbe,WAAW,QAAQ;KAChC,QAAQ,YAAY;KACpB,SAAS,YAAY;KACrB,UAAU,kBAAkB,OAAO,WAAW,SAAS,MAAM;KAC7D,MAAM,kBAAkB,OAAO,WAAW,SAAS,KAAK;KACxD,QAAQ,kBACN,OACA,WAAW,QAAQ,KAAI,WAAU,OAAO,OAAO,CAChD;KACD,OAAO,WAAW;KAClB,OAAO,WAAW;KAClB,GAAG;KACJ,CACuB,CAAC;MAE5B;;EAEH,MAAM,mBAAmB,QAAQ,KAAI,WAAU,OAAO,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI;EACvF,CAC0C,CAAC;;AAG9C,MAAa,cAAc,OAAO,OAAO,wBAAwB;CAC/D,YAAY;CACZ,OAAO;CACR,CAAC"}
@@ -85,23 +85,65 @@ type TreeNode<TValue, ValueOptional extends boolean = false> = BaseNode<'tree'>
85
85
  };
86
86
  type DocumentNode = FieldNode<unknown, false> | FieldNode<unknown, true> | ObjectNode<ObjectShape> | VariantNode<string, VariantShape> | TableNode<ObjectNode<ObjectShape> | VariantNode<string, VariantShape>> | MapNode<ValueSchemaNode> | ListNode<unknown> | TreeNode<unknown, false> | TreeNode<unknown, true>;
87
87
  declare const schemaType: unique symbol;
88
- declare const schemaNode: unique symbol;
89
88
  declare const objectSchema: unique symbol;
90
- type Schema<T = unknown> = {
91
- readonly [schemaType]: T;
89
+ /** Portable public schema handle. The definition parameter carries compile-time shape only. */
90
+ type Schema<T = unknown, Definition = unknown> = {
91
+ readonly [schemaType]: {
92
+ readonly value: T;
93
+ readonly definition: Definition;
94
+ };
95
+ };
96
+ type PublicSchemaShape = {
97
+ readonly [key: string]: Schema<unknown, unknown>;
92
98
  };
93
- type ObjectSchema<T extends object = object> = Schema<T> & {
99
+ type ObjectSchema<T extends object = object, Shape extends PublicSchemaShape = PublicSchemaShape> = Schema<T, {
100
+ readonly kind: 'object';
101
+ readonly shape: Shape;
102
+ }> & {
94
103
  readonly [objectSchema]: true;
95
104
  };
96
- type SchemaNodeOf<S extends Schema<unknown>> = S extends {
97
- readonly [schemaNode]: infer N extends DocumentNode;
98
- } ? N : S extends ObjectSchema<object> ? ObjectNode : DocumentNode;
105
+ type SchemaDefinitionOf<S extends Schema<unknown, unknown>> = S extends Schema<unknown, infer Definition> ? Definition : unknown;
106
+ type Optionalized<N extends DocumentNode, Optional extends boolean> = Optional extends true ? OptionalNode<N> : N;
107
+ type FieldNodeFor<TValue, Optional extends boolean> = Optional extends true ? FieldNode<TValue, true> : FieldNode<TValue, false>;
108
+ type TreeNodeFor<TValue, ValueOptional extends boolean> = ValueOptional extends true ? TreeNode<TValue, true> : TreeNode<TValue, false>;
109
+ type SchemaNodeFromDefinition<Definition> = Definition extends {
110
+ readonly kind: 'field';
111
+ readonly value: infer TValue;
112
+ readonly optional: infer Optional extends boolean;
113
+ } ? FieldNodeFor<TValue, Optional> : Definition extends {
114
+ readonly kind: 'object';
115
+ readonly shape: infer Shape extends PublicSchemaShape;
116
+ } ? ObjectNode<NodeShapeOf<Shape>> : Definition extends {
117
+ readonly kind: 'variant';
118
+ readonly tag: infer Tag extends string;
119
+ readonly variants: infer Variants extends PublicVariantShape;
120
+ readonly optional: infer Optional extends boolean;
121
+ } ? Optionalized<VariantNode<Tag, VariantNodeShapeOf<Variants>>, Optional> : Definition extends {
122
+ readonly kind: 'table';
123
+ readonly value: infer Value extends Schema<unknown, unknown>;
124
+ readonly key: infer Key extends string;
125
+ } ? TableNode<Extract<SchemaNodeOf<Value>, EntitySchemaNode>, Key> : Definition extends {
126
+ readonly kind: 'map';
127
+ readonly value: infer Value extends Schema<unknown, unknown>;
128
+ readonly key: infer Key extends string;
129
+ readonly optional: infer Optional extends boolean;
130
+ } ? Optionalized<MapNode<Extract<SchemaNodeOf<Value>, ValueSchemaNode>, Key>, Optional> : Definition extends {
131
+ readonly kind: 'list';
132
+ readonly value: infer TValue;
133
+ readonly optional: infer Optional extends boolean;
134
+ } ? Optionalized<ListNode<TValue>, Optional> : Definition extends {
135
+ readonly kind: 'tree';
136
+ readonly value: infer TValue;
137
+ readonly valueOptional: infer ValueOptional extends boolean;
138
+ readonly optional: infer Optional extends boolean;
139
+ } ? Optionalized<TreeNodeFor<TValue, ValueOptional>, Optional> : DocumentNode;
140
+ type SchemaNodeOf<S extends Schema<unknown, unknown>> = SchemaNodeFromDefinition<SchemaDefinitionOf<S>>;
99
141
  type SchemaObject<T> = { [K in keyof T]: T[K] } & {};
100
142
  /** Infer a document or node value, including optional node presence. */
101
143
  type InferNode<T extends DocumentNode> = T extends {
102
144
  readonly optional: true;
103
145
  } ? NodeValue<T> | undefined : NodeValue<T>;
104
- type Infer<T extends Schema<unknown> | DocumentNode> = T extends Schema<infer TValue> ? TValue : T extends DocumentNode ? InferNode<T> : never;
146
+ type Infer<T extends Schema<unknown, unknown> | DocumentNode> = T extends Schema<infer TValue, unknown> ? TValue : T extends DocumentNode ? InferNode<T> : never;
105
147
  type NodeValue<N> = N extends FieldNode<infer T, infer O> ? O extends true ? ReadonlyValue<T> | undefined : ReadonlyValue<T> : N extends ObjectNode<infer S> ? ShapeValue<S> : N extends VariantNode<infer T, infer V> ? { [K in keyof V & string]: SchemaObject<{ readonly [P in T]: K } & NodeValue<V[K]>> }[keyof V & string] : N extends TableNode<infer V, infer K> ? {
106
148
  readonly ids: readonly K[];
107
149
  readonly byId: Readonly<Record<K, NodeValue<V>>>;
@@ -121,56 +163,141 @@ type DocumentAnchor<K extends string = string> = {
121
163
  } | {
122
164
  readonly after: K;
123
165
  };
124
- type SchemaHandle<N extends DocumentNode> = Schema<InferNode<N>> & {
125
- readonly [schemaNode]: N;
126
- };
127
- type PublicSchemaShape = {
128
- readonly [key: string]: Schema<unknown>;
129
- };
130
166
  type NodeShapeOf<S extends PublicSchemaShape> = { readonly [K in keyof S]: SchemaNodeOf<S[K]> };
131
167
  type PublicOptionalKeys<S extends PublicSchemaShape> = { [K in keyof S]: SchemaNodeOf<S[K]> extends {
132
168
  readonly optional: true;
133
169
  } ? K : never }[keyof S];
134
170
  type PublicRequiredKeys<S extends PublicSchemaShape> = Exclude<keyof S, PublicOptionalKeys<S>>;
135
171
  type PublicShapeValue<S extends PublicSchemaShape> = SchemaObject<{ readonly [K in PublicRequiredKeys<S>]: Infer<S[K]> } & { readonly [K in PublicOptionalKeys<S>]?: Infer<S[K]> }>;
136
- type ObjectSchemaHandle<S extends PublicSchemaShape> = ObjectSchema<PublicShapeValue<S>> & {
137
- readonly [schemaNode]: ObjectNode<NodeShapeOf<S>>;
138
- };
139
- type FieldSchemaHandle<T> = SchemaHandle<FieldNode<T, false>>;
140
- type OptionalFieldSchemaHandle<T> = SchemaHandle<FieldNode<T, true>>;
141
- type OptionalSchemaHandle = Schema<unknown> & {
142
- readonly [schemaNode]: OptionalLeaf;
143
- };
144
- type EntitySchemaHandle = Schema<unknown> & {
145
- readonly [schemaNode]: EntitySchemaNode;
146
- };
147
- type ValueSchemaHandle = Schema<unknown> & {
148
- readonly [schemaNode]: ValueSchemaNode;
149
- };
150
172
  type PublicVariantShape = {
151
173
  readonly [key: string]: ObjectSchema<object>;
152
174
  };
153
175
  type VariantNodeShapeOf<V extends PublicVariantShape> = { readonly [K in keyof V]: Extract<SchemaNodeOf<V[K]>, ObjectNode> };
154
- type VariantSchemaHandle<T extends string, V extends PublicVariantShape> = Schema<{ [K in keyof V & string]: SchemaObject<{ readonly [P in T]: K } & Infer<V[K]>> }[keyof V & string]> & {
155
- readonly [schemaNode]: VariantNode<T, VariantNodeShapeOf<V>>;
156
- };
157
- type OptionalLeaf = FieldNode<unknown, boolean> | VariantNode<string, VariantShape> | MapNode<ValueSchemaNode> | ListNode<unknown> | TreeNode<unknown, false> | TreeNode<unknown, true>;
158
- type OptionalResult<T extends OptionalSchemaHandle> = SchemaHandle<OptionalNode<Extract<SchemaNodeOf<T>, OptionalLeaf>>>;
159
- type EntityNodeOf<V extends EntitySchemaHandle> = Extract<SchemaNodeOf<V>, EntitySchemaNode>;
160
- type ValueNodeOf<V extends ValueSchemaHandle> = Extract<SchemaNodeOf<V>, ValueSchemaNode>;
161
- declare const field: <T>(validator?: Validator<T>) => FieldSchemaHandle<T>;
162
- declare const optional: <T extends OptionalSchemaHandle>(value: T) => OptionalResult<T>;
163
- declare const object: <S extends PublicSchemaShape>(shape: S) => ObjectSchemaHandle<S>;
164
- declare const variant: <T extends string, V extends PublicVariantShape>(tag: T, variants: V) => VariantSchemaHandle<T, V>;
165
- declare const table: <V extends EntitySchemaHandle, K extends string = string>(value: V, options?: {
176
+ type FieldSchema<T, Optional extends boolean = boolean> = Schema<ReadonlyValue<T> | (Optional extends true ? undefined : never), {
177
+ readonly kind: 'field';
178
+ readonly value: T;
179
+ readonly optional: Optional;
180
+ }>;
181
+ type VariantSchema = Schema<unknown, {
182
+ readonly kind: 'variant';
183
+ readonly tag: string;
184
+ readonly variants: PublicVariantShape;
185
+ readonly optional: boolean;
186
+ }>;
187
+ type EntitySchema = ObjectSchema<object> | VariantSchema;
188
+ type ValueSchema = EntitySchema | FieldSchema<unknown>;
189
+ declare const field: <T>(validator?: Validator<T>) => Schema<ReadonlyValue<T>, {
190
+ readonly kind: "field";
191
+ readonly value: T;
192
+ readonly optional: false;
193
+ }>;
194
+ declare function optional<T, Optional extends boolean>(value: Schema<ReadonlyValue<T> | (Optional extends true ? undefined : never), {
195
+ readonly kind: 'field';
196
+ readonly value: T;
197
+ readonly optional: Optional;
198
+ }>): Schema<ReadonlyValue<T> | undefined, {
199
+ readonly kind: 'field';
200
+ readonly value: T;
201
+ readonly optional: true;
202
+ }>;
203
+ declare function optional<TValue, Tag extends string, Variants extends PublicVariantShape, Optional extends boolean>(value: Schema<TValue, {
204
+ readonly kind: 'variant';
205
+ readonly tag: Tag;
206
+ readonly variants: Variants;
207
+ readonly optional: Optional;
208
+ }>): Schema<TValue | undefined, {
209
+ readonly kind: 'variant';
210
+ readonly tag: Tag;
211
+ readonly variants: Variants;
212
+ readonly optional: true;
213
+ }>;
214
+ declare function optional<TValue, Value extends Schema<unknown, unknown>, Key extends string, Optional extends boolean>(value: Schema<TValue, {
215
+ readonly kind: 'map';
216
+ readonly value: Value;
217
+ readonly key: Key;
218
+ readonly optional: Optional;
219
+ }>): Schema<TValue | undefined, {
220
+ readonly kind: 'map';
221
+ readonly value: Value;
222
+ readonly key: Key;
223
+ readonly optional: true;
224
+ }>;
225
+ declare function optional<TValue, TItem, Optional extends boolean>(value: Schema<TValue, {
226
+ readonly kind: 'list';
227
+ readonly value: TItem;
228
+ readonly optional: Optional;
229
+ }>): Schema<TValue | undefined, {
230
+ readonly kind: 'list';
231
+ readonly value: TItem;
232
+ readonly optional: true;
233
+ }>;
234
+ declare function optional<TValue, TNodeValue, ValueOptional extends boolean, Optional extends boolean>(value: Schema<TValue, {
235
+ readonly kind: 'tree';
236
+ readonly value: TNodeValue;
237
+ readonly valueOptional: ValueOptional;
238
+ readonly optional: Optional;
239
+ }>): Schema<TValue | undefined, {
240
+ readonly kind: 'tree';
241
+ readonly value: TNodeValue;
242
+ readonly valueOptional: ValueOptional;
243
+ readonly optional: true;
244
+ }>;
245
+ declare const object: <S extends PublicSchemaShape>(shape: S) => ObjectSchema<PublicShapeValue<S>, S>;
246
+ declare const variant: <T extends string, V extends PublicVariantShape>(tag: T, variants: V) => Schema<{ [K in keyof V & string]: SchemaObject<{ readonly [P in T]: K } & Infer<V[K]>> }[keyof V & string], {
247
+ readonly kind: "variant";
248
+ readonly tag: T;
249
+ readonly variants: V;
250
+ readonly optional: false;
251
+ }>;
252
+ declare const table: <V extends EntitySchema, K extends string = string>(value: V, options?: {
166
253
  readonly key: Validator<K>;
167
- }) => SchemaHandle<TableNode<EntityNodeOf<V>, K>>;
168
- declare const map: <V extends ValueSchemaHandle, K extends string = string>(value: V, options?: {
254
+ }) => Schema<{
255
+ readonly ids: readonly K[];
256
+ readonly byId: Readonly<Record<K, Exclude<Infer<V>, undefined>>>;
257
+ }, {
258
+ readonly kind: "table";
259
+ readonly value: V;
260
+ readonly key: K;
261
+ }>;
262
+ declare const map: <V extends ValueSchema, K extends string = string>(value: V, options?: {
169
263
  readonly key: Validator<K>;
170
- }) => SchemaHandle<MapNode<ValueNodeOf<V>, K>>;
171
- declare const list: <TItem>(value: FieldSchemaHandle<TItem>, config: DocumentListConfig<TItem>) => SchemaHandle<ListNode<TItem>>;
172
- declare function tree<TValue>(value: FieldSchemaHandle<TValue>): SchemaHandle<TreeNode<TValue, false>>;
173
- declare function tree<TValue>(value: OptionalFieldSchemaHandle<TValue>): SchemaHandle<TreeNode<TValue, true>>;
264
+ }) => Schema<Readonly<Record<K, V extends Schema<infer TValue, infer Definition> ? Definition extends {
265
+ readonly kind: "field";
266
+ } ? TValue : Exclude<TValue, undefined> : never>>, {
267
+ readonly kind: "map";
268
+ readonly value: V;
269
+ readonly key: K;
270
+ readonly optional: false;
271
+ }>;
272
+ declare const list: <TItem>(value: Schema<ReadonlyValue<TItem>, {
273
+ readonly kind: "field";
274
+ readonly value: TItem;
275
+ readonly optional: false;
276
+ }>, config: DocumentListConfig<TItem>) => Schema<readonly ReadonlyValue<TItem>[], {
277
+ readonly kind: "list";
278
+ readonly value: TItem;
279
+ readonly optional: false;
280
+ }>;
281
+ declare function tree<TValue>(value: Schema<ReadonlyValue<TValue>, {
282
+ readonly kind: 'field';
283
+ readonly value: TValue;
284
+ readonly optional: false;
285
+ }>): Schema<DocumentTreeValue<TValue, false>, {
286
+ readonly kind: 'tree';
287
+ readonly value: TValue;
288
+ readonly valueOptional: false;
289
+ readonly optional: false;
290
+ }>;
291
+ declare function tree<TValue>(value: Schema<ReadonlyValue<TValue> | undefined, {
292
+ readonly kind: 'field';
293
+ readonly value: TValue;
294
+ readonly optional: true;
295
+ }>): Schema<DocumentTreeValue<TValue, true>, {
296
+ readonly kind: 'tree';
297
+ readonly value: TValue;
298
+ readonly valueOptional: true;
299
+ readonly optional: false;
300
+ }>;
174
301
  //#endregion
175
302
  //#region core/src/schema/path.d.ts
176
303
  declare const pathValue: unique symbol;
@@ -491,4 +618,4 @@ type DocumentRuntime<S extends ObjectSchema<object>> = ReadonlyDocument<S> & {
491
618
  };
492
619
  //#endregion
493
620
  export { table as $, ParseError as A, DocumentListConfig as B, Read as C, ChangeSet as D, Change as E, CollectionPath as F, ReadonlyValue as G, DocumentTreeValue as H, PathValueOf as I, field as J, Schema as K, SchemaPath as L, parse as M, CollectionEntry as N, MemberChange as O, CollectionId as P, optional as Q, DocumentAddress as R, Draft as S, snapshot as T, Infer as U, DocumentTreeNode as V, ObjectSchema as W, map as X, list as Y, object as Z, Unsubscribe as _, DocumentProblem as a, CollectionImpact as b, HistoryState as c, OperationResult as d, tree as et, ReadonlyDocument as f, Readable as g, TransactionResult as h, DocumentDisposedError as i, ParseIssue as j, ValueTransition as k, LocalHistory as l, TransactionRejected as m, DocumentCommit as n, DocumentReentrancyError as o, Synchronous as p, Validator as q, DocumentDiagnostic as r, DocumentRuntime as s, CommitSource as t, variant as tt, ObserverError as u, MutationIssue as v, replace as w, DocumentImpact as x, MutationIssueCode as y, DocumentAnchor as z };
494
- //# sourceMappingURL=contract-Dawq6LKS.d.ts.map
621
+ //# sourceMappingURL=contract-CNR6BS75.d.cts.map