11 changed files with 899 additions and 134 deletions
@ -1,3 +1,230 @@
@@ -1,3 +1,230 @@
|
||||
var r={ADDED:"added",EQUAL:"equal",MOVED:"moved",DELETED:"deleted",UPDATED:"updated"};function d(e,t,n={discardArrayOrder:!1}){return typeof e!=typeof t?!1:Array.isArray(e)?e.length!==t.length?!1:n.discardArrayOrder?e.every(i=>t.some(s=>JSON.stringify(s)===JSON.stringify(i))):e.every((i,s)=>JSON.stringify(i)===JSON.stringify(t[s])):typeof e=="object"?JSON.stringify(e)===JSON.stringify(t):e===t}function p(e){return !!e&&typeof e=="object"&&!Array.isArray(e)}function S(e){return e.some(t=>t.status!==r.EQUAL)?r.UPDATED:r.EQUAL}function l(e,t){if(!e)return {type:"object",status:r.isEqual,diff:[]};let n=[];return Object.entries(e).forEach(([i,s])=>{if(p(s)){let f=[];return Object.entries(s).forEach(([u,o])=>{f.push({name:u,previousValue:t===r.ADDED?void 0:o,currentValue:t===r.ADDED?o:void 0,status:t});}),n.push({property:i,previousValue:t===r.ADDED?void 0:e[i],currentValue:t===r.ADDED?s:void 0,status:t,subPropertiesDiff:f})}return n.push({property:i,previousValue:t===r.ADDED?void 0:e[i],currentValue:t===r.ADDED?s:void 0,status:t})}),{type:"object",status:t,diff:n}}function j(e,t,n){if(!e)return;let i=Object.entries(e).find(([s])=>d(s,t,n));return i?i[1]:void 0}function y(e,t,n){return d(e,t,n)?r.EQUAL:r.UPDATED}function g(e){return e.some(t=>t.status!==r.EQUAL)?r.UPDATED:r.EQUAL}function b(e,t){if(!e)return;let n=Object.keys(e),i=Object.keys(t),s=n.filter(f=>!i.includes(f));if(s.length>0)return s.map(f=>({property:f,value:e[f]}))}function O(e,t,n){let i=[],s,f=b(e,t);return f&&f.forEach(u=>{i.push({name:u.property,previousValue:u.value,currentValue:void 0,status:r.DELETED});}),Object.entries(t).forEach(([u,o])=>{let D=j(e,u,n);if(!D)return i.push({name:u,previousValue:D,currentValue:o,status:!e||!(u in e)?r.ADDED:D===o?r.EQUAL:r.UPDATED});if(p(o)){let a=O(D,o,n);a&&a.length>0&&(s=a);}D&&i.push({name:u,previousValue:D,currentValue:o,status:y(D,o,n),...!!s&&{subDiff:s}});}),i}function L(e,t,n){if(!e&&!t)return {type:"object",status:r.EQUAL,diff:[]};if(!e)return l(t,r.ADDED);if(!t)return l(e,r.DELETED);let i=[];Object.entries(t).forEach(([f,u])=>{let o=e[f];if(!o)return i.push({property:f,previousValue:o,currentValue:u,status:f in e?o===u?r.EQUAL:r.UPDATED:r.ADDED});if(p(u)){let D=O(o,u,n),a=g(D);return i.push({property:f,previousValue:o,currentValue:u,status:a,...a!==r.EQUAL&&{subPropertiesDiff:D}})}return i.push({property:f,previousValue:o,currentValue:u,status:y(o,u,n)})});let s=b(e,t);return s&&s.forEach(f=>{i.push({property:f.property,previousValue:f.value,currentValue:void 0,status:r.DELETED});}),{type:"object",status:S(i),diff:i}}function A(e,t){return {type:"list",status:t,diff:e.map((n,i)=>({value:n,prevIndex:t===r.ADDED?null:i,newIndex:t===r.ADDED?i:null,indexDiff:null,status:t}))}}function m(e){return e.some(t=>t.status!==r.EQUAL)?r.UPDATED:r.EQUAL}var h=(e,t)=>{if(!e&&!t)return {type:"list",status:r.EQUAL,diff:[]};if(!e)return A(t,r.ADDED);if(!t)return A(e,r.DELETED);let n=[],i=[];return t.forEach((s,f)=>{let u=e.findIndex((D,a)=>d(D,s)&&!i.includes(a));u>-1&&i.push(u);let o=u===-1?null:f-u;return o===0?n.push({value:s,prevIndex:u,newIndex:f,indexDiff:o,status:r.EQUAL}):u===-1?n.push({value:s,prevIndex:null,newIndex:f,indexDiff:o,status:r.ADDED}):n.push({value:s,prevIndex:u,newIndex:f,indexDiff:o,status:r.MOVED})}),e.forEach((s,f)=>{if(!i.includes(f))return n.splice(f,0,{value:s,prevIndex:f,newIndex:null,indexDiff:null,status:r.DELETED})}),{type:"list",status:m(n),diff:n}}; |
||||
var r = { |
||||
ADDED: "added", |
||||
EQUAL: "equal", |
||||
MOVED: "moved", |
||||
DELETED: "deleted", |
||||
UPDATED: "updated", |
||||
}; |
||||
function d(e, t, n = { ignoreArrayOrder: !1 }) { |
||||
return typeof e != typeof t |
||||
? !1 |
||||
: Array.isArray(e) |
||||
? e.length !== t.length |
||||
? !1 |
||||
: n.ignoreArrayOrder |
||||
? e.every((i) => t.some((s) => JSON.stringify(s) === JSON.stringify(i))) |
||||
: e.every((i, s) => JSON.stringify(i) === JSON.stringify(t[s])) |
||||
: typeof e == "object" |
||||
? JSON.stringify(e) === JSON.stringify(t) |
||||
: e === t; |
||||
} |
||||
function p(e) { |
||||
return !!e && typeof e == "object" && !Array.isArray(e); |
||||
} |
||||
function S(e) { |
||||
return e.some((t) => t.status !== r.EQUAL) ? r.UPDATED : r.EQUAL; |
||||
} |
||||
function l(e, t) { |
||||
if (!e) return { type: "object", status: r.isEqual, diff: [] }; |
||||
let n = []; |
||||
return ( |
||||
Object.entries(e).forEach(([i, s]) => { |
||||
if (p(s)) { |
||||
let f = []; |
||||
return ( |
||||
Object.entries(s).forEach(([u, o]) => { |
||||
f.push({ |
||||
name: u, |
||||
previousValue: t === r.ADDED ? void 0 : o, |
||||
currentValue: t === r.ADDED ? o : void 0, |
||||
status: t, |
||||
}); |
||||
}), |
||||
n.push({ |
||||
property: i, |
||||
previousValue: t === r.ADDED ? void 0 : e[i], |
||||
currentValue: t === r.ADDED ? s : void 0, |
||||
status: t, |
||||
subPropertiesDiff: f, |
||||
}) |
||||
); |
||||
} |
||||
return n.push({ |
||||
property: i, |
||||
previousValue: t === r.ADDED ? void 0 : e[i], |
||||
currentValue: t === r.ADDED ? s : void 0, |
||||
status: t, |
||||
}); |
||||
}), |
||||
{ type: "object", status: t, diff: n } |
||||
); |
||||
} |
||||
function j(e, t, n) { |
||||
if (!e) return; |
||||
let i = Object.entries(e).find(([s]) => d(s, t, n)); |
||||
return i ? i[1] : void 0; |
||||
} |
||||
function y(e, t, n) { |
||||
return d(e, t, n) ? r.EQUAL : r.UPDATED; |
||||
} |
||||
function g(e) { |
||||
return e.some((t) => t.status !== r.EQUAL) ? r.UPDATED : r.EQUAL; |
||||
} |
||||
function b(e, t) { |
||||
if (!e) return; |
||||
let n = Object.keys(e), |
||||
i = Object.keys(t), |
||||
s = n.filter((f) => !i.includes(f)); |
||||
if (s.length > 0) return s.map((f) => ({ property: f, value: e[f] })); |
||||
} |
||||
function O(e, t, n) { |
||||
let i = [], |
||||
s, |
||||
f = b(e, t); |
||||
return ( |
||||
f && |
||||
f.forEach((u) => { |
||||
i.push({ |
||||
name: u.property, |
||||
previousValue: u.value, |
||||
currentValue: void 0, |
||||
status: r.DELETED, |
||||
}); |
||||
}), |
||||
Object.entries(t).forEach(([u, o]) => { |
||||
let D = j(e, u, n); |
||||
if (!D) |
||||
return i.push({ |
||||
name: u, |
||||
previousValue: D, |
||||
currentValue: o, |
||||
status: !e || !(u in e) ? r.ADDED : D === o ? r.EQUAL : r.UPDATED, |
||||
}); |
||||
if (p(o)) { |
||||
let a = O(D, o, n); |
||||
a && a.length > 0 && (s = a); |
||||
} |
||||
D && |
||||
i.push({ |
||||
name: u, |
||||
previousValue: D, |
||||
currentValue: o, |
||||
status: y(D, o, n), |
||||
...(!!s && { subDiff: s }), |
||||
}); |
||||
}), |
||||
i |
||||
); |
||||
} |
||||
function L(e, t, n) { |
||||
if (!e && !t) return { type: "object", status: r.EQUAL, diff: [] }; |
||||
if (!e) return l(t, r.ADDED); |
||||
if (!t) return l(e, r.DELETED); |
||||
let i = []; |
||||
Object.entries(t).forEach(([f, u]) => { |
||||
let o = e[f]; |
||||
if (!o) |
||||
return i.push({ |
||||
property: f, |
||||
previousValue: o, |
||||
currentValue: u, |
||||
status: f in e ? (o === u ? r.EQUAL : r.UPDATED) : r.ADDED, |
||||
}); |
||||
if (p(u)) { |
||||
let D = O(o, u, n), |
||||
a = g(D); |
||||
return i.push({ |
||||
property: f, |
||||
previousValue: o, |
||||
currentValue: u, |
||||
status: a, |
||||
...(a !== r.EQUAL && { subPropertiesDiff: D }), |
||||
}); |
||||
} |
||||
return i.push({ |
||||
property: f, |
||||
previousValue: o, |
||||
currentValue: u, |
||||
status: y(o, u, n), |
||||
}); |
||||
}); |
||||
let s = b(e, t); |
||||
return ( |
||||
s && |
||||
s.forEach((f) => { |
||||
i.push({ |
||||
property: f.property, |
||||
previousValue: f.value, |
||||
currentValue: void 0, |
||||
status: r.DELETED, |
||||
}); |
||||
}), |
||||
{ type: "object", status: S(i), diff: i } |
||||
); |
||||
} |
||||
function A(e, t) { |
||||
return { |
||||
type: "list", |
||||
status: t, |
||||
diff: e.map((n, i) => ({ |
||||
value: n, |
||||
prevIndex: t === r.ADDED ? null : i, |
||||
newIndex: t === r.ADDED ? i : null, |
||||
indexDiff: null, |
||||
status: t, |
||||
})), |
||||
}; |
||||
} |
||||
function m(e) { |
||||
return e.some((t) => t.status !== r.EQUAL) ? r.UPDATED : r.EQUAL; |
||||
} |
||||
var h = (e, t) => { |
||||
if (!e && !t) return { type: "list", status: r.EQUAL, diff: [] }; |
||||
if (!e) return A(t, r.ADDED); |
||||
if (!t) return A(e, r.DELETED); |
||||
let n = [], |
||||
i = []; |
||||
return ( |
||||
t.forEach((s, f) => { |
||||
let u = e.findIndex((D, a) => d(D, s) && !i.includes(a)); |
||||
u > -1 && i.push(u); |
||||
let o = u === -1 ? null : f - u; |
||||
return o === 0 |
||||
? n.push({ |
||||
value: s, |
||||
prevIndex: u, |
||||
newIndex: f, |
||||
indexDiff: o, |
||||
status: r.EQUAL, |
||||
}) |
||||
: u === -1 |
||||
? n.push({ |
||||
value: s, |
||||
prevIndex: null, |
||||
newIndex: f, |
||||
indexDiff: o, |
||||
status: r.ADDED, |
||||
}) |
||||
: n.push({ |
||||
value: s, |
||||
prevIndex: u, |
||||
newIndex: f, |
||||
indexDiff: o, |
||||
status: r.MOVED, |
||||
}); |
||||
}), |
||||
e.forEach((s, f) => { |
||||
if (!i.includes(f)) |
||||
return n.splice(f, 0, { |
||||
value: s, |
||||
prevIndex: f, |
||||
newIndex: null, |
||||
indexDiff: null, |
||||
status: r.DELETED, |
||||
}); |
||||
}), |
||||
{ type: "list", status: m(n), diff: n } |
||||
); |
||||
}; |
||||
|
||||
export { h as getListDiff, L as getObjectDiff, d as isEqual, p as isObject }; |
||||
|
Loading…
Reference in new issue