UNPKG

@dbl0null/slow-json-stringify

Version:

The slow.. well actually fastest JSON stringifier in the galaxy.

3 lines (2 loc) 2.09 kB
const _replaceString=e=>-1!==e.indexOf("string")?'"__par__"':"__par__",_matchStartRe=/^(",|,|")/,_chunkRegex=/"\w+__sjs"/g,_makeChunks=(e,r)=>{const t=e.replace(_chunkRegex,_replaceString).split("__par__"),a=[];let n;const _=t.length;for(let e=0;e<_;++e){var s;const c=t[e],i=`("${null==(s=r[e])?void 0:s.name}":("?))$`,p=(n=e+1)===_||(n=t[n].indexOf("}"))&&(0===n||1===n),l=new RegExp(p?`(,?)${i}`:i),o=c.replace(_matchStartRe,"");a.push({flag:!1,pure:c,prevUndef:o,isUndef:c.replace(l,""),bothUndef:o.replace(l,"")})}return a},__find=path=>{let str="obj";for(let e=0;e<path.length;++e)str+=`?.['${path[e]}']`;return eval(`(obj => ${str})`)};function _arraySerializer(e,r){let t="";const a=r.length-1;for(let n=0;n<a;++n)t+=`${e(r[n])},`;return t+=e(r[a]),`[${t}]`}const _makeArraySerializer=e=>"function"==typeof e?_arraySerializer.bind(void 0,e):JSON.stringify,fnUser=e=>e,attr=(e,r)=>{const t=r||fnUser;return{isSJS:!0,type:e,serializer:"array"===e?_makeArraySerializer(r):t}},_defaultRegex=/[\t\n\r"\\]/g,_escapeCallback=e=>"\\"+e,escape=(e=_defaultRegex)=>r=>r.replace(e,_escapeCallback);function _prepareQueue(e,r,t,a=[]){if(-1!==t.toString().indexOf("__sjs")){const t=__find(a),{serializer:n}=t(e);return void r.push({serializer:n,find:t,name:a[a.length-1]})}const n=Object.keys(t);for(let _=0;_<n.length;++_){const s=n[_];_prepareQueue(e,r,t[s],[...a,s])}}const _makeQueue=(e,r)=>{const t=[];return _prepareQueue(r,t,e),t},_stringifyCallback=(e,r)=>r.isSJS?`${r.type}__sjs`:r,_prepare=e=>{const r=JSON.stringify(e,_stringifyCallback);return{_preparedString:r,_preparedSchema:JSON.parse(r)}},_select=e=>(r,t)=>{const a=e[t];return void 0!==r?a.flag?a.prevUndef+r:a.pure+r:(e[t+1].flag=!0,a.flag?a.bothUndef:a.isUndef)},sjs=e=>{const{_preparedString:r,_preparedSchema:t}=_prepare(e),a=_makeQueue(t,e),n=_makeChunks(r,a),_=_select(n);return e=>{let r="";for(let t=0;t<a.length;++t){const{serializer:n,find:s}=a[t],c=s(e);r+=_(n(c),t)}const{flag:t,pure:s,prevUndef:c}=n[n.length-1];return r+(t?c:s)}};export{attr,escape,sjs}; //# sourceMappingURL=slow-json-stringify.modern.js.map