{"version":3,"sources":["../src/index.ts"],"sourcesContent":["const isObject = (value: any): value is object => typeof value === 'object'\n  && value != null\n  && !(value instanceof Boolean)\n  && !(value instanceof Date)\n  && !(value instanceof Number)\n  && !(value instanceof RegExp)\n  && !(value instanceof String)\n\nconst toPointer = (parts: string[]) => '#' + parts.map(part => String(part).replace(/~/g, '~0').replace(/\\//g, '~1')).join('/')\n\nexport const decycle = () => {\n  const paths = new WeakMap()\n\n  return function replacer(this: any, key: string | symbol, value: any) {\n    if (key !== '$ref' && isObject(value)) {\n      const seen = paths.has(value)\n\n      if (seen) {\n        return { $ref: toPointer(paths.get(value)) }\n      } else {\n        paths.set(value, [...paths.get(this) ?? [], key])\n      }\n    }\n\n    return value\n  }\n}\n\nexport function retrocycle() {\n  const parents = new WeakMap()\n  const keys = new WeakMap()\n  const refs = new Set()\n\n  function dereference(this: { [k: string]: any }, ref: { $ref: string }) {\n    const parts = ref.$ref.slice(1).split('/')\n    let key, parent, value = this\n\n    for (var i = 0; i < parts.length; i++) {\n      key = parts[i].replace(/~1/g, '/').replace(/~0/g, '~')\n      value = value[key]\n    }\n\n    parent = parents.get(ref)\n    parent[keys.get(ref)] = value\n  }\n\n  return function reviver(this: object, key: string | symbol, value: any) {\n    if (key === '$ref') {\n      refs.add(this)\n    } else\n      if (isObject(value)) {\n        var isRoot = key === '' && Object.keys(this).length === 1\n        if (isRoot) {\n          refs.forEach(dereference as any, this)\n        } else {\n          parents.set(value, this)\n          keys.set(value, key)\n        }\n      }\n\n    return value\n  }\n}\n\nexport const extend = (JSON: JSON) => {\n  return Object.defineProperties(JSON, {\n    decycle: {\n      value: (object: any, space: string | number): string => JSON.stringify(object, decycle(), space)\n    },\n    retrocycle: {\n      value: (s: string): any => JSON.parse(s, retrocycle())\n    }\n  })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,WAAW,CAAC,UAAgC,OAAO,UAAU,YAC9D,SAAS,QACT,EAAE,iBAAiB,YACnB,EAAE,iBAAiB,SACnB,EAAE,iBAAiB,WACnB,EAAE,iBAAiB,WACnB,EAAE,iBAAiB;AAExB,IAAM,YAAY,CAAC,UAAoB,MAAM,MAAM,IAAI,UAAQ,OAAO,IAAI,EAAE,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI,CAAC,EAAE,KAAK,GAAG;AAEvH,IAAM,UAAU,MAAM;AAC3B,QAAM,QAAQ,oBAAI,QAAQ;AAE1B,SAAO,SAAS,SAAoB,KAAsB,OAAY;AACpE,QAAI,QAAQ,UAAU,SAAS,KAAK,GAAG;AACrC,YAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,UAAI,MAAM;AACR,eAAO,EAAE,MAAM,UAAU,MAAM,IAAI,KAAK,CAAC,EAAE;AAAA,MAC7C,OAAO;AACL,cAAM,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa;AAC3B,QAAM,UAAU,oBAAI,QAAQ;AAC5B,QAAM,OAAO,oBAAI,QAAQ;AACzB,QAAM,OAAO,oBAAI,IAAI;AAErB,WAAS,YAAwC,KAAuB;AACtE,UAAM,QAAQ,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,GAAG;AACzC,QAAI,KAAK,QAAQ,QAAQ;AAEzB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAM,MAAM,CAAC,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AACrD,cAAQ,MAAM,GAAG;AAAA,IACnB;AAEA,aAAS,QAAQ,IAAI,GAAG;AACxB,WAAO,KAAK,IAAI,GAAG,CAAC,IAAI;AAAA,EAC1B;AAEA,SAAO,SAAS,QAAsB,KAAsB,OAAY;AACtE,QAAI,QAAQ,QAAQ;AAClB,WAAK,IAAI,IAAI;AAAA,IACf,WACM,SAAS,KAAK,GAAG;AACnB,UAAI,SAAS,QAAQ,MAAM,OAAO,KAAK,IAAI,EAAE,WAAW;AACxD,UAAI,QAAQ;AACV,aAAK,QAAQ,aAAoB,IAAI;AAAA,MACvC,OAAO;AACL,gBAAQ,IAAI,OAAO,IAAI;AACvB,aAAK,IAAI,OAAO,GAAG;AAAA,MACrB;AAAA,IACF;AAEF,WAAO;AAAA,EACT;AACF;AAEO,IAAM,SAAS,CAAC,SAAe;AACpC,SAAO,OAAO,iBAAiB,MAAM;AAAA,IACnC,SAAS;AAAA,MACP,OAAO,CAAC,QAAa,UAAmC,KAAK,UAAU,QAAQ,QAAQ,GAAG,KAAK;AAAA,IACjG;AAAA,IACA,YAAY;AAAA,MACV,OAAO,CAAC,MAAmB,KAAK,MAAM,GAAG,WAAW,CAAC;AAAA,IACvD;AAAA,EACF,CAAC;AACH;","names":[]}