@arcmantle/chronicle 1.0.4 → 1.0.5
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/dist/api-methods.d.ts +201 -0
- package/dist/api-methods.d.ts.map +1 -1
- package/dist/api-methods.js +5 -5
- package/dist/api-methods.js.map +1 -1
- package/dist/api.d.ts +8 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +45 -15
- package/dist/api.js.map +1 -1
- package/dist/chronicle.d.ts +1 -5
- package/dist/chronicle.d.ts.map +1 -1
- package/dist/chronicle.js +2 -36
- package/dist/chronicle.js.map +1 -1
- package/dist/collection-adapters.d.ts.map +1 -1
- package/dist/collection-adapters.js +2 -1
- package/dist/collection-adapters.js.map +1 -1
- package/dist/config.d.ts +6 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -3
- package/dist/config.js.map +1 -1
- package/dist/grouping.d.ts.map +1 -1
- package/dist/grouping.js +2 -1
- package/dist/grouping.js.map +1 -1
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +3 -2
- package/dist/history-recorder.js.map +1 -1
- package/dist/history.d.ts +3 -4
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +18 -23
- package/dist/history.js.map +1 -1
- package/dist/proxy-cache.js +1 -1
- package/dist/proxy-cache.js.map +1 -1
- package/dist/proxy-factory.js +1 -1
- package/dist/proxy-factory.js.map +1 -1
- package/dist/snapshot-diff.d.ts.map +1 -1
- package/dist/snapshot-diff.js +1 -1
- package/dist/snapshot-diff.js.map +1 -1
- package/package.json +1 -1
- package/src/api-methods.ts +253 -29
- package/src/api.ts +54 -22
- package/src/chronicle.ts +2 -42
- package/src/collection-adapters.ts +2 -1
- package/src/config.ts +31 -5
- package/src/grouping.ts +2 -1
- package/src/history-recorder.ts +3 -2
- package/src/history.ts +30 -37
- package/src/proxy-cache.ts +1 -1
- package/src/proxy-factory.ts +1 -1
- package/src/snapshot-diff.ts +2 -1
package/dist/grouping.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getOptions } from "./config.js";
|
|
2
|
+
import { clearLastUngrouped, getLastUngrouped, nextGroupId, setLastUngrouped } from "./history.js";
|
|
2
3
|
/**
|
|
3
4
|
* Compute the active group ID for a change.
|
|
4
5
|
*
|
package/dist/grouping.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grouping.js","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"grouping.js","sourceRoot":"","sources":["../src/grouping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGnG;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,IAAY,EACZ,cAA+E,EAC/E,cAA4B,IAAI,CAAC,GAAG,EAC3B,EAAE;IACX,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QACxC,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;IAEhD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI;eACrC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAE3D,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACpB,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YAEjD,OAAO,IAAI,CAAC,EAAE,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAE7C,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-recorder.d.ts","sourceRoot":"","sources":["../src/history-recorder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"history-recorder.d.ts","sourceRoot":"","sources":["../src/history-recorder.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,GACrB,MAAM,MAAM,EACZ,MAAM,MAAM,EAAE,EACd,UAAU,GAAG,EACb,UAAU,GAAG,EACb,eAAe,OAAO,EACtB,SAAS,MAAM,KACb,IA2CF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACxB,MAAM,MAAM,EACZ,MAAM,MAAM,EAAE,EACd,UAAU,GAAG,EACb,SAAS,MAAM,KACb,IAuBF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,MAAM,EACZ,UAAU,MAAM,EAAE,EAClB,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;CAAE,EAAE,EACzC,SAAS,MAAM,KACb,IAoBF,CAAC"}
|
package/dist/history-recorder.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getOptions } from "./config.js";
|
|
2
|
+
import { ensureHistory, trimHistoryByGroups } from "./history.js";
|
|
2
3
|
import { cloneWithOptions } from "./snapshot-diff.js";
|
|
3
4
|
import { clearRedoCache, isSuspended } from "./undo-redo.js";
|
|
4
5
|
/**
|
|
@@ -32,7 +33,7 @@ export const recordSet = (root, path, oldValue, newValue, existedBefore, groupId
|
|
|
32
33
|
if (!cfg?.filter || cfg.filter(rec))
|
|
33
34
|
history.push(rec);
|
|
34
35
|
// Optional compaction: merge consecutive sets on the same path within the same group
|
|
35
|
-
if (cfg && cfg.
|
|
36
|
+
if (cfg && cfg.compactSamePath && history.length >= 2) {
|
|
36
37
|
const a = history[history.length - 2];
|
|
37
38
|
const b = history[history.length - 1];
|
|
38
39
|
const sameGroup = (a.groupId ?? `__g#${history.length - 2}`) === (b.groupId ?? `__g#${history.length - 1}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-recorder.js","sourceRoot":"","sources":["../src/history-recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"history-recorder.js","sourceRoot":"","sources":["../src/history-recorder.ts"],"names":[],"mappings":"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"}
|
package/dist/history.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChangeRecord } from './types.ts';
|
|
2
|
-
export interface
|
|
2
|
+
export interface ChronicleHistoryOptions {
|
|
3
3
|
/**
|
|
4
4
|
* When enabled, consecutive ungrouped changes (those not in a batch or transaction)
|
|
5
5
|
* are merged into a single undo group. If mergeWindowMs is also set, only changes
|
|
@@ -27,7 +27,7 @@ export interface ChronicleOptions {
|
|
|
27
27
|
*
|
|
28
28
|
* @default true
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
compactSamePath?: boolean;
|
|
31
31
|
/**
|
|
32
32
|
* Maximum number of history records to retain. When the limit is exceeded, entire
|
|
33
33
|
* undo groups are trimmed from the front of history to keep groups coherent. This
|
|
@@ -74,13 +74,12 @@ export interface ChronicleOptions {
|
|
|
74
74
|
*/
|
|
75
75
|
cacheProxies?: boolean;
|
|
76
76
|
}
|
|
77
|
+
export declare const defaultHistoryOptions: ChronicleHistoryOptions;
|
|
77
78
|
export declare const ensureHistory: (root: object) => ChangeRecord[];
|
|
78
79
|
export declare const historyGet: (root: object) => ChangeRecord[] | undefined;
|
|
79
80
|
export declare const historyDelete: (root: object) => void;
|
|
80
81
|
export declare const trimHistoryByGroups: (history: ChangeRecord[], max: number) => void;
|
|
81
82
|
export declare const nextGroupId: (root: object) => string;
|
|
82
|
-
export declare const getOptions: (root: object) => ChronicleOptions;
|
|
83
|
-
export declare const setOptions: (root: object, options: ChronicleOptions) => void;
|
|
84
83
|
export declare const getLastUngrouped: (root: object) => {
|
|
85
84
|
id: string;
|
|
86
85
|
at: number;
|
package/dist/history.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,MAAM,WAAW,uBAAuB;IACvC;;;;;;;OAOG;IACH,cAAc,CAAC,EAAG,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAI,MAAM,CAAC;IACzB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,UAAU,CAAC,EAAO,MAAM,CAAC;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAW,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC;IACpD;;;;;OAKG;IACH,KAAK,CAAC,EAAY,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC;IACtC;;;;;OAKG;IACH,OAAO,CAAC,EAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAC9D;;;;;OAKG;IACH,UAAU,CAAC,EAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,GAAG,SAAS,CAAC;IAC1D;;;;;;;OAOG;IACH,YAAY,CAAC,EAAK,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,qBAAqB,EAAE,uBAMnC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,YAAY,EAQxD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,YAAY,EAAE,GAAG,SAAmC,CAAC;AAC/F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,IAAsC,CAAC;AAIpF,eAAO,MAAM,mBAAmB,GAAI,SAAS,YAAY,EAAE,EAAE,KAAK,MAAM,KAAG,IA4B1E,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAK1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;CAAE,GAAG,SAAoC,CAAC;AACnH,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;CAAE,KAAG,IAAuC,CAAC;AACxH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,IAAuC,CAAC"}
|
package/dist/history.js
CHANGED
|
@@ -3,34 +3,46 @@ const historyCache = new WeakMap();
|
|
|
3
3
|
// Group/merge state per root
|
|
4
4
|
const groupCounter = new WeakMap();
|
|
5
5
|
const lastUngrouped = new WeakMap();
|
|
6
|
-
const
|
|
6
|
+
export const defaultHistoryOptions = {
|
|
7
|
+
mergeUngrouped: true,
|
|
8
|
+
mergeWindowMs: 300,
|
|
9
|
+
compactSamePath: true,
|
|
10
|
+
maxHistory: 1000,
|
|
11
|
+
cacheProxies: true,
|
|
12
|
+
};
|
|
7
13
|
export const ensureHistory = (root) => {
|
|
8
|
-
let
|
|
9
|
-
if (!
|
|
10
|
-
|
|
11
|
-
historyCache.set(root,
|
|
14
|
+
let hist = historyCache.get(root);
|
|
15
|
+
if (!hist) {
|
|
16
|
+
hist = [];
|
|
17
|
+
historyCache.set(root, hist);
|
|
12
18
|
}
|
|
13
|
-
return
|
|
19
|
+
return hist;
|
|
14
20
|
};
|
|
15
21
|
export const historyGet = (root) => historyCache.get(root);
|
|
16
22
|
export const historyDelete = (root) => { historyCache.delete(root); };
|
|
17
23
|
// Trim history by removing whole groups from the front until length <= max.
|
|
18
24
|
// This keeps undoGroups coherent and avoids splitting groups.
|
|
19
25
|
export const trimHistoryByGroups = (history, max) => {
|
|
26
|
+
// Validate max is a non-negative number
|
|
20
27
|
if (!(typeof max === 'number') || max < 0)
|
|
21
28
|
return;
|
|
29
|
+
// Nothing to trim if we're already under the limit
|
|
22
30
|
if (history.length <= max)
|
|
23
31
|
return;
|
|
32
|
+
// Count how many records to remove by walking through complete groups
|
|
24
33
|
let removeCount = 0;
|
|
25
34
|
let i = 0;
|
|
26
35
|
while (history.length - removeCount > max && i < history.length) {
|
|
27
36
|
const gid = history[i].groupId ?? `__g#${i}`;
|
|
37
|
+
// Find end of current group by scanning forward while groupId matches
|
|
28
38
|
let j = i;
|
|
29
39
|
while (j < history.length && (history[j].groupId ?? `__g#${j}`) === gid)
|
|
30
40
|
j++;
|
|
41
|
+
// Accumulate group size and advance to next group
|
|
31
42
|
removeCount += (j - i);
|
|
32
43
|
i = j;
|
|
33
44
|
}
|
|
45
|
+
// Remove entire groups from the front
|
|
34
46
|
if (removeCount > 0)
|
|
35
47
|
history.splice(0, removeCount);
|
|
36
48
|
};
|
|
@@ -39,23 +51,6 @@ export const nextGroupId = (root) => {
|
|
|
39
51
|
groupCounter.set(root, n);
|
|
40
52
|
return `g${n}`;
|
|
41
53
|
};
|
|
42
|
-
const defaultOptions = {
|
|
43
|
-
mergeUngrouped: true,
|
|
44
|
-
mergeWindowMs: 300,
|
|
45
|
-
compactConsecutiveSamePath: true,
|
|
46
|
-
maxHistory: 1000,
|
|
47
|
-
cacheProxies: true,
|
|
48
|
-
};
|
|
49
|
-
export const getOptions = (root) => {
|
|
50
|
-
const opts = optionsCache.get(root);
|
|
51
|
-
if (!opts)
|
|
52
|
-
return defaultOptions;
|
|
53
|
-
return {
|
|
54
|
-
...defaultOptions,
|
|
55
|
-
...opts,
|
|
56
|
-
};
|
|
57
|
-
};
|
|
58
|
-
export const setOptions = (root, options) => { optionsCache.set(root, options); };
|
|
59
54
|
export const getLastUngrouped = (root) => lastUngrouped.get(root);
|
|
60
55
|
export const setLastUngrouped = (root, v) => { lastUngrouped.set(root, v); };
|
|
61
56
|
export const clearLastUngrouped = (root) => { lastUngrouped.delete(root); };
|
package/dist/history.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAEA,2BAA2B;AAC3B,MAAM,YAAY,GAAoC,IAAI,OAAO,EAAE,CAAC;AAEpE,6BAA6B;AAC7B,MAAM,YAAY,GAA4B,IAAI,OAAO,EAAE,CAAC;AAC5D,MAAM,aAAa,GAAiD,IAAI,OAAO,EAAE,CAAC;AA+ElF,MAAM,
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy-cache.js
CHANGED
package/dist/proxy-cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-cache.js","sourceRoot":"","sources":["../src/proxy-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"proxy-cache.js","sourceRoot":"","sources":["../src/proxy-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C;;;GAGG;AACH,MAAM,UAAU,GAAsC,IAAI,OAAO,EAAE,CAAC;AAGpE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,OAAe,EAAmB,EAAE;IAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAErC,OAAO,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC;AAGF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,KAAU,EAAQ,EAAE;IAC5E,IAAI,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;QACjC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC,CAAC;AAGF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,QAAkB,EAAE,eAAyB,EAAQ,EAAE;IACjG,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,YAAY;QACrB,OAAO;IAER,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO;QACX,OAAO;IAER,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC;gBACtD,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;AACF,CAAC,CAAC;AAGF;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO;QACV,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/proxy-factory.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { captureShrinkRemovals, deleteIndex, isArrayIndexDeletion } from "./array-mutations.js";
|
|
2
2
|
import { adaptMapMethod, adaptSetMethod } from "./collection-adapters.js";
|
|
3
|
+
import { getOptions } from "./config.js";
|
|
3
4
|
import { computeActiveGroupId } from "./grouping.js";
|
|
4
|
-
import { getOptions } from "./history.js";
|
|
5
5
|
import { recordArrayShrinkDeletes, recordDelete, recordSet } from "./history-recorder.js";
|
|
6
6
|
import { computeAffectedListeners } from "./listener-affinity.js";
|
|
7
7
|
import { getListenerBucket } from "./listener-trie.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy-factory.js","sourceRoot":"","sources":["../src/proxy-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"proxy-factory.js","sourceRoot":"","sources":["../src/proxy-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,uBAAuB,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAgBtD,MAAM,CAAC,MAAM,iBAAiB,GAAwB,YAAY,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAmC,uBAAuB,CAAC;AAGvF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAsB,EAAgB,EAAE;IAC1E,MAAM,WAAW,GAAgC,CAAC,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE;QACxF,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,MAAM;gBACT,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE;YACrC,GAAG,CAAC,MAAM,EAAE,IAAI;gBACf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAEzC,+FAA+F;gBAC/F,MAAM,KAAK,GAAG,MAAM,YAAY,GAAG,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,YAAY,GAAG,CAAC;gBACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;oBACtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,gCAAgC;oBAElE,IAAI,KAAK,EAAE,CAAC;wBACX,MAAM,OAAO,GAAG,cAAc,CAAC,MAAuB,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;wBAC/F,IAAI,OAAO;4BACV,OAAO,OAAO,CAAC;oBACjB,CAAC;oBAED,IAAI,KAAK,EAAE,CAAC;wBACX,MAAM,OAAO,GAAG,cAAc,CAAC,MAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;wBAC1F,IAAI,OAAO;4BACV,OAAO,OAAO,CAAC;oBACjB,CAAC;oBAED,gEAAgE;oBAChE,OAAQ,MAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,CAAC;gBACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;oBACxC,OAAO,MAAM,CAAC;gBAEf,MAAM,WAAW,GAAG,CAAE,GAAG,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAE,CAAC;gBAEpD,OAAO,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACrD,CAAC;YACD,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;gBACtB,MAAM,WAAW,GAAG,CAAE,GAAG,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAE,CAAC;gBACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAE3C,kEAAkE;gBAClE,IAAI,sBAAsB,GAA4C,IAAI,CAAC;gBAC3E,IACC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;uBAClB,YAAY,CAAC,IAAI,CAAC,KAAK,QAAQ;uBAC/B,OAAO,QAAQ,KAAK,QAAQ;uBAC5B,OAAO,KAAK,KAAK,QAAQ;uBACzB,KAAK,GAAG,QAAQ;oBAEnB,sBAAsB,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAGzE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAC7C,MAAM,aAAa,GAAG,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE5E,2BAA2B;gBAC3B,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;gBAE9E,2EAA2E;gBAC3E,IAAI,sBAAsB,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC;oBAC9D,wBAAwB,CAAC,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAC;gBAEnF,kGAAkG;gBAClG,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;uBACxC,YAAY,CAAC,IAAI,CAAC,KAAK,QAAQ;uBAC/B,OAAO,QAAQ,KAAK,QAAQ;uBAC5B,OAAO,KAAK,KAAK,QAAQ;uBACzB,KAAK,GAAG,QAAQ,CAAC;gBAErB,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;gBAEtD,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;oBAC5E,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;oBAC3F,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAE,CAAC,CAAC;gBACxF,CAAC;gBAED,OAAO,MAAM,CAAC;YACf,CAAC;YACD,cAAc,CAAC,MAAM,EAAE,IAAI;gBAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,WAAW,GAAG,CAAE,GAAG,IAAI,EAAE,GAAG,CAAE,CAAC;gBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC5C,IAAI,MAAe,CAAC;gBAEpB,oGAAoG;gBACpG,IAAI,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;oBACxB,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,MAAe,EAAE,GAAG,CAAC,CAAC;gBACxD,CAAC;qBACI,CAAC;oBACL,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC/C,CAAC;gBAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAC7C,MAAM,aAAa,GAAG,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBAE5E,2BAA2B;gBAC3B,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;gBAE/D,iGAAiG;gBACjG,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBACvD,YAAY,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;gBAEpD,oFAAoF;gBACpF,IAAI,MAAM,EAAE,CAAC;oBACZ,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;oBAC5E,MAAM,IAAI,GAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;oBAC9F,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,CAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAE,CAAC,CAAC;gBAC5F,CAAC;gBAED,OAAO,MAAM,CAAC;YACf,CAAC;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAErC,4BAA4B;QAC5B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAChC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;AAC5D,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-diff.d.ts","sourceRoot":"","sources":["../src/snapshot-diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot-diff.d.ts","sourceRoot":"","sources":["../src/snapshot-diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,eAAO,MAAM,qBAAqB,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAiB,CAAC;AAGzE,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,GAAG,CAAC,KAAG,CAOnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,KAAG,CAUxD,CAAC;AAIF,eAAO,MAAM,UAAU,GACtB,GAAG,GAAG,EACN,GAAG,GAAG,EACN,MAAM,MAAM,EAAE,EACd,KAAK,UAAU,EAAE,EACjB,MAAM,MAAM,EACZ,YAAY,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,KACjC,IAmDF,CAAC"}
|
package/dist/snapshot-diff.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-diff.js","sourceRoot":"","sources":["../src/snapshot-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"snapshot-diff.js","sourceRoot":"","sources":["../src/snapshot-diff.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/api-methods.ts
CHANGED
|
@@ -19,40 +19,264 @@ const isObject = (v: unknown): v is Record<string, unknown> => typeof v === 'obj
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
export interface ChronicleApiMethods {
|
|
22
|
+
/**
|
|
23
|
+
* Subscribe to changes at a specific path in the object. The listener is called whenever
|
|
24
|
+
* the selected property or any of its descendants change. Returns an unsubscribe function.
|
|
25
|
+
*
|
|
26
|
+
* @param object - The chronicled object to listen to
|
|
27
|
+
* @param selector - Function that selects the path to watch (e.g., `obj => obj.user.name`)
|
|
28
|
+
* @param listener - Callback invoked on changes with (path, newValue, oldValue, meta)
|
|
29
|
+
* @returns Unsubscribe function to stop listening
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```ts
|
|
33
|
+
* const unsubscribe = chronicle.listen(state, s => s.count, (path, newVal, oldVal) => {
|
|
34
|
+
* console.log(`count changed from ${oldVal} to ${newVal}`);
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
22
38
|
listen<T extends object>(object: T, selector: PathSelector<T>, listener: ChangeListener): () => void;
|
|
39
|
+
/**
|
|
40
|
+
* Subscribe to changes at a specific path with listener options like debouncing or throttling.
|
|
41
|
+
*
|
|
42
|
+
* @param object - The chronicled object to listen to
|
|
43
|
+
* @param selector - Function that selects the path to watch
|
|
44
|
+
* @param listener - Callback invoked on changes
|
|
45
|
+
* @param options - Listener configuration (once, debounceMs, throttleMs, schedule)
|
|
46
|
+
* @returns Unsubscribe function
|
|
47
|
+
*/
|
|
23
48
|
// eslint-disable-next-line @typescript-eslint/unified-signatures
|
|
24
49
|
listen<T extends object>(object: T, selector: PathSelector<T>, listener: ChangeListener, options: ListenerOptions): () => void;
|
|
50
|
+
/**
|
|
51
|
+
* Subscribe to changes at a specific path with a traversal mode.
|
|
52
|
+
*
|
|
53
|
+
* @param object - The chronicled object to listen to
|
|
54
|
+
* @param selector - Function that selects the path to watch
|
|
55
|
+
* @param listener - Callback invoked on changes
|
|
56
|
+
* @param mode - Path matching mode: 'exact' (only this path), 'up' (ancestors), 'down' (descendants)
|
|
57
|
+
* @returns Unsubscribe function
|
|
58
|
+
*/
|
|
25
59
|
// eslint-disable-next-line @typescript-eslint/unified-signatures
|
|
26
60
|
listen<T extends object>(object: T, selector: PathSelector<T>, listener: ChangeListener, mode: PathMode): () => void;
|
|
61
|
+
/**
|
|
62
|
+
* Subscribe to changes at a specific path with both traversal mode and listener options.
|
|
63
|
+
*
|
|
64
|
+
* @param object - The chronicled object to listen to
|
|
65
|
+
* @param selector - Function that selects the path to watch
|
|
66
|
+
* @param listener - Callback invoked on changes
|
|
67
|
+
* @param mode - Path matching mode: 'exact', 'up', or 'down'
|
|
68
|
+
* @param options - Listener configuration (once, debounceMs, throttleMs, schedule)
|
|
69
|
+
* @returns Unsubscribe function
|
|
70
|
+
*/
|
|
27
71
|
// eslint-disable-next-line @stylistic/max-len, @typescript-eslint/unified-signatures
|
|
28
72
|
listen<T extends object>(object: T, selector: PathSelector<T>, listener: ChangeListener, mode: PathMode, options: ListenerOptions): () => void;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Subscribe to all changes on the object, regardless of path. Useful for broad monitoring.
|
|
76
|
+
*
|
|
77
|
+
* @param obj - The chronicled object to listen to
|
|
78
|
+
* @param listener - Callback invoked on any change with (path, newValue, oldValue, meta)
|
|
79
|
+
* @param options - Optional listener configuration (once, debounceMs, throttleMs, schedule)
|
|
80
|
+
* @returns Unsubscribe function to stop listening
|
|
81
|
+
*/
|
|
82
|
+
onAny: (obj: object, listener: ChangeListener, options?: ListenerOptions) => () => void;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Temporarily pause change notifications for this object. Changes still occur and are
|
|
86
|
+
* recorded in history, but listeners won't be notified until resume() is called.
|
|
87
|
+
*
|
|
88
|
+
* @param obj - The chronicled object to pause
|
|
89
|
+
*/
|
|
90
|
+
pause: (obj: object) => void;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Resume change notifications that were paused. Accumulated changes are not batched;
|
|
94
|
+
* call flush() if you want to trigger pending notifications immediately.
|
|
95
|
+
*
|
|
96
|
+
* @param obj - The chronicled object to resume
|
|
97
|
+
*/
|
|
98
|
+
resume: (obj: object) => void;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Immediately flush any pending change notifications that are scheduled asynchronously.
|
|
102
|
+
* Useful when you need synchronous notification delivery.
|
|
103
|
+
*
|
|
104
|
+
* @param obj - The chronicled object to flush
|
|
105
|
+
*/
|
|
106
|
+
flush: (obj: object) => void;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Get a copy of the complete change history for this object. Each record contains
|
|
110
|
+
* path, type, oldValue, newValue, timestamp, and groupId for undo/redo operations.
|
|
111
|
+
*
|
|
112
|
+
* @param obj - The chronicled object
|
|
113
|
+
* @returns Array of change records (copy, safe to modify)
|
|
114
|
+
*/
|
|
115
|
+
getHistory: (obj: object) => ChangeRecord[];
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Clear all change history and redo cache. The object's current state is preserved,
|
|
119
|
+
* but undo/redo will no longer work until new changes are made.
|
|
120
|
+
*
|
|
121
|
+
* @param obj - The chronicled object
|
|
122
|
+
*/
|
|
34
123
|
clearHistory: (obj: object) => void;
|
|
35
|
-
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Reset the object to its pristine state (the state when first chronicled or when
|
|
127
|
+
* markPristine was last called). This is an un-doable operation.
|
|
128
|
+
*
|
|
129
|
+
* @param obj - The chronicled object to reset
|
|
130
|
+
*/
|
|
131
|
+
reset: (obj: object) => void;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Mark the current state as the new pristine baseline. Clears history and resets the
|
|
135
|
+
* snapshot used for diff() and reset(). Useful after saving to server or committing changes.
|
|
136
|
+
*
|
|
137
|
+
* @param obj - The chronicled object
|
|
138
|
+
*/
|
|
36
139
|
markPristine: (obj: object) => void;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get the differences between the current state and the pristine state. Returns an array
|
|
143
|
+
* of changes showing what was added, removed, or modified.
|
|
144
|
+
*
|
|
145
|
+
* @param obj - The chronicled object
|
|
146
|
+
* @returns Array of diff records with path, kind ('added'|'removed'|'changed'), and values
|
|
147
|
+
*/
|
|
148
|
+
diff: (obj: object) => DiffRecord[];
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Check if the object has any changes from its pristine state. Returns true if the object
|
|
152
|
+
* matches its original or last markPristine() state.
|
|
153
|
+
*
|
|
154
|
+
* @param obj - The chronicled object
|
|
155
|
+
* @returns True if no changes exist, false otherwise
|
|
156
|
+
*/
|
|
157
|
+
isPristine: (obj: object) => boolean;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Create a deep clone snapshot of the current state. The snapshot is a plain object,
|
|
161
|
+
* not a chronicle proxy, and can be serialized or stored independently.
|
|
162
|
+
*
|
|
163
|
+
* @param obj - The chronicled object
|
|
164
|
+
* @returns Deep clone of the current state
|
|
165
|
+
*/
|
|
166
|
+
snapshot: <T extends object>(obj: T) => T;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Get the original unwrapped object (removes the chronicle proxy). Use with caution:
|
|
170
|
+
* changes to the unwrapped object won't be tracked or trigger listeners.
|
|
171
|
+
*
|
|
172
|
+
* @param obj - The chronicled object
|
|
173
|
+
* @returns The underlying object without proxy wrapper
|
|
174
|
+
*/
|
|
175
|
+
unwrap: <T extends object>(obj: T) => T;
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Perform a three-way merge between the pristine state (base), current state (ours),
|
|
179
|
+
* and incoming changes (theirs). Detects conflicts and allows resolution strategies.
|
|
180
|
+
* Useful for syncing local changes with server updates.
|
|
181
|
+
*
|
|
182
|
+
* @param obj - The chronicled object
|
|
183
|
+
* @param incomingObject - The incoming state to merge
|
|
184
|
+
* @param resolutions - Optional conflict resolution strategies per path
|
|
185
|
+
* @returns Merge result with success status, conflicts array, and count of applied changes
|
|
186
|
+
*/
|
|
187
|
+
merge: (obj: object, incomingObject: object, resolutions?: ConflictResolutions) => MergeResult;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Get a marker representing the current history length. Use with undoSince() to undo
|
|
191
|
+
* changes made after this point. Useful for transaction-like rollback behavior.
|
|
192
|
+
*
|
|
193
|
+
* @param obj - The chronicled object
|
|
194
|
+
* @returns Current history length (marker value)
|
|
195
|
+
*/
|
|
196
|
+
mark: (obj: object) => number;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Undo the last N changes (or all changes if steps not specified). Changes are undone
|
|
200
|
+
* individually. For grouped operations, use undoGroups() instead.
|
|
201
|
+
*
|
|
202
|
+
* @param obj - The chronicled object
|
|
203
|
+
* @param steps - Number of changes to undo (default: all)
|
|
204
|
+
*/
|
|
205
|
+
undo: (obj: object, steps?: number) => void;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Undo all changes made since the specified marker. The marker should come from mark().
|
|
209
|
+
* This undoes everything after that point in history.
|
|
210
|
+
*
|
|
211
|
+
* @param obj - The chronicled object
|
|
212
|
+
* @param historyLengthBefore - The marker value from mark()
|
|
213
|
+
*/
|
|
214
|
+
undoSince: (obj: object, historyLengthBefore: number) => void;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Undo the last N undo groups (batches/transactions). Unlike undo() which works on
|
|
218
|
+
* individual changes, this respects the grouping from batches and transactions.
|
|
219
|
+
*
|
|
220
|
+
* @param obj - The chronicled object
|
|
221
|
+
* @param groups - Number of groups to undo (default: 1)
|
|
222
|
+
*/
|
|
223
|
+
undoGroups: (obj: object, groups?: number) => void;
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Check if undo is available (history has changes that can be undone).
|
|
227
|
+
*
|
|
228
|
+
* @param obj - The chronicled object
|
|
229
|
+
* @returns True if undo is possible, false otherwise
|
|
230
|
+
*/
|
|
231
|
+
canUndo: (obj: object) => boolean;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Check if redo is available (there are undone changes that can be reapplied).
|
|
235
|
+
*
|
|
236
|
+
* @param obj - The chronicled object
|
|
237
|
+
* @returns True if redo is possible, false otherwise
|
|
238
|
+
*/
|
|
239
|
+
canRedo: (obj: object) => boolean;
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Clear the redo cache, making undone changes un-re-doable. The object's current state
|
|
243
|
+
* and undo history are preserved.
|
|
244
|
+
*
|
|
245
|
+
* @param obj - The chronicled object
|
|
246
|
+
*/
|
|
247
|
+
clearRedo: (obj: object) => void;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Redo the last N undone changes (or all undone changes if steps not specified).
|
|
251
|
+
* Changes are redone individually.
|
|
252
|
+
*
|
|
253
|
+
* @param obj - The chronicled object
|
|
254
|
+
* @param steps - Number of changes to redo (default: all)
|
|
255
|
+
*/
|
|
256
|
+
redo: (obj: object, steps?: number) => void;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Redo the last N undo groups. Unlike redo() which works on individual changes,
|
|
260
|
+
* this respects the grouping from batches and transactions.
|
|
261
|
+
*
|
|
262
|
+
* @param obj - The chronicled object
|
|
263
|
+
* @param groups - Number of groups to redo (default: 1)
|
|
264
|
+
*/
|
|
265
|
+
redoGroups: (obj: object, groups?: number) => void;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Configure chronicle options for this object. Options include history limits, merge
|
|
269
|
+
* behavior, custom clone/compare functions, and proxy caching. Can be called multiple
|
|
270
|
+
* times; new options are merged with existing ones.
|
|
271
|
+
*
|
|
272
|
+
* @param obj - The chronicled object
|
|
273
|
+
* @param options - Configuration options to apply
|
|
274
|
+
*/
|
|
275
|
+
configure: (obj: object, options: ConfigureOptions) => void;
|
|
52
276
|
}
|
|
53
277
|
|
|
54
278
|
export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
55
|
-
// listen/onAny
|
|
279
|
+
// listen/onAny
|
|
56
280
|
const listen: ChronicleApiMethods['listen'] = (
|
|
57
281
|
object,
|
|
58
282
|
selector,
|
|
@@ -106,7 +330,7 @@ export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
|
106
330
|
return listen(obj, s => s, listener, options!);
|
|
107
331
|
};
|
|
108
332
|
|
|
109
|
-
// pause/resume/flush
|
|
333
|
+
// pause/resume/flush
|
|
110
334
|
const pause: ChronicleApiMethods['pause'] = (obj) => {
|
|
111
335
|
const root = deps.getRoot(obj);
|
|
112
336
|
schedulePause(root);
|
|
@@ -122,7 +346,7 @@ export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
|
122
346
|
scheduleFlush(root);
|
|
123
347
|
};
|
|
124
348
|
|
|
125
|
-
// history
|
|
349
|
+
// history
|
|
126
350
|
const getHistory: ChronicleApiMethods['getHistory'] = (obj) => {
|
|
127
351
|
const root = deps.getRoot(obj);
|
|
128
352
|
|
|
@@ -136,7 +360,7 @@ export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
|
136
360
|
clearRedoCache(root);
|
|
137
361
|
};
|
|
138
362
|
|
|
139
|
-
// reset/markPristine/diff/pristine
|
|
363
|
+
// reset/markPristine/diff/pristine
|
|
140
364
|
const markPristine: ChronicleApiMethods['markPristine'] = (obj) => {
|
|
141
365
|
const root = deps.getRoot(obj);
|
|
142
366
|
originalSnapshotCache.set(root, cloneWithOptions(root, root));
|
|
@@ -206,7 +430,7 @@ export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
|
206
430
|
|
|
207
431
|
const diff: ChronicleApiMethods['diff'] = (obj) => {
|
|
208
432
|
const root = deps.getRoot(obj);
|
|
209
|
-
const original = originalSnapshotCache.get(root) ?? cloneWithOptions(root, root
|
|
433
|
+
const original = originalSnapshotCache.get(root) ?? cloneWithOptions(root, root);
|
|
210
434
|
const out: DiffRecord[] = [];
|
|
211
435
|
diffValues(original, root, [], out, root);
|
|
212
436
|
|
|
@@ -222,13 +446,13 @@ export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
|
222
446
|
const snapshot: ChronicleApiMethods['snapshot'] = (obj) => {
|
|
223
447
|
const root = deps.getRoot(obj);
|
|
224
448
|
|
|
225
|
-
return cloneWithOptions(root, root) as
|
|
449
|
+
return cloneWithOptions(root, root) as typeof obj;
|
|
226
450
|
};
|
|
227
451
|
|
|
228
452
|
const unwrap: ChronicleApiMethods['unwrap'] = (obj) => {
|
|
229
453
|
const root = deps.getRoot(obj);
|
|
230
454
|
|
|
231
|
-
return root as
|
|
455
|
+
return root as typeof obj;
|
|
232
456
|
};
|
|
233
457
|
|
|
234
458
|
const merge: ChronicleApiMethods['merge'] = (obj, incomingObject, resolutions?) => {
|
|
@@ -237,7 +461,7 @@ export const createApiMethods = (deps: ApiDeps): ChronicleApiMethods => {
|
|
|
237
461
|
return threeWayMerge(root, obj, incomingObject, resolutions);
|
|
238
462
|
};
|
|
239
463
|
|
|
240
|
-
// marks/undo/redo
|
|
464
|
+
// marks/undo/redo
|
|
241
465
|
const mark: ChronicleApiMethods['mark'] = (obj) => {
|
|
242
466
|
const root = deps.getRoot(obj);
|
|
243
467
|
const history = historyGet(root);
|