patch-recorder 0.0.1 → 0.2.0

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAU/C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAC5B,KAAQ,EACR,MAAiC,EACjC,UAAgC,EAAE;IAElC,MAAM,sBAAsB,GAAG;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,IAAI,IAAI;KAC5D,CAAC;IAEF,MAAM,aAAa,GAAG;QACrB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE;YACR,GAAG,OAAO;YACV,sBAAsB;SACtB;KACD,CAAC;IAEF,eAAe;IACf,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,aAAa,CAAa,CAAC;IAEhE,kBAAkB;IAClB,MAAM,CAAC,KAAK,CAAC,CAAC;IAEd,yCAAyC;IACzC,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,aAAa,CAAC,OAAwB,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,MAAM,CACrB,KAAQ,EACR,MAAiC,EACjC,UAAwD,EAAC,aAAa,EAAE,IAAI,EAAC;IAE7E,oEAAoE;IACpE,MAAM,EAAC,aAAa,EAAE,GAAG,oBAAoB,EAAC,GAAG,OAAO,CAAC;IACzD,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAG/C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAG3B,KAAQ,EAAE,MAAiC,EAAE,OAAuB;IACrE,MAAM,aAAa,GAAG;QACrB,KAAK;QACL,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE;YACR,GAAG,OAAO;SACV;QACD,UAAU,EAAE,IAAI,OAAO,EAAE;KACzB,CAAC;IAEF,eAAe;IACf,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,aAAa,CAAa,CAAC;IAEhE,kBAAkB;IAClB,MAAM,CAAC,KAAK,CAAC,CAAC;IAEd,yCAAyC;IACzC,IAAI,OAAO,EAAE,eAAe,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,aAAa,CAAC,OAAkB,CAAC;AACzC,CAAC"}
package/dist/maps.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import type { RecorderState } from './types.js';
1
+ import type { PatchPath, RecorderState } from './types.js';
2
2
  /**
3
3
  * Handle property access on Map objects
4
4
  * Wraps mutating methods (set, delete, clear) to generate patches
5
5
  */
6
- export declare function handleMapGet<K = any, V = any>(obj: Map<K, V>, prop: string | symbol, path: (string | number)[], state: RecorderState<any>): any;
6
+ export declare function handleMapGet(obj: Map<any, any>, prop: string | symbol, path: PatchPath, state: RecorderState<any>): any;
7
7
  //# sourceMappingURL=maps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"maps.d.ts","sourceRoot":"","sources":["../src/maps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAM9C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAC5C,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACd,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACzB,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GACvB,GAAG,CAqFL"}
1
+ {"version":3,"file":"maps.d.ts","sourceRoot":"","sources":["../src/maps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAE,aAAa,EAAC,MAAM,YAAY,CAAC;AAKzD;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAClB,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GACvB,GAAG,CAoFL"}
package/dist/maps.js CHANGED
@@ -1,27 +1,28 @@
1
1
  import { createProxy } from './proxy.js';
2
2
  import { generateAddPatch, generateDeletePatch, generateReplacePatch } from './patches.js';
3
- import { cloneIfNeeded, isMap, isArray } from './utils.js';
3
+ import { cloneIfNeeded } from './utils.js';
4
4
  /**
5
5
  * Handle property access on Map objects
6
6
  * Wraps mutating methods (set, delete, clear) to generate patches
7
7
  */
8
8
  export function handleMapGet(obj, prop, path, state) {
9
- // Skip symbol properties
9
+ // Handle symbol properties - return the property value directly
10
+ // Symbol methods like Symbol.iterator should work normally
10
11
  if (typeof prop === 'symbol') {
11
12
  return obj[prop];
12
13
  }
13
14
  // Mutating methods
14
15
  if (prop === 'set') {
15
16
  return (key, value) => {
16
- // Check if key existed BEFORE mutation
17
- const existed = keyExistsInOriginal(state.original, path, key);
17
+ // Check if key exists BEFORE mutation (current state, not original)
18
+ const existed = obj.has(key);
18
19
  const oldValue = obj.get(key);
19
20
  const result = obj.set(key, value);
20
21
  // Generate patch
21
22
  const itemPath = [...path, key];
22
23
  if (existed) {
23
- // Key exists - replace
24
- generateReplacePatch(state, itemPath, cloneIfNeeded(value));
24
+ // Key exists - replace (pass oldValue for getItemId)
25
+ generateReplacePatch(state, itemPath, cloneIfNeeded(value), oldValue);
25
26
  }
26
27
  else {
27
28
  // Key doesn't exist - add
@@ -56,11 +57,9 @@ export function handleMapGet(obj, prop, path, state) {
56
57
  if (prop === 'get') {
57
58
  return (key) => {
58
59
  const value = obj.get(key);
59
- // If the value is a Map, Array, or object, return a proxy
60
+ // If the value is an object, return a proxy for nested mutation tracking
60
61
  if (value != null && typeof value === 'object') {
61
- if (isMap(value) || isArray(value)) {
62
- return createProxy(value, [...path, key], state);
63
- }
62
+ return createProxy(value, [...path, key], state);
64
63
  }
65
64
  return value;
66
65
  };
@@ -76,21 +75,4 @@ export function handleMapGet(obj, prop, path, state) {
76
75
  // Return any other property
77
76
  return obj[prop];
78
77
  }
79
- /**
80
- * Navigate to the original Map at the given path and check if a key exists
81
- * This is needed to check if a key existed before mutations
82
- */
83
- function keyExistsInOriginal(original, path, key) {
84
- let current = original;
85
- for (const part of path) {
86
- if (current == null)
87
- return false;
88
- current = current[part];
89
- }
90
- // If we reached a Map, check if the key exists
91
- if (current instanceof Map) {
92
- return current.has(key);
93
- }
94
- return false;
95
- }
96
78
  //# sourceMappingURL=maps.js.map
package/dist/maps.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"maps.js","sourceRoot":"","sources":["../src/maps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"maps.js","sourceRoot":"","sources":["../src/maps.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,22 @@
1
1
  import type { Patches } from './types.js';
2
+ /**
3
+ * Compress patches by merging redundant operations using nested Maps
4
+ * This is faster than the string-key version because:
5
+ * - No string allocation for path keys
6
+ * - Preserves symbol and object identity
7
+ * - 2.5-5x faster in benchmarks
8
+ */
9
+ export declare function compressPatchesWithNestedMaps(patches: Patches): Patches;
10
+ /**
11
+ * Compress patches by merging redundant operations using string keys
12
+ * This is the original implementation that uses pathToKey for path lookup.
13
+ */
14
+ export declare function compressPatchesWithStringKeys(patches: Patches): Patches;
2
15
  /**
3
16
  * Compress patches by merging redundant operations
4
17
  * This handles both consecutive and interleaved operations on the same path
18
+ *
19
+ * Uses the nested Map implementation for better performance (2.5-5x faster)
5
20
  */
6
- export declare function compressPatches(patches: Patches<true>): Patches<true>;
21
+ export declare const compressPatches: typeof compressPatchesWithNestedMaps;
7
22
  //# sourceMappingURL=optimizer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,YAAY,CAAC;AAExC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCrE"}
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,OAAO,EAAY,MAAM,YAAY,CAAC;AAiD1D;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CA6CvE;AAID;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CA8CvE;AAID;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sCAAgC,CAAC"}
package/dist/optimizer.js CHANGED
@@ -1,42 +1,224 @@
1
+ import { pathToKey } from './utils.js';
1
2
  /**
2
- * Compress patches by merging redundant operations
3
- * This handles both consecutive and interleaved operations on the same path
3
+ * Navigate to a node in the path tree, creating nodes along the way
4
4
  */
5
- export function compressPatches(patches) {
5
+ function getOrCreateNode(root, path) {
6
+ let current = root;
7
+ for (const key of path) {
8
+ if (!current.children) {
9
+ current.children = new Map();
10
+ }
11
+ let child = current.children.get(key);
12
+ if (!child) {
13
+ child = {};
14
+ current.children.set(key, child);
15
+ }
16
+ current = child;
17
+ }
18
+ return current;
19
+ }
20
+ /**
21
+ * Collect all patches from the path tree
22
+ */
23
+ function collectPatches(node, patches = []) {
24
+ if (node.patch) {
25
+ patches.push(node.patch);
26
+ }
27
+ if (node.children) {
28
+ for (const child of node.children.values()) {
29
+ collectPatches(child, patches);
30
+ }
31
+ }
32
+ return patches;
33
+ }
34
+ // ==================== V2: Nested Map optimizer (faster) ====================
35
+ /**
36
+ * Compress patches by merging redundant operations using nested Maps
37
+ * This is faster than the string-key version because:
38
+ * - No string allocation for path keys
39
+ * - Preserves symbol and object identity
40
+ * - 2.5-5x faster in benchmarks
41
+ */
42
+ export function compressPatchesWithNestedMaps(patches) {
43
+ if (patches.length === 0) {
44
+ return patches;
45
+ }
46
+ // Use a nested Map tree to track the latest operation for each path
47
+ const root = {};
48
+ for (const patch of patches) {
49
+ const node = getOrCreateNode(root, patch.path);
50
+ const existing = node.patch;
51
+ if (!existing) {
52
+ // First operation on this path
53
+ node.patch = patch;
54
+ }
55
+ else {
56
+ // Merge with existing operation based on operation types
57
+ const merged = mergePatches(existing, patch);
58
+ // Check for undefined specifically (null means canceled, which is a valid result)
59
+ if (merged !== undefined) {
60
+ // Update with merged result (or null if they cancel out)
61
+ if (merged !== null) {
62
+ node.patch = merged;
63
+ }
64
+ else {
65
+ // Operations canceled each other out
66
+ delete node.patch;
67
+ }
68
+ }
69
+ else {
70
+ // Can't merge, keep the new operation
71
+ node.patch = patch;
72
+ }
73
+ }
74
+ }
75
+ // Collect all patches from tree
76
+ let finalPatches = collectPatches(root);
77
+ // Handle array push + pop cancellation
78
+ // Only cancel when push is at the last index and pop reduces length
79
+ finalPatches = cancelArrayPushPop(finalPatches);
80
+ // Cancel patches that are beyond array bounds after final length update
81
+ finalPatches = cancelOutOfBoundsPatches(finalPatches);
82
+ return finalPatches;
83
+ }
84
+ // ==================== V1: String key optimizer (original) ====================
85
+ /**
86
+ * Compress patches by merging redundant operations using string keys
87
+ * This is the original implementation that uses pathToKey for path lookup.
88
+ */
89
+ export function compressPatchesWithStringKeys(patches) {
6
90
  if (patches.length === 0) {
7
91
  return patches;
8
92
  }
9
93
  // Use a Map to track the latest operation for each path
10
- // Key: JSON stringified path, Value: the latest patch for that path
94
+ // Key: optimized path string (using pathToKey), Value: the latest patch for that path
11
95
  const pathMap = new Map();
12
96
  for (const patch of patches) {
13
- const pathKey = JSON.stringify(patch.path);
97
+ const pathKey = pathToKey(patch.path);
14
98
  const existing = pathMap.get(pathKey);
15
99
  if (!existing) {
16
100
  // First operation on this path
17
101
  pathMap.set(pathKey, patch);
18
- continue;
19
102
  }
20
- // Merge with existing operation based on operation types
21
- const merged = mergePatches(existing, patch);
22
- if (merged) {
23
- // Update with merged result (or null if they cancel out)
24
- if (merged !== null) {
25
- pathMap.set(pathKey, merged);
103
+ else {
104
+ // Merge with existing operation based on operation types
105
+ const merged = mergePatches(existing, patch);
106
+ // Check for undefined specifically (null means canceled, which is a valid result)
107
+ if (merged !== undefined) {
108
+ // Update with merged result (or null if they cancel out)
109
+ if (merged !== null) {
110
+ pathMap.set(pathKey, merged);
111
+ }
112
+ else {
113
+ // Operations canceled each other out
114
+ pathMap.delete(pathKey);
115
+ }
26
116
  }
27
117
  else {
28
- // Operations canceled each other out
29
- pathMap.delete(pathKey);
118
+ // Can't merge, keep the new operation
119
+ pathMap.set(pathKey, patch);
30
120
  }
31
121
  }
32
- else {
33
- // Can't merge, keep the new operation
34
- pathMap.set(pathKey, patch);
122
+ }
123
+ // Convert Map to array for final processing
124
+ let finalPatches = Array.from(pathMap.values());
125
+ // Handle array push + pop cancellation
126
+ // Only cancel when push is at the last index and pop reduces length
127
+ finalPatches = cancelArrayPushPop(finalPatches);
128
+ // Cancel patches that are beyond array bounds after final length update
129
+ finalPatches = cancelOutOfBoundsPatches(finalPatches);
130
+ return finalPatches;
131
+ }
132
+ // ==================== Default export ====================
133
+ /**
134
+ * Compress patches by merging redundant operations
135
+ * This handles both consecutive and interleaved operations on the same path
136
+ *
137
+ * Uses the nested Map implementation for better performance (2.5-5x faster)
138
+ */
139
+ export const compressPatches = compressPatchesWithNestedMaps;
140
+ // ==================== Post-processing functions (shared) ====================
141
+ /**
142
+ * Cancel array push + pop operations
143
+ * Only cancels when push is at the last index and pop reduces length
144
+ *
145
+ * Note: Uses pathToKey for grouping since this works on already-compressed patches
146
+ * (smaller set) and the performance benefit of nested Maps is less significant here.
147
+ */
148
+ function cancelArrayPushPop(patches) {
149
+ // Group patches by parent array path
150
+ const arrayGroups = new Map();
151
+ for (const patch of patches) {
152
+ if (!Array.isArray(patch.path) || patch.path.length < 2) {
153
+ continue;
154
+ }
155
+ const parentPath = patch.path.slice(0, -1);
156
+ const parentKey = pathToKey(parentPath);
157
+ if (!arrayGroups.has(parentKey)) {
158
+ arrayGroups.set(parentKey, []);
159
+ }
160
+ arrayGroups.get(parentKey).push(patch);
161
+ }
162
+ // Use WeakSet to track cancelable patches by reference (no string allocation)
163
+ const cancelablePatches = new WeakSet();
164
+ for (const [, groupPatches] of arrayGroups.entries()) {
165
+ // Find push patches (add at highest indices)
166
+ const pushPatches = groupPatches
167
+ .filter((p) => p.op === 'add' && typeof p.path[p.path.length - 1] === 'number')
168
+ .sort((a, b) => b.path[b.path.length - 1] - a.path[a.path.length - 1]);
169
+ // Find pop patches (length reduction)
170
+ const popPatches = groupPatches.filter((p) => p.op === 'replace' && p.path[p.path.length - 1] === 'length');
171
+ // Cancel pushes and pops that match (push at highest index, pop reduces length)
172
+ const cancelCount = Math.min(pushPatches.length, popPatches.length);
173
+ for (let i = 0; i < cancelCount; i++) {
174
+ const pushPatch = pushPatches[i];
175
+ const popPatch = popPatches[i];
176
+ // Check if the push index matches the pop target
177
+ const pushIndex = pushPatch.path[pushPatch.path.length - 1];
178
+ const popLength = popPatch.value;
179
+ // If push added at index pushIndex and pop reduced to popLength, they cancel
180
+ // This is a heuristic: push adds at end, pop removes from end
181
+ if (pushIndex >= popLength) {
182
+ cancelablePatches.add(pushPatch);
183
+ cancelablePatches.add(popPatch);
184
+ }
185
+ }
186
+ }
187
+ return patches.filter((patch) => !cancelablePatches.has(patch));
188
+ }
189
+ /**
190
+ * Cancel patches that are beyond array bounds after final length update
191
+ */
192
+ function cancelOutOfBoundsPatches(patches) {
193
+ // Find the final length for each array
194
+ const arrayLengths = new Map();
195
+ for (const patch of patches) {
196
+ if (Array.isArray(patch.path) &&
197
+ patch.path.length >= 2 &&
198
+ patch.path[patch.path.length - 1] === 'length') {
199
+ const parentPath = pathToKey(patch.path.slice(0, -1));
200
+ arrayLengths.set(parentPath, patch.value);
201
+ }
202
+ }
203
+ // Use WeakSet to track canceled patches by reference (no string allocation)
204
+ const canceledPatches = new WeakSet();
205
+ // Cancel patches at indices >= final length
206
+ for (const patch of patches) {
207
+ if (!Array.isArray(patch.path) || patch.path.length < 2) {
208
+ continue;
209
+ }
210
+ const lastPath = patch.path[patch.path.length - 1];
211
+ const parentPath = pathToKey(patch.path.slice(0, -1));
212
+ if (typeof lastPath === 'number' && arrayLengths.has(parentPath)) {
213
+ const length = arrayLengths.get(parentPath);
214
+ if (lastPath >= length) {
215
+ canceledPatches.add(patch);
216
+ }
35
217
  }
36
218
  }
37
- // Convert Map back to array
38
- return Array.from(pathMap.values());
219
+ return patches.filter((patch) => !canceledPatches.has(patch));
39
220
  }
221
+ // ==================== Patch merging logic (shared) ====================
40
222
  /**
41
223
  * Merge two patches on the same path
42
224
  * Returns the merged patch, or null if they cancel out, or undefined if they can't be merged
@@ -48,19 +230,19 @@ function mergePatches(patch1, patch2) {
48
230
  if (op1 === op2) {
49
231
  // For replace operations, keep the latest value
50
232
  if (op1 === 'replace') {
51
- // Skip if same value (no-op)
52
- if (valuesEqual(patch1.value, patch2.value)) {
233
+ // Skip if same reference (no-op)
234
+ if (patch1.value === patch2.value) {
53
235
  return patch1;
54
236
  }
55
237
  return patch2;
56
238
  }
57
- // For add operations, if adding the same value, it's a no-op
58
- if (op1 === 'add' && valuesEqual(patch1.value, patch2.value)) {
239
+ // For add operations, if adding same reference, it's a no-op
240
+ if (op1 === 'add' && patch1.value === patch2.value) {
59
241
  return patch1;
60
242
  }
61
- // For remove operations, keep the latest
243
+ // For remove operations, don't merge (sequential removes should never be merged)
62
244
  if (op1 === 'remove') {
63
- return patch2;
245
+ return undefined;
64
246
  }
65
247
  }
66
248
  // Different operations
@@ -81,43 +263,14 @@ function mergePatches(patch1, patch2) {
81
263
  return null;
82
264
  }
83
265
  if (op1 === 'remove' && op2 === 'add') {
84
- // Remove then add - keep the add
85
- return patch2;
266
+ // Remove then add - this is a replace operation
267
+ return {
268
+ op: 'replace',
269
+ path: patch1.path,
270
+ value: patch2.value,
271
+ };
86
272
  }
87
273
  // Can't merge these operations
88
274
  return undefined;
89
275
  }
90
- /**
91
- * Check if two values are equal (deep comparison)
92
- */
93
- function valuesEqual(val1, val2) {
94
- if (val1 === val2)
95
- return true;
96
- // Handle null/undefined
97
- if (val1 == null || val2 == null)
98
- return val1 === val2;
99
- // Handle arrays
100
- if (Array.isArray(val1) && Array.isArray(val2)) {
101
- if (val1.length !== val2.length)
102
- return false;
103
- for (let i = 0; i < val1.length; i++) {
104
- if (!valuesEqual(val1[i], val2[i]))
105
- return false;
106
- }
107
- return true;
108
- }
109
- // Handle objects
110
- if (typeof val1 === 'object' && typeof val2 === 'object') {
111
- const keys1 = Object.keys(val1);
112
- const keys2 = Object.keys(val2);
113
- if (keys1.length !== keys2.length)
114
- return false;
115
- for (const key of keys1) {
116
- if (!valuesEqual(val1[key], val2[key]))
117
- return false;
118
- }
119
- return true;
120
- }
121
- return false;
122
- }
123
276
  //# sourceMappingURL=optimizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"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"}
package/dist/patches.d.ts CHANGED
@@ -1,18 +1,18 @@
1
- import type { RecorderState } from './types.js';
1
+ import type { NonPrimitive, PatchPath, RecorderState } from './types.js';
2
2
  /**
3
3
  * Generate a replace patch for property changes
4
4
  */
5
- export declare function generateSetPatch(state: RecorderState<any>, path: (string | number)[], oldValue: any, newValue: any): void;
5
+ export declare function generateSetPatch(state: RecorderState<NonPrimitive>, path: PatchPath, oldValue: unknown, newValue: unknown): void;
6
6
  /**
7
7
  * Generate a remove patch for property deletions
8
8
  */
9
- export declare function generateDeletePatch(state: RecorderState<any>, path: (string | number)[], oldValue: any): void;
9
+ export declare function generateDeletePatch(state: RecorderState<NonPrimitive>, path: PatchPath, oldValue: unknown): void;
10
10
  /**
11
11
  * Generate an add patch for new properties
12
12
  */
13
- export declare function generateAddPatch(state: RecorderState<any>, path: (string | number)[], value: any): void;
13
+ export declare function generateAddPatch(state: RecorderState<any>, path: PatchPath, value: any): void;
14
14
  /**
15
15
  * Generate a replace patch for full object/array replacement
16
16
  */
17
- export declare function generateReplacePatch(state: RecorderState<any>, path: (string | number)[], value: any): void;
17
+ export declare function generateReplacePatch(state: RecorderState<any>, path: PatchPath, value: unknown, oldValue?: unknown): void;
18
18
  //# sourceMappingURL=patches.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patches.d.ts","sourceRoot":"","sources":["../src/patches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAI9C;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACzB,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,GAAG,QASb;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACzB,QAAQ,EAAE,GAAG,QAQb;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,QAQhG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACzB,KAAK,EAAE,GAAG,QASV"}
1
+ {"version":3,"file":"patches.d.ts","sourceRoot":"","sources":["../src/patches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAS,SAAS,EAAE,aAAa,EAAC,MAAM,YAAY,CAAC;AAI9E;;GAEG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,QAkBjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,OAAO,QAiBjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,QAOtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,OAAO,QAkBlB"}
package/dist/patches.js CHANGED
@@ -1,14 +1,22 @@
1
1
  import { Operation } from './types.js';
2
- import { formatPath, cloneIfNeeded } from './utils.js';
2
+ import { cloneIfNeeded, findGetItemIdFn } from './utils.js';
3
3
  /**
4
4
  * Generate a replace patch for property changes
5
5
  */
6
6
  export function generateSetPatch(state, path, oldValue, newValue) {
7
7
  const patch = {
8
8
  op: Operation.Replace,
9
- path: formatPath(path, state.options),
9
+ path,
10
10
  value: cloneIfNeeded(newValue),
11
11
  };
12
+ // Add id if getItemId is configured for this path
13
+ const getItemIdFn = findGetItemIdFn(path, state.options.getItemId);
14
+ if (getItemIdFn && oldValue !== undefined) {
15
+ const id = getItemIdFn(oldValue);
16
+ if (id !== undefined && id !== null) {
17
+ patch.id = id;
18
+ }
19
+ }
12
20
  state.patches.push(patch);
13
21
  }
14
22
  /**
@@ -17,8 +25,16 @@ export function generateSetPatch(state, path, oldValue, newValue) {
17
25
  export function generateDeletePatch(state, path, oldValue) {
18
26
  const patch = {
19
27
  op: Operation.Remove,
20
- path: formatPath(path, state.options),
28
+ path: path,
21
29
  };
30
+ // Add id if getItemId is configured for this path
31
+ const getItemIdFn = findGetItemIdFn(path, state.options.getItemId);
32
+ if (getItemIdFn && oldValue !== undefined) {
33
+ const id = getItemIdFn(oldValue);
34
+ if (id !== undefined && id !== null) {
35
+ patch.id = id;
36
+ }
37
+ }
22
38
  state.patches.push(patch);
23
39
  }
24
40
  /**
@@ -27,7 +43,7 @@ export function generateDeletePatch(state, path, oldValue) {
27
43
  export function generateAddPatch(state, path, value) {
28
44
  const patch = {
29
45
  op: Operation.Add,
30
- path: formatPath(path, state.options),
46
+ path,
31
47
  value: cloneIfNeeded(value),
32
48
  };
33
49
  state.patches.push(patch);
@@ -35,12 +51,20 @@ export function generateAddPatch(state, path, value) {
35
51
  /**
36
52
  * Generate a replace patch for full object/array replacement
37
53
  */
38
- export function generateReplacePatch(state, path, value) {
54
+ export function generateReplacePatch(state, path, value, oldValue) {
39
55
  const patch = {
40
56
  op: Operation.Replace,
41
- path: formatPath(path, state.options),
57
+ path: path,
42
58
  value: cloneIfNeeded(value),
43
59
  };
60
+ // Add id if getItemId is configured for this path
61
+ const getItemIdFn = findGetItemIdFn(path, state.options.getItemId);
62
+ if (getItemIdFn && oldValue !== undefined) {
63
+ const id = getItemIdFn(oldValue);
64
+ if (id !== undefined && id !== null) {
65
+ patch.id = id;
66
+ }
67
+ }
44
68
  state.patches.push(patch);
45
69
  }
46
70
  //# sourceMappingURL=patches.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"patches.js","sourceRoot":"","sources":["../src/patches.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AACrC,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,YAAY,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC/B,KAAyB,EACzB,IAAyB,EACzB,QAAa,EACb,QAAa;IAEb,MAAM,KAAK,GAAG;QACb,EAAE,EAAE,SAAS,CAAC,OAAO;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAyB,EACzB,IAAyB,EACzB,QAAa;IAEb,MAAM,KAAK,GAAG;QACb,EAAE,EAAE,SAAS,CAAC,MAAM;QACpB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;KACrC,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB,EAAE,IAAyB,EAAE,KAAU;IAChG,MAAM,KAAK,GAAG;QACb,EAAE,EAAE,SAAS,CAAC,GAAG;QACjB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;KAC3B,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAAyB,EACzB,IAAyB,EACzB,KAAU;IAEV,MAAM,KAAK,GAAG;QACb,EAAE,EAAE,SAAS,CAAC,OAAO;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;QACrC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;KAC3B,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"patches.js","sourceRoot":"","sources":["../src/patches.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAC,MAAM,YAAY,CAAC;AACrC,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC/B,KAAkC,EAClC,IAAe,EACf,QAAiB,EACjB,QAAiB;IAEjB,MAAM,KAAK,GAAQ;QAClB,EAAE,EAAE,SAAS,CAAC,OAAO;QACrB,IAAI;QACJ,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC;KAC9B,CAAC;IAEF,kDAAkD;IAClD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,WAAW,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAkC,EAClC,IAAe,EACf,QAAiB;IAEjB,MAAM,KAAK,GAAU;QACpB,EAAE,EAAE,SAAS,CAAC,MAAM;QACpB,IAAI,EAAE,IAAI;KACV,CAAC;IAEF,kDAAkD;IAClD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,WAAW,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAyB,EAAE,IAAe,EAAE,KAAU;IACtF,MAAM,KAAK,GAAU;QACpB,EAAE,EAAE,SAAS,CAAC,GAAG;QACjB,IAAI;QACJ,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAAyB,EACzB,IAAe,EACf,KAAc,EACd,QAAkB;IAElB,MAAM,KAAK,GAAU;QACpB,EAAE,EAAE,SAAS,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;KAC3B,CAAC;IAEF,kDAAkD;IAClD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,WAAW,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACrC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACf,CAAC;IACF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
package/dist/proxy.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import type { RecorderState } from './types.js';
2
- export declare function createProxy<T extends object>(target: T, path: (string | number)[], state: RecorderState<any>): T;
1
+ import type { PatchPath, RecorderState } from './types.js';
2
+ export declare function createProxy<T extends object>(target: T, path: PatchPath, state: RecorderState<any>): T;
3
3
  //# sourceMappingURL=proxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,YAAY,CAAC;AAO9C,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC3C,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EACzB,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GACvB,CAAC,CAuJH"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAE,aAAa,EAAC,MAAM,YAAY,CAAC;AAOzD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC3C,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,GACvB,CAAC,CAwIH"}