10 changed files with 1058 additions and 1002 deletions
@ -1,51 +1,69 @@ |
|||||||
type DiffStatus = "added" | "equal" | "moved" | "deleted" | "updated"; |
declare const GRANULARITY: Record<string, "basic" | "deep">; |
||||||
|
type ListDiffStatus = "added" | "equal" | "moved" | "deleted" | "updated"; |
||||||
|
type ObjectDiffStatus = "added" | "equal" | "deleted" | "updated"; |
||||||
type ObjectData = Record<string, any> | undefined | null; |
type ObjectData = Record<string, any> | undefined | null; |
||||||
type ListData = any; |
type ListData = any; |
||||||
type Options = { |
type ObjectStatusTuple = readonly [ |
||||||
|
"added", |
||||||
|
"equal", |
||||||
|
"deleted", |
||||||
|
"updated" |
||||||
|
]; |
||||||
|
type ListStatusTuple = readonly [ |
||||||
|
"added", |
||||||
|
"equal", |
||||||
|
"deleted", |
||||||
|
"moved", |
||||||
|
"updated" |
||||||
|
]; |
||||||
|
type isEqualOptions = { |
||||||
ignoreArrayOrder?: boolean; |
ignoreArrayOrder?: boolean; |
||||||
}; |
}; |
||||||
|
type ObjectOptions = { |
||||||
|
ignoreArrayOrder?: boolean; |
||||||
|
showOnly?: { |
||||||
|
statuses: Array<ObjectStatusTuple[number]>; |
||||||
|
granularity?: typeof GRANULARITY[keyof typeof GRANULARITY]; |
||||||
|
}; |
||||||
|
}; |
||||||
|
type ListOptions = { |
||||||
|
showOnly?: Array<ListStatusTuple[number]>; |
||||||
|
}; |
||||||
type ListDiff = { |
type ListDiff = { |
||||||
type: "list"; |
type: "list"; |
||||||
status: DiffStatus; |
status: ListDiffStatus; |
||||||
diff: { |
diff: { |
||||||
value: ListData; |
value: ListData; |
||||||
prevIndex: number | null; |
prevIndex: number | null; |
||||||
newIndex: number | null; |
newIndex: number | null; |
||||||
indexDiff: number | null; |
indexDiff: number | null; |
||||||
status: DiffStatus; |
status: ListDiffStatus; |
||||||
}[]; |
}[]; |
||||||
}; |
}; |
||||||
type SubProperties = { |
type SubProperties = { |
||||||
name: string; |
property: string; |
||||||
previousValue: any; |
previousValue: any; |
||||||
currentValue: any; |
currentValue: any; |
||||||
status: DiffStatus; |
status: ObjectDiffStatus; |
||||||
subDiff?: SubProperties[]; |
subPropertiesDiff?: SubProperties[]; |
||||||
}; |
}; |
||||||
type ObjectDiff = { |
type ObjectDiff = { |
||||||
type: "object"; |
type: "object"; |
||||||
status: DiffStatus; |
status: ObjectDiffStatus; |
||||||
diff: { |
diff: { |
||||||
property: string; |
property: string; |
||||||
previousValue: any; |
previousValue: any; |
||||||
currentValue: any; |
currentValue: any; |
||||||
status: DiffStatus; |
status: ObjectDiffStatus; |
||||||
subPropertiesDiff?: SubProperties[]; |
subPropertiesDiff?: SubProperties[]; |
||||||
}[]; |
}[]; |
||||||
}; |
}; |
||||||
|
|
||||||
declare function getObjectDiff( |
declare function getObjectDiff(prevData: ObjectData, nextData: ObjectData, options?: ObjectOptions): ObjectDiff; |
||||||
prevData: ObjectData, |
|
||||||
nextData: ObjectData, |
|
||||||
options?: Options |
|
||||||
): ObjectDiff; |
|
||||||
|
|
||||||
declare const getListDiff: ( |
declare const getListDiff: (prevList: ListData[] | undefined | null, nextList: ListData[] | undefined | null, options?: ListOptions) => ListDiff; |
||||||
prevList: ListData[] | undefined | null, |
|
||||||
nextList: ListData[] | undefined | null |
|
||||||
) => ListDiff; |
|
||||||
|
|
||||||
declare function isEqual(a: any, b: any, options?: Options): boolean; |
declare function isEqual(a: any, b: any, options?: isEqualOptions): boolean; |
||||||
declare function isObject(value: any): value is Record<string, any>; |
declare function isObject(value: any): value is Record<string, any>; |
||||||
|
|
||||||
export { getListDiff, getObjectDiff, isEqual, isObject }; |
export { getListDiff, getObjectDiff, isEqual, isObject }; |
||||||
|
@ -1,235 +1,8 @@ |
|||||||
"use strict"; |
'use strict'; |
||||||
|
|
||||||
var r = { |
var u={ADDED:"added",EQUAL:"equal",DELETED:"deleted",UPDATED:"updated"},d={...u,MOVED:"moved"},c={BASIC:"basic",DEEP:"deep"};function p(t,e,f={ignoreArrayOrder:!1}){return typeof t!=typeof e?!1:Array.isArray(t)?t.length!==e.length?!1:f.ignoreArrayOrder?t.every(r=>e.some(s=>JSON.stringify(s)===JSON.stringify(r))):t.every((r,s)=>JSON.stringify(r)===JSON.stringify(e[s])):typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):t===e}function l(t){return !!t&&typeof t=="object"&&!Array.isArray(t)}function O(t,e={statuses:[],granularity:c.BASIC}){let{statuses:f,granularity:r}=e;return t.reduce((s,i)=>{if(r===c.DEEP&&i.subPropertiesDiff){let n=O(i.subPropertiesDiff,e);if(n.length>0)return [...s,{...i,subPropertiesDiff:n}]}if(r===c.DEEP&&i.subDiff){let n=O(i.subDiff,e);if(n.length>0)return [...s,{...i,subDiff:n}]}return f.includes(i.status)?[...s,i]:s},[])}function b(t){return t.some(e=>e.status!==u.EQUAL)?u.UPDATED:u.EQUAL}function E(t,e,f={ignoreArrayOrder:!1,showOnly:{statuses:[],granularity:c.BASIC}}){if(!t)return {type:"object",status:u.EQUAL,diff:[]};let r=[];return Object.entries(t).forEach(([s,i])=>{if(l(i)){let n=[];return Object.entries(i).forEach(([o,a])=>{n.push({property:o,previousValue:e===u.ADDED?void 0:a,currentValue:e===u.ADDED?a:void 0,status:e});}),r.push({property:s,previousValue:e===u.ADDED?void 0:t[s],currentValue:e===u.ADDED?i:void 0,status:e,subPropertiesDiff:n})}return r.push({property:s,previousValue:e===u.ADDED?void 0:t[s],currentValue:e===u.ADDED?i:void 0,status:e})}),f.showOnly&&f.showOnly.statuses.length>0?{type:"object",status:e,diff:O(r,f.showOnly)}:{type:"object",status:e,diff:r}}function T(t,e,f){if(!t)return;let r=Object.entries(t).find(([s])=>p(s,e,f));return r?r[1]:void 0}function A(t,e,f){return p(t,e,f)?u.EQUAL:u.UPDATED}function m(t){return t.some(e=>e.status!==u.EQUAL)?u.UPDATED:u.EQUAL}function j(t,e){if(!t)return;let f=Object.keys(t),r=Object.keys(e),s=f.filter(i=>!r.includes(i));if(s.length>0)return s.map(i=>({property:i,value:t[i]}))}function L(t,e,f){let r=[],s,i=j(t,e);return i&&i.forEach(n=>{r.push({property:n.property,previousValue:n.value,currentValue:void 0,status:u.DELETED});}),Object.entries(e).forEach(([n,o])=>{let a=T(t,n,f);if(!a)return r.push({property:n,previousValue:a,currentValue:o,status:!t||!(n in t)?u.ADDED:a===o?u.EQUAL:u.UPDATED});if(l(o)){let D=L(a,o,f);D&&D.length>0&&(s=D);}a&&r.push({property:n,previousValue:a,currentValue:o,status:A(a,o,f),...!!s&&{subDiff:s}});}),r}function U(t,e,f={ignoreArrayOrder:!1,showOnly:{statuses:[],granularity:c.BASIC}}){if(!t&&!e)return {type:"object",status:u.EQUAL,diff:[]};if(!t)return E(e,u.ADDED,f);if(!e)return E(t,u.DELETED,f);let r=[];Object.entries(e).forEach(([i,n])=>{let o=t[i];if(!o)return r.push({property:i,previousValue:o,currentValue:n,status:i in t?o===n?u.EQUAL:u.UPDATED:u.ADDED});if(l(n)){let a=L(o,n,f),D=m(a);return r.push({property:i,previousValue:o,currentValue:n,status:D,...D!==u.EQUAL&&{subPropertiesDiff:a}})}return r.push({property:i,previousValue:o,currentValue:n,status:A(o,n,f)})});let s=j(t,e);return s&&s.forEach(i=>{r.push({property:i.property,previousValue:i.value,currentValue:void 0,status:u.DELETED});}),f.showOnly&&f.showOnly.statuses.length>0?{type:"object",status:b(r),diff:O(r,f.showOnly)}:{type:"object",status:b(r),diff:r}}function P(t,e=[]){return t.filter(f=>e?.includes(f.status))}function S(t,e,f={showOnly:[]}){let r=t.map((s,i)=>({value:s,prevIndex:e===d.ADDED?null:i,newIndex:e===d.ADDED?i:null,indexDiff:null,status:e}));return f.showOnly&&f.showOnly.length>0?{type:"list",status:e,diff:r.filter(s=>f.showOnly?.includes(s.status))}:{type:"list",status:e,diff:r}}function g(t){return t.some(e=>e.status!==d.EQUAL)?d.UPDATED:d.EQUAL}var w=(t,e,f={showOnly:[]})=>{if(!t&&!e)return {type:"list",status:d.EQUAL,diff:[]};if(!t)return S(e,d.ADDED,f);if(!e)return S(t,d.DELETED,f);let r=[],s=[];return e.forEach((i,n)=>{let o=t.findIndex((D,h)=>p(D,i)&&!s.includes(h));o>-1&&s.push(o);let a=o===-1?null:n-o;return a===0?r.push({value:i,prevIndex:o,newIndex:n,indexDiff:a,status:d.EQUAL}):o===-1?r.push({value:i,prevIndex:null,newIndex:n,indexDiff:a,status:d.ADDED}):r.push({value:i,prevIndex:o,newIndex:n,indexDiff:a,status:d.MOVED})}),t.forEach((i,n)=>{if(!s.includes(n))return r.splice(n,0,{value:i,prevIndex:n,newIndex:null,indexDiff:null,status:d.DELETED})}),f.showOnly&&f?.showOnly?.length>0?{type:"list",status:g(r),diff:P(r,f.showOnly)}:{type:"list",status:g(r),diff: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 A(e) { |
|
||||||
return e.some((t) => t.status !== r.EQUAL) ? r.UPDATED : r.EQUAL; |
|
||||||
} |
|
||||||
function E(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 S(e, t, n) { |
|
||||||
if (!e) return; |
|
||||||
let i = Object.entries(e).find(([s]) => d(s, t, n)); |
|
||||||
return i ? i[1] : void 0; |
|
||||||
} |
|
||||||
function l(e, t, n) { |
|
||||||
return d(e, t, n) ? r.EQUAL : r.UPDATED; |
|
||||||
} |
|
||||||
function j(e) { |
|
||||||
return e.some((t) => t.status !== r.EQUAL) ? r.UPDATED : r.EQUAL; |
|
||||||
} |
|
||||||
function y(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 b(e, t, n) { |
|
||||||
let i = [], |
|
||||||
s, |
|
||||||
f = y(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 = S(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 = b(D, o, n); |
|
||||||
a && a.length > 0 && (s = a); |
|
||||||
} |
|
||||||
D && |
|
||||||
i.push({ |
|
||||||
name: u, |
|
||||||
previousValue: D, |
|
||||||
currentValue: o, |
|
||||||
status: l(D, o, n), |
|
||||||
...(!!s && { subDiff: s }), |
|
||||||
}); |
|
||||||
}), |
|
||||||
i |
|
||||||
); |
|
||||||
} |
|
||||||
function g(e, t, n) { |
|
||||||
if (!e && !t) return { type: "object", status: r.EQUAL, diff: [] }; |
|
||||||
if (!e) return E(t, r.ADDED); |
|
||||||
if (!t) return E(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 = b(o, u, n), |
|
||||||
a = j(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: l(o, u, n), |
|
||||||
}); |
|
||||||
}); |
|
||||||
let s = y(e, t); |
|
||||||
return ( |
|
||||||
s && |
|
||||||
s.forEach((f) => { |
|
||||||
i.push({ |
|
||||||
property: f.property, |
|
||||||
previousValue: f.value, |
|
||||||
currentValue: void 0, |
|
||||||
status: r.DELETED, |
|
||||||
}); |
|
||||||
}), |
|
||||||
{ type: "object", status: A(i), diff: i } |
|
||||||
); |
|
||||||
} |
|
||||||
function O(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 L(e) { |
|
||||||
return e.some((t) => t.status !== r.EQUAL) ? r.UPDATED : r.EQUAL; |
|
||||||
} |
|
||||||
var m = (e, t) => { |
|
||||||
if (!e && !t) return { type: "list", status: r.EQUAL, diff: [] }; |
|
||||||
if (!e) return O(t, r.ADDED); |
|
||||||
if (!t) return O(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: L(n), diff: n } |
|
||||||
); |
|
||||||
}; |
|
||||||
|
|
||||||
exports.getListDiff = m; |
exports.getListDiff = w; |
||||||
exports.getObjectDiff = g; |
exports.getObjectDiff = U; |
||||||
exports.isEqual = d; |
exports.isEqual = p; |
||||||
exports.isObject = p; |
exports.isObject = l; |
||||||
|
@ -1,230 +1,3 @@ |
|||||||
var r = { |
var u={ADDED:"added",EQUAL:"equal",DELETED:"deleted",UPDATED:"updated"},d={...u,MOVED:"moved"},c={BASIC:"basic",DEEP:"deep"};function p(t,e,f={ignoreArrayOrder:!1}){return typeof t!=typeof e?!1:Array.isArray(t)?t.length!==e.length?!1:f.ignoreArrayOrder?t.every(r=>e.some(s=>JSON.stringify(s)===JSON.stringify(r))):t.every((r,s)=>JSON.stringify(r)===JSON.stringify(e[s])):typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):t===e}function l(t){return !!t&&typeof t=="object"&&!Array.isArray(t)}function b(t,e={statuses:[],granularity:c.BASIC}){let{statuses:f,granularity:r}=e;return t.reduce((s,i)=>{if(r===c.DEEP&&i.subPropertiesDiff){let n=b(i.subPropertiesDiff,e);if(n.length>0)return [...s,{...i,subPropertiesDiff:n}]}if(r===c.DEEP&&i.subDiff){let n=b(i.subDiff,e);if(n.length>0)return [...s,{...i,subDiff:n}]}return f.includes(i.status)?[...s,i]:s},[])}function E(t){return t.some(e=>e.status!==u.EQUAL)?u.UPDATED:u.EQUAL}function A(t,e,f={ignoreArrayOrder:!1,showOnly:{statuses:[],granularity:c.BASIC}}){if(!t)return {type:"object",status:u.EQUAL,diff:[]};let r=[];return Object.entries(t).forEach(([s,i])=>{if(l(i)){let n=[];return Object.entries(i).forEach(([o,a])=>{n.push({property:o,previousValue:e===u.ADDED?void 0:a,currentValue:e===u.ADDED?a:void 0,status:e});}),r.push({property:s,previousValue:e===u.ADDED?void 0:t[s],currentValue:e===u.ADDED?i:void 0,status:e,subPropertiesDiff:n})}return r.push({property:s,previousValue:e===u.ADDED?void 0:t[s],currentValue:e===u.ADDED?i:void 0,status:e})}),f.showOnly&&f.showOnly.statuses.length>0?{type:"object",status:e,diff:b(r,f.showOnly)}:{type:"object",status:e,diff:r}}function m(t,e,f){if(!t)return;let r=Object.entries(t).find(([s])=>p(s,e,f));return r?r[1]:void 0}function j(t,e,f){return p(t,e,f)?u.EQUAL:u.UPDATED}function U(t){return t.some(e=>e.status!==u.EQUAL)?u.UPDATED:u.EQUAL}function L(t,e){if(!t)return;let f=Object.keys(t),r=Object.keys(e),s=f.filter(i=>!r.includes(i));if(s.length>0)return s.map(i=>({property:i,value:t[i]}))}function S(t,e,f){let r=[],s,i=L(t,e);return i&&i.forEach(n=>{r.push({property:n.property,previousValue:n.value,currentValue:void 0,status:u.DELETED});}),Object.entries(e).forEach(([n,o])=>{let a=m(t,n,f);if(!a)return r.push({property:n,previousValue:a,currentValue:o,status:!t||!(n in t)?u.ADDED:a===o?u.EQUAL:u.UPDATED});if(l(o)){let D=S(a,o,f);D&&D.length>0&&(s=D);}a&&r.push({property:n,previousValue:a,currentValue:o,status:j(a,o,f),...!!s&&{subDiff:s}});}),r}function P(t,e,f={ignoreArrayOrder:!1,showOnly:{statuses:[],granularity:c.BASIC}}){if(!t&&!e)return {type:"object",status:u.EQUAL,diff:[]};if(!t)return A(e,u.ADDED,f);if(!e)return A(t,u.DELETED,f);let r=[];Object.entries(e).forEach(([i,n])=>{let o=t[i];if(!o)return r.push({property:i,previousValue:o,currentValue:n,status:i in t?o===n?u.EQUAL:u.UPDATED:u.ADDED});if(l(n)){let a=S(o,n,f),D=U(a);return r.push({property:i,previousValue:o,currentValue:n,status:D,...D!==u.EQUAL&&{subPropertiesDiff:a}})}return r.push({property:i,previousValue:o,currentValue:n,status:j(o,n,f)})});let s=L(t,e);return s&&s.forEach(i=>{r.push({property:i.property,previousValue:i.value,currentValue:void 0,status:u.DELETED});}),f.showOnly&&f.showOnly.statuses.length>0?{type:"object",status:E(r),diff:b(r,f.showOnly)}:{type:"object",status:E(r),diff:r}}function w(t,e=[]){return t.filter(f=>e?.includes(f.status))}function g(t,e,f={showOnly:[]}){let r=t.map((s,i)=>({value:s,prevIndex:e===d.ADDED?null:i,newIndex:e===d.ADDED?i:null,indexDiff:null,status:e}));return f.showOnly&&f.showOnly.length>0?{type:"list",status:e,diff:r.filter(s=>f.showOnly?.includes(s.status))}:{type:"list",status:e,diff:r}}function h(t){return t.some(e=>e.status!==d.EQUAL)?d.UPDATED:d.EQUAL}var I=(t,e,f={showOnly:[]})=>{if(!t&&!e)return {type:"list",status:d.EQUAL,diff:[]};if(!t)return g(e,d.ADDED,f);if(!e)return g(t,d.DELETED,f);let r=[],s=[];return e.forEach((i,n)=>{let o=t.findIndex((D,T)=>p(D,i)&&!s.includes(T));o>-1&&s.push(o);let a=o===-1?null:n-o;return a===0?r.push({value:i,prevIndex:o,newIndex:n,indexDiff:a,status:d.EQUAL}):o===-1?r.push({value:i,prevIndex:null,newIndex:n,indexDiff:a,status:d.ADDED}):r.push({value:i,prevIndex:o,newIndex:n,indexDiff:a,status:d.MOVED})}),t.forEach((i,n)=>{if(!s.includes(n))return r.splice(n,0,{value:i,prevIndex:n,newIndex:null,indexDiff:null,status:d.DELETED})}),f.showOnly&&f?.showOnly?.length>0?{type:"list",status:h(r),diff:w(r,f.showOnly)}:{type:"list",status:h(r),diff: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 }; |
export { I as getListDiff, P as getObjectDiff, p as isEqual, l as isObject }; |
||||||
|
Loading…
Reference in new issue