tarkine
Version:
Tarkine - A lightweight and high-performance template engine for Node.js, designed for speed and simplicity.
3 lines (2 loc) • 13 kB
JavaScript
var Tarkine=(()=>{var d=(r,t)=>()=>{try{return t||r((t={exports:{}}).exports,t),t.exports}catch(e){throw t=0,e}};var P=d((Ie,F)=>{function oe(r,t){return r?Object.assign(Object.create(r),t):t}function ie(r){return{get(t){return r[t]},getAll(){return r},set(t,e){return r[t]=e,e},delete(t){delete r[t]},clear(){for(let t in r)delete r[t]}}}F.exports={buildRootScope:oe,createGlobalsHandle:ie}});var N=d((qe,$)=>{function le(r){let t=new Map;return{get(e){if(!t.has(e))return;let n=t.get(e);return t.delete(e),t.set(e,n),n},set(e,n){t.delete(e),t.set(e,n),r&&t.size>r&&t.delete(t.keys().next().value)}}}$.exports={createCacheStore:le}});var _=d((Ce,q)=>{var se=new Set(["checked","disabled","readonly","required","autofocus","multiple","selected","hidden","open","ismap","defer","async","novalidate","formnovalidate","allowfullscreen","itemscope","reversed","autoplay","controls","loop","muted","default"]),w={TEXT:"text",ESCAPE:"escape",RAW:"raw",BOOL_ATTR:"boolAttr",IF:":if",ELSE:":else",FOR:":for",LAYOUT:":layout",SLOT:":slot",INCLUDE:":include",END_IF:"/if",END_FOR:"/for",END_SLOT:"/slot",END_LAYOUT:"/layout"},ue=[...se].join("|"),I=new RegExp(`(${ue})\\s*=\\s*(["'])\\s*\\{\\{\\s*([\\s\\S]*?)\\s*\\}\\}\\s*\\2|\\{\\{(#|-|\\/if|\\/for|\\/slot|\\/layout|:if|:else|:for|:layout|:slot|:include)?\\s*([\\s\\S]*?)\\s*\\}\\}`,"gi");function pe(r){let t=[],e=0;I.lastIndex=0;for(let l of r.matchAll(I)){let a=r.slice(e,l.index);if(l[1]!==void 0){let s=a.replace(/\s+$/,"");s&&t.push({type:w.TEXT,value:s}),t.push({type:w.BOOL_ATTR,attribute:l[1].toLowerCase(),expression:l[3].trim()})}else{a&&t.push({type:w.TEXT,value:a});let s=l[4]?.trim()??null,u=l[5].trim();switch(s){case null:t.push({type:w.ESCAPE,expression:u});break;case"-":t.push({type:w.RAW,expression:u});break;case"#":break;default:t.push({type:s,expression:u});break}}e=l.index+l[0].length}let n=r.slice(e);return n&&t.push({type:w.TEXT,value:n}),t}q.exports={lexTemplate:pe,TEMPLATE_OP:w}});var R=d((je,j)=>{var C={true:!0,false:!1,null:null,undefined:void 0},ce=["===","!==",">=","<=","==","!=","&&","||","**","++","--"],fe={n:`
`,t:" ",r:"\r",b:"\b",f:"\f",v:"\v",0:"\0"};function O(r,t){let e=new SyntaxError(t==null?r:`${r} (at index ${t})`);return e.position=t,e}function ye(r){let t=[],e=0;for(;e<r.length;){let n=e;if(/\s/.test(r[e])){e++;continue}if(r[e]==='"'||r[e]==="'"){let a=r[e++],i="";for(;e<r.length&&r[e]!==a;){if(r[e]==="\\"){e++;let s=r[e];i+=fe[s]??s}else i+=r[e];e++}if(e>=r.length)throw O("Unterminated string literal",n);e++,t.push({type:"str",value:i,position:n});continue}if(r[e]==="`"){e++,t.push({type:"tplStart",position:n});let a="";for(;e<r.length&&r[e]!=="`";)if(r[e]==="$"&&r[e+1]==="{"){a&&(t.push({type:"str",value:a,position:e}),a="");let i=e;e+=2,t.push({type:"tplExpr",position:i});let s=1,u="",h=null;for(;e<r.length&&s>0;){let f=r[e];if(h){u+=f,f==="\\"&&e+1<r.length?(e++,u+=r[e]):f===h&&(h=null),e++;continue}if(f==='"'||f==="'"||f==="`"){h=f,u+=f,e++;continue}if(f==="{")s++;else if(f==="}"&&--s===0){e++;break}u+=f,e++}if(s>0)throw O("Unterminated template expression",i);t.push({type:"tplExprEnd",expr:u,position:e})}else a+=r[e++];if(e>=r.length)throw O("Unterminated template literal",n);a&&t.push({type:"str",value:a,position:e}),e++,t.push({type:"tplEnd",position:e});continue}if(/[0-9]/.test(r[e])||r[e]==="."&&/[0-9]/.test(r[e+1])){let a="";for(;e<r.length&&/[0-9._]/.test(r[e]);)a+=r[e++];if((a.match(/\./g)??[]).length>1)throw O(`Invalid number literal "${a}"`,n);t.push({type:"num",value:Number(a.replace(/_/g,"")),position:n});continue}let l=!1;for(let a of ce)if(r.slice(e,e+a.length)===a){t.push({type:"op",value:a,position:n}),e+=a.length,l=!0;break}if(!l){if("+-*/%<>!?:.,[](){}=".includes(r[e])){t.push({type:"op",value:r[e++],position:n});continue}if(/[a-zA-Z_$]/.test(r[e])){let a="";for(;e<r.length&&/[a-zA-Z0-9_$]/.test(r[e]);)a+=r[e++];a in C?t.push({type:"lit",value:C[a],position:n}):a==="typeof"||a==="in"?t.push({type:"op",value:a,position:n}):t.push({type:"id",value:a,position:n});continue}throw O(`Unexpected character "${r[e]}"`,n)}}return t}j.exports={lexExpression:ye,syntaxError:O}});var B=d((De,D)=>{var{syntaxError:m}=R();function he(r){let t=0;function e(){return r[t]}function n(o){let p=r[t];if(p?.value!==o)throw m(`Expected "${o}"${p?` but got "${p.value??p.type}"`:""}`,p?.position);return t++,p}function l(){let o=r[t++];if(!o)throw m("Unexpected end of expression");if(o.type==="tplStart"){let p=[];for(;e()&&e().type!=="tplEnd";){let T=r[t++];if(T.type==="str"){p.push(T);continue}if(T.type==="tplExpr"){let L=r[t++];if(!L||L.type!=="tplExprEnd")throw m("Expected template expression",L?.position);p.push({type:"templateExpr",expr:L.expr});continue}throw m(`Unexpected token "${T.type}" in template literal`,T.position)}if(e()?.type!=="tplEnd")throw m("Expected template literal end");return t++,{type:"template",parts:p}}if(o.type==="num"||o.type==="str"||o.type==="lit")return o;if(o.type==="id")return{type:"id",value:o.value};if(o.value==="("){let p=y();return n(")"),p}throw m(`Unexpected token "${o.value??o.type}"`,o.position)}function a(){let o=l();for(;;){if(e()?.value==="."){t++;let p=r[t];if(p?.type!=="id")throw m('Expected property name after "."',p?.position);t++,o={type:"member",object:o,property:p.value,computed:!1};continue}if(e()?.value==="["){t++;let p=y();n("]"),o={type:"member",object:o,property:p,computed:!0};continue}if(e()?.value==="("){t++;let p=[];if(e()?.value!==")")for(p.push(y());e()?.value===",";)t++,p.push(y());n(")"),o={type:"call",callee:o,args:p};continue}break}return o}function i(){return e()?.value==="!"||e()?.value==="-"||e()?.value==="typeof"?{type:"unary",operator:r[t++].value,expr:i()}:a()}function s(){let o=i();return e()?.value==="**"?(t++,{type:"binary",operator:"**",left:o,right:s()}):o}function u(){let o=s();for(;e()?.value==="*"||e()?.value==="/"||e()?.value==="%";)o={type:"binary",operator:r[t++].value,left:o,right:s()};return o}function h(){let o=u();for(;e()?.value==="+"||e()?.value==="-";)o={type:"binary",operator:r[t++].value,left:o,right:u()};return o}function f(){let o=h();for(;e()?.value==="<"||e()?.value==="<="||e()?.value===">"||e()?.value===">="||e()?.value==="in";)o={type:"binary",operator:r[t++].value,left:o,right:h()};return o}function A(){let o=f();for(;e()?.value==="=="||e()?.value==="!="||e()?.value==="==="||e()?.value==="!==";)o={type:"binary",operator:r[t++].value,left:o,right:f()};return o}function S(){let o=A();for(;e()?.value==="&&";)t++,o={type:"binary",operator:"&&",left:o,right:A()};return o}function k(){let o=S();for(;e()?.value==="||";)t++,o={type:"binary",operator:"||",left:o,right:S()};return o}function y(){let o=k();if(e()?.value!=="?")return o;t++;let p=y();n(":");let T=y();return{type:"ternary",test:o,yes:p,no:T}}let E=y();if(t<r.length){let o=r[t];throw m(`Unexpected token "${o.value??o.type}" after expression`,o.position)}return E}D.exports={parseExpression:he}});var H=d((Be,M)=>{var{parseExpression:de}=B(),{lexExpression:be}=R();function b(r){switch(r?.type){case"id":{let t=r.value;return e=>e[t]}case"member":{let t=b(r.object);if(r.computed){let n=b(r.property);return l=>t(l)?.[n(l)]}let e=r.property;return n=>t(n)?.[e]}case"call":{let t=r.args.map(b);if(r.callee.type==="member"){let n=b(r.callee.object),l=r.callee.computed,a=l?b(r.callee.property):r.callee.property;return i=>{let s=n(i),u=l?a(i):a,h=s?.[u];if(typeof h=="function")return h.apply(s,t.map(f=>f(i)))}}let e=b(r.callee);return n=>{let l=e(n);if(typeof l=="function")return l(...t.map(a=>a(n)))}}case"str":case"num":case"lit":{let t=r.value;return()=>t}case"unary":{let t=b(r.expr);switch(r.operator){case"!":return e=>!t(e);case"-":return e=>-t(e);case"typeof":return e=>typeof t(e)}return()=>{}}case"binary":{let t=b(r.left),e=b(r.right);switch(r.operator){case"===":return n=>t(n)===e(n);case"!==":return n=>t(n)!==e(n);case"==":return n=>t(n)==e(n);case"!=":return n=>t(n)!=e(n);case">":return n=>t(n)>e(n);case">=":return n=>t(n)>=e(n);case"<":return n=>t(n)<e(n);case"<=":return n=>t(n)<=e(n);case"&&":return n=>t(n)&&e(n);case"||":return n=>t(n)||e(n);case"+":return n=>t(n)+e(n);case"-":return n=>t(n)-e(n);case"*":return n=>t(n)*e(n);case"/":return n=>t(n)/e(n);case"%":return n=>t(n)%e(n);case"**":return n=>t(n)**e(n);case"in":return n=>t(n)in Object(e(n))}return()=>{}}case"template":{let t=r.parts.map(e=>e.type==="str"?()=>e.value:e.type==="templateExpr"?Y(e.expr):()=>"");return e=>t.map(n=>String(n(e)??"")).join("")}case"ternary":{let t=b(r.test),e=b(r.yes),n=b(r.no);return l=>t(l)?e(l):n(l)}default:return()=>{}}}function Y(r){let t=de(be(r));return b(t)}M.exports={createEvaluator:Y}});var W=d((Ye,X)=>{var{TEMPLATE_OP:c}=_(),{createEvaluator:g}=H(),Ee=/^\s*([A-Za-z_$][\w$]*)(?:\s*,\s*([A-Za-z_$][\w$]*))?\s+in\s+([\s\S]+)$/,ve=/^if\s+([\s\S]+)$/;function me(r){let t=[],e=[{type:"root",body:t}];function n(){return e[e.length-1].body}for(let l of r)switch(l.type){case c.TEXT:{n().push(l);break}case c.RAW:case c.ESCAPE:{n().push({type:l.type,evaluate:g(l.expression)});break}case c.BOOL_ATTR:{n().push({type:l.type,attribute:l.attribute,evaluate:g(l.expression)});break}case c.IF:{let a={type:c.IF,branches:[{evaluate:g(l.expression),body:[]}]};n().push(a),e.push({type:c.IF,node:a,body:a.branches[0].body});break}case c.ELSE:{let a=e[e.length-1];if(a.type!==c.IF)throw new Error("Unexpected {{:else}} or {{:else if}}");let i=l.expression.match(ve),s={evaluate:i?g(i[1].trim()):null,body:[]};a.node.branches.push(s),a.body=s.body;break}case c.END_IF:{let a=e.pop();if(!a||a.type!==c.IF)throw new Error("Unexpected {{/if}}");break}case c.FOR:{let a=l.expression.match(Ee);if(!a)throw new Error(`Invalid for expression: ${l.expression}`);let[,i,s,u]=a,h={type:c.FOR,value:i,key:s||null,evaluate:g(u.trim()),body:[]};n().push(h),e.push({type:c.FOR,body:h.body});break}case c.END_FOR:{let a=e.pop();if(!a||a.type!==c.FOR)throw new Error("Unexpected {{/for}}");break}case c.INCLUDE:{n().push({type:c.INCLUDE,evaluate:g(l.expression)});break}case c.LAYOUT:{let a={type:c.LAYOUT,evaluate:g(l.expression),slots:{}};n().push(a),e.push({type:c.LAYOUT,node:a,body:[]});break}case c.END_LAYOUT:{let a=e.pop();if(!a||a.type!==c.LAYOUT)throw new Error("Unexpected {{/layout}}");break}case c.SLOT:{let a={type:c.SLOT,name:l.expression,body:[]},i=e[e.length-1];i.type===c.LAYOUT?i.node.slots[a.name]=a.body:n().push(a),e.push({type:c.SLOT,body:a.body});break}case c.END_SLOT:{let a=e.pop();if(!a||a.type!==c.SLOT)throw new Error("Unexpected {{/slot}}");break}default:throw new Error(`Unknown template token: ${l.type}`)}if(e.length!==1)throw new Error("Unclosed template block");return t}X.exports={parseTemplate:me}});var U=d((Me,z)=>{var{lexTemplate:xe,TEMPLATE_OP:Te}=_(),{parseTemplate:we}=W();function ge(r){return we(xe(r))}z.exports={compile:ge,TEMPLATE_OP:Te}});var K=d((He,G)=>{var Z={"&":"&","<":"<",">":">",'"':""","'":"'"};function Oe(r){return r==null||r===!1?"":typeof r=="object"?JSON.stringify(r).replace(/[&<>"']/g,t=>Z[t]):String(r).replace(/[&<>"']/g,t=>Z[t])}G.exports={escapeHtml:Oe}});var Q=d((Xe,J)=>{J.exports={isFunction:r=>typeof r=="function"}});var ee=d((We,V)=>{var{TEMPLATE_OP:v}=U();function x(r,t,e,n){for(let l=0;l<r.length;l++){let a=r[l];switch(a.type){case v.TEXT:n.push(a.value);break;case v.ESCAPE:{let i=a.evaluate(t);i!=null&&n.push(e.escape(i));break}case v.RAW:{let i=a.evaluate(t);i!=null&&n.push(String(i));break}case v.BOOL_ATTR:{a.evaluate(t)&&n.push(` ${a.attribute}`);break}case v.IF:{for(let i of a.branches)if(i.evaluate(t)){x(i.body,t,e,n);break}break}case v.FOR:{let i=a.evaluate(t)||[];if(Array.isArray(i))for(let s=0;s<i.length;s++){let u=Object.create(t);u[a.value]=i[s],a.key&&(u[a.key]=s),x(a.body,u,e,n)}else for(let s in i){let u=Object.create(t);u[a.value]=i[s],a.key&&(u[a.key]=s),x(a.body,u,e,n)}break}case v.INCLUDE:{let i=a.evaluate(t),{output:s,filePath:u}=e.include(e.parentFilePath,i,e);x(s,t,{...e,parentFilePath:u},n);break}case v.LAYOUT:{let i=a.evaluate(t),{output:s,filePath:u}=e.include(e.parentFilePath,i,e);x(s,t,{...e,parentFilePath:u,slots:a.slots},n);break}case v.SLOT:{let i=a.name;e.slots&&e.slots[i]?x(e.slots[i],t,e,n):x(a.body,t,e,n);break}}}}function Ae(r,t,e={}){let n=[];return x(r,t,e,n),n.join("")}V.exports={renderer:Ae}});var ne=d((ze,re)=>{var{buildRootScope:Se,createGlobalsHandle:ke}=P(),{createCacheStore:Le}=N(),{compile:te}=U(),{escapeHtml:_e}=K(),{isFunction:Re}=Q(),{renderer:Ue}=ee();function Fe({cache:r,include:t,globals:e,escape:n,maxCacheSize:l,ext:a}={}){let i=r===!1?null:r??Le(l),u=ke(e??{}),h=Re(n)?n:_e,f=a??"tark";function A(y){if(!i)return te(y);let E=i.get(y);return E||(E=te(y),i.set(y,E)),E}function S(y,E,o={}){return k(A(y),E,o)}function k(y,E,o={}){let p=Se(e,E);return Ue(y,p,{parentFilePath:null,escape:h,cache:i,include:t,ext:f,...o})}return{cache:i,globals:u,compile:A,renderCompiled:k,render:S,escape:n,include:t,ext:f}}re.exports={createEngine:Fe}});var $e=d((Ze,ae)=>{var{createEngine:Pe}=ne();ae.exports={createEngine:Pe}});return $e();})();