@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,58 @@
|
|
|
1
|
+
import { getListenerBucket, getNode } from "./listener-trie.js";
|
|
2
|
+
/**
|
|
3
|
+
* Compute the set of listeners affected by a change at the given path.
|
|
4
|
+
*
|
|
5
|
+
* Collects listeners in this order:
|
|
6
|
+
* - Global listeners (onAny)
|
|
7
|
+
* - Down listeners on the path and all ancestors (listen for descendants)
|
|
8
|
+
* - Exact listeners at the exact path
|
|
9
|
+
* - Up listeners on all descendants (listen for ancestors)
|
|
10
|
+
*
|
|
11
|
+
* @param root - The root object
|
|
12
|
+
* @param path - The path where the change occurred
|
|
13
|
+
* @returns Set of all affected listeners
|
|
14
|
+
*/
|
|
15
|
+
export const computeAffectedListeners = (root, path) => {
|
|
16
|
+
const bucket = getListenerBucket(root);
|
|
17
|
+
const affected = new Set();
|
|
18
|
+
if (!bucket)
|
|
19
|
+
return affected;
|
|
20
|
+
// Global listeners
|
|
21
|
+
bucket.global.forEach(l => affected.add(l));
|
|
22
|
+
const rootNode = bucket.trie;
|
|
23
|
+
// Down listeners on ancestors (including root)
|
|
24
|
+
{
|
|
25
|
+
let node = rootNode;
|
|
26
|
+
if (node && node.modes.size > 0)
|
|
27
|
+
node.modes.get('down')?.forEach(l => affected.add(l));
|
|
28
|
+
for (const seg of path) {
|
|
29
|
+
node = node?.children.get(seg);
|
|
30
|
+
if (!node)
|
|
31
|
+
break;
|
|
32
|
+
node.modes.get('down')?.forEach(l => affected.add(l));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Exact listeners at the path
|
|
36
|
+
{
|
|
37
|
+
const node = getNode(rootNode, path);
|
|
38
|
+
if (node)
|
|
39
|
+
node.modes.get('exact')?.forEach(l => affected.add(l));
|
|
40
|
+
}
|
|
41
|
+
// Up listeners on descendants (strictly deeper than path)
|
|
42
|
+
{
|
|
43
|
+
const start = getNode(rootNode, path);
|
|
44
|
+
if (start) {
|
|
45
|
+
for (const child of start.children.values()) {
|
|
46
|
+
const stack = [child];
|
|
47
|
+
while (stack.length) {
|
|
48
|
+
const n = stack.pop();
|
|
49
|
+
n.modes.get('up')?.forEach(l => affected.add(l));
|
|
50
|
+
for (const c of n.children.values())
|
|
51
|
+
stack.push(c);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return affected;
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=listener-affinity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener-affinity.js","sourceRoot":"","sources":["../src/listener-affinity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIhE;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAE,IAAc,EAAuB,EAAE;IAC7F,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEhD,IAAI,CAAC,MAAM;QACV,OAAO,QAAQ,CAAC;IAEjB,mBAAmB;IACnB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAE7B,+CAA+C;IAC/C,CAAC;QACA,IAAI,IAAI,GAA6B,QAAQ,CAAC;QAC9C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,GAAG,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI;gBACR,MAAM;YAEP,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,8BAA8B;IAC9B,CAAC;QACA,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI;YACP,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,0DAA0D;IAC1D,CAAC;QACA,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAmB,CAAE,KAAK,CAAE,CAAC;gBACxC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;oBACrB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;oBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE;wBAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChangeListener, ListenerBucket, PathMode, PathTrieNode } from './types.ts';
|
|
2
|
+
export declare const getListenerBucket: (root: object) => ListenerBucket | undefined;
|
|
3
|
+
export declare const ensureListenerBucket: (root: object) => ListenerBucket;
|
|
4
|
+
export declare const cleanupListenerBucket: (root: object, bucket: ListenerBucket) => void;
|
|
5
|
+
export declare const getOrCreateNode: (root: PathTrieNode, segs: string[]) => PathTrieNode;
|
|
6
|
+
export declare const getNode: (root: PathTrieNode, segs: string[]) => PathTrieNode | undefined;
|
|
7
|
+
export declare const prunePathIfEmpty: (root: PathTrieNode, segs: string[]) => void;
|
|
8
|
+
export declare const addListenerToTrie: (root: PathTrieNode, segs: string[], mode: PathMode, listener: ChangeListener) => PathTrieNode;
|
|
9
|
+
export declare const removeListenerFromTrie: (root: PathTrieNode, segs: string[], mode: PathMode, listener: ChangeListener) => void;
|
|
10
|
+
//# sourceMappingURL=listener-trie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener-trie.d.ts","sourceRoot":"","sources":["../src/listener-trie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAKzF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,cAAc,GAAG,SAAoC,CAAC;AAEvG,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,cAYnD,CAAC;AAIF,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,EAAE,QAAQ,cAAc,KAAG,IAG5E,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,KAAG,YAapE,CAAC;AAEF,eAAO,MAAM,OAAO,GAAI,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,KAAG,YAAY,GAAG,SAS3E,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,KAAG,IAwBrE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,EAAE,MAAM,QAAQ,EAAE,UAAU,cAAc,KAAG,YAOhH,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,MAAM,YAAY,EAAE,MAAM,MAAM,EAAE,EAAE,MAAM,QAAQ,EAAE,UAAU,cAAc,KAAG,IAarH,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Per-root listener registry (global + trie)
|
|
2
|
+
const listenerCache = new WeakMap();
|
|
3
|
+
export const getListenerBucket = (root) => listenerCache.get(root);
|
|
4
|
+
export const ensureListenerBucket = (root) => {
|
|
5
|
+
let bucket = listenerCache.get(root);
|
|
6
|
+
if (!bucket) {
|
|
7
|
+
bucket = {
|
|
8
|
+
global: new Set(),
|
|
9
|
+
trie: { children: new Map(), modes: new Map() },
|
|
10
|
+
};
|
|
11
|
+
listenerCache.set(root, bucket);
|
|
12
|
+
}
|
|
13
|
+
return bucket;
|
|
14
|
+
};
|
|
15
|
+
const isNodeEmpty = (node) => node.children.size === 0 && (node.modes.size === 0);
|
|
16
|
+
export const cleanupListenerBucket = (root, bucket) => {
|
|
17
|
+
if (bucket.global.size === 0 && isNodeEmpty(bucket.trie))
|
|
18
|
+
listenerCache.delete(root);
|
|
19
|
+
};
|
|
20
|
+
export const getOrCreateNode = (root, segs) => {
|
|
21
|
+
let node = root;
|
|
22
|
+
for (const s of segs) {
|
|
23
|
+
let next = node.children.get(s);
|
|
24
|
+
if (!next) {
|
|
25
|
+
next = { children: new Map(), modes: new Map() };
|
|
26
|
+
node.children.set(s, next);
|
|
27
|
+
}
|
|
28
|
+
node = next;
|
|
29
|
+
}
|
|
30
|
+
return node;
|
|
31
|
+
};
|
|
32
|
+
export const getNode = (root, segs) => {
|
|
33
|
+
let node = root;
|
|
34
|
+
for (const s of segs) {
|
|
35
|
+
node = node?.children.get(s);
|
|
36
|
+
if (!node)
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
return node;
|
|
40
|
+
};
|
|
41
|
+
export const prunePathIfEmpty = (root, segs) => {
|
|
42
|
+
const stack = [];
|
|
43
|
+
let node = root;
|
|
44
|
+
for (const s of segs) {
|
|
45
|
+
if (!node)
|
|
46
|
+
return;
|
|
47
|
+
stack.push({ seg: s, node });
|
|
48
|
+
node = node.children.get(s);
|
|
49
|
+
}
|
|
50
|
+
// node is the target node
|
|
51
|
+
if (!node)
|
|
52
|
+
return;
|
|
53
|
+
// Walk back up pruning empty nodes
|
|
54
|
+
for (let i = segs.length - 1; i >= 0; i--) {
|
|
55
|
+
const parent = stack[i].node;
|
|
56
|
+
const seg = stack[i].seg;
|
|
57
|
+
const child = parent.children.get(seg);
|
|
58
|
+
if (child.children.size === 0 && child.modes.size === 0)
|
|
59
|
+
parent.children.delete(seg);
|
|
60
|
+
else
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
export const addListenerToTrie = (root, segs, mode, listener) => {
|
|
65
|
+
const node = getOrCreateNode(root, segs);
|
|
66
|
+
const set = node.modes.get(mode) ?? new Set();
|
|
67
|
+
set.add(listener);
|
|
68
|
+
node.modes.set(mode, set);
|
|
69
|
+
return node;
|
|
70
|
+
};
|
|
71
|
+
export const removeListenerFromTrie = (root, segs, mode, listener) => {
|
|
72
|
+
const node = getNode(root, segs);
|
|
73
|
+
if (!node)
|
|
74
|
+
return;
|
|
75
|
+
const set = node.modes.get(mode);
|
|
76
|
+
if (set) {
|
|
77
|
+
set.delete(listener);
|
|
78
|
+
if (set.size === 0)
|
|
79
|
+
node.modes.delete(mode);
|
|
80
|
+
}
|
|
81
|
+
prunePathIfEmpty(root, segs);
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=listener-trie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener-trie.js","sourceRoot":"","sources":["../src/listener-trie.ts"],"names":[],"mappings":"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"}
|
package/dist/nameof.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Nameof<T> = (m: T extends object ? T : any) => any;
|
|
2
|
+
/**
|
|
3
|
+
* Returns either the last part of a objects path \
|
|
4
|
+
* or dotted path if the fullPath flag is set to true.
|
|
5
|
+
*/
|
|
6
|
+
export declare const nameof: <const T>(expression: (instance: T) => any) => string;
|
|
7
|
+
/**
|
|
8
|
+
* Returns a fresh array of path segments captured from the selector expression.
|
|
9
|
+
* The returned array is a new copy to avoid external mutations affecting internals.
|
|
10
|
+
*/
|
|
11
|
+
export declare const nameofSegments: <const T>(expression: (instance: T) => any) => string[];
|
|
12
|
+
//# sourceMappingURL=nameof.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nameof.d.ts","sourceRoot":"","sources":["../src/nameof.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC;AAG/D;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,GAAG,KAAG,MAKlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,GAAG,KAAG,MAAM,EAKhF,CAAC"}
|
package/dist/nameof.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { normalizePropertyKey } from "./symbol-id.js";
|
|
2
|
+
// nameof property path is stored here for retrieval.
|
|
3
|
+
const propertyThatWasAccessed = [];
|
|
4
|
+
// Proxy objects to store the property path.
|
|
5
|
+
const proxy = new Proxy({}, {
|
|
6
|
+
get: (_, prop) => {
|
|
7
|
+
// Normalize to stable id so bracket keys with dots and Symbols become stable segments
|
|
8
|
+
propertyThatWasAccessed.push(normalizePropertyKey(prop));
|
|
9
|
+
return proxy;
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Returns either the last part of a objects path \
|
|
14
|
+
* or dotted path if the fullPath flag is set to true.
|
|
15
|
+
*/
|
|
16
|
+
export const nameof = (expression) => {
|
|
17
|
+
propertyThatWasAccessed.length = 0;
|
|
18
|
+
expression(proxy);
|
|
19
|
+
return propertyThatWasAccessed.join('.');
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Returns a fresh array of path segments captured from the selector expression.
|
|
23
|
+
* The returned array is a new copy to avoid external mutations affecting internals.
|
|
24
|
+
*/
|
|
25
|
+
export const nameofSegments = (expression) => {
|
|
26
|
+
propertyThatWasAccessed.length = 0;
|
|
27
|
+
expression(proxy);
|
|
28
|
+
return propertyThatWasAccessed.slice();
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=nameof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nameof.js","sourceRoot":"","sources":["../src/nameof.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,qDAAqD;AACrD,MAAM,uBAAuB,GAAa,EAAE,CAAC;AAG7C,4CAA4C;AAC5C,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,EAAS,EAAE;IACvC,GAAG,EAAE,CAA8B,CAAM,EAAE,IAAO,EAAE,EAAE;QACrD,sFAAsF;QACtF,uBAAuB,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzD,OAAO,KAAK,CAAC;IACd,CAAC;CACD,CAAC,CAAC;AAMH;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAU,UAAgC,EAAU,EAAE;IAC3E,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,UAAU,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAU,UAAgC,EAAY,EAAE;IACrF,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,UAAU,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,uBAAuB,CAAC,KAAK,EAAE,CAAC;AACxC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a cache key from path segments.
|
|
3
|
+
*
|
|
4
|
+
* Uses ASCII Unit Separator (0x1F) as delimiter, which cannot appear in normal
|
|
5
|
+
* string keys, ensuring unambiguous path separation.
|
|
6
|
+
*
|
|
7
|
+
* @param segments - Path segments
|
|
8
|
+
* @returns Cache key string
|
|
9
|
+
*/
|
|
10
|
+
export declare const pathKeyOf: (segments: string[]) => string;
|
|
11
|
+
//# sourceMappingURL=path-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-key.d.ts","sourceRoot":"","sources":["../src/path-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,KAAG,MAA+B,CAAC"}
|
package/dist/path-key.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a cache key from path segments.
|
|
3
|
+
*
|
|
4
|
+
* Uses ASCII Unit Separator (0x1F) as delimiter, which cannot appear in normal
|
|
5
|
+
* string keys, ensuring unambiguous path separation.
|
|
6
|
+
*
|
|
7
|
+
* @param segments - Path segments
|
|
8
|
+
* @returns Cache key string
|
|
9
|
+
*/
|
|
10
|
+
export const pathKeyOf = (segments) => segments.join('\x1f');
|
|
11
|
+
//# sourceMappingURL=path-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-key.js","sourceRoot":"","sources":["../src/path-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/path.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const normalizeKey: (prop: PropertyKey) => string;
|
|
2
|
+
export declare const isArrayIndexKey: (k: string) => boolean;
|
|
3
|
+
export declare const getParentAndKey: (root: any, path: string[]) => [any, string] | null;
|
|
4
|
+
export declare const setAtPath: (root: any, path: string[], value: any) => void;
|
|
5
|
+
export declare const deleteAtPath: (root: any, path: string[]) => void;
|
|
6
|
+
export declare const ensureParents: (root: any, path: string[]) => void;
|
|
7
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,GAAI,MAAM,WAAW,KAAG,MAAoC,CAAC;AAEtF,eAAO,MAAM,eAAe,GAAI,GAAG,MAAM,KAAG,OAAqC,CAAC;AAElF,eAAO,MAAM,eAAe,GAAI,MAAM,GAAG,EAAE,MAAM,MAAM,EAAE,KAAG,CAAE,GAAG,EAAE,MAAM,CAAE,GAAG,IAe7E,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,GAAG,EAAE,MAAM,MAAM,EAAE,EAAE,OAAO,GAAG,KAAG,IAOjE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,GAAG,EAAE,MAAM,MAAM,EAAE,KAAG,IAmBxD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,GAAG,EAAE,MAAM,MAAM,EAAE,KAAG,IAazD,CAAC"}
|
package/dist/path.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { normalizePropertyKey } from "./symbol-id.js";
|
|
2
|
+
// Normalize property key to a stable string segment (symbols -> sym#id)
|
|
3
|
+
export const normalizeKey = (prop) => normalizePropertyKey(prop);
|
|
4
|
+
export const isArrayIndexKey = (k) => /^(?:0|[1-9]\d*)$/.test(k);
|
|
5
|
+
export const getParentAndKey = (root, path) => {
|
|
6
|
+
if (path.length === 0)
|
|
7
|
+
return null;
|
|
8
|
+
let parent = root;
|
|
9
|
+
for (const seg of path.slice(0, -1)) {
|
|
10
|
+
if (parent == null)
|
|
11
|
+
return null;
|
|
12
|
+
parent = parent[seg];
|
|
13
|
+
}
|
|
14
|
+
const last = path[path.length - 1];
|
|
15
|
+
return [parent, last];
|
|
16
|
+
};
|
|
17
|
+
export const setAtPath = (root, path, value) => {
|
|
18
|
+
const res = getParentAndKey(root, path);
|
|
19
|
+
if (!res)
|
|
20
|
+
return;
|
|
21
|
+
const [parent, key] = res;
|
|
22
|
+
Reflect.set(parent, key, value);
|
|
23
|
+
};
|
|
24
|
+
export const deleteAtPath = (root, path) => {
|
|
25
|
+
const res = getParentAndKey(root, path);
|
|
26
|
+
if (!res)
|
|
27
|
+
return;
|
|
28
|
+
const [parent, key] = res;
|
|
29
|
+
if (parent == null)
|
|
30
|
+
return;
|
|
31
|
+
// If deleting from an array, prefer splice to avoid holes and adjust length
|
|
32
|
+
if (Array.isArray(parent) && isArrayIndexKey(String(key))) {
|
|
33
|
+
const idx = Number(key);
|
|
34
|
+
if (Number.isInteger(idx))
|
|
35
|
+
parent.splice(idx, 1);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
Reflect.deleteProperty(parent, key);
|
|
39
|
+
};
|
|
40
|
+
export const ensureParents = (root, path) => {
|
|
41
|
+
let node = root;
|
|
42
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
43
|
+
const seg = path[i];
|
|
44
|
+
let next = node[seg];
|
|
45
|
+
if (next == null) {
|
|
46
|
+
const following = path[i + 1];
|
|
47
|
+
next = /^(?:0|[1-9]\d*)$/.test(following) ? [] : {};
|
|
48
|
+
node[seg] = next;
|
|
49
|
+
}
|
|
50
|
+
node = next;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=path.js.map
|
package/dist/path.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGtD,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAiB,EAAU,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;AAEtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAW,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAS,EAAE,IAAc,EAA0B,EAAE;IACpF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC;IAEb,IAAI,MAAM,GAAQ,IAAI,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,IAAI,MAAM,IAAI,IAAI;YACjB,OAAO,IAAI,CAAC;QAEb,MAAM,GAAI,MAAc,CAAC,GAAU,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAEpC,OAAO,CAAE,MAAM,EAAE,IAAI,CAAE,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAS,EAAE,IAAc,EAAE,KAAU,EAAQ,EAAE;IACxE,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QACP,OAAO;IAER,MAAM,CAAE,MAAM,EAAE,GAAG,CAAE,GAAG,GAAG,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAS,EAAE,IAAc,EAAQ,EAAE;IAC/D,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QACP,OAAO;IAER,MAAM,CAAE,MAAM,EAAE,GAAG,CAAE,GAAG,GAAG,CAAC;IAC5B,IAAI,MAAM,IAAI,IAAI;QACjB,OAAO;IAER,4EAA4E;IAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAEvB,OAAO;IACR,CAAC;IAED,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,GAAU,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAS,EAAE,IAAc,EAAQ,EAAE;IAChE,IAAI,IAAI,GAAQ,IAAI,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,IAAI,GAAI,IAAY,CAAC,GAAU,CAAC,CAAC;QACrC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;YAC/B,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,IAAY,CAAC,GAAU,CAAC,GAAG,IAAI,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,IAAI,CAAC;IACb,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get a cached proxy for the given root and path.
|
|
3
|
+
*
|
|
4
|
+
* @param root - The root object
|
|
5
|
+
* @param pathKey - The path key (from pathKeyOf)
|
|
6
|
+
* @returns The cached proxy, or undefined if not cached
|
|
7
|
+
*/
|
|
8
|
+
export declare const getCached: (root: object, pathKey: string) => any | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Store a proxy in the cache for the given root and path.
|
|
11
|
+
*
|
|
12
|
+
* @param root - The root object
|
|
13
|
+
* @param pathKey - The path key (from pathKeyOf)
|
|
14
|
+
* @param proxy - The proxy to cache
|
|
15
|
+
*/
|
|
16
|
+
export declare const setCached: (root: object, pathKey: string, proxy: any) => void;
|
|
17
|
+
/**
|
|
18
|
+
* Invalidate cached proxies at and below the given base path.
|
|
19
|
+
* Optionally also invalidates the parent path (for array shrinkage).
|
|
20
|
+
*
|
|
21
|
+
* @param root - The root object
|
|
22
|
+
* @param basePath - The base path to invalidate
|
|
23
|
+
* @param alsoParentArray - Whether to also invalidate the parent path
|
|
24
|
+
*/
|
|
25
|
+
export declare const invalidateAt: (root: object, basePath: string[], alsoParentArray?: boolean) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Clear all cached proxies for the given root.
|
|
28
|
+
*
|
|
29
|
+
* @param root - The root object
|
|
30
|
+
*/
|
|
31
|
+
export declare const clear: (root: object) => void;
|
|
32
|
+
//# sourceMappingURL=proxy-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-cache.d.ts","sourceRoot":"","sources":["../src/proxy-cache.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,GAAG,GAAG,SAI/D,CAAC;AAGF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,OAAO,GAAG,KAAG,IAQrE,CAAC;AAGF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,EAAE,kBAAkB,OAAO,KAAG,IAsB1F,CAAC;AAGF;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,KAAG,IAIpC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { getOptions } from "./history.js";
|
|
2
|
+
import { pathKeyOf } from "./path-key.js";
|
|
3
|
+
/**
|
|
4
|
+
* Per-root proxy cache: Map<pathKey, proxy>
|
|
5
|
+
* Enables stable proxy identity when cacheProxies option is enabled.
|
|
6
|
+
*/
|
|
7
|
+
const proxyCache = new WeakMap();
|
|
8
|
+
/**
|
|
9
|
+
* Get a cached proxy for the given root and path.
|
|
10
|
+
*
|
|
11
|
+
* @param root - The root object
|
|
12
|
+
* @param pathKey - The path key (from pathKeyOf)
|
|
13
|
+
* @returns The cached proxy, or undefined if not cached
|
|
14
|
+
*/
|
|
15
|
+
export const getCached = (root, pathKey) => {
|
|
16
|
+
const perRoot = proxyCache.get(root);
|
|
17
|
+
return perRoot?.get(pathKey);
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Store a proxy in the cache for the given root and path.
|
|
21
|
+
*
|
|
22
|
+
* @param root - The root object
|
|
23
|
+
* @param pathKey - The path key (from pathKeyOf)
|
|
24
|
+
* @param proxy - The proxy to cache
|
|
25
|
+
*/
|
|
26
|
+
export const setCached = (root, pathKey, proxy) => {
|
|
27
|
+
let perRoot = proxyCache.get(root);
|
|
28
|
+
if (!perRoot) {
|
|
29
|
+
perRoot = new Map();
|
|
30
|
+
proxyCache.set(root, perRoot);
|
|
31
|
+
}
|
|
32
|
+
perRoot.set(pathKey, proxy);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Invalidate cached proxies at and below the given base path.
|
|
36
|
+
* Optionally also invalidates the parent path (for array shrinkage).
|
|
37
|
+
*
|
|
38
|
+
* @param root - The root object
|
|
39
|
+
* @param basePath - The base path to invalidate
|
|
40
|
+
* @param alsoParentArray - Whether to also invalidate the parent path
|
|
41
|
+
*/
|
|
42
|
+
export const invalidateAt = (root, basePath, alsoParentArray) => {
|
|
43
|
+
const opts = getOptions(root);
|
|
44
|
+
if (!opts.cacheProxies)
|
|
45
|
+
return;
|
|
46
|
+
const perRoot = proxyCache.get(root);
|
|
47
|
+
if (!perRoot)
|
|
48
|
+
return;
|
|
49
|
+
const base = pathKeyOf(basePath);
|
|
50
|
+
for (const k of Array.from(perRoot.keys())) {
|
|
51
|
+
if (k === base || k.startsWith(base + '\x1f'))
|
|
52
|
+
perRoot.delete(k);
|
|
53
|
+
}
|
|
54
|
+
if (alsoParentArray) {
|
|
55
|
+
const parentKey = pathKeyOf(basePath.slice(0, -1));
|
|
56
|
+
for (const k of Array.from(perRoot.keys())) {
|
|
57
|
+
if (k === parentKey || k.startsWith(parentKey + '\x1f'))
|
|
58
|
+
perRoot.delete(k);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Clear all cached proxies for the given root.
|
|
64
|
+
*
|
|
65
|
+
* @param root - The root object
|
|
66
|
+
*/
|
|
67
|
+
export const clear = (root) => {
|
|
68
|
+
const perRoot = proxyCache.get(root);
|
|
69
|
+
if (perRoot)
|
|
70
|
+
perRoot.clear();
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=proxy-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-cache.js","sourceRoot":"","sources":["../src/proxy-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { clear as clearProxyCacheInternal, invalidateAt } from './proxy-cache.ts';
|
|
2
|
+
export interface ProxyFactoryDeps {
|
|
3
|
+
getBatchFrames: (root: object) => {
|
|
4
|
+
marker: number;
|
|
5
|
+
id: string;
|
|
6
|
+
}[] | undefined;
|
|
7
|
+
setProxyRoot: (proxy: object, root: object) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface ProxyFactory {
|
|
10
|
+
createProxy: <O extends object>(targetObject: O, path: string[] | undefined, rootObject: object) => O;
|
|
11
|
+
invalidateCacheAt: (root: object, basePath: string[], alsoParentArray?: boolean) => void;
|
|
12
|
+
clearProxyCache: (root: object) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare const invalidateCacheAt: typeof invalidateAt;
|
|
15
|
+
export declare const clearProxyCache: typeof clearProxyCacheInternal;
|
|
16
|
+
export declare const createProxyFactory: (deps: ProxyFactoryDeps) => ProxyFactory;
|
|
17
|
+
//# sourceMappingURL=proxy-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-factory.d.ts","sourceRoot":"","sources":["../src/proxy-factory.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,IAAI,uBAAuB,EAAa,YAAY,EAAa,MAAM,kBAAkB,CAAC;AAKxG,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;KAAE,EAAE,GAAG,SAAS,CAAC;IAChF,YAAY,EAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC5B,WAAW,EAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC;IAC5G,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACzF,eAAe,EAAI,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C;AAGD,eAAO,MAAM,iBAAiB,EAAE,OAAO,YAA2B,CAAC;AACnE,eAAO,MAAM,eAAe,EAAE,OAAO,uBAAiD,CAAC;AAGvF,eAAO,MAAM,kBAAkB,GAAI,MAAM,gBAAgB,KAAG,YAyI3D,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { captureShrinkRemovals, deleteIndex, isArrayIndexDeletion } from "./array-mutations.js";
|
|
2
|
+
import { adaptMapMethod, adaptSetMethod } from "./collection-adapters.js";
|
|
3
|
+
import { computeActiveGroupId } from "./grouping.js";
|
|
4
|
+
import { getOptions } from "./history.js";
|
|
5
|
+
import { recordArrayShrinkDeletes, recordDelete, recordSet } from "./history-recorder.js";
|
|
6
|
+
import { computeAffectedListeners } from "./listener-affinity.js";
|
|
7
|
+
import { getListenerBucket } from "./listener-trie.js";
|
|
8
|
+
import { normalizeKey } from "./path.js";
|
|
9
|
+
import { pathKeyOf } from "./path-key.js";
|
|
10
|
+
import { clear as clearProxyCacheInternal, getCached, invalidateAt, setCached } from "./proxy-cache.js";
|
|
11
|
+
import { notifyListeners } from "./schedule-queue.js";
|
|
12
|
+
export const invalidateCacheAt = invalidateAt;
|
|
13
|
+
export const clearProxyCache = clearProxyCacheInternal;
|
|
14
|
+
export const createProxyFactory = (deps) => {
|
|
15
|
+
const createProxy = (targetObject, path = [], rootObject) => {
|
|
16
|
+
const opts = getOptions(rootObject);
|
|
17
|
+
if (opts.cacheProxies) {
|
|
18
|
+
const pathKey = pathKeyOf(path);
|
|
19
|
+
const cached = getCached(rootObject, pathKey);
|
|
20
|
+
if (cached)
|
|
21
|
+
return cached;
|
|
22
|
+
}
|
|
23
|
+
const proxy = new Proxy(targetObject, {
|
|
24
|
+
get(target, prop) {
|
|
25
|
+
const result = Reflect.get(target, prop);
|
|
26
|
+
// Map/Set adapters: wrap mutating methods and bind non-mutators to raw target for brand checks
|
|
27
|
+
const isMap = target instanceof Map;
|
|
28
|
+
const isSet = target instanceof Set;
|
|
29
|
+
if ((isMap || isSet) && typeof result === 'function') {
|
|
30
|
+
const method = String(prop);
|
|
31
|
+
const currentPath = path.slice(); // collection lives at this path
|
|
32
|
+
if (isMap) {
|
|
33
|
+
const adapted = adaptMapMethod(target, currentPath, rootObject, deps, method);
|
|
34
|
+
if (adapted)
|
|
35
|
+
return adapted;
|
|
36
|
+
}
|
|
37
|
+
if (isSet) {
|
|
38
|
+
const adapted = adaptSetMethod(target, currentPath, rootObject, deps, method);
|
|
39
|
+
if (adapted)
|
|
40
|
+
return adapted;
|
|
41
|
+
}
|
|
42
|
+
// For other methods, bind to raw target to satisfy brand checks
|
|
43
|
+
return result.bind(target);
|
|
44
|
+
}
|
|
45
|
+
if (!result || typeof result !== 'object')
|
|
46
|
+
return result;
|
|
47
|
+
const currentPath = [...path, normalizeKey(prop)];
|
|
48
|
+
return createProxy(result, currentPath, rootObject);
|
|
49
|
+
},
|
|
50
|
+
set(target, prop, value) {
|
|
51
|
+
const currentPath = [...path, normalizeKey(prop)];
|
|
52
|
+
const hadBefore = Reflect.has(target, prop);
|
|
53
|
+
const oldValue = Reflect.get(target, prop);
|
|
54
|
+
// Capture elements that will be removed if shrinking array length
|
|
55
|
+
let removedForLengthShrink = null;
|
|
56
|
+
if (Array.isArray(target)
|
|
57
|
+
&& normalizeKey(prop) === 'length'
|
|
58
|
+
&& typeof oldValue === 'number'
|
|
59
|
+
&& typeof value === 'number'
|
|
60
|
+
&& value < oldValue)
|
|
61
|
+
removedForLengthShrink = captureShrinkRemovals(target, oldValue, value);
|
|
62
|
+
const result = Reflect.set(target, prop, value);
|
|
63
|
+
const bucket = getListenerBucket(rootObject);
|
|
64
|
+
const activeGroupId = computeActiveGroupId(rootObject, deps.getBatchFrames);
|
|
65
|
+
// Record change in history
|
|
66
|
+
recordSet(rootObject, currentPath, oldValue, value, hadBefore, activeGroupId);
|
|
67
|
+
// If we shrank array length, synthesize delete records for removed indices
|
|
68
|
+
if (removedForLengthShrink && removedForLengthShrink.length > 0)
|
|
69
|
+
recordArrayShrinkDeletes(rootObject, path, removedForLengthShrink, activeGroupId);
|
|
70
|
+
// Invalidate proxy cache for this path; if shrinking array length, also invalidate the array base
|
|
71
|
+
const shrinkingArray = Array.isArray(target)
|
|
72
|
+
&& normalizeKey(prop) === 'length'
|
|
73
|
+
&& typeof oldValue === 'number'
|
|
74
|
+
&& typeof value === 'number'
|
|
75
|
+
&& value < oldValue;
|
|
76
|
+
invalidateAt(rootObject, currentPath, shrinkingArray);
|
|
77
|
+
if (bucket) {
|
|
78
|
+
const affectedListeners = computeAffectedListeners(rootObject, currentPath);
|
|
79
|
+
const meta = { type: 'set', existedBefore: hadBefore, groupId: activeGroupId };
|
|
80
|
+
notifyListeners(rootObject, affectedListeners, [currentPath, value, oldValue, meta]);
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
},
|
|
84
|
+
deleteProperty(target, prop) {
|
|
85
|
+
const key = normalizeKey(prop);
|
|
86
|
+
const currentPath = [...path, key];
|
|
87
|
+
const oldValue = Reflect.get(target, prop);
|
|
88
|
+
const hadBefore = Reflect.has(target, prop);
|
|
89
|
+
let result;
|
|
90
|
+
// If deleting from an array by numeric index, use splice to avoid holes (parity with undo behavior)
|
|
91
|
+
if (isArrayIndexDeletion(target, key)) {
|
|
92
|
+
const idx = Number(key);
|
|
93
|
+
result = deleteIndex(rootObject, target, idx);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
result = Reflect.deleteProperty(target, prop);
|
|
97
|
+
}
|
|
98
|
+
const bucket = getListenerBucket(rootObject);
|
|
99
|
+
const activeGroupId = computeActiveGroupId(rootObject, deps.getBatchFrames);
|
|
100
|
+
// Record change in history
|
|
101
|
+
recordDelete(rootObject, currentPath, oldValue, activeGroupId);
|
|
102
|
+
// Invalidate proxy cache for this path and, for array index splice case, also for the array base
|
|
103
|
+
const isArrayIndex = isArrayIndexDeletion(target, key);
|
|
104
|
+
invalidateAt(rootObject, currentPath, isArrayIndex);
|
|
105
|
+
// Notify listeners (deletes affect exact path only and descendants no longer exist)
|
|
106
|
+
if (bucket) {
|
|
107
|
+
const affectedListeners = computeAffectedListeners(rootObject, currentPath);
|
|
108
|
+
const meta = { type: 'delete', existedBefore: hadBefore, groupId: activeGroupId };
|
|
109
|
+
notifyListeners(rootObject, affectedListeners, [currentPath, undefined, oldValue, meta]);
|
|
110
|
+
}
|
|
111
|
+
return result;
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
deps.setProxyRoot(proxy, rootObject);
|
|
115
|
+
// Store in cache if enabled
|
|
116
|
+
if (opts.cacheProxies) {
|
|
117
|
+
const pathKey = pathKeyOf(path);
|
|
118
|
+
setCached(rootObject, pathKey, proxy);
|
|
119
|
+
}
|
|
120
|
+
return proxy;
|
|
121
|
+
};
|
|
122
|
+
return { createProxy, invalidateCacheAt, clearProxyCache };
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=proxy-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-factory.js","sourceRoot":"","sources":["../src/proxy-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChangeListener, ChangeMeta, ListenerOptions } from './types.ts';
|
|
2
|
+
export declare const notifyListeners: (root: object, listeners: Set<ChangeListener>, args: [string[], any, any, ChangeMeta | undefined]) => void;
|
|
3
|
+
export declare const pause: (obj: object) => void;
|
|
4
|
+
export declare const resume: (obj: object) => void;
|
|
5
|
+
export declare const flush: (obj: object) => void;
|
|
6
|
+
export declare const buildEffectiveListener: (listener: ChangeListener, options?: ListenerOptions) => {
|
|
7
|
+
effective: ChangeListener;
|
|
8
|
+
setUnsubscribe: (fn: () => void) => void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=schedule-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-queue.d.ts","sourceRoot":"","sources":["../src/schedule-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAiB1F,eAAO,MAAM,eAAe,GAC3B,MAAM,MAAM,EACZ,WAAW,GAAG,CAAC,cAAc,CAAC,EAC9B,MAAM,CAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,GAAG,SAAS,CAAE,KAClD,IAWF,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,KAAG,IAMnC,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,KAAK,MAAM,KAAG,IAUpC,CAAC;AAEF,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,KAAG,IAQnC,CAAC;AAGF,eAAO,MAAM,sBAAsB,GAClC,UAAU,cAAc,EACxB,UAAU,eAAe,KACvB;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CA2ExE,CAAC"}
|