{"version":3,"file":"duplex.cjs","sources":["@gensx/core/../../../../src/utils/fast-json-patch/duplex.ts"],"sourcesContent":["/* eslint-disable */\n// @ts-nocheck\n// We have a copy of fast-json-patch here because there are es related issues in certain build environments.\n\n/*!\n * https://github.com/Starcounter-Jack/JSON-Patch\n * (c) 2017-2021 Joachim Wester\n * MIT license\n */\nimport { applyPatch, Operation } from \"./core.js\";\nimport {\n  _deepClone,\n  _objectKeys,\n  escapePathComponent,\n  hasOwnProperty,\n} from \"./helpers.js\";\n\nexport interface Observer<T> {\n  object: T;\n  patches: Operation[];\n  unobserve: () => void;\n  callback: (patches: Operation[]) => void;\n}\n\nvar beforeDict = new WeakMap();\n\nclass Mirror {\n  obj: any;\n  observers = new Map<Function, ObserverInfo>();\n  value: object | any[];\n\n  constructor(obj: object) {\n    this.obj = obj;\n  }\n}\n\nclass ObserverInfo {\n  callback: Function;\n  observer: ObserverInfo;\n\n  constructor(callback: Function, observer: ObserverInfo) {\n    this.callback = callback;\n    this.observer = observer;\n  }\n}\n\nfunction getMirror(obj: object): Mirror {\n  return beforeDict.get(obj);\n}\n\nfunction getObserverFromMirror(mirror: Mirror, callback): ObserverInfo {\n  return mirror.observers.get(callback);\n}\n\nfunction removeObserverFromMirror(mirror: Mirror, observer): void {\n  mirror.observers.delete(observer.callback);\n}\n\n/**\n * Detach an observer from an object\n */\nexport function unobserve<T>(root: T, observer: Observer<T>) {\n  observer.unobserve();\n}\n\n/**\n * Observes changes made to an object, which can then be retrieved using generate\n */\nexport function observe<T>(\n  obj: object | T[],\n  callback?: (patches: Operation[]) => void,\n): Observer<T> {\n  var patches = [];\n  var observer;\n  var mirror = getMirror(obj);\n\n  if (!mirror) {\n    mirror = new Mirror(obj);\n    beforeDict.set(obj, mirror);\n  } else {\n    const observerInfo = getObserverFromMirror(mirror, callback);\n    observer = observerInfo && observerInfo.observer;\n  }\n\n  if (observer) {\n    return observer;\n  }\n\n  observer = {};\n\n  mirror.value = _deepClone(obj);\n\n  if (callback) {\n    observer.callback = callback;\n    observer.next = null;\n\n    var dirtyCheck = () => {\n      generate(observer);\n    };\n    var fastCheck = () => {\n      clearTimeout(observer.next);\n      observer.next = setTimeout(dirtyCheck);\n    };\n    if (typeof window !== \"undefined\") {\n      //not Node\n      window.addEventListener(\"mouseup\", fastCheck);\n      window.addEventListener(\"keyup\", fastCheck);\n      window.addEventListener(\"mousedown\", fastCheck);\n      window.addEventListener(\"keydown\", fastCheck);\n      window.addEventListener(\"change\", fastCheck);\n    }\n  }\n  observer.patches = patches;\n  observer.object = obj;\n\n  observer.unobserve = () => {\n    generate(observer);\n    clearTimeout(observer.next);\n    removeObserverFromMirror(mirror, observer);\n\n    if (typeof window !== \"undefined\") {\n      window.removeEventListener(\"mouseup\", fastCheck);\n      window.removeEventListener(\"keyup\", fastCheck);\n      window.removeEventListener(\"mousedown\", fastCheck);\n      window.removeEventListener(\"keydown\", fastCheck);\n      window.removeEventListener(\"change\", fastCheck);\n    }\n  };\n\n  mirror.observers.set(callback, new ObserverInfo(callback, observer));\n\n  return observer;\n}\n\n/**\n * Generate an array of patches from an observer\n */\nexport function generate<T>(\n  observer: Observer<object>,\n  invertible = false,\n): Operation[] {\n  var mirror = beforeDict.get(observer.object);\n\n  _generate(mirror.value, observer.object, observer.patches, \"\", invertible);\n  if (observer.patches.length) {\n    applyPatch(mirror.value, observer.patches);\n  }\n  var temp = observer.patches;\n  if (temp.length > 0) {\n    observer.patches = [];\n    if (observer.callback) {\n      observer.callback(temp);\n    }\n  }\n  return temp;\n}\n\n// Dirty check if obj is different from mirror, generate patches and update mirror\nfunction _generate(mirror, obj, patches, path, invertible) {\n  if (obj === mirror) {\n    return;\n  }\n\n  if (typeof obj.toJSON === \"function\") {\n    obj = obj.toJSON();\n  }\n\n  var newKeys = _objectKeys(obj);\n  var oldKeys = _objectKeys(mirror);\n  var changed = false;\n  var deleted = false;\n\n  //if ever \"move\" operation is implemented here, make sure this test runs OK: \"should not generate the same patch twice (move)\"\n\n  for (var t = oldKeys.length - 1; t >= 0; t--) {\n    var key = oldKeys[t];\n    var oldVal = mirror[key];\n\n    if (\n      hasOwnProperty(obj, key) &&\n      !(obj[key] === undefined && oldVal !== undefined && !Array.isArray(obj))\n    ) {\n      var newVal = obj[key];\n\n      if (\n        typeof oldVal == \"object\" &&\n        oldVal != null &&\n        typeof newVal == \"object\" &&\n        newVal != null &&\n        Array.isArray(oldVal) === Array.isArray(newVal)\n      ) {\n        _generate(\n          oldVal,\n          newVal,\n          patches,\n          path + \"/\" + escapePathComponent(key),\n          invertible,\n        );\n      } else {\n        if (oldVal !== newVal) {\n          changed = true;\n          if (invertible) {\n            patches.push({\n              op: \"test\",\n              path: path + \"/\" + escapePathComponent(key),\n              value: _deepClone(oldVal),\n            });\n          }\n          patches.push({\n            op: \"replace\",\n            path: path + \"/\" + escapePathComponent(key),\n            value: _deepClone(newVal),\n          });\n        }\n      }\n    } else if (Array.isArray(mirror) === Array.isArray(obj)) {\n      if (invertible) {\n        patches.push({\n          op: \"test\",\n          path: path + \"/\" + escapePathComponent(key),\n          value: _deepClone(oldVal),\n        });\n      }\n      patches.push({\n        op: \"remove\",\n        path: path + \"/\" + escapePathComponent(key),\n      });\n      deleted = true; // property has been deleted\n    } else {\n      if (invertible) {\n        patches.push({ op: \"test\", path, value: mirror });\n      }\n      patches.push({ op: \"replace\", path, value: obj });\n      changed = true;\n    }\n  }\n\n  if (!deleted && newKeys.length == oldKeys.length) {\n    return;\n  }\n\n  for (var t = 0; t < newKeys.length; t++) {\n    var key = newKeys[t];\n    if (!hasOwnProperty(mirror, key) && obj[key] !== undefined) {\n      patches.push({\n        op: \"add\",\n        path: path + \"/\" + escapePathComponent(key),\n        value: _deepClone(obj[key]),\n      });\n    }\n  }\n}\n/**\n * Create an array of patches from the differences in two objects\n */\nexport function compare(\n  tree1: object | any[],\n  tree2: object | any[],\n  invertible = false,\n): Operation[] {\n  var patches = [];\n  _generate(tree1, tree2, patches, \"\", invertible);\n  return patches;\n}\n"],"names":["_objectKeys","hasOwnProperty","escapePathComponent","_deepClone"],"mappings":"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"}