mutorjs 1.5.4 → 1.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.js CHANGED
@@ -8,9 +8,9 @@ Access to this computed property '${e}' is forbidden.`);return e}var v="object",
8
8
  `).length,s=e.lastIndexOf(`
9
9
  `,t-1)+1;return[n,s]}function L(e,t){let r=e.indexOf(`
10
10
  `,t);return e.slice(t,r===-1?void 0:r).replaceAll(" "," ")}function Ye(e,t){if(e.forbiddenProps.has(t.value)&&!e.allowedProps.has(t.value))throw{message:`Property "${t.value}" is forbidden.`,pos:t.pos};return e.scope.includes(t.value)?t.value:`ctx.${t.value}`}function Ge(e){if(e.left.type!==7)throw{message:"Invalid usage of namespace operator.",pos:e.pos};let t=e.left.value,r=e.right.value;return`namespaces.${t}.${r}`}function qe(e,t){let r=w(e,t.left),n=t.optional?"?.":"";if(t.bracketNotation){let o=w(e,t.right);if(t.right.type===4&&e.forbiddenProps.has(o.replaceAll(/^`|`$/gm,"")))throw{message:"Forbidden property access.",pos:t.right.pos};return t.right.type===4||t.right.type===5?`${r}${n}[${o}]`:`${r}${n}[validateComputedProps(${o}, allowedProps, forbiddenProps)]`}let s=t.right.value;if(e.forbiddenProps.has(s)&&!e.allowedProps.has(s))throw{message:"Forbidden property access.",pos:t.right.pos};return`${r}${n}.${s}`}function Ke(e,t){let r=w(e,t.expr),n=t.optional?"?.":"",s=t.args.map(o=>w(e,o)).join(", ");return`${r}${n}(${s})`}function Je(e,t){let{iterable:r,loopType:n,variable:s}=t,o=n===1?"in":"of";return`for(const ${s} ${o} ${F(r,e.context)}){`}function Ve(e,t){let{condition:r}=t;return`if(${F(r,e.context)}){`}function Xe(e,t){let{condition:r}=t;return`}else if(${F(r,e.context)}){`}function w(e,t){let{type:r}=t;if(r===5)return t.value;if(r===12)return"null";if(r===11)return"undefined";if(r===10)return t.true?"true":"false";switch(r){case 17:return"}";case 4:return`\`${/\$\\/.test(t.value)?T(t.value):t.value}\``;case 7:return Ye(e,t);case 9:return`(${w(e,t.expr)})`;case 2:{let{operator:n,expr:s}=t;return`${n}${w(e,s)}`}case 0:{let{left:n,operator:s,right:o}=t;return`${w(e,n)} ${s} ${w(e,o)}`}case 1:{let{condition:n,left:s,right:o}=t;return`${w(e,n)} ? ${w(e,s)} : ${w(e,o)}`}case 8:return qe(e,t);case 3:return Ke(e,t);case 6:return Ge(t);case 13:return Je(e,t);case 16:return"} else {";case 14:return Ve(e,t);case 15:return Xe(e,t);default:throw new a(`Unsupported expression type '${r}'`)}}function F(e,t){let r={scope:t.scope,forbiddenProps:t.forbiddenProps,allowedProps:t.allowedProps,context:t},n=w(r,e);return n.includes("namespaces.Mutor.await")?n.replaceAll("namespaces.Mutor.await","await namespaces.Mutor.await"):n}function U(e){switch(e){case 0:return"identifier";case 1:return"keyword";case 2:return"number";case 4:return"operator";case 3:return"string"}}function E(e,t,r){let n=e.tokens[e.cursor],s=e.tokens[e.tokens.length-1];if(!n)throw{message:`Unexpected end of expression. Expected ${r?`'${r}'`:`${t===0?"an":"a"} ${U(t)}`}.`,pos:s.pos+s.value.length-1};if(n.type!==t)throw{message:`Unexpected token type. Expected ${r?`'${r}'`:U(t)} but got ${U(n.type)} instead.`,pos:n.pos};if(r!==void 0&&n.value!==r)throw{message:`Unexpected token '${n.value}'. Expected ${t===0?"an":"a"} ${U(t)} instead.`,pos:n.pos};return e.tokens[e.cursor++]}function Ze(e){let t=e.tokens[e.cursor-1].pos,r=E(e,0).value,n;try{n=E(e,1,"in")}catch{n=E(e,1,"of")}let s=n.value==="in"?1:0,o=b(e);return{type:13,loopType:s,iterable:o,variable:r,pos:t}}function Te(e){let t=b(e);return{condition:t,pos:t.pos,type:14}}function He(e){let t=e.tokens[e.cursor-1].pos;try{return E(e,1,"if"),{...Te(e),type:15,pos:t}}catch{return{type:16,pos:t}}}function Ne(e){let t=[];if(e.tokens[e.cursor]?.type===4&&e.tokens[e.cursor]?.value===")")return t;for(t.push(b(e));e.tokens[e.cursor]?.type===4&&e.tokens[e.cursor]?.value===",";)e.cursor++,t.push(b(e));return t}function q(e){let t=e.tokens[e.cursor++];if(!t)throw{message:"Unexpected end of expression.",pos:e.tokens[e.tokens.length-1].pos};if(t.type===2)return{type:5,value:t.value,pos:t.pos};if(t.type===3)return{type:4,value:t.value,pos:t.pos};if(t.type===1){if(t.value==="for"&&e.cursor===1)return Ze(e);if(t.value==="true")return{type:10,true:!0,pos:t.pos};if(t.value==="false")return{type:10,true:!1,pos:t.pos};if(t.value==="undefined")return{type:11,pos:t.pos};if(t.value==="null")return{type:12,pos:t.pos};if(t.value==="end"&&e.tokens.length===1)return{type:17,pos:t.pos};if(t.value==="if"&&e.cursor===1)return Te(e);if(t.value==="else"&&e.cursor===1)return He(e)}if(t.type===0)return{type:7,value:t.value,pos:t.pos};if(t.type===4&&t.value==="("){let r=b(e);return E(e,4,")"),{type:9,expr:r,pos:t.pos}}if(t.type===4&&ge.has(t.value)){let r=Ie(e);return{type:2,operator:t.value,expr:r,pos:t.pos}}throw{message:`Unexpected token '${t.value}'.`,pos:t.pos}}function Ie(e){let t=q(e);for(;e.tokens[e.cursor];){let r=e.tokens[e.cursor];if(r?.type===4&&r?.value==="("){if(e.cursor++,!e.generatingNamespace&&!e.config.allowFnCalls)throw{message:"Function calls are not allowed.",pos:r.pos};let n=Ne(e);E(e,4,")"),t={type:3,expr:t,args:n,pos:e.tokens[e.cursor-1].pos}}else if(r?.type===4&&r?.value==="?."&&e.tokens[e.cursor+1]?.type===4&&e.tokens[e.cursor+1]?.value==="("){if(e.cursor+=2,!e.generatingNamespace&&!e.config.allowFnCalls)throw{message:"Function calls are not allowed.",pos:r.pos};let n=Ne(e);E(e,4,")"),t={type:3,expr:t,args:n,optional:!0,pos:e.tokens[e.cursor-1].pos}}else if(r?.type===4&&he.has(r?.value)){let n=r.value==="::",s=r.value==="[",o=r.value==="?.";if(e.cursor++,n&&(e.tokens[e.cursor-2]?.type!==0||e.tokens[e.cursor]?.type!==0))throw{message:`Invalid namespaces access. Expected syntax <IDENTIFIER>::<IDENTIFIER>, but got '${e.tokens[e.cursor-2]?.value}::${e.tokens[e.cursor]?.value??""}' instead.`,pos:e.tokens[e.cursor]?.pos??e.tokens[e.cursor-1].pos};if(n){e.generatingNamespace=!0;let c=q(e);t={type:6,left:t,right:c,pos:e.tokens[e.cursor-1].pos}}else if(s){let c=b(e);E(e,4,"]"),t={type:8,left:t,right:c,bracketNotation:!0,pos:e.tokens[e.cursor-1].pos}}else if(o)if(e.tokens[e.cursor]?.type===4&&e.tokens[e.cursor]?.value==="["){e.cursor++;let c=b(e);E(e,4,"]"),t={type:8,left:t,right:c,bracketNotation:!0,optional:!0,pos:e.tokens[e.cursor-1].pos}}else{let c=q(e);t={type:8,left:t,right:c,optional:!0,pos:e.tokens[e.cursor-1].pos}}else{let c=q(e);t={type:8,left:t,right:c,pos:e.tokens[e.cursor-1].pos}}}else break}return e.generatingNamespace=!1,t}function x(e,t,r){let n=t(e);for(;e.tokens[e.cursor]?.type===4&&r.has(e.tokens[e.cursor]?.value);){let s=e.tokens[e.cursor++].value,o=t(e);n={type:0,left:n,right:o,operator:s,pos:e.tokens[e.cursor-1].pos}}return n}function Qe(e){return x(e,Ie,be)}function et(e){return x(e,Qe,de)}function tt(e){return x(e,et,me)}function rt(e){return x(e,tt,fe)}function nt(e){return x(e,rt,le)}function Fe(e){return x(e,nt,ue)}function ot(e){return x(e,st,we)}function st(e){return x(e,it,ye)}function it(e){return x(e,Fe,Ee)}function Ae(e){let t=ot(e);for(;e.tokens[e.cursor]?.type===4&&e.tokens[e.cursor]?.value==="&&";){e.cursor++;let r=Fe(e);t={type:0,left:t,right:r,operator:"&&",pos:e.tokens[e.cursor-1].pos}}return t}function ke(e){let t=Ae(e);for(;e.tokens[e.cursor]?.type===4&&e.tokens[e.cursor]?.value==="||";){e.cursor++;let r=Ae(e);t={type:0,left:t,right:r,operator:"||",pos:e.tokens[e.cursor-1].pos}}return t}function at(e){let t=ke(e);for(;e.tokens[e.cursor]?.type===4&&e.tokens[e.cursor]?.value==="??";){e.cursor++;let r=ke(e);t={type:0,left:t,right:r,operator:"??",pos:e.tokens[e.cursor-1].pos}}return t}function b(e){let t=at(e);if(e.tokens[e.cursor]?.type!==4||e.tokens[e.cursor]?.value!=="?")return t;e.cursor++;let r=b(e);E(e,4,":");let n=b(e);return{type:1,condition:t,left:r,right:n,pos:e.tokens[e.cursor-1].pos}}function H(e,t){let r={cursor:0,tokens:e,config:t,generatingNamespace:!1},n=b(r);if(r.cursor!==r.tokens.length)throw{pos:r.tokens[r.cursor].pos,message:`Expected token '${r.tokens[r.cursor].value}'.
11
- Expected an operator or the end of the expression.`};return n}function Q(e,{delimiters:t}){let r=`${t.openingTag}${t.whitespaceTrim}`,n=`${t.whitespaceTrim}${t.closingTag}`,s=e.startsWith(r),o=e.endsWith(n),c=s?r.length:t.openingTag.length,f=o?n.length:t.closingTag.length,p=e.slice(c,e.length-f),u=p.trim(),l=u.startsWith(t.commentTag);return l?{isComment:l,leftTrim:s,rightTrim:o}:{leftTrim:s,rightTrim:o,inner:p,isBlock:u.startsWith("for")||u.startsWith("if")||u.startsWith("else"),isBlockEnd:u==="end",hasContext:u.startsWith("for"),requiresBlockClose:u.startsWith("for")||u.startsWith("if"),usesAwait:p.includes("Mutor::await")}}var ct=/[a-zA-Z$_]/,pt=/[a-zA-Z$_0-9]/,ut=/[0-9]/,lt=/[0-9.oxe]/,ft=/[a-zA-Z$_0-9\s\t\r\n'"`]/;function ee(e){let t=0,r="",n=[];function s(){let p="";if(ct.test(r)){let u=t;for(;pt.test(e[u])&&u<e.length;)p+=e[u],u++;n.push({type:pe.has(p)?1:0,value:p,pos:t}),t=u,r=e[t]}}function o(){if(r!=='"'&&r!=="'"&&r!=="`")return!1;let p=r,u=t,l=t+1,h="";for(;l<e.length;){let y=e[l];if(y==="\\"){if(l+1>=e.length)throw{pos:l,message:"Unexpected end of string after escape character."};h+=y,h+=e[l+1],l+=2;continue}if(y===p)break;h+=y,l++}if(l>=e.length||e[l]!==p)throw{pos:u,message:`String literal missing closing ${p}.`};n.push({type:3,value:h,pos:u}),t=l}function c(){if(ut.test(r)){let p=t,u="";for(;lt.test(e[p])&&p<e.length;)u+=e[p],p++;let l=Number(u);if(Number.isNaN(l))throw{pos:t,message:"Found invalid number literal."};n.push({type:2,value:`${l}`,pos:t}),t=p-1,r=e[t]}}function f(){let p=`${r}${e[t+1]}`;if(C.has(p)){n.push({type:4,value:p,pos:t}),t++;return}if(C.has(r)){n.push({type:4,value:r,pos:t});return}}for(;t<e.length;){if(r=e[t],c(),s(),o(),f(),!ft.test(r)&&!C.has(r)&&!C.has(e[t-1]+r))throw{message:`Unexpected token '${r}' in expression.`,pos:t};t++}return n.length?n:[{type:3,value:"",pos:0}]}function te(e,t,r){let n=[],s=[],{delimiters:o,keepOpeningTagEscapeDelimiter:c,allowFnCalls:f,allowedProps:p,forbiddenProps:u,autoEscape:l}=t,h="sync",y=!1,R=0,O='let acc="";';for(;R<e.length;){let W=function(){let m=d,_=0;for(;m>=o.openingTagEscape.length&&e.slice(m-o.openingTagEscape.length,m)===o.openingTagEscape;)_++,m-=o.openingTagEscape.length;return _%2===1};var yt=W;let d=e.indexOf(o.openingTag,R);if(d===-1){let m=e.slice(R);y&&(m=m.trimStart()),m&&(O+=`acc+=\`${T(m)}\`;`);break}if(W()){let m=e.slice(R,c?d+o.openingTagEscape.length+1:d-o.openingTag.length+1);y&&(m=m.trimStart(),y=!1),O+=`acc+=\`${T(m)}\`;`,c||(O+=`acc+=\`${o.openingTag}\`;`),R=d+o.openingTag.length;continue}let i=e.indexOf(o.closingTag,d);if(i===-1){let[m,_]=B(e,d),S=L(e,_);throw new P("No closing tag found.",m,S,d,r.path)}let K=e.slice(d,i+o.closingTag.length),{inner:Me,leftTrim:ne,rightTrim:ve,isBlock:J,isBlockEnd:oe,hasContext:se,requiresBlockClose:ie,isComment:De,usesAwait:Be}=Q(K,{delimiters:o});Be&&h!=="async"&&(h="async");let N=e.slice(R,d);N&&(y&&(N=N.trimStart()),ne&&(N=N.trimEnd()),N&&(O+=`acc+=\`${T(N)}\`;`)),y=!1,R=i+o.closingTag.length;try{if(!De){let m=ee(Me),_=H(m,{allowFnCalls:f});if(J&&ie&&se?(n.push(_.variable),s.push({type:0,pos:d})):J&&ie&&!se&&s.push({type:1,pos:d}),oe){let Y=s.pop();if(Y?.type===0&&n.pop(),Y===void 0)throw{message:"Unexpected end of block",pos:d}}let S=F(_,{allowedProps:p,forbiddenProps:u,scope:n});J||oe?O+=S:O+=l&&!S.startsWith("namespaces.Mutor.include")?`acc+=escapeFn(${S});`:`acc+=${S};`}ve&&(y=!0)}catch(m){let{message:_,pos:S}=m,Y=ne?o.whitespaceTrim.length+o.openingTag.length:o.openingTag.length,ae=d+S+Y,[Le,ce]=B(e,ae),Ue=L(e,ce);throw new P(_,Le,Ue,ae-ce,r.path)}}if(s.length){let d=s.pop()?.pos,[W,i]=B(e,d),K=L(e,i);throw new P("Unclosed block detected.",W,K,d-i,r.path)}return O+="return acc;",h==="async"?new Pe("ctx","namespaces","allowedProps","forbiddenProps","escapeFn","validateComputedProps",O):new Function("ctx","namespaces","allowedProps","forbiddenProps","escapeFn","validateComputedProps",O)}var j=class{constructor(t={}){this.__cacheSize=0;this.__config={...g};this.__compiledTemplatesMap=new Map;this.__namespaces={..._e,Mutor:{await:async t=>await t}};this.addConfig(t)}addConfig(t){let{autoEscape:r,delimiters:n,allowedProps:s,forbiddenProps:o,keepOpeningTagEscapeDelimiter:c,allowFnCalls:f,cache:p,build:u,onIncludeFail:l,onIncludeError:h}=t;return this.__config={build:{include:new Set([...u?.include||g.build.include]),exclude:new Set([...g.build.exclude,...u?.exclude||[]])},autoEscape:r===!0?!0:r!==!1,allowedProps:s||g.allowedProps,allowFnCalls:!!f,onIncludeFail:l||g.onIncludeFail,onIncludeError:h||g.onIncludeError,cache:{...g.cache,...p||{}},forbiddenProps:new Set([...g.forbiddenProps,...o||[]]),keepOpeningTagEscapeDelimiter:c??!1,delimiters:{...g.delimiters,...n||{}}},this.__config}restoreDefaultConfig(){this.__config={...g}}compile(t,r){return te(t,this.__config,{path:r?.renderedPath||"anonymous"})}renderAsync(t,r){return new Promise(n=>{n(this.render(t,r))})}render(t,r){let n=A(r,"anonymous");return this.__renderWithRuntime(t,n)}__renderWithRuntime(t,r){return this.compile(t,r)(D(r.context),this.__createNamespacesWithRuntime(r),this.__config.allowedProps,this.__config.forbiddenProps,$,M)}__createNamespacesWithRuntime(t){return{...this.__namespaces,Mutor:{...this.__namespaces.Mutor,$$context:t.context}}}handleError(t,r,n,s){if(this.__config.onIncludeFail==="throw")throw t instanceof P?t:new a(t.message);let o={from:r,path:n,absolutePath:s};return this.__config.onIncludeFail==="ignoreLog"&&!this.__config.onIncludeError&&(t instanceof P?console.log(t):console.log(`[Mutor.js]
11
+ Expected an operator or the end of the expression.`};return n}function Q(e,{delimiters:t}){let r=`${t.openingTag}${t.whitespaceTrim}`,n=`${t.whitespaceTrim}${t.closingTag}`,s=e.startsWith(r),o=e.endsWith(n),c=s?r.length:t.openingTag.length,f=o?n.length:t.closingTag.length,p=e.slice(c,e.length-f),u=p.trim(),l=u.startsWith(t.commentTag);return l?{isComment:l,leftTrim:s,rightTrim:o}:{leftTrim:s,rightTrim:o,inner:p,isBlock:u.startsWith("for ")||u.startsWith("if ")||u.startsWith("else "),isBlockEnd:u==="end",hasContext:u.startsWith("for "),requiresBlockClose:u.startsWith("for ")||u.startsWith("if "),usesAwait:p.includes("Mutor::await")}}var ct=/[a-zA-Z$_]/,pt=/[a-zA-Z$_0-9]/,ut=/[0-9]/,lt=/[0-9.oxe]/,ft=/[a-zA-Z$_0-9\s\t\r\n'"`]/;function ee(e){let t=0,r="",n=[];function s(){let p="";if(ct.test(r)){let u=t;for(;pt.test(e[u])&&u<e.length;)p+=e[u],u++;n.push({type:pe.has(p)?1:0,value:p,pos:t}),t=u,r=e[t]}}function o(){if(r!=='"'&&r!=="'"&&r!=="`")return!1;let p=r,u=t,l=t+1,h="";for(;l<e.length;){let y=e[l];if(y==="\\"){if(l+1>=e.length)throw{pos:l,message:"Unexpected end of string after escape character."};h+=y,h+=e[l+1],l+=2;continue}if(y===p)break;h+=y,l++}if(l>=e.length||e[l]!==p)throw{pos:u,message:`String literal missing closing ${p}.`};n.push({type:3,value:h,pos:u}),t=l}function c(){if(ut.test(r)){let p=t,u="";for(;lt.test(e[p])&&p<e.length;)u+=e[p],p++;let l=Number(u);if(Number.isNaN(l))throw{pos:t,message:"Found invalid number literal."};n.push({type:2,value:`${l}`,pos:t}),t=p-1,r=e[t]}}function f(){let p=`${r}${e[t+1]}`;if(C.has(p)){n.push({type:4,value:p,pos:t}),t++;return}if(C.has(r)){n.push({type:4,value:r,pos:t});return}}for(;t<e.length;){if(r=e[t],c(),s(),o(),f(),!ft.test(r)&&!C.has(r)&&!C.has(e[t-1]+r))throw{message:`Unexpected token '${r}' in expression.`,pos:t};t++}return n.length?n:[{type:3,value:"",pos:0}]}function te(e,t,r){let n=[],s=[],{delimiters:o,keepOpeningTagEscapeDelimiter:c,allowFnCalls:f,allowedProps:p,forbiddenProps:u,autoEscape:l}=t,h="sync",y=!1,R=0,O='let acc="";';for(;R<e.length;){let W=function(){let m=d,_=0;for(;m>=o.openingTagEscape.length&&e.slice(m-o.openingTagEscape.length,m)===o.openingTagEscape;)_++,m-=o.openingTagEscape.length;return _%2===1};var yt=W;let d=e.indexOf(o.openingTag,R);if(d===-1){let m=e.slice(R);y&&(m=m.trimStart()),m&&(O+=`acc+=\`${T(m)}\`;`);break}if(W()){let m=e.slice(R,c?d+o.openingTagEscape.length+1:d-o.openingTag.length+1);y&&(m=m.trimStart(),y=!1),O+=`acc+=\`${T(m)}\`;`,c||(O+=`acc+=\`${o.openingTag}\`;`),R=d+o.openingTag.length;continue}let i=e.indexOf(o.closingTag,d);if(i===-1){let[m,_]=B(e,d),S=L(e,_);throw new P("No closing tag found.",m,S,d,r.path)}let K=e.slice(d,i+o.closingTag.length),{inner:Me,leftTrim:ne,rightTrim:ve,isBlock:J,isBlockEnd:oe,hasContext:se,requiresBlockClose:ie,isComment:De,usesAwait:Be}=Q(K,{delimiters:o});Be&&h!=="async"&&(h="async");let N=e.slice(R,d);N&&(y&&(N=N.trimStart()),ne&&(N=N.trimEnd()),N&&(O+=`acc+=\`${T(N)}\`;`)),y=!1,R=i+o.closingTag.length;try{if(!De){let m=ee(Me),_=H(m,{allowFnCalls:f});if(J&&ie&&se?(n.push(_.variable),s.push({type:0,pos:d})):J&&ie&&!se&&s.push({type:1,pos:d}),oe){let Y=s.pop();if(Y?.type===0&&n.pop(),Y===void 0)throw{message:"Unexpected end of block",pos:d}}let S=F(_,{allowedProps:p,forbiddenProps:u,scope:n});J||oe?O+=S:O+=l&&!S.startsWith("namespaces.Mutor.include")?`acc+=escapeFn(${S});`:`acc+=${S};`}ve&&(y=!0)}catch(m){let{message:_,pos:S}=m,Y=ne?o.whitespaceTrim.length+o.openingTag.length:o.openingTag.length,ae=d+S+Y,[Le,ce]=B(e,ae),Ue=L(e,ce);throw new P(_,Le,Ue,ae-ce,r.path)}}if(s.length){let d=s.pop()?.pos,[W,i]=B(e,d),K=L(e,i);throw new P("Unclosed block detected.",W,K,d-i,r.path)}return O+="return acc;",h==="async"?new Pe("ctx","namespaces","allowedProps","forbiddenProps","escapeFn","validateComputedProps",O):new Function("ctx","namespaces","allowedProps","forbiddenProps","escapeFn","validateComputedProps",O)}var j=class{constructor(t={}){this.__cacheSize=0;this.__config={...g};this.__compiledTemplatesMap=new Map;this.__namespaces={..._e,Mutor:{await:async t=>await t}};this.addConfig(t)}addConfig(t){let{autoEscape:r,delimiters:n,allowedProps:s,forbiddenProps:o,keepOpeningTagEscapeDelimiter:c,allowFnCalls:f,cache:p,build:u,onIncludeFail:l,onIncludeError:h}=t;return this.__config={build:{include:new Set([...u?.include||g.build.include]),exclude:new Set([...g.build.exclude,...u?.exclude||[]])},autoEscape:r===!0?!0:r!==!1,allowedProps:s||g.allowedProps,allowFnCalls:!!f,onIncludeFail:l||g.onIncludeFail,onIncludeError:h||g.onIncludeError,cache:{...g.cache,...p||{}},forbiddenProps:new Set([...g.forbiddenProps,...o||[]]),keepOpeningTagEscapeDelimiter:c??!1,delimiters:{...g.delimiters,...n||{}}},this.__config}restoreDefaultConfig(){this.__config={...g}}compile(t,r){return te(t,this.__config,{path:r?.renderedPath||"anonymous"})}renderAsync(t,r){return new Promise(n=>{n(this.render(t,r))})}render(t,r){let n=A(r,"anonymous");return this.__renderWithRuntime(t,n)}__renderWithRuntime(t,r){return this.compile(t,r)(D(r.context),this.__createNamespacesWithRuntime(r),this.__config.allowedProps,this.__config.forbiddenProps,$,M)}__createNamespacesWithRuntime(t){return{...this.__namespaces,Mutor:{...this.__namespaces.Mutor,$$context:t.context}}}handleError(t,r,n,s){if(this.__config.onIncludeFail==="throw")throw t instanceof P?t:new a(t.message);let o={from:r,path:n,absolutePath:s};return this.__config.onIncludeFail==="ignoreLog"&&!this.__config.onIncludeError&&(t instanceof P?console.log(t):console.log(`[Mutor.js]
12
12
  ${t.message}`)),this.__config.onIncludeError?.(o,t)??""}createEntrySpaceForTemplate(t){if(this.__cacheSize+t<this.__config.cache.maxSize)return!0;if(t>this.__config.cache.maxSize)return!1;let r=this.__compiledTemplatesMap.entries().next().value;if(r){let[n,s]=r;this.__compiledTemplatesMap.delete(n),this.__cacheSize-=s.size}return this.createEntrySpaceForTemplate(t)}getDiagnostics(){let t=this.__config.cache.maxSize;return{bytesUsed:this.__cacheSize,bytesMax:t,readableUsed:`${(this.__cacheSize/1024/1024).toFixed(2)} MB`,readableMax:`${(t/1024/1024).toFixed(2)} MB`,totalEntries:this.__compiledTemplatesMap.size,percentFull:t>0?Math.min(100,Math.round(this.__cacheSize/t*100)):0,avgTemplateSize:this.__compiledTemplatesMap.size>0?Math.round(this.__cacheSize/this.__compiledTemplatesMap.size):0}}register(t,r){let n=r.length*2+500;if(this.__cacheSize+n>this.__config.cache.maxSize&&!this.createEntrySpaceForTemplate(n))throw new a(`The template for the component '${t}' is too large and will not fit in the cache. Consider increasing 'cache.maxSize' in the config`);let s=A(null,t);this.__cacheSize+=r.length*2+500,this.__compiledTemplatesMap.set(t,{fn:this.compile(r,s),size:n})}reset(){this.__config={...g},this.__compiledTemplatesMap.clear(),this.__cacheSize=0}};var z=class extends j{constructor(t={}){super(t)}__setupIncludeForRuntime(t){this.__namespaces.Mutor.include=(r,n)=>{let s=k(t.renderedPath,r);if(t.includeStack.has(s))throw new a(`Circular include detected.
13
13
  ${Array.from(t.includeStack).join(`
14
14
  `)}
15
- ${s}`);let o=t.renderedPath;t.includeStack.add(s),t.renderedPath=s;try{return this.__renderFile(s,n??t.context,t)}catch(c){return this.handleError(c,o,r,s)}finally{t.includeStack.delete(s),t.renderedPath=o}}}render(t,r){let n=A(r,"anonymous");return this.__setupIncludeForRuntime(n),this.__renderWithRuntime(t,n)}renderAsync(t,r){return new Promise(n=>{n(this.render(t,r))})}__renderFile(t,r,n){this.__setupIncludeForRuntime(n);let s=k(t),o,c=n.context,f=n.renderedPath;n.context=r??c,n.renderedPath=s;try{if(this.__config.cache.active&&this.__compiledTemplatesMap.has(s)){let u=this.__compiledTemplatesMap.get(s);o=u.fn,this.__compiledTemplatesMap.delete(s),this.__compiledTemplatesMap.set(s,u)}else{let u=mt(s,"utf-8");if(o=this.compile(u,n),this.__config.cache.active){let l=u.length*2+500;this.__cacheSize+l>this.__config.cache.maxSize?this.createEntrySpaceForTemplate(l)&&(this.__compiledTemplatesMap.set(s,{fn:o,size:l}),this.__cacheSize+=l):(this.__compiledTemplatesMap.set(s,{fn:o,size:l}),this.__cacheSize+=l)}}return o(D(n.context),this.__createNamespacesWithRuntime(n),this.__config.allowedProps,this.__config.forbiddenProps,$,M)}finally{n.context=c,n.renderedPath=f}}renderFile(t,r){return this.__renderFile(t,r,A(null,t))}renderFileAsync(t,r){return new Promise(n=>{n(this.renderFile(t,r))})}async buildDir(t,r,n){let s=k(r),o=k(t);await ht(s,{recursive:!0});let c=await Ce(o,{withFileTypes:!0});await Promise.all(c.map(async f=>{let p=re(o,f.name),u=re(s,f.name);if(this.__config.build.exclude.has(f.name))return;if(f.isDirectory())return this.buildDir(p,u,n);let l=$e(p);if(this.__config.build.include.has(l)){let h=this.renderFile(p,n);await wt(u,h,"utf-8")}else return await dt(p,u)}))}async compileDir(t){let r=k(t),n=await Ce(r,{withFileTypes:!0});await Promise.all(n.map(async s=>{let o=re(r,s.name);if(this.__config.build.exclude.has(s.name))return;if(s.isDirectory())return this.compileDir(o);let c=$e(o);if(this.__config.build.include.has(c))try{let f=await gt(o,"utf-8");this.register(o,f)}catch{}}))}};var Ar=z;export{Re as BlockType,X as ExprType,Z as LoopType,G as TokenType,Ar as default};
15
+ ${s}`);let o=t.renderedPath;t.includeStack.add(s),t.renderedPath=s;try{return this.__renderFile(s,n??t.context,t)}catch(c){return this.handleError(c,o,r,s)}finally{t.includeStack.delete(s),t.renderedPath=o}}}render(t,r){let n=A(r,"anonymous");return this.__setupIncludeForRuntime(n),this.__renderWithRuntime(t,n)}renderAsync(t,r){return new Promise(n=>{n(this.render(t,r))})}__renderFile(t,r,n){this.__setupIncludeForRuntime(n);let s=k(t),o,c=n.context,f=n.renderedPath;n.context=r??c,n.renderedPath=s;try{if(this.__config.cache.active&&this.__compiledTemplatesMap.has(s)){let u=this.__compiledTemplatesMap.get(s);o=u.fn,this.__compiledTemplatesMap.delete(s),this.__compiledTemplatesMap.set(s,u)}else{let u=mt(s,"utf-8");if(o=this.compile(u,n),this.__config.cache.active){let l=u.length*2+500;this.__cacheSize+l>this.__config.cache.maxSize?this.createEntrySpaceForTemplate(l)&&(this.__compiledTemplatesMap.set(s,{fn:o,size:l}),this.__cacheSize+=l):(this.__compiledTemplatesMap.set(s,{fn:o,size:l}),this.__cacheSize+=l)}}return o(D(n.context),this.__createNamespacesWithRuntime(n),this.__config.allowedProps,this.__config.forbiddenProps,$,M)}finally{n.context=c,n.renderedPath=f}}renderFile(t,r){return this.__renderFile(t,r,A(null,t))}renderFileAsync(t,r){return new Promise(n=>{n(this.renderFile(t,r))})}async buildDir(t,r,n){let s=k(r),o=k(t);await ht(s,{recursive:!0});let c=await Ce(o,{withFileTypes:!0});await Promise.all(c.map(async f=>{let p=re(o,f.name),u=re(s,f.name);if(this.__config.build.exclude.has(f.name))return;if(f.isDirectory())return this.buildDir(p,u,n);let l=$e(p);if(this.__config.build.include.has(l)){let h=this.renderFile(p,n);await wt(u,h,"utf-8")}else return await dt(p,u)}))}async compileDir(t){let r=k(t),n=await Ce(r,{withFileTypes:!0});await Promise.all(n.map(async s=>{let o=re(r,s.name);if(this.__config.build.exclude.has(s.name))return;if(s.isDirectory())return this.compileDir(o);let c=$e(o);if(this.__config.build.include.has(c)){let f=await gt(o,"utf-8");this.register(o,f)}}))}};var Ar=z;export{Re as BlockType,X as ExprType,Z as LoopType,G as TokenType,Ar as default};
16
16
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/mutor.server.ts","../src/utils/create-runtime.ts","../src/utils/construct-pointer.ts","../src/core/error.ts","../src/core/constants.ts","../src/utils/escape-fn.ts","../src/utils/to-absolute-path.ts","../src/utils/validate-computed-prop.ts","../src/utils/validate-context.ts","../src/types/enums.ts","../src/utils/escape-raw-text.ts","../src/utils/get-line-and-column-nums.ts","../src/utils/get-line-snapshot.ts","../src/core/build.ts","../src/utils/get-token-type-words.ts","../src/core/generate-ast.ts","../src/core/parse.ts","../src/core/tokenize.ts","../src/core/compile.ts","../src/core/mutor.base.ts","../src/server.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\r\nimport {\r\n copyFile,\r\n mkdir,\r\n readdir,\r\n readFile,\r\n writeFile,\r\n} from \"node:fs/promises\";\r\nimport { extname, join } from \"node:path\";\r\nimport type { PartialMutorConfig, RuntimeFrame } from \"../types/types\";\r\nimport createRuntimeFrame from \"../utils/create-runtime\";\r\nimport escapeFn from \"../utils/escape-fn\";\r\nimport toAbsolutePath from \"../utils/to-absolute-path\";\r\nimport validateComputedProp from \"../utils/validate-computed-prop\";\r\nimport validateContext from \"../utils/validate-context\";\r\nimport { MutorError } from \"./error\";\r\nimport MutorBase from \"./mutor.base\";\r\n\r\nexport default class MutorServer extends MutorBase {\r\n constructor(config: PartialMutorConfig = {}) {\r\n super(config);\r\n }\r\n\r\n /**\r\n * Set up the include namespace with the given runtime.\r\n * This must be done before rendering to ensure includes have access to the runtime.\r\n */\r\n private __setupIncludeForRuntime(runtime: RuntimeFrame) {\r\n this.__namespaces.Mutor.include = (path: string, context: any) => {\r\n const resolvedPath = toAbsolutePath(runtime.renderedPath, path);\r\n\r\n if (runtime.includeStack.has(resolvedPath)) {\r\n throw new MutorError(\r\n `Circular include detected.\\n${Array.from(runtime.includeStack).join(\"\\n\")}\\n${resolvedPath}`,\r\n );\r\n }\r\n\r\n const previousPath = runtime.renderedPath;\r\n runtime.includeStack.add(resolvedPath);\r\n runtime.renderedPath = resolvedPath;\r\n\r\n try {\r\n return this.__renderFile(\r\n resolvedPath,\r\n context ?? runtime.context,\r\n runtime,\r\n );\r\n } catch (err) {\r\n return this.handleError(err, previousPath, path, resolvedPath);\r\n } finally {\r\n runtime.includeStack.delete(resolvedPath);\r\n runtime.renderedPath = previousPath;\r\n }\r\n };\r\n }\r\n\r\n render(template: string, context: any): string {\r\n const runtime = createRuntimeFrame(context, \"anonymous\");\r\n this.__setupIncludeForRuntime(runtime);\r\n return this.__renderWithRuntime(template, runtime);\r\n }\r\n\r\n renderAsync(template: string, context: any): Promise<string> {\r\n return new Promise((resolve) => {\r\n resolve(this.render(template, context));\r\n });\r\n }\r\n\r\n private __renderFile(path: string, context: any, runtime: RuntimeFrame) {\r\n this.__setupIncludeForRuntime(runtime);\r\n\r\n const absolutePath = toAbsolutePath(path);\r\n let compiled: Function;\r\n\r\n // Save previous state for nested renders\r\n const previousContext = runtime.context;\r\n const previousPath = runtime.renderedPath;\r\n\r\n // Update runtime for this render\r\n runtime.context = context ?? previousContext;\r\n runtime.renderedPath = absolutePath;\r\n\r\n try {\r\n if (\r\n this.__config.cache.active &&\r\n this.__compiledTemplatesMap.has(absolutePath)\r\n ) {\r\n const entry = this.__compiledTemplatesMap.get(absolutePath)!;\r\n\r\n compiled = entry.fn;\r\n\r\n // Move to the front of the cache\r\n this.__compiledTemplatesMap.delete(absolutePath);\r\n this.__compiledTemplatesMap.set(absolutePath, entry);\r\n } else {\r\n const template = readFileSync(absolutePath, \"utf-8\");\r\n compiled = this.compile(template, runtime);\r\n\r\n if (this.__config.cache.active) {\r\n const templateSize = template.length * 2 + 500;\r\n\r\n if (this.__cacheSize + templateSize > this.__config.cache.maxSize) {\r\n if (this.createEntrySpaceForTemplate(templateSize)) {\r\n this.__compiledTemplatesMap.set(absolutePath, {\r\n fn: compiled,\r\n size: templateSize,\r\n });\r\n this.__cacheSize += templateSize;\r\n }\r\n } else {\r\n this.__compiledTemplatesMap.set(absolutePath, {\r\n fn: compiled,\r\n size: templateSize,\r\n });\r\n this.__cacheSize += templateSize;\r\n }\r\n }\r\n }\r\n\r\n const result = compiled(\r\n validateContext(runtime.context),\r\n this.__createNamespacesWithRuntime(runtime),\r\n this.__config.allowedProps,\r\n this.__config.forbiddenProps,\r\n escapeFn,\r\n validateComputedProp,\r\n );\r\n\r\n return result;\r\n } finally {\r\n // Restore previous state\r\n runtime.context = previousContext;\r\n runtime.renderedPath = previousPath;\r\n }\r\n }\r\n\r\n renderFile(path: string, context: any): string {\r\n return this.__renderFile(path, context, createRuntimeFrame(null, path));\r\n }\r\n\r\n renderFileAsync(path: string, context: any): Promise<string> {\r\n return new Promise((resolve) => {\r\n resolve(this.renderFile(path, context));\r\n });\r\n }\r\n\r\n async buildDir(src: string, destination: string, context: any) {\r\n const absoluteDestinationPath = toAbsolutePath(destination);\r\n const absoluteSrcPath = toAbsolutePath(src);\r\n\r\n await mkdir(absoluteDestinationPath, { recursive: true });\r\n\r\n const entries = await readdir(absoluteSrcPath, { withFileTypes: true });\r\n await Promise.all(\r\n entries.map(async (entry) => {\r\n const srcPath = join(absoluteSrcPath, entry.name);\r\n const destinationPath = join(absoluteDestinationPath, entry.name);\r\n\r\n if (this.__config.build.exclude.has(entry.name)) {\r\n return;\r\n }\r\n\r\n if (entry.isDirectory()) {\r\n return this.buildDir(srcPath, destinationPath, context);\r\n }\r\n\r\n const extension = extname(srcPath);\r\n\r\n if (this.__config.build.include.has(extension)) {\r\n const rendered = this.renderFile(srcPath, context);\r\n await writeFile(destinationPath, rendered, \"utf-8\");\r\n } else {\r\n return await copyFile(srcPath, destinationPath);\r\n }\r\n }),\r\n );\r\n }\r\n\r\n async compileDir(src: string) {\r\n const absolutePath = toAbsolutePath(src);\r\n const entries = await readdir(absolutePath, { withFileTypes: true });\r\n\r\n await Promise.all(\r\n entries.map(async (entry) => {\r\n const absoluteSrcPath = join(absolutePath, entry.name);\r\n\r\n if (this.__config.build.exclude.has(entry.name)) {\r\n return;\r\n }\r\n\r\n if (entry.isDirectory()) {\r\n return this.compileDir(absoluteSrcPath);\r\n }\r\n\r\n const extension = extname(absoluteSrcPath);\r\n\r\n if (this.__config.build.include.has(extension)) {\r\n try {\r\n const template = await readFile(absoluteSrcPath, \"utf-8\");\r\n this.register(absoluteSrcPath, template);\r\n } catch {}\r\n }\r\n }),\r\n );\r\n }\r\n}\r\n","import type { RuntimeFrame } from \"../types/types\";\r\n\r\nexport default function createRuntimeFrame(\r\n context: any,\r\n renderedPath: string = \"\",\r\n): RuntimeFrame {\r\n return {\r\n context,\r\n renderedPath,\r\n includeStack: new Set([renderedPath && renderedPath]),\r\n };\r\n}\r\n","/**\n * Creates a visual text-based pointer `^`.\n * @param pos The position in the text to be pointed at.\n * @param offset The offset to the left to compensate for line numbering.\n * @returns\n */\nexport default function constructPointer(pos: number, offset: number) {\n // pos is the index in the text, offset is the width of \"Line | \"\n return `${\" \".repeat(pos + offset)}^`;\n}\n","import constructPointer from \"../utils/construct-pointer\";\n\nexport class MutorError extends Error {\n public name = \"MutorError\";\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, MutorError.prototype);\n }\n}\n\nexport class MutorCompilerError extends MutorError {\n public name = \"MutorCompilerError\";\n\n constructor(\n message: string,\n line: number,\n lineText: string,\n column: number, // 0-indexed column from snapshot\n file: string,\n ) {\n // Dynamic gutter width for alignment\n const gutterWidth = line.toString().length + 2;\n let report = `${message}\\n\\n`;\n\n report += `at ${file}:${line}:${column + 1}\\n`;\n\n // Line snippet with gutter\n if (line > 1) {\n report += `${(line - 1).toString().padStart(gutterWidth - 2)} | ...\\n`;\n }\n\n report += `${line} | ${lineText}\\n`;\n // Visual Pointer\n report += constructPointer(column, gutterWidth + 1);\n\n super(report);\n Object.setPrototypeOf(this, MutorCompilerError.prototype);\n }\n}\n","import type { MutorConfig } from \"../types/types\";\r\nimport { MutorError } from \"./error\";\r\n\r\nexport const keywords = new Set([\r\n \"for\",\r\n \"if\",\r\n \"else\",\r\n \"true\",\r\n \"false\",\r\n \"null\",\r\n \"undefined\",\r\n \"end\",\r\n \"in\",\r\n \"of\",\r\n]);\r\n\r\nexport const operators = new Set([\r\n \"::\",\r\n \"||\",\r\n \"??\",\r\n \"&&\",\r\n \"**\",\r\n \"^\",\r\n \"|\",\r\n \"&\",\r\n \"!\",\r\n \"-\",\r\n \"%\",\r\n \"+\",\r\n \"*\",\r\n \"/\",\r\n \">\",\r\n \"<\",\r\n \">=\",\r\n \"<=\",\r\n \"==\",\r\n \"!=\",\r\n \">>\",\r\n \"<<\",\r\n \".\",\r\n \"?.\",\r\n \"(\",\r\n \")\",\r\n \"[\",\r\n \"]\",\r\n \",\",\r\n \":\",\r\n \"?\",\r\n]);\r\n\r\nexport const logicalOperators = new Set([\"&&\", \"||\", \"??\"]);\r\n\r\nexport const equalityOperators = new Set([\"==\", \"!=\"]);\r\n\r\nexport const comparisonOperators = new Set([\">\", \"<\", \">=\", \"<=\"]);\r\n\r\nexport const bitwiseOperators = new Set([\">>\", \"<<\", \"^\", \"|\", \"&\"]);\r\n\r\nexport const additiveOperators = new Set([\"+\", \"-\"]);\r\n\r\nexport const multiplicativeOperators = new Set([\"*\", \"/\", \"%\"]);\r\n\r\nexport const propertyAccessOperators = new Set([\".\", \"?.\", \"[\", \"::\"]);\r\n\r\nexport const unaryOperators = new Set([\"-\", \"+\", \"!\"]);\r\n\r\nexport const bitwiseOrOperators = new Set([\"|\"]);\r\n\r\nexport const bitwiseXorOperators = new Set([\"^\"]);\r\n\r\nexport const bitwiseAndOperators = new Set([\"&\"]);\r\n\r\nexport const exponentiationOperators = new Set([\"**\"]);\r\n\r\nexport const ESCAPE_MAP: Record<string, string> = {\r\n \"&\": \"&amp;\",\r\n \"<\": \"&lt;\",\r\n \">\": \"&gt;\",\r\n '\"': \"&quot;\",\r\n \"'\": \"&#39;\",\r\n};\r\n\r\nexport const defaultConfig: MutorConfig = {\r\n build: {\r\n include: new Set([\".html\", \".txt\"]),\r\n exclude: new Set([\"node_modules\", \".git\"]),\r\n },\r\n autoEscape: true,\r\n allowedProps: new Set(),\r\n forbiddenProps: new Set([\"__proto__\", \"constructor\", \"prototype\"]),\r\n allowFnCalls: false,\r\n delimiters: {\r\n closingTag: \"}}\",\r\n openingTag: \"{{\",\r\n openingTagEscape: \"\\\\\",\r\n whitespaceTrim: \"~\",\r\n commentTag: \"#\",\r\n },\r\n keepOpeningTagEscapeDelimiter: false,\r\n onIncludeFail: \"throw\",\r\n cache: {\r\n active: true,\r\n maxSize: 50 * 1024 * 1024, // 50MB\r\n },\r\n};\r\n\r\nexport const namespaces = {\r\n JSON: {\r\n stringify(value: any, space?: number) {\r\n try {\r\n return JSON.stringify(value, null, space);\r\n } catch {\r\n throw new MutorError(\"JSON::stringify failed\");\r\n }\r\n },\r\n\r\n parse(str: string) {\r\n if (typeof str !== \"string\") {\r\n throw new MutorError(\"JSON::parse expects a string\");\r\n }\r\n\r\n try {\r\n return JSON.parse(str);\r\n } catch {\r\n throw new MutorError(\"JSON::parse failed: invalid JSON string\");\r\n }\r\n },\r\n },\r\n\r\n Object: {\r\n keys(obj: object) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::keys expects an object\");\r\n }\r\n\r\n return Object.keys(obj);\r\n },\r\n\r\n values(obj: object) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::values expects an object\");\r\n }\r\n\r\n return Object.values(obj);\r\n },\r\n\r\n entries(obj: object) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::entries expects an object\");\r\n }\r\n\r\n return Object.entries(obj);\r\n },\r\n\r\n hasOwn(obj: object, key: any) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::hasOwn expects an object\");\r\n }\r\n\r\n return Object.hasOwn(obj, key);\r\n },\r\n\r\n fromEntries(entries: any[]) {\r\n if (!Array.isArray(entries)) {\r\n throw new MutorError(\"Object::fromEntries expects an array\");\r\n }\r\n\r\n return Object.fromEntries(entries);\r\n },\r\n\r\n pick(obj: Record<string, any>, keys: string[]) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::pick expects an object\");\r\n }\r\n\r\n if (!Array.isArray(keys)) {\r\n throw new MutorError(\"Object::pick expects an array of keys\");\r\n }\r\n\r\n const result: Record<string, any> = {};\r\n\r\n for (const key of keys) {\r\n if (Object.hasOwn(obj, key)) {\r\n result[key] = obj[key];\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n omit(obj: Record<string, any>, keys: string[]) {\r\n if (!obj || typeof obj !== \"object\") {\r\n throw new MutorError(\"Object::omit expects an object\");\r\n }\r\n\r\n if (!Array.isArray(keys)) {\r\n throw new MutorError(\"Object::omit expects an array of keys\");\r\n }\r\n\r\n const result = { ...obj };\r\n\r\n for (const key of keys) {\r\n delete result[key];\r\n }\r\n\r\n return result;\r\n },\r\n },\r\n\r\n Array: {\r\n isArray(value: any) {\r\n return Array.isArray(value);\r\n },\r\n\r\n from(value: any) {\r\n return Array.from(value);\r\n },\r\n\r\n of(...args: any[]) {\r\n return Array.of(...args);\r\n },\r\n\r\n unique(arr: any[]) {\r\n if (!Array.isArray(arr)) {\r\n throw new MutorError(\"Array::unique expects an array\");\r\n }\r\n\r\n return [...new Set(arr)];\r\n },\r\n\r\n compact(arr: any[]) {\r\n if (!Array.isArray(arr)) {\r\n throw new MutorError(\"Array::compact expects an array\");\r\n }\r\n\r\n return arr.filter(Boolean);\r\n },\r\n\r\n chunk(arr: any[], size: number) {\r\n if (!Array.isArray(arr)) {\r\n throw new MutorError(\"Array::chunk expects an array\");\r\n }\r\n\r\n if (!Number.isInteger(size) || size <= 0) {\r\n throw new MutorError(\"Array::chunk expects a positive integer size\");\r\n }\r\n\r\n const result = [];\r\n\r\n for (let i = 0; i < arr.length; i += size) {\r\n result.push(arr.slice(i, i + size));\r\n }\r\n\r\n return result;\r\n },\r\n\r\n range(start: number, end: number, step = 1) {\r\n if (\r\n !Number.isFinite(start) ||\r\n !Number.isFinite(end) ||\r\n !Number.isFinite(step)\r\n ) {\r\n throw new MutorError(\"Array::range expects finite numbers\");\r\n }\r\n if (step === 0) {\r\n throw new MutorError(\"Array::range step cannot be 0\");\r\n }\r\n\r\n // Validate directionality to prevent infinite loops\r\n if ((start <= end && step < 0) || (start > end && step > 0)) {\r\n throw new MutorError(\r\n \"Invalid step direction: step must match range direction\",\r\n );\r\n }\r\n\r\n const result = [];\r\n for (let i = start; start <= end ? i <= end : i >= end; i += step) {\r\n result.push(i);\r\n }\r\n\r\n return result;\r\n },\r\n },\r\n\r\n Number: {\r\n isFinite(value: number) {\r\n return Number.isFinite(value);\r\n },\r\n\r\n isNaN(value: any) {\r\n return Number.isNaN(value);\r\n },\r\n\r\n isInteger(value: any) {\r\n return Number.isInteger(value);\r\n },\r\n\r\n parseInt(value: string, radix = 10) {\r\n return Number.parseInt(value, radix);\r\n },\r\n\r\n parseFloat(value: string) {\r\n return Number.parseFloat(value);\r\n },\r\n\r\n clamp(value: number, min: number, max: number) {\r\n return Math.min(Math.max(value, min), max);\r\n },\r\n\r\n toFixed(value: number, digits = 0) {\r\n if (typeof value !== \"number\") {\r\n throw new MutorError(\"Number::toFixed expects a number\");\r\n }\r\n\r\n return value.toFixed(digits);\r\n },\r\n\r\n random(min = 0, max = 1) {\r\n return Math.random() * (max - min) + min;\r\n },\r\n },\r\n\r\n String: {\r\n fromCharCode(...args: number[]) {\r\n return String.fromCharCode(...args);\r\n },\r\n\r\n capitalize(value: string) {\r\n if (typeof value !== \"string\") {\r\n throw new MutorError(\"String::capitalize expects a string\");\r\n }\r\n\r\n if (!value.length) {\r\n return value;\r\n }\r\n\r\n return value[0].toUpperCase() + value.slice(1);\r\n },\r\n },\r\n\r\n Math: {\r\n abs(x: number) {\r\n return Math.abs(x);\r\n },\r\n\r\n floor(x: number) {\r\n return Math.floor(x);\r\n },\r\n\r\n ceil(x: number) {\r\n return Math.ceil(x);\r\n },\r\n\r\n round(x: number) {\r\n return Math.round(x);\r\n },\r\n\r\n trunc(x: number) {\r\n return Math.trunc(x);\r\n },\r\n\r\n sign(x: number) {\r\n return Math.sign(x);\r\n },\r\n\r\n sqrt(x: number) {\r\n return Math.sqrt(x);\r\n },\r\n\r\n pow(base: number, exponent: number) {\r\n return base ** exponent;\r\n },\r\n\r\n max(...args: number[]) {\r\n return Math.max(...args);\r\n },\r\n\r\n min(...args: number[]) {\r\n return Math.min(...args);\r\n },\r\n\r\n random() {\r\n return Math.random();\r\n },\r\n\r\n PI: Math.PI,\r\n },\r\n\r\n Date: {\r\n now() {\r\n return Date.now();\r\n },\r\n\r\n parse(str: string) {\r\n if (typeof str !== \"string\") {\r\n throw new MutorError(\"Date::parse expects a string\");\r\n }\r\n\r\n return Date.parse(str);\r\n },\r\n\r\n new(date?: string | number) {\r\n if (date === undefined) {\r\n return new Date();\r\n }\r\n\r\n return new Date(date);\r\n },\r\n\r\n iso(date?: string | number | Date) {\r\n const d = new Date(date ?? Date.now());\r\n if (Number.isNaN(d.getTime()))\r\n throw new MutorError(\"Invalid date provided to Date::iso\");\r\n return d.toISOString();\r\n },\r\n\r\n timestamp(date?: string | number | Date) {\r\n return new Date(date ?? Date.now()).getTime();\r\n },\r\n },\r\n\r\n Boolean: {\r\n valueOf(value: any) {\r\n return Boolean(value);\r\n },\r\n },\r\n\r\n URL: {\r\n encode(value: string) {\r\n if (typeof value !== \"string\") {\r\n throw new MutorError(\"URL::encode expects a string\");\r\n }\r\n\r\n return encodeURIComponent(value);\r\n },\r\n\r\n decode(value: string) {\r\n if (typeof value !== \"string\") {\r\n throw new MutorError(\"URL::decode expects a string\");\r\n }\r\n\r\n return decodeURIComponent(value);\r\n },\r\n },\r\n};\r\n\r\nexport const AsyncFunction = (async () => {})\r\n .constructor as FunctionConstructor;\r\n","import { ESCAPE_MAP } from \"../core/constants\";\n\n/**\n * Escapes HTML special characters in a string.\n * @param e The value to escape.\n * @returns The escaped string or the original value if not a string.\n */\nexport default function escapeFn(e: unknown): unknown {\n if (typeof e !== \"string\") return e;\n return /[&<>\"']/.test(e)\n ? e.replace(/[&<>\"']/g, (char) => ESCAPE_MAP[char])\n : e;\n}\n","import { dirname, isAbsolute, resolve } from \"node:path\";\n\nexport default function toAbsolutePath(\n basePath: string,\n ...relativePaths: string[]\n) {\n const absoluteBase = isAbsolute(basePath)\n ? basePath\n : resolve(process.cwd(), basePath);\n\n if (relativePaths.length) {\n const baseDir = dirname(absoluteBase);\n return resolve(baseDir, ...relativePaths);\n }\n\n return absoluteBase;\n}\n","import { MutorError } from \"../core/error\";\n\nexport default function validateComputedProp(\n r: string | number,\n allowedProps: Set<string | number>,\n forbiddenProps: Set<string | number>,\n): string | number {\n if (forbiddenProps.has(r) && !allowedProps.has(r)) {\n throw new MutorError(\n `Forbidden property access.\\nAccess to this computed property '${r}' is forbidden.`,\n );\n }\n return r;\n}\n","import { MutorError } from \"../core/error\";\r\n\r\nconst OBJECT = \"object\";\r\nexport const MUTOR_SAFE = Symbol(\"__mutor_safe_context\");\r\n\r\nfunction isPromiseLike(value: any) {\r\n return (\r\n value &&\r\n (typeof value === OBJECT || typeof value === \"function\") &&\r\n typeof value.then === \"function\"\r\n );\r\n}\r\n\r\nfunction walk(value: any, path = \"\", seen = new Set()) {\r\n if (!value || typeof value !== OBJECT) {\r\n return value;\r\n }\r\n\r\n if (isPromiseLike(value)) {\r\n return value;\r\n }\r\n\r\n if (seen.has(value)) {\r\n return value;\r\n }\r\n\r\n seen.add(value);\r\n\r\n if (value instanceof Map) {\r\n for (const [k, v] of value.entries()) {\r\n if (typeof k === OBJECT) walk(k, `${path}.mapKey`, seen);\r\n value.set(k, walk(v, `${path}.mapValue`, seen));\r\n }\r\n\r\n return value;\r\n }\r\n\r\n if (value instanceof Set) {\r\n const next = new Set();\r\n\r\n for (const v of value.values()) {\r\n next.add(walk(v, path, seen));\r\n }\r\n\r\n value.clear();\r\n\r\n for (const v of next) {\r\n value.add(v);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n\r\n if (proto !== Object.prototype && proto !== Array.prototype) {\r\n throw new MutorError(\r\n `Unsafe prototype detected at ${path || \"root\"} in context.`,\r\n );\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n value[i] = walk(value[i], `${path}[${i}]`, seen);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n const descriptors = Object.getOwnPropertyDescriptors(value);\r\n\r\n for (const key of Object.keys(descriptors)) {\r\n const desc = descriptors[key];\r\n\r\n if (desc.get || desc.set) {\r\n throw new MutorError(\r\n `Getter/setter not allowed at '${path}.${key}' in context.`,\r\n );\r\n }\r\n\r\n value[key] = walk(value[key], `${path}.${key}`, seen);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport default function validateContext(ctx: unknown) {\r\n if (!ctx || typeof ctx !== OBJECT) {\r\n return ctx;\r\n }\r\n\r\n if (MUTOR_SAFE in (ctx as object)) {\r\n return ctx;\r\n }\r\n\r\n const safeData = walk(ctx);\r\n\r\n if (safeData && typeof safeData === OBJECT) {\r\n Object.defineProperty(safeData, MUTOR_SAFE, {\r\n value: true,\r\n enumerable: false,\r\n writable: false,\r\n configurable: false,\r\n });\r\n }\r\n\r\n return safeData;\r\n}\r\n","export enum TokenType {\n IDENT,\n KEYWORD,\n NUMBER,\n STRING,\n OPERATOR,\n}\n\nexport enum ExprType {\n BINARY,\n TERNARY,\n UNARY,\n CALL,\n STRING,\n NUMBER,\n NAMESPACE,\n IDENT,\n PROP_ACCESS,\n GROUP,\n BOOLEAN,\n UNDEFINED,\n NULL,\n FOR,\n IF,\n ELSE_IF,\n ELSE,\n END,\n}\n\nexport enum LoopType {\n OF,\n IN,\n}\n\nexport enum BlockType {\n LOOP,\n NON_LOOP,\n}\n","export default function escapeRawText(text: string) {\n return text.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\n}\n","/**\n * Counts the number of lines that comes before a given index, effectively returning the line and column numbers of the character at that index.\n * @param str The source string.\n * @param idx The index to find its line number.\n */\nexport default function getLineAndColumnNumbers(str: string, idx: number) {\n const lines = str.slice(0, idx).split(\"\\n\");\n const line = lines.length;\n // The index where the current line starts\n const lineIndex = str.lastIndexOf(\"\\n\", idx - 1) + 1;\n\n return [line, lineIndex];\n}\n","/**\n * Extracts the snapshot of a line from a given text.\n * @param str The source string.\n * @param lineIdx The index of the newline character to snap.\n */\nexport default function getLineSnapshot(str: string, lineIdx: number) {\n const nextNewlineIdx = str.indexOf(\"\\n\", lineIdx);\n const line = str\n .slice(lineIdx, nextNewlineIdx === -1 ? undefined : nextNewlineIdx)\n .replaceAll(\"\\t\", \" \");\n\n return line;\n}\n","import { ExprType, LoopType } from \"../types/enums\";\r\nimport type {\r\n BuildContext,\r\n BuildState,\r\n CallExpr,\r\n ElseIfExpr,\r\n Expr,\r\n ForExpr,\r\n IdentExpr,\r\n IfExpr,\r\n NamespaceExpr,\r\n PropAccessExpr,\r\n} from \"../types/types\";\r\nimport escapeRawText from \"../utils/escape-raw-text\";\r\nimport { MutorError } from \"./error\";\r\n\r\nfunction prefixWithCtx(state: BuildState, expr: IdentExpr): string {\r\n if (\r\n state.forbiddenProps.has(expr.value) &&\r\n !state.allowedProps.has(expr.value)\r\n ) {\r\n throw { message: `Property \"${expr.value}\" is forbidden.`, pos: expr.pos };\r\n }\r\n\r\n return state.scope.includes(expr.value) ? expr.value : `ctx.${expr.value}`;\r\n}\r\n\r\nfunction buildNamespace(expr: NamespaceExpr): string {\r\n if (expr.left.type !== ExprType.IDENT) {\r\n throw {\r\n message: \"Invalid usage of namespace operator.\",\r\n pos: expr.pos,\r\n };\r\n }\r\n const leftValue = (expr.left as IdentExpr).value;\r\n const rightValue = (expr.right as IdentExpr).value;\r\n return `namespaces.${leftValue}.${rightValue}`;\r\n}\r\n\r\nfunction buildPropAccess(state: BuildState, expr: PropAccessExpr): string {\r\n const left = buildExpr(state, expr.left);\r\n const optionalChain = expr.optional ? \"?.\" : \"\";\r\n\r\n if (expr.bracketNotation) {\r\n const right = buildExpr(state, expr.right);\r\n\r\n if (\r\n expr.right.type === ExprType.STRING &&\r\n state.forbiddenProps.has(right.replaceAll(/^`|`$/gm, \"\"))\r\n ) {\r\n throw {\r\n message: \"Forbidden property access.\",\r\n pos: expr.right.pos,\r\n };\r\n }\r\n\r\n return expr.right.type === ExprType.STRING ||\r\n expr.right.type === ExprType.NUMBER\r\n ? `${left}${optionalChain}[${right}]`\r\n : `${left}${optionalChain}[validateComputedProps(${right}, allowedProps, forbiddenProps)]`;\r\n }\r\n\r\n const propName = (expr.right as IdentExpr).value;\r\n\r\n if (state.forbiddenProps.has(propName) && !state.allowedProps.has(propName)) {\r\n throw { message: \"Forbidden property access.\", pos: expr.right.pos };\r\n }\r\n\r\n return `${left}${optionalChain}.${propName}`;\r\n}\r\n\r\nfunction buildCall(state: BuildState, expr: CallExpr): string {\r\n const func = buildExpr(state, expr.expr);\r\n const optionalChain = expr.optional ? \"?.\" : \"\";\r\n const args = (expr.args as Expr[])\r\n .map((arg: Expr) => buildExpr(state, arg))\r\n .join(\", \");\r\n\r\n return `${func}${optionalChain}(${args})`;\r\n}\r\n\r\nfunction buildForLoop(state: BuildState, expr: ForExpr): string {\r\n const { iterable, loopType, variable } = expr;\r\n const loopOperator = loopType === LoopType.IN ? \"in\" : \"of\";\r\n return `for(const ${variable} ${loopOperator} ${build(iterable, state.context)}){`;\r\n}\r\n\r\nfunction buildIfBlock(state: BuildState, expr: IfExpr): string {\r\n const { condition } = expr;\r\n return `if(${build(condition, state.context)}){`;\r\n}\r\n\r\nfunction buildElseIfBlock(state: BuildState, expr: ElseIfExpr): string {\r\n const { condition } = expr;\r\n return `}else if(${build(condition, state.context)}){`;\r\n}\r\n\r\nfunction buildExpr(state: BuildState, expr: Expr): string {\r\n const { type } = expr;\r\n\r\n if (type === ExprType.NUMBER) return expr.value;\r\n if (type === ExprType.NULL) return \"null\";\r\n if (type === ExprType.UNDEFINED) return \"undefined\";\r\n if (type === ExprType.BOOLEAN) return (expr as any).true ? \"true\" : \"false\";\r\n\r\n switch (type) {\r\n case ExprType.END:\r\n return \"}\";\r\n\r\n case ExprType.STRING:\r\n return `\\`${/\\$\\\\/.test(expr.value) ? escapeRawText(expr.value) : expr.value}\\``;\r\n\r\n case ExprType.IDENT:\r\n return prefixWithCtx(state, expr);\r\n\r\n case ExprType.GROUP:\r\n return `(${buildExpr(state, (expr as any).expr)})`;\r\n\r\n case ExprType.UNARY: {\r\n const { operator, expr: innerExpr } = expr as any;\r\n return `${operator}${buildExpr(state, innerExpr)}`;\r\n }\r\n\r\n case ExprType.BINARY: {\r\n const { left, operator, right } = expr as any;\r\n return `${buildExpr(state, left)} ${operator} ${buildExpr(state, right)}`;\r\n }\r\n\r\n case ExprType.TERNARY: {\r\n const { condition, left, right } = expr as any;\r\n return `${buildExpr(state, condition)} ? ${buildExpr(state, left)} : ${buildExpr(state, right)}`;\r\n }\r\n\r\n case ExprType.PROP_ACCESS:\r\n return buildPropAccess(state, expr as PropAccessExpr);\r\n\r\n case ExprType.CALL:\r\n return buildCall(state, expr as CallExpr);\r\n\r\n case ExprType.NAMESPACE:\r\n return buildNamespace(expr as NamespaceExpr);\r\n\r\n case ExprType.FOR:\r\n return buildForLoop(state, expr as ForExpr);\r\n\r\n case ExprType.ELSE:\r\n return \"} else {\";\r\n\r\n case ExprType.IF:\r\n return buildIfBlock(state, expr as IfExpr);\r\n\r\n case ExprType.ELSE_IF:\r\n return buildElseIfBlock(state, expr as ElseIfExpr);\r\n\r\n default:\r\n throw new MutorError(`Unsupported expression type '${type}'`);\r\n }\r\n}\r\n\r\nexport default function build(ast: Expr, context: BuildContext): string {\r\n const state: BuildState = {\r\n scope: context.scope,\r\n forbiddenProps: context.forbiddenProps,\r\n allowedProps: context.allowedProps,\r\n context,\r\n };\r\n\r\n const result = buildExpr(state, ast);\r\n return result.includes(\"namespaces.Mutor.await\")\r\n ? result.replaceAll(\r\n \"namespaces.Mutor.await\",\r\n \"await namespaces.Mutor.await\",\r\n )\r\n : result;\r\n}\r\n","import { TokenType } from \"../types/enums\";\n\nexport function getTokenTypeWords(type: TokenType) {\n switch (type) {\n case TokenType.IDENT:\n return \"identifier\";\n\n case TokenType.KEYWORD:\n return \"keyword\";\n\n case TokenType.NUMBER:\n return \"number\";\n\n case TokenType.OPERATOR:\n return \"operator\";\n\n case TokenType.STRING:\n return \"string\";\n }\n}\n","import { ExprType, LoopType, TokenType } from \"../types/enums\";\r\nimport type {\r\n ElseExpr,\r\n ElseIfExpr,\r\n Expr,\r\n ForExpr,\r\n IfExpr,\r\n ParseState,\r\n Token,\r\n} from \"../types/types\";\r\nimport { getTokenTypeWords } from \"../utils/get-token-type-words\";\r\nimport {\r\n additiveOperators,\r\n bitwiseAndOperators,\r\n bitwiseOperators,\r\n bitwiseOrOperators,\r\n bitwiseXorOperators,\r\n comparisonOperators,\r\n equalityOperators,\r\n exponentiationOperators,\r\n multiplicativeOperators,\r\n propertyAccessOperators,\r\n unaryOperators,\r\n} from \"./constants\";\r\n\r\nfunction expectOrThrow(state: ParseState, type: TokenType): Token;\r\nfunction expectOrThrow(\r\n state: ParseState,\r\n type: TokenType,\r\n value: string,\r\n): Token;\r\nfunction expectOrThrow(\r\n state: ParseState,\r\n type: TokenType,\r\n value?: string,\r\n): Token {\r\n const token = state.tokens[state.cursor];\r\n const lastToken = state.tokens[state.tokens.length - 1];\r\n\r\n if (!token) {\r\n const article = value\r\n ? `'${value}'`\r\n : `${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)}`;\r\n throw {\r\n message: `Unexpected end of expression. Expected ${article}.`,\r\n pos: lastToken.pos + lastToken.value.length - 1,\r\n };\r\n }\r\n\r\n if (token.type !== type) {\r\n throw {\r\n message: `Unexpected token type. Expected ${value ? `'${value}'` : getTokenTypeWords(type)} but got ${getTokenTypeWords(token.type)} instead.`,\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n if (value !== undefined && token.value !== value) {\r\n throw {\r\n message: `Unexpected token '${token.value}'. Expected ${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)} instead.`,\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n return state.tokens[state.cursor++];\r\n}\r\n\r\nfunction parseForLoop(state: ParseState): ForExpr {\r\n const pos = state.tokens[state.cursor - 1].pos;\r\n const variable = expectOrThrow(state, TokenType.IDENT).value;\r\n let token: Token;\r\n\r\n try {\r\n token = expectOrThrow(state, TokenType.KEYWORD, \"in\");\r\n } catch {\r\n token = expectOrThrow(state, TokenType.KEYWORD, \"of\");\r\n }\r\n\r\n const loopType = token.value === \"in\" ? LoopType.IN : LoopType.OF;\r\n const iterable = parseTernaryExpr(state);\r\n\r\n return { type: ExprType.FOR, loopType, iterable, variable, pos };\r\n}\r\n\r\nfunction parseIfExpression(state: ParseState): IfExpr {\r\n const condition = parseTernaryExpr(state);\r\n return { condition, pos: condition.pos, type: ExprType.IF };\r\n}\r\n\r\nfunction parseElseExpression(state: ParseState): ElseExpr | ElseIfExpr {\r\n const pos = state.tokens[state.cursor - 1].pos;\r\n\r\n try {\r\n expectOrThrow(state, TokenType.KEYWORD, \"if\");\r\n return { ...parseIfExpression(state), type: ExprType.ELSE_IF, pos };\r\n } catch {\r\n return { type: ExprType.ELSE, pos };\r\n }\r\n}\r\n\r\nfunction extractFnArgs(state: ParseState): Expr[] {\r\n const args: Expr[] = [];\r\n\r\n if (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \")\"\r\n ) {\r\n return args;\r\n }\r\n\r\n args.push(parseTernaryExpr(state));\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \",\"\r\n ) {\r\n state.cursor++;\r\n args.push(parseTernaryExpr(state));\r\n }\r\n\r\n return args;\r\n}\r\n\r\nfunction parsePrimaryExpr(state: ParseState): Expr {\r\n const token = state.tokens[state.cursor++];\r\n\r\n if (!token) {\r\n throw {\r\n message: \"Unexpected end of expression.\",\r\n pos: state.tokens[state.tokens.length - 1].pos,\r\n };\r\n }\r\n\r\n if (token.type === TokenType.NUMBER) {\r\n return { type: ExprType.NUMBER, value: token.value, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.STRING) {\r\n return { type: ExprType.STRING, value: token.value, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.KEYWORD) {\r\n if (token.value === \"for\" && state.cursor === 1) {\r\n return parseForLoop(state);\r\n }\r\n\r\n if (token.value === \"true\") {\r\n return { type: ExprType.BOOLEAN, true: true, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"false\") {\r\n return { type: ExprType.BOOLEAN, true: false, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"undefined\") {\r\n return { type: ExprType.UNDEFINED, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"null\") {\r\n return { type: ExprType.NULL, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"end\" && state.tokens.length === 1) {\r\n return { type: ExprType.END, pos: token.pos };\r\n }\r\n\r\n if (token.value === \"if\" && state.cursor === 1) {\r\n return parseIfExpression(state);\r\n }\r\n\r\n if (token.value === \"else\" && state.cursor === 1) {\r\n return parseElseExpression(state);\r\n }\r\n }\r\n\r\n if (token.type === TokenType.IDENT) {\r\n return { type: ExprType.IDENT, value: token.value, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.OPERATOR && token.value === \"(\") {\r\n const expr = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \")\");\r\n return { type: ExprType.GROUP, expr, pos: token.pos };\r\n }\r\n\r\n if (token.type === TokenType.OPERATOR && unaryOperators.has(token.value)) {\r\n const expr = parsePropertyAccess(state);\r\n return {\r\n type: ExprType.UNARY,\r\n operator: token.value,\r\n expr,\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n throw {\r\n message: `Unexpected token '${token.value}'.`,\r\n pos: token.pos,\r\n };\r\n}\r\n\r\nfunction parsePropertyAccess(state: ParseState): Expr {\r\n let left = parsePrimaryExpr(state);\r\n\r\n while (state.tokens[state.cursor]) {\r\n const token = state.tokens[state.cursor];\r\n\r\n if (token?.type === TokenType.OPERATOR && token?.value === \"(\") {\r\n state.cursor++;\r\n\r\n if (!state.generatingNamespace && !state.config.allowFnCalls) {\r\n throw {\r\n message: \"Function calls are not allowed.\",\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n const args = extractFnArgs(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \")\");\r\n\r\n left = {\r\n type: ExprType.CALL,\r\n expr: left,\r\n args,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (\r\n token?.type === TokenType.OPERATOR &&\r\n token?.value === \"?.\" &&\r\n state.tokens[state.cursor + 1]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor + 1]?.value === \"(\"\r\n ) {\r\n state.cursor += 2;\r\n\r\n if (!state.generatingNamespace && !state.config.allowFnCalls) {\r\n throw {\r\n message: \"Function calls are not allowed.\",\r\n pos: token.pos,\r\n };\r\n }\r\n\r\n const args = extractFnArgs(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \")\");\r\n\r\n left = {\r\n type: ExprType.CALL,\r\n expr: left,\r\n args,\r\n optional: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (\r\n token?.type === TokenType.OPERATOR &&\r\n propertyAccessOperators.has(token?.value)\r\n ) {\r\n const isNamespace = token.value === \"::\";\r\n const isBracketNotation = token.value === \"[\";\r\n const isOptional = token.value === \"?.\";\r\n\r\n state.cursor++;\r\n\r\n if (\r\n isNamespace &&\r\n (state.tokens[state.cursor - 2]?.type !== TokenType.IDENT ||\r\n state.tokens[state.cursor]?.type !== TokenType.IDENT)\r\n ) {\r\n throw {\r\n message: `Invalid namespaces access. Expected syntax <IDENTIFIER>::<IDENTIFIER>, but got '${state.tokens[state.cursor - 2]?.value}::${state.tokens[state.cursor]?.value ?? \"\"}' instead.`,\r\n pos:\r\n state.tokens[state.cursor]?.pos ??\r\n state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n if (isNamespace) {\r\n state.generatingNamespace = true;\r\n const right = parsePrimaryExpr(state);\r\n\r\n left = {\r\n type: ExprType.NAMESPACE,\r\n left,\r\n right,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (isBracketNotation) {\r\n const right = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\r\n\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n bracketNotation: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else if (isOptional) {\r\n if (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"[\"\r\n ) {\r\n state.cursor++;\r\n const right = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\r\n\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n bracketNotation: true,\r\n optional: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n } else {\r\n const right = parsePrimaryExpr(state);\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n optional: true,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n } else {\r\n const right = parsePrimaryExpr(state);\r\n left = {\r\n type: ExprType.PROP_ACCESS,\r\n left,\r\n right,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n state.generatingNamespace = false;\r\n return left;\r\n}\r\n\r\nfunction parseBinaryExpr(\r\n state: ParseState,\r\n leftParser: (state: ParseState) => Expr,\r\n operators: Set<string>,\r\n): Expr {\r\n let left = leftParser(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n operators.has(state.tokens[state.cursor]?.value)\r\n ) {\r\n const operator = state.tokens[state.cursor++].value;\r\n const right = leftParser(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseExponentiationExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parsePropertyAccess, exponentiationOperators);\r\n}\r\n\r\nfunction parseMultiplicativeExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(\r\n state,\r\n parseExponentiationExpr,\r\n multiplicativeOperators,\r\n );\r\n}\r\n\r\nfunction parseAdditiveExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseMultiplicativeExpr, additiveOperators);\r\n}\r\n\r\nfunction parseBitwiseExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseAdditiveExpr, bitwiseOperators);\r\n}\r\n\r\nfunction parseComparisonExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseBitwiseExpr, comparisonOperators);\r\n}\r\n\r\nfunction parseEqualityExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseComparisonExpr, equalityOperators);\r\n}\r\n\r\nfunction parseBitwiseOrExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseBitwiseXorExpr, bitwiseOrOperators);\r\n}\r\n\r\nfunction parseBitwiseXorExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseBitwiseAndExpr, bitwiseXorOperators);\r\n}\r\n\r\nfunction parseBitwiseAndExpr(state: ParseState): Expr {\r\n return parseBinaryExpr(state, parseEqualityExpr, bitwiseAndOperators);\r\n}\r\n\r\nfunction parseLogicalAndExpr(state: ParseState): Expr {\r\n let left = parseBitwiseOrExpr(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"&&\"\r\n ) {\r\n state.cursor++;\r\n const right = parseEqualityExpr(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator: \"&&\",\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseLogicalOrExpr(state: ParseState): Expr {\r\n let left = parseLogicalAndExpr(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"||\"\r\n ) {\r\n state.cursor++;\r\n const right = parseLogicalAndExpr(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator: \"||\",\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseNullishCoalesceExpr(state: ParseState): Expr {\r\n let left = parseLogicalOrExpr(state);\r\n\r\n while (\r\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\r\n state.tokens[state.cursor]?.value === \"??\"\r\n ) {\r\n state.cursor++;\r\n const right = parseLogicalOrExpr(state);\r\n left = {\r\n type: ExprType.BINARY,\r\n left,\r\n right,\r\n operator: \"??\",\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n }\r\n\r\n return left;\r\n}\r\n\r\nfunction parseTernaryExpr(state: ParseState): Expr {\r\n const condition = parseNullishCoalesceExpr(state);\r\n\r\n if (\r\n state.tokens[state.cursor]?.type !== TokenType.OPERATOR ||\r\n state.tokens[state.cursor]?.value !== \"?\"\r\n ) {\r\n return condition;\r\n }\r\n\r\n state.cursor++;\r\n const left = parseTernaryExpr(state);\r\n expectOrThrow(state, TokenType.OPERATOR, \":\");\r\n const right = parseTernaryExpr(state);\r\n\r\n return {\r\n type: ExprType.TERNARY,\r\n condition,\r\n left,\r\n right,\r\n pos: state.tokens[state.cursor - 1].pos,\r\n };\r\n}\r\n\r\nexport default function generateAst(\r\n tokens: Token[],\r\n config: { allowFnCalls: boolean },\r\n): Expr {\r\n const state: ParseState = {\r\n cursor: 0,\r\n tokens,\r\n config,\r\n generatingNamespace: false,\r\n };\r\n\r\n const ast = parseTernaryExpr(state);\r\n\r\n if (state.cursor !== state.tokens.length) {\r\n throw {\r\n pos: state.tokens[state.cursor].pos,\r\n message: `Expected token '${state.tokens[state.cursor].value}'.\\nExpected an operator or the end of the expression.`,\r\n };\r\n }\r\n\r\n return ast;\r\n}\r\n","import type { MutorConfig } from \"../types/types\";\r\n\r\nexport default function parse(\r\n templateBlock: string,\r\n { delimiters }: Pick<MutorConfig, \"delimiters\">,\r\n) {\r\n const openingTagWithWhitespaceCtrl = `${delimiters.openingTag}${delimiters.whitespaceTrim}`;\r\n const closingTagWithWhitespaceCtrl = `${delimiters.whitespaceTrim}${delimiters.closingTag}`;\r\n\r\n const leftTrim = templateBlock.startsWith(openingTagWithWhitespaceCtrl);\r\n const rightTrim = templateBlock.endsWith(closingTagWithWhitespaceCtrl);\r\n\r\n const openLen = leftTrim\r\n ? openingTagWithWhitespaceCtrl.length\r\n : delimiters.openingTag.length;\r\n const closeLen = rightTrim\r\n ? closingTagWithWhitespaceCtrl.length\r\n : delimiters.closingTag.length;\r\n\r\n const inner = templateBlock.slice(openLen, templateBlock.length - closeLen);\r\n const trimmed = inner.trim();\r\n\r\n const isComment = trimmed.startsWith(delimiters.commentTag);\r\n if (isComment) {\r\n return { isComment, leftTrim, rightTrim };\r\n }\r\n\r\n return {\r\n leftTrim,\r\n rightTrim,\r\n inner,\r\n isBlock:\r\n trimmed.startsWith(\"for\") ||\r\n trimmed.startsWith(\"if\") ||\r\n trimmed.startsWith(\"else\"),\r\n isBlockEnd: trimmed === \"end\",\r\n hasContext: trimmed.startsWith(\"for\"),\r\n requiresBlockClose: trimmed.startsWith(\"for\") || trimmed.startsWith(\"if\"),\r\n usesAwait: inner.includes(\"Mutor::await\"),\r\n };\r\n}\r\n","import { TokenType } from \"../types/enums\";\r\nimport type { Token } from \"../types/types\";\r\nimport { keywords, operators } from \"./constants\";\r\n\r\nconst IDENT_START_PATTERN = /[a-zA-Z$_]/;\r\nconst IDENT_PATTERN = /[a-zA-Z$_0-9]/;\r\nconst NUMBER_START_PATTERN = /[0-9]/;\r\nconst NUMBER_PATTERN = /[0-9.oxe]/;\r\nconst VALIDATION_PATTERN = /[a-zA-Z$_0-9\\s\\t\\r\\n'\"`]/;\r\n\r\nexport default function tokenize(expr: string) {\r\n let cursor = 0,\r\n char = \"\";\r\n const tokens: Token[] = [];\r\n\r\n function accumulateKeywordOrIdentifier() {\r\n let buffer = \"\";\r\n if (IDENT_START_PATTERN.test(char)) {\r\n let j = cursor;\r\n while (IDENT_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n tokens.push({\r\n type: keywords.has(buffer) ? TokenType.KEYWORD : TokenType.IDENT,\r\n value: buffer,\r\n pos: cursor,\r\n });\r\n\r\n cursor = j;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateStr() {\r\n if (char !== '\"' && char !== \"'\" && char !== \"`\") {\r\n return false;\r\n }\r\n\r\n const quote = char;\r\n const start = cursor;\r\n\r\n let j = cursor + 1;\r\n let buffer = \"\";\r\n\r\n while (j < expr.length) {\r\n const current = expr[j];\r\n\r\n // Escape sequence\r\n if (current === \"\\\\\") {\r\n // Ensure next char exists\r\n if (j + 1 >= expr.length) {\r\n throw {\r\n pos: j,\r\n message: \"Unexpected end of string after escape character.\",\r\n };\r\n }\r\n\r\n // Preserve escape exactly as written\r\n buffer += current;\r\n buffer += expr[j + 1];\r\n\r\n j += 2;\r\n continue;\r\n }\r\n\r\n // Closing quote\r\n if (current === quote) {\r\n break;\r\n }\r\n\r\n buffer += current;\r\n j++;\r\n }\r\n\r\n // Missing closing quote\r\n if (j >= expr.length || expr[j] !== quote) {\r\n throw {\r\n pos: start,\r\n message: `String literal missing closing ${quote}.`,\r\n };\r\n }\r\n\r\n tokens.push({\r\n type: TokenType.STRING,\r\n value: buffer,\r\n pos: start,\r\n });\r\n\r\n cursor = j;\r\n }\r\n\r\n function accumulateNumber() {\r\n if (NUMBER_START_PATTERN.test(char)) {\r\n let j = cursor,\r\n buffer = \"\";\r\n\r\n while (NUMBER_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n const numVal = Number(buffer);\r\n const isNan = Number.isNaN(numVal);\r\n\r\n if (isNan) {\r\n throw { pos: cursor, message: \"Found invalid number literal.\" };\r\n }\r\n\r\n tokens.push({ type: TokenType.NUMBER, value: `${numVal}`, pos: cursor });\r\n cursor = j - 1;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateOperator() {\r\n const op = `${char}${expr[cursor + 1]}`;\r\n if (operators.has(op)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: op, pos: cursor });\r\n cursor++;\r\n return;\r\n }\r\n\r\n if (operators.has(char)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: char, pos: cursor });\r\n return;\r\n }\r\n }\r\n\r\n while (cursor < expr.length) {\r\n char = expr[cursor];\r\n\r\n accumulateNumber();\r\n accumulateKeywordOrIdentifier();\r\n accumulateStr();\r\n accumulateOperator();\r\n\r\n if (\r\n !VALIDATION_PATTERN.test(char) &&\r\n !operators.has(char) &&\r\n !operators.has(expr[cursor - 1] + char)\r\n ) {\r\n throw {\r\n message: `Unexpected token '${char}' in expression.`,\r\n pos: cursor,\r\n };\r\n }\r\n\r\n cursor++;\r\n }\r\n\r\n return tokens.length\r\n ? tokens\r\n : [{ type: TokenType.STRING, value: \"\", pos: 0 }];\r\n}\r\n","import { BlockType } from \"../types/enums\";\r\nimport type { CompileMetadata, ForExpr, MutorConfig } from \"../types/types\";\r\nimport escapeRawText from \"../utils/escape-raw-text\";\r\nimport getLineNumberAndIndex from \"../utils/get-line-and-column-nums\";\r\nimport getLineSnapshot from \"../utils/get-line-snapshot\";\r\nimport build from \"./build\";\r\nimport { AsyncFunction } from \"./constants\";\r\nimport { MutorCompilerError } from \"./error\";\r\nimport generateAst from \"./generate-ast\";\r\nimport parse from \"./parse\";\r\nimport tokenize from \"./tokenize\";\r\n\r\nexport default function compile(\r\n src: string,\r\n config: MutorConfig,\r\n meta: CompileMetadata,\r\n) {\r\n const scope: string[] = [];\r\n const blockOpeningStack: { type: BlockType; pos: number }[] = [];\r\n const {\r\n delimiters,\r\n keepOpeningTagEscapeDelimiter,\r\n allowFnCalls,\r\n allowedProps,\r\n forbiddenProps,\r\n autoEscape,\r\n } = config;\r\n\r\n // Function mode (sync/async)\r\n let mode: \"sync\" | \"async\" = \"sync\";\r\n\r\n // Whitespace control state\r\n let trimNext = false,\r\n cursor = 0,\r\n body = `let acc=\"\";`;\r\n\r\n while (cursor < src.length) {\r\n const templateOpenTagIdx = src.indexOf(delimiters.openingTag, cursor);\r\n\r\n // Handle Final Text Chunk\r\n if (templateOpenTagIdx === -1) {\r\n let lastChunk = src.slice(cursor);\r\n if (trimNext) lastChunk = lastChunk.trimStart();\r\n if (lastChunk) body += `acc+=\\`${escapeRawText(lastChunk)}\\`;`;\r\n break;\r\n }\r\n\r\n // Escape Logic\r\n function isEscaped() {\r\n let j = templateOpenTagIdx,\r\n count = 0;\r\n while (\r\n j >= delimiters.openingTagEscape.length &&\r\n src.slice(j - delimiters.openingTagEscape.length, j) ===\r\n delimiters.openingTagEscape\r\n ) {\r\n count++;\r\n j -= delimiters.openingTagEscape.length;\r\n }\r\n return count % 2 === 1;\r\n }\r\n\r\n if (isEscaped()) {\r\n let escapedChunk = src.slice(\r\n cursor,\r\n keepOpeningTagEscapeDelimiter\r\n ? templateOpenTagIdx + delimiters.openingTagEscape.length + 1\r\n : templateOpenTagIdx - delimiters.openingTag.length + 1,\r\n );\r\n\r\n if (trimNext) {\r\n escapedChunk = escapedChunk.trimStart();\r\n trimNext = false;\r\n }\r\n\r\n body += `acc+=\\`${escapeRawText(escapedChunk)}\\`;`;\r\n\r\n if (!keepOpeningTagEscapeDelimiter) {\r\n body += `acc+=\\`${delimiters.openingTag}\\`;`;\r\n }\r\n\r\n cursor = templateOpenTagIdx + delimiters.openingTag.length;\r\n continue;\r\n }\r\n\r\n // Parse Tag Metadata (to check for leftTrim BEFORE processing rawText)\r\n const templateEndTagIdx = src.indexOf(\r\n delimiters.closingTag,\r\n templateOpenTagIdx,\r\n );\r\n\r\n if (templateEndTagIdx === -1) {\r\n const [line, lineIndex] = getLineNumberAndIndex(src, templateOpenTagIdx);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n\r\n throw new MutorCompilerError(\r\n \"No closing tag found.\",\r\n line,\r\n lineText,\r\n templateOpenTagIdx,\r\n meta.path,\r\n );\r\n }\r\n\r\n const template = src.slice(\r\n templateOpenTagIdx,\r\n templateEndTagIdx + delimiters.closingTag.length,\r\n );\r\n const {\r\n inner,\r\n leftTrim,\r\n rightTrim,\r\n isBlock,\r\n isBlockEnd,\r\n hasContext,\r\n requiresBlockClose,\r\n isComment,\r\n usesAwait,\r\n } = parse(template, { delimiters });\r\n\r\n // Switch to async mode is Mutor::await is used\r\n if (usesAwait && mode !== \"async\") {\r\n mode = \"async\";\r\n }\r\n\r\n // Process Raw Text (between cursor and current tag)\r\n let rawText = src.slice(cursor, templateOpenTagIdx);\r\n if (rawText) {\r\n if (trimNext) {\r\n rawText = rawText.trimStart();\r\n }\r\n\r\n if (leftTrim) {\r\n rawText = rawText.trimEnd();\r\n }\r\n\r\n if (rawText) {\r\n body += `acc+=\\`${escapeRawText(rawText)}\\`;`;\r\n }\r\n }\r\n\r\n // Reset after use\r\n trimNext = false;\r\n\r\n cursor = templateEndTagIdx + delimiters.closingTag.length;\r\n\r\n try {\r\n if (!isComment) {\r\n const tokens = tokenize(inner);\r\n const ast = generateAst(tokens, { allowFnCalls });\r\n\r\n if (isBlock && requiresBlockClose && hasContext) {\r\n scope.push((ast as ForExpr).variable);\r\n blockOpeningStack.push({\r\n type: BlockType.LOOP,\r\n pos: templateOpenTagIdx,\r\n });\r\n } else if (isBlock && requiresBlockClose && !hasContext) {\r\n blockOpeningStack.push({\r\n type: BlockType.NON_LOOP,\r\n pos: templateOpenTagIdx,\r\n });\r\n }\r\n\r\n if (isBlockEnd) {\r\n const lastBlockOpened = blockOpeningStack.pop();\r\n if (lastBlockOpened?.type === BlockType.LOOP) scope.pop();\r\n if (lastBlockOpened === undefined)\r\n throw {\r\n message: \"Unexpected end of block\",\r\n pos: templateOpenTagIdx,\r\n };\r\n }\r\n\r\n const js = build(ast, { allowedProps, forbiddenProps, scope });\r\n\r\n if (isBlock || isBlockEnd) {\r\n body += js;\r\n } else {\r\n // Only escape unknown values returned from fn calls or object property resolution\r\n // Values returned from Mutor::include should be taken as is.\r\n body +=\r\n // Escape the return values of unknown values at runtime\r\n autoEscape && !js.startsWith(\"namespaces.Mutor.include\")\r\n ? `acc+=escapeFn(${js});`\r\n : `acc+=${js};`;\r\n }\r\n }\r\n\r\n // Set state for the NEXT raw text chunk\r\n if (rightTrim) trimNext = true;\r\n } catch (e) {\r\n const { message, pos: relPos } = e as { message: string; pos: number };\r\n const delimitersLength = leftTrim\r\n ? delimiters.whitespaceTrim.length + delimiters.openingTag.length\r\n : delimiters.openingTag.length;\r\n\r\n const finalPos = templateOpenTagIdx + relPos + delimitersLength;\r\n\r\n const [line, lineIndex] = getLineNumberAndIndex(src, finalPos);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n\r\n throw new MutorCompilerError(\r\n message,\r\n line,\r\n lineText,\r\n finalPos - lineIndex,\r\n meta.path,\r\n );\r\n }\r\n }\r\n\r\n if (blockOpeningStack.length) {\r\n const lastPos = blockOpeningStack.pop()?.pos as number;\r\n const [line, lineIndex] = getLineNumberAndIndex(src, lastPos);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n throw new MutorCompilerError(\r\n \"Unclosed block detected.\",\r\n line,\r\n lineText,\r\n lastPos - lineIndex,\r\n meta.path,\r\n );\r\n }\r\n\r\n body += `return acc;`;\r\n return mode === \"async\"\r\n ? new AsyncFunction(\r\n \"ctx\",\r\n \"namespaces\",\r\n \"allowedProps\",\r\n \"forbiddenProps\",\r\n \"escapeFn\",\r\n \"validateComputedProps\",\r\n body,\r\n )\r\n : new Function(\r\n \"ctx\",\r\n \"namespaces\",\r\n \"allowedProps\",\r\n \"forbiddenProps\",\r\n \"escapeFn\",\r\n \"validateComputedProps\",\r\n body,\r\n );\r\n}\r\n","import type {\r\n MutorConfig,\r\n PartialMutorConfig,\r\n RuntimeFrame,\r\n} from \"../types/types\";\r\nimport createRuntimeFrame from \"../utils/create-runtime\";\r\nimport escapeFn from \"../utils/escape-fn\";\r\nimport validateComputedProp from \"../utils/validate-computed-prop\";\r\nimport validateContext from \"../utils/validate-context\";\r\nimport compile from \"./compile\";\r\nimport { defaultConfig, namespaces } from \"./constants\";\r\nimport { MutorCompilerError, MutorError } from \"./error\";\r\n\r\nexport default class MutorBase {\r\n protected __cacheSize = 0;\r\n protected __config: MutorConfig = { ...defaultConfig };\r\n protected __compiledTemplatesMap: Map<\r\n string,\r\n { fn: Function; size: number }\r\n > = new Map();\r\n protected __namespaces: Record<any, any> = {\r\n ...namespaces,\r\n Mutor: {\r\n await: async (value: any) => {\r\n return await value;\r\n },\r\n },\r\n };\r\n\r\n constructor(config: PartialMutorConfig = {}) {\r\n this.addConfig(config);\r\n }\r\n\r\n addConfig(conf: PartialMutorConfig): MutorConfig {\r\n const {\r\n autoEscape,\r\n delimiters: overrideDelimeters,\r\n allowedProps,\r\n forbiddenProps,\r\n keepOpeningTagEscapeDelimiter,\r\n allowFnCalls,\r\n cache,\r\n build,\r\n onIncludeFail,\r\n onIncludeError,\r\n } = conf;\r\n\r\n this.__config = {\r\n build: {\r\n include: new Set([...(build?.include || defaultConfig.build.include)]),\r\n exclude: new Set([\r\n ...defaultConfig.build.exclude,\r\n ...(build?.exclude || []),\r\n ]),\r\n },\r\n autoEscape: autoEscape === true ? true : autoEscape !== false,\r\n allowedProps: allowedProps || defaultConfig.allowedProps,\r\n allowFnCalls: !!allowFnCalls,\r\n onIncludeFail: onIncludeFail || defaultConfig.onIncludeFail,\r\n onIncludeError: onIncludeError || defaultConfig.onIncludeError,\r\n cache: { ...defaultConfig.cache, ...(cache || {}) },\r\n forbiddenProps: new Set([\r\n ...defaultConfig.forbiddenProps,\r\n ...(forbiddenProps || []),\r\n ]),\r\n keepOpeningTagEscapeDelimiter: keepOpeningTagEscapeDelimiter ?? false,\r\n delimiters: {\r\n ...defaultConfig.delimiters,\r\n ...(overrideDelimeters || {}),\r\n },\r\n };\r\n\r\n return this.__config;\r\n }\r\n\r\n restoreDefaultConfig() {\r\n this.__config = { ...defaultConfig };\r\n }\r\n\r\n compile(template: string, runtime?: RuntimeFrame): Function {\r\n return compile(template, this.__config, {\r\n path: runtime?.renderedPath || \"anonymous\",\r\n });\r\n }\r\n\r\n renderAsync(template: string, context: any): Promise<string> {\r\n return new Promise((resolve) => {\r\n resolve(this.render(template, context));\r\n });\r\n }\r\n\r\n render(template: string, context: any): string {\r\n const runtime = createRuntimeFrame(context, \"anonymous\");\r\n return this.__renderWithRuntime(template, runtime);\r\n }\r\n\r\n protected __renderWithRuntime(\r\n template: string,\r\n runtime: RuntimeFrame,\r\n ): string {\r\n const fn = this.compile(template, runtime);\r\n\r\n const result = fn(\r\n validateContext(runtime.context),\r\n this.__createNamespacesWithRuntime(runtime),\r\n this.__config.allowedProps,\r\n this.__config.forbiddenProps,\r\n escapeFn,\r\n validateComputedProp,\r\n );\r\n\r\n return result;\r\n }\r\n\r\n protected __createNamespacesWithRuntime(\r\n runtime: RuntimeFrame,\r\n ): Record<any, any> {\r\n return {\r\n ...this.__namespaces,\r\n Mutor: {\r\n ...this.__namespaces.Mutor,\r\n $$context: runtime.context,\r\n },\r\n };\r\n }\r\n\r\n protected handleError(\r\n err: unknown,\r\n from: string,\r\n path: string,\r\n absolutePath?: string,\r\n ): string {\r\n if (this.__config.onIncludeFail === \"throw\") {\r\n throw err instanceof MutorCompilerError\r\n ? err\r\n : new MutorError((err as Error).message);\r\n }\r\n\r\n const meta = { from, path, absolutePath };\r\n\r\n // Log error if onIncludeFail is set to \"ignore\" and onIncludeError is not defined\r\n if (\r\n this.__config.onIncludeFail === \"ignoreLog\" &&\r\n !this.__config.onIncludeError\r\n ) {\r\n err instanceof MutorCompilerError\r\n ? console.log(err)\r\n : console.log(`[Mutor.js]\\n${(err as Error).message}`);\r\n }\r\n\r\n return this.__config.onIncludeError?.(meta, err) ?? \"\";\r\n }\r\n\r\n protected createEntrySpaceForTemplate(targetSize: number): boolean {\r\n if (this.__cacheSize + targetSize < this.__config.cache.maxSize) {\r\n return true;\r\n }\r\n\r\n if (targetSize > this.__config.cache.maxSize) {\r\n return false;\r\n }\r\n\r\n const firstEntry = this.__compiledTemplatesMap.entries().next().value;\r\n\r\n if (firstEntry) {\r\n const [oldestKey, oldestData] = firstEntry;\r\n this.__compiledTemplatesMap.delete(oldestKey);\r\n this.__cacheSize -= oldestData.size;\r\n }\r\n\r\n return this.createEntrySpaceForTemplate(targetSize);\r\n }\r\n\r\n getDiagnostics() {\r\n const maxSize = this.__config.cache.maxSize;\r\n\r\n return {\r\n bytesUsed: this.__cacheSize,\r\n bytesMax: maxSize,\r\n readableUsed: `${(this.__cacheSize / 1024 / 1024).toFixed(2)} MB`,\r\n readableMax: `${(maxSize / 1024 / 1024).toFixed(2)} MB`,\r\n totalEntries: this.__compiledTemplatesMap.size,\r\n percentFull:\r\n maxSize > 0\r\n ? Math.min(100, Math.round((this.__cacheSize / maxSize) * 100))\r\n : 0,\r\n avgTemplateSize:\r\n this.__compiledTemplatesMap.size > 0\r\n ? Math.round(this.__cacheSize / this.__compiledTemplatesMap.size)\r\n : 0,\r\n };\r\n }\r\n\r\n protected register(identifier: string, template: string) {\r\n const templateSize = template.length * 2 + 500;\r\n\r\n if (this.__cacheSize + templateSize > this.__config.cache.maxSize) {\r\n if (!this.createEntrySpaceForTemplate(templateSize)) {\r\n throw new MutorError(\r\n `The template for the component '${identifier}' is too large and will not fit in the cache. Consider increasing 'cache.maxSize' in the config`,\r\n );\r\n }\r\n }\r\n\r\n // Use a temporary runtime for compilation context\r\n const tempRuntime = createRuntimeFrame(null, identifier);\r\n\r\n this.__cacheSize += template.length * 2 + 500;\r\n this.__compiledTemplatesMap.set(identifier, {\r\n fn: this.compile(template, tempRuntime),\r\n size: templateSize,\r\n });\r\n }\r\n\r\n reset() {\r\n this.__config = { ...defaultConfig };\r\n this.__compiledTemplatesMap.clear();\r\n this.__cacheSize = 0;\r\n }\r\n}\r\n","import Mutor from \"./core/mutor.server\";\r\n\r\nexport * from \"./types/enums\";\r\nexport * from \"./types/types\";\r\n\r\nexport default Mutor;\r\n"],"mappings":"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","names":["readFileSync","copyFile","mkdir","readdir","readFile","writeFile","extname","join","createRuntimeFrame","context","renderedPath","constructPointer","pos","offset","MutorError","_MutorError","message","MutorCompilerError","_MutorCompilerError","line","lineText","column","file","gutterWidth","report","constructPointer","keywords","operators","equalityOperators","comparisonOperators","bitwiseOperators","additiveOperators","multiplicativeOperators","propertyAccessOperators","unaryOperators","bitwiseOrOperators","bitwiseXorOperators","bitwiseAndOperators","exponentiationOperators","ESCAPE_MAP","defaultConfig","namespaces","value","space","MutorError","str","obj","key","entries","keys","result","args","arr","size","i","start","end","step","radix","min","max","digits","x","base","exponent","date","d","AsyncFunction","escapeFn","char","ESCAPE_MAP","dirname","isAbsolute","resolve","toAbsolutePath","basePath","relativePaths","absoluteBase","baseDir","validateComputedProp","r","allowedProps","forbiddenProps","MutorError","OBJECT","MUTOR_SAFE","isPromiseLike","value","walk","path","seen","k","v","next","proto","MutorError","i","descriptors","key","desc","validateContext","ctx","safeData","TokenType","ExprType","LoopType","BlockType","escapeRawText","text","getLineAndColumnNumbers","str","idx","line","lineIndex","getLineSnapshot","str","lineIdx","nextNewlineIdx","prefixWithCtx","state","expr","buildNamespace","leftValue","rightValue","buildPropAccess","left","buildExpr","optionalChain","right","propName","buildCall","func","args","arg","buildForLoop","iterable","loopType","variable","loopOperator","build","buildIfBlock","condition","buildElseIfBlock","type","escapeRawText","operator","innerExpr","MutorError","ast","context","result","getTokenTypeWords","type","expectOrThrow","state","type","value","token","lastToken","getTokenTypeWords","parseForLoop","pos","variable","loopType","iterable","parseTernaryExpr","parseIfExpression","condition","parseElseExpression","extractFnArgs","args","parsePrimaryExpr","expr","unaryOperators","parsePropertyAccess","left","propertyAccessOperators","isNamespace","isBracketNotation","isOptional","right","parseBinaryExpr","leftParser","operators","operator","parseExponentiationExpr","exponentiationOperators","parseMultiplicativeExpr","multiplicativeOperators","parseAdditiveExpr","additiveOperators","parseBitwiseExpr","bitwiseOperators","parseComparisonExpr","comparisonOperators","parseEqualityExpr","equalityOperators","parseBitwiseOrExpr","parseBitwiseXorExpr","bitwiseOrOperators","parseBitwiseAndExpr","bitwiseXorOperators","bitwiseAndOperators","parseLogicalAndExpr","parseLogicalOrExpr","parseNullishCoalesceExpr","generateAst","tokens","config","ast","parse","templateBlock","delimiters","openingTagWithWhitespaceCtrl","closingTagWithWhitespaceCtrl","leftTrim","rightTrim","openLen","closeLen","inner","trimmed","isComment","IDENT_START_PATTERN","IDENT_PATTERN","NUMBER_START_PATTERN","NUMBER_PATTERN","VALIDATION_PATTERN","tokenize","expr","cursor","char","tokens","accumulateKeywordOrIdentifier","buffer","j","keywords","accumulateStr","quote","start","current","accumulateNumber","numVal","accumulateOperator","op","operators","compile","src","config","meta","scope","blockOpeningStack","delimiters","keepOpeningTagEscapeDelimiter","allowFnCalls","allowedProps","forbiddenProps","autoEscape","mode","trimNext","cursor","body","isEscaped","j","templateOpenTagIdx","count","lastChunk","escapeRawText","escapedChunk","templateEndTagIdx","line","lineIndex","getLineAndColumnNumbers","lineText","getLineSnapshot","MutorCompilerError","template","inner","leftTrim","rightTrim","isBlock","isBlockEnd","hasContext","requiresBlockClose","isComment","usesAwait","parse","rawText","tokens","tokenize","ast","generateAst","lastBlockOpened","js","build","e","message","relPos","delimitersLength","finalPos","lastPos","AsyncFunction","MutorBase","config","defaultConfig","namespaces","value","conf","autoEscape","overrideDelimeters","allowedProps","forbiddenProps","keepOpeningTagEscapeDelimiter","allowFnCalls","cache","build","onIncludeFail","onIncludeError","template","runtime","compile","context","resolve","createRuntimeFrame","validateContext","escapeFn","validateComputedProp","err","from","path","absolutePath","MutorCompilerError","MutorError","meta","targetSize","firstEntry","oldestKey","oldestData","maxSize","identifier","templateSize","tempRuntime","MutorServer","MutorBase","config","runtime","path","context","resolvedPath","toAbsolutePath","MutorError","previousPath","err","template","createRuntimeFrame","resolve","absolutePath","compiled","previousContext","entry","readFileSync","templateSize","validateContext","escapeFn","validateComputedProp","src","destination","absoluteDestinationPath","absoluteSrcPath","mkdir","entries","readdir","srcPath","join","destinationPath","extension","extname","rendered","writeFile","copyFile","readFile","server_default","MutorServer"]}
1
+ {"version":3,"sources":["../src/core/mutor.server.ts","../src/utils/create-runtime.ts","../src/utils/construct-pointer.ts","../src/core/error.ts","../src/core/constants.ts","../src/utils/escape-fn.ts","../src/utils/to-absolute-path.ts","../src/utils/validate-computed-prop.ts","../src/utils/validate-context.ts","../src/types/enums.ts","../src/utils/escape-raw-text.ts","../src/utils/get-line-and-column-nums.ts","../src/utils/get-line-snapshot.ts","../src/core/build.ts","../src/utils/get-token-type-words.ts","../src/core/generate-ast.ts","../src/core/parse.ts","../src/core/tokenize.ts","../src/core/compile.ts","../src/core/mutor.base.ts","../src/server.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport {\n copyFile,\n mkdir,\n readdir,\n readFile,\n writeFile,\n} from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport type { PartialMutorConfig, RuntimeFrame } from \"../types/types\";\nimport createRuntimeFrame from \"../utils/create-runtime\";\nimport escapeFn from \"../utils/escape-fn\";\nimport toAbsolutePath from \"../utils/to-absolute-path\";\nimport validateComputedProp from \"../utils/validate-computed-prop\";\nimport validateContext from \"../utils/validate-context\";\nimport { MutorError } from \"./error\";\nimport MutorBase from \"./mutor.base\";\n\nexport default class MutorServer extends MutorBase {\n constructor(config: PartialMutorConfig = {}) {\n super(config);\n }\n\n /**\n * Set up the include namespace with the given runtime.\n * This must be done before rendering to ensure includes have access to the runtime.\n */\n private __setupIncludeForRuntime(runtime: RuntimeFrame) {\n this.__namespaces.Mutor.include = (path: string, context: any) => {\n const resolvedPath = toAbsolutePath(runtime.renderedPath, path);\n\n if (runtime.includeStack.has(resolvedPath)) {\n throw new MutorError(\n `Circular include detected.\\n${Array.from(runtime.includeStack).join(\"\\n\")}\\n${resolvedPath}`,\n );\n }\n\n const previousPath = runtime.renderedPath;\n runtime.includeStack.add(resolvedPath);\n runtime.renderedPath = resolvedPath;\n\n try {\n return this.__renderFile(\n resolvedPath,\n context ?? runtime.context,\n runtime,\n );\n } catch (err) {\n return this.handleError(err, previousPath, path, resolvedPath);\n } finally {\n runtime.includeStack.delete(resolvedPath);\n runtime.renderedPath = previousPath;\n }\n };\n }\n\n render(template: string, context: any): string {\n const runtime = createRuntimeFrame(context, \"anonymous\");\n this.__setupIncludeForRuntime(runtime);\n return this.__renderWithRuntime(template, runtime);\n }\n\n renderAsync(template: string, context: any): Promise<string> {\n return new Promise((resolve) => {\n resolve(this.render(template, context));\n });\n }\n\n private __renderFile(path: string, context: any, runtime: RuntimeFrame) {\n this.__setupIncludeForRuntime(runtime);\n\n const absolutePath = toAbsolutePath(path);\n let compiled: Function;\n\n // Save previous state for nested renders\n const previousContext = runtime.context;\n const previousPath = runtime.renderedPath;\n\n // Update runtime for this render\n runtime.context = context ?? previousContext;\n runtime.renderedPath = absolutePath;\n\n try {\n if (\n this.__config.cache.active &&\n this.__compiledTemplatesMap.has(absolutePath)\n ) {\n const entry = this.__compiledTemplatesMap.get(absolutePath)!;\n\n compiled = entry.fn;\n\n // Move to the front of the cache\n this.__compiledTemplatesMap.delete(absolutePath);\n this.__compiledTemplatesMap.set(absolutePath, entry);\n } else {\n const template = readFileSync(absolutePath, \"utf-8\");\n compiled = this.compile(template, runtime);\n\n if (this.__config.cache.active) {\n const templateSize = template.length * 2 + 500;\n\n if (this.__cacheSize + templateSize > this.__config.cache.maxSize) {\n if (this.createEntrySpaceForTemplate(templateSize)) {\n this.__compiledTemplatesMap.set(absolutePath, {\n fn: compiled,\n size: templateSize,\n });\n this.__cacheSize += templateSize;\n }\n } else {\n this.__compiledTemplatesMap.set(absolutePath, {\n fn: compiled,\n size: templateSize,\n });\n this.__cacheSize += templateSize;\n }\n }\n }\n\n const result = compiled(\n validateContext(runtime.context),\n this.__createNamespacesWithRuntime(runtime),\n this.__config.allowedProps,\n this.__config.forbiddenProps,\n escapeFn,\n validateComputedProp,\n );\n\n return result;\n } finally {\n // Restore previous state\n runtime.context = previousContext;\n runtime.renderedPath = previousPath;\n }\n }\n\n renderFile(path: string, context: any): string {\n return this.__renderFile(path, context, createRuntimeFrame(null, path));\n }\n\n renderFileAsync(path: string, context: any): Promise<string> {\n return new Promise((resolve) => {\n resolve(this.renderFile(path, context));\n });\n }\n\n async buildDir(src: string, destination: string, context: any) {\n const absoluteDestinationPath = toAbsolutePath(destination);\n const absoluteSrcPath = toAbsolutePath(src);\n\n await mkdir(absoluteDestinationPath, { recursive: true });\n\n const entries = await readdir(absoluteSrcPath, { withFileTypes: true });\n await Promise.all(\n entries.map(async (entry) => {\n const srcPath = join(absoluteSrcPath, entry.name);\n const destinationPath = join(absoluteDestinationPath, entry.name);\n\n if (this.__config.build.exclude.has(entry.name)) {\n return;\n }\n\n if (entry.isDirectory()) {\n return this.buildDir(srcPath, destinationPath, context);\n }\n\n const extension = extname(srcPath);\n\n if (this.__config.build.include.has(extension)) {\n const rendered = this.renderFile(srcPath, context);\n await writeFile(destinationPath, rendered, \"utf-8\");\n } else {\n return await copyFile(srcPath, destinationPath);\n }\n }),\n );\n }\n\n async compileDir(src: string) {\n const absolutePath = toAbsolutePath(src);\n const entries = await readdir(absolutePath, { withFileTypes: true });\n\n await Promise.all(\n entries.map(async (entry) => {\n const absoluteSrcPath = join(absolutePath, entry.name);\n\n if (this.__config.build.exclude.has(entry.name)) {\n return;\n }\n\n if (entry.isDirectory()) {\n return this.compileDir(absoluteSrcPath);\n }\n\n const extension = extname(absoluteSrcPath);\n\n if (this.__config.build.include.has(extension)) {\n const template = await readFile(absoluteSrcPath, \"utf-8\");\n this.register(absoluteSrcPath, template);\n }\n }),\n );\n }\n}\n","import type { RuntimeFrame } from \"../types/types\";\r\n\r\nexport default function createRuntimeFrame(\r\n context: any,\r\n renderedPath: string = \"\",\r\n): RuntimeFrame {\r\n return {\r\n context,\r\n renderedPath,\r\n includeStack: new Set([renderedPath && renderedPath]),\r\n };\r\n}\r\n","/**\n * Creates a visual text-based pointer `^`.\n * @param pos The position in the text to be pointed at.\n * @param offset The offset to the left to compensate for line numbering.\n * @returns\n */\nexport default function constructPointer(pos: number, offset: number) {\n // pos is the index in the text, offset is the width of \"Line | \"\n return `${\" \".repeat(pos + offset)}^`;\n}\n","import constructPointer from \"../utils/construct-pointer\";\n\nexport class MutorError extends Error {\n public name = \"MutorError\";\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, MutorError.prototype);\n }\n}\n\nexport class MutorCompilerError extends MutorError {\n public name = \"MutorCompilerError\";\n\n constructor(\n message: string,\n line: number,\n lineText: string,\n column: number, // 0-indexed column from snapshot\n file: string,\n ) {\n // Dynamic gutter width for alignment\n const gutterWidth = line.toString().length + 2;\n let report = `${message}\\n\\n`;\n\n report += `at ${file}:${line}:${column + 1}\\n`;\n\n // Line snippet with gutter\n if (line > 1) {\n report += `${(line - 1).toString().padStart(gutterWidth - 2)} | ...\\n`;\n }\n\n report += `${line} | ${lineText}\\n`;\n // Visual Pointer\n report += constructPointer(column, gutterWidth + 1);\n\n super(report);\n Object.setPrototypeOf(this, MutorCompilerError.prototype);\n }\n}\n","import type { MutorConfig } from \"../types/types\";\nimport { MutorError } from \"./error\";\n\nexport const keywords = new Set([\n \"for\",\n \"if\",\n \"else\",\n \"true\",\n \"false\",\n \"null\",\n \"undefined\",\n \"end\",\n \"in\",\n \"of\",\n]);\n\nexport const operators = new Set([\n \"::\",\n \"||\",\n \"??\",\n \"&&\",\n \"**\",\n \"^\",\n \"|\",\n \"&\",\n \"!\",\n \"-\",\n \"%\",\n \"+\",\n \"*\",\n \"/\",\n \">\",\n \"<\",\n \">=\",\n \"<=\",\n \"==\",\n \"!=\",\n \">>\",\n \"<<\",\n \".\",\n \"?.\",\n \"(\",\n \")\",\n \"[\",\n \"]\",\n \",\",\n \":\",\n \"?\",\n]);\n\nexport const logicalOperators = new Set([\"&&\", \"||\", \"??\"]);\n\nexport const equalityOperators = new Set([\"==\", \"!=\"]);\n\nexport const comparisonOperators = new Set([\">\", \"<\", \">=\", \"<=\"]);\n\nexport const bitwiseOperators = new Set([\">>\", \"<<\", \"^\", \"|\", \"&\"]);\n\nexport const additiveOperators = new Set([\"+\", \"-\"]);\n\nexport const multiplicativeOperators = new Set([\"*\", \"/\", \"%\"]);\n\nexport const propertyAccessOperators = new Set([\".\", \"?.\", \"[\", \"::\"]);\n\nexport const unaryOperators = new Set([\"-\", \"+\", \"!\"]);\n\nexport const bitwiseOrOperators = new Set([\"|\"]);\n\nexport const bitwiseXorOperators = new Set([\"^\"]);\n\nexport const bitwiseAndOperators = new Set([\"&\"]);\n\nexport const exponentiationOperators = new Set([\"**\"]);\n\nexport const ESCAPE_MAP: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n};\n\nexport const defaultConfig: MutorConfig = {\n build: {\n include: new Set([\".html\", \".txt\"]),\n exclude: new Set([\"node_modules\", \".git\"]),\n },\n autoEscape: true,\n allowedProps: new Set(),\n forbiddenProps: new Set([\"__proto__\", \"constructor\", \"prototype\"]),\n allowFnCalls: false,\n delimiters: {\n closingTag: \"}}\",\n openingTag: \"{{\",\n openingTagEscape: \"\\\\\",\n whitespaceTrim: \"~\",\n commentTag: \"#\",\n },\n keepOpeningTagEscapeDelimiter: false,\n onIncludeFail: \"throw\",\n cache: {\n active: true,\n maxSize: 50 * 1024 * 1024, // 50MB\n },\n};\n\nexport const namespaces = {\n JSON: {\n stringify(value: any, space?: number) {\n try {\n return JSON.stringify(value, null, space);\n } catch {\n throw new MutorError(\"JSON::stringify failed\");\n }\n },\n\n parse(str: string) {\n if (typeof str !== \"string\") {\n throw new MutorError(\"JSON::parse expects a string\");\n }\n\n try {\n return JSON.parse(str);\n } catch {\n throw new MutorError(\"JSON::parse failed: invalid JSON string\");\n }\n },\n },\n\n Object: {\n keys(obj: object) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::keys expects an object\");\n }\n\n return Object.keys(obj);\n },\n\n values(obj: object) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::values expects an object\");\n }\n\n return Object.values(obj);\n },\n\n entries(obj: object) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::entries expects an object\");\n }\n\n return Object.entries(obj);\n },\n\n hasOwn(obj: object, key: any) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::hasOwn expects an object\");\n }\n\n return Object.hasOwn(obj, key);\n },\n\n fromEntries(entries: any[]) {\n if (!Array.isArray(entries)) {\n throw new MutorError(\"Object::fromEntries expects an array\");\n }\n\n return Object.fromEntries(entries);\n },\n\n pick(obj: Record<string, any>, keys: string[]) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::pick expects an object\");\n }\n\n if (!Array.isArray(keys)) {\n throw new MutorError(\"Object::pick expects an array of keys\");\n }\n\n const result: Record<string, any> = {};\n\n for (const key of keys) {\n if (Object.hasOwn(obj, key)) {\n result[key] = obj[key];\n }\n }\n\n return result;\n },\n\n omit(obj: Record<string, any>, keys: string[]) {\n if (!obj || typeof obj !== \"object\") {\n throw new MutorError(\"Object::omit expects an object\");\n }\n\n if (!Array.isArray(keys)) {\n throw new MutorError(\"Object::omit expects an array of keys\");\n }\n\n const result = { ...obj };\n\n for (const key of keys) {\n delete result[key];\n }\n\n return result;\n },\n },\n\n Array: {\n isArray(value: any) {\n return Array.isArray(value);\n },\n\n from(value: any) {\n return Array.from(value);\n },\n\n of(...args: any[]) {\n return Array.of(...args);\n },\n\n unique(arr: any[]) {\n if (!Array.isArray(arr)) {\n throw new MutorError(\"Array::unique expects an array\");\n }\n\n return [...new Set(arr)];\n },\n\n compact(arr: any[]) {\n if (!Array.isArray(arr)) {\n throw new MutorError(\"Array::compact expects an array\");\n }\n\n return arr.filter(Boolean);\n },\n\n chunk(arr: any[], size: number) {\n if (!Array.isArray(arr)) {\n throw new MutorError(\"Array::chunk expects an array\");\n }\n\n if (!Number.isInteger(size) || size <= 0) {\n throw new MutorError(\"Array::chunk expects a positive integer size\");\n }\n\n const result = [];\n\n for (let i = 0; i < arr.length; i += size) {\n result.push(arr.slice(i, i + size));\n }\n\n return result;\n },\n\n range(start: number, end: number, step = 1) {\n if (\n !Number.isFinite(start) ||\n !Number.isFinite(end) ||\n !Number.isFinite(step)\n ) {\n throw new MutorError(\"Array::range expects finite numbers\");\n }\n if (step === 0) {\n throw new MutorError(\"Array::range step cannot be 0\");\n }\n\n // Validate directionality to prevent infinite loops\n if ((start <= end && step < 0) || (start > end && step > 0)) {\n throw new MutorError(\n \"Invalid step direction: step must match range direction\",\n );\n }\n\n const result = [];\n for (let i = start; start <= end ? i <= end : i >= end; i += step) {\n result.push(i);\n }\n\n return result;\n },\n },\n\n Number: {\n isFinite(value: number) {\n return Number.isFinite(value);\n },\n\n isNaN(value: any) {\n return Number.isNaN(value);\n },\n\n isInteger(value: any) {\n return Number.isInteger(value);\n },\n\n parseInt(value: string, radix = 10) {\n return Number.parseInt(value, radix);\n },\n\n parseFloat(value: string) {\n return Number.parseFloat(value);\n },\n\n clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n },\n\n toFixed(value: number, digits = 0) {\n if (typeof value !== \"number\") {\n throw new MutorError(\"Number::toFixed expects a number\");\n }\n\n return value.toFixed(digits);\n },\n\n random(min = 0, max = 1) {\n return Math.random() * (max - min) + min;\n },\n },\n\n String: {\n fromCharCode(...args: number[]) {\n return String.fromCharCode(...args);\n },\n\n capitalize(value: string) {\n if (typeof value !== \"string\") {\n throw new MutorError(\"String::capitalize expects a string\");\n }\n\n if (!value.length) {\n return value;\n }\n\n return value[0].toUpperCase() + value.slice(1);\n },\n },\n\n Math: {\n abs(x: number) {\n return Math.abs(x);\n },\n\n floor(x: number) {\n return Math.floor(x);\n },\n\n ceil(x: number) {\n return Math.ceil(x);\n },\n\n round(x: number) {\n return Math.round(x);\n },\n\n trunc(x: number) {\n return Math.trunc(x);\n },\n\n sign(x: number) {\n return Math.sign(x);\n },\n\n sqrt(x: number) {\n return Math.sqrt(x);\n },\n\n pow(base: number, exponent: number) {\n return base ** exponent;\n },\n\n max(...args: number[]) {\n return Math.max(...args);\n },\n\n min(...args: number[]) {\n return Math.min(...args);\n },\n\n random() {\n return Math.random();\n },\n\n PI: Math.PI,\n },\n\n Date: {\n now() {\n return Date.now();\n },\n\n parse(str: string) {\n if (typeof str !== \"string\") {\n throw new MutorError(\"Date::parse expects a string\");\n }\n\n return Date.parse(str);\n },\n\n new(date?: string | number) {\n if (date === undefined) {\n return new Date();\n }\n\n return new Date(date);\n },\n\n iso(date?: string | number | Date) {\n const d = new Date(date ?? Date.now());\n if (Number.isNaN(d.getTime()))\n throw new MutorError(\"Invalid date provided to Date::iso\");\n return d.toISOString();\n },\n\n timestamp(date?: string | number | Date) {\n return new Date(date ?? Date.now()).getTime();\n },\n },\n\n Boolean: {\n valueOf(value: any) {\n return Boolean(value);\n },\n },\n\n URL: {\n encode(value: string) {\n if (typeof value !== \"string\") {\n throw new MutorError(\"URL::encode expects a string\");\n }\n\n return encodeURIComponent(value);\n },\n\n decode(value: string) {\n if (typeof value !== \"string\") {\n throw new MutorError(\"URL::decode expects a string\");\n }\n\n return decodeURIComponent(value);\n },\n },\n};\n\nexport const AsyncFunction = (async () => {})\n .constructor as FunctionConstructor;\n","import { ESCAPE_MAP } from \"../core/constants\";\n\n/**\n * Escapes HTML special characters in a string.\n * @param e The value to escape.\n * @returns The escaped string or the original value if not a string.\n */\nexport default function escapeFn(e: unknown): unknown {\n if (typeof e !== \"string\") return e;\n return /[&<>\"']/.test(e)\n ? e.replace(/[&<>\"']/g, (char) => ESCAPE_MAP[char])\n : e;\n}\n","import { dirname, isAbsolute, resolve } from \"node:path\";\n\nexport default function toAbsolutePath(\n basePath: string,\n ...relativePaths: string[]\n) {\n const absoluteBase = isAbsolute(basePath)\n ? basePath\n : resolve(process.cwd(), basePath);\n\n if (relativePaths.length) {\n const baseDir = dirname(absoluteBase);\n return resolve(baseDir, ...relativePaths);\n }\n\n return absoluteBase;\n}\n","import { MutorError } from \"../core/error\";\n\nexport default function validateComputedProp(\n r: string | number,\n allowedProps: Set<string | number>,\n forbiddenProps: Set<string | number>,\n): string | number {\n if (forbiddenProps.has(r) && !allowedProps.has(r)) {\n throw new MutorError(\n `Forbidden property access.\\nAccess to this computed property '${r}' is forbidden.`,\n );\n }\n return r;\n}\n","import { MutorError } from \"../core/error\";\r\n\r\nconst OBJECT = \"object\";\r\nexport const MUTOR_SAFE = Symbol(\"__mutor_safe_context\");\r\n\r\nfunction isPromiseLike(value: any) {\r\n return (\r\n value &&\r\n (typeof value === OBJECT || typeof value === \"function\") &&\r\n typeof value.then === \"function\"\r\n );\r\n}\r\n\r\nfunction walk(value: any, path = \"\", seen = new Set()) {\r\n if (!value || typeof value !== OBJECT) {\r\n return value;\r\n }\r\n\r\n if (isPromiseLike(value)) {\r\n return value;\r\n }\r\n\r\n if (seen.has(value)) {\r\n return value;\r\n }\r\n\r\n seen.add(value);\r\n\r\n if (value instanceof Map) {\r\n for (const [k, v] of value.entries()) {\r\n if (typeof k === OBJECT) walk(k, `${path}.mapKey`, seen);\r\n value.set(k, walk(v, `${path}.mapValue`, seen));\r\n }\r\n\r\n return value;\r\n }\r\n\r\n if (value instanceof Set) {\r\n const next = new Set();\r\n\r\n for (const v of value.values()) {\r\n next.add(walk(v, path, seen));\r\n }\r\n\r\n value.clear();\r\n\r\n for (const v of next) {\r\n value.add(v);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n\r\n if (proto !== Object.prototype && proto !== Array.prototype) {\r\n throw new MutorError(\r\n `Unsafe prototype detected at ${path || \"root\"} in context.`,\r\n );\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (let i = 0; i < value.length; i++) {\r\n value[i] = walk(value[i], `${path}[${i}]`, seen);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n const descriptors = Object.getOwnPropertyDescriptors(value);\r\n\r\n for (const key of Object.keys(descriptors)) {\r\n const desc = descriptors[key];\r\n\r\n if (desc.get || desc.set) {\r\n throw new MutorError(\r\n `Getter/setter not allowed at '${path}.${key}' in context.`,\r\n );\r\n }\r\n\r\n value[key] = walk(value[key], `${path}.${key}`, seen);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport default function validateContext(ctx: unknown) {\r\n if (!ctx || typeof ctx !== OBJECT) {\r\n return ctx;\r\n }\r\n\r\n if (MUTOR_SAFE in (ctx as object)) {\r\n return ctx;\r\n }\r\n\r\n const safeData = walk(ctx);\r\n\r\n if (safeData && typeof safeData === OBJECT) {\r\n Object.defineProperty(safeData, MUTOR_SAFE, {\r\n value: true,\r\n enumerable: false,\r\n writable: false,\r\n configurable: false,\r\n });\r\n }\r\n\r\n return safeData;\r\n}\r\n","export enum TokenType {\n IDENT,\n KEYWORD,\n NUMBER,\n STRING,\n OPERATOR,\n}\n\nexport enum ExprType {\n BINARY,\n TERNARY,\n UNARY,\n CALL,\n STRING,\n NUMBER,\n NAMESPACE,\n IDENT,\n PROP_ACCESS,\n GROUP,\n BOOLEAN,\n UNDEFINED,\n NULL,\n FOR,\n IF,\n ELSE_IF,\n ELSE,\n END,\n}\n\nexport enum LoopType {\n OF,\n IN,\n}\n\nexport enum BlockType {\n LOOP,\n NON_LOOP,\n}\n","export default function escapeRawText(text: string) {\n return text.replace(/\\\\/g, \"\\\\\\\\\").replace(/`/g, \"\\\\`\").replace(/\\$/g, \"\\\\$\");\n}\n","/**\n * Counts the number of lines that comes before a given index, effectively returning the line and column numbers of the character at that index.\n * @param str The source string.\n * @param idx The index to find its line number.\n */\nexport default function getLineAndColumnNumbers(str: string, idx: number) {\n const lines = str.slice(0, idx).split(\"\\n\");\n const line = lines.length;\n // The index where the current line starts\n const lineIndex = str.lastIndexOf(\"\\n\", idx - 1) + 1;\n\n return [line, lineIndex];\n}\n","/**\n * Extracts the snapshot of a line from a given text.\n * @param str The source string.\n * @param lineIdx The index of the newline character to snap.\n */\nexport default function getLineSnapshot(str: string, lineIdx: number) {\n const nextNewlineIdx = str.indexOf(\"\\n\", lineIdx);\n const line = str\n .slice(lineIdx, nextNewlineIdx === -1 ? undefined : nextNewlineIdx)\n .replaceAll(\"\\t\", \" \");\n\n return line;\n}\n","import { ExprType, LoopType } from \"../types/enums\";\nimport type {\n BuildContext,\n BuildState,\n CallExpr,\n ElseIfExpr,\n Expr,\n ForExpr,\n IdentExpr,\n IfExpr,\n NamespaceExpr,\n PropAccessExpr,\n} from \"../types/types\";\nimport escapeRawText from \"../utils/escape-raw-text\";\nimport { MutorError } from \"./error\";\n\nfunction prefixWithCtx(state: BuildState, expr: IdentExpr): string {\n if (\n state.forbiddenProps.has(expr.value) &&\n !state.allowedProps.has(expr.value)\n ) {\n throw { message: `Property \"${expr.value}\" is forbidden.`, pos: expr.pos };\n }\n\n return state.scope.includes(expr.value) ? expr.value : `ctx.${expr.value}`;\n}\n\nfunction buildNamespace(expr: NamespaceExpr): string {\n if (expr.left.type !== ExprType.IDENT) {\n throw {\n message: \"Invalid usage of namespace operator.\",\n pos: expr.pos,\n };\n }\n const leftValue = (expr.left as IdentExpr).value;\n const rightValue = (expr.right as IdentExpr).value;\n return `namespaces.${leftValue}.${rightValue}`;\n}\n\nfunction buildPropAccess(state: BuildState, expr: PropAccessExpr): string {\n const left = buildExpr(state, expr.left);\n const optionalChain = expr.optional ? \"?.\" : \"\";\n\n if (expr.bracketNotation) {\n const right = buildExpr(state, expr.right);\n\n if (\n expr.right.type === ExprType.STRING &&\n state.forbiddenProps.has(right.replaceAll(/^`|`$/gm, \"\"))\n ) {\n throw {\n message: \"Forbidden property access.\",\n pos: expr.right.pos,\n };\n }\n\n return expr.right.type === ExprType.STRING ||\n expr.right.type === ExprType.NUMBER\n ? `${left}${optionalChain}[${right}]`\n : `${left}${optionalChain}[validateComputedProps(${right}, allowedProps, forbiddenProps)]`;\n }\n\n const propName = (expr.right as IdentExpr).value;\n\n if (state.forbiddenProps.has(propName) && !state.allowedProps.has(propName)) {\n throw { message: \"Forbidden property access.\", pos: expr.right.pos };\n }\n\n return `${left}${optionalChain}.${propName}`;\n}\n\nfunction buildCall(state: BuildState, expr: CallExpr): string {\n const func = buildExpr(state, expr.expr);\n const optionalChain = expr.optional ? \"?.\" : \"\";\n const args = (expr.args as Expr[])\n .map((arg: Expr) => buildExpr(state, arg))\n .join(\", \");\n\n return `${func}${optionalChain}(${args})`;\n}\n\nfunction buildForLoop(state: BuildState, expr: ForExpr): string {\n const { iterable, loopType, variable } = expr;\n const loopOperator = loopType === LoopType.IN ? \"in\" : \"of\";\n return `for(const ${variable} ${loopOperator} ${build(iterable, state.context)}){`;\n}\n\nfunction buildIfBlock(state: BuildState, expr: IfExpr): string {\n const { condition } = expr;\n return `if(${build(condition, state.context)}){`;\n}\n\nfunction buildElseIfBlock(state: BuildState, expr: ElseIfExpr): string {\n const { condition } = expr;\n return `}else if(${build(condition, state.context)}){`;\n}\n\nfunction buildExpr(state: BuildState, expr: Expr): string {\n const { type } = expr;\n\n if (type === ExprType.NUMBER) return expr.value;\n if (type === ExprType.NULL) return \"null\";\n if (type === ExprType.UNDEFINED) return \"undefined\";\n if (type === ExprType.BOOLEAN) return (expr as any).true ? \"true\" : \"false\";\n\n switch (type) {\n case ExprType.END:\n return \"}\";\n\n case ExprType.STRING:\n return `\\`${/\\$\\\\/.test(expr.value) ? escapeRawText(expr.value) : expr.value}\\``;\n\n case ExprType.IDENT:\n return prefixWithCtx(state, expr);\n\n case ExprType.GROUP:\n return `(${buildExpr(state, (expr as any).expr)})`;\n\n case ExprType.UNARY: {\n const { operator, expr: innerExpr } = expr as any;\n return `${operator}${buildExpr(state, innerExpr)}`;\n }\n\n case ExprType.BINARY: {\n const { left, operator, right } = expr as any;\n return `${buildExpr(state, left)} ${operator} ${buildExpr(state, right)}`;\n }\n\n case ExprType.TERNARY: {\n const { condition, left, right } = expr as any;\n return `${buildExpr(state, condition)} ? ${buildExpr(state, left)} : ${buildExpr(state, right)}`;\n }\n\n case ExprType.PROP_ACCESS:\n return buildPropAccess(state, expr as PropAccessExpr);\n\n case ExprType.CALL:\n return buildCall(state, expr as CallExpr);\n\n case ExprType.NAMESPACE:\n return buildNamespace(expr as NamespaceExpr);\n\n case ExprType.FOR:\n return buildForLoop(state, expr as ForExpr);\n\n case ExprType.ELSE:\n return \"} else {\";\n\n case ExprType.IF:\n return buildIfBlock(state, expr as IfExpr);\n\n case ExprType.ELSE_IF:\n return buildElseIfBlock(state, expr as ElseIfExpr);\n\n default:\n throw new MutorError(`Unsupported expression type '${type}'`);\n }\n}\n\nexport default function build(ast: Expr, context: BuildContext): string {\n const state: BuildState = {\n scope: context.scope,\n forbiddenProps: context.forbiddenProps,\n allowedProps: context.allowedProps,\n context,\n };\n\n const result = buildExpr(state, ast);\n return result.includes(\"namespaces.Mutor.await\")\n ? result.replaceAll(\n \"namespaces.Mutor.await\",\n \"await namespaces.Mutor.await\",\n )\n : result;\n}\n","import { TokenType } from \"../types/enums\";\n\nexport function getTokenTypeWords(type: TokenType) {\n switch (type) {\n case TokenType.IDENT:\n return \"identifier\";\n\n case TokenType.KEYWORD:\n return \"keyword\";\n\n case TokenType.NUMBER:\n return \"number\";\n\n case TokenType.OPERATOR:\n return \"operator\";\n\n case TokenType.STRING:\n return \"string\";\n }\n}\n","import { ExprType, LoopType, TokenType } from \"../types/enums\";\nimport type {\n ElseExpr,\n ElseIfExpr,\n Expr,\n ForExpr,\n IfExpr,\n ParseState,\n Token,\n} from \"../types/types\";\nimport { getTokenTypeWords } from \"../utils/get-token-type-words\";\nimport {\n additiveOperators,\n bitwiseAndOperators,\n bitwiseOperators,\n bitwiseOrOperators,\n bitwiseXorOperators,\n comparisonOperators,\n equalityOperators,\n exponentiationOperators,\n multiplicativeOperators,\n propertyAccessOperators,\n unaryOperators,\n} from \"./constants\";\n\nfunction expectOrThrow(state: ParseState, type: TokenType): Token;\nfunction expectOrThrow(\n state: ParseState,\n type: TokenType,\n value: string,\n): Token;\nfunction expectOrThrow(\n state: ParseState,\n type: TokenType,\n value?: string,\n): Token {\n const token = state.tokens[state.cursor];\n const lastToken = state.tokens[state.tokens.length - 1];\n\n if (!token) {\n const article = value\n ? `'${value}'`\n : `${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)}`;\n throw {\n message: `Unexpected end of expression. Expected ${article}.`,\n pos: lastToken.pos + lastToken.value.length - 1,\n };\n }\n\n if (token.type !== type) {\n throw {\n message: `Unexpected token type. Expected ${value ? `'${value}'` : getTokenTypeWords(type)} but got ${getTokenTypeWords(token.type)} instead.`,\n pos: token.pos,\n };\n }\n\n if (value !== undefined && token.value !== value) {\n throw {\n message: `Unexpected token '${token.value}'. Expected ${type === TokenType.IDENT ? \"an\" : \"a\"} ${getTokenTypeWords(type)} instead.`,\n pos: token.pos,\n };\n }\n\n return state.tokens[state.cursor++];\n}\n\nfunction parseForLoop(state: ParseState): ForExpr {\n const pos = state.tokens[state.cursor - 1].pos;\n const variable = expectOrThrow(state, TokenType.IDENT).value;\n let token: Token;\n\n try {\n token = expectOrThrow(state, TokenType.KEYWORD, \"in\");\n } catch {\n token = expectOrThrow(state, TokenType.KEYWORD, \"of\");\n }\n\n const loopType = token.value === \"in\" ? LoopType.IN : LoopType.OF;\n const iterable = parseTernaryExpr(state);\n\n return { type: ExprType.FOR, loopType, iterable, variable, pos };\n}\n\nfunction parseIfExpression(state: ParseState): IfExpr {\n const condition = parseTernaryExpr(state);\n return { condition, pos: condition.pos, type: ExprType.IF };\n}\n\nfunction parseElseExpression(state: ParseState): ElseExpr | ElseIfExpr {\n const pos = state.tokens[state.cursor - 1].pos;\n\n try {\n expectOrThrow(state, TokenType.KEYWORD, \"if\");\n return { ...parseIfExpression(state), type: ExprType.ELSE_IF, pos };\n } catch {\n return { type: ExprType.ELSE, pos };\n }\n}\n\nfunction extractFnArgs(state: ParseState): Expr[] {\n const args: Expr[] = [];\n\n if (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \")\"\n ) {\n return args;\n }\n\n args.push(parseTernaryExpr(state));\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \",\"\n ) {\n state.cursor++;\n args.push(parseTernaryExpr(state));\n }\n\n return args;\n}\n\nfunction parsePrimaryExpr(state: ParseState): Expr {\n const token = state.tokens[state.cursor++];\n\n if (!token) {\n throw {\n message: \"Unexpected end of expression.\",\n pos: state.tokens[state.tokens.length - 1].pos,\n };\n }\n\n if (token.type === TokenType.NUMBER) {\n return { type: ExprType.NUMBER, value: token.value, pos: token.pos };\n }\n\n if (token.type === TokenType.STRING) {\n return { type: ExprType.STRING, value: token.value, pos: token.pos };\n }\n\n if (token.type === TokenType.KEYWORD) {\n if (token.value === \"for\" && state.cursor === 1) {\n return parseForLoop(state);\n }\n\n if (token.value === \"true\") {\n return { type: ExprType.BOOLEAN, true: true, pos: token.pos };\n }\n\n if (token.value === \"false\") {\n return { type: ExprType.BOOLEAN, true: false, pos: token.pos };\n }\n\n if (token.value === \"undefined\") {\n return { type: ExprType.UNDEFINED, pos: token.pos };\n }\n\n if (token.value === \"null\") {\n return { type: ExprType.NULL, pos: token.pos };\n }\n\n if (token.value === \"end\" && state.tokens.length === 1) {\n return { type: ExprType.END, pos: token.pos };\n }\n\n if (token.value === \"if\" && state.cursor === 1) {\n return parseIfExpression(state);\n }\n\n if (token.value === \"else\" && state.cursor === 1) {\n return parseElseExpression(state);\n }\n }\n\n if (token.type === TokenType.IDENT) {\n return { type: ExprType.IDENT, value: token.value, pos: token.pos };\n }\n\n if (token.type === TokenType.OPERATOR && token.value === \"(\") {\n const expr = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \")\");\n return { type: ExprType.GROUP, expr, pos: token.pos };\n }\n\n if (token.type === TokenType.OPERATOR && unaryOperators.has(token.value)) {\n const expr = parsePropertyAccess(state);\n return {\n type: ExprType.UNARY,\n operator: token.value,\n expr,\n pos: token.pos,\n };\n }\n\n throw {\n message: `Unexpected token '${token.value}'.`,\n pos: token.pos,\n };\n}\n\nfunction parsePropertyAccess(state: ParseState): Expr {\n let left = parsePrimaryExpr(state);\n\n while (state.tokens[state.cursor]) {\n const token = state.tokens[state.cursor];\n\n if (token?.type === TokenType.OPERATOR && token?.value === \"(\") {\n state.cursor++;\n\n if (!state.generatingNamespace && !state.config.allowFnCalls) {\n throw {\n message: \"Function calls are not allowed.\",\n pos: token.pos,\n };\n }\n\n const args = extractFnArgs(state);\n expectOrThrow(state, TokenType.OPERATOR, \")\");\n\n left = {\n type: ExprType.CALL,\n expr: left,\n args,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (\n token?.type === TokenType.OPERATOR &&\n token?.value === \"?.\" &&\n state.tokens[state.cursor + 1]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor + 1]?.value === \"(\"\n ) {\n state.cursor += 2;\n\n if (!state.generatingNamespace && !state.config.allowFnCalls) {\n throw {\n message: \"Function calls are not allowed.\",\n pos: token.pos,\n };\n }\n\n const args = extractFnArgs(state);\n expectOrThrow(state, TokenType.OPERATOR, \")\");\n\n left = {\n type: ExprType.CALL,\n expr: left,\n args,\n optional: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (\n token?.type === TokenType.OPERATOR &&\n propertyAccessOperators.has(token?.value)\n ) {\n const isNamespace = token.value === \"::\";\n const isBracketNotation = token.value === \"[\";\n const isOptional = token.value === \"?.\";\n\n state.cursor++;\n\n if (\n isNamespace &&\n (state.tokens[state.cursor - 2]?.type !== TokenType.IDENT ||\n state.tokens[state.cursor]?.type !== TokenType.IDENT)\n ) {\n throw {\n message: `Invalid namespaces access. Expected syntax <IDENTIFIER>::<IDENTIFIER>, but got '${state.tokens[state.cursor - 2]?.value}::${state.tokens[state.cursor]?.value ?? \"\"}' instead.`,\n pos:\n state.tokens[state.cursor]?.pos ??\n state.tokens[state.cursor - 1].pos,\n };\n }\n\n if (isNamespace) {\n state.generatingNamespace = true;\n const right = parsePrimaryExpr(state);\n\n left = {\n type: ExprType.NAMESPACE,\n left,\n right,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (isBracketNotation) {\n const right = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\n\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n bracketNotation: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else if (isOptional) {\n if (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"[\"\n ) {\n state.cursor++;\n const right = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \"]\");\n\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n bracketNotation: true,\n optional: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n } else {\n const right = parsePrimaryExpr(state);\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n optional: true,\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n } else {\n const right = parsePrimaryExpr(state);\n left = {\n type: ExprType.PROP_ACCESS,\n left,\n right,\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n } else {\n break;\n }\n }\n\n state.generatingNamespace = false;\n return left;\n}\n\nfunction parseBinaryExpr(\n state: ParseState,\n leftParser: (state: ParseState) => Expr,\n operators: Set<string>,\n): Expr {\n let left = leftParser(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n operators.has(state.tokens[state.cursor]?.value)\n ) {\n const operator = state.tokens[state.cursor++].value;\n const right = leftParser(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator,\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseExponentiationExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parsePropertyAccess, exponentiationOperators);\n}\n\nfunction parseMultiplicativeExpr(state: ParseState): Expr {\n return parseBinaryExpr(\n state,\n parseExponentiationExpr,\n multiplicativeOperators,\n );\n}\n\nfunction parseAdditiveExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseMultiplicativeExpr, additiveOperators);\n}\n\nfunction parseBitwiseExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseAdditiveExpr, bitwiseOperators);\n}\n\nfunction parseComparisonExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseBitwiseExpr, comparisonOperators);\n}\n\nfunction parseEqualityExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseComparisonExpr, equalityOperators);\n}\n\nfunction parseBitwiseOrExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseBitwiseXorExpr, bitwiseOrOperators);\n}\n\nfunction parseBitwiseXorExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseBitwiseAndExpr, bitwiseXorOperators);\n}\n\nfunction parseBitwiseAndExpr(state: ParseState): Expr {\n return parseBinaryExpr(state, parseEqualityExpr, bitwiseAndOperators);\n}\n\nfunction parseLogicalAndExpr(state: ParseState): Expr {\n let left = parseBitwiseOrExpr(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"&&\"\n ) {\n state.cursor++;\n const right = parseEqualityExpr(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator: \"&&\",\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseLogicalOrExpr(state: ParseState): Expr {\n let left = parseLogicalAndExpr(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"||\"\n ) {\n state.cursor++;\n const right = parseLogicalAndExpr(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator: \"||\",\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseNullishCoalesceExpr(state: ParseState): Expr {\n let left = parseLogicalOrExpr(state);\n\n while (\n state.tokens[state.cursor]?.type === TokenType.OPERATOR &&\n state.tokens[state.cursor]?.value === \"??\"\n ) {\n state.cursor++;\n const right = parseLogicalOrExpr(state);\n left = {\n type: ExprType.BINARY,\n left,\n right,\n operator: \"??\",\n pos: state.tokens[state.cursor - 1].pos,\n };\n }\n\n return left;\n}\n\nfunction parseTernaryExpr(state: ParseState): Expr {\n const condition = parseNullishCoalesceExpr(state);\n\n if (\n state.tokens[state.cursor]?.type !== TokenType.OPERATOR ||\n state.tokens[state.cursor]?.value !== \"?\"\n ) {\n return condition;\n }\n\n state.cursor++;\n const left = parseTernaryExpr(state);\n expectOrThrow(state, TokenType.OPERATOR, \":\");\n const right = parseTernaryExpr(state);\n\n return {\n type: ExprType.TERNARY,\n condition,\n left,\n right,\n pos: state.tokens[state.cursor - 1].pos,\n };\n}\n\nexport default function generateAst(\n tokens: Token[],\n config: { allowFnCalls: boolean },\n): Expr {\n const state: ParseState = {\n cursor: 0,\n tokens,\n config,\n generatingNamespace: false,\n };\n\n const ast = parseTernaryExpr(state);\n\n if (state.cursor !== state.tokens.length) {\n throw {\n pos: state.tokens[state.cursor].pos,\n message: `Expected token '${state.tokens[state.cursor].value}'.\\nExpected an operator or the end of the expression.`,\n };\n }\n\n return ast;\n}\n","import type { MutorConfig } from \"../types/types\";\r\n\r\nexport default function parse(\r\n templateBlock: string,\r\n { delimiters }: Pick<MutorConfig, \"delimiters\">,\r\n) {\r\n const openingTagWithWhitespaceCtrl = `${delimiters.openingTag}${delimiters.whitespaceTrim}`;\r\n const closingTagWithWhitespaceCtrl = `${delimiters.whitespaceTrim}${delimiters.closingTag}`;\r\n\r\n const leftTrim = templateBlock.startsWith(openingTagWithWhitespaceCtrl);\r\n const rightTrim = templateBlock.endsWith(closingTagWithWhitespaceCtrl);\r\n\r\n const openLen = leftTrim\r\n ? openingTagWithWhitespaceCtrl.length\r\n : delimiters.openingTag.length;\r\n const closeLen = rightTrim\r\n ? closingTagWithWhitespaceCtrl.length\r\n : delimiters.closingTag.length;\r\n\r\n const inner = templateBlock.slice(openLen, templateBlock.length - closeLen);\r\n const trimmed = inner.trim();\r\n\r\n const isComment = trimmed.startsWith(delimiters.commentTag);\r\n if (isComment) {\r\n return { isComment, leftTrim, rightTrim };\r\n }\r\n\r\n return {\r\n leftTrim,\r\n rightTrim,\r\n inner,\r\n isBlock:\r\n trimmed.startsWith(\"for \") ||\r\n trimmed.startsWith(\"if \") ||\r\n trimmed.startsWith(\"else \"),\r\n isBlockEnd: trimmed === \"end\",\r\n hasContext: trimmed.startsWith(\"for \"),\r\n requiresBlockClose: trimmed.startsWith(\"for \") || trimmed.startsWith(\"if \"),\r\n usesAwait: inner.includes(\"Mutor::await\"),\r\n };\r\n}\r\n","import { TokenType } from \"../types/enums\";\r\nimport type { Token } from \"../types/types\";\r\nimport { keywords, operators } from \"./constants\";\r\n\r\nconst IDENT_START_PATTERN = /[a-zA-Z$_]/;\r\nconst IDENT_PATTERN = /[a-zA-Z$_0-9]/;\r\nconst NUMBER_START_PATTERN = /[0-9]/;\r\nconst NUMBER_PATTERN = /[0-9.oxe]/;\r\nconst VALIDATION_PATTERN = /[a-zA-Z$_0-9\\s\\t\\r\\n'\"`]/;\r\n\r\nexport default function tokenize(expr: string) {\r\n let cursor = 0,\r\n char = \"\";\r\n const tokens: Token[] = [];\r\n\r\n function accumulateKeywordOrIdentifier() {\r\n let buffer = \"\";\r\n if (IDENT_START_PATTERN.test(char)) {\r\n let j = cursor;\r\n while (IDENT_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n tokens.push({\r\n type: keywords.has(buffer) ? TokenType.KEYWORD : TokenType.IDENT,\r\n value: buffer,\r\n pos: cursor,\r\n });\r\n\r\n cursor = j;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateStr() {\r\n if (char !== '\"' && char !== \"'\" && char !== \"`\") {\r\n return false;\r\n }\r\n\r\n const quote = char;\r\n const start = cursor;\r\n\r\n let j = cursor + 1;\r\n let buffer = \"\";\r\n\r\n while (j < expr.length) {\r\n const current = expr[j];\r\n\r\n // Escape sequence\r\n if (current === \"\\\\\") {\r\n // Ensure next char exists\r\n if (j + 1 >= expr.length) {\r\n throw {\r\n pos: j,\r\n message: \"Unexpected end of string after escape character.\",\r\n };\r\n }\r\n\r\n // Preserve escape exactly as written\r\n buffer += current;\r\n buffer += expr[j + 1];\r\n\r\n j += 2;\r\n continue;\r\n }\r\n\r\n // Closing quote\r\n if (current === quote) {\r\n break;\r\n }\r\n\r\n buffer += current;\r\n j++;\r\n }\r\n\r\n // Missing closing quote\r\n if (j >= expr.length || expr[j] !== quote) {\r\n throw {\r\n pos: start,\r\n message: `String literal missing closing ${quote}.`,\r\n };\r\n }\r\n\r\n tokens.push({\r\n type: TokenType.STRING,\r\n value: buffer,\r\n pos: start,\r\n });\r\n\r\n cursor = j;\r\n }\r\n\r\n function accumulateNumber() {\r\n if (NUMBER_START_PATTERN.test(char)) {\r\n let j = cursor,\r\n buffer = \"\";\r\n\r\n while (NUMBER_PATTERN.test(expr[j]) && j < expr.length) {\r\n buffer += expr[j];\r\n j++;\r\n }\r\n\r\n const numVal = Number(buffer);\r\n const isNan = Number.isNaN(numVal);\r\n\r\n if (isNan) {\r\n throw { pos: cursor, message: \"Found invalid number literal.\" };\r\n }\r\n\r\n tokens.push({ type: TokenType.NUMBER, value: `${numVal}`, pos: cursor });\r\n cursor = j - 1;\r\n char = expr[cursor];\r\n }\r\n }\r\n\r\n function accumulateOperator() {\r\n const op = `${char}${expr[cursor + 1]}`;\r\n if (operators.has(op)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: op, pos: cursor });\r\n cursor++;\r\n return;\r\n }\r\n\r\n if (operators.has(char)) {\r\n tokens.push({ type: TokenType.OPERATOR, value: char, pos: cursor });\r\n return;\r\n }\r\n }\r\n\r\n while (cursor < expr.length) {\r\n char = expr[cursor];\r\n\r\n accumulateNumber();\r\n accumulateKeywordOrIdentifier();\r\n accumulateStr();\r\n accumulateOperator();\r\n\r\n if (\r\n !VALIDATION_PATTERN.test(char) &&\r\n !operators.has(char) &&\r\n !operators.has(expr[cursor - 1] + char)\r\n ) {\r\n throw {\r\n message: `Unexpected token '${char}' in expression.`,\r\n pos: cursor,\r\n };\r\n }\r\n\r\n cursor++;\r\n }\r\n\r\n return tokens.length\r\n ? tokens\r\n : [{ type: TokenType.STRING, value: \"\", pos: 0 }];\r\n}\r\n","import { BlockType } from \"../types/enums\";\r\nimport type { CompileMetadata, ForExpr, MutorConfig } from \"../types/types\";\r\nimport escapeRawText from \"../utils/escape-raw-text\";\r\nimport getLineNumberAndIndex from \"../utils/get-line-and-column-nums\";\r\nimport getLineSnapshot from \"../utils/get-line-snapshot\";\r\nimport build from \"./build\";\r\nimport { AsyncFunction } from \"./constants\";\r\nimport { MutorCompilerError } from \"./error\";\r\nimport generateAst from \"./generate-ast\";\r\nimport parse from \"./parse\";\r\nimport tokenize from \"./tokenize\";\r\n\r\nexport default function compile(\r\n src: string,\r\n config: MutorConfig,\r\n meta: CompileMetadata,\r\n) {\r\n const scope: string[] = [];\r\n const blockOpeningStack: { type: BlockType; pos: number }[] = [];\r\n const {\r\n delimiters,\r\n keepOpeningTagEscapeDelimiter,\r\n allowFnCalls,\r\n allowedProps,\r\n forbiddenProps,\r\n autoEscape,\r\n } = config;\r\n\r\n // Function mode (sync/async)\r\n let mode: \"sync\" | \"async\" = \"sync\";\r\n\r\n // Whitespace control state\r\n let trimNext = false,\r\n cursor = 0,\r\n body = `let acc=\"\";`;\r\n\r\n while (cursor < src.length) {\r\n const templateOpenTagIdx = src.indexOf(delimiters.openingTag, cursor);\r\n\r\n // Handle Final Text Chunk\r\n if (templateOpenTagIdx === -1) {\r\n let lastChunk = src.slice(cursor);\r\n if (trimNext) lastChunk = lastChunk.trimStart();\r\n if (lastChunk) body += `acc+=\\`${escapeRawText(lastChunk)}\\`;`;\r\n break;\r\n }\r\n\r\n // Escape Logic\r\n function isEscaped() {\r\n let j = templateOpenTagIdx,\r\n count = 0;\r\n while (\r\n j >= delimiters.openingTagEscape.length &&\r\n src.slice(j - delimiters.openingTagEscape.length, j) ===\r\n delimiters.openingTagEscape\r\n ) {\r\n count++;\r\n j -= delimiters.openingTagEscape.length;\r\n }\r\n return count % 2 === 1;\r\n }\r\n\r\n if (isEscaped()) {\r\n let escapedChunk = src.slice(\r\n cursor,\r\n keepOpeningTagEscapeDelimiter\r\n ? templateOpenTagIdx + delimiters.openingTagEscape.length + 1\r\n : templateOpenTagIdx - delimiters.openingTag.length + 1,\r\n );\r\n\r\n if (trimNext) {\r\n escapedChunk = escapedChunk.trimStart();\r\n trimNext = false;\r\n }\r\n\r\n body += `acc+=\\`${escapeRawText(escapedChunk)}\\`;`;\r\n\r\n if (!keepOpeningTagEscapeDelimiter) {\r\n body += `acc+=\\`${delimiters.openingTag}\\`;`;\r\n }\r\n\r\n cursor = templateOpenTagIdx + delimiters.openingTag.length;\r\n continue;\r\n }\r\n\r\n // Parse Tag Metadata (to check for leftTrim BEFORE processing rawText)\r\n const templateEndTagIdx = src.indexOf(\r\n delimiters.closingTag,\r\n templateOpenTagIdx,\r\n );\r\n\r\n if (templateEndTagIdx === -1) {\r\n const [line, lineIndex] = getLineNumberAndIndex(src, templateOpenTagIdx);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n\r\n throw new MutorCompilerError(\r\n \"No closing tag found.\",\r\n line,\r\n lineText,\r\n templateOpenTagIdx,\r\n meta.path,\r\n );\r\n }\r\n\r\n const template = src.slice(\r\n templateOpenTagIdx,\r\n templateEndTagIdx + delimiters.closingTag.length,\r\n );\r\n const {\r\n inner,\r\n leftTrim,\r\n rightTrim,\r\n isBlock,\r\n isBlockEnd,\r\n hasContext,\r\n requiresBlockClose,\r\n isComment,\r\n usesAwait,\r\n } = parse(template, { delimiters });\r\n\r\n // Switch to async mode is Mutor::await is used\r\n if (usesAwait && mode !== \"async\") {\r\n mode = \"async\";\r\n }\r\n\r\n // Process Raw Text (between cursor and current tag)\r\n let rawText = src.slice(cursor, templateOpenTagIdx);\r\n if (rawText) {\r\n if (trimNext) {\r\n rawText = rawText.trimStart();\r\n }\r\n\r\n if (leftTrim) {\r\n rawText = rawText.trimEnd();\r\n }\r\n\r\n if (rawText) {\r\n body += `acc+=\\`${escapeRawText(rawText)}\\`;`;\r\n }\r\n }\r\n\r\n // Reset after use\r\n trimNext = false;\r\n\r\n cursor = templateEndTagIdx + delimiters.closingTag.length;\r\n\r\n try {\r\n if (!isComment) {\r\n const tokens = tokenize(inner);\r\n const ast = generateAst(tokens, { allowFnCalls });\r\n\r\n if (isBlock && requiresBlockClose && hasContext) {\r\n scope.push((ast as ForExpr).variable);\r\n blockOpeningStack.push({\r\n type: BlockType.LOOP,\r\n pos: templateOpenTagIdx,\r\n });\r\n } else if (isBlock && requiresBlockClose && !hasContext) {\r\n blockOpeningStack.push({\r\n type: BlockType.NON_LOOP,\r\n pos: templateOpenTagIdx,\r\n });\r\n }\r\n\r\n if (isBlockEnd) {\r\n const lastBlockOpened = blockOpeningStack.pop();\r\n if (lastBlockOpened?.type === BlockType.LOOP) scope.pop();\r\n if (lastBlockOpened === undefined)\r\n throw {\r\n message: \"Unexpected end of block\",\r\n pos: templateOpenTagIdx,\r\n };\r\n }\r\n\r\n const js = build(ast, { allowedProps, forbiddenProps, scope });\r\n\r\n if (isBlock || isBlockEnd) {\r\n body += js;\r\n } else {\r\n // Only escape unknown values returned from fn calls or object property resolution\r\n // Values returned from Mutor::include should be taken as is.\r\n body +=\r\n // Escape the return values of unknown values at runtime\r\n autoEscape && !js.startsWith(\"namespaces.Mutor.include\")\r\n ? `acc+=escapeFn(${js});`\r\n : `acc+=${js};`;\r\n }\r\n }\r\n\r\n // Set state for the NEXT raw text chunk\r\n if (rightTrim) trimNext = true;\r\n } catch (e) {\r\n const { message, pos: relPos } = e as { message: string; pos: number };\r\n const delimitersLength = leftTrim\r\n ? delimiters.whitespaceTrim.length + delimiters.openingTag.length\r\n : delimiters.openingTag.length;\r\n\r\n const finalPos = templateOpenTagIdx + relPos + delimitersLength;\r\n\r\n const [line, lineIndex] = getLineNumberAndIndex(src, finalPos);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n\r\n throw new MutorCompilerError(\r\n message,\r\n line,\r\n lineText,\r\n finalPos - lineIndex,\r\n meta.path,\r\n );\r\n }\r\n }\r\n\r\n if (blockOpeningStack.length) {\r\n const lastPos = blockOpeningStack.pop()?.pos as number;\r\n const [line, lineIndex] = getLineNumberAndIndex(src, lastPos);\r\n const lineText = getLineSnapshot(src, lineIndex);\r\n throw new MutorCompilerError(\r\n \"Unclosed block detected.\",\r\n line,\r\n lineText,\r\n lastPos - lineIndex,\r\n meta.path,\r\n );\r\n }\r\n\r\n body += `return acc;`;\r\n return mode === \"async\"\r\n ? new AsyncFunction(\r\n \"ctx\",\r\n \"namespaces\",\r\n \"allowedProps\",\r\n \"forbiddenProps\",\r\n \"escapeFn\",\r\n \"validateComputedProps\",\r\n body,\r\n )\r\n : new Function(\r\n \"ctx\",\r\n \"namespaces\",\r\n \"allowedProps\",\r\n \"forbiddenProps\",\r\n \"escapeFn\",\r\n \"validateComputedProps\",\r\n body,\r\n );\r\n}\r\n","import type {\n MutorConfig,\n PartialMutorConfig,\n RuntimeFrame,\n} from \"../types/types\";\nimport createRuntimeFrame from \"../utils/create-runtime\";\nimport escapeFn from \"../utils/escape-fn\";\nimport validateComputedProp from \"../utils/validate-computed-prop\";\nimport validateContext from \"../utils/validate-context\";\nimport compile from \"./compile\";\nimport { defaultConfig, namespaces } from \"./constants\";\nimport { MutorCompilerError, MutorError } from \"./error\";\n\nexport default class MutorBase {\n protected __cacheSize = 0;\n protected __config: MutorConfig = { ...defaultConfig };\n protected __compiledTemplatesMap: Map<\n string,\n { fn: Function; size: number }\n > = new Map();\n protected __namespaces: Record<any, any> = {\n ...namespaces,\n Mutor: {\n await: async (value: any) => {\n return await value;\n },\n },\n };\n\n constructor(config: PartialMutorConfig = {}) {\n this.addConfig(config);\n }\n\n addConfig(conf: PartialMutorConfig): MutorConfig {\n const {\n autoEscape,\n delimiters: overrideDelimeters,\n allowedProps,\n forbiddenProps,\n keepOpeningTagEscapeDelimiter,\n allowFnCalls,\n cache,\n build,\n onIncludeFail,\n onIncludeError,\n } = conf;\n\n this.__config = {\n build: {\n include: new Set([...(build?.include || defaultConfig.build.include)]),\n exclude: new Set([\n ...defaultConfig.build.exclude,\n ...(build?.exclude || []),\n ]),\n },\n autoEscape: autoEscape === true ? true : autoEscape !== false,\n allowedProps: allowedProps || defaultConfig.allowedProps,\n allowFnCalls: !!allowFnCalls,\n onIncludeFail: onIncludeFail || defaultConfig.onIncludeFail,\n onIncludeError: onIncludeError || defaultConfig.onIncludeError,\n cache: { ...defaultConfig.cache, ...(cache || {}) },\n forbiddenProps: new Set([\n ...defaultConfig.forbiddenProps,\n ...(forbiddenProps || []),\n ]),\n keepOpeningTagEscapeDelimiter: keepOpeningTagEscapeDelimiter ?? false,\n delimiters: {\n ...defaultConfig.delimiters,\n ...(overrideDelimeters || {}),\n },\n };\n\n return this.__config;\n }\n\n restoreDefaultConfig() {\n this.__config = { ...defaultConfig };\n }\n\n compile(template: string, runtime?: RuntimeFrame): Function {\n return compile(template, this.__config, {\n path: runtime?.renderedPath || \"anonymous\",\n });\n }\n\n renderAsync(template: string, context: any): Promise<string> {\n return new Promise((resolve) => {\n resolve(this.render(template, context));\n });\n }\n\n render(template: string, context: any): string {\n const runtime = createRuntimeFrame(context, \"anonymous\");\n return this.__renderWithRuntime(template, runtime);\n }\n\n protected __renderWithRuntime(\n template: string,\n runtime: RuntimeFrame,\n ): string {\n const fn = this.compile(template, runtime);\n\n const result = fn(\n validateContext(runtime.context),\n this.__createNamespacesWithRuntime(runtime),\n this.__config.allowedProps,\n this.__config.forbiddenProps,\n escapeFn,\n validateComputedProp,\n );\n\n return result;\n }\n\n protected __createNamespacesWithRuntime(\n runtime: RuntimeFrame,\n ): Record<any, any> {\n return {\n ...this.__namespaces,\n Mutor: {\n ...this.__namespaces.Mutor,\n $$context: runtime.context,\n },\n };\n }\n\n protected handleError(\n err: unknown,\n from: string,\n path: string,\n absolutePath?: string,\n ): string {\n if (this.__config.onIncludeFail === \"throw\") {\n throw err instanceof MutorCompilerError\n ? err\n : new MutorError((err as Error).message);\n }\n\n const meta = { from, path, absolutePath };\n\n // Log error if onIncludeFail is set to \"ignore\" and onIncludeError is not defined\n if (\n this.__config.onIncludeFail === \"ignoreLog\" &&\n !this.__config.onIncludeError\n ) {\n err instanceof MutorCompilerError\n ? console.log(err)\n : console.log(`[Mutor.js]\\n${(err as Error).message}`);\n }\n\n return this.__config.onIncludeError?.(meta, err) ?? \"\";\n }\n\n protected createEntrySpaceForTemplate(targetSize: number): boolean {\n if (this.__cacheSize + targetSize < this.__config.cache.maxSize) {\n return true;\n }\n\n if (targetSize > this.__config.cache.maxSize) {\n return false;\n }\n\n const firstEntry = this.__compiledTemplatesMap.entries().next().value;\n\n if (firstEntry) {\n const [oldestKey, oldestData] = firstEntry;\n this.__compiledTemplatesMap.delete(oldestKey);\n this.__cacheSize -= oldestData.size;\n }\n\n return this.createEntrySpaceForTemplate(targetSize);\n }\n\n getDiagnostics() {\n const maxSize = this.__config.cache.maxSize;\n\n return {\n bytesUsed: this.__cacheSize,\n bytesMax: maxSize,\n readableUsed: `${(this.__cacheSize / 1024 / 1024).toFixed(2)} MB`,\n readableMax: `${(maxSize / 1024 / 1024).toFixed(2)} MB`,\n totalEntries: this.__compiledTemplatesMap.size,\n percentFull:\n maxSize > 0\n ? Math.min(100, Math.round((this.__cacheSize / maxSize) * 100))\n : 0,\n avgTemplateSize:\n this.__compiledTemplatesMap.size > 0\n ? Math.round(this.__cacheSize / this.__compiledTemplatesMap.size)\n : 0,\n };\n }\n\n protected register(identifier: string, template: string) {\n const templateSize = template.length * 2 + 500;\n\n if (this.__cacheSize + templateSize > this.__config.cache.maxSize) {\n if (!this.createEntrySpaceForTemplate(templateSize)) {\n throw new MutorError(\n `The template for the component '${identifier}' is too large and will not fit in the cache. Consider increasing 'cache.maxSize' in the config`,\n );\n }\n }\n\n // Use a temporary runtime for compilation context\n const tempRuntime = createRuntimeFrame(null, identifier);\n\n this.__cacheSize += template.length * 2 + 500;\n this.__compiledTemplatesMap.set(identifier, {\n fn: this.compile(template, tempRuntime),\n size: templateSize,\n });\n }\n\n reset() {\n this.__config = { ...defaultConfig };\n this.__compiledTemplatesMap.clear();\n this.__cacheSize = 0;\n }\n}\n","import Mutor from \"./core/mutor.server\";\r\n\r\nexport * from \"./types/enums\";\r\nexport * from \"./types/types\";\r\n\r\nexport default Mutor;\r\n"],"mappings":"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","names":["readFileSync","copyFile","mkdir","readdir","readFile","writeFile","extname","join","createRuntimeFrame","context","renderedPath","constructPointer","pos","offset","MutorError","_MutorError","message","MutorCompilerError","_MutorCompilerError","line","lineText","column","file","gutterWidth","report","constructPointer","keywords","operators","equalityOperators","comparisonOperators","bitwiseOperators","additiveOperators","multiplicativeOperators","propertyAccessOperators","unaryOperators","bitwiseOrOperators","bitwiseXorOperators","bitwiseAndOperators","exponentiationOperators","ESCAPE_MAP","defaultConfig","namespaces","value","space","MutorError","str","obj","key","entries","keys","result","args","arr","size","i","start","end","step","radix","min","max","digits","x","base","exponent","date","d","AsyncFunction","escapeFn","char","ESCAPE_MAP","dirname","isAbsolute","resolve","toAbsolutePath","basePath","relativePaths","absoluteBase","baseDir","validateComputedProp","r","allowedProps","forbiddenProps","MutorError","OBJECT","MUTOR_SAFE","isPromiseLike","value","walk","path","seen","k","v","next","proto","MutorError","i","descriptors","key","desc","validateContext","ctx","safeData","TokenType","ExprType","LoopType","BlockType","escapeRawText","text","getLineAndColumnNumbers","str","idx","line","lineIndex","getLineSnapshot","str","lineIdx","nextNewlineIdx","prefixWithCtx","state","expr","buildNamespace","leftValue","rightValue","buildPropAccess","left","buildExpr","optionalChain","right","propName","buildCall","func","args","arg","buildForLoop","iterable","loopType","variable","loopOperator","build","buildIfBlock","condition","buildElseIfBlock","type","escapeRawText","operator","innerExpr","MutorError","ast","context","result","getTokenTypeWords","type","expectOrThrow","state","type","value","token","lastToken","getTokenTypeWords","parseForLoop","pos","variable","loopType","iterable","parseTernaryExpr","parseIfExpression","condition","parseElseExpression","extractFnArgs","args","parsePrimaryExpr","expr","unaryOperators","parsePropertyAccess","left","propertyAccessOperators","isNamespace","isBracketNotation","isOptional","right","parseBinaryExpr","leftParser","operators","operator","parseExponentiationExpr","exponentiationOperators","parseMultiplicativeExpr","multiplicativeOperators","parseAdditiveExpr","additiveOperators","parseBitwiseExpr","bitwiseOperators","parseComparisonExpr","comparisonOperators","parseEqualityExpr","equalityOperators","parseBitwiseOrExpr","parseBitwiseXorExpr","bitwiseOrOperators","parseBitwiseAndExpr","bitwiseXorOperators","bitwiseAndOperators","parseLogicalAndExpr","parseLogicalOrExpr","parseNullishCoalesceExpr","generateAst","tokens","config","ast","parse","templateBlock","delimiters","openingTagWithWhitespaceCtrl","closingTagWithWhitespaceCtrl","leftTrim","rightTrim","openLen","closeLen","inner","trimmed","isComment","IDENT_START_PATTERN","IDENT_PATTERN","NUMBER_START_PATTERN","NUMBER_PATTERN","VALIDATION_PATTERN","tokenize","expr","cursor","char","tokens","accumulateKeywordOrIdentifier","buffer","j","keywords","accumulateStr","quote","start","current","accumulateNumber","numVal","accumulateOperator","op","operators","compile","src","config","meta","scope","blockOpeningStack","delimiters","keepOpeningTagEscapeDelimiter","allowFnCalls","allowedProps","forbiddenProps","autoEscape","mode","trimNext","cursor","body","isEscaped","j","templateOpenTagIdx","count","lastChunk","escapeRawText","escapedChunk","templateEndTagIdx","line","lineIndex","getLineAndColumnNumbers","lineText","getLineSnapshot","MutorCompilerError","template","inner","leftTrim","rightTrim","isBlock","isBlockEnd","hasContext","requiresBlockClose","isComment","usesAwait","parse","rawText","tokens","tokenize","ast","generateAst","lastBlockOpened","js","build","e","message","relPos","delimitersLength","finalPos","lastPos","AsyncFunction","MutorBase","config","defaultConfig","namespaces","value","conf","autoEscape","overrideDelimeters","allowedProps","forbiddenProps","keepOpeningTagEscapeDelimiter","allowFnCalls","cache","build","onIncludeFail","onIncludeError","template","runtime","compile","context","resolve","createRuntimeFrame","validateContext","escapeFn","validateComputedProp","err","from","path","absolutePath","MutorCompilerError","MutorError","meta","targetSize","firstEntry","oldestKey","oldestData","maxSize","identifier","templateSize","tempRuntime","MutorServer","MutorBase","config","runtime","path","context","resolvedPath","toAbsolutePath","MutorError","previousPath","err","template","createRuntimeFrame","resolve","absolutePath","compiled","previousContext","entry","readFileSync","templateSize","validateContext","escapeFn","validateComputedProp","src","destination","absoluteDestinationPath","absoluteSrcPath","mkdir","entries","readdir","srcPath","join","destinationPath","extension","extname","rendered","writeFile","copyFile","readFile","server_default","MutorServer"]}