@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.
- package/README.md +563 -0
- package/dist/api-methods.d.ts +28 -0
- package/dist/api-methods.d.ts.map +1 -0
- package/dist/api-methods.js +206 -0
- package/dist/api-methods.js.map +1 -0
- package/dist/api.d.ts +12 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +30 -0
- package/dist/api.js.map +1 -0
- package/dist/array-mutations.d.ts +31 -0
- package/dist/array-mutations.d.ts.map +1 -0
- package/dist/array-mutations.js +50 -0
- package/dist/array-mutations.js.map +1 -0
- package/dist/batch-transaction.d.ts +25 -0
- package/dist/batch-transaction.d.ts.map +1 -0
- package/dist/batch-transaction.js +138 -0
- package/dist/batch-transaction.js.map +1 -0
- package/dist/chronicle.d.ts +41 -0
- package/dist/chronicle.d.ts.map +1 -0
- package/dist/chronicle.js +40 -0
- package/dist/chronicle.js.map +1 -0
- package/dist/collection-adapters.d.ts +29 -0
- package/dist/collection-adapters.d.ts.map +1 -0
- package/dist/collection-adapters.js +184 -0
- package/dist/collection-adapters.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -0
- package/dist/grouping.d.ts +17 -0
- package/dist/grouping.d.ts.map +1 -0
- package/dist/grouping.js +35 -0
- package/dist/grouping.js.map +1 -0
- package/dist/history-recorder.d.ts +39 -0
- package/dist/history-recorder.d.ts.map +1 -0
- package/dist/history-recorder.js +112 -0
- package/dist/history-recorder.js.map +1 -0
- package/dist/history.d.ts +29 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +47 -0
- package/dist/history.js.map +1 -0
- package/dist/listener-affinity.d.ts +16 -0
- package/dist/listener-affinity.d.ts.map +1 -0
- package/dist/listener-affinity.js +58 -0
- package/dist/listener-affinity.js.map +1 -0
- package/dist/listener-trie.d.ts +10 -0
- package/dist/listener-trie.d.ts.map +1 -0
- package/dist/listener-trie.js +83 -0
- package/dist/listener-trie.js.map +1 -0
- package/dist/nameof.d.ts +12 -0
- package/dist/nameof.d.ts.map +1 -0
- package/dist/nameof.js +30 -0
- package/dist/nameof.js.map +1 -0
- package/dist/path-key.d.ts +11 -0
- package/dist/path-key.d.ts.map +1 -0
- package/dist/path-key.js +11 -0
- package/dist/path-key.js.map +1 -0
- package/dist/path.d.ts +7 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +53 -0
- package/dist/path.js.map +1 -0
- package/dist/proxy-cache.d.ts +32 -0
- package/dist/proxy-cache.d.ts.map +1 -0
- package/dist/proxy-cache.js +72 -0
- package/dist/proxy-cache.js.map +1 -0
- package/dist/proxy-factory.d.ts +17 -0
- package/dist/proxy-factory.d.ts.map +1 -0
- package/dist/proxy-factory.js +124 -0
- package/dist/proxy-factory.js.map +1 -0
- package/dist/schedule-queue.d.ts +10 -0
- package/dist/schedule-queue.d.ts.map +1 -0
- package/dist/schedule-queue.js +112 -0
- package/dist/schedule-queue.js.map +1 -0
- package/dist/snapshot-diff.d.ts +6 -0
- package/dist/snapshot-diff.d.ts.map +1 -0
- package/dist/snapshot-diff.js +67 -0
- package/dist/snapshot-diff.js.map +1 -0
- package/dist/symbol-id.d.ts +3 -0
- package/dist/symbol-id.d.ts.map +1 -0
- package/dist/symbol-id.js +16 -0
- package/dist/symbol-id.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/undo-redo.d.ts +12 -0
- package/dist/undo-redo.d.ts.map +1 -0
- package/dist/undo-redo.js +216 -0
- package/dist/undo-redo.js.map +1 -0
- package/package.json +45 -0
- package/src/api-methods.ts +292 -0
- package/src/api.ts +53 -0
- package/src/array-mutations.ts +64 -0
- package/src/batch-transaction.ts +183 -0
- package/src/chronicle.ts +100 -0
- package/src/collection-adapters.ts +224 -0
- package/src/config.ts +16 -0
- package/src/grouping.ts +47 -0
- package/src/history-recorder.ts +145 -0
- package/src/history.ts +75 -0
- package/src/listener-affinity.ts +69 -0
- package/src/listener-trie.ts +103 -0
- package/src/nameof.ts +42 -0
- package/src/path-key.ts +10 -0
- package/src/path.ts +69 -0
- package/src/proxy-cache.ts +86 -0
- package/src/proxy-factory.ts +168 -0
- package/src/schedule-queue.ts +144 -0
- package/src/snapshot-diff.ts +90 -0
- package/src/symbol-id.ts +20 -0
- package/src/tsconfig.json +3 -0
- package/src/types.ts +59 -0
- 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
|
package/dist/api.js.map
ADDED
|
@@ -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":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,UAAU,GAAkC,IAAI,OAAO,EAAE,CAAC;AAoBhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAe,EAAY,EAAE;IACnE,MAAM,cAAc,GAA+B,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAElF,MAAM,UAAU,GAA2B,CAAC,GAAG,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7B,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAA4B,CAAC,GAAG,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACjC,OAAO;QAER,MAAM,CAAC,GAAG,EAAE,CAAC;QACb,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACtB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEzB,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,aAAa,GAA8B,CAAC,GAAG,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACjC,OAAO;QAER,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAG,CAAC;QAC5B,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACtB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEzB,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,KAAK,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAA2B,CAAC,CAAC;QACvD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC,CAAC;YAElB,OAAO,MAAM,CAAC;QACf,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACZ,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,WAAW,GAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAA2B,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAE/C,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,MAAM,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC;QACtC,IAAI,UAAU;YACb,UAAU,CAAC,IAAI,CAAC,CAAC;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,IAAI,UAAU;gBACb,WAAW,CAAC,IAAI,CAAC,CAAC;YAEnB,OAAO;gBACN,MAAM;gBACN,MAAM;gBACN,IAAI,EAAE,GAAG,EAAE;oBACV,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC3B,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,IAAI,OAAQ,CAAC,CAAC,MAAM,GAAG,CAAE,EAAE,CAAC;wBACrE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;4BAC1B,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;4BAEpB,OAAO;wBACR,CAAC;oBACF,CAAC;oBAED,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACzB,CAAC;aACD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACZ,IAAI,UAAU;gBACb,aAAa,CAAC,IAAI,CAAC,CAAC;;gBAEpB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAEzB,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAiC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAA2B,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAE/C,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,MAAM,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC;QACtC,IAAI,UAAU;YACb,UAAU,CAAC,IAAI,CAAC,CAAC;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5C,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,IAAI,UAAU;gBACb,WAAW,CAAC,IAAI,CAAC,CAAC;YAEnB,OAAO;gBACN,MAAM;gBACN,MAAM;gBACN,IAAI,EAAE,GAAG,EAAE;oBACV,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC3B,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,OAAO,IAAI,OAAQ,CAAC,CAAC,MAAM,GAAG,CAAE,EAAE,CAAC;wBACrE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;4BAC1B,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;4BAEpB,OAAO;wBACR,CAAC;oBACF,CAAC;oBAED,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACzB,CAAC;aACD,CAAC;QACH,CAAC;QACD,OAAO,GAAG,EAAE,CAAC;YACZ,IAAI,UAAU;gBACb,aAAa,CAAC,IAAI,CAAC,CAAC;;gBAEpB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAEzB,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC,CAAC;IAEF,OAAO;QACN,cAAc;QACd,UAAU;QACV,WAAW;QACX,aAAa;QACb,KAAK;QACL,WAAW;QACX,gBAAgB;KAChB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -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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"}
|