@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
Source Map (JSON)
{"version":3,"file":"index.umd.production.min.cjs","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","exports","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","deepDiff","difference","_applyArrayChange","change","_change$path","it","_traversalObject","target","pop","reduce","isIDiffNode","source","includes","applyChange","last","revertArrayChange","u","revertChange","_applyDiffChangeCore","differences","fn","applyDiff","filter","applyDiffChange","orderIndependentDiff","orderIndependentObservableDiff","revertDiffChange"],"mappings":"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"}