{"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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"}