doxum 0.1.21 → 0.1.22

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 (65) hide show
  1. package/README.md +21 -2
  2. package/dist/{access-BeSV5ve-.js → access-CZXv_DIF.js} +179 -37
  3. package/dist/access-CZXv_DIF.js.map +1 -0
  4. package/dist/{access-Bienf28h.cjs → access-D64MFRSm.cjs} +228 -38
  5. package/dist/access-D64MFRSm.cjs.map +1 -0
  6. package/dist/{advanced-COFJtWMT.js → advanced-BTStm2cW.js} +29 -25
  7. package/dist/advanced-BTStm2cW.js.map +1 -0
  8. package/dist/{advanced-FgdTwu5b.d.ts → advanced-CqrR_4dh.d.ts} +3 -3
  9. package/dist/{advanced-DfKc7TZR.d.cts → advanced-CyR5o3Xr.d.cts} +3 -3
  10. package/dist/{advanced-BRL5pN0y.cjs → advanced-GKZ-CZ6a.cjs} +29 -25
  11. package/dist/advanced-GKZ-CZ6a.cjs.map +1 -0
  12. package/dist/advanced.cjs +1 -1
  13. package/dist/advanced.d.cts +1 -1
  14. package/dist/advanced.d.ts +1 -1
  15. package/dist/advanced.js +1 -1
  16. package/dist/{contract-KG5XnQZt.d.ts → contract-CRrZ-3sF.d.cts} +64 -34
  17. package/dist/{contract-CdmDHRUq.d.cts → contract-CxiNcqMn.d.ts} +64 -34
  18. package/dist/{driver-Djr3BVvo.cjs → driver-BC06FEMF.cjs} +2 -2
  19. package/dist/{driver-Djr3BVvo.cjs.map → driver-BC06FEMF.cjs.map} +1 -1
  20. package/dist/{driver-CLYJOGDQ.js → driver-BqRjwFmU.js} +2 -2
  21. package/dist/{driver-CLYJOGDQ.js.map → driver-BqRjwFmU.js.map} +1 -1
  22. package/dist/index.cjs +480 -117
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +2 -2
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +478 -115
  27. package/dist/index.js.map +1 -1
  28. package/dist/{integration-Z6MsfFI7.cjs → integration-BqDw7e2w.cjs} +3 -4
  29. package/dist/{integration-Z6MsfFI7.cjs.map → integration-BqDw7e2w.cjs.map} +1 -1
  30. package/dist/{integration-C4Isp8lJ.js → integration-CSXaF8HP.js} +2 -3
  31. package/dist/{integration-C4Isp8lJ.js.map → integration-CSXaF8HP.js.map} +1 -1
  32. package/dist/integration.cjs +5 -4
  33. package/dist/integration.d.cts +1 -1
  34. package/dist/integration.d.ts +1 -1
  35. package/dist/integration.js +4 -3
  36. package/dist/{issue-W0hT8u8D.js → issue-9U6YLYz3.js} +11 -6
  37. package/dist/issue-9U6YLYz3.js.map +1 -0
  38. package/dist/{issue-DjK1xp5K.cjs → issue-Bo0FIO3b.cjs} +11 -6
  39. package/dist/issue-Bo0FIO3b.cjs.map +1 -0
  40. package/dist/local-sync.cjs +2 -2
  41. package/dist/local-sync.d.cts +1 -1
  42. package/dist/local-sync.d.ts +1 -1
  43. package/dist/local-sync.js +2 -2
  44. package/dist/{notification-Bkjau6B6.js → notification-CrZHVx3a.js} +3 -59
  45. package/dist/notification-CrZHVx3a.js.map +1 -0
  46. package/dist/{notification-DJfouMEb.cjs → notification-DFoA9bQY.cjs} +3 -77
  47. package/dist/notification-DFoA9bQY.cjs.map +1 -0
  48. package/dist/react.cjs +4 -3
  49. package/dist/react.cjs.map +1 -1
  50. package/dist/react.js +3 -2
  51. package/dist/react.js.map +1 -1
  52. package/package.json +1 -1
  53. package/skills/doxum-runtime/SKILL.md +5 -0
  54. package/skills/doxum-runtime/references/guide.en.md +9 -0
  55. package/skills/doxum-runtime/references/guide.zh-CN.md +8 -0
  56. package/skills/doxum-runtime/references/projections.en.md +5 -0
  57. package/skills/doxum-runtime/references/projections.zh-CN.md +5 -0
  58. package/dist/access-BeSV5ve-.js.map +0 -1
  59. package/dist/access-Bienf28h.cjs.map +0 -1
  60. package/dist/advanced-BRL5pN0y.cjs.map +0 -1
  61. package/dist/advanced-COFJtWMT.js.map +0 -1
  62. package/dist/issue-DjK1xp5K.cjs.map +0 -1
  63. package/dist/issue-W0hT8u8D.js.map +0 -1
  64. package/dist/notification-Bkjau6B6.js.map +0 -1
  65. package/dist/notification-DJfouMEb.cjs.map +0 -1
package/README.md CHANGED
@@ -116,6 +116,12 @@ Doxum; it does not detect validator mutation or conversion. `parse(model, unknow
116
116
  validates and copies schema structure while sharing readonly payloads. Strict parsing
117
117
  requires validators for atomic fields; typed in-memory fields can omit them.
118
118
 
119
+ A tree may be empty, but payload presence follows the payload field schema exactly.
120
+ `tree(field<T>())` requires every existing node to own a `value` property;
121
+ `tree(optional(field<T>()))` is the explicit sparse-payload form. This is independent
122
+ from `optional(tree(...))`, which controls whether the whole tree member may be absent.
123
+ Missing and present-`undefined` payloads remain distinct when the payload field is optional.
124
+
119
125
  Ordered table/list drafts accept either one key or a key selection in
120
126
  `move(key | readonly key[], anchor?)`. A selection is moved as one block while
121
127
  preserving its current canonical relative order; the anchor is resolved after the
@@ -277,8 +283,21 @@ runtime.update(overrides, draft => {
277
283
  and eventful external sources. External sources declare `kind: 'value'` or
278
284
  `kind: 'collection'`; collection invalidation remains keyed internally. Schema
279
285
  `map`, `table`, and `list(field, { keyOf })` paths are all observed as keyed
280
- collection projections. A schema `list` uses its `keyOf` identity and publishes
281
- in document order; ordinary array-valued `field(...)` nodes remain scalar values.
286
+ collection projections. Trees expose structural observation without a second
287
+ projection protocol: `path.tree.rootId` is a scalar source,
288
+ `path.tree.nodes` is a keyed collection source, and
289
+ `path.tree.nodes.item(id)` is a single-node value source. A schema `list` uses its
290
+ `keyOf` identity and publishes in document order; ordinary array-valued `field(...)`
291
+ nodes remain scalar values.
292
+
293
+ Document projection sources route committed groups directly to their observed
294
+ targets, merge affected locations for the current projection batch, then combine the
295
+ previously published snapshot with the canonical final value. A touched tree node
296
+ replaces only that node structure and the necessary ancestor containers; unchanged
297
+ tree-node snapshots keep their identity. Whole aggregate tree values still use the
298
+ public `{ rootId?, nodes: Record }` shape, so changing a node may shallow-copy the
299
+ `nodes` record, while native `tree.nodes` observation remains keyed and touches only
300
+ changed nodes.
282
301
 
283
302
  For retained state, reverse indexes and keyed patches, use the isolated advanced
284
303
  entry point. Whole-value processors use `incremental(...)`; keyed collection
@@ -1,4 +1,4 @@
1
- import { B as profile, C as validate, D as index, E as equal, F as matches, I as moveSelection, M as installList, N as keys, O as indexedKeys, P as listSequence, T as isRecord, a as compiledShape, b as contains, g as resolveLocated, j as installKeys, k as insert$2, m as resolveChild, n as fail, u as nodeAt, w as isPlainObject, x as parent, y as children, z as valid } from "./issue-W0hT8u8D.js";
1
+ import { B as profile, C as validate, D as index, E as equal, F as matches, I as moveSelection, M as installList, N as keys, O as indexedKeys, P as listSequence, T as isRecord, a as compiledShape, b as contains, g as resolveLocated, i as AddressIndex, j as installKeys, k as insert$2, m as resolveChild, n as fail, u as nodeAt, w as isPlainObject, x as parent, y as children, z as valid } from "./issue-9U6YLYz3.js";
2
2
  //#region core/src/schema-value.ts
3
3
  var ParseError = class extends TypeError {
4
4
  issues;
@@ -103,14 +103,29 @@ const checkValue = (node, value, address = [], strict = false) => {
103
103
  return;
104
104
  }
105
105
  if (!validate(value)) return issue(address, "Invalid tree structure.", "invalid-tree");
106
- if (isRecord(value) && isRecord(value.nodes)) for (const id of Object.keys(value.nodes)) {
107
- const entry = value.nodes[id];
108
- if (isRecord(entry) && Object.prototype.hasOwnProperty.call(entry, "value")) {
109
- const failure = checkValue(node.value, entry.value, [...address, id], strict);
110
- if (failure) return failure;
111
- }
106
+ for (const id of Object.keys(value.nodes)) {
107
+ const failure = checkTreePayload(node.value, value.nodes[id], [...address, id], strict);
108
+ if (failure) return failure;
112
109
  }
113
110
  };
111
+ const checkTreePayload = (node, value, address, strict = false) => {
112
+ if (!isRecord(value)) return issue(address, "Invalid tree node.", "invalid-tree");
113
+ const present = Object.prototype.hasOwnProperty.call(value, "value");
114
+ if (!present && !node.optional) return issue(address, "Tree node value is required.");
115
+ return present ? checkValue(node, value.value, address, strict) : void 0;
116
+ };
117
+ const copyTreeNode = (value) => {
118
+ profile.copy.treeNode();
119
+ return {
120
+ ...value,
121
+ children: [...value.children]
122
+ };
123
+ };
124
+ const equalTreeNode = (left, right) => {
125
+ if (left === right) return true;
126
+ if (!left || !right) return false;
127
+ return left.parentId === right.parentId && equal(left.children, right.children) && Object.hasOwn(left, "value") === Object.hasOwn(right, "value") && Object.is(left.value, right.value);
128
+ };
114
129
  /** Copy editable structure; atomic payloads retain their immutable ownership contract. */
115
130
  const copyValue = (node, value) => {
116
131
  if (value === void 0 || node.kind === "field") return value;
@@ -139,10 +154,7 @@ const copyValue = (node, value) => {
139
154
  const entries = value.nodes;
140
155
  return {
141
156
  ...value,
142
- nodes: Object.fromEntries(Object.entries(entries).map(([id, n]) => [id, {
143
- ...n,
144
- children: [...n.children]
145
- }]))
157
+ nodes: Object.fromEntries(Object.entries(entries).map(([id, n]) => [id, copyTreeNode(n)]))
146
158
  };
147
159
  }
148
160
  return value;
@@ -166,7 +178,7 @@ const equalValue = (node, left, right) => {
166
178
  if (node.kind === "tree" && isRecord(left) && isRecord(right)) {
167
179
  if (left.rootId !== right.rootId) return false;
168
180
  const a = left.nodes, b = right.nodes;
169
- return Object.keys(a).length === Object.keys(b).length && Object.keys(a).every((id) => Object.hasOwn(b, id) && a[id].parentId === b[id].parentId && equal(a[id].children, b[id].children) && Object.hasOwn(a[id], "value") === Object.hasOwn(b[id], "value") && equalValue(node.value, a[id].value, b[id].value));
181
+ return Object.keys(a).length === Object.keys(b).length && Object.keys(a).every((id) => Object.hasOwn(b, id) && equalTreeNode(a[id], b[id]));
170
182
  }
171
183
  if (node.kind === "map" && isRecord(left) && isRecord(right)) {
172
184
  const keys = Object.keys(left);
@@ -391,6 +403,132 @@ function reorder(session, container, next) {
391
403
  session.invalidate();
392
404
  }
393
405
  //#endregion
406
+ //#region core/src/impact-target.ts
407
+ const treeRootSegment = "rootId";
408
+ const treeNodesSegment = "nodes";
409
+ const ordinaryNamespace = "\0value";
410
+ const treeNamespace = "\0tree";
411
+ const tree = (at, selection) => ({
412
+ kind: "value",
413
+ at,
414
+ tree: selection
415
+ });
416
+ const address = (target) => "at" in target ? target.at : target.address;
417
+ const id = (target) => target.kind === "collection" && "id" in target ? target.id : void 0;
418
+ const belongs = (target, schema) => !("schema" in target) || target.schema === schema;
419
+ const treeTarget = (target) => "tree" in target ? target.tree : void 0;
420
+ const sameTreeTarget = (left, right) => {
421
+ if (!left || !right) return left === right;
422
+ if (left.kind !== right.kind) return false;
423
+ return left.kind !== "node" || right.kind === "node" && left.id === right.id;
424
+ };
425
+ const same = (left, right) => {
426
+ if ("schema" in left && "schema" in right && left.schema !== right.schema) return false;
427
+ if (!sameTreeTarget(treeTarget(left), treeTarget(right))) return false;
428
+ if (left.kind !== right.kind) return false;
429
+ const leftAddress = address(left);
430
+ const rightAddress = address(right);
431
+ if (leftAddress.length !== rightAddress.length) return false;
432
+ for (let index = 0; index < leftAddress.length; index += 1) if (leftAddress[index] !== rightAddress[index]) return false;
433
+ return left.kind !== "collection" || id(left) === id(right);
434
+ };
435
+ const indexedAddress = (target) => {
436
+ const tree = treeTarget(target);
437
+ if (tree?.kind === "root") return [
438
+ treeNamespace,
439
+ ...address(target),
440
+ treeRootSegment
441
+ ];
442
+ if (tree?.kind === "nodes") return [
443
+ treeNamespace,
444
+ ...address(target),
445
+ treeNodesSegment
446
+ ];
447
+ if (tree?.kind === "node") return [
448
+ treeNamespace,
449
+ ...address(target),
450
+ treeNodesSegment,
451
+ tree.id
452
+ ];
453
+ const key = id(target);
454
+ return key === void 0 ? [ordinaryNamespace, ...address(target)] : [
455
+ ordinaryNamespace,
456
+ ...address(target),
457
+ key
458
+ ];
459
+ };
460
+ const visitChangedLocations = (changes, value, order) => {
461
+ for (const change of changes.changes) {
462
+ if (change.kind === "reset") continue;
463
+ if (change.kind === "members") {
464
+ for (const member of change.members) {
465
+ value([
466
+ ordinaryNamespace,
467
+ ...change.at,
468
+ member.key
469
+ ]);
470
+ value([
471
+ treeNamespace,
472
+ ...change.at,
473
+ member.key
474
+ ]);
475
+ }
476
+ if (change.order) order([ordinaryNamespace, ...change.at]);
477
+ continue;
478
+ }
479
+ value([ordinaryNamespace, ...change.at]);
480
+ if (change.before !== change.after) value([
481
+ treeNamespace,
482
+ ...change.at,
483
+ treeRootSegment
484
+ ]);
485
+ for (const node of change.nodes) value([
486
+ treeNamespace,
487
+ ...change.at,
488
+ treeNodesSegment,
489
+ node.id
490
+ ]);
491
+ }
492
+ };
493
+ const affected = (target, values, orders) => {
494
+ const at = indexedAddress(target);
495
+ return id(target) !== void 0 ? values.hasAncestor(at) : values.overlaps(at) || orders.hasDescendant(at);
496
+ };
497
+ /** Targets are classified once; commit matching never builds a reverse impact index. */
498
+ var SubscriptionIndex = class {
499
+ ordinary = new AddressIndex();
500
+ membership = new AddressIndex();
501
+ constructor(schema) {
502
+ this.schema = schema;
503
+ }
504
+ add(target, value) {
505
+ if (!belongs(target, this.schema)) return;
506
+ (id(target) === void 0 ? this.ordinary : this.membership).add(indexedAddress(target), value);
507
+ }
508
+ delete(target, value) {
509
+ if (!belongs(target, this.schema)) return;
510
+ (id(target) === void 0 ? this.ordinary : this.membership).delete(indexedAddress(target), value);
511
+ }
512
+ collect(changes, visit) {
513
+ const values = this.ordinary.query(visit);
514
+ const members = this.membership.query(visit, "descendants");
515
+ const orders = this.ordinary.query(visit, "ancestors");
516
+ if (changes.changes.some((change) => change.kind === "reset")) {
517
+ values([]);
518
+ members([]);
519
+ return;
520
+ }
521
+ visitChangedLocations(changes, (at) => {
522
+ values(at);
523
+ members(at);
524
+ }, orders);
525
+ }
526
+ clear() {
527
+ this.ordinary.clear();
528
+ this.membership.clear();
529
+ }
530
+ };
531
+ //#endregion
394
532
  //#region core/src/access/scope.ts
395
533
  const locations = /* @__PURE__ */ new WeakMap();
396
534
  const locationOf = (value) => locations.get(value);
@@ -412,6 +550,7 @@ const collect = (context, at, kind = "value", id) => {
412
550
  ...id === void 0 ? {} : { id }
413
551
  });
414
552
  };
553
+ const collectTree = (context, at, selection) => context.dependencies?.record(tree(at, selection));
415
554
  const snapshot = (value) => {
416
555
  const location = value && typeof value === "object" ? locationOf(value) : void 0;
417
556
  if (!location) return value;
@@ -650,18 +789,38 @@ const createAccess = (context, initial = []) => {
650
789
  const writable = writableTree(target, node);
651
790
  replace$1(context.session, writable, valueOrId, value);
652
791
  };
653
- const current = () => {
654
- collect(context, at);
655
- return collectionValue(target, node);
792
+ const current = () => collectionValue(target, node);
793
+ if (property === "rootId") return () => {
794
+ collectTree(context, at, { kind: "root" });
795
+ return current().rootId;
656
796
  };
657
- if (property === "rootId") return () => current().rootId;
658
797
  if (property === "get") return (id) => {
798
+ collectTree(context, at, {
799
+ kind: "node",
800
+ id
801
+ });
659
802
  const value = current();
660
803
  return contains(value, id) ? value.nodes[id].value : void 0;
661
804
  };
662
- if (property === "has") return (id) => contains(current(), id);
663
- if (property === "parent") return (id) => parent(current(), id);
805
+ if (property === "has") return (id) => {
806
+ collectTree(context, at, {
807
+ kind: "node",
808
+ id
809
+ });
810
+ return contains(current(), id);
811
+ };
812
+ if (property === "parent") return (id) => {
813
+ collectTree(context, at, {
814
+ kind: "node",
815
+ id
816
+ });
817
+ return parent(current(), id);
818
+ };
664
819
  if (property === "children") return (id) => {
820
+ collectTree(context, at, {
821
+ kind: "node",
822
+ id
823
+ });
665
824
  const children$1 = children(current(), id);
666
825
  return children$1 ? [...children$1] : void 0;
667
826
  };
@@ -741,23 +900,6 @@ const createAccess = (context, initial = []) => {
741
900
  }
742
901
  return access(root);
743
902
  };
744
- const collectionAccess = (context, at) => {
745
- const value = createAccess(context, at);
746
- if (value === void 0) return {
747
- get: () => {
748
- assertActive(context);
749
- },
750
- has: () => {
751
- assertActive(context);
752
- return false;
753
- },
754
- ids: () => {
755
- assertActive(context);
756
- return [];
757
- }
758
- };
759
- return value;
760
- };
761
903
  //#endregion
762
904
  //#region core/src/runtime/contract.ts
763
905
  var DocumentReentrancyError = class extends Error {
@@ -811,6 +953,6 @@ const readWith = (runtime, run, dependencies) => {
811
953
  }
812
954
  };
813
955
  //#endregion
814
- export { DocumentReentrancyError as a, createAccess as c, ParseError as d, checkKey as f, parse as g, equalValue as h, DocumentDisposedError as i, replace as l, copyValue as m, bindRuntimeAccess as n, TransactionRejected as o, checkValue as p, readWith as r, collectionAccess as s, accessOf as t, snapshot as u };
956
+ export { equalValue as C, equalTreeNode as S, checkKey as _, DocumentReentrancyError as a, copyTreeNode as b, replace as c, affected as d, belongs as f, ParseError as g, visitChangedLocations as h, DocumentDisposedError as i, snapshot as l, same as m, bindRuntimeAccess as n, TransactionRejected as o, indexedAddress as p, readWith as r, createAccess as s, accessOf as t, SubscriptionIndex as u, checkTreePayload as v, parse as w, copyValue as x, checkValue as y };
815
957
 
816
- //# sourceMappingURL=access-BeSV5ve-.js.map
958
+ //# sourceMappingURL=access-CZXv_DIF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-CZXv_DIF.js","names":["anchor.keys","validTree","anchor.equal","remove","anchor.valid","index","anchor.index","remove","replace","insert","keys","anchor.keys","anchor.valid","anchor.index","replace","anchor.indexedKeys","remove","replace","move","anchor.moveSelection","anchor.equal","anchor.listSequence","anchor.matches","impactTarget.tree","anchor.indexedKeys","tree.contains","tree.parent","children","tree.children"],"sources":["../core/src/schema-value.ts","../core/src/mutation/operations/map.ts","../core/src/mutation/operations/table.ts","../core/src/mutation/operations/list.ts","../core/src/mutation/operations/tree.ts","../core/src/mutation/operations/order.ts","../core/src/impact-target.ts","../core/src/access/scope.ts","../core/src/runtime/contract.ts","../core/src/runtime/access.ts"],"sourcesContent":["import type { DocumentAddress, DocumentNode, DocumentTreeNode, FieldNode, Infer } from './schema';\nimport { compiledShape } from './address';\nimport { isPlainObject, isRecord } from './value/ownership';\nimport { validate as validTree } from './mutation/tree';\nimport * as anchor from './mutation/anchor';\nimport { profile } from './profile';\n\n/** Pure synchronous validation. Successful output is ignored; input is never transformed. */\nexport type Validator<T> =\n | ((value: unknown) => T)\n | {\n readonly '~standard': {\n readonly version: 1;\n readonly vendor: string;\n readonly types?: { readonly input: unknown; readonly output: T };\n validate(value: unknown):\n | { readonly value: T; readonly issues?: undefined }\n | {\n readonly issues: readonly {\n readonly message: string;\n readonly path?: readonly (PropertyKey | { readonly key: PropertyKey })[];\n }[];\n }\n | PromiseLike<unknown>;\n };\n };\n\nexport type ParseIssue = {\n readonly address: DocumentAddress;\n readonly code: 'invalid-value' | 'invalid-key' | 'missing-validator' | 'invalid-tree';\n readonly message: string;\n};\nexport class ParseError extends TypeError {\n readonly issues: readonly ParseIssue[];\n constructor(issue: ParseIssue) {\n super(`${issue.message} at ${JSON.stringify(issue.address)}`);\n this.name = 'ParseError';\n this.issues = Object.freeze([\n Object.freeze({ ...issue, address: Object.freeze([...issue.address]) }),\n ]);\n }\n}\n\nconst issue = (\n address: DocumentAddress,\n message: string,\n code: ParseIssue['code'] = 'invalid-value'\n): ParseIssue => ({ address, message, code });\n\nexport const checkScalar = (\n validator: Validator<unknown> | undefined,\n value: unknown,\n address: DocumentAddress,\n strict: boolean\n): ParseIssue | undefined => {\n if (!validator)\n return strict\n ? issue(address, 'A validator is required to parse an opaque value.', 'missing-validator')\n : undefined;\n try {\n const result =\n typeof validator === 'function' ? validator(value) : validator['~standard'].validate(value);\n if (\n result &&\n (typeof result === 'object' || typeof result === 'function') &&\n 'then' in result &&\n typeof result.then === 'function'\n )\n return issue(address, 'Validators must be synchronous.');\n if (typeof validator !== 'function') {\n if (!isRecord(result)) return issue(address, 'Malformed validator result.');\n if (Array.isArray(result.issues)) {\n const first = result.issues[0];\n return issue(\n [\n ...address,\n ...(first?.path ?? []).map((part: PropertyKey | { key: PropertyKey }) =>\n String(typeof part === 'object' ? part.key : part)\n ),\n ],\n first?.message ?? 'Value validation failed.'\n );\n }\n if (!Object.hasOwn(result, 'value')) return issue(address, 'Malformed validator result.');\n }\n return undefined;\n } catch (error) {\n return issue(address, error instanceof Error ? error.message : 'Value validation failed.');\n }\n};\n\nexport const checkKey = (\n validator: Validator<string> | undefined,\n value: unknown,\n address: DocumentAddress\n): ParseIssue | undefined => {\n if (typeof value !== 'string')\n return issue(address, 'Collection keys must be strings.', 'invalid-key');\n const failure = checkScalar(validator, value, address, false);\n return failure ? { ...failure, code: 'invalid-key' } : undefined;\n};\n\nexport const checkValue = (\n node: DocumentNode,\n value: unknown,\n address: DocumentAddress = [],\n strict = false\n): ParseIssue | undefined => {\n if (node.optional && value === undefined) return undefined;\n if (node.kind === 'field') return checkScalar(node.validator, value, address, strict);\n if (node.kind === 'object' || node.kind === 'variant') {\n if (!isPlainObject(value)) return issue(address, 'Expected an object.');\n if (node.kind === 'variant') {\n const tag = value[node.tag];\n if (\n !Object.hasOwn(value, node.tag) ||\n typeof tag !== 'string' ||\n !Object.hasOwn(node.variants, tag)\n )\n return issue([...address, node.tag], 'Unknown variant tag.');\n }\n const { members } = compiledShape(node, value)!;\n for (const key of Reflect.ownKeys(value)) {\n if (node.kind === 'variant' && key === node.tag) continue;\n if (typeof key !== 'string' || !members.has(key))\n return issue([...address, String(key)], 'Property is not declared in the object schema.');\n }\n for (const [key, member] of members) {\n const child = member.node;\n if (!Object.prototype.hasOwnProperty.call(value, key) && !child.optional)\n return issue([...address, key], 'Required property is missing.');\n const failure = checkValue(child, value[key], [...address, key], strict);\n if (failure) return failure;\n }\n return undefined;\n }\n if (node.kind === 'table' || node.kind === 'map') {\n if (!isPlainObject(value)) return issue(address, 'Expected a collection object.');\n const entries = node.kind === 'table' ? value.byId : value;\n if (!isPlainObject(entries)) return issue(address, 'Expected a byId object.');\n if (node.kind === 'table') {\n if (!Array.isArray(value.ids) || value.ids.length !== Object.keys(entries).length)\n return issue(address, 'Table ids and entries must agree.');\n const seen = new Set<string>();\n for (const id of value.ids) {\n const failure = checkKey(node.key, id, address);\n if (failure) return failure;\n if (seen.has(id) || !Object.prototype.hasOwnProperty.call(entries, id))\n return issue(address, 'Table ids must be unique and reference existing entries.');\n seen.add(id);\n }\n }\n for (const id of Object.keys(entries)) {\n const failure =\n checkKey(node.key, id, [...address, id]) ??\n checkValue(node.value, entries[id], [...address, id], strict);\n if (failure) return failure;\n }\n return undefined;\n }\n if (node.kind === 'list') {\n if (!Array.isArray(value)) return issue(address, 'Expected a list.');\n const seen = new Set<string>();\n const order = anchor.keys(value, node.keyOf);\n for (let i = 0; i < value.length; i++) {\n const failure = checkValue(node.value, value[i], [...address, String(i)], strict);\n if (failure) return failure;\n let key: unknown;\n try {\n key = order.at(i);\n } catch {\n return issue(address, 'List keyOf failed.');\n }\n if (typeof key !== 'string' || seen.has(key))\n return issue(address, 'List keys must be unique strings.', 'invalid-key');\n seen.add(key);\n }\n return undefined;\n }\n if (!validTree(value)) return issue(address, 'Invalid tree structure.', 'invalid-tree');\n for (const id of Object.keys(value.nodes)) {\n const failure = checkTreePayload(node.value, value.nodes[id], [...address, id], strict);\n if (failure) return failure;\n }\n return undefined;\n};\n\nexport const checkTreePayload = (\n node: FieldNode<unknown, boolean>,\n value: unknown,\n address: DocumentAddress,\n strict = false\n): ParseIssue | undefined => {\n if (!isRecord(value)) return issue(address, 'Invalid tree node.', 'invalid-tree');\n const present = Object.prototype.hasOwnProperty.call(value, 'value');\n if (!present && !node.optional) return issue(address, 'Tree node value is required.');\n return present ? checkValue(node, value.value, address, strict) : undefined;\n};\n\nexport const copyTreeNode = <T extends { readonly children: readonly string[] }>(\n value: T\n): Omit<T, 'children'> & { children: string[] } => {\n profile.copy.treeNode();\n return { ...value, children: [...value.children] };\n};\n\nexport const equalTreeNode = (\n left: DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true> | undefined,\n right: DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true> | undefined\n): boolean => {\n if (left === right) return true;\n if (!left || !right) return false;\n return (\n left.parentId === right.parentId &&\n anchor.equal(left.children, right.children) &&\n Object.hasOwn(left, 'value') === Object.hasOwn(right, 'value') &&\n Object.is(left.value, right.value)\n );\n};\n\n/** Copy editable structure; atomic payloads retain their immutable ownership contract. */\nexport const copyValue = (node: DocumentNode, value: unknown): unknown => {\n if (value === undefined || node.kind === 'field') return value;\n profile.copy.structure();\n if ((node.kind === 'object' || node.kind === 'variant') && isRecord(value)) {\n const result = Object.create(Object.getPrototypeOf(value));\n const { members } = compiledShape(node, value)!;\n for (const key of Object.getOwnPropertyNames(value)) {\n Object.defineProperty(result, key, {\n value:\n node.kind === 'variant' && key === node.tag\n ? value[key]\n : copyValue(members.get(key)!.node, value[key]),\n writable: true,\n enumerable: Object.getOwnPropertyDescriptor(value, key)?.enumerable,\n configurable: true,\n });\n }\n return result;\n }\n if ((node.kind === 'table' || node.kind === 'map') && isRecord(value)) {\n const entries = (node.kind === 'table' ? value.byId : value) as Record<string, unknown>;\n const result = Object.fromEntries(\n Object.keys(entries).map(id => [id, copyValue(node.value, entries[id])])\n );\n return node.kind === 'table' ? { ids: [...(value.ids as string[])], byId: result } : result;\n }\n if (node.kind === 'list') return [...(value as unknown[])];\n if (node.kind === 'tree' && isRecord(value)) {\n const entries = value.nodes as Record<\n string,\n DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>\n >;\n return {\n ...value,\n nodes: Object.fromEntries(Object.entries(entries).map(([id, n]) => [id, copyTreeNode(n)])),\n };\n }\n return value;\n};\n\nexport const equalValue = (node: DocumentNode, left: unknown, right: unknown): boolean => {\n if (Object.is(left, right)) return true;\n if (node.kind === 'field' || left === undefined || right === undefined) return false;\n if ((node.kind === 'object' || node.kind === 'variant') && isRecord(left) && isRecord(right)) {\n if (node.kind === 'variant' && left[node.tag] !== right[node.tag]) return false;\n for (const [key, member] of compiledShape(node, left)!.members) {\n if (Object.hasOwn(left, key) !== Object.hasOwn(right, key)) return false;\n if (!equalValue(member.node, left[key], right[key])) return false;\n }\n return true;\n }\n if (node.kind === 'list' && Array.isArray(left) && Array.isArray(right))\n return (\n left.length === right.length && left.every((v, i) => equalValue(node.value, v, right[i]))\n );\n if (node.kind === 'table' && isRecord(left) && isRecord(right))\n return (\n anchor.equal(left.ids as string[], right.ids as string[]) &&\n equalValue({ kind: 'map', value: node.value }, left.byId, right.byId)\n );\n if (node.kind === 'tree' && isRecord(left) && isRecord(right)) {\n if (left.rootId !== right.rootId) return false;\n const a = left.nodes as Record<\n string,\n DocumentTreeNode<unknown, false> | DocumentTreeNode<unknown, true>\n >,\n b = right.nodes as typeof a;\n return (\n Object.keys(a).length === Object.keys(b).length &&\n Object.keys(a).every(id => Object.hasOwn(b, id) && equalTreeNode(a[id], b[id]))\n );\n }\n if (node.kind === 'map' && isRecord(left) && isRecord(right)) {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every(key => Object.hasOwn(right, key) && equalValue(node.value, left[key], right[key]))\n );\n }\n return false;\n};\n\nexport const parse = <N extends DocumentNode>(node: N, input: unknown): Infer<N> => {\n const valueNode: DocumentNode = node;\n const failure = checkValue(valueNode, input, [], true);\n if (failure) throw new ParseError(failure);\n return copyValue(valueNode, input) as Infer<N>;\n};\n","import type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address';\nimport { fail } from '../issue';\n\nexport function put(\n session: MutationSession,\n container: ResolvedContainer,\n id: string,\n value: unknown\n): void {\n if (container.node.kind !== 'map')\n return fail(container.at, 'invalid-collection', 'Expected a map.');\n session.writeMember(container, id, value, 'set');\n}\n\nexport function remove(session: MutationSession, container: ResolvedContainer, id: string): void {\n if (container.node.kind !== 'map')\n return fail(container.at, 'invalid-collection', 'Expected a map.');\n session.writeMember(container, id, undefined, 'remove');\n}\n","import type { DocumentAnchor } from '../../schema';\nimport type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address';\nimport * as anchor from '../anchor';\nimport { fail } from '../issue';\nexport function create(\n session: MutationSession,\n container: ResolvedContainer,\n entries: readonly { id: string; value: unknown }[],\n position?: DocumentAnchor\n): void {\n const { at, node, value } = container;\n if (node.kind !== 'table') return fail(at, 'invalid-collection', 'Expected a table.');\n const table = value as { ids: string[]; byId: Record<string, unknown> };\n if (!anchor.valid(table.ids, position))\n return fail(at, 'invalid-anchor', 'Unknown table anchor.');\n const ids = new Set<string>();\n for (const entry of entries) {\n if (Object.hasOwn(table.byId, entry.id) || ids.has(entry.id))\n return fail(at, 'duplicate-entity', 'Table key already exists.');\n ids.add(entry.id);\n }\n if (!entries.length) return;\n const index = anchor.index(table.ids, position);\n for (const entry of entries) session.writeMember(container, entry.id, entry.value, 'set');\n const length = table.ids.length;\n table.ids.length += entries.length;\n table.ids.copyWithin(index + entries.length, index, length);\n for (let i = 0; i < entries.length; i++) table.ids[index + i] = entries[i].id;\n}\nexport function remove(\n session: MutationSession,\n container: ResolvedContainer,\n ids: readonly string[]\n): void {\n const { at, node, value } = container;\n if (node.kind !== 'table') return fail(at, 'invalid-collection', 'Expected a table.');\n const table = value as { ids: string[]; byId: Record<string, unknown> };\n for (const id of ids)\n if (!Object.hasOwn(table.byId, id))\n return fail(at, 'missing-entity', 'Table key does not exist.');\n if (!ids.length) return;\n const removed = new Set(ids);\n for (const id of removed) session.writeMember(container, id, undefined, 'remove');\n table.ids = table.ids.filter(id => !removed.has(id));\n}\n\nexport function replace(\n session: MutationSession,\n container: ResolvedContainer,\n id: string,\n value: unknown\n): void {\n const { at, node, value: tableValue } = container;\n if (node.kind !== 'table') return fail(at, 'invalid-collection', 'Expected a table.');\n const table = tableValue as { byId: Record<string, unknown> };\n if (!Object.hasOwn(table.byId, id))\n return fail(at.concat(id), 'missing-entity', 'Table key does not exist.');\n session.writeMember(container, id, value, 'set');\n}\n","import type { DocumentAnchor } from '../../schema';\nimport type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address';\nimport * as anchor from '../anchor';\nimport { fail } from '../issue';\nexport function insert(\n session: MutationSession,\n container: ResolvedContainer,\n value: unknown,\n position?: DocumentAnchor\n): void {\n const { at, node, value: current } = container;\n if (node.kind !== 'list') return fail(at, 'invalid-list-key', 'Expected a list.');\n session.validate(node.value, value, at);\n const id = node.keyOf(value);\n if (typeof id !== 'string') return fail(at, 'invalid-list-key', 'List key must be a string.');\n const items = current as unknown[],\n keys = anchor.keys(items, node.keyOf);\n if (keys.index(id) >= 0) return fail(at, 'duplicate-list-item', 'List key already exists.');\n if (!anchor.valid(keys, position)) return fail(at, 'invalid-anchor', 'Unknown list anchor.');\n session.recorder.order(container);\n session.recorder.member(container, id, session.definition(container, id), -1);\n anchor.insert(items, anchor.index(keys, position), value);\n session.invalidate();\n}\nexport function replace(\n session: MutationSession,\n container: ResolvedContainer,\n id: string,\n value: unknown\n): void {\n const { at, node, value: items } = container;\n if (node.kind !== 'list') return fail(at, 'invalid-list-key', 'Expected a list.');\n const index = anchor.indexedKeys(items as unknown[], node.keyOf).index(id);\n if (index < 0) return fail(at, 'missing-list-item', 'List key does not exist.');\n session.writeMember(container, id, value, 'set', index);\n}\nexport function remove(session: MutationSession, container: ResolvedContainer, id: string): void {\n const { at, node, value } = container;\n if (node.kind !== 'list') return fail(at, 'missing-list-item', 'List key does not exist.');\n const index = anchor.keys(value as unknown[], node.keyOf).index(id);\n if (index < 0) return fail(at, 'missing-list-item', 'List key does not exist.');\n session.writeMember(container, id, undefined, 'remove', index);\n}\n","import type { DocumentAddress } from '../../schema';\nimport type { ResolvedTreeContainer } from '../../address';\nimport type { MutationSession } from '../session';\nimport { contains, type MutableTree, type TreePosition } from '../tree';\nimport { fail } from '../issue';\nconst node = (tree: MutableTree, id: string) =>\n Object.hasOwn(tree.nodes, id) ? tree.nodes[id] : undefined;\nconst positionIndex = (index: number | undefined, length: number, at: DocumentAddress): number => {\n if (index !== undefined && (!Number.isInteger(index) || index < 0))\n return fail(at, 'invalid-tree-index', 'Tree index must be nonnegative.');\n return Math.min(index ?? length, length);\n};\nexport const insert = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string,\n value: unknown,\n position: TreePosition | undefined\n): void => {\n const { at, node: schema, value: tree } = container;\n if (typeof id !== 'string') return fail(at, 'invalid-key', 'Tree keys must be strings.');\n if (contains(tree, id)) return fail(at, 'duplicate-tree-node', 'Tree node already exists.');\n const parentId = position?.parentId;\n const parent = parentId === undefined ? undefined : node(tree, parentId);\n if (\n (tree.rootId !== undefined && !parent) ||\n (tree.rootId === undefined && parentId !== undefined)\n )\n return fail(at, 'missing-tree-parent', 'A nonempty tree requires an existing parent.');\n const index = positionIndex(position?.index, parent?.children.length ?? 0, at);\n session.validate(schema.value, value, at.concat(id));\n session.recorder.tree(container, id);\n if (parentId !== undefined) session.recorder.tree(container, parentId);\n Object.defineProperty(tree.nodes, id, {\n value: { ...(parentId === undefined ? {} : { parentId }), children: [], value },\n writable: true,\n configurable: true,\n enumerable: true,\n });\n if (parent) parent.children.splice(index, 0, id);\n else tree.rootId = id;\n session.invalidate();\n};\nexport const replace = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string,\n value: unknown\n): void => {\n const { at, node: schema, value: tree } = container;\n const entry = node(tree, id);\n if (!entry) return fail(at, 'missing-tree-node', 'Tree node does not exist.');\n if (Object.is(entry.value, value) && Object.hasOwn(entry, 'value')) return;\n session.validate(schema.value, value, at.concat(id));\n session.recorder.tree(container, id);\n entry.value = value;\n};\nexport const remove = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string\n): void => {\n const { at, value: tree } = container;\n const entry = node(tree, id);\n if (!entry) return fail(at, 'missing-tree-node', 'Tree node does not exist.');\n const ids: string[] = [],\n stack = [id];\n while (stack.length) {\n const current = stack.pop()!;\n ids.push(current);\n for (const child of tree.nodes[current].children) stack.push(child);\n }\n for (const key of ids) session.recorder.tree(container, key);\n if (entry.parentId !== undefined) session.recorder.tree(container, entry.parentId);\n if (entry.parentId === undefined) delete tree.rootId;\n else {\n const children = tree.nodes[entry.parentId].children;\n children.splice(children.indexOf(id), 1);\n }\n for (const key of ids) delete tree.nodes[key];\n session.invalidate();\n};\nexport const move = (\n session: MutationSession,\n container: ResolvedTreeContainer,\n id: string,\n position: TreePosition | undefined\n): void => {\n const { at, value: tree } = container;\n const entry = node(tree, id),\n parentId = position?.parentId;\n if (!entry) return fail(at, 'missing-tree-node', 'Tree node does not exist.');\n if (entry.parentId === undefined || parentId === undefined || !contains(tree, parentId))\n return fail(\n at,\n 'missing-tree-parent',\n 'Moving requires a non-root node and an existing parent.'\n );\n for (\n let ancestor: string | undefined = parentId;\n ancestor !== undefined;\n ancestor = tree.nodes[ancestor].parentId\n )\n if (ancestor === id) return fail(at, 'tree-cycle', 'Cannot move a node under its descendant.');\n const old = tree.nodes[entry.parentId],\n next = tree.nodes[parentId];\n const index = positionIndex(position?.index, next.children.length - (old === next ? 1 : 0), at);\n const previous = old.children.indexOf(id);\n if (old === next && previous === index) return;\n session.recorder.tree(container, id);\n session.recorder.tree(container, entry.parentId);\n session.recorder.tree(container, parentId);\n old.children.splice(previous, 1);\n next.children.splice(index, 0, id);\n entry.parentId = parentId;\n session.invalidate();\n};\n","import type { DocumentAnchor } from '../../schema';\nimport type { MutationSession } from '../session';\nimport type { ResolvedContainer } from '../../address';\nimport * as anchor from '../anchor';\nimport { fail } from '../issue';\n\nconst assertOrdered = (\n container: ResolvedContainer\n): Extract<ResolvedContainer['node'], { kind: 'table' | 'list' }> => {\n const { at, node } = container;\n if (node.kind !== 'table' && node.kind !== 'list')\n return fail(at, 'invalid-collection', 'Expected an ordered container.');\n return node;\n};\n\nconst plannedOrder = (\n at: ResolvedContainer['at'],\n current: readonly string[],\n selection: readonly string[],\n position?: DocumentAnchor\n): readonly string[] => {\n const plan = anchor.moveSelection(current, selection, position);\n switch (plan.kind) {\n case 'ok':\n return plan.order;\n case 'duplicate':\n return fail(at, 'invalid-key', 'Moved keys must be unique.');\n case 'missing':\n return fail(at, 'missing-entity', 'Ordered key does not exist.');\n case 'invalid-anchor':\n return fail(at, 'invalid-anchor', 'Unknown order anchor.');\n }\n};\n\nexport function move(\n session: MutationSession,\n container: ResolvedContainer,\n ids: string | readonly string[],\n position?: DocumentAnchor\n): void {\n const node = assertOrdered(container);\n const selection = typeof ids === 'string' ? [ids] : ids;\n if (!selection.length) return;\n\n if (node.kind === 'table') {\n const order = (container.value as { ids: string[] }).ids;\n const next = plannedOrder(container.at, order, selection, position);\n if (anchor.equal(order, next)) return;\n session.recorder.order(container);\n anchor.installKeys(order, next);\n } else {\n const items = container.value as unknown[];\n const sequence = anchor.listSequence(items, node.keyOf);\n const next = plannedOrder(container.at, sequence.order, selection, position);\n if (anchor.equal(sequence.order, next)) return;\n session.recorder.order(container);\n anchor.installList(items, node.keyOf, sequence, next);\n }\n session.invalidate();\n}\n\nexport function reorder(\n session: MutationSession,\n container: ResolvedContainer,\n next: readonly string[]\n): void {\n const node = assertOrdered(container);\n if (node.kind === 'table') {\n const current = (container.value as { ids: string[] }).ids;\n if (!anchor.matches(next, current))\n return fail(container.at, 'invalid-collection', 'Order must contain every key exactly once.');\n if (anchor.equal(current, next)) return;\n session.recorder.order(container);\n anchor.installKeys(current, next);\n } else {\n const items = container.value as unknown[];\n const sequence = anchor.listSequence(items, node.keyOf);\n if (!anchor.matches(next, sequence.order))\n return fail(container.at, 'invalid-collection', 'Order must contain every key exactly once.');\n if (anchor.equal(sequence.order, next)) return;\n session.recorder.order(container);\n anchor.installList(items, node.keyOf, sequence, next);\n }\n session.invalidate();\n}\n","import type { DocumentAddress, ObjectNode, ImpactTarget, TreeTarget } from './schema';\nimport type { ChangeSet } from './changes';\nimport { AddressIndex } from './address';\n\nconst treeRootSegment = 'rootId';\nconst treeNodesSegment = 'nodes';\nconst ordinaryNamespace = '\\0value';\nconst treeNamespace = '\\0tree';\n\nexport const tree = (\n at: DocumentAddress,\n selection: Exclude<TreeTarget, { readonly kind: 'nodes' }>\n): ImpactTarget => ({ kind: 'value', at, tree: selection });\n\nexport const address = (target: ImpactTarget<unknown>): DocumentAddress =>\n 'at' in target ? target.at : target.address;\n\nexport const id = (target: ImpactTarget<unknown>): string | undefined =>\n target.kind === 'collection' && 'id' in target ? target.id : undefined;\n\nexport const belongs = (target: ImpactTarget<unknown>, schema: ObjectNode): boolean =>\n !('schema' in target) || target.schema === schema;\n\nconst treeTarget = (target: ImpactTarget<unknown>): TreeTarget | undefined =>\n 'tree' in target ? target.tree : undefined;\n\nconst sameTreeTarget = (left: TreeTarget | undefined, right: TreeTarget | undefined): boolean => {\n if (!left || !right) return left === right;\n if (left.kind !== right.kind) return false;\n return left.kind !== 'node' || (right.kind === 'node' && left.id === right.id);\n};\n\nexport const same = (left: ImpactTarget<unknown>, right: ImpactTarget<unknown>): boolean => {\n if ('schema' in left && 'schema' in right && left.schema !== right.schema) return false;\n if (!sameTreeTarget(treeTarget(left), treeTarget(right))) return false;\n if (left.kind !== right.kind) return false;\n const leftAddress = address(left);\n const rightAddress = address(right);\n if (leftAddress.length !== rightAddress.length) return false;\n for (let index = 0; index < leftAddress.length; index += 1)\n if (leftAddress[index] !== rightAddress[index]) return false;\n return left.kind !== 'collection' || id(left) === id(right);\n};\n\nexport const indexedAddress = (target: ImpactTarget<unknown>): DocumentAddress => {\n const tree = treeTarget(target);\n if (tree?.kind === 'root') return [treeNamespace, ...address(target), treeRootSegment];\n if (tree?.kind === 'nodes') return [treeNamespace, ...address(target), treeNodesSegment];\n if (tree?.kind === 'node') return [treeNamespace, ...address(target), treeNodesSegment, tree.id];\n const key = id(target);\n return key === undefined\n ? [ordinaryNamespace, ...address(target)]\n : [ordinaryNamespace, ...address(target), key];\n};\n\nexport const visitChangedLocations = (\n changes: ChangeSet,\n value: (at: DocumentAddress) => void,\n order: (at: DocumentAddress) => void\n): void => {\n for (const change of changes.changes) {\n if (change.kind === 'reset') continue;\n if (change.kind === 'members') {\n for (const member of change.members) {\n value([ordinaryNamespace, ...change.at, member.key]);\n value([treeNamespace, ...change.at, member.key]);\n }\n if (change.order) order([ordinaryNamespace, ...change.at]);\n continue;\n }\n value([ordinaryNamespace, ...change.at]);\n if (change.before !== change.after) value([treeNamespace, ...change.at, treeRootSegment]);\n for (const node of change.nodes)\n value([treeNamespace, ...change.at, treeNodesSegment, node.id]);\n }\n};\n\nexport const affected = (\n target: ImpactTarget,\n values: AddressIndex<true>,\n orders: AddressIndex<true>\n): boolean => {\n const at = indexedAddress(target);\n return id(target) !== undefined\n ? values.hasAncestor(at)\n : values.overlaps(at) || orders.hasDescendant(at);\n};\n\n/** Targets are classified once; commit matching never builds a reverse impact index. */\nexport class SubscriptionIndex<T> {\n private readonly ordinary = new AddressIndex<T>();\n private readonly membership = new AddressIndex<T>();\n constructor(private readonly schema: ObjectNode) {}\n add(target: ImpactTarget, value: T): void {\n if (!belongs(target, this.schema)) return;\n (id(target) === undefined ? this.ordinary : this.membership).add(indexedAddress(target), value);\n }\n delete(target: ImpactTarget, value: T): void {\n if (!belongs(target, this.schema)) return;\n (id(target) === undefined ? this.ordinary : this.membership).delete(\n indexedAddress(target),\n value\n );\n }\n collect(changes: ChangeSet, visit: (value: T) => void): void {\n const values = this.ordinary.query(visit);\n const members = this.membership.query(visit, 'descendants');\n const orders = this.ordinary.query(visit, 'ancestors');\n if (changes.changes.some(change => change.kind === 'reset')) {\n values([]);\n members([]);\n return;\n }\n visitChangedLocations(\n changes,\n at => {\n values(at);\n members(at);\n },\n orders\n );\n }\n clear(): void {\n this.ordinary.clear();\n this.membership.clear();\n }\n}\n","import type {\n DocumentAddress,\n DocumentAnchor,\n DocumentNode,\n DocumentTreeValue,\n FieldNode,\n Infer,\n ListNode,\n MapNode,\n ObjectNode,\n ObjectShape,\n ReadonlyValue,\n TableNode,\n TreeNode,\n ValueSchemaNode,\n VariantNode,\n} from '../schema';\nimport {\n nodeAt,\n resolveChild,\n resolveLocated,\n compiledShape,\n type FixedMember,\n type ResolvedContainer,\n type ResolvedTreeContainer,\n} from '../address';\nimport { copyValue } from '../schema-value';\nimport type { DependencyTracker } from './dependency';\nimport type { CanonicalState } from '../mutation/state';\nimport type { MutationSession } from '../mutation/session';\nimport * as mapOperations from '../mutation/operations/map';\nimport * as tableOperations from '../mutation/operations/table';\nimport * as listOperations from '../mutation/operations/list';\nimport * as treeOperations from '../mutation/operations/tree';\nimport * as orderOperations from '../mutation/operations/order';\nimport * as tree from '../mutation/tree';\nimport * as anchor from '../mutation/anchor';\nimport { profile } from '../profile';\nimport * as impactTarget from '../impact-target';\n\ndeclare const scopeValue: unique symbol;\ntype Scoped<N extends DocumentNode, W extends boolean, V = Infer<N>> = {\n readonly [scopeValue]?: readonly [node: N, writable: W, value: V];\n};\ntype ShapeAccess<S extends ObjectShape, W extends boolean> = W extends true\n ? { -readonly [K in keyof S]: Access<S[K], W> }\n : { readonly [K in keyof S]: Access<S[K], W> };\ntype MapAccess<K extends string, N extends ValueSchemaNode, W extends boolean> = {\n get(id: K): Access<N, W> | undefined;\n has(id: K): boolean;\n ids(): readonly K[];\n} & (W extends true\n ? {\n put(id: K, value: Infer<N>): void;\n remove(id: K): void;\n replace(value: Readonly<Record<K, Infer<N>>>): void;\n }\n : {});\ntype TableAccess<K extends string, N extends ValueSchemaNode, W extends boolean> = {\n get(id: K): Access<N, W> | undefined;\n has(id: K): boolean;\n ids(): readonly K[];\n} & (W extends true\n ? {\n create(id: K, value: Infer<N>, anchor?: DocumentAnchor<K>): void;\n create(\n entries: readonly { readonly id: K; readonly value: Infer<N> }[],\n anchor?: DocumentAnchor<K>\n ): void;\n remove(ids: K | readonly K[]): void;\n move(ids: K | readonly K[], anchor?: DocumentAnchor<K>): void;\n reorder(ids: readonly K[]): void;\n replace(value: {\n readonly ids: readonly K[];\n readonly byId: Readonly<Record<K, Infer<N>>>;\n }): void;\n replace(id: K, value: Infer<N>): void;\n }\n : {});\ntype ListAccess<T, W extends boolean> = {\n get(key: string): ReadonlyValue<T> | undefined;\n has(key: string): boolean;\n ids(): readonly string[];\n} & (W extends true\n ? {\n insert(value: ReadonlyValue<T>, anchor?: DocumentAnchor): void;\n remove(key: string): void;\n move(keys: string | readonly string[], anchor?: DocumentAnchor): void;\n reorder(keys: readonly string[]): void;\n replace(value: readonly ReadonlyValue<T>[]): void;\n replace(key: string, value: ReadonlyValue<T>): void;\n }\n : {});\ntype TreeAccess<T, O extends boolean, W extends boolean> = {\n rootId(): string | undefined;\n get(id: string): ReadonlyValue<T> | undefined;\n has(id: string): boolean;\n parent(id: string): string | undefined;\n children(id: string): readonly string[] | undefined;\n} & (W extends true\n ? {\n insert(\n id: string,\n value: O extends true ? ReadonlyValue<T> | undefined : ReadonlyValue<T>,\n position?: tree.TreePosition\n ): void;\n move(id: string, position?: tree.TreePosition): void;\n remove(id: string): void;\n replace(value: DocumentTreeValue<T, O>): void;\n replace(\n id: string,\n value: O extends true ? ReadonlyValue<T> | undefined : ReadonlyValue<T>\n ): void;\n }\n : {});\ntype NodeAccess<N extends DocumentNode, W extends boolean> =\n N extends FieldNode<infer T, boolean>\n ? ReadonlyValue<T>\n : N extends ObjectNode<infer S>\n ? ShapeAccess<S, W> & Scoped<N, W>\n : N extends VariantNode<infer Tag, infer V>\n ? {\n [K in keyof V & string]: ShapeAccess<V[K]['shape'], W> & {\n readonly [P in Tag]: K;\n } & Scoped<N, W, Extract<Infer<N>, Record<Tag, K>>>;\n }[keyof V & string]\n : N extends MapNode<infer V, infer K>\n ? MapAccess<K, V, W> & Scoped<N, W>\n : N extends TableNode<infer V, infer K>\n ? TableAccess<K, V, W> & Scoped<N, W>\n : N extends ListNode<infer T>\n ? ListAccess<T, W> & Scoped<N, W>\n : N extends TreeNode<infer T, infer O>\n ? TreeAccess<T, O, W> & Scoped<N, W>\n : never;\ntype Access<N extends DocumentNode, W extends boolean> = N extends { readonly optional: true }\n ? NodeAccess<N, W> | undefined\n : NodeAccess<N, W>;\nexport type Read<N extends DocumentNode> = Access<N, false>;\nexport type Draft<N extends DocumentNode> = Access<N, true>;\ntype Snapshot<T> = T extends {\n readonly [scopeValue]?: readonly [DocumentNode, boolean, infer V];\n}\n ? V\n : ReadonlyValue<T>;\ntype Target = {\n at?: DocumentAddress;\n parent?: Target;\n key: string;\n node: DocumentNode | undefined;\n value: unknown;\n generation: number;\n children:\n | { kind: 'fixed'; schema: DocumentNode; slots: (Target | undefined)[] }\n | { kind: 'dynamic'; keys: Map<string, Target> }\n | undefined;\n proxy: object | undefined;\n container?: ResolvedContainer | ResolvedTreeContainer;\n};\ntype Location = { readonly context: AccessContext; readonly target: Target };\nconst locations = new WeakMap<object, Location>();\nconst locationOf = (value: object): Location | undefined => locations.get(value);\nconst addressOf = (target: Target): DocumentAddress => {\n if (target.at) return target.at;\n profile.access('addresses');\n return (target.at = addressOf(target.parent!).concat(target.key));\n};\nexport type AccessContext = {\n readonly state: CanonicalState;\n /** Omitted for borrowed synchronous Draft and readers that must not escape. */\n readonly active?: () => boolean;\n readonly dependencies?: DependencyTracker;\n readonly session?: MutationSession;\n};\nconst assertActive = (context: AccessContext) => {\n if (context.active && !context.active()) throw new Error('Document access scope has expired.');\n};\nconst collect = (\n context: AccessContext,\n at: DocumentAddress,\n kind: 'value' | 'collection' = 'value',\n id?: string\n) => {\n context.dependencies?.record(\n kind === 'value' ? { kind, at } : { kind, at, ...(id === undefined ? {} : { id }) }\n );\n};\nconst collectTree = (\n context: AccessContext,\n at: DocumentAddress,\n selection: { readonly kind: 'root' } | { readonly kind: 'node'; readonly id: string }\n) => context.dependencies?.record(impactTarget.tree(at, selection));\nexport const snapshot = <T>(value: T): Snapshot<T> => {\n const location = value && typeof value === 'object' ? locationOf(value) : undefined;\n if (!location) return value as Snapshot<T>;\n const { context } = location;\n const at = addressOf(location.target);\n profile.access('snapshots');\n collect(context, at);\n const resolved = resolve(context, location.target);\n if (!resolved.node) throw new Error('The selected schema address no longer exists.');\n return copyValue(resolved.node, resolved.value) as Snapshot<T>;\n};\n/** Replace a member with its plain Infer value through the owning draft session. */\ntype ReplaceParentAccess = {\n readonly [scopeValue]?: readonly [\n Extract<DocumentNode, { readonly kind: 'object' | 'variant' }>,\n true,\n unknown,\n ];\n};\nexport const replace = <T extends object & ReplaceParentAccess, K extends keyof Snapshot<T>>(\n container: T,\n key: K,\n value: NoInfer<Snapshot<T>[K]>\n): void => {\n const location = locationOf(container);\n if (!location) throw new TypeError('replace requires scoped document access.');\n if (typeof key !== 'string') throw new TypeError('Document keys must be strings.');\n Reflect.set(container, key, value);\n};\n/** Projection collection contexts use the same scoped access, with explicit collection tools. */\nexport type CollectionAccess<K extends string, N extends ValueSchemaNode> = TableAccess<\n K,\n N,\n false\n>;\nconst resolve = (context: AccessContext, target: Target): Target => {\n assertActive(context);\n const generation = context.session?.generation ?? 0;\n if (target.generation !== generation) {\n profile.access('resolutions');\n if (!target.parent && !target.at!.length) {\n target.node = context.state.schema;\n target.value = context.state.document;\n } else {\n const parent = target.parent && resolve(context, target.parent);\n const location = parent\n ? resolveChild(parent.node, parent.value, target.key)\n : resolveLocated(context.state.schema, context.state.document, target.at!);\n target.node =\n location?.node ?? nodeAt(context.state.schema, addressOf(target), context.state.document);\n target.value =\n location && Object.hasOwn(location.parent, location.key)\n ? (location.parent as Record<string | number, unknown>)[location.key]\n : undefined;\n }\n target.generation = generation;\n }\n return target;\n};\n\nexport const createAccess = (context: AccessContext, initial: DocumentAddress = []): unknown => {\n profile.access('scopes');\n const mutable = (): MutationSession => {\n assertActive(context);\n if (!context.session) throw new TypeError('Cannot modify read-only document access.');\n return context.session;\n };\n const writableContainer = (target: Target, session: MutationSession): ResolvedContainer => {\n if (target.container?.generation === session.generation && 'layout' in target.container)\n return target.container;\n return (target.container = session.bind(addressOf(target), target.node, target.value));\n };\n const childAt = (target: Target, key: string): DocumentAddress => {\n profile.access('addresses');\n return addressOf(target).concat(key);\n };\n const access = (target: Target): unknown => {\n if (target.proxy) return target.proxy;\n const proxy = new Proxy(target, handler);\n profile.access('proxies');\n locations.set(proxy, { context, target });\n target.proxy = proxy;\n return proxy;\n };\n const createTarget = (\n at: DocumentAddress | undefined,\n parent: Target | undefined,\n key: string\n ): Target => ({\n at,\n parent,\n key,\n node: undefined,\n value: undefined,\n generation: -1,\n children: undefined,\n proxy: undefined,\n });\n const childAccess = (\n target: Target,\n member: string | FixedMember,\n node: DocumentNode,\n value: unknown\n ) => {\n const key = typeof member === 'string' ? member : member.key;\n if (node.kind === 'field' || value === undefined) {\n if (context.dependencies) collect(context, childAt(target, key));\n return value;\n }\n let children = target.children;\n let child: Target;\n if (typeof member !== 'string') {\n if (children?.kind !== 'fixed' || children.schema !== target.node)\n children = {\n kind: 'fixed',\n schema: target.node!,\n slots: new Array(compiledShape(target.node!, target.value)!.members.size),\n };\n child = children.slots[member.slot] ??= createTarget(undefined, target, key);\n } else {\n if (children?.kind !== 'dynamic') children = { kind: 'dynamic', keys: new Map() };\n const retained = children.keys.get(key);\n child = retained ?? createTarget(undefined, target, key);\n if (!retained) children.keys.set(key, child);\n }\n target.children = children;\n if (child.generation === target.generation) return child.proxy;\n child.node = node;\n child.value = value;\n child.generation = target.generation;\n return access(child);\n };\n const collectionValue = (target: Target, node: DocumentNode) => {\n const current = resolve(context, target);\n if (current.node !== node || current.value === undefined)\n throw new TypeError('The collection method belongs to a replaced schema branch.');\n return current.value;\n };\n const writableCollection = (target: Target, node: DocumentNode): ResolvedContainer => {\n const session = mutable();\n collectionValue(target, node);\n return writableContainer(target, session);\n };\n const writableTree = (target: Target, node: DocumentNode): ResolvedTreeContainer => {\n const session = mutable();\n collectionValue(target, node);\n if (target.container?.generation === session.generation && !('layout' in target.container))\n return target.container;\n return (target.container = session.bindTree(addressOf(target), target.node, target.value));\n };\n const replaceCollection = (target: Target, node: DocumentNode, value: unknown) => {\n const session = mutable();\n collectionValue(target, node);\n session.replace(addressOf(target), value);\n };\n const mapMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'map' }>\n ): unknown => {\n if (property === 'ids')\n return () => {\n const current = collectionValue(target, node) as Record<string, unknown>;\n if (context.dependencies) collect(context, addressOf(target), 'collection');\n return Object.keys(current);\n };\n if (property === 'has')\n return (id: string) => {\n const current = collectionValue(target, node) as Record<string, unknown>;\n if (context.dependencies) collect(context, addressOf(target), 'collection', id);\n return Object.hasOwn(current, id);\n };\n if (property === 'get')\n return (id: string) => {\n const current = collectionValue(target, node) as Record<string, unknown>;\n if (context.dependencies) collect(context, addressOf(target), 'collection', id);\n if (!Object.hasOwn(current, id)) return undefined;\n if (node.value.kind === 'field') {\n if (context.dependencies) collect(context, childAt(target, id));\n return current[id];\n }\n return childAccess(target, id, node.value, current[id]);\n };\n if (property === 'put')\n return (id: string, value: unknown) => {\n const writable = writableCollection(target, node);\n mapOperations.put(context.session!, writable, id, value);\n };\n if (property === 'remove')\n return (id: string) => {\n const writable = writableCollection(target, node);\n mapOperations.remove(context.session!, writable, id);\n };\n if (property === 'replace') return (value: unknown) => replaceCollection(target, node, value);\n return undefined;\n };\n const orderedMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'table' | 'list' }>\n ): unknown => {\n const at = addressOf(target);\n if (property === 'ids')\n return () => {\n const current = collectionValue(target, node);\n collect(context, at, 'collection');\n return node.kind === 'table'\n ? [...(current as { ids: string[] }).ids]\n : (current as unknown[]).map(node.keyOf);\n };\n if (property === 'has')\n return (id: string) => {\n const current = collectionValue(target, node);\n collect(context, at, 'collection', id);\n return node.kind === 'table'\n ? Object.hasOwn((current as { byId: object }).byId, id)\n : anchor.indexedKeys(current as unknown[], node.keyOf).index(id) >= 0;\n };\n if (property === 'get')\n return (id: string) => {\n const current = collectionValue(target, node);\n collect(context, at, 'collection', id);\n const location = resolveChild(node, current, id);\n if (!location || !Object.hasOwn(location.parent, location.key)) return undefined;\n return childAccess(\n target,\n id,\n location.node,\n (location.parent as Record<string | number, unknown>)[location.key]\n );\n };\n if (property === 'move')\n return (ids: string | readonly string[], position?: DocumentAnchor) => {\n const writable = writableCollection(target, node);\n orderOperations.move(context.session!, writable, ids, position);\n };\n if (property === 'reorder')\n return (ids: readonly string[]) => {\n const writable = writableCollection(target, node);\n orderOperations.reorder(context.session!, writable, ids);\n };\n return undefined;\n };\n const tableMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'table' }>\n ): unknown => {\n if (property === 'create')\n return (\n input: string | readonly { id: string; value: unknown }[],\n valueOrPosition?: unknown,\n position?: DocumentAnchor\n ) => {\n const writable = writableCollection(target, node);\n tableOperations.create(\n context.session!,\n writable,\n Array.isArray(input) ? input : [{ id: input as string, value: valueOrPosition }],\n Array.isArray(input) ? (valueOrPosition as DocumentAnchor | undefined) : position\n );\n };\n if (property === 'remove')\n return (ids: string | readonly string[]) => {\n const writable = writableCollection(target, node);\n tableOperations.remove(context.session!, writable, typeof ids === 'string' ? [ids] : ids);\n };\n if (property === 'replace')\n return (...args: [unknown, unknown?]) => {\n const [valueOrId, value] = args;\n if (args.length === 1) return replaceCollection(target, node, valueOrId);\n const writable = writableCollection(target, node);\n tableOperations.replace(context.session!, writable, valueOrId as string, value);\n };\n return orderedMethod(target, property, node);\n };\n const listMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'list' }>\n ): unknown => {\n if (property === 'insert')\n return (value: unknown, position?: DocumentAnchor) => {\n const writable = writableCollection(target, node);\n listOperations.insert(context.session!, writable, value, position);\n };\n if (property === 'remove')\n return (id: string) => {\n const writable = writableCollection(target, node);\n listOperations.remove(context.session!, writable, id);\n };\n if (property === 'replace')\n return (...args: [unknown, unknown?]) => {\n const [valueOrId, value] = args;\n if (args.length === 1) return replaceCollection(target, node, valueOrId);\n const writable = writableCollection(target, node);\n listOperations.replace(context.session!, writable, valueOrId as string, value);\n };\n return orderedMethod(target, property, node);\n };\n const treeMethod = (\n target: Target,\n property: string,\n node: Extract<DocumentNode, { kind: 'tree' }>\n ): unknown => {\n const at = addressOf(target);\n if (property === 'insert')\n return (id: string, value: unknown, position?: tree.TreePosition) => {\n const writable = writableTree(target, node);\n treeOperations.insert(context.session!, writable, id, value, position);\n };\n if (property === 'remove')\n return (id: string) => {\n const writable = writableTree(target, node);\n treeOperations.remove(context.session!, writable, id);\n };\n if (property === 'move')\n return (id: string, position?: tree.TreePosition) => {\n const writable = writableTree(target, node);\n treeOperations.move(context.session!, writable, id, position);\n };\n if (property === 'replace')\n return (...args: [unknown, unknown?]) => {\n const [valueOrId, value] = args;\n if (args.length === 1) return replaceCollection(target, node, valueOrId);\n const writable = writableTree(target, node);\n treeOperations.replace(context.session!, writable, valueOrId as string, value);\n };\n const current = () => collectionValue(target, node) as tree.MutableTree;\n if (property === 'rootId')\n return () => {\n collectTree(context, at, { kind: 'root' });\n return current().rootId;\n };\n if (property === 'get')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n const value = current();\n return tree.contains(value, id) ? value.nodes[id].value : undefined;\n };\n if (property === 'has')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n return tree.contains(current(), id);\n };\n if (property === 'parent')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n return tree.parent(current(), id);\n };\n if (property === 'children')\n return (id: string) => {\n collectTree(context, at, { kind: 'node', id });\n const children = tree.children(current(), id);\n return children ? [...children] : undefined;\n };\n return undefined;\n };\n const handler: ProxyHandler<Target> = {\n get: (target, property) => {\n const { node, value } = resolve(context, target);\n if (!node || value === undefined) return undefined;\n if (typeof property !== 'string') return undefined;\n if (node.kind === 'map') return mapMethod(target, property, node);\n if (node.kind === 'table') return tableMethod(target, property, node);\n if (node.kind === 'list') return listMethod(target, property, node);\n if (node.kind === 'tree') return treeMethod(target, property, node);\n if (node.kind === 'variant' && property === node.tag) {\n collect(context, childAt(target, property));\n return (value as Record<string, unknown>)[property];\n }\n const member = compiledShape(node, value)?.members.get(property);\n if (!member) return undefined;\n if (member.field) {\n if (context.dependencies) collect(context, childAt(target, property));\n return (value as Record<string, unknown>)[property];\n }\n return childAccess(\n target,\n node.kind === 'object' ? member : property,\n member.node,\n (value as Record<string, unknown>)[property]\n );\n },\n set: (target, property, value) => {\n const session = mutable(),\n { node } = resolve(context, target);\n if (\n typeof property !== 'string' ||\n !node ||\n (node.kind !== 'object' && node.kind !== 'variant')\n )\n throw new TypeError('Invalid structural assignment.');\n if (node.kind === 'variant' && node.tag === property)\n throw new TypeError('Variant discriminants are read-only.');\n session.assignMember(writableContainer(target, session), property, value);\n return true;\n },\n deleteProperty: (target, property) => {\n const session = mutable(),\n { node } = resolve(context, target);\n if (\n typeof property !== 'string' ||\n node?.kind === 'map' ||\n (node?.kind === 'variant' && node.tag === property)\n )\n throw new TypeError('Invalid structural deletion.');\n session.removeMember(writableContainer(target, session), property);\n return true;\n },\n has: (target, property) => {\n const { node, value } = resolve(context, target);\n if (typeof property !== 'string') return false;\n if (node?.kind === 'map') return false;\n collect(context, addressOf(target));\n return value !== undefined && Object.hasOwn(value as object, property);\n },\n ownKeys: target => {\n const { node, value } = resolve(context, target);\n if (node?.kind === 'map') return [];\n if (context.dependencies) collect(context, addressOf(target));\n return value && typeof value === 'object' ? Object.keys(value) : [];\n },\n getOwnPropertyDescriptor: (target, property) => {\n const { node, value } = resolve(context, target);\n if (node?.kind === 'map') return undefined;\n return value && Object.hasOwn(value as object, property)\n ? { enumerable: true, configurable: true }\n : undefined;\n },\n defineProperty: () => {\n assertActive(context);\n throw new TypeError('Use schema assignments.');\n },\n setPrototypeOf: () => {\n assertActive(context);\n throw new TypeError('Document prototypes are immutable.');\n },\n preventExtensions: () => {\n assertActive(context);\n throw new TypeError('Document access cannot be frozen.');\n },\n };\n const root = resolve(context, createTarget(initial, undefined, ''));\n if (!root.node || root.node.kind === 'field' || root.value === undefined) {\n if (context.dependencies) collect(context, initial);\n return root.value;\n }\n return access(root);\n};\nexport const collectionAccess = (\n context: AccessContext,\n at: DocumentAddress\n): CollectionAccess<string, ValueSchemaNode> => {\n const value = createAccess(context, at);\n if (value === undefined)\n return {\n get: () => {\n assertActive(context);\n return undefined;\n },\n has: () => {\n assertActive(context);\n return false;\n },\n ids: () => {\n assertActive(context);\n return [];\n },\n };\n return value as CollectionAccess<string, ValueSchemaNode>;\n};\n","import type { DocumentAddress, ObjectNode, PathPick, Infer } from '../schema';\nimport type { AddressRef } from '../address';\nimport type { ChangeSet } from '../changes';\nimport type { DocumentImpact } from '../impact';\nimport type { Draft } from '../access/scope';\nimport type { MutationIssue } from '../mutation/issue';\nimport type { Readable } from '../projection/readable';\nexport type Unsubscribe = () => void;\nexport type Synchronous<T> = T extends PromiseLike<unknown> ? never : T;\nexport type CommitSource = 'local' | 'system' | 'history' | 'remote';\nexport class DocumentReentrancyError extends Error {\n constructor() {\n super('Document writes cannot be re-entered during an update or notification.');\n this.name = 'DocumentReentrancyError';\n }\n}\nexport class DocumentDisposedError extends Error {\n constructor() {\n super('Doxum runtime has been disposed.');\n this.name = 'DocumentDisposedError';\n }\n}\nexport type DiagnosticInput = {\n readonly code: string;\n readonly message: string;\n readonly address?: DocumentAddress;\n};\nexport type DocumentDiagnostic = DiagnosticInput & { readonly source: 'application' };\nexport type DocumentProblem = DocumentDiagnostic | MutationIssue;\nexport class TransactionRejected extends Error {\n readonly issues: readonly DocumentDiagnostic[];\n constructor(input: DiagnosticInput | readonly DiagnosticInput[]) {\n super('Document update rejected.');\n this.name = 'TransactionRejected';\n const issues: readonly DiagnosticInput[] = Array.isArray(input)\n ? input\n : [input as DiagnosticInput];\n this.issues = Object.freeze(\n issues.map(issue =>\n Object.freeze({\n code: issue.code,\n message: issue.message,\n source: 'application' as const,\n ...(issue.address === undefined ? {} : { address: Object.freeze([...issue.address]) }),\n })\n )\n );\n }\n}\nexport type DocumentCommit<S extends ObjectNode> = {\n readonly revision: number;\n readonly source: CommitSource;\n readonly changes: ChangeSet;\n readonly impact: DocumentImpact<S>;\n};\nexport type ObserverError = {\n readonly phase: 'processor' | 'flush' | 'listener';\n readonly error: unknown;\n};\nexport type TransactionResult<V, C> =\n | {\n readonly status: 'committed';\n readonly value: V;\n readonly commit: C;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly value: V; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly DocumentProblem[];\n readonly revision: number;\n };\nexport type OperationResult<C> =\n | {\n readonly status: 'committed';\n readonly commit: C;\n readonly observerErrors: readonly ObserverError[];\n }\n | { readonly status: 'unchanged'; readonly revision: number }\n | {\n readonly status: 'rejected';\n readonly issues: readonly MutationIssue[];\n readonly revision: number;\n };\nexport type HistoryState = { readonly undoDepth: number; readonly redoDepth: number };\nexport type LocalHistory<C> = Readable<HistoryState> & {\n undo(): OperationResult<C>;\n redo(): OperationResult<C>;\n clear(): void;\n group(): { end(): void; cancel(): OperationResult<C> };\n};\nexport type CommitListener<S extends ObjectNode> = (commit: DocumentCommit<S>) => void;\nexport type DocumentReadable<S extends ObjectNode> = {\n readonly address: {\n resolve(address: DocumentAddress): AddressRef | undefined;\n read(address: DocumentAddress): unknown;\n contains(parent: DocumentAddress, child: DocumentAddress): boolean;\n overlaps(left: DocumentAddress, right: DocumentAddress): boolean;\n debugKey(address: DocumentAddress): string;\n };\n revision(): number;\n subscribe(listener: CommitListener<S>): Unsubscribe;\n subscribe(\n pick: PathPick<S> | readonly [PathPick<S>, ...PathPick<S>[]],\n listener: CommitListener<S>\n ): Unsubscribe;\n};\nexport type DocumentRuntime<S extends ObjectNode> = DocumentReadable<S> & {\n readonly schema: S;\n update<V>(\n run: (draft: Draft<S>) => Synchronous<V>,\n options?: {\n readonly source?: Extract<CommitSource, 'local' | 'system'>;\n readonly history?: boolean;\n }\n ): TransactionResult<V, DocumentCommit<S>>;\n apply(\n changes: unknown,\n options: {\n readonly expectedRevision: number;\n readonly source?: Exclude<CommitSource, 'history'>;\n readonly history?: boolean;\n }\n ): OperationResult<DocumentCommit<S>>;\n replace(\n value: Infer<S>,\n options?: { readonly source?: Extract<CommitSource, 'system' | 'remote'> }\n ): OperationResult<DocumentCommit<S>>;\n snapshot(): Infer<S>;\n readonly history: LocalHistory<DocumentCommit<S>>;\n dispose(): void;\n};\n","import type { ObjectNode, Infer } from '../schema';\nimport { createAccess, type Read } from '../access/scope';\nimport type { DependencyTracker } from '../access/dependency';\nimport { DocumentDisposedError } from './contract';\nimport type { DocumentReadable } from './contract';\n\nexport type RuntimeAccessState<TSchema extends ObjectNode> = {\n readonly schema: TSchema;\n document: Infer<TSchema>;\n disposed: boolean;\n projectionLocks?: number;\n};\n\nconst states = new WeakMap<object, RuntimeAccessState<ObjectNode>>();\n\nexport const bindRuntimeAccess = <TSchema extends ObjectNode>(\n runtime: DocumentReadable<TSchema>,\n state: RuntimeAccessState<TSchema>\n): void => {\n states.set(runtime as object, state as RuntimeAccessState<ObjectNode>);\n};\n\nexport const accessOf = <TSchema extends ObjectNode>(\n runtime: DocumentReadable<TSchema>\n): RuntimeAccessState<TSchema> => {\n const state = states.get(runtime as object);\n if (!state) throw new Error('Unknown Doxum runtime.');\n return state as RuntimeAccessState<TSchema>;\n};\n\nexport const readWith = <TSchema extends ObjectNode, TResult>(\n runtime: DocumentReadable<TSchema>,\n run: (read: Read<TSchema>) => TResult,\n dependencies?: DependencyTracker\n): TResult => {\n const state = accessOf(runtime);\n if (state.disposed) throw new DocumentDisposedError();\n state.projectionLocks = (state.projectionLocks ?? 0) + 1;\n try {\n const reader = createAccess({\n state,\n dependencies,\n }) as Read<TSchema>;\n return run(reader);\n } finally {\n // readWith is an internal borrowed-reader boundary. Retaining its reader or\n // collection methods after this callback is undefined behavior.\n state.projectionLocks!--;\n }\n};\n"],"mappings":"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"}