json-canonicalize
Version:
JSON canonicalize function
3 lines (2 loc) • 1.55 kB
JavaScript
function r(r,e){let t="";const i=new WeakMap;return n(r),t;function n(r){if(null===r||"object"!=typeof r||null!=r.toJSON)t+=JSON.stringify(r);else if(Array.isArray(r)){if(i.has(r)){if(!e)throw new Error("Circular reference detected");return void(t+='"[Circular]"')}i.set(r,!0),t+="[";let o=!1;r.forEach((r=>{o&&(t+=","),o=!0,void 0===r&&(r=null),n(r)})),t+="]"}else{if(i.has(r)){if(!e)throw new Error("Circular reference detected");return void(t+='"[Circular]"')}i.set(r,!0),t+="{";Object.keys(r).filter((e=>void 0!==r[e])).sort().forEach(((e,i)=>function(r,e,i){i>0&&(t+=",");t+=JSON.stringify(e),t+=":",n(r[e])}(r,e,i))),t+="}"}}}function e(r,e){let t="";const i=e&&e.include;let n=e&&e.exclude;n&&"string"==typeof n&&(n=[n]),i&&i.sort();const o=new WeakMap,f=e&&(null==e?void 0:e.allowCircular);return c(r),t;function c(r,e){if(null===r||"object"!=typeof r||null!=r.toJSON)t+=JSON.stringify(r);else if(Array.isArray(r)){if(o.has(r)){if(!f)throw new Error("Circular reference detected");return void(t+='"[Circular]"')}o.set(r,!0),t+="[";let e=!1;r.forEach((i=>{e&&(t+=","),e=!0,c(i,r)})),t+="]"}else{if(o.has(r)){if(!f)throw new Error("Circular reference detected");return void(t+='"[Circular]"')}if(o.set(r,!0),t+="{",!e&&i)i.forEach(((e,t)=>{r.hasOwnProperty(e)&&l(r,e,t)}));else{Object.keys(r).sort().forEach(((e,t)=>l(r,e,t)))}t+="}"}}function l(r,e,i){if(n&&n.length)for(const r of n)if(r===e)return;i>0&&(t+=","),t+=JSON.stringify(e),t+=":",c(r[e],r)}}export{r as canonicalize,e as canonicalizeEx};
//# sourceMappingURL=index.esm.min.js.map