jsurl2
Version:
URL friendly JSON-like formatting and parsing
4 lines (3 loc) • 3.16 kB
JavaScript
((f,a)=>{typeof exports=="object"&&typeof module<"u"?a(exports):typeof define=="function"&&define.amd?define(["exports"],a):a((f=typeof globalThis<"u"?globalThis:f||self).JSURL={})})(this,f=>{"use strict";const a=/^[a-zA-Z]/,D=/^[\d-]/,_="_N",S={T:!0,F:!1,N:null,U:void 0,n:NaN,I:1/0,J:-1/0},O={"*":"*",_:"_","-":"~",S:"$",P:"+",'"':"'",C:"(",D:")",L:"<",G:">",".":"%",Q:"?",H:"#",A:"&",E:"=",B:"\\",N:`
`,R:"\r",U:"\u2028",V:"\u2029",Z:"\0"},m={"*":"*",_:"_","~":"-",$:"S","+":"P","'":'"',"(":"C",")":"D","<":"L",">":"G","%":".","?":"Q","#":"H","&":"A","=":"E","\\":"B","\n":"N","\r":"R","\0":"Z","\u2028":"U","\u2029":"V"},h=(t,r)=>{throw Error(`${t} ${JSON.stringify(r)}`)},T=t=>{if(t==="_")return" ";const r=O[t.charAt(1)];return r||h("Illegal escape code",t),r},C=t=>t===" "?"_":"*"+m[t],A=/(_|\*.)/g,d=t=>A.test(t)?t.replace(A,T):t,$=/([*_~$+'() <>%?#&=\\\n\r\0\u2028\u2029])/g,I=t=>$.test(t)?t.replace($,C):t,p=t=>{let r,l;for(r=t.t;r<t.o&&(l=t.l.charAt(r),l!=="~"&&l!==")");r++);const s=t.l.slice(t.t,r);return l==="~"&&r++,t.t=r,s},y=t=>t.l.charAt(t.t),c=t=>{t.t++},J={},N=t=>{let r,l,s=y(t);if(!s)return J;if(s==="("){let e;for(c(t),r={};s=y(t),s&&s!==")";)l=d(p(t)),s=y(t),e=!s||s===")"||N(t),r[l]=e;s===")"&&c(t)}else if(s==="!"){for(c(t),r=[];s=y(t),s&&s!=="~"&&s!==")";)r.push(N(t));s==="~"&&c(t)}else s==="_"?(c(t),l=d(p(t)),l.charAt(0)==="D"?r=new Date(l.slice(1)):l in S?r=S[l]:h("Unknown dict reference",l)):s==="*"?(c(t),r=d(p(t))):s==="~"?(c(t),r=!0):D.test(s)?(r=+p(t),isNaN(r)&&h("Not a number",s)):a.test(s)?r=d(p(t)):h("Cannot decode part ",t.l.slice(t.t,t.t+10));return r},g=(t,r,l,s)=>{let e,i=typeof t;if(i==="number")r.push(isFinite(t)?t.toString():l?isNaN(t)?"_n":t>0?"_I":"_J":_);else if(i==="boolean")r.push(t?"":"_F");else if(i==="string")e=I(t),a.test(e)?r.push(e):r.push("*"+e);else if(i==="object")if(t)if(l&&t instanceof Date)r.push("_D"+t.toJSON().replace("T00:00:00.000Z",""));else if(typeof t.toJSON=="function")g(t.toJSON(),r,l,s);else if(Array.isArray(t)){r.push("!");for(let n=0;n<t.length;n++)e=t[n],e===!0?r.push("_T"):g(e,r,l,s+1);r.push("")}else{r.push("(");for(const n of Object.keys(t))e=t[n],e!==void 0&&typeof e!="function"&&(r.push(I(n)),g(e,r,l,s+1));for(;r[r.length-1]==="";)r.pop();r.push(")")}else r.push(_);else r.push(l||s===0?"_U":_)},R={true:"*true",false:"*false",null:"*null"},j=/^({|\[|"|true$|false$|null$)/,U=(t,r)=>{if(r&&r.deURI&&(t=(e=>{let i,n="",o=0,u=0;for(;o<e.length;)i=e.charCodeAt(o),i===37?(o>u&&(n+=e.slice(u,o)),e=decodeURIComponent(e.slice(o)),o=u=0):i===32||i===10||i===13||i===0||i===8232||i===8233?(o>u&&(n+=e.slice(u,o)),o++,u=o):o++;return o>u&&(n+=e.slice(u,o)),n})(t)),j.test(t))return JSON.parse(t);const l=t.length,s=N({l:t,t:0,o:l});return s===J||s};f.parse=U,f.stringify=(t,r)=>{let l,s=[],e="",i=!1,n=r?.short,o=r?.rich;g(t,s,o,0);let u=s.length;do l=s[--u];while(l===""||n&&l===")");for(let b=0;u>=b;b++)l=s[b],i&&l!==")"&&(e+="~"),e+=l,i=!(l==="!"||l==="("||l===")");return n?6>e.length&&(l=R[e],l&&(e=l)):e+="~",e},f.tryParse=(t,r,l)=>{try{return U(t,l)}catch{return r}},Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
//# sourceMappingURL=index.js.map