UNPKG

@bluelovers/deep-diff

Version:

Javascript utility for calculating deep difference, capturing changes, and applying changes across objects; for nodejs and the browser.

1 lines 26.3 kB
{"version":3,"file":"index.esm.mjs","sources":["../src/index.ts"],"sourcesContent":["// @ts-nocheck\n\nexport const enum EnumKinds\n{\n\t/**\n\t * Item was edited\n\t */\n\tDiffEdit = 'E',\n\t/**\n\t * Item is new\n\t */\n\tDiffNew = 'N',\n\t/**\n\t * Item was edited\n\t */\n\tDiffDeleted = 'D',\n\t/**\n\t * Array was modified\n\t */\n\tDiffArray = 'A',\n}\n\nconst validKinds = [EnumKinds.DiffNew, EnumKinds.DiffEdit, EnumKinds.DiffArray, EnumKinds.DiffDeleted] as const;\n\nexport type IPathKey = string | number | symbol;\nexport type IPaths = IPathKey[];\n\nexport type IDiffNode<LHS = unknown, RHS = LHS> = DiffNew<RHS> | DiffDeleted<LHS> | DiffEdit<LHS, RHS> | DiffArray<LHS, RHS>;\n\nexport type Observer<LHS, RHS = LHS> = (diff: IDiffNode<LHS, RHS>) => void;\n\nexport type PreFilterFunction = (path: any[], key: any) => boolean;\nexport interface PreFilterObject<LHS, RHS = LHS> {\n\tprefilter?(path: any[], key: any): boolean;\n\tnormalize?(currentPath: any, key: any, lhs: LHS, rhs: RHS): [ LHS, RHS ] | undefined;\n}\n\nexport type PreFilter<LHS, RHS = LHS> = PreFilterFunction | PreFilterObject<LHS, RHS>;\n\nexport type Filter<LHS, RHS = LHS> = (target: LHS, source: RHS, change: IDiffNode<LHS, RHS>) => boolean;\n\nexport abstract class Diff\n{\n\tpublic path: IPaths;\n\n\tprotected constructor(public kind: EnumKinds, path?: IPaths)\n\t{\n\t\tif (path?.length)\n\t\t{\n\t\t\tthis.path = path\n\t\t}\n\t}\n}\n\n/**\n * Item was edited\n */\nexport class DiffEdit<LHS, RHS = LHS> extends Diff\n{\n\tpublic override kind: EnumKinds.DiffEdit;\n\n\tconstructor(path: IPaths, public lhs: LHS, public rhs: RHS)\n\t{\n\t\tsuper(EnumKinds.DiffEdit, path);\n\t}\n}\n\n/**\n * Item is new\n */\nexport class DiffNew<RHS> extends Diff\n{\n\tpublic override kind: EnumKinds.DiffNew;\n\n\tconstructor(path: IPaths, public rhs: RHS)\n\t{\n\t\tsuper(EnumKinds.DiffNew, path);\n\t}\n}\n\n/**\n * Item was edited\n */\nexport class DiffDeleted<LHS> extends Diff\n{\n\tpublic override kind: EnumKinds.DiffDeleted;\n\n\tconstructor(path: IPaths, public lhs: LHS)\n\t{\n\t\tsuper(EnumKinds.DiffDeleted, path);\n\t}\n}\n\n/**\n * Array was modified\n */\nexport class DiffArray<LHS, RHS = LHS> extends Diff\n{\n\tpublic override kind: EnumKinds.DiffArray;\n\n\tconstructor(path: IPaths, public index: number, public item: IDiffNode<LHS, RHS>)\n\t{\n\t\tsuper(EnumKinds.DiffArray, path);\n\t}\n}\n\nfunction arrayRemove<T extends any[]>(arr: T, from: number)\n{\n\treturn arr.splice(from, 1);\n\n//\tconst rest = arr.slice((to || from) + 1 || arr.length);\n//\tarr.length = from < 0 ? arr.length + from : from;\n//\tarr.push.apply(arr, rest);\n//\treturn arr;\n}\n\nfunction realTypeOf(subject: unknown)\n{\n\tconst type = typeof subject;\n\tif (type !== 'object')\n\t{\n\t\treturn type;\n\t}\n\n\tif (subject === Math)\n\t{\n\t\treturn 'math';\n\t}\n\telse if (subject === null)\n\t{\n\t\treturn 'null';\n\t}\n\telse if (Array.isArray(subject))\n\t{\n\t\treturn 'array';\n\t}\n\telse if (Object.prototype.toString.call(subject) === '[object Date]')\n\t{\n\t\treturn 'date';\n\t}\n\telse if (typeof subject.toString === 'function' && /^\\/.*\\//.test(subject.toString()))\n\t{\n\t\treturn 'regexp';\n\t}\n\treturn 'object';\n}\n\n/**\n * @see http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/\n */\nfunction hashThisString(string: string)\n{\n\tlet hash = 0;\n\tif (string.length === 0)\n\t{ return hash; }\n\tfor (let i = 0; i < string.length; i++)\n\t{\n\t\tconst char = string.charCodeAt(i);\n\t\thash = ((hash << 5) - hash) + char;\n\t\thash = hash & hash; // Convert to 32bit integer\n\t}\n\treturn hash;\n}\n\n/**\n * Gets a hash of the given object in an array order-independent fashion\n * also object key order independent (easier since they can be alphabetized)\n */\nexport function getOrderIndependentHash(object: unknown)\n{\n\tlet accum = 0;\n\tconst type = realTypeOf(object);\n\n\tif (type === 'array')\n\t{\n\t\tobject.forEach(function (item)\n\t\t{\n\t\t\t// Addition is commutative so this is order indep\n\t\t\taccum += getOrderIndependentHash(item);\n\t\t});\n\n\t\tconst arrayString = normalizeHashDesc(type, {\n\t\t\thash: accum,\n\t\t})\n\n\t\treturn accum + hashThisString(arrayString);\n\t}\n\telse if (type === 'object')\n\t{\n\t\tfor (const key in object)\n\t\t{\n\t\t\tif (object.hasOwnProperty(key))\n\t\t\t{\n\t\t\t\tconst keyValueString = normalizeHashDesc(type, {\n\t\t\t\t\tkey,\n\t\t\t\t\thash: getOrderIndependentHash(object[key]),\n\t\t\t\t});\n\n\t\t\t\taccum += hashThisString(keyValueString);\n\t\t\t}\n\t\t}\n\n\t\treturn accum;\n\t}\n\n\t// Non object, non array...should be good?\n\tconst stringToHash = normalizeHashDesc(type, {\n\t\tvalue: object,\n\t});\n\n\treturn accum + hashThisString(stringToHash);\n}\n\nfunction normalizeHashDesc(type: ReturnType<typeof realTypeOf>, options: {\n\tvalue?: any,\n\tkey?: IPathKey,\n\thash?: number,\n})\n{\n\tswitch (type)\n\t{\n\t\tcase 'array':\n\t\t\treturn `[ type: ${type} , hash: ${options.hash}]`;\n\t\tcase 'object':\n\t\t\treturn `[ type: ${type}, key: ${options.key} , hash: ${options.hash}]`;\n\t\tdefault:\n\t\t\treturn `[ type: ${type} , value: ${options.value}]`;\n\t}\n}\n\nfunction _deepDiff(lhs, rhs, changes: IDiffNode[], prefilter, path: IPaths, key, stack, orderIndependent: boolean)\n{\n\tchanges = changes || [];\n\tpath = path || [];\n\tstack = stack || [];\n\tconst currentPath = path.slice(0);\n\tif (typeof key !== 'undefined' && key !== null)\n\t{\n\t\tif (prefilter)\n\t\t{\n\t\t\tif (typeof (prefilter) === 'function' && prefilter(currentPath, key))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (typeof (prefilter) === 'object')\n\t\t\t{\n\t\t\t\tif (prefilter.prefilter && prefilter.prefilter(currentPath, key))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (prefilter.normalize)\n\t\t\t\t{\n\t\t\t\t\tconst alt = prefilter.normalize(currentPath, key, lhs, rhs);\n\t\t\t\t\tif (alt)\n\t\t\t\t\t{\n\t\t\t\t\t\tlhs = alt[0];\n\t\t\t\t\t\trhs = alt[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcurrentPath.push(key);\n\t}\n\n\t// Use string comparison for regexes\n\tif (realTypeOf(lhs) === 'regexp' && realTypeOf(rhs) === 'regexp')\n\t{\n\t\tlhs = lhs.toString();\n\t\trhs = rhs.toString();\n\t}\n\n\tconst ltype = typeof lhs;\n\tconst rtype = typeof rhs;\n\tlet i, j, k, other;\n\n\tconst ldefined = ltype !== 'undefined' ||\n\t\t(stack && (stack.length > 0) && stack[stack.length - 1].lhs &&\n\t\t\tObject.getOwnPropertyDescriptor(stack[stack.length - 1].lhs, key));\n\tconst rdefined = rtype !== 'undefined' ||\n\t\t(stack && (stack.length > 0) && stack[stack.length - 1].rhs &&\n\t\t\tObject.getOwnPropertyDescriptor(stack[stack.length - 1].rhs, key));\n\n\tif (!ldefined && rdefined)\n\t{\n\t\tchanges.push(new DiffNew(currentPath, rhs));\n\t}\n\telse if (!rdefined && ldefined)\n\t{\n\t\tchanges.push(new DiffDeleted(currentPath, lhs));\n\t}\n\telse if (realTypeOf(lhs) !== realTypeOf(rhs))\n\t{\n\t\tchanges.push(new DiffEdit(currentPath, lhs, rhs));\n\t}\n\telse if (realTypeOf(lhs) === 'date' && (lhs - rhs) !== 0)\n\t{\n\t\tchanges.push(new DiffEdit(currentPath, lhs, rhs));\n\t}\n\telse if (ltype === 'object' && lhs !== null && rhs !== null)\n\t{\n\t\tfor (i = stack.length - 1; i > -1; --i)\n\t\t{\n\t\t\tif (stack[i].lhs === lhs)\n\t\t\t{\n\t\t\t\tother = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!other)\n\t\t{\n\t\t\tstack.push({ lhs: lhs, rhs: rhs });\n\t\t\tif (Array.isArray(lhs))\n\t\t\t{\n\t\t\t\t// If order doesn't matter, we need to sort our arrays\n\t\t\t\tif (orderIndependent)\n\t\t\t\t{\n\t\t\t\t\tlhs.sort(function (a, b)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn getOrderIndependentHash(a) - getOrderIndependentHash(b);\n\t\t\t\t\t});\n\n\t\t\t\t\trhs.sort(function (a, b)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn getOrderIndependentHash(a) - getOrderIndependentHash(b);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ti = rhs.length - 1;\n\t\t\t\tj = lhs.length - 1;\n\t\t\t\twhile (i > j)\n\t\t\t\t{\n\t\t\t\t\tchanges.push(new DiffArray(currentPath, i, new DiffNew(undefined, rhs[i--])));\n\t\t\t\t}\n\t\t\t\twhile (j > i)\n\t\t\t\t{\n\t\t\t\t\tchanges.push(new DiffArray(currentPath, j, new DiffDeleted(undefined, lhs[j--])));\n\t\t\t\t}\n\t\t\t\tfor (; i >= 0; --i)\n\t\t\t\t{\n\t\t\t\t\t_deepDiff(lhs[i], rhs[i], changes, prefilter, currentPath, i, stack, orderIndependent);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tconst akeys = Object.keys(lhs).concat(Object.getOwnPropertySymbols(lhs));\n\t\t\t\tconst pkeys = Object.keys(rhs).concat(Object.getOwnPropertySymbols(rhs));\n\t\t\t\tfor (i = 0; i < akeys.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tk = akeys[i];\n\t\t\t\t\tother = pkeys.indexOf(k);\n\t\t\t\t\tif (other >= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_deepDiff(lhs[k], rhs[k], changes, prefilter, currentPath, k, stack, orderIndependent);\n\t\t\t\t\t\tpkeys[other] = null;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t_deepDiff(lhs[k], undefined, changes, prefilter, currentPath, k, stack, orderIndependent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (i = 0; i < pkeys.length; ++i)\n\t\t\t\t{\n\t\t\t\t\tk = pkeys[i];\n\t\t\t\t\tif (k)\n\t\t\t\t\t{\n\t\t\t\t\t\t_deepDiff(undefined, rhs[k], changes, prefilter, currentPath, k, stack, orderIndependent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstack.length = stack.length - 1;\n\t\t}\n\t\telse if (lhs !== rhs)\n\t\t{\n\t\t\t// lhs is contains a cycle at this element and it differs from rhs\n\t\t\tchanges.push(new DiffEdit(currentPath, lhs, rhs));\n\t\t}\n\t}\n\telse if (lhs !== rhs)\n\t{\n\t\tif (!(ltype === 'number' && isNaN(lhs) && isNaN(rhs)))\n\t\t{\n\t\t\tchanges.push(new DiffEdit(currentPath, lhs, rhs));\n\t\t}\n\t}\n}\n\nexport function observableDiff<LHS, RHS = LHS>(lhs: LHS, rhs: RHS, observer?: Observer<LHS, RHS>, prefilter?: PreFilter<LHS, RHS>, orderIndependent?: boolean)\n{\n\tconst changes: IDiffNode<LHS, RHS>[] = [];\n\t_deepDiff<LHS, RHS>(lhs, rhs, changes, prefilter, null, null, null, orderIndependent);\n\tif (observer)\n\t{\n\t\tfor (let i = 0; i < changes.length; ++i)\n\t\t{\n\t\t\tobserver(changes[i]);\n\t\t}\n\t}\n\treturn changes;\n}\n\nexport function orderIndependentObservableDiff(lhs, rhs, changes, prefilter, path, key, stack)\n{\n\treturn _deepDiff(lhs, rhs, changes, prefilter, path, key, stack, true);\n}\n\nexport function deepDiff<LHS, RHS = LHS>(lhs: LHS, rhs: RHS, prefilter?: PreFilter<LHS, RHS>, accum?: IDiffNode<LHS, RHS>[]): IDiffNode<LHS, RHS>[]\n{\n\tconst observer = (accum) ?\n\t\tfunction (difference: IDiffNode)\n\t\t{\n\t\t\tif (difference)\n\t\t\t{\n\t\t\t\taccum!.push(difference);\n\t\t\t}\n\t\t} : undefined;\n\tconst changes = observableDiff<LHS, RHS>(lhs, rhs, observer, prefilter);\n\treturn (accum) ? accum : (changes.length) ? changes : undefined;\n}\n\nexport function orderIndependentDiff<LHS, RHS = LHS>(lhs: LHS, rhs: RHS, prefilter?: PreFilter<LHS, RHS>, accum?: IDiffNode<LHS, RHS>[])\n{\n\tconst observer = (accum) ?\n\t\tfunction (difference: IDiffNode<LHS, RHS>)\n\t\t{\n\t\t\tif (difference)\n\t\t\t{\n\t\t\t\taccum!.push(difference);\n\t\t\t}\n\t\t} : undefined;\n\tconst changes = observableDiff(lhs, rhs, observer, prefilter, true);\n\treturn (accum) ? accum : (changes.length) ? changes : undefined;\n}\n\nfunction _traversalObject<T>(target: any, path: IPaths)\n{\n\tpath = path.slice();\n\n\tconst key = path.pop();\n\n\tlet it: T = target;\n\n\tpath.reduce((target, key) => {\n\t\treturn it = target[key]\n\t}, it);\n\n\treturn [it, key] as const\n}\n\nfunction _applyArrayChange<T extends any[]>(arr: T, index: number, change: IDiffNode)\n{\n\tif (change.path?.length)\n\t{\n//\t\tlet it = arr[index],\n//\t\t\ti, u = change.path.length - 1;\n//\t\tfor (i = 0; i < u; i++)\n//\t\t{\n//\t\t\tit = it[change.path[i]];\n//\t\t}\n//\n//\t\tlet key = change.path[i];\n\n\t\tlet [it, key] = _traversalObject(arr[index], change.path);\n\n\t\tswitch (change.kind)\n\t\t{\n\t\t\tcase 'A':\n\t\t\t\t_applyArrayChange(it[key], change.index, change.item);\n\t\t\t\tbreak;\n\t\t\tcase 'D':\n\t\t\t\tdelete it[key];\n\t\t\t\tbreak;\n\t\t\tcase 'E':\n\t\t\tcase 'N':\n\t\t\t\tit[key] = change.rhs;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\tswitch (change.kind)\n\t\t{\n\t\t\tcase 'A':\n\t\t\t\t_applyArrayChange(arr[index], change.index, change.item);\n\t\t\t\tbreak;\n\t\t\tcase 'D':\n\t\t\t\tarr = arrayRemove(arr, index);\n\t\t\t\tbreak;\n\t\t\tcase 'E':\n\t\t\tcase 'N':\n\t\t\t\tarr[index] = change.rhs;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn arr;\n}\n\nexport function isIDiffNode<T extends IDiffNode>(source?: unknown): source is T\n{\n\treturn (source ?? false) && validKinds.includes(source.kind)\n}\n\nexport function applyChange<LHS>(target: LHS, source: any, change?: IDiffNode<LHS, any>)\n{\n\tif (typeof change === 'undefined' && isIDiffNode(source))\n\t{\n\t\tchange = source;\n\t}\n\tif (target && change && change.kind)\n\t{\n\t\tlet it = target,\n\t\t\ti = -1,\n\t\t\tlast = change.path ? change.path.length - 1 : 0;\n\t\twhile (++i < last)\n\t\t{\n\t\t\tif (typeof it[change.path[i]] === 'undefined')\n\t\t\t{\n\t\t\t\tit[change.path[i]] = (typeof change.path[i + 1] !== 'undefined' && typeof change.path[i + 1] === 'number')\n\t\t\t\t\t? []\n\t\t\t\t\t: {};\n\t\t\t}\n\t\t\tit = it[change.path[i]];\n\t\t}\n\t\tswitch (change.kind)\n\t\t{\n\t\t\tcase 'A':\n\t\t\t\tif (change.path && typeof it[change.path[i]] === 'undefined')\n\t\t\t\t{\n\t\t\t\t\tit[change.path[i]] = [];\n\t\t\t\t}\n\t\t\t\t_applyArrayChange(change.path ? it[change.path[i]] : it, change.index, change.item);\n\t\t\t\tbreak;\n\t\t\tcase 'D':\n\t\t\t\tdelete it[change.path[i]];\n\t\t\t\tbreak;\n\t\t\tcase 'E':\n\t\t\tcase 'N':\n\t\t\t\tit[change.path[i]] = change.rhs;\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nfunction revertArrayChange<T extends any[]>(arr: T, index: number, change: IDiffNode)\n{\n\tif (change.path && change.path.length)\n\t{\n\t\t// the structure of the object at the index has changed...\n\t\tlet it = arr[index],\n\t\t\ti, u = change.path.length - 1;\n\t\tfor (i = 0; i < u; i++)\n\t\t{\n\t\t\tit = it[change.path[i]];\n\t\t}\n\t\tswitch (change.kind)\n\t\t{\n\t\t\tcase EnumKinds.DiffArray:\n\t\t\t\trevertArrayChange(it[change.path[i]], change.index, change.item);\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffDeleted:\n\t\t\t\tit[change.path[i]] = change.lhs;\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffEdit:\n\t\t\t\tit[change.path[i]] = change.lhs;\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffNew:\n\t\t\t\tdelete it[change.path[i]];\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse\n\t{\n\t\t// the array item is different...\n\t\tswitch (change.kind)\n\t\t{\n\t\t\tcase EnumKinds.DiffArray:\n\t\t\t\trevertArrayChange(arr[index], change.index, change.item);\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffDeleted:\n\t\t\t\tarr[index] = change.lhs;\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffEdit:\n\t\t\t\tarr[index] = change.lhs;\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffNew:\n\t\t\t\tarr = arrayRemove(arr, index);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn arr;\n}\n\nexport function revertChange<LHS>(target: LHS, source: any, change: IDiffNode)\n{\n\tif (target && source && change?.kind)\n\t{\n\t\tlet it = target,\n\t\t\ti, u;\n\t\tu = change.path.length - 1;\n\t\tfor (i = 0; i < u; i++)\n\t\t{\n\t\t\tif (typeof it[change.path[i]] === 'undefined')\n\t\t\t{\n\t\t\t\tit[change.path[i]] = {};\n\t\t\t}\n\t\t\tit = it[change.path[i]];\n\t\t}\n\t\tswitch (change.kind)\n\t\t{\n\t\t\tcase EnumKinds.DiffArray:\n\t\t\t\t// Array was modified...\n\t\t\t\t// it will be an array...\n\t\t\t\trevertArrayChange(it[change.path[i]], change.index, change.item);\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffDeleted:\n\t\t\t\t// Item was deleted...\n\t\t\t\tit[change.path[i]] = change.lhs;\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffEdit:\n\t\t\t\t// Item was edited...\n\t\t\t\tit[change.path[i]] = change.lhs;\n\t\t\t\tbreak;\n\t\t\tcase EnumKinds.DiffNew:\n\t\t\t\t// Item is new...\n\t\t\t\tdelete it[change.path[i]];\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport function applyDiff<LHS, RHS = LHS>(target: LHS, source: RHS, filter?: Filter<LHS, RHS>)\n{\n\tif (target && source)\n\t{\n\t\tconst onChange = function (change: IDiffNode<LHS, RHS>)\n\t\t{\n\t\t\tif (!filter || filter(target, source, change))\n\t\t\t{\n\t\t\t\tapplyChange(target, source, change);\n\t\t\t}\n\t\t};\n\t\tobservableDiff(target, source, onChange);\n\t}\n\treturn target\n}\n\nfunction _applyDiffChangeCore<T>(lhs: unknown, differences: IDiffNode<any, any>[], fn: (lhs: any, source: true, it: IDiffNode<any, any>) => any): lhs is T\n{\n\tdifferences.forEach((it) => {\n\t\tfn(lhs, true, it);\n\t});\n\n\treturn true;\n}\n\nexport function applyDiffChange<RHS>(lhs: unknown, differences: IDiffNode<any, RHS>[]): RHS\n{\n\tif (_applyDiffChangeCore<RHS>(lhs, differences, applyChange))\n\t{\n\t\treturn lhs\n\t}\n}\n\nexport function revertDiffChange<LHS>(lhs: unknown, differences: IDiffNode<LHS, any>[]): LHS\n{\n\tif (_applyDiffChangeCore<LHS>(lhs, differences, revertChange))\n\t{\n\t\treturn lhs\n\t}\n}\n\nexport { deepDiff as diff }\n\nexport default deepDiff;\n"],"names":["EnumKinds","validKinds","Diff","constructor","kind","path","this","length","DiffEdit","lhs","rhs","super","DiffNew","DiffDeleted","DiffArray","index","item","arrayRemove","arr","from","splice","realTypeOf","subject","type","Math","Array","isArray","Object","prototype","toString","call","test","hashThisString","string","hash","i","charCodeAt","getOrderIndependentHash","object","accum","forEach","arrayString","normalizeHashDesc","key","hasOwnProperty","keyValueString","stringToHash","value","options","_deepDiff","changes","prefilter","stack","orderIndependent","currentPath","slice","normalize","alt","push","ltype","rtype","j","k","other","ldefined","getOwnPropertyDescriptor","rdefined","sort","a","b","undefined","akeys","keys","concat","getOwnPropertySymbols","pkeys","indexOf","isNaN","observableDiff","observer","orderIndependentObservableDiff","deepDiff","difference","orderIndependentDiff","_applyArrayChange","change","_change$path","it","_traversalObject","target","pop","reduce","isIDiffNode","source","includes","applyChange","last","revertArrayChange","u","revertChange","applyDiff","filter","_applyDiffChangeCore","differences","fn","applyDiffChange","revertDiffChange"],"mappings":"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"}