diff --git a/package.json b/package.json index be9023c..337198f 100644 --- a/package.json +++ b/package.json @@ -50,5 +50,10 @@ "typescript": "5.1.6", "vite": "^4.4.6", "vite-tsconfig-paths": "^4.2.0" + }, + "dependencies": { + "@types/lodash.set": "^4.3.7", + "lodash.set": "^4.3.2", + "remeda": "^1.6.1" } } diff --git a/src/core/get-diff.spec.ts b/src/core/get-diff.spec.ts index 362c25a..fae1490 100644 --- a/src/core/get-diff.spec.ts +++ b/src/core/get-diff.spec.ts @@ -285,4 +285,17 @@ describe('GetDiff function', () => { expect(result).toEqual(expectedResult) expect(lodashResult).toEqual(expectedLodashResult) }) + + test.only('Should return the difference between two basic structures', () => { + const struct1 = { 1: { 2: 7, 3: { 4: 6 } } } + const struct2 = { 1: { 3: { 4: 5 } } } + const expectedResult: Delta = { edited: [['1/3/4', 6, 5]], added: [], removed: [['1/2', 7]] } + // const expectedLodashResult: Delta = { edited: [['1.3.4', 6, 5]], added: [], removed: [['1.2', 7]] } + + const result = getDiff(struct1, struct2, { isObjectOutput: true }) + // const lodashResult = getDiff(struct1, struct2, true) + + expect(result).toEqual(expectedResult) + // expect(lodashResult).toEqual(expectedLodashResult) + }) }) diff --git a/src/core/get-diff.ts b/src/core/get-diff.ts index 1324ccc..f162a2d 100644 --- a/src/core/get-diff.ts +++ b/src/core/get-diff.ts @@ -36,8 +36,8 @@ export const getDiff = (oldStruct: Record, newStruct: Record, newStruct: Recordb delta.edited = getEditedPaths(oldStructPaths, newStructPaths) + if (options.isObjectOutput) { + delta = transformDeltaToObject(delta) + } + return delta } diff --git a/src/core/index.ts b/src/core/index.ts index 0617ebe..af0e822 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -2,3 +2,4 @@ export * from './get-diff' export * from './get-paths-diff' export * from './get-struct-paths' export * from './get-edited-paths' +export * from './get-edited-paths' diff --git a/src/core/transform-delta-into-object.ts b/src/core/transform-delta-into-object.ts new file mode 100644 index 0000000..8379b25 --- /dev/null +++ b/src/core/transform-delta-into-object.ts @@ -0,0 +1,23 @@ +// Packages +import set from 'lodash.set' +import { Delta, DeltaObject } from '../models' + +const transformDeltaToObject = (delta: Delta): DeltaObject => { + const removed = delta.removed.map((item) => { + const newObject = {} + + set(newObject, item[0], item[1]) + + return newObject + }) + const edited = delta.edited.map((item) => set({}, 'cafe/123', '8888')) + const added = delta.added.map((item) => set({}, item[0], item[1])) + + return { + removed, + edited, + added + } +} + +export default transformDeltaToObject diff --git a/tsconfig.json b/tsconfig.json index 3a4e948..b3f5c3b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "module": "commonjs", "declaration": true, "outDir": "./dist", + "esModuleInterop": true, "strict": true }, "include": ["src"], diff --git a/yarn.lock b/yarn.lock index 418cdfd..f5ab290 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1081,6 +1081,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/lodash.set@^4.3.7": + version "4.3.7" + resolved "https://registry.yarnpkg.com/@types/lodash.set/-/lodash.set-4.3.7.tgz#784fccea3fbef4d0949d1897a780f592da700942" + integrity sha512-bS5Wkg/nrT82YUfkNYPSccFrNZRL+irl7Yt4iM6OTSQ0VZJED2oUIVm15NkNtUAQ8SRhCe+axqERUV6MJgkeEg== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + "@types/node@*": version "16.11.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.11.tgz#6ea7342dfb379ea1210835bada87b3c512120234" @@ -3327,6 +3339,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -3725,6 +3742,11 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +remeda@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/remeda/-/remeda-1.6.1.tgz#9cd7b53217b90bd9bafffadefe883c4120f4dcde" + integrity sha512-ywn4Tv2cPBj6hk0TEYMHusWVXu72yJNCaWUdMK7kc7x/PjQPBSvtMbmBWP4PQH791kpl3rPBe3ZVkJyPj3c+0g== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"