doxum 0.1.11 → 0.1.13

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 (64) hide show
  1. package/README.md +43 -33
  2. package/dist/advanced.cjs +116 -0
  3. package/dist/advanced.cjs.map +1 -0
  4. package/dist/advanced.d.cts +42 -0
  5. package/dist/advanced.d.ts +42 -0
  6. package/dist/advanced.js +115 -0
  7. package/dist/advanced.js.map +1 -0
  8. package/dist/{contract-CeAnEPBA.d.ts → contract-BT53Gg94.d.ts} +5 -4
  9. package/dist/{contract-DtGVSXSK.d.cts → contract-XmKnroJq.d.cts} +5 -4
  10. package/dist/definition-177L4Amk.cjs +898 -0
  11. package/dist/definition-177L4Amk.cjs.map +1 -0
  12. package/dist/definition-BlMeHwdz.d.ts +98 -0
  13. package/dist/definition-DXrKMVs7.js +785 -0
  14. package/dist/definition-DXrKMVs7.js.map +1 -0
  15. package/dist/definition-kxnWUvX9.d.cts +98 -0
  16. package/dist/{driver-xOIkwrB8.cjs → driver-BCyfqxsl.cjs} +1 -1
  17. package/dist/{driver-xOIkwrB8.cjs.map → driver-BCyfqxsl.cjs.map} +1 -1
  18. package/dist/{driver-BlR81Dqg.js → driver-CSnhMjbP.js} +1 -1
  19. package/dist/{driver-BlR81Dqg.js.map → driver-CSnhMjbP.js.map} +1 -1
  20. package/dist/index.cjs +31 -29
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +5 -4
  23. package/dist/index.d.ts +5 -4
  24. package/dist/index.js +7 -6
  25. package/dist/index.js.map +1 -1
  26. package/dist/{integration-VTZ3ICsO.js → integration-Bco8ZB16.js} +7 -3
  27. package/dist/integration-Bco8ZB16.js.map +1 -0
  28. package/dist/integration-CEUn96tx.cjs +52 -0
  29. package/dist/integration-CEUn96tx.cjs.map +1 -0
  30. package/dist/integration.cjs +7 -3
  31. package/dist/integration.d.cts +7 -3
  32. package/dist/integration.d.ts +7 -3
  33. package/dist/integration.js +3 -3
  34. package/dist/local-sync.cjs +1 -1
  35. package/dist/local-sync.d.cts +1 -1
  36. package/dist/local-sync.d.ts +1 -1
  37. package/dist/local-sync.js +1 -1
  38. package/dist/react.cjs +66 -12
  39. package/dist/react.cjs.map +1 -1
  40. package/dist/react.d.cts +8 -6
  41. package/dist/react.d.ts +8 -6
  42. package/dist/react.js +66 -12
  43. package/dist/react.js.map +1 -1
  44. package/dist/store-CDeqZEE3.d.cts +28 -0
  45. package/dist/{store-DHFXfWSz.js → store-CtgvCVFg.js} +585 -917
  46. package/dist/store-CtgvCVFg.js.map +1 -0
  47. package/dist/{store-DU2u-qFH.cjs → store-DcDpDgjk.cjs} +595 -987
  48. package/dist/store-DcDpDgjk.cjs.map +1 -0
  49. package/dist/store-P5dJ7TVe.d.ts +28 -0
  50. package/package.json +6 -1
  51. package/skills/doxum-runtime/SKILL.md +5 -5
  52. package/skills/doxum-runtime/references/guide.en.md +12 -12
  53. package/skills/doxum-runtime/references/guide.zh-CN.md +9 -11
  54. package/skills/doxum-runtime/references/patterns.en.md +12 -17
  55. package/skills/doxum-runtime/references/patterns.zh-CN.md +12 -16
  56. package/skills/doxum-runtime/references/projections.en.md +56 -190
  57. package/skills/doxum-runtime/references/projections.zh-CN.md +49 -171
  58. package/dist/integration-BKgGuodm.cjs +0 -30
  59. package/dist/integration-BKgGuodm.cjs.map +0 -1
  60. package/dist/integration-VTZ3ICsO.js.map +0 -1
  61. package/dist/store-Bs0C0rNd.d.ts +0 -262
  62. package/dist/store-CJuwJl_K.d.cts +0 -262
  63. package/dist/store-DHFXfWSz.js.map +0 -1
  64. package/dist/store-DU2u-qFH.cjs.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,7 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_issue = require("./issue-DhrNdQNg.cjs");
3
- const require_store = require("./store-DU2u-qFH.cjs");
4
- const require_driver = require("./driver-xOIkwrB8.cjs");
3
+ const require_definition = require("./definition-177L4Amk.cjs");
4
+ const require_store = require("./store-DcDpDgjk.cjs");
5
+ const require_driver = require("./driver-BCyfqxsl.cjs");
5
6
  //#region core/src/history.ts
6
7
  const createHistory = (input) => {
7
8
  let undos = [];
@@ -215,8 +216,8 @@ const copyNode = (node) => ({
215
216
  });
216
217
  const transition = (node, key, beforePresent, before, afterPresent, after) => {
217
218
  if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;
218
- if (node.kind !== "field" && beforePresent === afterPresent && require_store.equalValue(node, before, after)) return;
219
- const value = afterPresent ? node.kind === "field" ? after : require_store.copyValue(node, after) : void 0;
219
+ if (node.kind !== "field" && beforePresent === afterPresent && require_definition.equalValue(node, before, after)) return;
220
+ const value = afterPresent ? node.kind === "field" ? after : require_definition.copyValue(node, after) : void 0;
220
221
  require_issue.profile.recorder("transitions");
221
222
  return !beforePresent ? {
222
223
  key,
@@ -289,7 +290,7 @@ const restore = (fact, schema, root, skip = 0) => {
289
290
  const at = skip ? fact.at.slice(skip) : fact.at;
290
291
  if (fact.kind === "member") {
291
292
  const member = fact.member;
292
- const value = member.present ? require_store.copyValue(member.node, member.value) : void 0;
293
+ const value = member.present ? require_definition.copyValue(member.node, member.value) : void 0;
293
294
  if (!at.length) return value;
294
295
  const location = require_issue.resolveLocated(schema, root, at);
295
296
  if (!location) throw new Error("Cannot restore an unresolved member.");
@@ -308,7 +309,7 @@ const restore = (fact, schema, root, skip = 0) => {
308
309
  return root;
309
310
  };
310
311
  const reconstructBefore = (node, current, records, offset) => {
311
- let before = require_store.copyValue(node, current);
312
+ let before = require_definition.copyValue(node, current);
312
313
  for (let i = records.length - 1; i >= 0; i--) if (records[i].kind !== "order") before = restore(records[i], node, before, offset);
313
314
  for (const record of records) if (record.kind === "order") before = restore(record, node, before, offset);
314
315
  return before;
@@ -348,7 +349,7 @@ const sealTree = (fact, state, changes) => {
348
349
  for (const [id, before] of fact.nodes) {
349
350
  const after = Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : void 0;
350
351
  if (!before && !after) continue;
351
- if (before && after && before.parentId === after.parentId && require_issue.equal(before.children, after.children) && Object.hasOwn(before, "value") === Object.hasOwn(after, "value") && require_store.equalValue(node.value, before.value, after.value)) continue;
352
+ if (before && after && before.parentId === after.parentId && require_issue.equal(before.children, after.children) && Object.hasOwn(before, "value") === Object.hasOwn(after, "value") && require_definition.equalValue(node.value, before.value, after.value)) continue;
352
353
  nodes.push(!before ? {
353
354
  id,
354
355
  kind: "added",
@@ -556,7 +557,7 @@ var ChangeRecorder = class {
556
557
  const fact = facts[i];
557
558
  if (fact.kind === "members") for (const member of fact.members?.values() ?? []) {
558
559
  if (!member) continue;
559
- installMember(fact.parent, require_issue.memberKey(fact, member.key), member.present, member.present ? require_store.copyValue(member.node, member.value) : void 0);
560
+ installMember(fact.parent, require_issue.memberKey(fact, member.key), member.present, member.present ? require_definition.copyValue(member.node, member.value) : void 0);
560
561
  }
561
562
  else if (fact.kind === "tree") restore(fact, this.state.schema, this.state.document);
562
563
  }
@@ -564,12 +565,12 @@ var ChangeRecorder = class {
564
565
  }
565
566
  seal() {
566
567
  if (this.resetBefore) {
567
- if (require_store.equalValue(this.state.schema, this.resetBefore.value, this.state.document)) return require_driver.sealChanges([]);
568
+ if (require_definition.equalValue(this.state.schema, this.resetBefore.value, this.state.document)) return require_driver.sealChanges([]);
568
569
  require_issue.profile.recorder("sealed");
569
570
  return require_driver.sealChanges([{
570
571
  kind: "reset",
571
572
  before: this.resetBefore.value,
572
- after: require_store.copyValue(this.state.schema, this.state.document)
573
+ after: require_definition.copyValue(this.state.schema, this.state.document)
573
574
  }]);
574
575
  }
575
576
  const changes = [];
@@ -596,7 +597,7 @@ var MutationSession = class {
596
597
  this.resolvedRoot = state.document;
597
598
  }
598
599
  validate(node, value, at) {
599
- const issue = require_store.checkValue(node, value, at);
600
+ const issue = require_definition.checkValue(node, value, at);
600
601
  if (issue) require_issue.invalidValue(issue);
601
602
  }
602
603
  resolveContainer(at) {
@@ -618,7 +619,7 @@ var MutationSession = class {
618
619
  this.validate(this.state.schema, value, at);
619
620
  if (Object.is(this.state.document, value)) return;
620
621
  this.recorder.reset();
621
- this.state.document = require_store.copyValue(this.state.schema, value);
622
+ this.state.document = require_definition.copyValue(this.state.schema, value);
622
623
  this.invalidate();
623
624
  return;
624
625
  }
@@ -660,12 +661,12 @@ var MutationSession = class {
660
661
  const previous = container.parent[physicalKey];
661
662
  if (existed === present && (!present || Object.is(previous, value))) return false;
662
663
  if (parentNode.kind === "map" || parentNode.kind === "table") {
663
- const issue = require_store.checkKey(parentNode.key, key, []);
664
+ const issue = require_definition.checkKey(parentNode.key, key, []);
664
665
  if (issue) return require_issue.fail(container.at.concat(key, ...issue.address), "invalid-key", issue.message);
665
666
  }
666
667
  if (present) {
667
668
  if (node.kind === "field") {
668
- const issue = require_store.checkValue(node, value, []);
669
+ const issue = require_definition.checkValue(node, value, []);
669
670
  if (issue) return require_issue.invalidValue(issue, container.at.concat(key, ...issue.address));
670
671
  } else this.validate(node, value, container.at.concat(key));
671
672
  if (parentNode.kind === "list" && parentNode.keyOf(value) !== key) return require_issue.fail(container.at.concat(key), "invalid-list-key", "Replacing an item must retain its addressed key.");
@@ -673,7 +674,7 @@ var MutationSession = class {
673
674
  const membershipChanged = entry && existed !== present;
674
675
  if (membershipChanged && (parentNode.kind === "list" || parentNode.kind === "table")) this.recorder.order(container);
675
676
  this.recorder.member(container, key, member, physicalKey);
676
- const next = present ? node.kind === "field" ? value : require_store.copyValue(node, value) : void 0;
677
+ const next = present ? node.kind === "field" ? value : require_definition.copyValue(node, value) : void 0;
677
678
  installMember(container.parent, physicalKey, present, next);
678
679
  if (node.kind !== "field" || membershipChanged) this.invalidate();
679
680
  return membershipChanged;
@@ -743,11 +744,11 @@ function apply(session, changes, direction) {
743
744
  //#region core/src/runtime.ts
744
745
  const createDocument = (input) => {
745
746
  if (input.schema.kind !== "object") throw new TypeError("Document schema must be a root object node.");
746
- const invalid = require_store.checkValue(input.schema, input.initial);
747
- if (invalid) throw new require_store.ParseError(invalid);
747
+ const invalid = require_definition.checkValue(input.schema, input.initial);
748
+ if (invalid) throw new require_definition.ParseError(invalid);
748
749
  const state = {
749
750
  schema: input.schema,
750
- document: require_store.copyValue(input.schema, input.initial),
751
+ document: require_definition.copyValue(input.schema, input.initial),
751
752
  disposed: false
752
753
  };
753
754
  let revision = 0, busy = false;
@@ -845,7 +846,7 @@ const createDocument = (input) => {
845
846
  kind: "update",
846
847
  source
847
848
  }, options?.history ?? true, (session) => {
848
- value = run(require_store.createAccess({
849
+ value = run(require_definition.createAccess({
849
850
  state,
850
851
  session
851
852
  }));
@@ -872,7 +873,7 @@ const createDocument = (input) => {
872
873
  },
873
874
  snapshot: () => {
874
875
  if (state.disposed) throw new require_store.DocumentDisposedError();
875
- return require_store.copyValue(input.schema, state.document);
876
+ return require_definition.copyValue(input.schema, state.document);
876
877
  },
877
878
  subscribe: ((pick, listener) => {
878
879
  if (state.disposed) throw new require_store.DocumentDisposedError();
@@ -914,28 +915,29 @@ const asReadable = (runtime) => {
914
915
  };
915
916
  //#endregion
916
917
  //#region core/src/projection/select.ts
917
- const select = (runtime, selector) => require_store.readWith(runtime, selector);
918
+ const read = (runtime, selector) => require_store.readWith(runtime, selector);
918
919
  //#endregion
919
920
  exports.DocumentDisposedError = require_store.DocumentDisposedError;
920
921
  exports.DocumentReentrancyError = require_store.DocumentReentrancyError;
921
- exports.ParseError = require_store.ParseError;
922
+ exports.ParseError = require_definition.ParseError;
922
923
  exports.ProjectionDisposedError = require_store.ProjectionDisposedError;
923
924
  exports.ProjectionError = require_store.ProjectionError;
924
925
  exports.TransactionRejected = require_store.TransactionRejected;
925
926
  exports.asReadable = asReadable;
926
927
  exports.createDocument = createDocument;
927
- exports.createProjectionStore = require_store.createProjectionStore;
928
+ exports.createProjectionRuntime = require_store.createProjectionRuntime;
929
+ exports.derive = require_definition.derive;
928
930
  exports.field = require_store.field;
929
- exports.input = require_store.input;
931
+ exports.input = require_definition.input;
930
932
  exports.list = require_store.list;
931
933
  exports.map = require_store.map;
932
934
  exports.object = require_store.object;
935
+ exports.observe = require_definition.observe;
933
936
  exports.optional = require_store.optional;
934
- exports.parse = require_store.parse;
935
- exports.project = require_store.project;
936
- exports.replace = require_store.replace;
937
- exports.select = select;
938
- exports.snapshot = require_store.snapshot;
937
+ exports.parse = require_definition.parse;
938
+ exports.read = read;
939
+ exports.replace = require_definition.replace;
940
+ exports.snapshot = require_definition.snapshot;
939
941
  exports.table = require_store.table;
940
942
  exports.tree = require_store.tree;
941
943
  exports.variant = require_store.variant;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["DocumentDisposedError","equalValue","copyValue","compiledShape","resolveLocated","resolveValue","memberKey","AddressIndex","contains","sealChanges","createAddressResolver","checkValue","fail","resolveContainer","resolveTreeContainer","resolveValue","copyValue","memberKey","checkKey","invalidValue","fail","checkValue","ParseError","copyValue","DocumentDisposedError","accessOf","DocumentReentrancyError","createImpact","notify","MutationRejected","TransactionRejected","resolveAddress","read","createAccess","decodeChanges","subscribeRoot","subscribeTargets","compilePath","createNotification","accessOf","readWith"],"sources":["../core/src/history.ts","../core/src/mutation/state.ts","../core/src/mutation/recorder.ts","../core/src/mutation/session.ts","../core/src/mutation/operations/replay.ts","../core/src/runtime.ts","../core/src/runtime/readable.ts","../core/src/projection/select.ts"],"sourcesContent":["import type { ChangeSet, ChangeDirection } from './changes';\nimport type {\n HistoryState,\n LocalHistory,\n ObserverError,\n OperationResult,\n} from './runtime/contract';\nimport { DocumentDisposedError } from './runtime/contract';\n\ntype Entry = { readonly batches: ChangeSet[] };\ntype Group = { entry?: Entry; readonly undos: Entry[]; readonly redos: Entry[] };\n\nexport const createHistory = <TCommit>(input: {\n readonly capacity: number;\n readonly apply: (\n changes: readonly ChangeSet[],\n direction: ChangeDirection\n ) => OperationResult<TCommit>;\n readonly revision: () => number;\n readonly assertIdle: () => void;\n readonly notify: (run: () => readonly ObserverError[]) => readonly ObserverError[];\n}) => {\n let undos: Entry[] = [];\n let redos: Entry[] = [];\n const listeners = new Set<() => void>();\n let state: HistoryState = Object.freeze({ undoDepth: 0, redoDepth: 0 });\n let revision = 0;\n let pending = false;\n let disposed = false;\n let group: Group | undefined;\n const unchanged = (): OperationResult<TCommit> => ({\n status: 'unchanged',\n revision: input.revision(),\n });\n const publish = () => {\n if (state.undoDepth === undos.length && state.redoDepth === redos.length) return;\n state = Object.freeze({ undoDepth: undos.length, redoDepth: redos.length });\n revision++;\n pending = true;\n };\n const flush = (): readonly ObserverError[] => {\n if (!pending) return [];\n pending = false;\n const errors: ObserverError[] = [];\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue;\n try {\n listener();\n } catch (error) {\n errors.push({ phase: 'listener', error });\n }\n }\n return errors;\n };\n const clear = () => {\n group = undefined;\n undos.length = redos.length = 0;\n publish();\n };\n const travel = (direction: 'undo' | 'redo' | 'cancel'): OperationResult<TCommit> => {\n input.assertIdle();\n const from = direction === 'redo' ? redos : undos;\n const to = direction === 'redo' ? undos : redos;\n const previousUndos = undos;\n const previousRedos = redos;\n const entry = direction === 'cancel' ? from.at(-1) : from.pop();\n if (!entry) return unchanged();\n if (direction === 'cancel') {\n if (!group || group.entry !== entry)\n throw new Error('History group no longer owns its entry.');\n undos = group.undos;\n redos = group.redos;\n } else to.push(entry);\n let committed = false;\n try {\n const changes = direction === 'redo' ? entry.batches : entry.batches.slice().reverse();\n const result = input.apply(changes, direction === 'redo' ? 'forward' : 'backward');\n committed = result.status !== 'rejected';\n if (committed && direction === 'cancel') group = undefined;\n if (result.status === 'unchanged') {\n publish();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n }\n return result;\n } finally {\n if (!committed) {\n if (direction === 'cancel') {\n undos = previousUndos;\n redos = previousRedos;\n } else {\n to.pop();\n from.push(entry);\n }\n }\n }\n };\n const api: LocalHistory<TCommit> = {\n current: () => state,\n revision: () => revision,\n subscribe: listener => {\n if (disposed) throw new DocumentDisposedError();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n undo: () => {\n input.assertIdle();\n group = undefined;\n return travel('undo');\n },\n redo: () => {\n input.assertIdle();\n group = undefined;\n return travel('redo');\n },\n clear: () => {\n input.assertIdle();\n clear();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n },\n group: () => {\n input.assertIdle();\n if (group) throw new Error('A history group is already active.');\n if (input.capacity <= 0) throw new Error('History is disabled.');\n const scope: Group = { undos: undos.slice(), redos: redos.slice() };\n group = scope;\n return Object.freeze({\n end: () => {\n input.assertIdle();\n if (group === scope) group = undefined;\n },\n cancel: () => {\n input.assertIdle();\n if (group !== scope) return unchanged();\n if (!scope.entry) {\n group = undefined;\n return unchanged();\n }\n const result = travel('cancel');\n if (result.status !== 'rejected') group = undefined;\n return result;\n },\n });\n },\n };\n return {\n api,\n record: (batch: ChangeSet) => {\n if (input.capacity <= 0) return;\n if (group?.entry) group.entry.batches.push(batch);\n else {\n const entry: Entry = { batches: [batch] };\n undos.push(entry);\n if (group) group.entry = entry;\n if (undos.length > input.capacity) undos.shift();\n }\n redos.length = 0;\n publish();\n },\n publish,\n flush,\n endGroup: () => {\n group = undefined;\n },\n invalidate: clear,\n dispose: () => {\n disposed = true;\n listeners.clear();\n clear();\n pending = false;\n },\n };\n};\n","import type { DocumentNode, ObjectNode } from '../schema';\nimport * as anchor from './anchor';\n\nexport type CanonicalState = { schema: ObjectNode; document: unknown };\n\n/** Install validated values, or captured before values during rollback. */\nexport const installMember = (\n parent: Record<string, unknown> | unknown[],\n key: string | number,\n present: boolean,\n value: unknown\n): void => {\n if (Array.isArray(parent)) {\n const index = Number(key);\n if (present) {\n if (index < 0) anchor.insert(parent, parent.length, value);\n else parent[index] = value;\n } else if (index >= 0) anchor.remove(parent, index);\n } else if (!present) delete parent[key];\n else if (Object.hasOwn(parent, key)) parent[key] = value;\n else\n Object.defineProperty(parent, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: true,\n });\n};\n\nexport const orderOf = (node: DocumentNode, value: unknown): string[] => {\n if (node.kind === 'list') return (value as unknown[]).map(node.keyOf);\n if (node.kind === 'table') return [...(value as { ids: string[] }).ids];\n throw new Error('Order requires a table or list.');\n};\n\nexport const installOrder = (\n node: DocumentNode,\n value: unknown,\n order: readonly string[]\n): void => {\n if (node.kind === 'list') anchor.install(value as unknown[], node.keyOf, order);\n else if (node.kind === 'table') (value as { ids: string[] }).ids = [...order];\n else throw new Error('Order requires a table or list.');\n};\n","import type { Change, ChangeSet, MemberChange } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport {\n AddressIndex,\n contains,\n resolveValue,\n resolveLocated,\n memberKey,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n type CompiledMember,\n compiledShape,\n type FixedLayout,\n} from '../address';\nimport * as anchor from './anchor';\nimport { copyValue, equalValue } from '../schema-value';\nimport type { MutableTree, MutableTreeNode } from './tree';\nimport { profile } from '../profile';\nimport { sealChanges } from './changes';\nimport { installMember, installOrder, orderOf, type CanonicalState } from './state';\ntype MemberFact = { key: string; node: DocumentNode; present: boolean; value: unknown };\ntype MemberGroup = {\n kind: 'members';\n at: DocumentAddress;\n node: DocumentNode;\n parent: Record<string, unknown> | unknown[];\n value: unknown;\n order?: readonly string[];\n} & (\n | { layout: 'fixed'; definitions: FixedLayout['members']; members: (MemberFact | undefined)[] }\n | { layout: 'dynamic'; members: Map<string, MemberFact> | undefined }\n);\ntype TreeFact = {\n kind: 'tree';\n at: DocumentAddress;\n before: string | null;\n nodes: Map<string, MutableTreeNode | undefined>;\n};\ntype Fact = MemberGroup | TreeFact;\ntype RestoreFact =\n | { kind: 'order'; at: DocumentAddress; group: MemberGroup }\n | TreeFact\n | { kind: 'member'; at: DocumentAddress; group: MemberGroup; member: MemberFact };\nconst firstMember = (group: MemberGroup, key: string): MemberFact | undefined => {\n if (group.layout === 'dynamic') return group.members?.get(key);\n const member = group.definitions.get(key);\n return member && group.members[member.slot];\n};\n\nconst forgetMember = (group: MemberGroup, key: string): void => {\n if (group.layout === 'dynamic') group.members?.delete(key);\n else {\n const definition = group.definitions.get(key);\n if (definition) group.members[definition.slot] = undefined;\n }\n};\nconst emptyGroup = (group: MemberGroup): boolean =>\n !group.order && (group.layout === 'fixed' ? !group.members.some(Boolean) : !group.members?.size);\n\nconst copyNode = (node: MutableTreeNode): MutableTreeNode => ({\n ...node,\n children: [...node.children],\n});\nconst transition = (\n node: DocumentNode,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): MemberChange | undefined => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (node.kind !== 'field' && beforePresent === afterPresent && equalValue(node, before, after))\n return;\n const value = afterPresent ? (node.kind === 'field' ? after : copyValue(node, after)) : undefined;\n profile.recorder('transitions');\n return !beforePresent\n ? { key, kind: 'added', after: value }\n : !afterPresent\n ? { key, kind: 'removed', before }\n : { key, kind: 'updated', before, after: value };\n};\n\nconst publishMembers = (\n changes: Change[],\n at: DocumentAddress,\n members: MemberChange[],\n order?: { before: readonly string[]; after: readonly string[] }\n): void => {\n if (!members.length && !order) return;\n for (let i = 1; i < members.length; i++)\n if (members[i - 1].key > members[i].key) {\n members.sort((a, b) => lexical(a.key, b.key));\n break;\n }\n changes.push(order ? { kind: 'members', at, members, order } : { kind: 'members', at, members });\n};\n\n/** Diff only the captured subtree; this algorithm has no recorder or session state. */\nconst diffMember = (\n changes: Change[],\n members: MemberChange[],\n node: DocumentNode,\n at: DocumentAddress,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): void => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (beforePresent && afterPresent && before !== undefined && after !== undefined) {\n const sameShape =\n node.kind === 'object' ||\n (node.kind === 'variant' &&\n (before as Record<string, unknown>)[node.tag] ===\n (after as Record<string, unknown>)[node.tag]);\n if (sameShape) {\n const left = before as Record<string, unknown>,\n right = after as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const [child, definition] of compiledShape(node, before)!.members)\n diffMember(\n changes,\n children,\n definition.node,\n childAt,\n child,\n Object.hasOwn(left, child),\n left[child],\n Object.hasOwn(right, child),\n right[child]\n );\n publishMembers(changes, childAt, children);\n return;\n }\n if (node.kind === 'map' || node.kind === 'table') {\n const a = before as Record<string, unknown>,\n b = after as typeof a;\n const left = (node.kind === 'table' ? a.byId : a) as Record<string, unknown>;\n const right = (node.kind === 'table' ? b.byId : b) as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const id of Object.keys(left))\n diffMember(\n changes,\n children,\n node.value,\n childAt,\n id,\n true,\n left[id],\n Object.hasOwn(right, id),\n right[id]\n );\n for (const id of Object.keys(right))\n if (!Object.hasOwn(left, id))\n diffMember(changes, children, node.value, childAt, id, false, undefined, true, right[id]);\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (node.kind === 'table' && !anchor.equal(a.ids as string[], b.ids as string[])) {\n profile.recorder('publishedOrderItems', (b.ids as string[]).length);\n order = { before: a.ids as string[], after: [...(b.ids as string[])] };\n }\n publishMembers(changes, childAt, children, order);\n return;\n }\n }\n const member = transition(node, key, beforePresent, before, afterPresent, after);\n if (member) members.push(member);\n};\nconst restore = (fact: RestoreFact, schema: DocumentNode, root: unknown, skip = 0): unknown => {\n const at = skip ? fact.at.slice(skip) : fact.at;\n if (fact.kind === 'member') {\n const member = fact.member;\n const value = member.present ? copyValue(member.node, member.value) : undefined;\n if (!at.length) return value;\n const location = resolveLocated(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved member.');\n installMember(location.parent, location.key, member.present, value);\n return root;\n }\n const location = resolveValue(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved subtree.');\n if (fact.kind === 'order') installOrder(location.node, location.value, fact.group.order!);\n else {\n const tree = location.value as MutableTree;\n if (fact.before === null) delete tree.rootId;\n else tree.rootId = fact.before;\n for (const [id, node] of fact.nodes)\n installMember(tree.nodes, id, node !== undefined, node && copyNode(node));\n }\n return root;\n};\n\nconst reconstructBefore = (\n node: DocumentNode,\n current: unknown,\n records: readonly RestoreFact[],\n offset: number\n): unknown => {\n let before = copyValue(node, current);\n for (let i = records.length - 1; i >= 0; i--)\n if (records[i].kind !== 'order') before = restore(records[i], node, before, offset);\n for (const record of records)\n if (record.kind === 'order') before = restore(record, node, before, offset);\n return before;\n};\n\nconst sealMembers = (fact: MemberGroup, changes: Change[]): void => {\n const members: MemberChange[] = [];\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const key = memberKey(fact, member.key);\n const present = Object.hasOwn(fact.parent, key);\n const value = (fact.parent as Record<string | number, unknown>)[key];\n if (member.node.kind === 'field') {\n const change = transition(\n member.node,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n if (change) members.push(change);\n } else\n diffMember(\n changes,\n members,\n member.node,\n fact.at,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n }\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (fact.order) {\n const current =\n fact.node.kind === 'list'\n ? anchor.keys(fact.value as unknown[], fact.node.keyOf)\n : (fact.value as { ids: string[] }).ids;\n if (!anchor.equal(fact.order, current)) {\n const after = orderOf(fact.node, fact.value);\n profile.recorder('publishedOrderItems', after.length);\n order = { before: fact.order, after };\n }\n }\n publishMembers(changes, fact.at, members, order);\n};\n\nconst sealTree = (fact: TreeFact, state: CanonicalState, changes: Change[]): void => {\n const location = resolveValue(state.schema, state.document, fact.at);\n const tree = location?.value as MutableTree;\n const node = location?.node;\n if (node?.kind !== 'tree') throw new Error('Tree schema disappeared before sealing.');\n const nodes: Extract<Change, { kind: 'tree' }>['nodes'][number][] = [];\n for (const [id, before] of fact.nodes) {\n const after = Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : undefined;\n if (!before && !after) continue;\n if (\n before &&\n after &&\n before.parentId === after.parentId &&\n anchor.equal(before.children, after.children) &&\n Object.hasOwn(before, 'value') === Object.hasOwn(after, 'value') &&\n equalValue(node.value, before.value, after.value)\n )\n continue;\n nodes.push(\n !before\n ? { id, kind: 'added', after: copyNode(after!) }\n : !after\n ? { id, kind: 'removed', before }\n : { id, kind: 'updated', before, after: copyNode(after) }\n );\n }\n const after = tree.rootId ?? null;\n if (nodes.length || fact.before !== after)\n changes.push({\n kind: 'tree',\n at: fact.at,\n before: fact.before,\n after,\n nodes: nodes.sort((a, b) => lexical(a.id, b.id)),\n });\n};\n\n/** One first-touch record per owning container, never a per-write operation log. */\nexport class ChangeRecorder {\n private readonly facts = new Set<Fact>();\n private groups = new WeakMap<object, MemberGroup>();\n private index?: AddressIndex<Fact>;\n private indexedGroups = false;\n private resetBefore?: { value: unknown };\n constructor(private readonly state: CanonicalState) {}\n private indexGroups(): AddressIndex<Fact> {\n const index = (this.index ??= new AddressIndex());\n if (!this.indexedGroups) {\n this.indexedGroups = true;\n for (const fact of this.facts) {\n if (fact.kind === 'members') {\n index.add(fact.at, fact);\n profile.recorder('indexedGroups');\n }\n }\n }\n return index;\n }\n private covered(at: DocumentAddress): boolean {\n return (\n this.resetBefore !== undefined ||\n (this.indexedGroups &&\n this.index!.someAncestor(\n at,\n fact =>\n fact.kind === 'members' &&\n fact.at.length < at.length &&\n firstMember(fact, at[fact.at.length]) !== undefined\n ))\n );\n }\n private absorb(\n at: DocumentAddress,\n node: DocumentNode,\n value: unknown,\n present: boolean\n ): unknown {\n const index = this.indexGroups();\n const children: RestoreFact[] = [];\n index.query(fact => {\n if (fact.kind === 'members') {\n // An ancestor group can contribute only its one directly addressed member.\n if (fact.at.length < at.length) {\n if (fact.at.length + 1 === at.length) {\n const member = firstMember(fact, at[fact.at.length]);\n if (member) children.push({ kind: 'member', at, group: fact, member });\n }\n return;\n }\n if (fact.order && contains(at, fact.at))\n children.push({ kind: 'order', at: fact.at, group: fact });\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const memberAt = fact.at.concat(member.key);\n if (contains(at, memberAt))\n children.push({ kind: 'member', at: memberAt, group: fact, member });\n }\n } else if (contains(at, fact.at)) children.push(fact);\n })(at);\n if (present) value = reconstructBefore(node, value, children, at.length);\n this.releaseCovered(children);\n return value;\n }\n private releaseCovered(children: readonly RestoreFact[]): void {\n let changedGroups: Set<MemberGroup> | undefined;\n for (const child of children) {\n profile.recorder('absorbed');\n if (child.kind === 'member') {\n const { group, member } = child;\n forgetMember(group, member.key);\n (changedGroups ??= new Set()).add(group);\n } else if (child.kind === 'order') {\n child.group.order = undefined;\n (changedGroups ??= new Set()).add(child.group);\n } else {\n this.unregister(child);\n }\n }\n for (const group of changedGroups ?? []) {\n if (emptyGroup(group)) {\n this.unregister(group);\n }\n }\n }\n private register(fact: Fact): void {\n this.facts.add(fact);\n if (fact.kind === 'members') {\n this.groups.set(fact.parent, fact);\n profile.recorder('groups');\n if (!this.indexedGroups) return;\n profile.recorder('indexedGroups');\n }\n (this.index ??= new AddressIndex()).add(fact.at, fact);\n }\n private unregister(fact: Fact): void {\n this.facts.delete(fact);\n this.index?.delete(fact.at, fact);\n if (fact.kind === 'members') this.groups.delete(fact.parent);\n }\n member(\n container: ResolvedContainer,\n key: string,\n definition: CompiledMember,\n physicalKey: string | number\n ): void {\n if (this.resetBefore) return;\n const { node } = definition;\n let group = this.groups.get(container.parent);\n if (group?.layout === 'dynamic' && group.members?.has(key)) return;\n if (group?.layout === 'fixed' && definition.kind === 'fixed' && group.members[definition.slot])\n return;\n const at = this.indexedGroups || node.kind !== 'field' ? container.at.concat(key) : undefined;\n if (at && this.covered(at)) return;\n const present = Object.hasOwn(container.parent, physicalKey);\n let value = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (node.kind !== 'field') value = this.absorb(at!, node, value, present);\n if (!group || !this.facts.has(group)) {\n group = this.createGroup(container);\n }\n const member: MemberFact = { key, node, present, value };\n if (group.layout === 'dynamic') (group.members ??= new Map()).set(key, member);\n else if (definition.kind === 'fixed') group.members[definition.slot] = member;\n else throw new Error('A fixed member group requires a fixed schema member.');\n profile.recorder('facts');\n }\n reset(): void {\n if (this.resetBefore) return;\n const value = this.absorb([], this.state.schema, this.state.document, true);\n this.resetBefore = { value };\n this.groups = new WeakMap();\n profile.recorder('facts');\n }\n private createGroup(container: ResolvedContainer): MemberGroup {\n const group: MemberGroup =\n container.layout.kind === 'fixed'\n ? {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'fixed',\n definitions: container.layout.members,\n members: new Array<MemberFact | undefined>(container.layout.members.size),\n }\n : {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'dynamic',\n members: undefined,\n };\n this.register(group);\n return group;\n }\n order(container: ResolvedContainer): void {\n profile.recorder('orderCaptures');\n let group = this.groups.get(container.parent);\n if (group?.order || this.covered(container.at)) return;\n group ??= this.createGroup(container);\n group.order = orderOf(container.node, container.value);\n profile.recorder('orderSnapshots');\n profile.recorder('orderItems', group.order.length);\n }\n tree(container: ResolvedTreeContainer, id?: string): void {\n const { at, value: tree } = container;\n if (this.covered(at)) return;\n const index = (this.index ??= new AddressIndex());\n let fact: TreeFact | undefined;\n for (const item of index.exact(at) ?? []) if (item.kind === 'tree') fact = item;\n if (!fact) {\n fact = { kind: 'tree', at, before: tree.rootId ?? null, nodes: new Map() };\n this.register(fact);\n }\n if (id !== undefined && !fact.nodes.has(id)) {\n profile.recorder('treeNodes');\n fact.nodes.set(id, Object.hasOwn(tree.nodes, id) ? copyNode(tree.nodes[id]) : undefined);\n }\n }\n rollback(): void {\n if (this.resetBefore) {\n this.state.document = this.resetBefore.value;\n return;\n }\n const facts = [...this.facts];\n for (let i = facts.length - 1; i >= 0; i--) {\n const fact = facts[i];\n if (fact.kind === 'members') {\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n installMember(\n fact.parent,\n memberKey(fact, member.key),\n member.present,\n member.present ? copyValue(member.node, member.value) : undefined\n );\n }\n } else if (fact.kind === 'tree') restore(fact, this.state.schema, this.state.document);\n }\n for (const fact of facts)\n if (fact.kind === 'members' && fact.order) installOrder(fact.node, fact.value, fact.order);\n }\n seal(): ChangeSet {\n if (this.resetBefore) {\n if (equalValue(this.state.schema, this.resetBefore.value, this.state.document))\n return sealChanges([]);\n profile.recorder('sealed');\n return sealChanges([\n {\n kind: 'reset',\n before: this.resetBefore.value,\n after: copyValue(this.state.schema, this.state.document),\n },\n ]);\n }\n const changes: Change[] = [];\n for (const fact of this.facts) {\n if (fact.kind === 'members') sealMembers(fact, changes);\n else sealTree(fact, this.state, changes);\n }\n const result = sealChanges(changes);\n profile.recorder('sealed', result.changes.length);\n return result;\n }\n}\nconst lexical = (a: string, b: string): number => (a < b ? -1 : a === b ? 0 : 1);\n","import type { ChangeSet } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport {\n createAddressResolver,\n resolveContainer,\n resolveTreeContainer,\n resolveValue,\n memberKey,\n type CompiledMember,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n} from '../address';\nimport { checkKey, checkValue, copyValue } from '../schema-value';\nimport { ChangeRecorder } from './recorder';\nimport { installMember, type CanonicalState } from './state';\nimport { fail, invalidValue } from './issue';\n\nexport class MutationSession {\n readonly identity = {};\n generation = 0;\n readonly recorder: ChangeRecorder;\n private resolver;\n private resolvedRoot: unknown;\n constructor(readonly state: CanonicalState) {\n this.recorder = new ChangeRecorder(state);\n this.resolver = createAddressResolver(state.schema, state.document);\n this.resolvedRoot = state.document;\n }\n validate(node: DocumentNode, value: unknown, at: DocumentAddress): void {\n const issue = checkValue(node, value, at);\n if (issue) invalidValue(issue);\n }\n resolveContainer(at: DocumentAddress): ResolvedContainer {\n return (\n this.resolver.container(this.identity, this.generation, at) ??\n fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n /** Bind access-resolved canonical facts without walking the address again. */\n bind(at: DocumentAddress, node: DocumentNode | undefined, value: unknown): ResolvedContainer {\n return (\n resolveContainer(this.identity, this.generation, at, node, value) ??\n fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n bindTree(\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n ): ResolvedTreeContainer {\n return (\n resolveTreeContainer(this.identity, this.generation, at, node, value) ??\n fail(at, 'invalid-tree', 'Expected a tree.')\n );\n }\n resolveTree(at: DocumentAddress): ResolvedTreeContainer {\n const location = resolveValue(this.state.schema, this.state.document, at);\n return this.bindTree(at, location?.node, location?.value);\n }\n replace(at: DocumentAddress, value: unknown): void {\n if (!at.length) {\n this.validate(this.state.schema, value, at);\n if (Object.is(this.state.document, value)) return;\n this.recorder.reset();\n this.state.document = copyValue(this.state.schema, value);\n this.invalidate();\n return;\n }\n this.writeMember(this.resolveContainer(at.slice(0, -1)), at[at.length - 1], value, 'set');\n }\n assignMember(container: ResolvedContainer, key: string, value: unknown): void {\n container = this.refresh(container);\n const member = this.definition(container, key);\n if (\n container.layout.kind === 'fixed' &&\n member.node.kind !== 'field' &&\n member.node.kind !== 'variant' &&\n !member.node.optional\n )\n return fail(\n container.at.concat(key),\n 'invalid-value',\n 'Replace fields, variants, or collection entries; edit object members individually.'\n );\n this.writeLocatedMember(container, key, member, memberKey(container, key), value, 'set');\n }\n removeMember(container: ResolvedContainer, key: string): void {\n this.writeMember(this.refresh(container), key, undefined, 'remove');\n }\n private refresh(container: ResolvedContainer): ResolvedContainer {\n if (container.owner !== this.identity)\n return fail(\n container.at,\n 'invalid-address',\n 'Container belongs to another mutation session.'\n );\n return container.generation === this.generation\n ? container\n : this.resolveContainer(container.at);\n }\n definition(container: ResolvedContainer, key: string): CompiledMember {\n const layout = container.layout;\n const member = layout.kind === 'dynamic' ? layout.entry : layout.members.get(key);\n if (!member)\n return fail(container.at.concat(key), 'invalid-address', 'Address does not exist.');\n return member;\n }\n /** Consume a current command-local container; bulk writes retain its storage. */\n writeMember(\n container: ResolvedContainer,\n key: string,\n value: unknown,\n operation: 'set' | 'remove',\n physicalKey = memberKey(container, key)\n ): boolean {\n const member = this.definition(container, key);\n return this.writeLocatedMember(container, key, member, physicalKey, value, operation);\n }\n /** Location and definition are resolved once by the calling operation. */\n private writeLocatedMember(\n container: ResolvedContainer,\n key: string,\n member: CompiledMember,\n physicalKey: string | number,\n value: unknown,\n operation: 'set' | 'remove'\n ): boolean {\n const parentNode = container.node;\n const node = member.node;\n const present = operation === 'set';\n if (parentNode.kind === 'variant' && parentNode.tag === key)\n return fail(\n container.at.concat(key),\n 'invalid-value',\n 'Variant discriminants are read-only.'\n );\n const entry = container.layout.kind === 'dynamic';\n if (!present && !node.optional && !entry)\n return fail(\n container.at.concat(key),\n 'required-field',\n 'A required value cannot be removed.'\n );\n const existed = Object.hasOwn(container.parent, physicalKey);\n const previous = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (existed === present && (!present || Object.is(previous, value))) return false;\n if (parentNode.kind === 'map' || parentNode.kind === 'table') {\n const issue = checkKey(parentNode.key, key, []);\n if (issue)\n return fail(container.at.concat(key, ...issue.address), 'invalid-key', issue.message);\n }\n if (present) {\n if (node.kind === 'field') {\n const issue = checkValue(node, value, []);\n if (issue) return invalidValue(issue, container.at.concat(key, ...issue.address));\n } else this.validate(node, value, container.at.concat(key));\n if (parentNode.kind === 'list' && parentNode.keyOf(value) !== key)\n return fail(\n container.at.concat(key),\n 'invalid-list-key',\n 'Replacing an item must retain its addressed key.'\n );\n }\n const membershipChanged = entry && existed !== present;\n if (membershipChanged && (parentNode.kind === 'list' || parentNode.kind === 'table'))\n this.recorder.order(container);\n this.recorder.member(container, key, member, physicalKey);\n const next = present ? (node.kind === 'field' ? value : copyValue(node, value)) : undefined;\n installMember(container.parent, physicalKey, present, next);\n if (node.kind !== 'field' || membershipChanged) this.invalidate();\n return membershipChanged;\n }\n invalidate(): void {\n this.generation++;\n if (this.resolvedRoot !== this.state.document) {\n this.resolvedRoot = this.state.document;\n this.resolver = createAddressResolver(this.state.schema, this.state.document);\n } else this.resolver.invalidate();\n }\n finish(): ChangeSet {\n return this.recorder.seal();\n }\n rollback(): void {\n this.recorder.rollback();\n this.invalidate();\n }\n}\n","import type { ChangeDirection, ChangeSet } from '../../changes';\nimport type { MutationSession } from '../session';\nimport { installOrder, installMember, orderOf } from '../state';\nimport * as anchor from '../anchor';\nimport { fail } from '../issue';\nexport function apply(\n session: MutationSession,\n changes: ChangeSet,\n direction: ChangeDirection\n): void {\n const side = direction === 'forward' ? 'after' : 'before';\n for (const change of changes.changes) {\n if (change.kind === 'reset') {\n session.replace([], change[side]);\n } else if (change.kind === 'members') {\n const container = session.resolveContainer(change.at);\n const { node, value: current } = container;\n if (change.order) {\n if (node.kind !== 'table' && node.kind !== 'list')\n return fail(change.at, 'invalid-changes', 'Order requires an ordered container.');\n session.recorder.order(container);\n }\n let membershipChanged = false;\n for (const member of change.members) {\n const present = side === 'after' ? member.kind !== 'removed' : member.kind !== 'added';\n const value =\n side === 'after'\n ? member.kind !== 'removed'\n ? member.after\n : undefined\n : member.kind !== 'added'\n ? member.before\n : undefined;\n membershipChanged =\n session.writeMember(container, member.key, value, present ? 'set' : 'remove') ||\n membershipChanged;\n }\n if (change.order) {\n const keys = node.kind === 'table' ? Object.keys(container.parent) : orderOf(node, current);\n if (!anchor.matches(change.order[side], keys))\n return fail(\n change.at,\n 'invalid-changes',\n 'Order must contain exactly the resulting keys.'\n );\n installOrder(node, current, change.order[side]);\n session.invalidate();\n } else if (membershipChanged && node.kind === 'table') {\n const ids = (current as { ids: string[] }).ids;\n if (!anchor.matches(ids, Object.keys(container.parent)))\n return fail(\n change.at,\n 'invalid-changes',\n 'Table membership changes require a matching order.'\n );\n }\n } else {\n const container = session.resolveTree(change.at);\n const { value: current, node } = container;\n session.recorder.tree(container);\n for (const item of change.nodes) session.recorder.tree(container, item.id);\n const root = change[side];\n if (root === null) delete current.rootId;\n else current.rootId = root;\n for (const item of change.nodes) {\n const next =\n side === 'after'\n ? item.kind !== 'removed'\n ? item.after\n : undefined\n : item.kind !== 'added'\n ? item.before\n : undefined;\n installMember(\n current.nodes,\n item.id,\n next !== undefined,\n next && { ...next, children: [...next.children] }\n );\n }\n session.validate(node, current, change.at);\n session.invalidate();\n }\n }\n}\n","import type { ObjectNode, Infer, PathPick } from './schema';\nimport { compilePath } from './schema';\nimport { contains, debugKey, overlaps, read, resolveAddress } from './address';\nimport { createImpact } from './impact';\nimport { createHistory } from './history';\nimport { createAccess, type Draft } from './access/scope';\nimport { MutationSession } from './mutation/session';\nimport * as replay from './mutation/operations/replay';\nimport type { RuntimeWriteIntent } from './runtime/driver';\nimport { decodeChanges } from './mutation/changes';\nimport { MutationRejected, fail } from './mutation/issue';\nimport type { ChangeSet } from './changes';\nimport { checkValue, copyValue, ParseError } from './schema-value';\nimport {\n DocumentDisposedError,\n DocumentReentrancyError,\n TransactionRejected,\n} from './runtime/contract';\nimport type {\n CommitListener,\n CommitSource,\n DocumentCommit,\n DocumentRuntime,\n OperationResult,\n TransactionResult,\n} from './runtime/contract';\nimport { bindRuntimeAccess, accessOf } from './runtime/access';\nimport { assertRuntimeWritable, bindRuntimeDriver, disposeRuntimeDriver } from './runtime/driver';\nimport {\n bindDocumentReadable,\n createNotification,\n disposeNotification,\n notify,\n subscribeRoot,\n subscribeTargets,\n type RuntimeNotification,\n} from './runtime/notification';\n\nexport const createDocument = <S extends ObjectNode>(input: {\n readonly schema: S;\n readonly initial: Infer<S>;\n readonly history?: { readonly capacity?: number } | false;\n}): DocumentRuntime<S> => {\n if (input.schema.kind !== 'object')\n throw new TypeError('Document schema must be a root object node.');\n const invalid = checkValue(input.schema, input.initial);\n if (invalid) throw new ParseError(invalid);\n const state = {\n schema: input.schema,\n document: copyValue(input.schema, input.initial) as Infer<S>,\n disposed: false,\n };\n let revision = 0,\n busy = false;\n let runtime!: DocumentRuntime<S>, notification!: RuntimeNotification<S>;\n const idle = () => {\n if (state.disposed) throw new DocumentDisposedError();\n if (busy || accessOf(runtime).projectionLocks) throw new DocumentReentrancyError();\n };\n const writable = (intent: Parameters<typeof assertRuntimeWritable>[1]) => {\n idle();\n assertRuntimeWritable(runtime, intent);\n };\n const history = createHistory<DocumentCommit<S>>({\n capacity: input.history === false ? 0 : Math.max(0, input.history?.capacity ?? 100),\n revision: () => revision,\n apply: (changes, direction) =>\n mutate({ kind: 'apply', source: 'history' }, false, session => {\n for (const change of changes) replay.apply(session, change, direction);\n }),\n assertIdle: idle,\n notify: run => {\n busy = true;\n try {\n return run();\n } finally {\n busy = false;\n }\n },\n });\n const publish = (\n changes: ChangeSet,\n source: CommitSource,\n recordHistory: boolean\n ): Extract<OperationResult<DocumentCommit<S>>, { status: 'committed' }> => {\n const commit: DocumentCommit<S> = {\n revision: ++revision,\n source,\n changes,\n impact: createImpact(input.schema, changes),\n };\n if (source === 'remote') history.invalidate();\n else if (recordHistory && (source === 'local' || source === 'system')) history.record(changes);\n else if (source === 'history') history.publish();\n else history.endGroup();\n return {\n status: 'committed',\n commit,\n observerErrors: notify(notification, commit, history.flush),\n };\n };\n function mutate(\n intent: Extract<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }>;\n function mutate(\n intent: Exclude<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ): OperationResult<DocumentCommit<S>>;\n function mutate(\n intent: RuntimeWriteIntent,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }> {\n writable(intent);\n busy = true;\n try {\n const session = new MutationSession(state);\n let changes: ChangeSet;\n try {\n execute(session);\n changes = session.finish();\n } catch (error) {\n session.rollback();\n if (error instanceof MutationRejected)\n return { status: 'rejected', issues: [error.issue], revision };\n if (intent.kind === 'update' && error instanceof TransactionRejected)\n return { status: 'rejected', issues: error.issues, revision };\n throw error;\n }\n if (!changes.changes.length) return { status: 'unchanged', revision };\n // Publication is outside the rollback boundary: observers see accepted state.\n return publish(changes, intent.source, recordHistory);\n } finally {\n busy = false;\n }\n }\n runtime = {\n schema: input.schema,\n address: {\n resolve: at => resolveAddress(input.schema, at, state.document),\n read: at => read(state.document, at, input.schema),\n contains,\n overlaps,\n debugKey,\n },\n revision: () => revision,\n update: <V>(\n run: (draft: Draft<S>) => V,\n options?: { source?: Extract<CommitSource, 'local' | 'system'>; history?: boolean }\n ): TransactionResult<V, DocumentCommit<S>> => {\n const source = options?.source ?? 'local';\n let value!: V;\n const result = mutate({ kind: 'update', source }, options?.history ?? true, session => {\n // Draft is a trusted borrowed view. It must not escape this synchronous callback.\n const draft = createAccess({\n state,\n session,\n }) as Draft<S>;\n value = run(draft);\n if (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n throw new TypeError('Document updates must be synchronous.');\n });\n return result.status === 'rejected' ? result : { ...result, value };\n },\n apply: (inputChanges, options) =>\n mutate(\n { kind: 'apply', source: options?.source ?? 'local' },\n options?.history ?? true,\n session => {\n if (!options || options.expectedRevision !== revision)\n fail([], 'baseline-mismatch', 'apply requires the current expectedRevision.');\n replay.apply(session, decodeChanges(inputChanges), 'forward');\n }\n ),\n replace: (value, options) => {\n const source = options?.source ?? 'system';\n return mutate({ kind: 'replace', source }, source !== 'remote', session =>\n session.replace([], value)\n );\n },\n snapshot: () => {\n if (state.disposed) throw new DocumentDisposedError();\n return copyValue(input.schema, state.document) as Infer<S>;\n },\n subscribe: ((\n pick: PathPick<S> | readonly PathPick<S>[] | CommitListener<S>,\n listener?: CommitListener<S>\n ) => {\n if (state.disposed) throw new DocumentDisposedError();\n if (!listener) return subscribeRoot(notification, pick as CommitListener<S>);\n const picks: readonly PathPick<S>[] = Array.isArray(pick) ? pick : [pick as PathPick<S>];\n if (!picks.length) throw new TypeError('Expected at least one subscription path.');\n return subscribeTargets(\n notification,\n picks.map(p => compilePath<S['shape']>(input.schema, 'value', p)),\n listener\n );\n }) as DocumentRuntime<S>['subscribe'],\n history: history.api,\n dispose: () => {\n if (state.disposed) return;\n idle();\n state.disposed = true;\n try {\n disposeNotification(notification);\n } finally {\n history.dispose();\n disposeRuntimeDriver(runtime);\n }\n },\n };\n bindRuntimeAccess(runtime, state);\n bindRuntimeDriver(runtime);\n notification = createNotification(runtime);\n bindDocumentReadable(history.api, runtime);\n return runtime;\n};\n","import type { ObjectNode } from '../schema';\nimport type { DocumentReadable, DocumentRuntime } from './contract';\nimport { accessOf, bindRuntimeAccess } from './access';\nimport { shareNotification } from './notification';\n\n// A readable capability keeps the canonical runtime behind an explicit\n// mutation funnel while remaining fully compatible with selectors, views, and\n// framework subscriptions.\nexport const asReadable = <TSchema extends ObjectNode>(\n runtime: DocumentRuntime<TSchema>\n): DocumentReadable<TSchema> => {\n const readable: DocumentReadable<TSchema> = {\n address: runtime.address,\n revision: runtime.revision,\n subscribe: runtime.subscribe,\n };\n bindRuntimeAccess(readable, accessOf(runtime));\n shareNotification(runtime, readable);\n return Object.freeze(readable);\n};\n","import type { ObjectNode } from '../schema';\nimport type { Read } from '../access/scope';\nimport type { DocumentReadable } from '../runtime/contract';\nimport { readWith } from '../runtime/access';\n\nexport type DocumentSelector<TSchema extends ObjectNode, TResult> = (\n read: Read<TSchema>\n) => TResult;\n\nexport const select = <TSchema extends ObjectNode, TResult>(\n runtime: DocumentReadable<TSchema>,\n selector: DocumentSelector<TSchema, TResult>\n): TResult => readWith(runtime, selector);\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["DocumentDisposedError","equalValue","copyValue","compiledShape","resolveLocated","resolveValue","memberKey","AddressIndex","contains","sealChanges","createAddressResolver","checkValue","fail","resolveContainer","resolveTreeContainer","resolveValue","copyValue","memberKey","checkKey","invalidValue","fail","checkValue","ParseError","copyValue","DocumentDisposedError","accessOf","DocumentReentrancyError","createImpact","notify","MutationRejected","TransactionRejected","resolveAddress","read","createAccess","decodeChanges","subscribeRoot","subscribeTargets","compilePath","createNotification","accessOf","readWith"],"sources":["../core/src/history.ts","../core/src/mutation/state.ts","../core/src/mutation/recorder.ts","../core/src/mutation/session.ts","../core/src/mutation/operations/replay.ts","../core/src/runtime.ts","../core/src/runtime/readable.ts","../core/src/projection/select.ts"],"sourcesContent":["import type { ChangeSet, ChangeDirection } from './changes';\nimport type {\n HistoryState,\n LocalHistory,\n ObserverError,\n OperationResult,\n} from './runtime/contract';\nimport { DocumentDisposedError } from './runtime/contract';\n\ntype Entry = { readonly batches: ChangeSet[] };\ntype Group = { entry?: Entry; readonly undos: Entry[]; readonly redos: Entry[] };\n\nexport const createHistory = <TCommit>(input: {\n readonly capacity: number;\n readonly apply: (\n changes: readonly ChangeSet[],\n direction: ChangeDirection\n ) => OperationResult<TCommit>;\n readonly revision: () => number;\n readonly assertIdle: () => void;\n readonly notify: (run: () => readonly ObserverError[]) => readonly ObserverError[];\n}) => {\n let undos: Entry[] = [];\n let redos: Entry[] = [];\n const listeners = new Set<() => void>();\n let state: HistoryState = Object.freeze({ undoDepth: 0, redoDepth: 0 });\n let revision = 0;\n let pending = false;\n let disposed = false;\n let group: Group | undefined;\n const unchanged = (): OperationResult<TCommit> => ({\n status: 'unchanged',\n revision: input.revision(),\n });\n const publish = () => {\n if (state.undoDepth === undos.length && state.redoDepth === redos.length) return;\n state = Object.freeze({ undoDepth: undos.length, redoDepth: redos.length });\n revision++;\n pending = true;\n };\n const flush = (): readonly ObserverError[] => {\n if (!pending) return [];\n pending = false;\n const errors: ObserverError[] = [];\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue;\n try {\n listener();\n } catch (error) {\n errors.push({ phase: 'listener', error });\n }\n }\n return errors;\n };\n const clear = () => {\n group = undefined;\n undos.length = redos.length = 0;\n publish();\n };\n const travel = (direction: 'undo' | 'redo' | 'cancel'): OperationResult<TCommit> => {\n input.assertIdle();\n const from = direction === 'redo' ? redos : undos;\n const to = direction === 'redo' ? undos : redos;\n const previousUndos = undos;\n const previousRedos = redos;\n const entry = direction === 'cancel' ? from.at(-1) : from.pop();\n if (!entry) return unchanged();\n if (direction === 'cancel') {\n if (!group || group.entry !== entry)\n throw new Error('History group no longer owns its entry.');\n undos = group.undos;\n redos = group.redos;\n } else to.push(entry);\n let committed = false;\n try {\n const changes = direction === 'redo' ? entry.batches : entry.batches.slice().reverse();\n const result = input.apply(changes, direction === 'redo' ? 'forward' : 'backward');\n committed = result.status !== 'rejected';\n if (committed && direction === 'cancel') group = undefined;\n if (result.status === 'unchanged') {\n publish();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n }\n return result;\n } finally {\n if (!committed) {\n if (direction === 'cancel') {\n undos = previousUndos;\n redos = previousRedos;\n } else {\n to.pop();\n from.push(entry);\n }\n }\n }\n };\n const api: LocalHistory<TCommit> = {\n current: () => state,\n revision: () => revision,\n subscribe: listener => {\n if (disposed) throw new DocumentDisposedError();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n undo: () => {\n input.assertIdle();\n group = undefined;\n return travel('undo');\n },\n redo: () => {\n input.assertIdle();\n group = undefined;\n return travel('redo');\n },\n clear: () => {\n input.assertIdle();\n clear();\n const errors = input.notify(flush);\n if (errors.length)\n throw new AggregateError(\n errors.map(entry => entry.error),\n 'History listeners failed.'\n );\n },\n group: () => {\n input.assertIdle();\n if (group) throw new Error('A history group is already active.');\n if (input.capacity <= 0) throw new Error('History is disabled.');\n const scope: Group = { undos: undos.slice(), redos: redos.slice() };\n group = scope;\n return Object.freeze({\n end: () => {\n input.assertIdle();\n if (group === scope) group = undefined;\n },\n cancel: () => {\n input.assertIdle();\n if (group !== scope) return unchanged();\n if (!scope.entry) {\n group = undefined;\n return unchanged();\n }\n const result = travel('cancel');\n if (result.status !== 'rejected') group = undefined;\n return result;\n },\n });\n },\n };\n return {\n api,\n record: (batch: ChangeSet) => {\n if (input.capacity <= 0) return;\n if (group?.entry) group.entry.batches.push(batch);\n else {\n const entry: Entry = { batches: [batch] };\n undos.push(entry);\n if (group) group.entry = entry;\n if (undos.length > input.capacity) undos.shift();\n }\n redos.length = 0;\n publish();\n },\n publish,\n flush,\n endGroup: () => {\n group = undefined;\n },\n invalidate: clear,\n dispose: () => {\n disposed = true;\n listeners.clear();\n clear();\n pending = false;\n },\n };\n};\n","import type { DocumentNode, ObjectNode } from '../schema';\nimport * as anchor from './anchor';\n\nexport type CanonicalState = { schema: ObjectNode; document: unknown };\n\n/** Install validated values, or captured before values during rollback. */\nexport const installMember = (\n parent: Record<string, unknown> | unknown[],\n key: string | number,\n present: boolean,\n value: unknown\n): void => {\n if (Array.isArray(parent)) {\n const index = Number(key);\n if (present) {\n if (index < 0) anchor.insert(parent, parent.length, value);\n else parent[index] = value;\n } else if (index >= 0) anchor.remove(parent, index);\n } else if (!present) delete parent[key];\n else if (Object.hasOwn(parent, key)) parent[key] = value;\n else\n Object.defineProperty(parent, key, {\n value,\n writable: true,\n configurable: true,\n enumerable: true,\n });\n};\n\nexport const orderOf = (node: DocumentNode, value: unknown): string[] => {\n if (node.kind === 'list') return (value as unknown[]).map(node.keyOf);\n if (node.kind === 'table') return [...(value as { ids: string[] }).ids];\n throw new Error('Order requires a table or list.');\n};\n\nexport const installOrder = (\n node: DocumentNode,\n value: unknown,\n order: readonly string[]\n): void => {\n if (node.kind === 'list') anchor.install(value as unknown[], node.keyOf, order);\n else if (node.kind === 'table') (value as { ids: string[] }).ids = [...order];\n else throw new Error('Order requires a table or list.');\n};\n","import type { Change, ChangeSet, MemberChange } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport {\n AddressIndex,\n contains,\n resolveValue,\n resolveLocated,\n memberKey,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n type CompiledMember,\n compiledShape,\n type FixedLayout,\n} from '../address';\nimport * as anchor from './anchor';\nimport { copyValue, equalValue } from '../schema-value';\nimport type { MutableTree, MutableTreeNode } from './tree';\nimport { profile } from '../profile';\nimport { sealChanges } from './changes';\nimport { installMember, installOrder, orderOf, type CanonicalState } from './state';\ntype MemberFact = { key: string; node: DocumentNode; present: boolean; value: unknown };\ntype MemberGroup = {\n kind: 'members';\n at: DocumentAddress;\n node: DocumentNode;\n parent: Record<string, unknown> | unknown[];\n value: unknown;\n order?: readonly string[];\n} & (\n | { layout: 'fixed'; definitions: FixedLayout['members']; members: (MemberFact | undefined)[] }\n | { layout: 'dynamic'; members: Map<string, MemberFact> | undefined }\n);\ntype TreeFact = {\n kind: 'tree';\n at: DocumentAddress;\n before: string | null;\n nodes: Map<string, MutableTreeNode | undefined>;\n};\ntype Fact = MemberGroup | TreeFact;\ntype RestoreFact =\n | { kind: 'order'; at: DocumentAddress; group: MemberGroup }\n | TreeFact\n | { kind: 'member'; at: DocumentAddress; group: MemberGroup; member: MemberFact };\nconst firstMember = (group: MemberGroup, key: string): MemberFact | undefined => {\n if (group.layout === 'dynamic') return group.members?.get(key);\n const member = group.definitions.get(key);\n return member && group.members[member.slot];\n};\n\nconst forgetMember = (group: MemberGroup, key: string): void => {\n if (group.layout === 'dynamic') group.members?.delete(key);\n else {\n const definition = group.definitions.get(key);\n if (definition) group.members[definition.slot] = undefined;\n }\n};\nconst emptyGroup = (group: MemberGroup): boolean =>\n !group.order && (group.layout === 'fixed' ? !group.members.some(Boolean) : !group.members?.size);\n\nconst copyNode = (node: MutableTreeNode): MutableTreeNode => ({\n ...node,\n children: [...node.children],\n});\nconst transition = (\n node: DocumentNode,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): MemberChange | undefined => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (node.kind !== 'field' && beforePresent === afterPresent && equalValue(node, before, after))\n return;\n const value = afterPresent ? (node.kind === 'field' ? after : copyValue(node, after)) : undefined;\n profile.recorder('transitions');\n return !beforePresent\n ? { key, kind: 'added', after: value }\n : !afterPresent\n ? { key, kind: 'removed', before }\n : { key, kind: 'updated', before, after: value };\n};\n\nconst publishMembers = (\n changes: Change[],\n at: DocumentAddress,\n members: MemberChange[],\n order?: { before: readonly string[]; after: readonly string[] }\n): void => {\n if (!members.length && !order) return;\n for (let i = 1; i < members.length; i++)\n if (members[i - 1].key > members[i].key) {\n members.sort((a, b) => lexical(a.key, b.key));\n break;\n }\n changes.push(order ? { kind: 'members', at, members, order } : { kind: 'members', at, members });\n};\n\n/** Diff only the captured subtree; this algorithm has no recorder or session state. */\nconst diffMember = (\n changes: Change[],\n members: MemberChange[],\n node: DocumentNode,\n at: DocumentAddress,\n key: string,\n beforePresent: boolean,\n before: unknown,\n afterPresent: boolean,\n after: unknown\n): void => {\n if (beforePresent === afterPresent && (!beforePresent || Object.is(before, after))) return;\n if (beforePresent && afterPresent && before !== undefined && after !== undefined) {\n const sameShape =\n node.kind === 'object' ||\n (node.kind === 'variant' &&\n (before as Record<string, unknown>)[node.tag] ===\n (after as Record<string, unknown>)[node.tag]);\n if (sameShape) {\n const left = before as Record<string, unknown>,\n right = after as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const [child, definition] of compiledShape(node, before)!.members)\n diffMember(\n changes,\n children,\n definition.node,\n childAt,\n child,\n Object.hasOwn(left, child),\n left[child],\n Object.hasOwn(right, child),\n right[child]\n );\n publishMembers(changes, childAt, children);\n return;\n }\n if (node.kind === 'map' || node.kind === 'table') {\n const a = before as Record<string, unknown>,\n b = after as typeof a;\n const left = (node.kind === 'table' ? a.byId : a) as Record<string, unknown>;\n const right = (node.kind === 'table' ? b.byId : b) as typeof left;\n const childAt = at.concat(key);\n const children: MemberChange[] = [];\n for (const id of Object.keys(left))\n diffMember(\n changes,\n children,\n node.value,\n childAt,\n id,\n true,\n left[id],\n Object.hasOwn(right, id),\n right[id]\n );\n for (const id of Object.keys(right))\n if (!Object.hasOwn(left, id))\n diffMember(changes, children, node.value, childAt, id, false, undefined, true, right[id]);\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (node.kind === 'table' && !anchor.equal(a.ids as string[], b.ids as string[])) {\n profile.recorder('publishedOrderItems', (b.ids as string[]).length);\n order = { before: a.ids as string[], after: [...(b.ids as string[])] };\n }\n publishMembers(changes, childAt, children, order);\n return;\n }\n }\n const member = transition(node, key, beforePresent, before, afterPresent, after);\n if (member) members.push(member);\n};\nconst restore = (fact: RestoreFact, schema: DocumentNode, root: unknown, skip = 0): unknown => {\n const at = skip ? fact.at.slice(skip) : fact.at;\n if (fact.kind === 'member') {\n const member = fact.member;\n const value = member.present ? copyValue(member.node, member.value) : undefined;\n if (!at.length) return value;\n const location = resolveLocated(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved member.');\n installMember(location.parent, location.key, member.present, value);\n return root;\n }\n const location = resolveValue(schema, root, at);\n if (!location) throw new Error('Cannot restore an unresolved subtree.');\n if (fact.kind === 'order') installOrder(location.node, location.value, fact.group.order!);\n else {\n const tree = location.value as MutableTree;\n if (fact.before === null) delete tree.rootId;\n else tree.rootId = fact.before;\n for (const [id, node] of fact.nodes)\n installMember(tree.nodes, id, node !== undefined, node && copyNode(node));\n }\n return root;\n};\n\nconst reconstructBefore = (\n node: DocumentNode,\n current: unknown,\n records: readonly RestoreFact[],\n offset: number\n): unknown => {\n let before = copyValue(node, current);\n for (let i = records.length - 1; i >= 0; i--)\n if (records[i].kind !== 'order') before = restore(records[i], node, before, offset);\n for (const record of records)\n if (record.kind === 'order') before = restore(record, node, before, offset);\n return before;\n};\n\nconst sealMembers = (fact: MemberGroup, changes: Change[]): void => {\n const members: MemberChange[] = [];\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const key = memberKey(fact, member.key);\n const present = Object.hasOwn(fact.parent, key);\n const value = (fact.parent as Record<string | number, unknown>)[key];\n if (member.node.kind === 'field') {\n const change = transition(\n member.node,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n if (change) members.push(change);\n } else\n diffMember(\n changes,\n members,\n member.node,\n fact.at,\n member.key,\n member.present,\n member.value,\n present,\n value\n );\n }\n let order: { before: readonly string[]; after: readonly string[] } | undefined;\n if (fact.order) {\n const current =\n fact.node.kind === 'list'\n ? anchor.keys(fact.value as unknown[], fact.node.keyOf)\n : (fact.value as { ids: string[] }).ids;\n if (!anchor.equal(fact.order, current)) {\n const after = orderOf(fact.node, fact.value);\n profile.recorder('publishedOrderItems', after.length);\n order = { before: fact.order, after };\n }\n }\n publishMembers(changes, fact.at, members, order);\n};\n\nconst sealTree = (fact: TreeFact, state: CanonicalState, changes: Change[]): void => {\n const location = resolveValue(state.schema, state.document, fact.at);\n const tree = location?.value as MutableTree;\n const node = location?.node;\n if (node?.kind !== 'tree') throw new Error('Tree schema disappeared before sealing.');\n const nodes: Extract<Change, { kind: 'tree' }>['nodes'][number][] = [];\n for (const [id, before] of fact.nodes) {\n const after = Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : undefined;\n if (!before && !after) continue;\n if (\n before &&\n after &&\n before.parentId === after.parentId &&\n anchor.equal(before.children, after.children) &&\n Object.hasOwn(before, 'value') === Object.hasOwn(after, 'value') &&\n equalValue(node.value, before.value, after.value)\n )\n continue;\n nodes.push(\n !before\n ? { id, kind: 'added', after: copyNode(after!) }\n : !after\n ? { id, kind: 'removed', before }\n : { id, kind: 'updated', before, after: copyNode(after) }\n );\n }\n const after = tree.rootId ?? null;\n if (nodes.length || fact.before !== after)\n changes.push({\n kind: 'tree',\n at: fact.at,\n before: fact.before,\n after,\n nodes: nodes.sort((a, b) => lexical(a.id, b.id)),\n });\n};\n\n/** One first-touch record per owning container, never a per-write operation log. */\nexport class ChangeRecorder {\n private readonly facts = new Set<Fact>();\n private groups = new WeakMap<object, MemberGroup>();\n private index?: AddressIndex<Fact>;\n private indexedGroups = false;\n private resetBefore?: { value: unknown };\n constructor(private readonly state: CanonicalState) {}\n private indexGroups(): AddressIndex<Fact> {\n const index = (this.index ??= new AddressIndex());\n if (!this.indexedGroups) {\n this.indexedGroups = true;\n for (const fact of this.facts) {\n if (fact.kind === 'members') {\n index.add(fact.at, fact);\n profile.recorder('indexedGroups');\n }\n }\n }\n return index;\n }\n private covered(at: DocumentAddress): boolean {\n return (\n this.resetBefore !== undefined ||\n (this.indexedGroups &&\n this.index!.someAncestor(\n at,\n fact =>\n fact.kind === 'members' &&\n fact.at.length < at.length &&\n firstMember(fact, at[fact.at.length]) !== undefined\n ))\n );\n }\n private absorb(\n at: DocumentAddress,\n node: DocumentNode,\n value: unknown,\n present: boolean\n ): unknown {\n const index = this.indexGroups();\n const children: RestoreFact[] = [];\n index.query(fact => {\n if (fact.kind === 'members') {\n // An ancestor group can contribute only its one directly addressed member.\n if (fact.at.length < at.length) {\n if (fact.at.length + 1 === at.length) {\n const member = firstMember(fact, at[fact.at.length]);\n if (member) children.push({ kind: 'member', at, group: fact, member });\n }\n return;\n }\n if (fact.order && contains(at, fact.at))\n children.push({ kind: 'order', at: fact.at, group: fact });\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n const memberAt = fact.at.concat(member.key);\n if (contains(at, memberAt))\n children.push({ kind: 'member', at: memberAt, group: fact, member });\n }\n } else if (contains(at, fact.at)) children.push(fact);\n })(at);\n if (present) value = reconstructBefore(node, value, children, at.length);\n this.releaseCovered(children);\n return value;\n }\n private releaseCovered(children: readonly RestoreFact[]): void {\n let changedGroups: Set<MemberGroup> | undefined;\n for (const child of children) {\n profile.recorder('absorbed');\n if (child.kind === 'member') {\n const { group, member } = child;\n forgetMember(group, member.key);\n (changedGroups ??= new Set()).add(group);\n } else if (child.kind === 'order') {\n child.group.order = undefined;\n (changedGroups ??= new Set()).add(child.group);\n } else {\n this.unregister(child);\n }\n }\n for (const group of changedGroups ?? []) {\n if (emptyGroup(group)) {\n this.unregister(group);\n }\n }\n }\n private register(fact: Fact): void {\n this.facts.add(fact);\n if (fact.kind === 'members') {\n this.groups.set(fact.parent, fact);\n profile.recorder('groups');\n if (!this.indexedGroups) return;\n profile.recorder('indexedGroups');\n }\n (this.index ??= new AddressIndex()).add(fact.at, fact);\n }\n private unregister(fact: Fact): void {\n this.facts.delete(fact);\n this.index?.delete(fact.at, fact);\n if (fact.kind === 'members') this.groups.delete(fact.parent);\n }\n member(\n container: ResolvedContainer,\n key: string,\n definition: CompiledMember,\n physicalKey: string | number\n ): void {\n if (this.resetBefore) return;\n const { node } = definition;\n let group = this.groups.get(container.parent);\n if (group?.layout === 'dynamic' && group.members?.has(key)) return;\n if (group?.layout === 'fixed' && definition.kind === 'fixed' && group.members[definition.slot])\n return;\n const at = this.indexedGroups || node.kind !== 'field' ? container.at.concat(key) : undefined;\n if (at && this.covered(at)) return;\n const present = Object.hasOwn(container.parent, physicalKey);\n let value = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (node.kind !== 'field') value = this.absorb(at!, node, value, present);\n if (!group || !this.facts.has(group)) {\n group = this.createGroup(container);\n }\n const member: MemberFact = { key, node, present, value };\n if (group.layout === 'dynamic') (group.members ??= new Map()).set(key, member);\n else if (definition.kind === 'fixed') group.members[definition.slot] = member;\n else throw new Error('A fixed member group requires a fixed schema member.');\n profile.recorder('facts');\n }\n reset(): void {\n if (this.resetBefore) return;\n const value = this.absorb([], this.state.schema, this.state.document, true);\n this.resetBefore = { value };\n this.groups = new WeakMap();\n profile.recorder('facts');\n }\n private createGroup(container: ResolvedContainer): MemberGroup {\n const group: MemberGroup =\n container.layout.kind === 'fixed'\n ? {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'fixed',\n definitions: container.layout.members,\n members: new Array<MemberFact | undefined>(container.layout.members.size),\n }\n : {\n kind: 'members',\n at: container.at,\n node: container.node,\n parent: container.parent,\n value: container.value,\n layout: 'dynamic',\n members: undefined,\n };\n this.register(group);\n return group;\n }\n order(container: ResolvedContainer): void {\n profile.recorder('orderCaptures');\n let group = this.groups.get(container.parent);\n if (group?.order || this.covered(container.at)) return;\n group ??= this.createGroup(container);\n group.order = orderOf(container.node, container.value);\n profile.recorder('orderSnapshots');\n profile.recorder('orderItems', group.order.length);\n }\n tree(container: ResolvedTreeContainer, id?: string): void {\n const { at, value: tree } = container;\n if (this.covered(at)) return;\n const index = (this.index ??= new AddressIndex());\n let fact: TreeFact | undefined;\n for (const item of index.exact(at) ?? []) if (item.kind === 'tree') fact = item;\n if (!fact) {\n fact = { kind: 'tree', at, before: tree.rootId ?? null, nodes: new Map() };\n this.register(fact);\n }\n if (id !== undefined && !fact.nodes.has(id)) {\n profile.recorder('treeNodes');\n fact.nodes.set(id, Object.hasOwn(tree.nodes, id) ? copyNode(tree.nodes[id]) : undefined);\n }\n }\n rollback(): void {\n if (this.resetBefore) {\n this.state.document = this.resetBefore.value;\n return;\n }\n const facts = [...this.facts];\n for (let i = facts.length - 1; i >= 0; i--) {\n const fact = facts[i];\n if (fact.kind === 'members') {\n for (const member of fact.members?.values() ?? []) {\n if (!member) continue;\n installMember(\n fact.parent,\n memberKey(fact, member.key),\n member.present,\n member.present ? copyValue(member.node, member.value) : undefined\n );\n }\n } else if (fact.kind === 'tree') restore(fact, this.state.schema, this.state.document);\n }\n for (const fact of facts)\n if (fact.kind === 'members' && fact.order) installOrder(fact.node, fact.value, fact.order);\n }\n seal(): ChangeSet {\n if (this.resetBefore) {\n if (equalValue(this.state.schema, this.resetBefore.value, this.state.document))\n return sealChanges([]);\n profile.recorder('sealed');\n return sealChanges([\n {\n kind: 'reset',\n before: this.resetBefore.value,\n after: copyValue(this.state.schema, this.state.document),\n },\n ]);\n }\n const changes: Change[] = [];\n for (const fact of this.facts) {\n if (fact.kind === 'members') sealMembers(fact, changes);\n else sealTree(fact, this.state, changes);\n }\n const result = sealChanges(changes);\n profile.recorder('sealed', result.changes.length);\n return result;\n }\n}\nconst lexical = (a: string, b: string): number => (a < b ? -1 : a === b ? 0 : 1);\n","import type { ChangeSet } from '../changes';\nimport type { DocumentAddress, DocumentNode } from '../schema';\nimport {\n createAddressResolver,\n resolveContainer,\n resolveTreeContainer,\n resolveValue,\n memberKey,\n type CompiledMember,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n} from '../address';\nimport { checkKey, checkValue, copyValue } from '../schema-value';\nimport { ChangeRecorder } from './recorder';\nimport { installMember, type CanonicalState } from './state';\nimport { fail, invalidValue } from './issue';\n\nexport class MutationSession {\n readonly identity = {};\n generation = 0;\n readonly recorder: ChangeRecorder;\n private resolver;\n private resolvedRoot: unknown;\n constructor(readonly state: CanonicalState) {\n this.recorder = new ChangeRecorder(state);\n this.resolver = createAddressResolver(state.schema, state.document);\n this.resolvedRoot = state.document;\n }\n validate(node: DocumentNode, value: unknown, at: DocumentAddress): void {\n const issue = checkValue(node, value, at);\n if (issue) invalidValue(issue);\n }\n resolveContainer(at: DocumentAddress): ResolvedContainer {\n return (\n this.resolver.container(this.identity, this.generation, at) ??\n fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n /** Bind access-resolved canonical facts without walking the address again. */\n bind(at: DocumentAddress, node: DocumentNode | undefined, value: unknown): ResolvedContainer {\n return (\n resolveContainer(this.identity, this.generation, at, node, value) ??\n fail(at, 'invalid-address', 'Container does not exist.')\n );\n }\n bindTree(\n at: DocumentAddress,\n node: DocumentNode | undefined,\n value: unknown\n ): ResolvedTreeContainer {\n return (\n resolveTreeContainer(this.identity, this.generation, at, node, value) ??\n fail(at, 'invalid-tree', 'Expected a tree.')\n );\n }\n resolveTree(at: DocumentAddress): ResolvedTreeContainer {\n const location = resolveValue(this.state.schema, this.state.document, at);\n return this.bindTree(at, location?.node, location?.value);\n }\n replace(at: DocumentAddress, value: unknown): void {\n if (!at.length) {\n this.validate(this.state.schema, value, at);\n if (Object.is(this.state.document, value)) return;\n this.recorder.reset();\n this.state.document = copyValue(this.state.schema, value);\n this.invalidate();\n return;\n }\n this.writeMember(this.resolveContainer(at.slice(0, -1)), at[at.length - 1], value, 'set');\n }\n assignMember(container: ResolvedContainer, key: string, value: unknown): void {\n container = this.refresh(container);\n const member = this.definition(container, key);\n if (\n container.layout.kind === 'fixed' &&\n member.node.kind !== 'field' &&\n member.node.kind !== 'variant' &&\n !member.node.optional\n )\n return fail(\n container.at.concat(key),\n 'invalid-value',\n 'Replace fields, variants, or collection entries; edit object members individually.'\n );\n this.writeLocatedMember(container, key, member, memberKey(container, key), value, 'set');\n }\n removeMember(container: ResolvedContainer, key: string): void {\n this.writeMember(this.refresh(container), key, undefined, 'remove');\n }\n private refresh(container: ResolvedContainer): ResolvedContainer {\n if (container.owner !== this.identity)\n return fail(\n container.at,\n 'invalid-address',\n 'Container belongs to another mutation session.'\n );\n return container.generation === this.generation\n ? container\n : this.resolveContainer(container.at);\n }\n definition(container: ResolvedContainer, key: string): CompiledMember {\n const layout = container.layout;\n const member = layout.kind === 'dynamic' ? layout.entry : layout.members.get(key);\n if (!member)\n return fail(container.at.concat(key), 'invalid-address', 'Address does not exist.');\n return member;\n }\n /** Consume a current command-local container; bulk writes retain its storage. */\n writeMember(\n container: ResolvedContainer,\n key: string,\n value: unknown,\n operation: 'set' | 'remove',\n physicalKey = memberKey(container, key)\n ): boolean {\n const member = this.definition(container, key);\n return this.writeLocatedMember(container, key, member, physicalKey, value, operation);\n }\n /** Location and definition are resolved once by the calling operation. */\n private writeLocatedMember(\n container: ResolvedContainer,\n key: string,\n member: CompiledMember,\n physicalKey: string | number,\n value: unknown,\n operation: 'set' | 'remove'\n ): boolean {\n const parentNode = container.node;\n const node = member.node;\n const present = operation === 'set';\n if (parentNode.kind === 'variant' && parentNode.tag === key)\n return fail(\n container.at.concat(key),\n 'invalid-value',\n 'Variant discriminants are read-only.'\n );\n const entry = container.layout.kind === 'dynamic';\n if (!present && !node.optional && !entry)\n return fail(\n container.at.concat(key),\n 'required-field',\n 'A required value cannot be removed.'\n );\n const existed = Object.hasOwn(container.parent, physicalKey);\n const previous = (container.parent as Record<string | number, unknown>)[physicalKey];\n if (existed === present && (!present || Object.is(previous, value))) return false;\n if (parentNode.kind === 'map' || parentNode.kind === 'table') {\n const issue = checkKey(parentNode.key, key, []);\n if (issue)\n return fail(container.at.concat(key, ...issue.address), 'invalid-key', issue.message);\n }\n if (present) {\n if (node.kind === 'field') {\n const issue = checkValue(node, value, []);\n if (issue) return invalidValue(issue, container.at.concat(key, ...issue.address));\n } else this.validate(node, value, container.at.concat(key));\n if (parentNode.kind === 'list' && parentNode.keyOf(value) !== key)\n return fail(\n container.at.concat(key),\n 'invalid-list-key',\n 'Replacing an item must retain its addressed key.'\n );\n }\n const membershipChanged = entry && existed !== present;\n if (membershipChanged && (parentNode.kind === 'list' || parentNode.kind === 'table'))\n this.recorder.order(container);\n this.recorder.member(container, key, member, physicalKey);\n const next = present ? (node.kind === 'field' ? value : copyValue(node, value)) : undefined;\n installMember(container.parent, physicalKey, present, next);\n if (node.kind !== 'field' || membershipChanged) this.invalidate();\n return membershipChanged;\n }\n invalidate(): void {\n this.generation++;\n if (this.resolvedRoot !== this.state.document) {\n this.resolvedRoot = this.state.document;\n this.resolver = createAddressResolver(this.state.schema, this.state.document);\n } else this.resolver.invalidate();\n }\n finish(): ChangeSet {\n return this.recorder.seal();\n }\n rollback(): void {\n this.recorder.rollback();\n this.invalidate();\n }\n}\n","import type { ChangeDirection, ChangeSet } from '../../changes';\nimport type { MutationSession } from '../session';\nimport { installOrder, installMember, orderOf } from '../state';\nimport * as anchor from '../anchor';\nimport { fail } from '../issue';\nexport function apply(\n session: MutationSession,\n changes: ChangeSet,\n direction: ChangeDirection\n): void {\n const side = direction === 'forward' ? 'after' : 'before';\n for (const change of changes.changes) {\n if (change.kind === 'reset') {\n session.replace([], change[side]);\n } else if (change.kind === 'members') {\n const container = session.resolveContainer(change.at);\n const { node, value: current } = container;\n if (change.order) {\n if (node.kind !== 'table' && node.kind !== 'list')\n return fail(change.at, 'invalid-changes', 'Order requires an ordered container.');\n session.recorder.order(container);\n }\n let membershipChanged = false;\n for (const member of change.members) {\n const present = side === 'after' ? member.kind !== 'removed' : member.kind !== 'added';\n const value =\n side === 'after'\n ? member.kind !== 'removed'\n ? member.after\n : undefined\n : member.kind !== 'added'\n ? member.before\n : undefined;\n membershipChanged =\n session.writeMember(container, member.key, value, present ? 'set' : 'remove') ||\n membershipChanged;\n }\n if (change.order) {\n const keys = node.kind === 'table' ? Object.keys(container.parent) : orderOf(node, current);\n if (!anchor.matches(change.order[side], keys))\n return fail(\n change.at,\n 'invalid-changes',\n 'Order must contain exactly the resulting keys.'\n );\n installOrder(node, current, change.order[side]);\n session.invalidate();\n } else if (membershipChanged && node.kind === 'table') {\n const ids = (current as { ids: string[] }).ids;\n if (!anchor.matches(ids, Object.keys(container.parent)))\n return fail(\n change.at,\n 'invalid-changes',\n 'Table membership changes require a matching order.'\n );\n }\n } else {\n const container = session.resolveTree(change.at);\n const { value: current, node } = container;\n session.recorder.tree(container);\n for (const item of change.nodes) session.recorder.tree(container, item.id);\n const root = change[side];\n if (root === null) delete current.rootId;\n else current.rootId = root;\n for (const item of change.nodes) {\n const next =\n side === 'after'\n ? item.kind !== 'removed'\n ? item.after\n : undefined\n : item.kind !== 'added'\n ? item.before\n : undefined;\n installMember(\n current.nodes,\n item.id,\n next !== undefined,\n next && { ...next, children: [...next.children] }\n );\n }\n session.validate(node, current, change.at);\n session.invalidate();\n }\n }\n}\n","import type { ObjectNode, Infer, PathPick } from './schema';\nimport { compilePath } from './schema';\nimport { contains, debugKey, overlaps, read, resolveAddress } from './address';\nimport { createImpact } from './impact';\nimport { createHistory } from './history';\nimport { createAccess, type Draft } from './access/scope';\nimport { MutationSession } from './mutation/session';\nimport * as replay from './mutation/operations/replay';\nimport type { RuntimeWriteIntent } from './runtime/driver';\nimport { decodeChanges } from './mutation/changes';\nimport { MutationRejected, fail } from './mutation/issue';\nimport type { ChangeSet } from './changes';\nimport { checkValue, copyValue, ParseError } from './schema-value';\nimport {\n DocumentDisposedError,\n DocumentReentrancyError,\n TransactionRejected,\n} from './runtime/contract';\nimport type {\n CommitListener,\n CommitSource,\n DocumentCommit,\n DocumentRuntime,\n OperationResult,\n TransactionResult,\n} from './runtime/contract';\nimport { bindRuntimeAccess, accessOf } from './runtime/access';\nimport { assertRuntimeWritable, bindRuntimeDriver, disposeRuntimeDriver } from './runtime/driver';\nimport {\n bindDocumentReadable,\n createNotification,\n disposeNotification,\n notify,\n subscribeRoot,\n subscribeTargets,\n type RuntimeNotification,\n} from './runtime/notification';\n\nexport const createDocument = <S extends ObjectNode>(input: {\n readonly schema: S;\n readonly initial: Infer<S>;\n readonly history?: { readonly capacity?: number } | false;\n}): DocumentRuntime<S> => {\n if (input.schema.kind !== 'object')\n throw new TypeError('Document schema must be a root object node.');\n const invalid = checkValue(input.schema, input.initial);\n if (invalid) throw new ParseError(invalid);\n const state = {\n schema: input.schema,\n document: copyValue(input.schema, input.initial) as Infer<S>,\n disposed: false,\n };\n let revision = 0,\n busy = false;\n let runtime!: DocumentRuntime<S>, notification!: RuntimeNotification<S>;\n const idle = () => {\n if (state.disposed) throw new DocumentDisposedError();\n if (busy || accessOf(runtime).projectionLocks) throw new DocumentReentrancyError();\n };\n const writable = (intent: Parameters<typeof assertRuntimeWritable>[1]) => {\n idle();\n assertRuntimeWritable(runtime, intent);\n };\n const history = createHistory<DocumentCommit<S>>({\n capacity: input.history === false ? 0 : Math.max(0, input.history?.capacity ?? 100),\n revision: () => revision,\n apply: (changes, direction) =>\n mutate({ kind: 'apply', source: 'history' }, false, session => {\n for (const change of changes) replay.apply(session, change, direction);\n }),\n assertIdle: idle,\n notify: run => {\n busy = true;\n try {\n return run();\n } finally {\n busy = false;\n }\n },\n });\n const publish = (\n changes: ChangeSet,\n source: CommitSource,\n recordHistory: boolean\n ): Extract<OperationResult<DocumentCommit<S>>, { status: 'committed' }> => {\n const commit: DocumentCommit<S> = {\n revision: ++revision,\n source,\n changes,\n impact: createImpact(input.schema, changes),\n };\n if (source === 'remote') history.invalidate();\n else if (recordHistory && (source === 'local' || source === 'system')) history.record(changes);\n else if (source === 'history') history.publish();\n else history.endGroup();\n return {\n status: 'committed',\n commit,\n observerErrors: notify(notification, commit, history.flush),\n };\n };\n function mutate(\n intent: Extract<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }>;\n function mutate(\n intent: Exclude<RuntimeWriteIntent, { kind: 'update' }>,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ): OperationResult<DocumentCommit<S>>;\n function mutate(\n intent: RuntimeWriteIntent,\n recordHistory: boolean,\n execute: (session: MutationSession) => void\n ):\n | OperationResult<DocumentCommit<S>>\n | Extract<TransactionResult<never, never>, { status: 'rejected' }> {\n writable(intent);\n busy = true;\n try {\n const session = new MutationSession(state);\n let changes: ChangeSet;\n try {\n execute(session);\n changes = session.finish();\n } catch (error) {\n session.rollback();\n if (error instanceof MutationRejected)\n return { status: 'rejected', issues: [error.issue], revision };\n if (intent.kind === 'update' && error instanceof TransactionRejected)\n return { status: 'rejected', issues: error.issues, revision };\n throw error;\n }\n if (!changes.changes.length) return { status: 'unchanged', revision };\n // Publication is outside the rollback boundary: observers see accepted state.\n return publish(changes, intent.source, recordHistory);\n } finally {\n busy = false;\n }\n }\n runtime = {\n schema: input.schema,\n address: {\n resolve: at => resolveAddress(input.schema, at, state.document),\n read: at => read(state.document, at, input.schema),\n contains,\n overlaps,\n debugKey,\n },\n revision: () => revision,\n update: <V>(\n run: (draft: Draft<S>) => V,\n options?: { source?: Extract<CommitSource, 'local' | 'system'>; history?: boolean }\n ): TransactionResult<V, DocumentCommit<S>> => {\n const source = options?.source ?? 'local';\n let value!: V;\n const result = mutate({ kind: 'update', source }, options?.history ?? true, session => {\n // Draft is a trusted borrowed view. It must not escape this synchronous callback.\n const draft = createAccess({\n state,\n session,\n }) as Draft<S>;\n value = run(draft);\n if (\n value !== null &&\n (typeof value === 'object' || typeof value === 'function') &&\n typeof (value as { then?: unknown }).then === 'function'\n )\n throw new TypeError('Document updates must be synchronous.');\n });\n return result.status === 'rejected' ? result : { ...result, value };\n },\n apply: (inputChanges, options) =>\n mutate(\n { kind: 'apply', source: options?.source ?? 'local' },\n options?.history ?? true,\n session => {\n if (!options || options.expectedRevision !== revision)\n fail([], 'baseline-mismatch', 'apply requires the current expectedRevision.');\n replay.apply(session, decodeChanges(inputChanges), 'forward');\n }\n ),\n replace: (value, options) => {\n const source = options?.source ?? 'system';\n return mutate({ kind: 'replace', source }, source !== 'remote', session =>\n session.replace([], value)\n );\n },\n snapshot: () => {\n if (state.disposed) throw new DocumentDisposedError();\n return copyValue(input.schema, state.document) as Infer<S>;\n },\n subscribe: ((\n pick: PathPick<S> | readonly PathPick<S>[] | CommitListener<S>,\n listener?: CommitListener<S>\n ) => {\n if (state.disposed) throw new DocumentDisposedError();\n if (!listener) return subscribeRoot(notification, pick as CommitListener<S>);\n const picks: readonly PathPick<S>[] = Array.isArray(pick) ? pick : [pick as PathPick<S>];\n if (!picks.length) throw new TypeError('Expected at least one subscription path.');\n return subscribeTargets(\n notification,\n picks.map(p => compilePath<S['shape']>(input.schema, 'value', p)),\n listener\n );\n }) as DocumentRuntime<S>['subscribe'],\n history: history.api,\n dispose: () => {\n if (state.disposed) return;\n idle();\n state.disposed = true;\n try {\n disposeNotification(notification);\n } finally {\n history.dispose();\n disposeRuntimeDriver(runtime);\n }\n },\n };\n bindRuntimeAccess(runtime, state);\n bindRuntimeDriver(runtime);\n notification = createNotification(runtime);\n bindDocumentReadable(history.api, runtime);\n return runtime;\n};\n","import type { ObjectNode } from '../schema';\nimport type { DocumentReadable, DocumentRuntime } from './contract';\nimport { accessOf, bindRuntimeAccess } from './access';\nimport { shareNotification } from './notification';\n\n// A readable capability keeps the canonical runtime behind an explicit\n// mutation funnel while remaining fully compatible with selectors, views, and\n// framework subscriptions.\nexport const asReadable = <TSchema extends ObjectNode>(\n runtime: DocumentRuntime<TSchema>\n): DocumentReadable<TSchema> => {\n const readable: DocumentReadable<TSchema> = {\n address: runtime.address,\n revision: runtime.revision,\n subscribe: runtime.subscribe,\n };\n bindRuntimeAccess(readable, accessOf(runtime));\n shareNotification(runtime, readable);\n return Object.freeze(readable);\n};\n","import type { ObjectNode } from '../schema';\nimport type { Read } from '../access/scope';\nimport type { DocumentReadable } from '../runtime/contract';\nimport { readWith } from '../runtime/access';\n\nexport type DocumentSelector<TSchema extends ObjectNode, TResult> = (\n read: Read<TSchema>\n) => TResult;\n\nexport const read = <TSchema extends ObjectNode, TResult>(\n runtime: DocumentReadable<TSchema>,\n selector: DocumentSelector<TSchema, TResult>\n): TResult => readWith(runtime, selector);\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
- import { $ as ObjectShape, D as snapshot, E as replace, F as ChangeSet, G as DocumentTreeNode, H as DocumentAnchor, I as MemberChange, K as DocumentTreeValue, L as ValueTransition, P as Change, Q as ObjectNode, S as DocumentImpact, T as Read, U as DocumentListConfig, V as DocumentAddress, W as DocumentNode, X as ListNode, Y as Infer, Z as MapNode, _ as Unsubscribe, _t as ParseError, a as DocumentDisposedError, at as TreeNode, b as MutationIssueCode, bt as parse, c as DocumentReentrancyError, ct as VariantShape, d as LocalHistory, dt as map, et as OptionalNode, f as ObserverError, ft as object, g as TransactionResult, gt as variant, h as TransactionRejected, ht as tree, i as DocumentDiagnostic, it as TableNode, l as DocumentRuntime, lt as field, mt as table, n as CommitSource, nt as ReadonlyValue, o as DocumentProblem, p as OperationResult, pt as optional, q as FieldNode, r as DocumentCommit, rt as SchemaPath, s as DocumentReadable, st as VariantNode, u as HistoryState, ut as list, v as Readable, vt as ParseIssue, w as Draft, x as CollectionImpact, y as MutationIssue, yt as Validator } from "./contract-DtGVSXSK.cjs";
2
- import { C as ProjectionDisposedError, S as project, _ as ProjectionSources, a as AdvancedCollectionSpec, b as ValueProjection, c as CollectionProjection, d as DocumentCollectionProjection, f as DocumentEvent, g as ProjectionEvents, h as Projection, i as AdvancedCollectionProcess, l as CollectionSource, m as InputProjection, n as createProjectionStore, o as AdvancedValueSpec, p as DocumentProjection, s as CollectionEvent, t as ProjectionStore, u as DocumentCollectionEvent, v as ProjectionValues, w as ProjectionError, x as input, y as ValueEvent } from "./store-CJuwJl_K.cjs";
1
+ import { $ as OptionalNode, B as DocumentAddress, C as Draft, E as snapshot, F as MemberChange, G as DocumentTreeValue, H as DocumentListConfig, I as ValueTransition, J as Infer, K as FieldNode, N as Change, P as ChangeSet, Q as ObjectShape, S as DocumentImpact, T as replace, U as DocumentNode, V as DocumentAnchor, W as DocumentTreeNode, X as MapNode, Y as ListNode, Z as ObjectNode, _ as Unsubscribe, _t as Validator, a as DocumentDisposedError, at as VariantNode, b as MutationIssueCode, c as DocumentReentrancyError, ct as list, d as LocalHistory, dt as optional, et as PathValueOf, f as ObserverError, ft as table, g as TransactionResult, gt as ParseIssue, h as TransactionRejected, ht as ParseError, i as DocumentDiagnostic, it as TreeNode, l as DocumentRuntime, lt as map, mt as variant, n as CommitSource, nt as SchemaPath, o as DocumentProblem, ot as VariantShape, p as OperationResult, pt as tree, r as DocumentCommit, rt as TableNode, s as DocumentReadable, st as field, tt as ReadonlyValue, u as HistoryState, ut as object, v as Readable, vt as parse, w as Read, x as CollectionImpact, y as MutationIssue } from "./contract-XmKnroJq.cjs";
2
+ import { a as derive, i as PublicCollection, m as ProjectionError, n as Projection, o as input, p as ProjectionDisposedError, r as ProjectionValues, s as observe, t as Input } from "./definition-kxnWUvX9.cjs";
3
+ import { r as createProjectionRuntime, t as ProjectionRuntime } from "./store-CDeqZEE3.cjs";
3
4
 
4
5
  //#region core/src/runtime.d.ts
5
6
  declare const createDocument: <S extends ObjectNode>(input: {
@@ -15,7 +16,7 @@ declare const asReadable: <TSchema extends ObjectNode>(runtime: DocumentRuntime<
15
16
  //#endregion
16
17
  //#region core/src/projection/select.d.ts
17
18
  type DocumentSelector<TSchema extends ObjectNode, TResult> = (read: Read<TSchema>) => TResult;
18
- declare const select: <TSchema extends ObjectNode, TResult>(runtime: DocumentReadable<TSchema>, selector: DocumentSelector<TSchema, TResult>) => TResult;
19
+ declare const read: <TSchema extends ObjectNode, TResult>(runtime: DocumentReadable<TSchema>, selector: DocumentSelector<TSchema, TResult>) => TResult;
19
20
  //#endregion
20
- export { type AdvancedCollectionProcess, type AdvancedCollectionSpec, type AdvancedValueSpec, type Change, type ChangeSet, type CollectionEvent, type CollectionImpact, type CollectionProjection, type CollectionSource, type CommitSource, type DocumentAddress, type DocumentAnchor, type DocumentCollectionEvent, type DocumentCollectionProjection, type DocumentCommit, type DocumentDiagnostic, DocumentDisposedError, type DocumentEvent, type DocumentImpact, type DocumentListConfig, type DocumentNode, type DocumentProblem, type DocumentProjection, type DocumentReadable, DocumentReentrancyError, type DocumentRuntime, type DocumentSelector, type DocumentTreeNode, type DocumentTreeValue, type Draft, type FieldNode, type HistoryState, type Infer, type InputProjection, type ListNode, type LocalHistory, type MapNode, type MemberChange, type MutationIssue, type MutationIssueCode, type ObjectNode, type ObjectShape, type ObserverError, type OperationResult, type OptionalNode, ParseError, type ParseIssue, type Projection, ProjectionDisposedError, ProjectionError, type ProjectionEvents, type ProjectionSources, type ProjectionStore, type ProjectionValues, type Read, type Readable, type ReadonlyValue, type SchemaPath, type TableNode, TransactionRejected, type TransactionResult, type TreeNode, type Unsubscribe, type Validator, type ValueEvent, type ValueProjection, type ValueTransition, type VariantNode, type VariantShape, asReadable, createDocument, createProjectionStore, field, input, list, map, object, optional, parse, project, replace, select, snapshot, table, tree, variant };
21
+ export { type Change, type ChangeSet, type CollectionImpact, type CommitSource, type DocumentAddress, type DocumentAnchor, type DocumentCommit, type DocumentDiagnostic, DocumentDisposedError, type DocumentImpact, type DocumentListConfig, type DocumentNode, type DocumentProblem, type DocumentReadable, DocumentReentrancyError, type DocumentRuntime, type DocumentSelector, type DocumentTreeNode, type DocumentTreeValue, type Draft, type FieldNode, type HistoryState, type Infer, type Input, type ListNode, type LocalHistory, type MapNode, type MemberChange, type MutationIssue, type MutationIssueCode, type ObjectNode, type ObjectShape, type ObserverError, type OperationResult, type OptionalNode, ParseError, type ParseIssue, type PathValueOf, type Projection, ProjectionDisposedError, ProjectionError, type ProjectionRuntime, type ProjectionValues, type PublicCollection, type Read, type Readable, type ReadonlyValue, type SchemaPath, type TableNode, TransactionRejected, type TransactionResult, type TreeNode, type Unsubscribe, type Validator, type ValueTransition, type VariantNode, type VariantShape, asReadable, createDocument, createProjectionRuntime, derive, field, input, list, map, object, observe, optional, parse, read, replace, snapshot, table, tree, variant };
21
22
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { $ as ObjectShape, D as snapshot, E as replace, F as ChangeSet, G as DocumentTreeNode, H as DocumentAnchor, I as MemberChange, K as DocumentTreeValue, L as ValueTransition, P as Change, Q as ObjectNode, S as DocumentImpact, T as Read, U as DocumentListConfig, V as DocumentAddress, W as DocumentNode, X as ListNode, Y as Infer, Z as MapNode, _ as Unsubscribe, _t as ParseError, a as DocumentDisposedError, at as TreeNode, b as MutationIssueCode, bt as parse, c as DocumentReentrancyError, ct as VariantShape, d as LocalHistory, dt as map, et as OptionalNode, f as ObserverError, ft as object, g as TransactionResult, gt as variant, h as TransactionRejected, ht as tree, i as DocumentDiagnostic, it as TableNode, l as DocumentRuntime, lt as field, mt as table, n as CommitSource, nt as ReadonlyValue, o as DocumentProblem, p as OperationResult, pt as optional, q as FieldNode, r as DocumentCommit, rt as SchemaPath, s as DocumentReadable, st as VariantNode, u as HistoryState, ut as list, v as Readable, vt as ParseIssue, w as Draft, x as CollectionImpact, y as MutationIssue, yt as Validator } from "./contract-CeAnEPBA.js";
2
- import { C as ProjectionDisposedError, S as project, _ as ProjectionSources, a as AdvancedCollectionSpec, b as ValueProjection, c as CollectionProjection, d as DocumentCollectionProjection, f as DocumentEvent, g as ProjectionEvents, h as Projection, i as AdvancedCollectionProcess, l as CollectionSource, m as InputProjection, n as createProjectionStore, o as AdvancedValueSpec, p as DocumentProjection, s as CollectionEvent, t as ProjectionStore, u as DocumentCollectionEvent, v as ProjectionValues, w as ProjectionError, x as input, y as ValueEvent } from "./store-Bs0C0rNd.js";
1
+ import { $ as OptionalNode, B as DocumentAddress, C as Draft, E as snapshot, F as MemberChange, G as DocumentTreeValue, H as DocumentListConfig, I as ValueTransition, J as Infer, K as FieldNode, N as Change, P as ChangeSet, Q as ObjectShape, S as DocumentImpact, T as replace, U as DocumentNode, V as DocumentAnchor, W as DocumentTreeNode, X as MapNode, Y as ListNode, Z as ObjectNode, _ as Unsubscribe, _t as Validator, a as DocumentDisposedError, at as VariantNode, b as MutationIssueCode, c as DocumentReentrancyError, ct as list, d as LocalHistory, dt as optional, et as PathValueOf, f as ObserverError, ft as table, g as TransactionResult, gt as ParseIssue, h as TransactionRejected, ht as ParseError, i as DocumentDiagnostic, it as TreeNode, l as DocumentRuntime, lt as map, mt as variant, n as CommitSource, nt as SchemaPath, o as DocumentProblem, ot as VariantShape, p as OperationResult, pt as tree, r as DocumentCommit, rt as TableNode, s as DocumentReadable, st as field, tt as ReadonlyValue, u as HistoryState, ut as object, v as Readable, vt as parse, w as Read, x as CollectionImpact, y as MutationIssue } from "./contract-BT53Gg94.js";
2
+ import { a as derive, i as PublicCollection, m as ProjectionError, n as Projection, o as input, p as ProjectionDisposedError, r as ProjectionValues, s as observe, t as Input } from "./definition-BlMeHwdz.js";
3
+ import { r as createProjectionRuntime, t as ProjectionRuntime } from "./store-P5dJ7TVe.js";
3
4
 
4
5
  //#region core/src/runtime.d.ts
5
6
  declare const createDocument: <S extends ObjectNode>(input: {
@@ -15,7 +16,7 @@ declare const asReadable: <TSchema extends ObjectNode>(runtime: DocumentRuntime<
15
16
  //#endregion
16
17
  //#region core/src/projection/select.d.ts
17
18
  type DocumentSelector<TSchema extends ObjectNode, TResult> = (read: Read<TSchema>) => TResult;
18
- declare const select: <TSchema extends ObjectNode, TResult>(runtime: DocumentReadable<TSchema>, selector: DocumentSelector<TSchema, TResult>) => TResult;
19
+ declare const read: <TSchema extends ObjectNode, TResult>(runtime: DocumentReadable<TSchema>, selector: DocumentSelector<TSchema, TResult>) => TResult;
19
20
  //#endregion
20
- export { type AdvancedCollectionProcess, type AdvancedCollectionSpec, type AdvancedValueSpec, type Change, type ChangeSet, type CollectionEvent, type CollectionImpact, type CollectionProjection, type CollectionSource, type CommitSource, type DocumentAddress, type DocumentAnchor, type DocumentCollectionEvent, type DocumentCollectionProjection, type DocumentCommit, type DocumentDiagnostic, DocumentDisposedError, type DocumentEvent, type DocumentImpact, type DocumentListConfig, type DocumentNode, type DocumentProblem, type DocumentProjection, type DocumentReadable, DocumentReentrancyError, type DocumentRuntime, type DocumentSelector, type DocumentTreeNode, type DocumentTreeValue, type Draft, type FieldNode, type HistoryState, type Infer, type InputProjection, type ListNode, type LocalHistory, type MapNode, type MemberChange, type MutationIssue, type MutationIssueCode, type ObjectNode, type ObjectShape, type ObserverError, type OperationResult, type OptionalNode, ParseError, type ParseIssue, type Projection, ProjectionDisposedError, ProjectionError, type ProjectionEvents, type ProjectionSources, type ProjectionStore, type ProjectionValues, type Read, type Readable, type ReadonlyValue, type SchemaPath, type TableNode, TransactionRejected, type TransactionResult, type TreeNode, type Unsubscribe, type Validator, type ValueEvent, type ValueProjection, type ValueTransition, type VariantNode, type VariantShape, asReadable, createDocument, createProjectionStore, field, input, list, map, object, optional, parse, project, replace, select, snapshot, table, tree, variant };
21
+ export { type Change, type ChangeSet, type CollectionImpact, type CommitSource, type DocumentAddress, type DocumentAnchor, type DocumentCommit, type DocumentDiagnostic, DocumentDisposedError, type DocumentImpact, type DocumentListConfig, type DocumentNode, type DocumentProblem, type DocumentReadable, DocumentReentrancyError, type DocumentRuntime, type DocumentSelector, type DocumentTreeNode, type DocumentTreeValue, type Draft, type FieldNode, type HistoryState, type Infer, type Input, type ListNode, type LocalHistory, type MapNode, type MemberChange, type MutationIssue, type MutationIssueCode, type ObjectNode, type ObjectShape, type ObserverError, type OperationResult, type OptionalNode, ParseError, type ParseIssue, type PathValueOf, type Projection, ProjectionDisposedError, ProjectionError, type ProjectionRuntime, type ProjectionValues, type PublicCollection, type Read, type Readable, type ReadonlyValue, type SchemaPath, type TableNode, TransactionRejected, type TransactionResult, type TreeNode, type Unsubscribe, type Validator, type ValueTransition, type VariantNode, type VariantShape, asReadable, createDocument, createProjectionRuntime, derive, field, input, list, map, object, observe, optional, parse, read, replace, snapshot, table, tree, variant };
21
22
  //# sourceMappingURL=index.d.ts.map