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.
- package/README.md +43 -33
- package/dist/advanced.cjs +116 -0
- package/dist/advanced.cjs.map +1 -0
- package/dist/advanced.d.cts +42 -0
- package/dist/advanced.d.ts +42 -0
- package/dist/advanced.js +115 -0
- package/dist/advanced.js.map +1 -0
- package/dist/{contract-CeAnEPBA.d.ts → contract-BT53Gg94.d.ts} +5 -4
- package/dist/{contract-DtGVSXSK.d.cts → contract-XmKnroJq.d.cts} +5 -4
- package/dist/definition-177L4Amk.cjs +898 -0
- package/dist/definition-177L4Amk.cjs.map +1 -0
- package/dist/definition-BlMeHwdz.d.ts +98 -0
- package/dist/definition-DXrKMVs7.js +785 -0
- package/dist/definition-DXrKMVs7.js.map +1 -0
- package/dist/definition-kxnWUvX9.d.cts +98 -0
- package/dist/{driver-xOIkwrB8.cjs → driver-BCyfqxsl.cjs} +1 -1
- package/dist/{driver-xOIkwrB8.cjs.map → driver-BCyfqxsl.cjs.map} +1 -1
- package/dist/{driver-BlR81Dqg.js → driver-CSnhMjbP.js} +1 -1
- package/dist/{driver-BlR81Dqg.js.map → driver-CSnhMjbP.js.map} +1 -1
- package/dist/index.cjs +31 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/{integration-VTZ3ICsO.js → integration-Bco8ZB16.js} +7 -3
- package/dist/integration-Bco8ZB16.js.map +1 -0
- package/dist/integration-CEUn96tx.cjs +52 -0
- package/dist/integration-CEUn96tx.cjs.map +1 -0
- package/dist/integration.cjs +7 -3
- package/dist/integration.d.cts +7 -3
- package/dist/integration.d.ts +7 -3
- package/dist/integration.js +3 -3
- package/dist/local-sync.cjs +1 -1
- package/dist/local-sync.d.cts +1 -1
- package/dist/local-sync.d.ts +1 -1
- package/dist/local-sync.js +1 -1
- package/dist/react.cjs +66 -12
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +8 -6
- package/dist/react.d.ts +8 -6
- package/dist/react.js +66 -12
- package/dist/react.js.map +1 -1
- package/dist/store-CDeqZEE3.d.cts +28 -0
- package/dist/{store-DHFXfWSz.js → store-CtgvCVFg.js} +585 -917
- package/dist/store-CtgvCVFg.js.map +1 -0
- package/dist/{store-DU2u-qFH.cjs → store-DcDpDgjk.cjs} +595 -987
- package/dist/store-DcDpDgjk.cjs.map +1 -0
- package/dist/store-P5dJ7TVe.d.ts +28 -0
- package/package.json +6 -1
- package/skills/doxum-runtime/SKILL.md +5 -5
- package/skills/doxum-runtime/references/guide.en.md +12 -12
- package/skills/doxum-runtime/references/guide.zh-CN.md +9 -11
- package/skills/doxum-runtime/references/patterns.en.md +12 -17
- package/skills/doxum-runtime/references/patterns.zh-CN.md +12 -16
- package/skills/doxum-runtime/references/projections.en.md +56 -190
- package/skills/doxum-runtime/references/projections.zh-CN.md +49 -171
- package/dist/integration-BKgGuodm.cjs +0 -30
- package/dist/integration-BKgGuodm.cjs.map +0 -1
- package/dist/integration-VTZ3ICsO.js.map +0 -1
- package/dist/store-Bs0C0rNd.d.ts +0 -262
- package/dist/store-CJuwJl_K.d.cts +0 -262
- package/dist/store-DHFXfWSz.js.map +0 -1
- 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
|
|
4
|
-
const
|
|
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 &&
|
|
219
|
-
const value = afterPresent ? node.kind === "field" ? after :
|
|
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 ?
|
|
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 =
|
|
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") &&
|
|
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 ?
|
|
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 (
|
|
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:
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 :
|
|
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 =
|
|
747
|
-
if (invalid) throw new
|
|
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:
|
|
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(
|
|
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
|
|
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
|
|
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 =
|
|
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.
|
|
928
|
+
exports.createProjectionRuntime = require_store.createProjectionRuntime;
|
|
929
|
+
exports.derive = require_definition.derive;
|
|
928
930
|
exports.field = require_store.field;
|
|
929
|
-
exports.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 =
|
|
935
|
-
exports.
|
|
936
|
-
exports.replace =
|
|
937
|
-
exports.
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
|
2
|
-
import {
|
|
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
|
|
19
|
+
declare const read: <TSchema extends ObjectNode, TResult>(runtime: DocumentReadable<TSchema>, selector: DocumentSelector<TSchema, TResult>) => TResult;
|
|
19
20
|
//#endregion
|
|
20
|
-
export { type
|
|
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
|
|
2
|
-
import {
|
|
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
|
|
19
|
+
declare const read: <TSchema extends ObjectNode, TResult>(runtime: DocumentReadable<TSchema>, selector: DocumentSelector<TSchema, TResult>) => TResult;
|
|
19
20
|
//#endregion
|
|
20
|
-
export { type
|
|
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
|