json-decycle
Version:
Stringify and parse cycled reference json
1 lines • 3.76 kB
Source Map (JSON)
{"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":[]}