{"version":3,"file":"patchMethods-CZje49Dk.cjs","names":["remove","set","diff","applyPatches","_applyPatches","toExtendedJson","fromExtendedJson","patchMethods: {\n  subscribePatches: typeof subscribePatches;\n  applyPatches: typeof applyPatches;\n  sync: typeof sync;\n  acceptSync: typeof acceptSync;\n}"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n  if (patch.op === 'remove') {\n    return remove(target, patch.path as any);\n  }\n\n  return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n  for (const patch of patches) {\n    target = applySinglePatch(target, patch);\n  }\n\n  return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n  children: Map<KeyType, TrieNode> = new Map();\n  isLeaf = false;\n}\n\nexport class Trie {\n  root: TrieNode = new TrieNode();\n\n  add(path: KeyType[]): void {\n    let node = this.root;\n    for (const key of path) {\n      let next = node.children.get(key);\n      if (!next) node.children.set(key, (next = new TrieNode()));\n      node = next;\n    }\n    node.isLeaf = true;\n  }\n\n  hasSubPath(path: KeyType[]): boolean {\n    let node = this.root;\n    for (const key of path) {\n      const next = node.children.get(key);\n      if (!next) return false;\n      node = next;\n    }\n    return node.isLeaf;\n  }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n  fromVersion?: string;\n  toVersion: string;\n  patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n  reversePatches: Patch[];\n}\n\ndeclare module '..' {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  interface Store<T> {\n    __patches?: {\n      value: T;\n      version: string;\n      history: HistoryEntry[];\n    };\n  }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n  /** @default false */\n  runNow?: boolean;\n  /** try to start from a specific version and only receive patches after that.\n   * If the id is not found, it will start from the beginning */\n  startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n  this: Store<T>,\n  listener: (\n    this: { cancel: Cancel },\n    patches: Patch[],\n    reversePatches: Patch[],\n    version: string,\n    previousVersion: string | undefined,\n  ) => void,\n  options: SubscribePatchOptions = {},\n): DisposableCancel {\n  const patches = (this.__patches ??= {\n    value: this.get(),\n    version: genId(),\n    history: [],\n  });\n\n  options = { ...options };\n  options.runNow ??= false;\n  let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n  return this.subscribe(function (value) {\n    if (patches.value !== value) {\n      const result = diff(patches.value, value, options);\n      patches.value = value;\n\n      if (result[0].length > 0) {\n        const newVersion = genId();\n\n        patches.history = patches.history\n          .concat({\n            fromVersion: patches.version,\n            toVersion: newVersion,\n            patches: result[0],\n            reversePatches: result[1],\n          })\n          .slice(-1000);\n\n        patches.version = newVersion;\n      }\n    }\n\n    if (cursor === patches.version) return;\n    const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n    let forward, backward, previousVersion;\n\n    if (index === -1) {\n      [forward, backward] = diff(undefined, value, options);\n      previousVersion = undefined;\n    } else {\n      forward = patches.history.slice(index).flatMap((h) => h.patches);\n      backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n      previousVersion = cursor;\n    }\n\n    cursor = patches.version;\n    listener.apply(this, [forward, backward, cursor, previousVersion]);\n  }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n  this: Store<T>,\n  ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n  this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n  this: Store<T>,\n  listener: (syncMessage: SyncMessage) => void,\n  options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n  const debounce =\n    typeof options?.debounce === 'object' && 'wait' in options.debounce\n      ? { ...options.debounce }\n      : options?.debounce !== undefined\n        ? { wait: options.debounce }\n        : undefined;\n\n  if (debounce) {\n    debounce.waitOnRunNow ??= false;\n  }\n\n  return subscribePatches.apply<\n    Store<T>,\n    Parameters<typeof subscribePatches<T>>,\n    ReturnType<typeof subscribePatches<T>>\n  >(this, [\n    (patches, _, version, previousVersion) => {\n      const trie = new Trie();\n\n      patches = [...patches]\n        .reverse()\n        .filter((patch) => {\n          if (trie.hasSubPath(patch.path)) {\n            return false;\n          }\n\n          trie.add(patch.path);\n          return true;\n        })\n        .reverse();\n\n      listener({\n        fromVersion: previousVersion,\n        toVersion: version,\n        patches: toExtendedJson(patches) as Patch[],\n      });\n    },\n    { ...options, debounce, runNow: true },\n  ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n  if (message.fromVersion && message.fromVersion !== this.version) {\n    throw new Error(\n      `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n    );\n  }\n\n  const patches = fromExtendedJson(message.patches) as Patch[];\n\n  this.version = message.toVersion;\n  applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n  subscribePatches: typeof subscribePatches;\n  applyPatches: typeof applyPatches;\n  sync: typeof sync;\n  acceptSync: typeof acceptSync;\n} = {\n  subscribePatches,\n  applyPatches,\n  sync,\n  acceptSync,\n};\n"],"mappings":"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"}