stnl
Version:
A simple, opinionated schema library built for performance
1 lines • 2.37 kB
JavaScript
let injectDep;export let _compileLimits=(e,r,i)=>{let a=``;while(i<e.length){a+=`&&`;let o=e[i++];let s=o[0];if(s===1)a+=r+`.length<`+(o[1]+1);else if(s===2)a+=r+`.length>`+(o[1]-1);else if(s===3)a+=r+`.startsWith(`+JSON.stringify(o[1])+`)`;else if(s===4)a+=r+`<=`+o[1];else if(s===5)a+=r+`>=`+o[1];else if(s===6)a+=r+`<`+o[1];else if(s===7)a+=r+`>`+o[1];else throw new Error(`Unknown limit type: `+s)}return a};export let _compileObject=(e,r)=>{let i=``;let a=e[1];for(const e in a)i+=`&&`+_compile(a[e],r+`.`+e);let s=e[2];if(s!=null)for(const e in s){let a=r+`.`+e;i+=`&&(typeof `+a+`==="undefined"||`+_compile(s[e],a)+`)`}return i};export let _compileToFn=e=>`o=>`+_compile(e,`o`);export let _compile=(s,c)=>{let l=s[0];if(l===0)return`typeof `+c+`!=="undefined"`+_compileLimits(s,c,1);else if(l===1)return`Number.isFinite(`+c+`)`+_compileLimits(s,c,1);else if(l===2)return`Number.isInteger(`+c+`)`+_compileLimits(s,c,1);else if(l===3)return`typeof `+c+`==="boolean"`;else if(l===4)return`typeof `+c+`==="string"`+_compileLimits(s,c,1);else if(l===5)return c+`===null&&`+_compile(s[1],c,scopeDeps);else if(l===6){let e=s[1];c+=`===`;let r=c+JSON.stringify(e[0]);c=`&&`+c;for(let i=1;i<e.length;i++)r+=c+JSON.stringify(e[i]);return r}else if(l===7)return`Array.isArray(`+c+`)&&`+c+`.every(`+injectDep(_compileToFn(s[1]))+`)`+_compileLimits(s,c,2);else if(l===8)return`typeof `+c+`==="object"&&`+c+`!==null`+_compileObject(s,c);else if(l===9){let e=s[1];let r=`Array.isArray(`+c+`)&&`+c+`.length===`+e.length;for(let i=0;i<e.length;i++)r+=`&&`+_compile(s,c+`[`+i+`]`);return r}else if(l===10){let e=c+`.`+s[1]+`===`;let r=s[2];let a=`typeof `+c+`==="object"&&`+c+`!==null&&(`;for(const o in r)a+=e+JSON.stringify(o)+`?true`+_compileObject(r[o],c)+`:`;return a+`false)`}else if(l===11)return`d`+s[1]+`(`+c+`)`;else if(l===12){let r=`(()=>{var d=`+_compileToFn(s[1]);let i=s[2];if(i!=null)for(const e in i)r+=`,d`+e+`=`+_compileToFn(i[e]);return injectDep(r+`;return d})()`)+`(`+c+`)`}else if(l===13)return _compile(s[1],c);throw new Error(`Unknown schema base type: `+l)};export let code=(r,i,a)=>(injectDep=a,_compile(r,i));let _globalVars=`var l`,varCnt=0;let _defaultInjectDep=e=>(_globalVars+=`,l`+varCnt+`=`+e,`l`+ varCnt++);export let compile=e=>{let r=code(e,`o`,_defaultInjectDep);r=_globalVars+`;return o=>`+r;_globalVars=`var l`;varCnt=0;return Function(r)()};