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