patch-recorder 0.2.2 → 0.4.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/README.md +94 -27
- package/dist/arrays.js +22 -10
- package/dist/arrays.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/maps.d.ts.map +1 -1
- package/dist/maps.js +15 -7
- package/dist/maps.js.map +1 -1
- package/dist/optimizer.js +18 -5
- package/dist/optimizer.js.map +1 -1
- package/dist/patches.d.ts +38 -7
- package/dist/patches.d.ts.map +1 -1
- package/dist/patches.js +122 -49
- package/dist/patches.js.map +1 -1
- package/dist/proxy.d.ts +18 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +158 -7
- package/dist/proxy.js.map +1 -1
- package/dist/sets.d.ts.map +1 -1
- package/dist/sets.js +10 -3
- package/dist/sets.js.map +1 -1
- package/dist/types.d.ts +77 -15
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/arrays.ts +22 -10
- package/src/index.ts +1 -3
- package/src/maps.ts +17 -7
- package/src/optimizer.ts +20 -6
- package/src/patches.ts +142 -55
- package/src/proxy.ts +179 -8
- package/src/sets.ts +11 -3
- package/src/types.ts +82 -15
- package/src/utils.ts +7 -0
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- ✅ **Immediate patch generation** - Patches generated as mutations occur
|
|
12
12
|
- ✅ **Optimization enabled by default** - Automatically compresses/merges redundant patches
|
|
13
13
|
- ✅ **Full collection support** - Works with objects, arrays, Maps, and Sets
|
|
14
|
-
- ✅ **Item ID tracking** - Optionally include item IDs
|
|
14
|
+
- ✅ **Item ID tracking** - Optionally include item IDs when modifying fields inside array items
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
@@ -90,9 +90,9 @@ Records JSON patches from mutations applied to the state.
|
|
|
90
90
|
#### Options
|
|
91
91
|
|
|
92
92
|
|
|
93
|
-
- **`arrayLengthAssignment`** (boolean, default: `true`) - When `true`, includes length patches when array shrinks (pop, shift, splice delete). When `false`,
|
|
93
|
+
- **`arrayLengthAssignment`** (boolean, default: `true`) - When `true`, includes length patches when array shrinks (pop, shift, splice delete). When `false`, generates individual remove patches instead. Aligned with mutative's behavior.
|
|
94
94
|
- **`compressPatches`** (boolean, default: `true`) - Compress patches by merging redundant operations
|
|
95
|
-
- **`getItemId`** (object, optional) - Configuration for extracting item IDs (see [Item ID Tracking](#item-id-tracking))
|
|
95
|
+
- **`getItemId`** (object, optional) - Configuration for extracting item IDs when modifying fields inside array items. (see [Item ID Tracking](#item-id-tracking))
|
|
96
96
|
|
|
97
97
|
|
|
98
98
|
#### Returns
|
|
@@ -221,32 +221,78 @@ const patches = recordPatches(state, (state) => {
|
|
|
221
221
|
// const patches = recordPatches(state, (state) => { ... }, { compressPatches: false });
|
|
222
222
|
console.log(patches);
|
|
223
223
|
// [{ op: 'replace', path: ['value'], value: 5 }]
|
|
224
|
+
```
|
|
224
225
|
|
|
225
226
|
|
|
226
227
|
### Item ID Tracking
|
|
227
228
|
|
|
228
|
-
|
|
229
|
+
The `getItemId` option allows you to track modifications **inside** array items. When you modify a field inside an item (e.g., `items[2].name = 'new'`), the patch includes the item's `id` and `pathIndex`, making it easy to identify which item was modified regardless of index changes.
|
|
230
|
+
|
|
231
|
+
**Key Concept:** Item IDs are included when **modifying fields inside an item**, NOT when **replacing or removing the item itself**:
|
|
232
|
+
|
|
233
|
+
- `state.items[2].name = 'new'` → Patch includes `id` (field inside item was modified)
|
|
234
|
+
- `state.items[2] = newItem` → Patch does NOT include `id` (item itself was replaced)
|
|
235
|
+
- `state.items.splice(2, 1)` → Patch does NOT include `id` (item was removed from array)
|
|
236
|
+
|
|
237
|
+
This design allows consumers to separately track:
|
|
238
|
+
1. Modifications to an item's contents (patches include `id`)
|
|
239
|
+
2. Structural changes to the array itself (patches do NOT include `id`)
|
|
229
240
|
|
|
230
241
|
```typescript
|
|
231
242
|
const state = {
|
|
232
243
|
users: [
|
|
233
244
|
{ id: 'user-1', name: 'Alice' },
|
|
234
245
|
{ id: 'user-2', name: 'Bob' },
|
|
235
|
-
{ id: 'user-3', name: 'Charlie' },
|
|
236
246
|
]
|
|
237
247
|
};
|
|
238
248
|
|
|
249
|
+
// Modifying a field INSIDE an item - includes id
|
|
239
250
|
const patches = recordPatches(state, (state) => {
|
|
240
|
-
state.users.
|
|
251
|
+
state.users[1].name = 'Robert';
|
|
241
252
|
}, {
|
|
242
253
|
getItemId: {
|
|
243
|
-
users: (user) => user.id
|
|
254
|
+
users: (user) => user.id
|
|
244
255
|
}
|
|
245
256
|
});
|
|
246
257
|
|
|
247
258
|
console.log(patches);
|
|
248
|
-
// [{
|
|
249
|
-
//
|
|
259
|
+
// [{
|
|
260
|
+
// op: 'replace',
|
|
261
|
+
// path: ['users', 1, 'name'],
|
|
262
|
+
// value: 'Robert',
|
|
263
|
+
// id: 'user-2', // ID of the item being modified
|
|
264
|
+
// pathIndex: 2 // path.slice(0, pathIndex) = ['users', 1] (path to the item)
|
|
265
|
+
// }]
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
#### Structural Changes (No ID)
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
const state = {
|
|
272
|
+
users: [
|
|
273
|
+
{ id: 'user-1', name: 'Alice' },
|
|
274
|
+
{ id: 'user-2', name: 'Bob' },
|
|
275
|
+
]
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
// Replacing an item - NO id (item itself is replaced, not modified)
|
|
279
|
+
const patches1 = recordPatches(state, (state) => {
|
|
280
|
+
state.users[0] = { id: 'user-new', name: 'New User' };
|
|
281
|
+
}, {
|
|
282
|
+
getItemId: { users: (user) => user.id }
|
|
283
|
+
});
|
|
284
|
+
// [{ op: 'replace', path: ['users', 0], value: { id: 'user-new', name: 'New User' } }]
|
|
285
|
+
// Note: No id field - the item was replaced, not modified
|
|
286
|
+
|
|
287
|
+
// Removing an item - NO id (item is removed from array)
|
|
288
|
+
const patches2 = recordPatches(state, (state) => {
|
|
289
|
+
state.users.splice(1, 1);
|
|
290
|
+
}, {
|
|
291
|
+
arrayLengthAssignment: false,
|
|
292
|
+
getItemId: { users: (user) => user.id }
|
|
293
|
+
});
|
|
294
|
+
// [{ op: 'remove', path: ['users', 1] }]
|
|
295
|
+
// Note: No id field - the item was removed, not modified
|
|
250
296
|
```
|
|
251
297
|
|
|
252
298
|
#### Configuration Structure
|
|
@@ -265,43 +311,64 @@ recordPatches(state, mutate, {
|
|
|
265
311
|
data: {
|
|
266
312
|
todos: (todo) => todo._id
|
|
267
313
|
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Maps - same as arrays
|
|
271
|
-
entityMap: (entity) => entity.internalId
|
|
314
|
+
}
|
|
272
315
|
}
|
|
273
316
|
});
|
|
274
317
|
```
|
|
275
318
|
|
|
276
|
-
####
|
|
319
|
+
#### Nested Collections Inside Tracked Items
|
|
320
|
+
|
|
321
|
+
When Maps, Sets, or nested arrays are inside a tracked item, modifications to them include the parent item's ID:
|
|
277
322
|
|
|
278
323
|
```typescript
|
|
279
324
|
const state = {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
325
|
+
users: [
|
|
326
|
+
{
|
|
327
|
+
id: 'user-1',
|
|
328
|
+
tags: new Set(['admin']),
|
|
329
|
+
metadata: new Map([['role', 'editor']])
|
|
330
|
+
}
|
|
331
|
+
]
|
|
286
332
|
};
|
|
287
333
|
|
|
288
334
|
const patches = recordPatches(state, (state) => {
|
|
289
|
-
state.
|
|
335
|
+
state.users[0].tags.add('active');
|
|
336
|
+
state.users[0].metadata.set('role', 'admin');
|
|
290
337
|
}, {
|
|
291
338
|
getItemId: {
|
|
292
|
-
|
|
339
|
+
users: (user) => user.id
|
|
293
340
|
}
|
|
294
341
|
});
|
|
295
342
|
|
|
296
343
|
console.log(patches);
|
|
297
|
-
// [
|
|
344
|
+
// [
|
|
345
|
+
// { op: 'add', path: ['users', 0, 'tags', 'active'], value: 'active', id: 'user-1', pathIndex: 2 },
|
|
346
|
+
// { op: 'replace', path: ['users', 0, 'metadata', 'role'], value: 'admin', id: 'user-1', pathIndex: 2 }
|
|
347
|
+
// ]
|
|
298
348
|
```
|
|
299
349
|
|
|
300
|
-
#### When IDs are
|
|
350
|
+
#### When IDs are Included
|
|
351
|
+
|
|
352
|
+
IDs are included when **modifying fields or nested collections inside an item**:
|
|
353
|
+
|
|
354
|
+
- `state.items[0].name = 'new'` → `{ ..., id: '...', pathIndex: 2 }` (field modified)
|
|
355
|
+
- `state.items[0].tags.push('x')` → `{ ..., id: '...', pathIndex: 2 }` (nested array modified)
|
|
356
|
+
- `state.items[0].map.set('k', 'v')` → `{ ..., id: '...', pathIndex: 2 }` (nested Map modified)
|
|
357
|
+
|
|
358
|
+
IDs are NOT included for structural array changes:
|
|
359
|
+
|
|
360
|
+
- `state.items[0] = newItem` → No `id` (item replaced)
|
|
361
|
+
- `state.items.push(newItem)` → No `id` (new item added)
|
|
362
|
+
- `state.items.splice(0, 1)` → No `id` (item removed)
|
|
301
363
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
364
|
+
#### The `pathIndex` Field
|
|
365
|
+
|
|
366
|
+
When `id` is present, `pathIndex` indicates where the item path ends. Use `patch.path.slice(0, patch.pathIndex)` to get the path to the tracked item:
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
const patch = { op: 'replace', path: ['users', 0, 'name'], value: 'Jane', id: 'user-1', pathIndex: 2 };
|
|
370
|
+
const itemPath = patch.path.slice(0, patch.pathIndex); // ['users', 0]
|
|
371
|
+
```
|
|
305
372
|
|
|
306
373
|
#### ID can be undefined/null
|
|
307
374
|
|
package/dist/arrays.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { generateAddPatch, generateDeletePatch, generateReplacePatch } from './patches.js';
|
|
2
|
-
import { createProxy } from './proxy.js';
|
|
1
|
+
import { generateAddPatch, generateDeletePatch, generateReplacePatch, generateSetPatch } from './patches.js';
|
|
2
|
+
import { createProxy, findArrayItemContext } from './proxy.js';
|
|
3
3
|
// Module-level Sets for O(1) lookup instead of O(n) array includes
|
|
4
4
|
const MUTATING_METHODS = new Set(['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']);
|
|
5
5
|
const NON_MUTATING_METHODS = new Set([
|
|
@@ -65,13 +65,18 @@ export function handleArrayGet(array, prop, path, state) {
|
|
|
65
65
|
* Generate patches for array mutations
|
|
66
66
|
*/
|
|
67
67
|
function generateArrayPatches(state, array, method, args, result, path, oldArray, oldLength) {
|
|
68
|
+
// Check if this array is nested inside a tracked item
|
|
69
|
+
// If so, all patches should include the parent item's id
|
|
70
|
+
const itemContext = findArrayItemContext(path, state);
|
|
71
|
+
const parentItem = itemContext?.item;
|
|
72
|
+
const itemPathIndex = itemContext?.pathIndex;
|
|
68
73
|
switch (method) {
|
|
69
74
|
case 'push': {
|
|
70
75
|
// Generate add patches for each new element
|
|
71
76
|
// oldLength is the starting index before push
|
|
72
77
|
args.forEach((value, i) => {
|
|
73
78
|
const index = oldLength + i;
|
|
74
|
-
generateAddPatch(state, [...path, index], value);
|
|
79
|
+
generateAddPatch(state, [...path, index], value, parentItem, itemPathIndex);
|
|
75
80
|
});
|
|
76
81
|
// No length patch when array grows (aligned with mutative)
|
|
77
82
|
break;
|
|
@@ -85,7 +90,7 @@ function generateArrayPatches(state, array, method, args, result, path, oldArray
|
|
|
85
90
|
}
|
|
86
91
|
else {
|
|
87
92
|
// When arrayLengthAssignment is false, generate remove patch for last element
|
|
88
|
-
generateDeletePatch(state, [...path, oldLength - 1], result);
|
|
93
|
+
generateDeletePatch(state, [...path, oldLength - 1], result, parentItem, itemPathIndex);
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
96
|
break;
|
|
@@ -93,13 +98,13 @@ function generateArrayPatches(state, array, method, args, result, path, oldArray
|
|
|
93
98
|
case 'shift': {
|
|
94
99
|
// Remove first element (shifted elements are handled automatically by JSON Patch spec)
|
|
95
100
|
// We don't have oldValue here, but the result of shift() is the removed element
|
|
96
|
-
generateDeletePatch(state, [...path, 0], result);
|
|
101
|
+
generateDeletePatch(state, [...path, 0], result, parentItem, itemPathIndex);
|
|
97
102
|
break;
|
|
98
103
|
}
|
|
99
104
|
case 'unshift': {
|
|
100
105
|
// Add new elements at the beginning (shifted elements are handled automatically by JSON Patch spec)
|
|
101
106
|
args.forEach((value, i) => {
|
|
102
|
-
generateAddPatch(state, [...path, i], value);
|
|
107
|
+
generateAddPatch(state, [...path, i], value, parentItem, itemPathIndex);
|
|
103
108
|
});
|
|
104
109
|
break;
|
|
105
110
|
}
|
|
@@ -113,16 +118,17 @@ function generateArrayPatches(state, array, method, args, result, path, oldArray
|
|
|
113
118
|
// The result of splice() is the array of deleted elements
|
|
114
119
|
const deletedElements = result;
|
|
115
120
|
// First minCount elements: replace (overlap between add and delete)
|
|
121
|
+
// These are element replacements in a nested array - include parent item context
|
|
116
122
|
for (let i = 0; i < minCount; i++) {
|
|
117
|
-
|
|
123
|
+
generateSetPatch(state, [...path, actualStart + i], addItems[i], parentItem, itemPathIndex);
|
|
118
124
|
}
|
|
119
125
|
// Remaining add items: add
|
|
120
126
|
for (let i = minCount; i < addItems.length; i++) {
|
|
121
|
-
generateAddPatch(state, [...path, actualStart + i], addItems[i]);
|
|
127
|
+
generateAddPatch(state, [...path, actualStart + i], addItems[i], parentItem, itemPathIndex);
|
|
122
128
|
}
|
|
123
129
|
// Remaining delete items: remove (generate in reverse order)
|
|
124
130
|
for (let i = actualDeleteCount - 1; i >= minCount; i--) {
|
|
125
|
-
generateDeletePatch(state, [...path, actualStart + i], deletedElements[i]);
|
|
131
|
+
generateDeletePatch(state, [...path, actualStart + i], deletedElements[i], parentItem, itemPathIndex);
|
|
126
132
|
}
|
|
127
133
|
break;
|
|
128
134
|
}
|
|
@@ -130,7 +136,13 @@ function generateArrayPatches(state, array, method, args, result, path, oldArray
|
|
|
130
136
|
case 'reverse': {
|
|
131
137
|
// These reorder the entire array - generate full replace
|
|
132
138
|
// oldValue contains the array before the mutation
|
|
133
|
-
|
|
139
|
+
// For nested arrays, include parent item context
|
|
140
|
+
if (itemContext) {
|
|
141
|
+
generateSetPatch(state, path, array, parentItem, itemPathIndex);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
generateReplacePatch(state, path, array, oldArray);
|
|
145
|
+
}
|
|
134
146
|
break;
|
|
135
147
|
}
|
|
136
148
|
}
|
package/dist/arrays.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,YAAY,EAAE,oBAAoB,EAAE,OAAO,EAAC,MAAM,YAAY,CAAC;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC5B,CAAC,SAAS,YAAY,EACtB,aAAa,SAAS,oBAAoB,GAAG,EAAE,EAC9C,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,YAAY,EAAE,oBAAoB,EAAE,OAAO,EAAC,MAAM,YAAY,CAAC;AAE5E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC5B,CAAC,SAAS,YAAY,EACtB,aAAa,SAAS,oBAAoB,GAAG,EAAE,EAC9C,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAqBxE;AAGD,YAAY,EAAC,YAAY,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAC,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
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;AAG/C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAG3B,KAAQ,EAAE,MAA0B,EAAE,OAAuB;IAC9D,MAAM,aAAa,GAAG;QACrB,KAAK;QACL,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE
|
|
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,MAA0B,EAAE,OAAuB;IAC9D,MAAM,aAAa,GAAG;QACrB,KAAK;QACL,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,UAAU,EAAE,IAAI,OAAO,EAAE;KACzB,CAAC;IAEF,eAAe;IACf,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,aAAa,CAAM,CAAC;IAEzD,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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,CA8FL"}
|
package/dist/maps.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createProxy } from './proxy.js';
|
|
2
|
-
import { generateAddPatch, generateDeletePatch,
|
|
1
|
+
import { createProxy, findArrayItemContext } from './proxy.js';
|
|
2
|
+
import { generateAddPatch, generateDeletePatch, generateSetPatch } from './patches.js';
|
|
3
3
|
import { cloneIfNeeded } from './utils.js';
|
|
4
4
|
/**
|
|
5
5
|
* Handle property access on Map objects
|
|
@@ -20,13 +20,17 @@ export function handleMapGet(obj, prop, path, state) {
|
|
|
20
20
|
const result = obj.set(key, value);
|
|
21
21
|
// Generate patch
|
|
22
22
|
const itemPath = [...path, key];
|
|
23
|
+
// Find parent item context if this Map is inside a tracked array item
|
|
24
|
+
const itemContext = findArrayItemContext(path, state);
|
|
23
25
|
if (existed) {
|
|
24
|
-
// Key exists - replace
|
|
25
|
-
|
|
26
|
+
// Key exists - replace
|
|
27
|
+
// Pass 'map' to skip getItemId for the Map's own keys
|
|
28
|
+
// but still include parent item id if nested inside a tracked array item
|
|
29
|
+
generateSetPatch(state, itemPath, cloneIfNeeded(value), itemContext?.item, itemContext?.pathIndex, 'map');
|
|
26
30
|
}
|
|
27
31
|
else {
|
|
28
32
|
// Key doesn't exist - add
|
|
29
|
-
generateAddPatch(state, itemPath, cloneIfNeeded(value));
|
|
33
|
+
generateAddPatch(state, itemPath, cloneIfNeeded(value), itemContext?.item, itemContext?.pathIndex);
|
|
30
34
|
}
|
|
31
35
|
return result;
|
|
32
36
|
};
|
|
@@ -37,7 +41,9 @@ export function handleMapGet(obj, prop, path, state) {
|
|
|
37
41
|
const result = obj.delete(key);
|
|
38
42
|
if (result) {
|
|
39
43
|
const itemPath = [...path, key];
|
|
40
|
-
|
|
44
|
+
// Find parent item context if this Map is inside a tracked array item
|
|
45
|
+
const itemContext = findArrayItemContext(path, state);
|
|
46
|
+
generateDeletePatch(state, itemPath, cloneIfNeeded(oldValue), itemContext?.item, itemContext?.pathIndex);
|
|
41
47
|
}
|
|
42
48
|
return result;
|
|
43
49
|
};
|
|
@@ -46,10 +52,12 @@ export function handleMapGet(obj, prop, path, state) {
|
|
|
46
52
|
return () => {
|
|
47
53
|
const entries = Array.from(obj.entries());
|
|
48
54
|
obj.clear();
|
|
55
|
+
// Find parent item context if this Map is inside a tracked array item
|
|
56
|
+
const itemContext = findArrayItemContext(path, state);
|
|
49
57
|
// Generate remove patches for all items
|
|
50
58
|
entries.forEach(([key, value]) => {
|
|
51
59
|
const itemPath = [...path, key];
|
|
52
|
-
generateDeletePatch(state, itemPath, cloneIfNeeded(value));
|
|
60
|
+
generateDeletePatch(state, itemPath, cloneIfNeeded(value), itemContext?.item, itemContext?.pathIndex);
|
|
53
61
|
});
|
|
54
62
|
};
|
|
55
63
|
}
|
package/dist/maps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maps.js","sourceRoot":"","sources":["../src/maps.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"maps.js","sourceRoot":"","sources":["../src/maps.ts"],"names":[],"mappings":"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"}
|
package/dist/optimizer.js
CHANGED
|
@@ -166,8 +166,8 @@ function cancelArrayPushPop(patches) {
|
|
|
166
166
|
const pushPatches = groupPatches
|
|
167
167
|
.filter((p) => p.op === 'add' && typeof p.path[p.path.length - 1] === 'number')
|
|
168
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');
|
|
169
|
+
// Find pop patches (length reduction) - these are replace patches with a value
|
|
170
|
+
const popPatches = groupPatches.filter((p) => p.op === 'replace' && p.path[p.path.length - 1] === 'length' && 'value' in p);
|
|
171
171
|
// Cancel pushes and pops that match (push at highest index, pop reduces length)
|
|
172
172
|
const cancelCount = Math.min(pushPatches.length, popPatches.length);
|
|
173
173
|
for (let i = 0; i < cancelCount; i++) {
|
|
@@ -195,7 +195,8 @@ function cancelOutOfBoundsPatches(patches) {
|
|
|
195
195
|
for (const patch of patches) {
|
|
196
196
|
if (Array.isArray(patch.path) &&
|
|
197
197
|
patch.path.length >= 2 &&
|
|
198
|
-
patch.path[patch.path.length - 1] === 'length'
|
|
198
|
+
patch.path[patch.path.length - 1] === 'length' &&
|
|
199
|
+
'value' in patch) {
|
|
199
200
|
const parentPath = pathToKey(patch.path.slice(0, -1));
|
|
200
201
|
arrayLengths.set(parentPath, patch.value);
|
|
201
202
|
}
|
|
@@ -229,7 +230,7 @@ function mergePatches(patch1, patch2) {
|
|
|
229
230
|
// Same operations - keep the latest one
|
|
230
231
|
if (op1 === op2) {
|
|
231
232
|
// For replace operations, keep the latest value
|
|
232
|
-
if (op1 === 'replace') {
|
|
233
|
+
if (op1 === 'replace' && 'value' in patch1 && 'value' in patch2) {
|
|
233
234
|
// Skip if same reference (no-op)
|
|
234
235
|
if (patch1.value === patch2.value) {
|
|
235
236
|
return patch1;
|
|
@@ -237,7 +238,7 @@ function mergePatches(patch1, patch2) {
|
|
|
237
238
|
return patch2;
|
|
238
239
|
}
|
|
239
240
|
// For add operations, if adding same reference, it's a no-op
|
|
240
|
-
if (op1 === 'add' && patch1.value === patch2.value) {
|
|
241
|
+
if (op1 === 'add' && 'value' in patch1 && 'value' in patch2 && patch1.value === patch2.value) {
|
|
241
242
|
return patch1;
|
|
242
243
|
}
|
|
243
244
|
// For remove operations, don't merge (sequential removes should never be merged)
|
|
@@ -264,6 +265,18 @@ function mergePatches(patch1, patch2) {
|
|
|
264
265
|
}
|
|
265
266
|
if (op1 === 'remove' && op2 === 'add') {
|
|
266
267
|
// Remove then add - this is a replace operation
|
|
268
|
+
// Preserve id and pathIndex from either patch (they should be the same if present)
|
|
269
|
+
const id = patch1.id ?? patch2.id;
|
|
270
|
+
const pathIndex = patch1.pathIndex ?? patch2.pathIndex;
|
|
271
|
+
if (id !== undefined && pathIndex !== undefined) {
|
|
272
|
+
return {
|
|
273
|
+
op: 'replace',
|
|
274
|
+
path: patch1.path,
|
|
275
|
+
value: patch2.value,
|
|
276
|
+
id,
|
|
277
|
+
pathIndex,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
267
280
|
return {
|
|
268
281
|
op: 'replace',
|
|
269
282
|
path: patch1.path,
|
package/dist/optimizer.js.map
CHANGED
|
@@ -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,49 @@
|
|
|
1
1
|
import type { NonPrimitive, PatchPath, RecorderState } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Generate a replace patch for property changes
|
|
3
|
+
* Generate a replace patch for property changes.
|
|
4
|
+
* Used for field modifications inside items (e.g., state.items[0].name = 'new')
|
|
5
|
+
*
|
|
6
|
+
* @param parentItem - Optional parent item when modifying a field inside an array item.
|
|
7
|
+
* Used to extract the item's ID for the patch.
|
|
8
|
+
* @param itemPathIndex - Optional index indicating where the item path ends in the full path.
|
|
9
|
+
* Used for pathIndex in the patch.
|
|
10
|
+
* @param isMapOrSet - Deprecated/unused - Maps nested in tracked items now include parent item ID.
|
|
4
11
|
*/
|
|
5
|
-
export declare function generateSetPatch(state: RecorderState<NonPrimitive>, path: PatchPath,
|
|
12
|
+
export declare function generateSetPatch(state: RecorderState<NonPrimitive>, path: PatchPath, newValue: unknown, parentItem?: unknown, itemPathIndex?: number, isMapOrSet?: 'map' | 'set'): void;
|
|
6
13
|
/**
|
|
7
|
-
* Generate a remove patch for property deletions
|
|
14
|
+
* Generate a remove patch for property deletions.
|
|
15
|
+
*
|
|
16
|
+
* For ITEM removal (e.g., state.items.splice(1, 1)):
|
|
17
|
+
* - No id is included - the item is being removed, not modified.
|
|
18
|
+
*
|
|
19
|
+
* For FIELD removal from an item (e.g., delete state.items[0].optional):
|
|
20
|
+
* - The id of the parent item is included - the item is being modified.
|
|
21
|
+
*
|
|
22
|
+
* @param parentItem - Optional parent item when deleting a field from inside an array item.
|
|
23
|
+
* Used to extract the item's ID for the patch.
|
|
24
|
+
* @param itemPathIndex - Optional index indicating where the item path ends in the full path.
|
|
8
25
|
*/
|
|
9
|
-
export declare function generateDeletePatch(state: RecorderState<NonPrimitive>, path: PatchPath,
|
|
26
|
+
export declare function generateDeletePatch(state: RecorderState<NonPrimitive>, path: PatchPath, _oldValue: unknown, parentItem?: unknown, itemPathIndex?: number): void;
|
|
10
27
|
/**
|
|
11
|
-
* Generate an add patch for new properties
|
|
28
|
+
* Generate an add patch for new properties.
|
|
29
|
+
*
|
|
30
|
+
* For adding a FIELD to an existing item (e.g., state.items[0].newField = 'value'):
|
|
31
|
+
* - The id of the parent item is included - the item is being modified.
|
|
32
|
+
*
|
|
33
|
+
* For adding a NEW ITEM to an array (e.g., state.items.push(newItem)):
|
|
34
|
+
* - No id is included - we're not modifying an existing item.
|
|
35
|
+
*
|
|
36
|
+
* @param parentItem - Optional parent item when adding a field to an array item.
|
|
37
|
+
* Used to extract the item's ID for the patch.
|
|
38
|
+
* @param itemPathIndex - Optional index indicating where the item path ends in the full path.
|
|
12
39
|
*/
|
|
13
|
-
export declare function generateAddPatch(state: RecorderState<any>, path: PatchPath, value: any): void;
|
|
40
|
+
export declare function generateAddPatch(state: RecorderState<any>, path: PatchPath, value: any, parentItem?: unknown, itemPathIndex?: number): void;
|
|
14
41
|
/**
|
|
15
|
-
* Generate a replace patch for full
|
|
42
|
+
* Generate a replace patch for full item replacement or array length changes.
|
|
43
|
+
* Used for array length changes that need oldValue.
|
|
44
|
+
*
|
|
45
|
+
* Note: This function is used for array length changes only.
|
|
46
|
+
* For item replacements without id, use generateSetPatch instead.
|
|
16
47
|
*/
|
|
17
48
|
export declare function generateReplacePatch(state: RecorderState<any>, path: PatchPath, value: unknown, oldValue?: unknown): void;
|
|
18
49
|
//# sourceMappingURL=patches.d.ts.map
|
package/dist/patches.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patches.d.ts","sourceRoot":"","sources":["../src/patches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"patches.d.ts","sourceRoot":"","sources":["../src/patches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAE,SAAS,EAAE,aAAa,EAAsC,MAAM,YAAY,CAAC;AAI5G;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,OAAO,EACjB,UAAU,CAAC,EAAE,OAAO,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,UAAU,CAAC,EAAE,KAAK,GAAG,KAAK,QAkC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,OAAO,EAClB,UAAU,CAAC,EAAE,OAAO,EACpB,aAAa,CAAC,EAAE,MAAM,QA6BtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,GAAG,EACV,UAAU,CAAC,EAAE,OAAO,EACpB,aAAa,CAAC,EAAE,MAAM,QA+BtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,EACzB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,OAAO,QAkBlB"}
|