{"version":3,"file":"extendedJson-pbOLcymB.cjs","names":["deepEqual","isObject"],"sources":["../src/lib/diff.ts","../src/lib/extendedJson.ts"],"sourcesContent":["import { deepEqual } from './equals';\nimport type { KeyType } from './path';\nimport { isObject } from '@lib/helpers';\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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"}