UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines 5.09 kB
{"version":3,"file":"json.mjs","sources":["../../src/utils/json.ts"],"sourcesContent":["import { isArray, isObject, zip, isEqual, uniq } from 'lodash/fp';\n\nconst createContext = (): Context => ({ path: [] });\n\n/**\n * Compute differences between two JSON objects and returns them\n *\n * @param a - First object\n * @param b - Second object\n * @param ctx - Context used to keep track of the current path during recursion\n */\nexport const diff = (a: unknown, b: unknown, ctx: Context = createContext()): Diff[] => {\n const diffs: Diff[] = [];\n const { path } = ctx;\n\n const aType = typeof a;\n const bType = typeof b;\n\n // Define helpers\n\n const added = () => {\n diffs.push({ kind: 'added', path, type: bType, value: b });\n return diffs;\n };\n\n const deleted = () => {\n diffs.push({ kind: 'deleted', path, type: aType, value: a });\n return diffs;\n };\n\n const modified = () => {\n diffs.push({\n kind: 'modified',\n path,\n types: [aType, bType],\n values: [a, b],\n });\n return diffs;\n };\n\n if (isArray(a) && isArray(b)) {\n let k = 0;\n\n for (const [aItem, bItem] of zip(a, b)) {\n const kCtx: Context = { path: [...path, k.toString()] };\n const kDiffs = diff(aItem, bItem, kCtx);\n\n diffs.push(...kDiffs);\n\n k += 1;\n }\n\n return diffs;\n }\n\n if (isObject(a) && isObject(b)) {\n const keys = uniq(Object.keys(a).concat(Object.keys(b)));\n\n for (const key of keys) {\n const aValue = (a as Record<string, unknown>)[key];\n const bValue = (b as Record<string, unknown>)[key];\n\n const nestedDiffs = diff(aValue, bValue, { path: [...path, key] });\n\n diffs.push(...nestedDiffs);\n }\n\n return diffs;\n }\n\n if (!isEqual(a, b)) {\n if (aType === 'undefined') {\n return added();\n }\n\n if (bType === 'undefined') {\n return deleted();\n }\n\n return modified();\n }\n\n return diffs;\n};\n\nexport interface AddedDiff<T = unknown> {\n kind: 'added';\n path: string[];\n type: string;\n value: T;\n}\n\nexport interface ModifiedDiff<T = unknown, P = unknown> {\n kind: 'modified';\n path: string[];\n types: [string, string];\n values: [T, P];\n}\n\nexport interface DeletedDiff<T = unknown> {\n kind: 'deleted';\n path: string[];\n type: string;\n value: T;\n}\n\nexport type Diff<T = unknown> = AddedDiff<T> | ModifiedDiff<T> | DeletedDiff<T>;\n\nexport interface Context {\n path: string[];\n}\n"],"names":["createContext","path","diff","a","b","ctx","diffs","aType","bType","added","push","kind","type","value","deleted","modified","types","values","isArray","k","aItem","bItem","zip","kCtx","toString","kDiffs","isObject","keys","uniq","Object","concat","key","aValue","bValue","nestedDiffs","isEqual"],"mappings":"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"}