6 changed files with 168 additions and 8 deletions
@ -0,0 +1,5 @@ |
|||||||
|
module.exports = { |
||||||
|
transform: { |
||||||
|
"^.+\\.(ts|js)$": "ts-jest", |
||||||
|
}, |
||||||
|
}; |
@ -0,0 +1,2 @@ |
|||||||
|
export { getObjectDiff } from "./object-diff"; |
||||||
|
export { getListDiff } from "./list-diff"; |
@ -1,7 +1,130 @@ |
|||||||
import { getListDiff } from "../src/list-diff"; |
import { getListDiff } from "../src/list-diff"; |
||||||
|
|
||||||
describe("getListDiff", () => { |
describe("getListDiff", () => { |
||||||
it("", () => { |
it("returns an empty diff if no lists are provided", () => { |
||||||
expect(getListDiff(null, null)).toStrictEqual(null); |
expect(getListDiff(null, null)).toStrictEqual({ type: "list", diff: [] }); |
||||||
|
}); |
||||||
|
it("consider previous list as completely deleted if no next list is provided", () => { |
||||||
|
const res = getListDiff(["mbappe", "mendes", "verratti", "ruiz"], null); |
||||||
|
console.log("res", JSON.stringify(res, null, 2)); |
||||||
|
expect( |
||||||
|
getListDiff(["mbappe", "mendes", "verratti", "ruiz"], null) |
||||||
|
).toStrictEqual({ |
||||||
|
type: "list", |
||||||
|
diff: [ |
||||||
|
{ |
||||||
|
value: "mbappe", |
||||||
|
prevIndex: 0, |
||||||
|
newIndex: null, |
||||||
|
indexDiff: null, |
||||||
|
status: "deleted", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "mendes", |
||||||
|
prevIndex: 1, |
||||||
|
newIndex: null, |
||||||
|
indexDiff: null, |
||||||
|
status: "deleted", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "verratti", |
||||||
|
prevIndex: 2, |
||||||
|
newIndex: null, |
||||||
|
indexDiff: null, |
||||||
|
status: "deleted", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "ruiz", |
||||||
|
prevIndex: 3, |
||||||
|
newIndex: null, |
||||||
|
indexDiff: null, |
||||||
|
status: "deleted", |
||||||
|
}, |
||||||
|
], |
||||||
|
}); |
||||||
|
}); |
||||||
|
it("consider next list as completely added if no previous list is provided", () => { |
||||||
|
expect( |
||||||
|
getListDiff(null, ["mbappe", "mendes", "verratti", "ruiz"]) |
||||||
|
).toStrictEqual({ |
||||||
|
type: "list", |
||||||
|
diff: [ |
||||||
|
{ |
||||||
|
value: "mbappe", |
||||||
|
prevIndex: null, |
||||||
|
newIndex: 0, |
||||||
|
indexDiff: null, |
||||||
|
status: "added", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "mendes", |
||||||
|
prevIndex: null, |
||||||
|
newIndex: 1, |
||||||
|
indexDiff: null, |
||||||
|
status: "added", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "verratti", |
||||||
|
prevIndex: null, |
||||||
|
newIndex: 2, |
||||||
|
indexDiff: null, |
||||||
|
status: "added", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "ruiz", |
||||||
|
prevIndex: null, |
||||||
|
newIndex: 3, |
||||||
|
indexDiff: null, |
||||||
|
status: "added", |
||||||
|
}, |
||||||
|
], |
||||||
|
}); |
||||||
|
}); |
||||||
|
it("detects changed values in the list", () => { |
||||||
|
expect( |
||||||
|
getListDiff( |
||||||
|
["mbappe", "mendes", "verratti", "ruiz"], |
||||||
|
["mbappe", "messi", "ruiz"] |
||||||
|
) |
||||||
|
).toStrictEqual({ |
||||||
|
type: "list", |
||||||
|
diff: [ |
||||||
|
{ |
||||||
|
value: "mbappe", |
||||||
|
prevIndex: 0, |
||||||
|
newIndex: 0, |
||||||
|
indexDiff: 0, |
||||||
|
status: "equal", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "mendes", |
||||||
|
prevIndex: 1, |
||||||
|
newIndex: null, |
||||||
|
indexDiff: null, |
||||||
|
status: "deleted", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "verratti", |
||||||
|
prevIndex: 2, |
||||||
|
newIndex: null, |
||||||
|
indexDiff: null, |
||||||
|
status: "deleted", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "messi", |
||||||
|
prevIndex: null, |
||||||
|
newIndex: 1, |
||||||
|
indexDiff: null, |
||||||
|
status: "added", |
||||||
|
}, |
||||||
|
{ |
||||||
|
value: "ruiz", |
||||||
|
prevIndex: 3, |
||||||
|
newIndex: 2, |
||||||
|
indexDiff: -1, |
||||||
|
status: "moved", |
||||||
|
}, |
||||||
|
], |
||||||
|
}); |
||||||
}); |
}); |
||||||
}); |
}); |
||||||
|
@ -0,0 +1,20 @@ |
|||||||
|
{ |
||||||
|
"compilerOptions": { |
||||||
|
"declaration": true, |
||||||
|
"declarationDir": "./dist", |
||||||
|
"jsx": "react", |
||||||
|
"lib": ["esnext", "dom"], |
||||||
|
"module": "esnext", |
||||||
|
"moduleResolution": "node", |
||||||
|
"noUnusedParameters": true, |
||||||
|
"esModuleInterop": true, |
||||||
|
"noImplicitAny": true, |
||||||
|
"outDir": "./dist", |
||||||
|
"strict": true, |
||||||
|
"target": "es5", |
||||||
|
"resolveJsonModule": true, |
||||||
|
"allowSyntheticDefaultImports": true |
||||||
|
}, |
||||||
|
"include": ["src/**/*.tsx"], |
||||||
|
"exclude": ["node_modules"] |
||||||
|
} |
Loading…
Reference in new issue