@arcmantle/chronicle 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +563 -0
  2. package/dist/api-methods.d.ts +28 -0
  3. package/dist/api-methods.d.ts.map +1 -0
  4. package/dist/api-methods.js +206 -0
  5. package/dist/api-methods.js.map +1 -0
  6. package/dist/api.d.ts +12 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +30 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/array-mutations.d.ts +31 -0
  11. package/dist/array-mutations.d.ts.map +1 -0
  12. package/dist/array-mutations.js +50 -0
  13. package/dist/array-mutations.js.map +1 -0
  14. package/dist/batch-transaction.d.ts +25 -0
  15. package/dist/batch-transaction.d.ts.map +1 -0
  16. package/dist/batch-transaction.js +138 -0
  17. package/dist/batch-transaction.js.map +1 -0
  18. package/dist/chronicle.d.ts +41 -0
  19. package/dist/chronicle.d.ts.map +1 -0
  20. package/dist/chronicle.js +40 -0
  21. package/dist/chronicle.js.map +1 -0
  22. package/dist/collection-adapters.d.ts +29 -0
  23. package/dist/collection-adapters.d.ts.map +1 -0
  24. package/dist/collection-adapters.js +184 -0
  25. package/dist/collection-adapters.js.map +1 -0
  26. package/dist/config.d.ts +7 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +11 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/grouping.d.ts +17 -0
  31. package/dist/grouping.d.ts.map +1 -0
  32. package/dist/grouping.js +35 -0
  33. package/dist/grouping.js.map +1 -0
  34. package/dist/history-recorder.d.ts +39 -0
  35. package/dist/history-recorder.d.ts.map +1 -0
  36. package/dist/history-recorder.js +112 -0
  37. package/dist/history-recorder.js.map +1 -0
  38. package/dist/history.d.ts +29 -0
  39. package/dist/history.d.ts.map +1 -0
  40. package/dist/history.js +47 -0
  41. package/dist/history.js.map +1 -0
  42. package/dist/listener-affinity.d.ts +16 -0
  43. package/dist/listener-affinity.d.ts.map +1 -0
  44. package/dist/listener-affinity.js +58 -0
  45. package/dist/listener-affinity.js.map +1 -0
  46. package/dist/listener-trie.d.ts +10 -0
  47. package/dist/listener-trie.d.ts.map +1 -0
  48. package/dist/listener-trie.js +83 -0
  49. package/dist/listener-trie.js.map +1 -0
  50. package/dist/nameof.d.ts +12 -0
  51. package/dist/nameof.d.ts.map +1 -0
  52. package/dist/nameof.js +30 -0
  53. package/dist/nameof.js.map +1 -0
  54. package/dist/path-key.d.ts +11 -0
  55. package/dist/path-key.d.ts.map +1 -0
  56. package/dist/path-key.js +11 -0
  57. package/dist/path-key.js.map +1 -0
  58. package/dist/path.d.ts +7 -0
  59. package/dist/path.d.ts.map +1 -0
  60. package/dist/path.js +53 -0
  61. package/dist/path.js.map +1 -0
  62. package/dist/proxy-cache.d.ts +32 -0
  63. package/dist/proxy-cache.d.ts.map +1 -0
  64. package/dist/proxy-cache.js +72 -0
  65. package/dist/proxy-cache.js.map +1 -0
  66. package/dist/proxy-factory.d.ts +17 -0
  67. package/dist/proxy-factory.d.ts.map +1 -0
  68. package/dist/proxy-factory.js +124 -0
  69. package/dist/proxy-factory.js.map +1 -0
  70. package/dist/schedule-queue.d.ts +10 -0
  71. package/dist/schedule-queue.d.ts.map +1 -0
  72. package/dist/schedule-queue.js +112 -0
  73. package/dist/schedule-queue.js.map +1 -0
  74. package/dist/snapshot-diff.d.ts +6 -0
  75. package/dist/snapshot-diff.d.ts.map +1 -0
  76. package/dist/snapshot-diff.js +67 -0
  77. package/dist/snapshot-diff.js.map +1 -0
  78. package/dist/symbol-id.d.ts +3 -0
  79. package/dist/symbol-id.d.ts.map +1 -0
  80. package/dist/symbol-id.js +16 -0
  81. package/dist/symbol-id.js.map +1 -0
  82. package/dist/types.d.ts +48 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +3 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/undo-redo.d.ts +12 -0
  87. package/dist/undo-redo.d.ts.map +1 -0
  88. package/dist/undo-redo.js +216 -0
  89. package/dist/undo-redo.js.map +1 -0
  90. package/package.json +45 -0
  91. package/src/api-methods.ts +292 -0
  92. package/src/api.ts +53 -0
  93. package/src/array-mutations.ts +64 -0
  94. package/src/batch-transaction.ts +183 -0
  95. package/src/chronicle.ts +100 -0
  96. package/src/collection-adapters.ts +224 -0
  97. package/src/config.ts +16 -0
  98. package/src/grouping.ts +47 -0
  99. package/src/history-recorder.ts +145 -0
  100. package/src/history.ts +75 -0
  101. package/src/listener-affinity.ts +69 -0
  102. package/src/listener-trie.ts +103 -0
  103. package/src/nameof.ts +42 -0
  104. package/src/path-key.ts +10 -0
  105. package/src/path.ts +69 -0
  106. package/src/proxy-cache.ts +86 -0
  107. package/src/proxy-factory.ts +168 -0
  108. package/src/schedule-queue.ts +144 -0
  109. package/src/snapshot-diff.ts +90 -0
  110. package/src/symbol-id.ts +20 -0
  111. package/src/tsconfig.json +3 -0
  112. package/src/types.ts +59 -0
  113. package/src/undo-redo.ts +249 -0
@@ -0,0 +1,206 @@
1
+ import { clearLastUngrouped, historyDelete, historyGet } from "./history.js";
2
+ import { addListenerToTrie, cleanupListenerBucket, ensureListenerBucket, removeListenerFromTrie } from "./listener-trie.js";
3
+ import { nameofSegments } from "./nameof.js";
4
+ import { clearProxyCache as pfClearProxyCache } from "./proxy-factory.js";
5
+ import { buildEffectiveListener, flush as scheduleFlush, pause as schedulePause, resume as scheduleResume } from "./schedule-queue.js";
6
+ import { cloneWithOptions, diffValues, originalSnapshotCache } from "./snapshot-diff.js";
7
+ import { canRedo as coreCanRedo, canUndo as coreCanUndo, clearRedoCache, redo as coreRedo, redoGroups as coreRedoGroups, resumeWrites, suspendWrites, undo as coreUndo, undoGroups as coreUndoGroups, undoSince as coreUndoSince } from "./undo-redo.js";
8
+ const isObject = (v) => typeof v === 'object' && v !== null;
9
+ export const createApiMethods = (deps) => {
10
+ // listen/onAny --------------------------------------------------------------
11
+ const listen = (object, selector, listener, modeOrOptions, maybeOptions) => {
12
+ const segs = nameofSegments(selector);
13
+ const root = deps.getRoot(object);
14
+ const bucket = ensureListenerBucket(root);
15
+ let mode = 'down';
16
+ let options;
17
+ if (typeof modeOrOptions === 'string') {
18
+ mode = modeOrOptions;
19
+ options = maybeOptions;
20
+ }
21
+ else {
22
+ options = modeOrOptions;
23
+ }
24
+ let unsubscribe;
25
+ const { effective: effectiveListener, setUnsubscribe } = buildEffectiveListener(listener, options);
26
+ setUnsubscribe(() => {
27
+ if (unsubscribe)
28
+ unsubscribe();
29
+ });
30
+ if (segs.length === 0) {
31
+ bucket.global.add(effectiveListener);
32
+ unsubscribe = () => {
33
+ bucket.global.delete(effectiveListener);
34
+ cleanupListenerBucket(root, bucket);
35
+ };
36
+ return unsubscribe;
37
+ }
38
+ addListenerToTrie(bucket.trie, segs, mode, effectiveListener);
39
+ unsubscribe = () => {
40
+ removeListenerFromTrie(bucket.trie, segs, mode, effectiveListener);
41
+ cleanupListenerBucket(root, bucket);
42
+ };
43
+ return unsubscribe;
44
+ };
45
+ const onAny = (obj, listener, options) => {
46
+ return listen(obj, s => s, listener, options);
47
+ };
48
+ // pause/resume/flush --------------------------------------------------------
49
+ const pause = (obj) => {
50
+ const root = deps.getRoot(obj);
51
+ schedulePause(root);
52
+ };
53
+ const resume = (obj) => {
54
+ const root = deps.getRoot(obj);
55
+ scheduleResume(root);
56
+ };
57
+ const flush = (obj) => {
58
+ const root = deps.getRoot(obj);
59
+ scheduleFlush(root);
60
+ };
61
+ // history ------------------------------------------------------------------
62
+ const getHistory = (obj) => {
63
+ const root = deps.getRoot(obj);
64
+ return (historyGet(root) ?? []).slice();
65
+ };
66
+ const clearHistory = (obj) => {
67
+ const root = deps.getRoot(obj);
68
+ historyDelete(root);
69
+ clearLastUngrouped(root);
70
+ clearRedoCache(root);
71
+ };
72
+ // reset/markPristine/diff/pristine ----------------------------------------
73
+ const markPristine = (obj) => {
74
+ const root = deps.getRoot(obj);
75
+ originalSnapshotCache.set(root, cloneWithOptions(root, root));
76
+ historyDelete(root);
77
+ clearLastUngrouped(root);
78
+ clearRedoCache(root);
79
+ pfClearProxyCache(root);
80
+ };
81
+ const reset = (obj) => {
82
+ const root = deps.getRoot(obj);
83
+ const snapshot = originalSnapshotCache.get(root);
84
+ if (!snapshot) {
85
+ markPristine(root);
86
+ return;
87
+ }
88
+ const overwriteDeep = (target, source) => {
89
+ if (Array.isArray(target) && Array.isArray(source)) {
90
+ target.length = source.length;
91
+ for (let i = 0; i < source.length; i++)
92
+ target[i] = cloneWithOptions(root, source[i]);
93
+ return;
94
+ }
95
+ const isPlainObject = (v) => Object.prototype.toString.call(v) === '[object Object]';
96
+ if (isObject(target) && isObject(source) && isPlainObject(target) && isPlainObject(source)) {
97
+ for (const k of Reflect.ownKeys(target)) {
98
+ if (!Object.prototype.hasOwnProperty.call(source, k))
99
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
100
+ delete target[k];
101
+ }
102
+ for (const k of Reflect.ownKeys(source)) {
103
+ const sv = source[k];
104
+ const tv = target[k];
105
+ const bothArrays = Array.isArray(sv) && Array.isArray(tv);
106
+ const bothObjects = isObject(sv) && isObject(tv) && isPlainObject(sv) && isPlainObject(tv);
107
+ if (bothArrays || bothObjects)
108
+ overwriteDeep(tv, sv);
109
+ else
110
+ target[k] = cloneWithOptions(root, sv);
111
+ }
112
+ return;
113
+ }
114
+ for (const k of Reflect.ownKeys(target))
115
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
116
+ delete target[k];
117
+ for (const k of Reflect.ownKeys(source))
118
+ target[k] = cloneWithOptions(root, source[k]);
119
+ };
120
+ suspendWrites(root);
121
+ try {
122
+ overwriteDeep(root, snapshot);
123
+ }
124
+ finally {
125
+ resumeWrites(root);
126
+ }
127
+ markPristine(root);
128
+ clearRedoCache(root);
129
+ };
130
+ const diff = (obj) => {
131
+ const root = deps.getRoot(obj);
132
+ const original = originalSnapshotCache.get(root) ?? cloneWithOptions(root, root);
133
+ const out = [];
134
+ diffValues(original, root, [], out, root);
135
+ return out;
136
+ };
137
+ const isPristine = (obj) => {
138
+ const diffs = diff(obj);
139
+ return diffs.length === 0;
140
+ };
141
+ // marks/undo/redo -----------------------------------------------------------
142
+ const mark = (obj) => {
143
+ const root = deps.getRoot(obj);
144
+ const history = historyGet(root);
145
+ return history ? history.length : 0;
146
+ };
147
+ const undo = (obj, steps = Number.POSITIVE_INFINITY) => {
148
+ const root = deps.getRoot(obj);
149
+ coreUndo(root, steps);
150
+ };
151
+ const undoSince = (obj, historyLengthBefore) => {
152
+ const root = deps.getRoot(obj);
153
+ coreUndoSince(root, historyLengthBefore);
154
+ clearLastUngrouped(root);
155
+ };
156
+ const undoGroups = (obj, groups = 1) => {
157
+ const root = deps.getRoot(obj);
158
+ coreUndoGroups(root, groups);
159
+ clearLastUngrouped(root);
160
+ };
161
+ const canUndo = (obj) => {
162
+ const root = deps.getRoot(obj);
163
+ return coreCanUndo(root);
164
+ };
165
+ const canRedo = (obj) => {
166
+ const root = deps.getRoot(obj);
167
+ return coreCanRedo(root);
168
+ };
169
+ const clearRedo = (obj) => {
170
+ const root = deps.getRoot(obj);
171
+ clearRedoCache(root);
172
+ };
173
+ const redo = (obj, steps = Number.POSITIVE_INFINITY) => {
174
+ const root = deps.getRoot(obj);
175
+ coreRedo(root, steps);
176
+ clearLastUngrouped(root);
177
+ };
178
+ const redoGroups = (obj, groups = 1) => {
179
+ const root = deps.getRoot(obj);
180
+ coreRedoGroups(root, groups);
181
+ clearLastUngrouped(root);
182
+ };
183
+ return {
184
+ listen: listen,
185
+ onAny: onAny,
186
+ pause: pause,
187
+ resume: resume,
188
+ flush: flush,
189
+ getHistory: getHistory,
190
+ clearHistory: clearHistory,
191
+ reset: reset,
192
+ markPristine: markPristine,
193
+ diff: diff,
194
+ isPristine: isPristine,
195
+ mark: mark,
196
+ undo: undo,
197
+ undoSince: undoSince,
198
+ undoGroups: undoGroups,
199
+ canUndo: canUndo,
200
+ canRedo: canRedo,
201
+ clearRedo: clearRedo,
202
+ redo: redo,
203
+ redoGroups: redoGroups,
204
+ };
205
+ };
206
+ //# sourceMappingURL=api-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-methods.js","sourceRoot":"","sources":["../src/api-methods.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export interface ChronicleCoreDeps {
2
+ getBatchFrames: (root: object) => {
3
+ marker: number;
4
+ id: string;
5
+ }[] | undefined;
6
+ }
7
+ export interface ChronicleCore {
8
+ chronicle: <T extends object>(object: T) => T;
9
+ getRoot: (obj: object) => object;
10
+ }
11
+ export declare const createChronicleCore: (deps: ChronicleCoreDeps) => ChronicleCore;
12
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;KAAE,EAAE,GAAG,SAAS,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,EAAI,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC;AAGD,eAAO,MAAM,mBAAmB,GAAI,MAAM,iBAAiB,KAAG,aAqC7D,CAAC"}
package/dist/api.js ADDED
@@ -0,0 +1,30 @@
1
+ import { createProxyFactory } from "./proxy-factory.js";
2
+ import { cloneWithOptions, originalSnapshotCache } from "./snapshot-diff.js";
3
+ export const createChronicleCore = (deps) => {
4
+ const proxyToRoot = new WeakMap();
5
+ let proxyFactory;
6
+ const chronicle = (object => {
7
+ const existingRoot = proxyToRoot.get(object);
8
+ if (!proxyFactory) {
9
+ proxyFactory = createProxyFactory({
10
+ getBatchFrames: (r) => deps.getBatchFrames(r),
11
+ setProxyRoot: (proxy, r) => proxyToRoot.set(proxy, r),
12
+ });
13
+ }
14
+ // If called on an already observed proxy, return it to avoid double-proxying
15
+ if (existingRoot) {
16
+ if (!originalSnapshotCache.has(existingRoot)) {
17
+ originalSnapshotCache.set(existingRoot, cloneWithOptions(existingRoot, existingRoot));
18
+ }
19
+ return object;
20
+ }
21
+ const root = object;
22
+ const { createProxy } = proxyFactory;
23
+ if (!originalSnapshotCache.has(root))
24
+ originalSnapshotCache.set(root, cloneWithOptions(root, root));
25
+ return createProxy(root, [], root);
26
+ });
27
+ const getRoot = (obj) => proxyToRoot.get(obj) ?? obj;
28
+ return { chronicle: chronicle, getRoot };
29
+ };
30
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAa7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAuB,EAAiB,EAAE;IAC7E,MAAM,WAAW,GAA4B,IAAI,OAAO,EAAE,CAAC;IAC3D,IAAI,YAAsC,CAAC;IAE3C,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,EAAE;QAC3B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,YAAY,GAAG,kBAAkB,CAAC;gBACjC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC7C,YAAY,EAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;aACvD,CAAC,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC9C,qBAAqB,CAAC,GAAG,CACxB,YAAY,EACZ,gBAAgB,CAAC,YAAY,EAAE,YAAY,CAAC,CAC5C,CAAC;YACH,CAAC;YAED,OAAO,MAAM,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAI,MAAiB,CAAC;QAChC,MAAM,EAAE,WAAW,EAAE,GAAG,YAAa,CAAC;QAEtC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;YACnC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAE/D,OAAO,WAAW,CAAC,IAAc,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAyC,CAAC;IAE3C,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IAErE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Capture array elements that will be removed when shrinking array length.
3
+ *
4
+ * @param targetArray - The array being modified
5
+ * @param oldLen - The current length
6
+ * @param newLen - The new (smaller) length
7
+ * @returns Array of {index, value} pairs for elements that will be removed
8
+ */
9
+ export declare const captureShrinkRemovals: (targetArray: any[], oldLen: number, newLen: number) => {
10
+ index: number;
11
+ value: any;
12
+ }[];
13
+ /**
14
+ * Delete an array element by index using splice to avoid sparse arrays.
15
+ * Suspends write notifications during the splice to avoid noisy intermediate records.
16
+ *
17
+ * @param root - The root object (for suspend/resume context)
18
+ * @param arrayTarget - The array to modify
19
+ * @param index - The numeric index to delete
20
+ * @returns true if deletion succeeded
21
+ */
22
+ export declare const deleteIndex: (root: object, arrayTarget: any[], index: number) => boolean;
23
+ /**
24
+ * Check if a delete operation is for an array index.
25
+ *
26
+ * @param target - The target object
27
+ * @param key - The normalized key
28
+ * @returns true if this is an array index deletion
29
+ */
30
+ export declare const isArrayIndexDeletion: (target: any, key: string) => boolean;
31
+ //# sourceMappingURL=array-mutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-mutations.d.ts","sourceRoot":"","sources":["../src/array-mutations.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GACjC,aAAa,GAAG,EAAE,EAClB,QAAQ,MAAM,EACd,QAAQ,MAAM,KACZ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;CAAE,EAMhC,CAAC;AAGF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,aAAa,GAAG,EAAE,EAAE,OAAO,MAAM,KAAG,OAkB7E,CAAC;AAGF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,GAAG,EAAE,KAAK,MAAM,KAAG,OAClB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { isArrayIndexKey } from "./path.js";
2
+ import { isSuspended, resumeWrites, suspendWrites } from "./undo-redo.js";
3
+ /**
4
+ * Capture array elements that will be removed when shrinking array length.
5
+ *
6
+ * @param targetArray - The array being modified
7
+ * @param oldLen - The current length
8
+ * @param newLen - The new (smaller) length
9
+ * @returns Array of {index, value} pairs for elements that will be removed
10
+ */
11
+ export const captureShrinkRemovals = (targetArray, oldLen, newLen) => {
12
+ const removed = [];
13
+ for (let i = oldLen - 1; i >= newLen; i--)
14
+ removed.push({ index: i, value: targetArray[i] });
15
+ return removed;
16
+ };
17
+ /**
18
+ * Delete an array element by index using splice to avoid sparse arrays.
19
+ * Suspends write notifications during the splice to avoid noisy intermediate records.
20
+ *
21
+ * @param root - The root object (for suspend/resume context)
22
+ * @param arrayTarget - The array to modify
23
+ * @param index - The numeric index to delete
24
+ * @returns true if deletion succeeded
25
+ */
26
+ export const deleteIndex = (root, arrayTarget, index) => {
27
+ if (isSuspended(root)) {
28
+ // Already suspended, just splice
29
+ arrayTarget.splice(index, 1);
30
+ return true;
31
+ }
32
+ // Suspend writes to avoid intermediate shift/length records
33
+ suspendWrites(root);
34
+ try {
35
+ arrayTarget.splice(index, 1);
36
+ return true;
37
+ }
38
+ finally {
39
+ resumeWrites(root);
40
+ }
41
+ };
42
+ /**
43
+ * Check if a delete operation is for an array index.
44
+ *
45
+ * @param target - The target object
46
+ * @param key - The normalized key
47
+ * @returns true if this is an array index deletion
48
+ */
49
+ export const isArrayIndexDeletion = (target, key) => Array.isArray(target) && isArrayIndexKey(key);
50
+ //# sourceMappingURL=array-mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-mutations.js","sourceRoot":"","sources":["../src/array-mutations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG1E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACpC,WAAkB,EAClB,MAAc,EACd,MAAc,EACqB,EAAE;IACrC,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE;QACxC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEnD,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAGF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,WAAkB,EAAE,KAAa,EAAW,EAAE;IACvF,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,iCAAiC;QACjC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,4DAA4D;IAC5D,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC;QACJ,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC;IACb,CAAC;YACO,CAAC;QACR,YAAY,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACF,CAAC,CAAC;AAGF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAW,EAAE,GAAW,EAAW,EAAE,CACzE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ChronicleCore } from './api.ts';
2
+ export type BatchDeps = Pick<ChronicleCore, 'chronicle' | 'getRoot'>;
3
+ export interface BatchFrame {
4
+ marker: number;
5
+ id: string;
6
+ }
7
+ export interface BatchAPI {
8
+ getBatchFrames: (root: object) => BatchFrame[] | undefined;
9
+ beginBatch: (obj: object) => void;
10
+ commitBatch: (obj: object) => void;
11
+ rollbackBatch: (obj: object) => void;
12
+ batch: <T extends object, R>(object: T, action: (observed: T) => R) => R;
13
+ transaction: <T extends object, R>(object: T, action: (observed: T) => R) => {
14
+ result: R;
15
+ marker: number;
16
+ undo: () => void;
17
+ };
18
+ transactionAsync: <T extends object, R>(object: T, action: (observed: T) => Promise<R>) => Promise<{
19
+ result: R;
20
+ marker: number;
21
+ undo: () => void;
22
+ }>;
23
+ }
24
+ export declare const createBatchTransaction: (deps: BatchDeps) => BatchAPI;
25
+ //# sourceMappingURL=batch-transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-transaction.d.ts","sourceRoot":"","sources":["../src/batch-transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;AAErE,MAAM,WAAW,UAAU;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;CAAE;AAE3D,MAAM,WAAW,QAAQ;IACxB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,EAAE,GAAG,SAAS,CAAC;IAC3D,UAAU,EAAM,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,EAAK,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,aAAa,EAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,KAAK,EAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClF,WAAW,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KACxE;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAC;KAAE,CAAC;IACjD,gBAAgB,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KACtF,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAC;KAAE,CAAC,CAAC;CAC1D;AAGD,eAAO,MAAM,sBAAsB,GAAI,MAAM,SAAS,KAAG,QA6JxD,CAAC"}
@@ -0,0 +1,138 @@
1
+ import { clearLastUngrouped, ensureHistory, historyGet, nextGroupId } from "./history.js";
2
+ import { undoGroups, undoSince } from "./undo-redo.js";
3
+ const batchStack = new WeakMap();
4
+ export const createBatchTransaction = (deps) => {
5
+ const getBatchFrames = (root) => batchStack.get(root);
6
+ const beginBatch = (obj) => {
7
+ const root = deps.getRoot(obj);
8
+ const history = ensureHistory(root);
9
+ const frames = batchStack.get(root) ?? [];
10
+ const id = nextGroupId(root);
11
+ frames.push({ marker: history.length, id });
12
+ batchStack.set(root, frames);
13
+ clearLastUngrouped(root);
14
+ };
15
+ const commitBatch = (obj) => {
16
+ const root = deps.getRoot(obj);
17
+ const frames = batchStack.get(root);
18
+ if (!frames || frames.length === 0)
19
+ return;
20
+ frames.pop();
21
+ if (frames.length === 0)
22
+ batchStack.delete(root);
23
+ clearLastUngrouped(root);
24
+ };
25
+ const rollbackBatch = (obj) => {
26
+ const root = deps.getRoot(obj);
27
+ const frames = batchStack.get(root);
28
+ if (!frames || frames.length === 0)
29
+ return;
30
+ const frame = frames.pop();
31
+ undoSince(root, frame.marker);
32
+ if (frames.length === 0)
33
+ batchStack.delete(root);
34
+ clearLastUngrouped(root);
35
+ };
36
+ const batch = (object, action) => {
37
+ const root = deps.getRoot(object);
38
+ beginBatch(root);
39
+ const observed = deps.chronicle(object);
40
+ try {
41
+ const result = action(observed);
42
+ commitBatch(root);
43
+ return result;
44
+ }
45
+ catch (err) {
46
+ rollbackBatch(root);
47
+ throw err;
48
+ }
49
+ };
50
+ const transaction = (object, action) => {
51
+ const root = deps.getRoot(object);
52
+ const marker = (historyGet(root) ?? []).length;
53
+ const framesBefore = (batchStack.get(root) ?? []).length;
54
+ const isTopLevel = framesBefore === 0;
55
+ if (isTopLevel)
56
+ beginBatch(root);
57
+ const observed = deps.chronicle(object);
58
+ let groupId;
59
+ try {
60
+ const result = action(observed);
61
+ const frames = (batchStack.get(root) ?? []);
62
+ groupId = frames.length > 0 ? frames[frames.length - 1].id : undefined;
63
+ if (isTopLevel)
64
+ commitBatch(root);
65
+ return {
66
+ result,
67
+ marker,
68
+ undo: () => {
69
+ const h = historyGet(root);
70
+ if (groupId && h && h.length > 0) {
71
+ const topGroup = h[h.length - 1].groupId ?? `__g#${h.length - 1}`;
72
+ if (topGroup === groupId) {
73
+ undoGroups(root, 1);
74
+ return;
75
+ }
76
+ }
77
+ undoSince(root, marker);
78
+ },
79
+ };
80
+ }
81
+ catch (err) {
82
+ if (isTopLevel)
83
+ rollbackBatch(root);
84
+ else
85
+ undoSince(root, marker);
86
+ throw err;
87
+ }
88
+ };
89
+ const transactionAsync = async (object, action) => {
90
+ const root = deps.getRoot(object);
91
+ const marker = (historyGet(root) ?? []).length;
92
+ const framesBefore = (batchStack.get(root) ?? []).length;
93
+ const isTopLevel = framesBefore === 0;
94
+ if (isTopLevel)
95
+ beginBatch(root);
96
+ const observed = deps.chronicle(object);
97
+ let groupId;
98
+ try {
99
+ const result = await action(observed);
100
+ const frames = (batchStack.get(root) ?? []);
101
+ groupId = frames.length > 0 ? frames[frames.length - 1].id : undefined;
102
+ if (isTopLevel)
103
+ commitBatch(root);
104
+ return {
105
+ result,
106
+ marker,
107
+ undo: () => {
108
+ const h = historyGet(root);
109
+ if (groupId && h && h.length > 0) {
110
+ const topGroup = h[h.length - 1].groupId ?? `__g#${h.length - 1}`;
111
+ if (topGroup === groupId) {
112
+ undoGroups(root, 1);
113
+ return;
114
+ }
115
+ }
116
+ undoSince(root, marker);
117
+ },
118
+ };
119
+ }
120
+ catch (err) {
121
+ if (isTopLevel)
122
+ rollbackBatch(root);
123
+ else
124
+ undoSince(root, marker);
125
+ throw err;
126
+ }
127
+ };
128
+ return {
129
+ getBatchFrames,
130
+ beginBatch,
131
+ commitBatch,
132
+ rollbackBatch,
133
+ batch,
134
+ transaction,
135
+ transactionAsync,
136
+ };
137
+ };
138
+ //# sourceMappingURL=batch-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-transaction.js","sourceRoot":"","sources":["../src/batch-transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type ConfigureOptions } from './config.ts';
2
+ import type { ChangeListener, ChangeRecord, DiffRecord, ListenerOptions, PathMode, PathSelector } from './types.ts';
3
+ interface Chronicle {
4
+ <T extends object>(object: T): T;
5
+ listen<T extends object>(object: T, selector: PathSelector<T>, listener: ChangeListener, modeOrOptions?: PathMode | ListenerOptions, maybeOptions?: ListenerOptions): () => void;
6
+ onAny(obj: object, listener: ChangeListener, options?: ListenerOptions): () => void;
7
+ pause(obj: object): void;
8
+ resume(obj: object): void;
9
+ flush(obj: object): void;
10
+ getHistory(obj: object): ChangeRecord[];
11
+ clearHistory(obj: object): void;
12
+ reset(obj: object): void;
13
+ markPristine(obj: object): void;
14
+ undo(obj: object, steps?: number): void;
15
+ undoSince(obj: object, historyLengthBefore: number): void;
16
+ diff(obj: object): DiffRecord[];
17
+ isPristine(obj: object): boolean;
18
+ mark(obj: object): number;
19
+ transaction<T extends object, R>(object: T, action: (observed: T) => R): TransactionResult<R>;
20
+ transactionAsync<T extends object, R>(object: T, action: (observed: T) => Promise<R>): Promise<TransactionResult<R>>;
21
+ beginBatch(obj: object): void;
22
+ commitBatch(obj: object): void;
23
+ rollbackBatch(obj: object): void;
24
+ batch<T extends object, R>(object: T, action: (observed: T) => R): R;
25
+ undoGroups(obj: object, groups?: number): void;
26
+ canUndo(obj: object): boolean;
27
+ canRedo(obj: object): boolean;
28
+ clearRedo(obj: object): void;
29
+ redo(obj: object, steps?: number): void;
30
+ redoGroups(obj: object, groups?: number): void;
31
+ configure(obj: object, options: ConfigureOptions): void;
32
+ }
33
+ interface TransactionResult<R> {
34
+ result: R;
35
+ marker: number;
36
+ undo: () => void;
37
+ }
38
+ declare const chronicle: Chronicle;
39
+ export { chronicle };
40
+ export type { Chronicle };
41
+ //# sourceMappingURL=chronicle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chronicle.d.ts","sourceRoot":"","sources":["../src/chronicle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { createChronicleCore } from "./api.js";
2
+ import { createApiMethods } from "./api-methods.js";
3
+ import { createBatchTransaction } from "./batch-transaction.js";
4
+ import { configureRoot } from "./config.js";
5
+ const core = createChronicleCore({ getBatchFrames: r => batchApi.getBatchFrames(r) });
6
+ const chronicle = core.chronicle;
7
+ const batchApi = createBatchTransaction(core);
8
+ const api = createApiMethods({ getRoot: core.getRoot });
9
+ chronicle.listen = api.listen;
10
+ chronicle.onAny = api.onAny;
11
+ chronicle.pause = api.pause;
12
+ chronicle.resume = api.resume;
13
+ chronicle.flush = api.flush;
14
+ chronicle.getHistory = api.getHistory;
15
+ chronicle.clearHistory = api.clearHistory;
16
+ chronicle.reset = api.reset;
17
+ chronicle.markPristine = api.markPristine;
18
+ chronicle.undo = api.undo;
19
+ chronicle.undoSince = api.undoSince;
20
+ chronicle.diff = api.diff;
21
+ chronicle.isPristine = api.isPristine;
22
+ chronicle.mark = api.mark;
23
+ chronicle.undoGroups = api.undoGroups;
24
+ chronicle.canUndo = api.canUndo;
25
+ chronicle.canRedo = api.canRedo;
26
+ chronicle.clearRedo = api.clearRedo;
27
+ chronicle.redo = api.redo;
28
+ chronicle.redoGroups = api.redoGroups;
29
+ chronicle.transaction = (object, action) => batchApi.transaction(object, action);
30
+ chronicle.transactionAsync = async (object, action) => batchApi.transactionAsync(object, action);
31
+ chronicle.beginBatch = (obj) => batchApi.beginBatch(core.getRoot(obj));
32
+ chronicle.commitBatch = (obj) => batchApi.commitBatch(core.getRoot(obj));
33
+ chronicle.rollbackBatch = (obj) => batchApi.rollbackBatch(core.getRoot(obj));
34
+ chronicle.batch = (object, action) => batchApi.batch(object, action);
35
+ chronicle.configure = (obj, options) => {
36
+ const root = core.getRoot(obj);
37
+ configureRoot(root, options);
38
+ };
39
+ export { chronicle };
40
+ //# sourceMappingURL=chronicle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chronicle.js","sourceRoot":"","sources":["../src/chronicle.ts"],"names":[],"mappings":"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"}