{"version":3,"file":"extendedJson-DzXMFE1P.cjs","names":["deepEqual","isObject"],"sources":["../src/lib/diff.ts","../src/lib/extendedJson.ts"],"sourcesContent":["import { isObject } from '@lib/helpers';\nimport { deepEqual } from './equals';\nimport type { KeyType } from './path';\n\nexport type Patch =\n  | { op: 'add'; path: KeyType[]; value: any }\n  | { op: 'remove'; path: KeyType[] }\n  | { op: 'replace'; path: KeyType[]; value: any };\n\nexport interface DiffOptions {\n  stopAt?: number | ((path: KeyType[]) => boolean);\n  diffArrays?: boolean;\n}\n\nexport function diff(\n  a: any,\n  b: any,\n  options: DiffOptions = {},\n): [patches: Patch[], reversePatches: Patch[]] {\n  const result = [..._diff(a, b, options)];\n  const patches = result.map(([patch]) => patch);\n  const reversePatches = result.map(([, reversePatch]) => reversePatch);\n\n  return [patches, reversePatches];\n}\n\nfunction* _diff(\n  a: any,\n  b: any,\n  options: DiffOptions,\n  prefix: KeyType[] = [],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n  if (a === b) {\n    return;\n  }\n\n  if (\n    (typeof options.stopAt === 'number' && prefix.length >= options.stopAt) ||\n    (typeof options.stopAt === 'function' && options.stopAt(prefix))\n  ) {\n    if (deepEqual(a, b)) {\n      return;\n    }\n\n    return yield [\n      { op: 'replace', path: prefix, value: b },\n      { op: 'replace', path: prefix, value: a },\n    ];\n  }\n\n  if (a instanceof Date && b instanceof Date) {\n    if (a.getTime() === b.getTime()) {\n      return;\n    }\n\n    return yield [\n      { op: 'replace', path: prefix, value: b },\n      { op: 'replace', path: prefix, value: a },\n    ];\n  }\n\n  if (a instanceof Map && b instanceof Map) {\n    return yield* mapDiff(a, b, options, prefix);\n  }\n\n  if (a instanceof Set && b instanceof Set) {\n    if (deepEqual(a, b)) {\n      return;\n    }\n\n    return yield [\n      { op: 'replace', path: prefix, value: b },\n      { op: 'replace', path: prefix, value: a },\n    ];\n  }\n\n  if (!options.diffArrays && Array.isArray(a) && Array.isArray(b)) {\n    if (deepEqual(a, b)) {\n      return;\n    }\n\n    return yield [\n      { op: 'replace', path: prefix, value: b },\n      { op: 'replace', path: prefix, value: a },\n    ];\n  }\n\n  if (\n    isObject(a) &&\n    isObject(b) &&\n    (options.diffArrays || (!Array.isArray(a) && !Array.isArray(b)))\n  ) {\n    return yield* objectDiff(a, b, options, prefix);\n  }\n\n  yield [\n    { op: 'replace', path: prefix, value: b },\n    { op: 'replace', path: prefix, value: a },\n  ];\n}\n\nfunction* mapDiff(\n  a: Map<any, any>,\n  b: Map<any, any>,\n  options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n  prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n  for (const [key, value] of a) {\n    if (!b.has(key)) {\n      yield [\n        { op: 'remove', path: [...prefix, key] },\n        { op: 'add', path: [...prefix, key], value },\n      ];\n    } else {\n      yield* _diff(value, b.get(key), options, [...prefix, key]);\n    }\n  }\n\n  for (const [key, value] of b) {\n    if (!a.has(key)) {\n      yield [\n        { op: 'add', path: [...prefix, key], value },\n        { op: 'remove', path: [...prefix, key] },\n      ];\n    }\n  }\n}\n\nfunction* objectDiff(\n  a: any,\n  b: any,\n  options: { stopAt?: number | ((path: KeyType[]) => boolean) },\n  prefix: KeyType[],\n): Iterable<[patch: Patch, reversePatch: Patch]> {\n  for (const [key, value] of Object.entries(a)) {\n    if (!(key in b)) {\n      yield [\n        { op: 'remove', path: [...prefix, key] },\n        { op: 'add', path: [...prefix, key], value },\n      ];\n    } else {\n      yield* _diff(value, b[key], options, [...prefix, key]);\n    }\n  }\n\n  for (const [key, value] of Object.entries(b)) {\n    if (!(key in a)) {\n      yield [\n        { op: 'add', path: [...prefix, key], value },\n        { op: 'remove', path: [...prefix, key] },\n      ];\n    }\n  }\n}\n","export function toExtendedJson(value: unknown): unknown {\n  if (value instanceof Map) {\n    return {\n      __map: [...value].map(([k, v]) => [toExtendedJson(k), toExtendedJson(v)]),\n    };\n  }\n\n  if (value instanceof Set) {\n    return {\n      __set: [...value].map(toExtendedJson),\n    };\n  }\n\n  if (value instanceof Date) {\n    return {\n      __date: value.toISOString(),\n    };\n  }\n\n  if (typeof value === 'bigint') {\n    return {\n      __bigint: value.toString(),\n    };\n  }\n\n  if (Array.isArray(value)) {\n    return value.map(toExtendedJson);\n  }\n\n  if (typeof value === 'object' && value !== null) {\n    return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, toExtendedJson(v)]));\n  }\n\n  return value;\n}\n\nexport function toExtendedJsonString(\n  value: any,\n  replacer?: (this: any, key: string, value: any) => any,\n  space?: string | number,\n): string;\nexport function toExtendedJsonString(\n  value: any,\n  replacer?: (number | string)[] | null,\n  space?: string | number,\n): string;\nexport function toExtendedJsonString(value: unknown, ...args: any[]): string {\n  return JSON.stringify(toExtendedJson(value), ...args);\n}\n\nexport function fromExtendedJson(value: unknown): unknown {\n  if (typeof value !== 'object' || value === null) {\n    return value;\n  }\n\n  if ('__map' in value) {\n    return new Map(\n      (value.__map as [unknown, unknown][]).map(([k, v]) => [\n        fromExtendedJson(k),\n        fromExtendedJson(v),\n      ]),\n    );\n  }\n\n  if ('__set' in value) {\n    return new Set((value.__set as unknown[]).map(fromExtendedJson));\n  }\n\n  if ('__date' in value) {\n    return new Date(value.__date as string);\n  }\n\n  if ('__bigint' in value) {\n    return BigInt(value.__bigint as string);\n  }\n\n  if (Array.isArray(value)) {\n    return value.map(fromExtendedJson);\n  }\n\n  return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, fromExtendedJson(v)]));\n}\n\nexport function fromExtendedJsonString(\n  value: string,\n  reviver?: (this: any, key: string, value: any) => any,\n): unknown {\n  return fromExtendedJson(JSON.parse(value, reviver));\n}\n"],"mappings":"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"}