diff --git a/package.json b/package.json index 6a71cc6..776fe49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@legalscape/mutative", - "version": "1.0.8-ls.55ad523", + "version": "1.0.8-ls.3af40b9", "description": "A JavaScript library for efficient immutable updates", "main": "dist/index.js", "module": "dist/mutative.esm.js", diff --git a/src/patch.ts b/src/patch.ts index 1a13b05..0187bc0 100644 --- a/src/patch.ts +++ b/src/patch.ts @@ -15,12 +15,15 @@ const ADDED = Symbol('ADDED'); function generateArrayPatches( proxyState: ProxyDraft>, basePath: any[], - patches: Patches, - inversePatches: Patches, + patches_: Patches, + inversePatches_: Patches, pathAsArray: boolean ) { let { original, arrayChanges } = proxyState; + const patches = []; + const inversePatches = []; + // console.log('generateArrayPatches', proxyState.key); let copy = proxyState.copy!; @@ -138,6 +141,9 @@ function generateArrayPatches( }); } + patches_.push(...patches); + inversePatches_.unshift(...inversePatches); + // console.log('patches', [...patches]); // console.log('inversePatches', [...inversePatches]); } diff --git a/test/__snapshots__/apply.test.ts.snap b/test/__snapshots__/apply.test.ts.snap index d13fd1c..391e414 100644 --- a/test/__snapshots__/apply.test.ts.snap +++ b/test/__snapshots__/apply.test.ts.snap @@ -94,14 +94,6 @@ exports[`#468 1`] = ` exports[`#468 2`] = ` [ - { - "op": "replace", - "path": [ - 0, - "id", - ], - "value": 1, - }, { "op": "replace", "path": [ @@ -117,6 +109,14 @@ exports[`#468 2`] = ` 1, ], }, + { + "op": "replace", + "path": [ + 0, + "id", + ], + "value": 1, + }, ] `; @@ -473,90 +473,94 @@ exports[`array 4`] = ` { "op": "replace", "path": [ - "arr10", - 1, + "arr", + 2, ], - "value": 2, + "value": 3, }, { "op": "remove", "path": [ - "arr9", + "arr", 3, ], }, { "op": "remove", "path": [ - "arr9", + "arr", 3, ], }, { "op": "remove", "path": [ - "arr9", + "arr", 3, ], }, { - "op": "remove", + "op": "replace", "path": [ - "arr9", - 3, + "arr1", + 0, ], + "value": { + "a": 1, + }, }, { "op": "remove", "path": [ - "arr9", - 3, + "arr1", + 1, ], }, { "op": "remove", "path": [ - "arr9", + "arr2", 3, ], }, { - "op": "remove", + "op": "add", "path": [ - "arr9", - 3, + "arr3", + 2, ], + "value": "c", }, { "op": "remove", "path": [ - "arr9", - 3, + "arr4", + 0, ], }, { - "op": "replace", + "op": "add", "path": [ - "arr8", + "arr5", 0, ], - "value": 1, + "value": "a", }, { "op": "replace", "path": [ - "arr8", - 1, + "arr6", + 0, ], - "value": 2, + "value": "a", }, { "op": "replace", "path": [ - "arr8", + "arr6", 2, ], - "value": 3, + "value": "c", }, { "op": "replace", @@ -577,103 +581,99 @@ exports[`array 4`] = ` { "op": "replace", "path": [ - "arr6", + "arr8", 0, ], - "value": "a", + "value": 1, }, { "op": "replace", "path": [ - "arr6", - 2, + "arr8", + 1, ], - "value": "c", + "value": 2, }, { - "op": "add", + "op": "replace", "path": [ - "arr5", - 0, + "arr8", + 2, ], - "value": "a", + "value": 3, }, { "op": "remove", "path": [ - "arr4", - 0, + "arr9", + 3, ], }, { - "op": "add", + "op": "remove", "path": [ - "arr3", - 2, + "arr9", + 3, ], - "value": "c", }, { "op": "remove", "path": [ - "arr2", + "arr9", 3, ], }, { - "op": "replace", + "op": "remove", "path": [ - "arr1", - 0, - "a", + "arr9", + 3, ], - "value": 1, }, { - "op": "replace", + "op": "remove", "path": [ - "arr1", - 0, + "arr9", + 3, ], - "value": { - "a": 1, - }, }, { "op": "remove", "path": [ - "arr1", - 1, + "arr9", + 3, ], }, { - "op": "replace", + "op": "remove", "path": [ - "arr", - 2, + "arr9", + 3, ], - "value": 3, }, { "op": "remove", "path": [ - "arr", + "arr9", 3, ], }, { - "op": "remove", + "op": "replace", "path": [ - "arr", - 3, + "arr10", + 1, ], + "value": 2, }, { - "op": "remove", + "op": "replace", "path": [ - "arr", - 3, + "arr1", + 0, + "a", ], + "value": 1, }, ] `; @@ -734,20 +734,27 @@ exports[`array 5`] = ` exports[`array 6`] = ` [ { - "op": "replace", + "op": "remove", "path": [ - "arr4", + "arr0", 0, ], + }, + { + "op": "add", + "path": [ + "arr2", + 1, + ], "value": { "bar": "str1", }, }, { - "op": "replace", + "op": "add", "path": [ - "arr4", - 1, + "arr1", + 0, ], "value": { "bar": "str1", @@ -764,9 +771,9 @@ exports[`array 6`] = ` }, }, { - "op": "add", + "op": "replace", "path": [ - "arr1", + "arr4", 0, ], "value": { @@ -774,22 +781,15 @@ exports[`array 6`] = ` }, }, { - "op": "add", + "op": "replace", "path": [ - "arr2", + "arr4", 1, ], "value": { "bar": "str1", }, }, - { - "op": "remove", - "path": [ - "arr0", - 0, - ], - }, ] `; @@ -817,12 +817,6 @@ exports[`array length with ref 1`] = ` exports[`array length with ref 2`] = ` [ - { - "op": "remove", - "path": [ - "f", - ], - }, { "op": "replace", "path": [ @@ -833,6 +827,12 @@ exports[`array length with ref 2`] = ` "baz": "str", }, }, + { + "op": "remove", + "path": [ + "f", + ], + }, ] `; @@ -859,12 +859,6 @@ exports[`array pop with ref 1`] = ` exports[`array pop with ref 2`] = ` [ - { - "op": "remove", - "path": [ - "f", - ], - }, { "op": "add", "path": [ @@ -875,6 +869,12 @@ exports[`array pop with ref 2`] = ` "baz": "str", }, }, + { + "op": "remove", + "path": [ + "f", + ], + }, ] `; @@ -946,12 +946,6 @@ exports[`array shift with ref 1`] = ` exports[`array shift with ref 2`] = ` [ - { - "op": "remove", - "path": [ - "f", - ], - }, { "op": "add", "path": [ @@ -962,6 +956,12 @@ exports[`array shift with ref 2`] = ` "baz": "str", }, }, + { + "op": "remove", + "path": [ + "f", + ], + }, ] `; @@ -988,12 +988,6 @@ exports[`array splice with ref 1`] = ` exports[`array splice with ref 2`] = ` [ - { - "op": "remove", - "path": [ - "f", - ], - }, { "op": "add", "path": [ @@ -1004,6 +998,12 @@ exports[`array splice with ref 2`] = ` "baz": "str", }, }, + { + "op": "remove", + "path": [ + "f", + ], + }, ] `; @@ -1038,6 +1038,16 @@ exports[`array with ref 1`] = ` exports[`array with ref 2`] = ` [ + { + "op": "add", + "path": [ + "foobar", + 0, + ], + "value": { + "baz": "str", + }, + }, { "op": "replace", "path": [ @@ -1052,16 +1062,6 @@ exports[`array with ref 2`] = ` "foobar1", ], }, - { - "op": "add", - "path": [ - "foobar", - 0, - ], - "value": { - "baz": "str", - }, - }, ] `; @@ -2060,13 +2060,11 @@ exports[`enablePatches and assign with ref array 1`] = ` exports[`enablePatches and assign with ref array 2`] = ` [ { - "op": "replace", + "op": "remove", "path": [ - "arr1", - 0, - "a", + "arr0", + 1, ], - "value": 1, }, { "op": "remove", @@ -2076,11 +2074,13 @@ exports[`enablePatches and assign with ref array 2`] = ` ], }, { - "op": "remove", + "op": "replace", "path": [ - "arr0", - 1, + "arr1", + 0, + "a", ], + "value": 1, }, { "op": "add", diff --git a/test/json-patch.test.ts b/test/json-patch.test.ts index cc9a417..fafd408 100644 --- a/test/json-patch.test.ts +++ b/test/json-patch.test.ts @@ -1698,4 +1698,72 @@ describe('length change tracking', () => { }); }); }); + + test('inversePatches order', () => { + const numbers = [0, 1, 2, 3]; + const objects = numbers.map((id) => ({ id })); + + const [forward, backward] = test_(objects, (draft) => { + draft[3].id *= 10; + draft.splice(0, 1); + }); + + expect(forward).toMatchInlineSnapshot(` + [ + { + "op": "replace", + "path": [ + 3, + "id", + ], + "value": 30, + }, + { + "op": "remove", + "path": [ + 0, + ], + }, + { + "op": "replace", + "path": [ + 2, + ], + "value": { + "id": 30, + }, + }, + ] + `); + expect(backward).toMatchInlineSnapshot(` + [ + { + "op": "add", + "path": [ + 0, + ], + "value": { + "id": 0, + }, + }, + { + "op": "replace", + "path": [ + 3, + ], + "value": { + "id": 3, + }, + }, + { + "op": "replace", + "path": [ + 3, + "id", + ], + "value": 3, + }, + ] + `); + }); });