stnl
Version:
A simple, opinionated type validator built for performance
1 lines • 2.47 kB
JavaScript
import{optimizeDirectCall}from"../utils.js";export let compileLimits=(e,t,n)=>{let r=``;while(t<e.length){let i=e[t++];let a=i[0];r+=`&&`+(a===0?n+`>=`+i[1]:a===1?n+`<=`+i[1]:a===2?n+`.length>`+(i[1]-1):a===3?n+`.length<`+(i[1]+1):a===4?n+`.length===`+i[1]:`true`)}return r};export let compileToFn=(e,t)=>`o=>`+compile(e,`o`,t,false);export let compile=(i,a,o,s)=>{let c=i[0];let l=``;let u=(c&1)===1;if(u){c-=1;l=`(`+a+(s?`==null||`:`===null||`)}else if(s)l+=`(`+a+`===void 0||`;let d=u||s;if(c===0)l+=`Number.isInteger(`+a+`)`+compileLimits(i,1,a);else if(c===2)l+=`typeof `+a+`==="number"`+compileLimits(i,1,a);else if(c===4)l+=`typeof `+a+`==="string"`+compileLimits(i,1,a);else if(c===6)l+=`typeof `+a+`==="boolean"`;else if(c===8)l+=a+`!==void 0`;else if(c===10){let e=i[1];if(!d)l+=`(`;l+=a+`===`+JSON.stringify(e[0]);for(let t=1;t<e.length;t++)l+=`||`+a+`===`+JSON.stringify(e[t]);if(!d)l+=`)`}else if(c===12)l+=a+`===`+(typeof i[1]===`string`?JSON.stringify(i[1]):i[1]);else if(c===14)l+=`Array.isArray(`+a+`)`+compileLimits(i,2,a)+`&&`+a+`.every(d`+o.push(optimizeDirectCall(compileToFn(i[1],o)))+`)`;else if(c===16){l+=(u?``:a+`!==null&&`)+`typeof `+a+`==="object"`;a+=`.`;if(i[1]!=null){let e=i[1];for(const t in e)l+=`&&`+compile(e[t],a+t,o,false)}if(i[2]!=null){let e=i[2];for(const t in e)l+=`&&`+compile(e[t],a+t,o,true)}}else if(c===18){let e=i[1];l+=`Array.isArray(`+a+`)&&`+a+`.length===`+e.length;for(let t=0;t<e.length;t++)l+=`&&`+compile(e[t],a+`[`+t+`]`,o,false)}else if(c===20){l+=(u?``:a+`!==null&&`)+`typeof `+a+`==="object"&&(`;a+=`.`;let e=a+i[1];for(const t in i[2]){let n=i[2][t];l+=e+`===`+JSON.stringify(t)+`?`;let s=true;if(n[1]!=null){let e=n[1];for(const t in e){if(s){s=false;l+=`&&`}l+=compile(e[t],a+t,o,false)}}if(n[2]!=null){let e=n[2];for(const t in e){if(s){s=false;l+=`&&`}l+=compile(e[t],a+t,o,true)}}l+=`:`}l+=`false)`}else if(c===22)l+=`d`+i[1]+`(`+a+`)`;else if(c===24){let t=`(()=>{var `;let r=[];if(i[2]!=null){let e=i[2];for(const i in e)t+=`d`+i+`=`+compileToFn(e[i],r)+`,`}let s=optimizeDirectCall(compileToFn(i[1],r));for(let e=0;e<r.length;e++)t+=`d`+(e+1)+`=`+r[e]+`,`;l+=`d`+o.push(t+`d=`+s+`;return d})()`)+`(`+a+`)`}return d?l+`)`:l};export let dependencies=e=>{let t=``;if(e.length>0){for(let n=0;n<e.length;n++)t+=(n===0?`var d`:`,d`)+(n+1)+`=`+e[n]}return t};export let code=t=>{let r=[];let a=optimizeDirectCall(compileToFn(t,r));return dependencies(r)+`;return `+a};export default e=>Function(code(e))();