binja 0.8.0 → 0.9.0
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/adapters/elysia.d.ts +82 -0
- package/dist/adapters/elysia.js +381 -0
- package/dist/adapters/hono.d.ts +57 -0
- package/dist/adapters/hono.js +389 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/cli.js +14 -14
- package/dist/engines/index.d.ts +2 -1
- package/dist/engines/twig/index.d.ts +35 -0
- package/dist/engines/twig/lexer.d.ts +16 -0
- package/dist/engines/twig/parser.d.ts +20 -0
- package/dist/index.js +61 -61
- package/dist/lexer/tokens.d.ts +3 -1
- package/package.json +16 -2
package/dist/index.js
CHANGED
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var s=import.meta.require;var b;((
|
|
3
|
-
`)}function
|
|
4
|
-
`)
|
|
5
|
-
`)}function n(B,K,A=3){let Q=null
|
|
2
|
+
var s=import.meta.require;var b;((F)=>{F.TEXT="TEXT";F.EOF="EOF";F.VARIABLE_START="VARIABLE_START";F.VARIABLE_END="VARIABLE_END";F.BLOCK_START="BLOCK_START";F.BLOCK_END="BLOCK_END";F.COMMENT_START="COMMENT_START";F.COMMENT_END="COMMENT_END";F.NAME="NAME";F.STRING="STRING";F.NUMBER="NUMBER";F.DOT="DOT";F.COMMA="COMMA";F.COLON="COLON";F.PIPE="PIPE";F.LPAREN="LPAREN";F.RPAREN="RPAREN";F.LBRACKET="LBRACKET";F.RBRACKET="RBRACKET";F.LBRACE="LBRACE";F.RBRACE="RBRACE";F.EQ="EQ";F.NE="NE";F.LT="LT";F.GT="GT";F.LE="LE";F.GE="GE";F.ADD="ADD";F.SUB="SUB";F.MUL="MUL";F.DIV="DIV";F.MOD="MOD";F.AND="AND";F.OR="OR";F.NOT="NOT";F.ASSIGN="ASSIGN";F.TILDE="TILDE";F.QUESTION="QUESTION";F.NULLCOALESCE="NULLCOALESCE"})(b||={});var m={and:"AND",or:"OR",not:"NOT",true:"NAME",false:"NAME",True:"NAME",False:"NAME",None:"NAME",none:"NAME",is:"NAME",in:"NAME"};var u={red:"\x1B[31m",yellow:"\x1B[33m",cyan:"\x1B[36m",gray:"\x1B[90m",bold:"\x1B[1m",dim:"\x1B[2m",reset:"\x1B[0m"},HB=process.stdout?.isTTY!==!1;function z(B,K){return HB?`${u[B]}${K}${u.reset}`:K}class r extends Error{line;column;source;templateName;suggestion;availableOptions;constructor(B,K){let A=p("TemplateError",B,K);super(A);this.name="TemplateError",this.line=K.line,this.column=K.column,this.source=K.source,this.templateName=K.templateName,this.suggestion=K.suggestion,this.availableOptions=K.availableOptions}}class P extends Error{line;column;source;templateName;suggestion;constructor(B,K){let A=p("TemplateSyntaxError",B,K);super(A);this.name="TemplateSyntaxError",this.line=K.line,this.column=K.column,this.source=K.source,this.templateName=K.templateName,this.suggestion=K.suggestion}}class y extends Error{line;column;source;templateName;suggestion;availableOptions;constructor(B,K){let A=p("TemplateRuntimeError",B,K);super(A);this.name="TemplateRuntimeError",this.line=K.line,this.column=K.column,this.source=K.source,this.templateName=K.templateName,this.suggestion=K.suggestion,this.availableOptions=K.availableOptions}}function p(B,K,A){let Q=[],O=A.templateName?`${A.templateName}:${A.line}:${A.column}`:`line ${A.line}, column ${A.column}`;if(Q.push(`${z("red",z("bold",B))}: ${K} at ${z("cyan",O)}`),A.source)Q.push(""),Q.push(zB(A.source,A.line,A.column));if(A.suggestion)Q.push(""),Q.push(`${z("yellow","Did you mean")}: ${z("cyan",A.suggestion)}?`);if(A.availableOptions&&A.availableOptions.length>0){Q.push("");let U=A.availableOptions.slice(0,8),Y=A.availableOptions.length>8?` ${z("gray",`... and ${A.availableOptions.length-8} more`)}`:"";Q.push(`${z("gray","Available")}: ${U.join(", ")}${Y}`)}return Q.join(`
|
|
3
|
+
`)}function zB(B,K,A){let Q=B.split(`
|
|
4
|
+
`),O=[],U=Math.max(1,K-2),Y=Math.min(Q.length,K+1),J=String(Y).length;for(let $=U;$<=Y;$++){let Z=Q[$-1]||"",X=String($).padStart(J," ");if($===K){O.push(`${z("red"," \u2192")} ${z("gray",X)} ${z("dim","\u2502")} ${Z}`);let G=" ".repeat(J+4+Math.max(0,A-1)),E=z("red","^");O.push(`${G}${E}`)}else O.push(` ${z("gray",X)} ${z("dim","\u2502")} ${z("gray",Z)}`)}return O.join(`
|
|
5
|
+
`)}function n(B,K,A=3){let Q=null,O=A+1,U=B.toLowerCase();for(let Y of K){let J=WB(U,Y.toLowerCase());if(J<O)O=J,Q=Y}return O<=A?Q:null}function WB(B,K){if(B.length===0)return K.length;if(K.length===0)return B.length;let A=[];for(let Q=0;Q<=K.length;Q++)A[Q]=[Q];for(let Q=0;Q<=B.length;Q++)A[0][Q]=Q;for(let Q=1;Q<=K.length;Q++)for(let O=1;O<=B.length;O++)if(K[Q-1]===B[O-1])A[Q][O]=A[Q-1][O-1];else A[Q][O]=Math.min(A[Q-1][O-1]+1,A[Q][O-1]+1,A[Q-1][O]+1);return A[K.length][B.length]}class C{state;variableStart;variableEnd;blockStart;blockEnd;commentStart;commentEnd;constructor(B,K={}){this.state={source:B,pos:0,line:1,column:1,tokens:[]},this.variableStart=K.variableStart??"{{",this.variableEnd=K.variableEnd??"}}",this.blockStart=K.blockStart??"{%",this.blockEnd=K.blockEnd??"%}",this.commentStart=K.commentStart??"{#",this.commentEnd=K.commentEnd??"#}"}tokenize(){while(!this.isAtEnd())this.scanToken();return this.addToken("EOF",""),this.state.tokens}scanToken(){if(this.match(this.variableStart)){this.addToken("VARIABLE_START",this.variableStart),this.scanExpression(this.variableEnd,"VARIABLE_END");return}if(this.match(this.blockStart)){let B=this.peek()==="-";if(B)this.advance();let K=this.state.pos;if(this.skipWhitespace(),this.checkWord("raw")||this.checkWord("verbatim")){let A=this.checkWord("raw")?"raw":"verbatim";this.scanRawBlock(A,B);return}this.state.pos=K,this.addToken("BLOCK_START",this.blockStart+(B?"-":"")),this.scanExpression(this.blockEnd,"BLOCK_END");return}if(this.match(this.commentStart)){this.scanComment();return}this.scanText()}checkWord(B){let K=this.state.pos;for(let Q=0;Q<B.length;Q++)if(this.state.source[K+Q]?.toLowerCase()!==B[Q])return!1;let A=this.state.source[K+B.length];return!A||!this.isAlphaNumeric(A)}scanRawBlock(B,K){let A=this.state.line,Q=this.state.column;for(let Y=0;Y<B.length;Y++)this.advance();if(this.skipWhitespace(),this.peek()==="-")this.advance();if(!this.match(this.blockEnd))throw new P(`Expected '${this.blockEnd}' after '${B}'`,{line:this.state.line,column:this.state.column,source:this.state.source});let O=`end${B}`,U=this.state.pos;while(!this.isAtEnd()){if(this.check(this.blockStart)){let Y=this.state.pos,J=this.state.line,$=this.state.column;if(this.match(this.blockStart),this.peek()==="-")this.advance();if(this.skipWhitespace(),this.checkWord(O)){let Z=this.state.source.slice(U,Y);if(Z.length>0)this.state.tokens.push({type:"TEXT",value:Z,line:A,column:Q});for(let X=0;X<O.length;X++)this.advance();if(this.skipWhitespace(),this.peek()==="-")this.advance();if(!this.match(this.blockEnd))throw new P(`Expected '${this.blockEnd}' after '${O}'`,{line:this.state.line,column:this.state.column,source:this.state.source});return}this.state.pos=Y,this.state.line=J,this.state.column=$}if(this.peek()===`
|
|
6
6
|
`)this.state.line++,this.state.column=0;this.advance()}throw new P(`Unclosed '${B}' block`,{line:A,column:Q,source:this.state.source,suggestion:`Add {% end${B} %} to close the block`})}scanText(){let B=this.state.pos,K=this.state.line,A=this.state.column;while(!this.isAtEnd()){if(this.check(this.variableStart)||this.check(this.blockStart)||this.check(this.commentStart))break;if(this.peek()===`
|
|
7
7
|
`)this.state.line++,this.state.column=0;this.advance()}if(this.state.pos>B){let Q=this.state.source.slice(B,this.state.pos);this.state.tokens.push({type:"TEXT",value:Q,line:K,column:A})}}scanExpression(B,K){this.skipWhitespace();while(!this.isAtEnd()){if(this.skipWhitespace(),this.peek()==="-"&&this.check(B,1))this.advance();if(this.match(B)){this.addToken(K,B);return}this.scanExpressionToken()}throw new P("Unclosed template tag",{line:this.state.line,column:this.state.column,source:this.state.source,suggestion:`Add closing delimiter '${B}'`})}scanExpressionToken(){if(this.skipWhitespace(),this.isAtEnd())return;let B=this.peek();if(B==='"'||B==="'"){this.scanString(B);return}if(this.isDigit(B)){this.scanNumber();return}if(this.isAlpha(B)||B==="_"){this.scanIdentifier();return}this.scanOperator()}scanString(B){this.advance();let K=this.state.pos;while(!this.isAtEnd()&&this.peek()!==B){if(this.peek()==="\\"&&this.peekNext()===B)this.advance();if(this.peek()===`
|
|
8
|
-
`)this.state.line++,this.state.column=0;this.advance()}if(this.isAtEnd())throw new P("Unterminated string literal",{line:this.state.line,column:this.state.column,source:this.state.source,suggestion:`Add closing quote '${B}'`});let A=this.state.source.slice(K,this.state.pos);this.advance(),this.addToken("STRING",A)}scanNumber(){let B=this.state.pos;while(this.isDigit(this.peek()))this.advance();if(this.peek()==="."&&this.isDigit(this.peekNext())){this.advance();while(this.isDigit(this.peek()))this.advance()}let K=this.state.source.slice(B,this.state.pos);this.addToken("NUMBER",K)}scanIdentifier(){let B=this.state.pos;while(this.isAlphaNumeric(this.peek())||this.peek()==="_")this.advance();let K=this.state.source.slice(B,this.state.pos),A=m[K]??"NAME";this.addToken(A,K)}scanOperator(){let B=this.advance();switch(B){case".":this.addToken("DOT",B);break;case",":this.addToken("COMMA",B);break;case":":this.addToken("COLON",B);break;case"|":this.addToken("PIPE",B);break;case"(":this.addToken("LPAREN",B);break;case")":this.addToken("RPAREN",B);break;case"[":this.addToken("LBRACKET",B);break;case"]":this.addToken("RBRACKET",B);break;case"{":this.addToken("LBRACE",B);break;case"}":this.addToken("RBRACE",B);break;case"+":this.addToken("ADD",B);break;case"-":this.addToken("SUB",B);break;case"*":this.addToken("MUL",B);break;case"/":this.addToken("DIV",B);break;case"%":this.addToken("MOD",B);break;case"~":this.addToken("TILDE",B);break;case"=":if(this.match("="))this.addToken("EQ","==");else this.addToken("ASSIGN","=");break;case"!":if(this.match("="))this.addToken("NE","!=");else throw new P("Unexpected character '!'",{line:this.state.line,column:this.state.column-1,source:this.state.source,suggestion:"Use '!=' for not-equal comparison or 'not' for negation"});break;case"<":if(this.match("="))this.addToken("LE","<=");else this.addToken("LT","<");break;case">":if(this.match("="))this.addToken("GE",">=");else this.addToken("GT",">");break;default:if(!this.isWhitespace(B))throw new P(`Unexpected character '${B}'`,{line:this.state.line,column:this.state.column-1,source:this.state.source})}}scanComment(){while(!this.isAtEnd()&&!this.check(this.commentEnd)){if(this.peek()===`
|
|
9
|
-
`)this.state.line++,this.state.column=0;this.advance()}if(!this.isAtEnd())this.match(this.commentEnd)}isAtEnd(){return this.state.pos>=this.state.source.length}peek(){if(this.isAtEnd())return"\x00";return this.state.source[this.state.pos]}peekNext(){if(this.state.pos+1>=this.state.source.length)return"\x00";return this.state.source[this.state.pos+1]}advance(){let B=this.state.source[this.state.pos];return this.state.pos++,this.state.column++,B}match(B,K=0){let A=this.state.source,Q=this.state.pos+K
|
|
8
|
+
`)this.state.line++,this.state.column=0;this.advance()}if(this.isAtEnd())throw new P("Unterminated string literal",{line:this.state.line,column:this.state.column,source:this.state.source,suggestion:`Add closing quote '${B}'`});let A=this.state.source.slice(K,this.state.pos);this.advance(),this.addToken("STRING",A)}scanNumber(){let B=this.state.pos;while(this.isDigit(this.peek()))this.advance();if(this.peek()==="."&&this.isDigit(this.peekNext())){this.advance();while(this.isDigit(this.peek()))this.advance()}let K=this.state.source.slice(B,this.state.pos);this.addToken("NUMBER",K)}scanIdentifier(){let B=this.state.pos;while(this.isAlphaNumeric(this.peek())||this.peek()==="_")this.advance();let K=this.state.source.slice(B,this.state.pos),A=m[K]??"NAME";this.addToken(A,K)}scanOperator(){let B=this.advance();switch(B){case".":this.addToken("DOT",B);break;case",":this.addToken("COMMA",B);break;case":":this.addToken("COLON",B);break;case"|":this.addToken("PIPE",B);break;case"(":this.addToken("LPAREN",B);break;case")":this.addToken("RPAREN",B);break;case"[":this.addToken("LBRACKET",B);break;case"]":this.addToken("RBRACKET",B);break;case"{":this.addToken("LBRACE",B);break;case"}":this.addToken("RBRACE",B);break;case"+":this.addToken("ADD",B);break;case"-":this.addToken("SUB",B);break;case"*":this.addToken("MUL",B);break;case"/":this.addToken("DIV",B);break;case"%":this.addToken("MOD",B);break;case"~":this.addToken("TILDE",B);break;case"=":if(this.match("="))this.addToken("EQ","==");else this.addToken("ASSIGN","=");break;case"!":if(this.match("="))this.addToken("NE","!=");else throw new P("Unexpected character '!'",{line:this.state.line,column:this.state.column-1,source:this.state.source,suggestion:"Use '!=' for not-equal comparison or 'not' for negation"});break;case"<":if(this.match("="))this.addToken("LE","<=");else this.addToken("LT","<");break;case">":if(this.match("="))this.addToken("GE",">=");else this.addToken("GT",">");break;case"?":if(this.match("?"))this.addToken("NULLCOALESCE","??");else this.addToken("QUESTION","?");break;default:if(!this.isWhitespace(B))throw new P(`Unexpected character '${B}'`,{line:this.state.line,column:this.state.column-1,source:this.state.source})}}scanComment(){while(!this.isAtEnd()&&!this.check(this.commentEnd)){if(this.peek()===`
|
|
9
|
+
`)this.state.line++,this.state.column=0;this.advance()}if(!this.isAtEnd())this.match(this.commentEnd)}isAtEnd(){return this.state.pos>=this.state.source.length}peek(){if(this.isAtEnd())return"\x00";return this.state.source[this.state.pos]}peekNext(){if(this.state.pos+1>=this.state.source.length)return"\x00";return this.state.source[this.state.pos+1]}advance(){let B=this.state.source[this.state.pos];return this.state.pos++,this.state.column++,B}match(B,K=0){let A=this.state.source,Q=this.state.pos+K,O=B.length;if(Q+O>A.length)return!1;for(let U=0;U<O;U++)if(A[Q+U]!==B[U])return!1;if(K===0)this.state.pos+=O,this.state.column+=O;return!0}check(B,K=0){let A=this.state.source,Q=this.state.pos+K,O=B.length;if(Q+O>A.length)return!1;for(let U=0;U<O;U++)if(A[Q+U]!==B[U])return!1;return!0}skipWhitespace(){while(!this.isAtEnd()&&this.isWhitespace(this.peek())){if(this.peek()===`
|
|
10
10
|
`)this.state.line++,this.state.column=0;this.advance()}}isWhitespace(B){return B===" "||B==="\t"||B===`
|
|
11
|
-
`||B==="\r"}isDigit(B){let K=B.charCodeAt(0);return K>=48&&K<=57}isAlpha(B){let K=B.charCodeAt(0);return K>=97&&K<=122||K>=65&&K<=90}isAlphaNumeric(B){let K=B.charCodeAt(0);return K>=48&&K<=57||K>=97&&K<=122||K>=65&&K<=90}addToken(B,K){this.state.tokens.push({type:B,value:K,line:this.state.line,column:this.state.column-K.length})}}class N{tokens;current=0;source;constructor(B,K){this.tokens=B,this.source=K}parse(){let B=[];while(!this.isAtEnd()){let K=this.parseStatement();if(K)B.push(K)}return{type:"Template",body:B,line:1,column:1}}parseStatement(){switch(this.peek().type){case"TEXT":return this.parseText();case"VARIABLE_START":return this.parseOutput();case"BLOCK_START":return this.parseBlock();case"EOF":return null;default:return this.advance(),null}}parseText(){let B=this.advance();return{type:"Text",value:B.value,line:B.line,column:B.column}}parseOutput(){let B=this.advance(),K=this.parseExpression();return this.expect("VARIABLE_END"),{type:"Output",expression:K,line:B.line,column:B.column}}parseBlock(){let B=this.advance(),K=this.expect("NAME");switch(K.value){case"if":return this.parseIf(B);case"for":return this.parseFor(B);case"block":return this.parseBlockTag(B);case"extends":return this.parseExtends(B);case"include":return this.parseInclude(B);case"set":return this.parseSet(B);case"with":return this.parseWith(B);case"load":return this.parseLoad(B);case"url":return this.parseUrl(B);case"static":return this.parseStatic(B);case"now":return this.parseNow(B);case"comment":return this.parseComment(B);case"spaceless":case"autoescape":case"verbatim":return this.parseSimpleBlock(B,K.value);case"cycle":return this.parseCycle(B);case"firstof":return this.parseFirstof(B);case"ifchanged":return this.parseIfchanged(B);case"regroup":return this.parseRegroup(B);case"widthratio":return this.parseWidthratio(B);case"lorem":return this.parseLorem(B);case"csrf_token":return this.parseCsrfToken(B);case"debug":return this.parseDebug(B);case"templatetag":return this.parseTemplatetag(B);case"ifequal":return this.parseIfequal(B,!1);case"ifnotequal":return this.parseIfequal(B,!0);default:return this.skipToBlockEnd(),null}}parseIf(B){let K=this.parseExpression();this.expect("BLOCK_END");let A=[],Q=[],$=[];while(!this.isAtEnd()){if(this.checkBlockTag("elif")||this.checkBlockTag("else")||this.checkBlockTag("endif"))break;let Z=this.parseStatement();if(Z)A.push(Z)}while(this.checkBlockTag("elif")){this.advance(),this.advance();let Z=this.parseExpression();this.expect("BLOCK_END");let U=[];while(!this.isAtEnd()){if(this.checkBlockTag("elif")||this.checkBlockTag("else")||this.checkBlockTag("endif"))break;let Y=this.parseStatement();if(Y)U.push(Y)}Q.push({test:Z,body:U})}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endif"))break;let Z=this.parseStatement();if(Z)$.push(Z)}}return this.expectBlockTag("endif"),{type:"If",test:K,body:A,elifs:Q,else_:$,line:B.line,column:B.column}}parseFor(B){let K,A=this.expect("NAME").value;if(this.check("COMMA")){let O=[A];while(this.match("COMMA"))O.push(this.expect("NAME").value);K=O}else K=A;let Q=this.expect("NAME");if(Q.value!=="in")throw this.error(`Expected 'in' in for loop, got '${Q.value}'`);let $=this.parseExpression(),Z=this.check("NAME")&&this.peek().value==="recursive";if(Z)this.advance();this.expect("BLOCK_END");let U=[],Y=[];while(!this.isAtEnd()){if(this.checkBlockTag("empty")||this.checkBlockTag("else")||this.checkBlockTag("endfor"))break;let O=this.parseStatement();if(O)U.push(O)}if(this.checkBlockTag("empty")||this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endfor"))break;let O=this.parseStatement();if(O)Y.push(O)}}return this.expectBlockTag("endfor"),{type:"For",target:K,iter:$,body:U,else_:Y,recursive:Z,line:B.line,column:B.column}}parseBlockTag(B){let K=this.expect("NAME").value,A=this.check("NAME")&&this.peek().value==="scoped";if(A)this.advance();this.expect("BLOCK_END");let Q=[];while(!this.isAtEnd()){if(this.checkBlockTag("endblock"))break;let $=this.parseStatement();if($)Q.push($)}if(this.advance(),this.advance(),this.check("NAME"))this.advance();return this.expect("BLOCK_END"),{type:"Block",name:K,body:Q,scoped:A,line:B.line,column:B.column}}parseExtends(B){let K=this.parseExpression();return this.expect("BLOCK_END"),{type:"Extends",template:K,line:B.line,column:B.column}}parseInclude(B){let K=this.parseExpression(),A=null,Q=!1,$=!1;while(this.check("NAME")){let Z=this.peek().value;if(Z==="ignore"&&this.peekNext()?.value==="missing")this.advance(),this.advance(),$=!0;else if(Z==="with")this.advance(),A=this.parseKeywordArgs();else if(Z==="only")this.advance(),Q=!0;else if(Z==="without"){if(this.advance(),this.check("NAME")&&this.peek().value==="context")this.advance(),Q=!0}else break}return this.expect("BLOCK_END"),{type:"Include",template:K,context:A,only:Q,ignoreMissing:$,line:B.line,column:B.column}}parseSet(B){let K=this.expect("NAME").value;this.expect("ASSIGN");let A=this.parseExpression();return this.expect("BLOCK_END"),{type:"Set",target:K,value:A,line:B.line,column:B.column}}parseWith(B){let K=[];do{let Q=this.expect("NAME").value;this.expect("ASSIGN");let $=this.parseExpression();K.push({target:Q,value:$})}while(this.match("COMMA")||this.check("NAME")&&this.peekNext()?.type==="ASSIGN");this.expect("BLOCK_END");let A=[];while(!this.isAtEnd()){if(this.checkBlockTag("endwith"))break;let Q=this.parseStatement();if(Q)A.push(Q)}return this.expectBlockTag("endwith"),{type:"With",assignments:K,body:A,line:B.line,column:B.column}}parseLoad(B){let K=[];while(this.check("NAME"))K.push(this.advance().value);return this.expect("BLOCK_END"),{type:"Load",names:K,line:B.line,column:B.column}}parseUrl(B){let K=this.parseExpression(),A=[],Q={},$=null;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){this.advance(),$=this.expect("NAME").value;break}if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let Z=this.advance().value;this.advance(),Q[Z]=this.parseExpression()}else A.push(this.parseExpression())}return this.expect("BLOCK_END"),{type:"Url",name:K,args:A,kwargs:Q,asVar:$,line:B.line,column:B.column}}parseStatic(B){let K=this.parseExpression(),A=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),A=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Static",path:K,asVar:A,line:B.line,column:B.column}}parseNow(B){let K=this.parseExpression(),A=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),A=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Now",format:K,asVar:A,line:B.line,column:B.column}}parseComment(B){this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endcomment"))break;this.advance()}return this.expectBlockTag("endcomment"),null}parseSimpleBlock(B,K){this.skipToBlockEnd();let A=`end${K}`;while(!this.isAtEnd()){if(this.checkBlockTag(A))break;this.advance()}if(this.checkBlockTag(A))this.advance(),this.advance(),this.expect("BLOCK_END");return null}parseCycle(B){let K=[],A=null,Q=!1;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){if(this.advance(),A=this.expect("NAME").value,this.check("NAME")&&this.peek().value==="silent")this.advance(),Q=!0;break}K.push(this.parseExpression())}return this.expect("BLOCK_END"),{type:"Cycle",values:K,asVar:A,silent:Q,line:B.line,column:B.column}}parseFirstof(B){let K=[],A=null,Q=null;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){this.advance(),Q=this.expect("NAME").value;break}K.push(this.parseExpression())}if(K.length>0){let $=K[K.length-1];if($.type==="Literal"&&typeof $.value==="string")A=K.pop()}return this.expect("BLOCK_END"),{type:"Firstof",values:K,fallback:A,asVar:Q,line:B.line,column:B.column}}parseIfchanged(B){let K=[];while(!this.check("BLOCK_END"))K.push(this.parseExpression());this.expect("BLOCK_END");let A=[],Q=[];while(!this.isAtEnd()){if(this.checkBlockTag("else")||this.checkBlockTag("endifchanged"))break;let $=this.parseStatement();if($)A.push($)}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endifchanged"))break;let $=this.parseStatement();if($)Q.push($)}}return this.expectBlockTag("endifchanged"),{type:"Ifchanged",values:K,body:A,else_:Q,line:B.line,column:B.column}}parseRegroup(B){let K=this.parseExpression();this.expectName("by");let A=this.expect("NAME").value;this.expectName("as");let Q=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Regroup",target:K,key:A,asVar:Q,line:B.line,column:B.column}}parseWidthratio(B){let K=this.parseExpression(),A=this.parseExpression(),Q=this.parseExpression(),$=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),$=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Widthratio",value:K,maxValue:A,maxWidth:Q,asVar:$,line:B.line,column:B.column}}parseLorem(B){let K=null,A="p",Q=!1;if(this.check("NUMBER"))K={type:"Literal",value:parseInt(this.advance().value,10),line:B.line,column:B.column};if(this.check("NAME")){let $=this.peek().value.toLowerCase();if($==="w"||$==="p"||$==="b")A=$,this.advance()}if(this.check("NAME")&&this.peek().value==="random")Q=!0,this.advance();return this.expect("BLOCK_END"),{type:"Lorem",count:K,method:A,random:Q,line:B.line,column:B.column}}parseCsrfToken(B){return this.expect("BLOCK_END"),{type:"CsrfToken",line:B.line,column:B.column}}parseDebug(B){return this.expect("BLOCK_END"),{type:"Debug",line:B.line,column:B.column}}parseTemplatetag(B){let K=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Templatetag",tagType:K,line:B.line,column:B.column}}parseIfequal(B,K){let A=this.parseExpression(),Q=this.parseExpression();this.expect("BLOCK_END");let $={type:"Compare",left:A,ops:[{operator:K?"!=":"==",right:Q}],line:B.line,column:B.column},Z=[],U=[],Y=K?"endifnotequal":"endifequal";while(!this.isAtEnd()){if(this.checkBlockTag("else")||this.checkBlockTag(Y))break;let O=this.parseStatement();if(O)Z.push(O)}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag(Y))break;let O=this.parseStatement();if(O)U.push(O)}}return this.expectBlockTag(Y),{type:"If",test:$,body:Z,elifs:[],else_:U,line:B.line,column:B.column}}parseExpression(){return this.parseConditional()}parseConditional(){let B=this.parseOr();if(this.check("NAME")&&this.peek().value==="if"){this.advance();let K=this.parseOr();this.expectName("else");let A=this.parseConditional();B={type:"Conditional",test:K,trueExpr:B,falseExpr:A,line:B.line,column:B.column}}return B}parseOr(){let B=this.parseAnd();while(this.check("OR")||this.check("NAME")&&this.peek().value==="or"){this.advance();let K=this.parseAnd();B={type:"BinaryOp",operator:"or",left:B,right:K,line:B.line,column:B.column}}return B}parseAnd(){let B=this.parseNot();while(this.check("AND")||this.check("NAME")&&this.peek().value==="and"){this.advance();let K=this.parseNot();B={type:"BinaryOp",operator:"and",left:B,right:K,line:B.line,column:B.column}}return B}parseNot(){if(this.check("NOT")||this.check("NAME")&&this.peek().value==="not"){let B=this.advance();return{type:"UnaryOp",operator:"not",operand:this.parseNot(),line:B.line,column:B.column}}return this.parseCompare()}parseCompare(){let B=this.parseAddSub(),K=[];while(!0){let A=null;if(this.match("EQ"))A="==";else if(this.match("NE"))A="!=";else if(this.match("LT"))A="<";else if(this.match("GT"))A=">";else if(this.match("LE"))A="<=";else if(this.match("GE"))A=">=";else if(this.check("NAME")){let $=this.peek().value;if($==="in")this.advance(),A="in";else if($==="not"&&this.peekNext()?.value==="in")this.advance(),this.advance(),A="not in";else if($==="is"){this.advance();let Z=this.check("NOT");if(Z)this.advance();let Y=this.expect("NAME").value,O=[];if(this.match("LPAREN")){while(!this.check("RPAREN"))if(O.push(this.parseExpression()),!this.check("RPAREN"))this.expect("COMMA");this.expect("RPAREN")}B={type:"TestExpr",node:B,test:Y,args:O,negated:Z,line:B.line,column:B.column};continue}}if(!A)break;let Q=this.parseAddSub();K.push({operator:A,right:Q})}if(K.length===0)return B;return{type:"Compare",left:B,ops:K,line:B.line,column:B.column}}parseAddSub(){let B=this.parseMulDiv();while(this.check("ADD")||this.check("SUB")||this.check("TILDE")){let K=this.advance(),A=this.parseMulDiv();B={type:"BinaryOp",operator:K.value,left:B,right:A,line:B.line,column:B.column}}return B}parseMulDiv(){let B=this.parseUnary();while(this.check("MUL")||this.check("DIV")||this.check("MOD")){let K=this.advance(),A=this.parseUnary();B={type:"BinaryOp",operator:K.value,left:B,right:A,line:B.line,column:B.column}}return B}parseUnary(){if(this.check("SUB")||this.check("ADD")){let B=this.advance(),K=this.parseUnary();return{type:"UnaryOp",operator:B.value,operand:K,line:B.line,column:B.column}}return this.parseFilter()}parseFilter(){let B=this.parsePostfix();while(this.match("PIPE")){let K=this.expect("NAME").value,A=[],Q={};if(this.match("COLON"))if(this.check("SUB")||this.check("ADD")){let $=this.advance(),Z=this.parsePostfix();A.push({type:"UnaryOp",operator:$.value,operand:Z,line:$.line,column:$.column})}else A.push(this.parsePostfix());else if(this.match("LPAREN")){while(!this.check("RPAREN")){if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let $=this.advance().value;this.advance(),Q[$]=this.parseExpression()}else A.push(this.parseExpression());if(!this.check("RPAREN"))this.expect("COMMA")}this.expect("RPAREN")}B={type:"FilterExpr",node:B,filter:K,args:A,kwargs:Q,line:B.line,column:B.column}}return B}parsePostfix(){let B=this.parsePrimary();while(!0)if(this.match("DOT")){let K;if(this.check("NUMBER"))K=this.advance().value;else K=this.expect("NAME").value;B={type:"GetAttr",object:B,attribute:K,line:B.line,column:B.column}}else if(this.match("LBRACKET")){let K=this.parseExpression();this.expect("RBRACKET"),B={type:"GetItem",object:B,index:K,line:B.line,column:B.column}}else if(this.match("LPAREN")){let K=[],A={};while(!this.check("RPAREN")){if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let Q=this.advance().value;this.advance(),A[Q]=this.parseExpression()}else K.push(this.parseExpression());if(!this.check("RPAREN"))this.expect("COMMA")}this.expect("RPAREN"),B={type:"FunctionCall",callee:B,args:K,kwargs:A,line:B.line,column:B.column}}else break;return B}parsePrimary(){let B=this.peek();if(this.match("STRING"))return{type:"Literal",value:B.value,line:B.line,column:B.column};if(this.match("NUMBER"))return{type:"Literal",value:B.value.includes(".")?parseFloat(B.value):parseInt(B.value,10),line:B.line,column:B.column};if(this.check("NAME")){let K=this.advance().value;if(K==="true"||K==="True")return{type:"Literal",value:!0,line:B.line,column:B.column};if(K==="false"||K==="False")return{type:"Literal",value:!1,line:B.line,column:B.column};if(K==="none"||K==="None"||K==="null")return{type:"Literal",value:null,line:B.line,column:B.column};return{type:"Name",name:K,line:B.line,column:B.column}}if(this.match("LPAREN")){let K=this.parseExpression();return this.expect("RPAREN"),K}if(this.match("LBRACKET")){let K=[];while(!this.check("RBRACKET"))if(K.push(this.parseExpression()),!this.check("RBRACKET"))this.expect("COMMA");return this.expect("RBRACKET"),{type:"Array",elements:K,line:B.line,column:B.column}}if(this.match("LBRACE")){let K=[];while(!this.check("RBRACE")){let A=this.parseExpression();this.expect("COLON");let Q=this.parseExpression();if(K.push({key:A,value:Q}),!this.check("RBRACE"))this.expect("COMMA")}return this.expect("RBRACE"),{type:"Object",pairs:K,line:B.line,column:B.column}}throw this.error(`Unexpected token: ${B.type} (${B.value})`)}parseKeywordArgs(){let B={};while(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let K=this.advance().value;this.advance(),B[K]=this.parseExpression()}return B}checkBlockTag(B){if(this.peek().type!=="BLOCK_START")return!1;let K=this.current+1;if(K>=this.tokens.length)return!1;let A=this.tokens[K];return A.type==="NAME"&&A.value===B}expectBlockTag(B){this.advance();let K=this.expect("NAME");if(K.value!==B)throw this.error(`Expected '${B}', got '${K.value}'`);this.expect("BLOCK_END")}expectName(B){let K=this.expect("NAME");if(K.value!==B)throw this.error(`Expected '${B}', got '${K.value}'`)}skipToBlockEnd(){while(!this.isAtEnd()&&!this.check("BLOCK_END"))this.advance();if(this.check("BLOCK_END"))this.advance()}isAtEnd(){return this.peek().type==="EOF"}peek(){return this.tokens[this.current]}peekNext(){if(this.current+1>=this.tokens.length)return null;return this.tokens[this.current+1]}advance(){if(!this.isAtEnd())this.current++;return this.tokens[this.current-1]}check(B){if(this.isAtEnd())return!1;return this.peek().type===B}match(B){if(this.check(B))return this.advance(),!0;return!1}expect(B){if(this.check(B))return this.advance();let K=this.peek();throw this.error(`Expected ${B}, got ${K.type} (${K.value})`)}error(B){let K=this.peek();return new P(B,{line:K.line,column:K.column,source:this.source})}}function PB(B,K,A,Q,$){let Z=B.length,U=Z-K,Y={_items:B,_idx:K,counter:K+1,counter0:K,first:K===0,last:K===Z-1,length:Z,index:K+1,index0:K,depth:A,depth0:A-1,revcounter:U,revcounter0:U-1,revindex:U,revindex0:U-1,get previtem(){return this._idx>0?this._items[this._idx-1]:void 0},get nextitem(){return this._idx<this._items.length-1?this._items[this._idx+1]:void 0},cycle(...O){return O[this._idx%O.length]},changed:(O)=>{let J=O!==Q.value;return Q.value=O,J}};if($)Y.parentloop=$;return Y}class w{scopes=[];parent=null;_forloopStack=[];_lastCycleValue={value:null};_currentForloop=null;_currentScope;constructor(B={},K=null){this.parent=K,this._currentScope={...B},this.scopes.push(this._currentScope)}get(B){if(B==="forloop"||B==="loop")return this._currentForloop;for(let K=this.scopes.length-1;K>=0;K--){let A=this.scopes[K];if(B in A)return A[B]}return this.parent?this.parent.get(B):void 0}set(B,K){this._currentScope[B]=K}has(B){for(let K=this.scopes.length-1;K>=0;K--)if(B in this.scopes[K])return!0;return this.parent?this.parent.has(B):!1}push(B={}){this._currentScope={...B},this.scopes.push(this._currentScope)}pop(){if(this.scopes.length>1)this.scopes.pop(),this._currentScope=this.scopes[this.scopes.length-1]}derived(B={}){return new w(B,this)}pushForLoop(B,K){let A=this._forloopStack.length+1,Q=this._forloopStack.length>0?this._forloopStack[this._forloopStack.length-1]:void 0,$=PB(B,K,A,this._lastCycleValue,Q);return this._forloopStack.push($),this._currentForloop=$,$}popForLoop(){this._forloopStack.pop(),this._currentForloop=this._forloopStack.length>0?this._forloopStack[this._forloopStack.length-1]:null}updateForLoop(B,K){let A=this._currentForloop;if(!A)return;let Q=K.length;if(A._idx=B,A._items!==K)A._items=K;A.counter=B+1,A.counter0=B,A.index=B+1,A.index0=B,A.first=B===0,A.last=B===Q-1;let $=Q-B;A.revcounter=$,A.revcounter0=$-1,A.revindex=$,A.revindex0=$-1}toObject(){let B={};if(this.parent)Object.assign(B,this.parent.toObject());for(let K of this.scopes)Object.assign(B,K);return B}}var DB=/\b\w/g,_B=/<[^>]*>/g,LB=/[^\w\s-]/g,jB=/[\s_-]+/g,qB=/^-+|-+$/g,t=/(https?:\/\/[^\s]+)/g,CB=/[a-zA-Z]/g,NB=/\n\n+/,e=/\n/g,BB=/\s+/,SB=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wB=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],VB=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],bB=["January","February","March","April","May","June","July","August","September","October","November","December"],hB=["Jan.","Feb.","March","April","May","June","July","Aug.","Sept.","Oct.","Nov.","Dec."],fB=(B)=>String(B).toUpperCase(),kB=(B)=>String(B).toLowerCase(),yB=(B)=>{let K=String(B);return K.charAt(0).toUpperCase()+K.slice(1).toLowerCase()},TB=(B)=>{let K=String(B);return K.charAt(0).toUpperCase()+K.slice(1)},gB=(B)=>String(B).replace(DB,(K)=>K.toUpperCase()),xB=(B)=>String(B).trim(),mB=(B)=>String(B).replace(_B,""),l=(B)=>{if(B?.__safe__)return B;let K=Bun.escapeHTML(String(B)),A=new String(K);return A.__safe__=!0,A},pB=(B)=>{let K=new String(B);return K.__safe__=!0,K},cB=(B)=>JSON.stringify(String(B)).slice(1,-1),vB=(B)=>{let A=String(B).split(NB),Q="";for(let Z=0;Z<A.length;Z++){if(Z>0)Q+=`
|
|
12
|
-
`;Q+=`<p>${A[
|
|
13
|
-
`)=>{let
|
|
14
|
-
`),
|
|
15
|
-
`;let
|
|
16
|
-
`),A=String(K.length).length,Q="";for(let
|
|
17
|
-
`;Q+=`${String(
|
|
18
|
-
${
|
|
19
|
-
${K(
|
|
20
|
-
`;else{if(
|
|
21
|
-
${
|
|
22
|
-
${K(
|
|
23
|
-
${
|
|
24
|
-
`}}return Y},A=K(B),Q=new String(A);return Q.__safe__=!0,Q},lK=(B)=>{let K=String(B).replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/"/g,"\\\""),A=new String(K);return A.__safe__=!0,A},oK=(B,K)=>{let A=parseInt(String(B),10);if(isNaN(A))return B;let Q=String(Math.abs(A)),$=Number(K)||1;if($<1||$>Q.length)return B;return parseInt(Q[Q.length-$],10)},aK=(B)=>{return String(B).replace(/ /g,"%20").replace(/"/g,"%22").replace(/</g,"%3C").replace(/>/g,"%3E").replace(/\\/g,"%5C").replace(/\^/g,"%5E").replace(/`/g,"%60").replace(/\{/g,"%7B").replace(/\|/g,"%7C").replace(/\}/g,"%7D")},tK=(B,K)=>{let A=JSON.stringify(B).replace(/</g,"\\u003C").replace(/>/g,"\\u003E").replace(/&/g,"\\u0026"),$=`<script${K?` id="${String(K)}"`:""} type="application/json">${A}</script>`,Z=new String($);return Z.__safe__=!0,Z},eK=(B)=>{if(!Array.isArray(B))return B;return B.map((K)=>{let A=new String(K);return A.__safe__=!0,A})},BA=(B,K)=>{let A=String(K),Q=B;if(A==="s")return String(Q);if(A==="d"||A==="i")return String(parseInt(String(Q),10)||0);if(A==="f")return String(parseFloat(String(Q))||0);if(A==="x")return(parseInt(String(Q),10)||0).toString(16);if(A==="X")return(parseInt(String(Q),10)||0).toString(16).toUpperCase();if(A==="o")return(parseInt(String(Q),10)||0).toString(8);if(A==="b")return(parseInt(String(Q),10)||0).toString(2);if(A==="e")return(parseFloat(String(Q))||0).toExponential();let $=A.match(/^\.?(\d+)f$/);if($){let U=parseInt($[1],10);return(parseFloat(String(Q))||0).toFixed(U)}let Z=A.match(/^(\d+)([sd])$/);if(Z){let U=parseInt(Z[1],10),Y=Z[2];return(Y==="d"?String(parseInt(String(Q),10)||0):String(Q)).padStart(U,Y==="d"?"0":" ")}return String(Q)},KA=(B,K=30)=>{let A=String(B),Q=Number(K),$="",Z=0,U=!1,Y=[];for(let J=0;J<A.length&&Z<Q;J++){let X=A[J];if(X==="<"){U=!0;let M=A.slice(J).match(/^<\/(\w+)/),G=A.slice(J).match(/^<(\w+)/);if(M){let R=M[1].toLowerCase(),F=Y.lastIndexOf(R);if(F!==-1)Y.splice(F,1)}else if(G&&!A.slice(J).match(/^<\w+[^>]*\/>/))Y.push(G[1].toLowerCase())}if($+=X,X===">")U=!1;else if(!U)Z++}if(Z>=Q&&A.length>$.length)$+="...";for(let J=Y.length-1;J>=0;J--)$+=`</${Y[J]}>`;let O=new String($);return O.__safe__=!0,O},AA=(B,K=15)=>{let A=String(B),Q=Number(K),$="",Z=0,U=!1,Y=!1,O=[];for(let X=0;X<A.length&&Z<Q;X++){let M=A[X];if(M==="<"){U=!0;let G=A.slice(X).match(/^<\/(\w+)/),R=A.slice(X).match(/^<(\w+)/);if(G){let F=G[1].toLowerCase(),W=O.lastIndexOf(F);if(W!==-1)O.splice(W,1)}else if(R&&!A.slice(X).match(/^<\w+[^>]*\/>/))O.push(R[1].toLowerCase())}if($+=M,M===">")U=!1;else if(!U){let G=/\s/.test(M);if(!G&&!Y)Y=!0;else if(G&&Y)Y=!1,Z++}}if(Y)Z++;if(Z>=Q)$=$.trimEnd()+"...";for(let X=O.length-1;X>=0;X--)$+=`</${O[X]}>`;let J=new String($);return J.__safe__=!0,J},$A=(B,K=15)=>{let A=Number(K),Q=String(B).replace(t,(Z)=>{let U=Z.length>A?Z.slice(0,A)+"...":Z;return`<a href="${Z}">${U}</a>`}),$=new String(Q);return $.__safe__=!0,$},QA=(B)=>{if(B==null||typeof B!=="object")return[];return Object.entries(B)},OA=(B,K=!0)=>{if(B==null||typeof B!=="object")return"";let A=[];for(let[U,Y]of Object.entries(B))if(Y===!0)A.push(U);else if(Y!==!1&&Y!=null){let O=Bun.escapeHTML(String(Y));A.push(`${U}="${O}"`)}let Q=A.join(" "),$=K&&Q?" "+Q:Q,Z=new String($);return Z.__safe__=!0,Z},h={upper:fB,lower:kB,capitalize:yB,capfirst:TB,title:gB,trim:xB,striptags:mB,escape:l,e:l,safe:pB,escapejs:cB,linebreaks:vB,linebreaksbr:iB,truncatechars:dB,truncatewords:sB,wordcount:uB,center:rB,ljust:nB,rjust:lB,cut:oB,slugify:aB,abs:tB,round:eB,int:BK,float:KK,floatformat:AK,add:$K,divisibleby:QK,filesizeformat:OK,length:KB,length_is:ZK,first:JK,last:YK,join:UK,slice:XK,reverse:MK,sort:GK,unique:FK,make_list:IK,dictsort:AB,dictsortreversed:RK,columns:HK,date:$B,time:EK,timesince:WK,timeuntil:PK,default:o,d:o,default_if_none:DK,yesno:_K,pluralize:LK,urlencode:jK,urlize:qK,json:a,tojson:a,random:CK,batch:NK,groupby:SK,wordwrap:wK,indent:VK,replace:bK,format:hK,string:fK,list:kK,map:yK,select:TK,reject:gK,selectattr:QB,rejectattr:xK,attr:mK,max:pK,min:cK,sum:vK,pprint:iK,forceescape:dK,phone2numeric:uK,linenumbers:rK,unordered_list:nK,addslashes:lK,get_digit:oK,iriencode:aK,json_script:tK,safeseq:eK,stringformat:BA,truncatechars_html:KA,truncatewords_html:AA,urlizetrunc:$A,items:QA,xmlattr:OA};var ZA=(B,K)=>{let A=Number(B),Q=Number(K);if(Q===0)return!1;return A%Q===0},JA=(B)=>{let K=Number(B);return Number.isInteger(K)&&K%2===0},YA=(B)=>{let K=Number(B);return Number.isInteger(K)&&K%2!==0},UA=(B)=>{return typeof B==="number"&&!isNaN(B)},XA=(B)=>{return Number.isInteger(B)},MA=(B)=>{return typeof B==="number"&&!Number.isInteger(B)&&!isNaN(B)},ZB=(B,K)=>Number(B)>Number(K),GA=(B,K)=>Number(B)>=Number(K),JB=(B,K)=>Number(B)<Number(K),FA=(B,K)=>Number(B)<=Number(K),IA=ZB,RA=JB,HA=(B)=>{return B!==c},c=(B)=>{return B===c},OB=(B)=>{return B===null},zA=(B)=>{return typeof B==="boolean"},EA=(B)=>{return typeof B==="string"},WA=(B)=>{return B!==null&&typeof B==="object"&&!Array.isArray(B)&&!(B instanceof Date)},PA=(B)=>{if(B==null)return!1;return typeof B==="string"||Array.isArray(B)||typeof B[Symbol.iterator]==="function"},DA=(B)=>{return Array.isArray(B)||typeof B==="string"},_A=(B)=>{return typeof B==="function"},LA=(B)=>{if(typeof B!=="string")return!1;return B===B.toLowerCase()&&B!==B.toUpperCase()},jA=(B)=>{if(typeof B!=="string")return!1;return B===B.toUpperCase()&&B!==B.toLowerCase()},qA=(B)=>{if(B==null)return!0;if(typeof B==="string"||Array.isArray(B))return B.length===0;if(typeof B==="object"){for(let K in B)return!1;return!0}return!1},CA=(B,K)=>{if(Array.isArray(K))return K.includes(B);if(typeof K==="string")return K.includes(String(B));if(typeof K==="object"&&K!==null)return B in K;return!1},YB=(B,K)=>B===K,NA=(B,K)=>B!==K,SA=(B,K)=>B===K,wA=YB,UB=(B)=>{if(B==null)return!1;if(typeof B==="boolean")return B;if(typeof B==="number")return B!==0;if(typeof B==="string")return B.length>0;if(Array.isArray(B))return B.length>0;if(typeof B==="object"){for(let K in B)return!0;return!1}return!0},VA=(B)=>!UB(B),bA=(B)=>B===!0,hA=(B)=>B===!1,f={divisibleby:ZA,even:JA,odd:YA,number:UA,integer:XA,float:MA,gt:ZB,ge:GA,lt:JB,le:FA,greaterthan:IA,lessthan:RA,defined:HA,undefined:c,none:OB,None:OB,boolean:zA,string:EA,mapping:WA,iterable:PA,sequence:DA,callable:_A,lower:LA,upper:jA,empty:qA,in:CA,eq:YB,ne:NA,sameas:SA,equalto:wA,truthy:UB,falsy:VA,true:bA,false:hA};class z{options;filters;tests;blocks=new Map;parentTemplate=null;source;constructor(B={}){if(this.options={autoescape:B.autoescape??!0,filters:B.filters??{},tests:B.tests??{},globals:B.globals??{},urlResolver:B.urlResolver??((K)=>`#${K}`),staticResolver:B.staticResolver??((K)=>`/static/${K}`),templateLoader:B.templateLoader??(async()=>{throw Error("Template loader not configured")}),timezone:B.timezone??void 0},this.filters={...h,...this.options.filters},this.options.timezone){let K=this.options.timezone;this.filters.date=(A,Q="N j, Y")=>{let $=A instanceof Date?A:new Date(A);if(isNaN($.getTime()))return"";return this.formatDate($,Q)},this.filters.time=(A,Q="H:i")=>{return this.filters.date(A,Q)}}this.tests={...f,...this.options.tests}}async render(B,K={}){let A=new w({...this.options.globals,...K});if(this.blocks.clear(),this.parentTemplate=null,this.templateNeedsAsync(B)){if(await this.collectBlocks(B,A),this.parentTemplate)return this.renderTemplateAsync(this.parentTemplate,A);return this.renderTemplateAsync(B,A)}return this.collectBlocksSync(B),this.renderTemplateSync(B,A)}templateNeedsAsync(B){for(let K of B.body){if(K.type==="Extends"||K.type==="Include")return!0;if(K.type==="If"){let A=K;if(this.nodesNeedAsync(A.body))return!0;for(let Q of A.elifs)if(this.nodesNeedAsync(Q.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="For"){let A=K;if(this.nodesNeedAsync(A.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="Block"){if(this.nodesNeedAsync(K.body))return!0}if(K.type==="With"){if(this.nodesNeedAsync(K.body))return!0}}return!1}nodesNeedAsync(B){for(let K of B){if(K.type==="Extends"||K.type==="Include")return!0;if(K.type==="If"){let A=K;if(this.nodesNeedAsync(A.body))return!0;for(let Q of A.elifs)if(this.nodesNeedAsync(Q.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="For"){let A=K;if(this.nodesNeedAsync(A.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="Block"){if(this.nodesNeedAsync(K.body))return!0}if(K.type==="With"){if(this.nodesNeedAsync(K.body))return!0}}return!1}collectBlocksSync(B){for(let K of B.body)if(K.type==="Block")this.blocks.set(K.name,K)}renderTemplateSync(B,K){let A=[];for(let Q of B.body){let $=this.renderNodeSync(Q,K);if($!==null)A.push($)}return A.join("")}renderNodeSync(B,K){if(B.type==="Text")return B.value;if(B.type==="Output")return this.stringify(this.eval(B.expression,K));switch(B.type){case"If":return this.renderIfSync(B,K);case"For":return this.renderForSync(B,K);case"Block":return this.renderBlockSync(B,K);case"Set":return K.set(B.target,this.eval(B.value,K)),"";case"With":return this.renderWithSync(B,K);case"Url":return this.renderUrlSync(B,K);case"Static":return this.renderStaticSync(B,K);case"Now":return this.renderNowSync(B,K);case"Load":case"Extends":return null;case"Cycle":return this.renderCycleSync(B,K);case"Firstof":return this.renderFirstofSync(B,K);case"Ifchanged":return this.renderIfchangedSync(B,K);case"Regroup":return this.renderRegroupSync(B,K);case"Widthratio":return this.renderWidthratioSync(B,K);case"Lorem":return this.renderLoremSync(B,K);case"CsrfToken":return this.renderCsrfTokenSync();case"Debug":return this.renderDebugSync(K);case"Templatetag":return this.renderTemplatetagSync(B);default:return null}}renderIfSync(B,K){if(this.isTruthy(this.eval(B.test,K)))return this.renderNodesSync(B.body,K);for(let A of B.elifs)if(this.isTruthy(this.eval(A.test,K)))return this.renderNodesSync(A.body,K);return B.else_.length>0?this.renderNodesSync(B.else_,K):""}renderForSync(B,K){let A=this.eval(B.iter,K),Q=this.toIterable(A),$=Q.length;if($===0)return this.renderNodesSync(B.else_,K);K.push(),K.pushForLoop(Q,0);let Z;if(Array.isArray(B.target)){let U=B.target,Y=U.length;if($<25){Z="";for(let O=0;O<$;O++){let J=Q[O];if(O>0)K.updateForLoop(O,Q);let X=Array.isArray(J)?J:[J,J];for(let M=0;M<Y;M++)K.set(U[M],X[M]);Z+=this.renderNodesSync(B.body,K)}}else{let O=Array($);for(let J=0;J<$;J++){let X=Q[J];if(J>0)K.updateForLoop(J,Q);let M=Array.isArray(X)?X:[X,X];for(let G=0;G<Y;G++)K.set(U[G],M[G]);O[J]=this.renderNodesSync(B.body,K)}Z=O.join("")}}else{let U=B.target;if($<25){Z="";for(let Y=0;Y<$;Y++){if(Y>0)K.updateForLoop(Y,Q);K.set(U,Q[Y]),Z+=this.renderNodesSync(B.body,K)}}else{let Y=Array($);for(let O=0;O<$;O++){if(O>0)K.updateForLoop(O,Q);K.set(U,Q[O]),Y[O]=this.renderNodesSync(B.body,K)}Z=Y.join("")}}return K.popForLoop(),K.pop(),Z}renderBlockSync(B,K){let A=this.blocks.get(B.name)||B;K.push();let Q=this.renderNodesSync(B.body,K),$=new String(Q);$.__safe__=!0,K.set("block",{super:$});let Z=this.renderNodesSync(A.body,K);return K.pop(),Z}renderWithSync(B,K){K.push();for(let{target:Q,value:$}of B.assignments)K.set(Q,this.eval($,K));let A=this.renderNodesSync(B.body,K);return K.pop(),A}renderUrlSync(B,K){let A=this.eval(B.name,K),Q=[];for(let U=0;U<B.args.length;U++)Q.push(this.eval(B.args[U],K));let $=this.evalObjectSync(B.kwargs,K),Z=this.options.urlResolver(String(A),Q,$);if(B.asVar)return K.set(B.asVar,Z),"";return Z}renderStaticSync(B,K){let A=this.eval(B.path,K),Q=this.options.staticResolver(String(A));if(B.asVar)return K.set(B.asVar,Q),"";return Q}renderNowSync(B,K){let A=String(this.eval(B.format,K)),Q=this.formatDate(new Date,A);if(B.asVar)return K.set(B.asVar,Q),"";return Q}cycleState=new Map;renderCycleSync(B,K){let A=`cycle_${B.line}_${B.column}`,Q=this.cycleState.get(A)??0,$=[];for(let U=0;U<B.values.length;U++)$.push(this.eval(B.values[U],K));let Z=$[Q%$.length];if(this.cycleState.set(A,Q+1),B.asVar)return K.set(B.asVar,Z),B.silent?"":this.stringify(Z);return this.stringify(Z)}renderFirstofSync(B,K){for(let Q of B.values){let $=this.eval(Q,K);if(this.isTruthy($)){if(B.asVar)return K.set(B.asVar,$),"";return this.stringify($)}}let A=B.fallback?this.eval(B.fallback,K):"";if(B.asVar)return K.set(B.asVar,A),"";return this.stringify(A)}ifchangedState=new Map;renderIfchangedSync(B,K){let A=`ifchanged_${B.line}_${B.column}`,Q;if(B.values.length>0){let U=[];for(let Y=0;Y<B.values.length;Y++)U.push(this.eval(B.values[Y],K));Q=U}else Q=this.renderNodesSync(B.body,K);let $=this.ifchangedState.get(A),Z=!this.deepEqual(Q,$);if(this.ifchangedState.set(A,Q),Z){if(B.values.length>0)return this.renderNodesSync(B.body,K);return Q}else return this.renderNodesSync(B.else_,K)}renderRegroupSync(B,K){let A=this.toIterable(this.eval(B.target,K)),Q=[],$=Symbol("initial"),Z=[];for(let U of A){let Y=U&&typeof U==="object"?U[B.key]:void 0;if(Y!==$){if(Z.length>0)Q.push({grouper:$,list:Z});$=Y,Z=[U]}else Z.push(U)}if(Z.length>0)Q.push({grouper:$,list:Z});return K.set(B.asVar,Q),""}renderWidthratioSync(B,K){let A=Number(this.eval(B.value,K)),Q=Number(this.eval(B.maxValue,K)),$=Number(this.eval(B.maxWidth,K)),Z=Q===0?0:Math.round(A/Q*$);if(B.asVar)return K.set(B.asVar,Z),"";return String(Z)}renderLoremSync(B,K){let A=B.count?Number(this.eval(B.count,K)):1,Q=B.method,$=["lorem","ipsum","dolor","sit","amet","consectetur","adipiscing","elit","sed","do","eiusmod","tempor","incididunt","ut","labore","et","dolore","magna","aliqua","enim","ad","minim","veniam","quis","nostrud","exercitation","ullamco","laboris","nisi","aliquip","ex","ea","commodo","consequat","duis","aute","irure","in","reprehenderit","voluptate","velit","esse","cillum","fugiat","nulla","pariatur","excepteur","sint","occaecat","cupidatat","non","proident","sunt","culpa","qui","officia","deserunt","mollit","anim","id","est","laborum"],Z=(U)=>{if(B.random)return $[Math.floor(Math.random()*$.length)];return $[U%$.length]};if(Q==="w"){let U=[];for(let Y=0;Y<A;Y++)U.push(Z(Y));return U.join(" ")}else if(Q==="p"||Q==="b"){let U=[];for(let Y=0;Y<A;Y++){let O=3+Y%3,J=[];for(let X=0;X<O;X++){let M=8+X%7,G=[];for(let R=0;R<M;R++)G.push(Z(Y*100+X*20+R));G[0]=G[0].charAt(0).toUpperCase()+G[0].slice(1),J.push(G.join(" ")+".")}U.push(J.join(" "))}if(Q==="b")return U.join(`
|
|
11
|
+
`||B==="\r"}isDigit(B){let K=B.charCodeAt(0);return K>=48&&K<=57}isAlpha(B){let K=B.charCodeAt(0);return K>=97&&K<=122||K>=65&&K<=90}isAlphaNumeric(B){let K=B.charCodeAt(0);return K>=48&&K<=57||K>=97&&K<=122||K>=65&&K<=90}addToken(B,K){this.state.tokens.push({type:B,value:K,line:this.state.line,column:this.state.column-K.length})}}class N{tokens;current=0;source;constructor(B,K){this.tokens=B,this.source=K}parse(){let B=[];while(!this.isAtEnd()){let K=this.parseStatement();if(K)B.push(K)}return{type:"Template",body:B,line:1,column:1}}parseStatement(){switch(this.peek().type){case"TEXT":return this.parseText();case"VARIABLE_START":return this.parseOutput();case"BLOCK_START":return this.parseBlock();case"EOF":return null;default:return this.advance(),null}}parseText(){let B=this.advance();return{type:"Text",value:B.value,line:B.line,column:B.column}}parseOutput(){let B=this.advance(),K=this.parseExpression();return this.expect("VARIABLE_END"),{type:"Output",expression:K,line:B.line,column:B.column}}parseBlock(){let B=this.advance(),K=this.expect("NAME");switch(K.value){case"if":return this.parseIf(B);case"for":return this.parseFor(B);case"block":return this.parseBlockTag(B);case"extends":return this.parseExtends(B);case"include":return this.parseInclude(B);case"set":return this.parseSet(B);case"with":return this.parseWith(B);case"load":return this.parseLoad(B);case"url":return this.parseUrl(B);case"static":return this.parseStatic(B);case"now":return this.parseNow(B);case"comment":return this.parseComment(B);case"spaceless":case"autoescape":case"verbatim":return this.parseSimpleBlock(B,K.value);case"cycle":return this.parseCycle(B);case"firstof":return this.parseFirstof(B);case"ifchanged":return this.parseIfchanged(B);case"regroup":return this.parseRegroup(B);case"widthratio":return this.parseWidthratio(B);case"lorem":return this.parseLorem(B);case"csrf_token":return this.parseCsrfToken(B);case"debug":return this.parseDebug(B);case"templatetag":return this.parseTemplatetag(B);case"ifequal":return this.parseIfequal(B,!1);case"ifnotequal":return this.parseIfequal(B,!0);default:return this.skipToBlockEnd(),null}}parseIf(B){let K=this.parseExpression();this.expect("BLOCK_END");let A=[],Q=[],O=[];while(!this.isAtEnd()){if(this.checkBlockTag("elif")||this.checkBlockTag("else")||this.checkBlockTag("endif"))break;let U=this.parseStatement();if(U)A.push(U)}while(this.checkBlockTag("elif")){this.advance(),this.advance();let U=this.parseExpression();this.expect("BLOCK_END");let Y=[];while(!this.isAtEnd()){if(this.checkBlockTag("elif")||this.checkBlockTag("else")||this.checkBlockTag("endif"))break;let J=this.parseStatement();if(J)Y.push(J)}Q.push({test:U,body:Y})}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endif"))break;let U=this.parseStatement();if(U)O.push(U)}}return this.expectBlockTag("endif"),{type:"If",test:K,body:A,elifs:Q,else_:O,line:B.line,column:B.column}}parseFor(B){let K,A=this.expect("NAME").value;if(this.check("COMMA")){let $=[A];while(this.match("COMMA"))$.push(this.expect("NAME").value);K=$}else K=A;let Q=this.expect("NAME");if(Q.value!=="in")throw this.error(`Expected 'in' in for loop, got '${Q.value}'`);let O=this.parseExpression(),U=this.check("NAME")&&this.peek().value==="recursive";if(U)this.advance();this.expect("BLOCK_END");let Y=[],J=[];while(!this.isAtEnd()){if(this.checkBlockTag("empty")||this.checkBlockTag("else")||this.checkBlockTag("endfor"))break;let $=this.parseStatement();if($)Y.push($)}if(this.checkBlockTag("empty")||this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endfor"))break;let $=this.parseStatement();if($)J.push($)}}return this.expectBlockTag("endfor"),{type:"For",target:K,iter:O,body:Y,else_:J,recursive:U,line:B.line,column:B.column}}parseBlockTag(B){let K=this.expect("NAME").value,A=this.check("NAME")&&this.peek().value==="scoped";if(A)this.advance();this.expect("BLOCK_END");let Q=[];while(!this.isAtEnd()){if(this.checkBlockTag("endblock"))break;let O=this.parseStatement();if(O)Q.push(O)}if(this.advance(),this.advance(),this.check("NAME"))this.advance();return this.expect("BLOCK_END"),{type:"Block",name:K,body:Q,scoped:A,line:B.line,column:B.column}}parseExtends(B){let K=this.parseExpression();return this.expect("BLOCK_END"),{type:"Extends",template:K,line:B.line,column:B.column}}parseInclude(B){let K=this.parseExpression(),A=null,Q=!1,O=!1;while(this.check("NAME")){let U=this.peek().value;if(U==="ignore"&&this.peekNext()?.value==="missing")this.advance(),this.advance(),O=!0;else if(U==="with")this.advance(),A=this.parseKeywordArgs();else if(U==="only")this.advance(),Q=!0;else if(U==="without"){if(this.advance(),this.check("NAME")&&this.peek().value==="context")this.advance(),Q=!0}else break}return this.expect("BLOCK_END"),{type:"Include",template:K,context:A,only:Q,ignoreMissing:O,line:B.line,column:B.column}}parseSet(B){let K=this.expect("NAME").value;this.expect("ASSIGN");let A=this.parseExpression();return this.expect("BLOCK_END"),{type:"Set",target:K,value:A,line:B.line,column:B.column}}parseWith(B){let K=[];do{let Q=this.expect("NAME").value;this.expect("ASSIGN");let O=this.parseExpression();K.push({target:Q,value:O})}while(this.match("COMMA")||this.check("NAME")&&this.peekNext()?.type==="ASSIGN");this.expect("BLOCK_END");let A=[];while(!this.isAtEnd()){if(this.checkBlockTag("endwith"))break;let Q=this.parseStatement();if(Q)A.push(Q)}return this.expectBlockTag("endwith"),{type:"With",assignments:K,body:A,line:B.line,column:B.column}}parseLoad(B){let K=[];while(this.check("NAME"))K.push(this.advance().value);return this.expect("BLOCK_END"),{type:"Load",names:K,line:B.line,column:B.column}}parseUrl(B){let K=this.parseExpression(),A=[],Q={},O=null;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){this.advance(),O=this.expect("NAME").value;break}if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let U=this.advance().value;this.advance(),Q[U]=this.parseExpression()}else A.push(this.parseExpression())}return this.expect("BLOCK_END"),{type:"Url",name:K,args:A,kwargs:Q,asVar:O,line:B.line,column:B.column}}parseStatic(B){let K=this.parseExpression(),A=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),A=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Static",path:K,asVar:A,line:B.line,column:B.column}}parseNow(B){let K=this.parseExpression(),A=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),A=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Now",format:K,asVar:A,line:B.line,column:B.column}}parseComment(B){this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endcomment"))break;this.advance()}return this.expectBlockTag("endcomment"),null}parseSimpleBlock(B,K){this.skipToBlockEnd();let A=`end${K}`;while(!this.isAtEnd()){if(this.checkBlockTag(A))break;this.advance()}if(this.checkBlockTag(A))this.advance(),this.advance(),this.expect("BLOCK_END");return null}parseCycle(B){let K=[],A=null,Q=!1;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){if(this.advance(),A=this.expect("NAME").value,this.check("NAME")&&this.peek().value==="silent")this.advance(),Q=!0;break}K.push(this.parseExpression())}return this.expect("BLOCK_END"),{type:"Cycle",values:K,asVar:A,silent:Q,line:B.line,column:B.column}}parseFirstof(B){let K=[],A=null,Q=null;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){this.advance(),Q=this.expect("NAME").value;break}K.push(this.parseExpression())}if(K.length>0){let O=K[K.length-1];if(O.type==="Literal"&&typeof O.value==="string")A=K.pop()}return this.expect("BLOCK_END"),{type:"Firstof",values:K,fallback:A,asVar:Q,line:B.line,column:B.column}}parseIfchanged(B){let K=[];while(!this.check("BLOCK_END"))K.push(this.parseExpression());this.expect("BLOCK_END");let A=[],Q=[];while(!this.isAtEnd()){if(this.checkBlockTag("else")||this.checkBlockTag("endifchanged"))break;let O=this.parseStatement();if(O)A.push(O)}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endifchanged"))break;let O=this.parseStatement();if(O)Q.push(O)}}return this.expectBlockTag("endifchanged"),{type:"Ifchanged",values:K,body:A,else_:Q,line:B.line,column:B.column}}parseRegroup(B){let K=this.parseExpression();this.expectName("by");let A=this.expect("NAME").value;this.expectName("as");let Q=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Regroup",target:K,key:A,asVar:Q,line:B.line,column:B.column}}parseWidthratio(B){let K=this.parseExpression(),A=this.parseExpression(),Q=this.parseExpression(),O=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),O=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Widthratio",value:K,maxValue:A,maxWidth:Q,asVar:O,line:B.line,column:B.column}}parseLorem(B){let K=null,A="p",Q=!1;if(this.check("NUMBER"))K={type:"Literal",value:parseInt(this.advance().value,10),line:B.line,column:B.column};if(this.check("NAME")){let O=this.peek().value.toLowerCase();if(O==="w"||O==="p"||O==="b")A=O,this.advance()}if(this.check("NAME")&&this.peek().value==="random")Q=!0,this.advance();return this.expect("BLOCK_END"),{type:"Lorem",count:K,method:A,random:Q,line:B.line,column:B.column}}parseCsrfToken(B){return this.expect("BLOCK_END"),{type:"CsrfToken",line:B.line,column:B.column}}parseDebug(B){return this.expect("BLOCK_END"),{type:"Debug",line:B.line,column:B.column}}parseTemplatetag(B){let K=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Templatetag",tagType:K,line:B.line,column:B.column}}parseIfequal(B,K){let A=this.parseExpression(),Q=this.parseExpression();this.expect("BLOCK_END");let O={type:"Compare",left:A,ops:[{operator:K?"!=":"==",right:Q}],line:B.line,column:B.column},U=[],Y=[],J=K?"endifnotequal":"endifequal";while(!this.isAtEnd()){if(this.checkBlockTag("else")||this.checkBlockTag(J))break;let $=this.parseStatement();if($)U.push($)}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag(J))break;let $=this.parseStatement();if($)Y.push($)}}return this.expectBlockTag(J),{type:"If",test:O,body:U,elifs:[],else_:Y,line:B.line,column:B.column}}parseExpression(){return this.parseConditional()}parseConditional(){let B=this.parseOr();if(this.check("NAME")&&this.peek().value==="if"){this.advance();let K=this.parseOr();this.expectName("else");let A=this.parseConditional();B={type:"Conditional",test:K,trueExpr:B,falseExpr:A,line:B.line,column:B.column}}return B}parseOr(){let B=this.parseAnd();while(this.check("OR")||this.check("NAME")&&this.peek().value==="or"){this.advance();let K=this.parseAnd();B={type:"BinaryOp",operator:"or",left:B,right:K,line:B.line,column:B.column}}return B}parseAnd(){let B=this.parseNot();while(this.check("AND")||this.check("NAME")&&this.peek().value==="and"){this.advance();let K=this.parseNot();B={type:"BinaryOp",operator:"and",left:B,right:K,line:B.line,column:B.column}}return B}parseNot(){if(this.check("NOT")||this.check("NAME")&&this.peek().value==="not"){let B=this.advance();return{type:"UnaryOp",operator:"not",operand:this.parseNot(),line:B.line,column:B.column}}return this.parseCompare()}parseCompare(){let B=this.parseAddSub(),K=[];while(!0){let A=null;if(this.match("EQ"))A="==";else if(this.match("NE"))A="!=";else if(this.match("LT"))A="<";else if(this.match("GT"))A=">";else if(this.match("LE"))A="<=";else if(this.match("GE"))A=">=";else if(this.check("NAME")){let O=this.peek().value;if(O==="in")this.advance(),A="in";else if(O==="not"&&this.peekNext()?.value==="in")this.advance(),this.advance(),A="not in";else if(O==="is"){this.advance();let U=this.check("NOT");if(U)this.advance();let J=this.expect("NAME").value,$=[];if(this.match("LPAREN")){while(!this.check("RPAREN"))if($.push(this.parseExpression()),!this.check("RPAREN"))this.expect("COMMA");this.expect("RPAREN")}B={type:"TestExpr",node:B,test:J,args:$,negated:U,line:B.line,column:B.column};continue}}if(!A)break;let Q=this.parseAddSub();K.push({operator:A,right:Q})}if(K.length===0)return B;return{type:"Compare",left:B,ops:K,line:B.line,column:B.column}}parseAddSub(){let B=this.parseMulDiv();while(this.check("ADD")||this.check("SUB")||this.check("TILDE")){let K=this.advance(),A=this.parseMulDiv();B={type:"BinaryOp",operator:K.value,left:B,right:A,line:B.line,column:B.column}}return B}parseMulDiv(){let B=this.parseUnary();while(this.check("MUL")||this.check("DIV")||this.check("MOD")){let K=this.advance(),A=this.parseUnary();B={type:"BinaryOp",operator:K.value,left:B,right:A,line:B.line,column:B.column}}return B}parseUnary(){if(this.check("SUB")||this.check("ADD")){let B=this.advance(),K=this.parseUnary();return{type:"UnaryOp",operator:B.value,operand:K,line:B.line,column:B.column}}return this.parseFilter()}parseFilter(){let B=this.parsePostfix();while(this.match("PIPE")){let K=this.expect("NAME").value,A=[],Q={};if(this.match("COLON"))if(this.check("SUB")||this.check("ADD")){let O=this.advance(),U=this.parsePostfix();A.push({type:"UnaryOp",operator:O.value,operand:U,line:O.line,column:O.column})}else A.push(this.parsePostfix());else if(this.match("LPAREN")){while(!this.check("RPAREN")){if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let O=this.advance().value;this.advance(),Q[O]=this.parseExpression()}else A.push(this.parseExpression());if(!this.check("RPAREN"))this.expect("COMMA")}this.expect("RPAREN")}B={type:"FilterExpr",node:B,filter:K,args:A,kwargs:Q,line:B.line,column:B.column}}return B}parsePostfix(){let B=this.parsePrimary();while(!0)if(this.match("DOT")){let K;if(this.check("NUMBER"))K=this.advance().value;else K=this.expect("NAME").value;B={type:"GetAttr",object:B,attribute:K,line:B.line,column:B.column}}else if(this.match("LBRACKET")){let K=this.parseExpression();this.expect("RBRACKET"),B={type:"GetItem",object:B,index:K,line:B.line,column:B.column}}else if(this.match("LPAREN")){let K=[],A={};while(!this.check("RPAREN")){if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let Q=this.advance().value;this.advance(),A[Q]=this.parseExpression()}else K.push(this.parseExpression());if(!this.check("RPAREN"))this.expect("COMMA")}this.expect("RPAREN"),B={type:"FunctionCall",callee:B,args:K,kwargs:A,line:B.line,column:B.column}}else break;return B}parsePrimary(){let B=this.peek();if(this.match("STRING"))return{type:"Literal",value:B.value,line:B.line,column:B.column};if(this.match("NUMBER"))return{type:"Literal",value:B.value.includes(".")?parseFloat(B.value):parseInt(B.value,10),line:B.line,column:B.column};if(this.check("NAME")){let K=this.advance().value;if(K==="true"||K==="True")return{type:"Literal",value:!0,line:B.line,column:B.column};if(K==="false"||K==="False")return{type:"Literal",value:!1,line:B.line,column:B.column};if(K==="none"||K==="None"||K==="null")return{type:"Literal",value:null,line:B.line,column:B.column};return{type:"Name",name:K,line:B.line,column:B.column}}if(this.match("LPAREN")){let K=this.parseExpression();return this.expect("RPAREN"),K}if(this.match("LBRACKET")){let K=[];while(!this.check("RBRACKET"))if(K.push(this.parseExpression()),!this.check("RBRACKET"))this.expect("COMMA");return this.expect("RBRACKET"),{type:"Array",elements:K,line:B.line,column:B.column}}if(this.match("LBRACE")){let K=[];while(!this.check("RBRACE")){let A=this.parseExpression();this.expect("COLON");let Q=this.parseExpression();if(K.push({key:A,value:Q}),!this.check("RBRACE"))this.expect("COMMA")}return this.expect("RBRACE"),{type:"Object",pairs:K,line:B.line,column:B.column}}throw this.error(`Unexpected token: ${B.type} (${B.value})`)}parseKeywordArgs(){let B={};while(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let K=this.advance().value;this.advance(),B[K]=this.parseExpression()}return B}checkBlockTag(B){if(this.peek().type!=="BLOCK_START")return!1;let K=this.current+1;if(K>=this.tokens.length)return!1;let A=this.tokens[K];return A.type==="NAME"&&A.value===B}expectBlockTag(B){this.advance();let K=this.expect("NAME");if(K.value!==B)throw this.error(`Expected '${B}', got '${K.value}'`);this.expect("BLOCK_END")}expectName(B){let K=this.expect("NAME");if(K.value!==B)throw this.error(`Expected '${B}', got '${K.value}'`)}skipToBlockEnd(){while(!this.isAtEnd()&&!this.check("BLOCK_END"))this.advance();if(this.check("BLOCK_END"))this.advance()}isAtEnd(){return this.peek().type==="EOF"}peek(){return this.tokens[this.current]}peekNext(){if(this.current+1>=this.tokens.length)return null;return this.tokens[this.current+1]}advance(){if(!this.isAtEnd())this.current++;return this.tokens[this.current-1]}check(B){if(this.isAtEnd())return!1;return this.peek().type===B}match(B){if(this.check(B))return this.advance(),!0;return!1}expect(B){if(this.check(B))return this.advance();let K=this.peek();throw this.error(`Expected ${B}, got ${K.type} (${K.value})`)}error(B){let K=this.peek();return new P(B,{line:K.line,column:K.column,source:this.source})}}function PB(B,K,A,Q,O){let U=B.length,Y=U-K,J={_items:B,_idx:K,counter:K+1,counter0:K,first:K===0,last:K===U-1,length:U,index:K+1,index0:K,depth:A,depth0:A-1,revcounter:Y,revcounter0:Y-1,revindex:Y,revindex0:Y-1,get previtem(){return this._idx>0?this._items[this._idx-1]:void 0},get nextitem(){return this._idx<this._items.length-1?this._items[this._idx+1]:void 0},cycle(...$){return $[this._idx%$.length]},changed:($)=>{let Z=$!==Q.value;return Q.value=$,Z}};if(O)J.parentloop=O;return J}class w{scopes=[];parent=null;_forloopStack=[];_lastCycleValue={value:null};_currentForloop=null;_currentScope;constructor(B={},K=null){this.parent=K,this._currentScope={...B},this.scopes.push(this._currentScope)}get(B){if(B==="forloop"||B==="loop")return this._currentForloop;for(let K=this.scopes.length-1;K>=0;K--){let A=this.scopes[K];if(B in A)return A[B]}return this.parent?this.parent.get(B):void 0}set(B,K){this._currentScope[B]=K}has(B){for(let K=this.scopes.length-1;K>=0;K--)if(B in this.scopes[K])return!0;return this.parent?this.parent.has(B):!1}push(B={}){this._currentScope={...B},this.scopes.push(this._currentScope)}pop(){if(this.scopes.length>1)this.scopes.pop(),this._currentScope=this.scopes[this.scopes.length-1]}derived(B={}){return new w(B,this)}pushForLoop(B,K){let A=this._forloopStack.length+1,Q=this._forloopStack.length>0?this._forloopStack[this._forloopStack.length-1]:void 0,O=PB(B,K,A,this._lastCycleValue,Q);return this._forloopStack.push(O),this._currentForloop=O,O}popForLoop(){this._forloopStack.pop(),this._currentForloop=this._forloopStack.length>0?this._forloopStack[this._forloopStack.length-1]:null}updateForLoop(B,K){let A=this._currentForloop;if(!A)return;let Q=K.length;if(A._idx=B,A._items!==K)A._items=K;A.counter=B+1,A.counter0=B,A.index=B+1,A.index0=B,A.first=B===0,A.last=B===Q-1;let O=Q-B;A.revcounter=O,A.revcounter0=O-1,A.revindex=O,A.revindex0=O-1}toObject(){let B={};if(this.parent)Object.assign(B,this.parent.toObject());for(let K of this.scopes)Object.assign(B,K);return B}}var DB=/\b\w/g,LB=/<[^>]*>/g,_B=/[^\w\s-]/g,jB=/[\s_-]+/g,qB=/^-+|-+$/g,t=/(https?:\/\/[^\s]+)/g,CB=/[a-zA-Z]/g,NB=/\n\n+/,e=/\n/g,BB=/\s+/,SB=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wB=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],VB=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],bB=["January","February","March","April","May","June","July","August","September","October","November","December"],hB=["Jan.","Feb.","March","April","May","June","July","Aug.","Sept.","Oct.","Nov.","Dec."],fB=(B)=>String(B).toUpperCase(),kB=(B)=>String(B).toLowerCase(),yB=(B)=>{let K=String(B);return K.charAt(0).toUpperCase()+K.slice(1).toLowerCase()},TB=(B)=>{let K=String(B);return K.charAt(0).toUpperCase()+K.slice(1)},gB=(B)=>String(B).replace(DB,(K)=>K.toUpperCase()),xB=(B)=>String(B).trim(),mB=(B)=>String(B).replace(LB,""),l=(B)=>{if(B?.__safe__)return B;let K=Bun.escapeHTML(String(B)),A=new String(K);return A.__safe__=!0,A},pB=(B)=>{let K=new String(B);return K.__safe__=!0,K},cB=(B)=>JSON.stringify(String(B)).slice(1,-1),vB=(B)=>{let A=String(B).split(NB),Q="";for(let U=0;U<A.length;U++){if(U>0)Q+=`
|
|
12
|
+
`;Q+=`<p>${A[U].replace(e,"<br>")}</p>`}let O=new String(Q);return O.__safe__=!0,O},iB=(B)=>{let K=String(B).replace(e,"<br>"),A=new String(K);return A.__safe__=!0,A},dB=(B,K=30)=>{let A=String(B);if(A.length<=K)return A;return A.slice(0,K-3)+"..."},sB=(B,K=15)=>{let A=String(B).split(BB);if(A.length<=K)return B;return A.slice(0,K).join(" ")+"..."},uB=(B)=>String(B).split(BB).filter(Boolean).length,rB=(B,K=80)=>{let A=String(B),Q=Math.max(0,K-A.length),O=Math.floor(Q/2),U=Q-O;return" ".repeat(O)+A+" ".repeat(U)},nB=(B,K=80)=>String(B).padEnd(K),lB=(B,K=80)=>String(B).padStart(K),oB=(B,K="")=>String(B).split(K).join(""),aB=(B)=>String(B).toLowerCase().replace(_B,"").replace(jB,"-").replace(qB,""),tB=(B)=>Math.abs(Number(B)),eB=(B,K=0)=>Number(Number(B).toFixed(K)),BK=(B)=>parseInt(String(B),10)||0,KK=(B)=>parseFloat(String(B))||0,AK=(B,K=-1)=>{let A=parseFloat(String(B));if(isNaN(A))return"";if(K===-1){let Q=A.toFixed(1);return Q.endsWith(".0")?Math.round(A).toString():Q}return A.toFixed(Math.abs(K))},OK=(B,K)=>{let A=Number(B),Q=Number(K);if(!isNaN(A)&&!isNaN(Q))return A+Q;return String(B)+String(K)},QK=(B,K)=>Number(B)%Number(K)===0,$K=(B)=>{let K=Number(B),A=["bytes","KB","MB","GB","TB","PB"],Q=0,O=K;while(O>=1024&&Q<A.length-1)O/=1024,Q++;return`${O.toFixed(1)} ${A[Q]}`},KB=(B)=>{if(B==null)return 0;if(typeof B==="string"||Array.isArray(B))return B.length;if(typeof B==="object"){let K=0;for(let A in B)K++;return K}return 0},UK=(B,K)=>KB(B)===Number(K),ZK=(B)=>{if(Array.isArray(B))return B[0];if(typeof B==="string")return B[0];return B},JK=(B)=>{if(Array.isArray(B))return B[B.length-1];if(typeof B==="string")return B[B.length-1];return B},YK=(B,K="")=>{if(Array.isArray(B))return B.join(K);return String(B)},XK=(B,K)=>{if(!B)return B;let[A,Q]=String(K).split(":"),O=A?parseInt(A,10):0,U=Q?parseInt(Q,10):void 0;if(Array.isArray(B)||typeof B==="string")return B.slice(O,U);return B},MK=(B)=>{if(Array.isArray(B))return[...B].reverse();if(typeof B==="string")return B.split("").reverse().join("");return B},GK=(B,K=!1)=>{if(!Array.isArray(B))return B;let A=[...B].sort();return K?A.reverse():A},FK=(B)=>{if(!Array.isArray(B))return B;let K=new Set,A=[];for(let Q=0;Q<B.length;Q++){let O=B[Q];if(!K.has(O))K.add(O),A.push(O)}return A},IK=(B)=>{if(Array.isArray(B))return B;return String(B).split("")},AB=(B,K)=>{if(!Array.isArray(B))return B;return[...B].sort((A,Q)=>{let O=K?A[K]:A,U=K?Q[K]:Q;return O<U?-1:O>U?1:0})},EK=(B,K)=>{let A=AB(B,K);return Array.isArray(A)?A.reverse():A},RK=(B,K)=>{if(!Array.isArray(B))return[[B]];let A=[],Q=Number(K)||2;for(let O=0;O<B.length;O+=Q)A.push(B.slice(O,O+Q));return A},HK=(B,K)=>{switch(K){case"d":return String(B.getDate()).padStart(2,"0");case"j":return String(B.getDate());case"D":return SB[B.getDay()];case"l":return wB[B.getDay()];case"m":return String(B.getMonth()+1).padStart(2,"0");case"n":return String(B.getMonth()+1);case"M":return VB[B.getMonth()];case"F":return bB[B.getMonth()];case"N":return hB[B.getMonth()];case"y":return String(B.getFullYear()).slice(-2);case"Y":return String(B.getFullYear());case"H":return String(B.getHours()).padStart(2,"0");case"G":return String(B.getHours());case"i":return String(B.getMinutes()).padStart(2,"0");case"s":return String(B.getSeconds()).padStart(2,"0");case"a":return B.getHours()<12?"a.m.":"p.m.";case"A":return B.getHours()<12?"AM":"PM";case"g":return String(B.getHours()%12||12);case"h":return String(B.getHours()%12||12).padStart(2,"0");default:return K}},OB=(B,K="N j, Y")=>{let A=B instanceof Date?B:new Date(B);if(isNaN(A.getTime()))return"";return K.replace(CB,(Q)=>HK(A,Q))},zK=(B,K="H:i")=>OB(B,K),WK=(B,K=new Date)=>{let A=B instanceof Date?B:new Date(B),Q=(new Date(K).getTime()-A.getTime())/1000,O=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[U,Y,J]of O){let $=Math.floor(Q/U);if($>=1)return`${$} ${$===1?Y:J}`}return"just now"},PK=(B,K=new Date)=>{let Q=((B instanceof Date?B:new Date(B)).getTime()-new Date(K).getTime())/1000,O=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[U,Y,J]of O){let $=Math.floor(Q/U);if($>=1)return`${$} ${$===1?Y:J}`}return"now"},o=(B,K="")=>{if(B===void 0||B===null||B===""||B===!1)return K;return B};var DK=(B,K="")=>B===null||B===void 0?K:B,LK=(B,K="yes,no,maybe")=>{let[A,Q,O]=K.split(",");if(B===!0)return A;if(B===!1)return Q;return O??Q},_K=(B,K="s")=>{let[A,Q]=K.includes(",")?K.split(","):["",K];return Number(B)===1?A:Q},jK=(B)=>encodeURIComponent(String(B)),qK=(B)=>{let K=String(B).replace(t,'<a href="$1">$1</a>'),A=new String(K);return A.__safe__=!0,A},a=(B,K)=>{try{let A=JSON.stringify(B,null,K),Q=new String(A);return Q.__safe__=!0,Q}catch{return""}},CK=(B)=>{if(Array.isArray(B))return B[Math.floor(Math.random()*B.length)];return B},NK=(B,K,A=null)=>{if(!Array.isArray(B))return[[B]];let Q=[],O=Number(K)||1;for(let U=0;U<B.length;U+=O){let Y=B.slice(U,U+O);while(A!==null&&Y.length<O)Y.push(A);Q.push(Y)}return Q},SK=(B,K)=>{if(!Array.isArray(B))return[];let A={};for(let O of B){let U=String(K?O[K]:O);if(!(U in A))A[U]=[];A[U].push(O)}let Q=[];for(let O in A)Q.push({grouper:O,list:A[O]});return Q},wK=(B,K=79,A=!0,Q=`
|
|
13
|
+
`)=>{let O=String(B);if(O.length<=K)return O;let U=O.split(" "),Y=[],J="";for(let $ of U)if(J.length+$.length+1<=K)J+=(J?" ":"")+$;else{if(J)Y.push(J);if(A&&$.length>K){let Z=$;while(Z.length>K)Y.push(Z.slice(0,K)),Z=Z.slice(K);J=Z}else J=$}if(J)Y.push(J);return Y.join(Q)},VK=(B,K=4,A=!1,Q=!1)=>{let O=String(B),U=typeof K==="string"?K:" ".repeat(Number(K)),Y=O.split(`
|
|
14
|
+
`),J="";for(let $=0;$<Y.length;$++){if($>0)J+=`
|
|
15
|
+
`;let Z=Y[$];if($===0&&!A)J+=Z;else if(!Q&&Z.trim()==="")J+=Z;else J+=U+Z}return J},bK=(B,K,A,Q)=>{let O=String(B),U=String(K),Y=String(A);if(Q===void 0||Q<0)return O.replaceAll(U,Y);let J=Number(Q);if(J===0)return O;let $="",Z=0,X=0;while(Z<O.length&&X<J){let M=O.indexOf(U,Z);if(M===-1)break;$+=O.slice(Z,M)+Y,Z=M+U.length,X++}return $+=O.slice(Z),$},hK=(B,...K)=>{let A=String(B);for(let Q=0;Q<K.length;Q++){let O=String(K[Q]);A=A.replace(/%s/,O);let U=`%${Q+1}`;if(A.includes(U))A=A.replaceAll(U,O)}return A},fK=(B)=>String(B),kK=(B)=>{if(Array.isArray(B))return B;if(typeof B==="string")return B.split("");if(B&&typeof B[Symbol.iterator]==="function")return[...B];if(typeof B==="object"&&B!==null)return Object.values(B);return[B]},yK=(B,K)=>{if(!Array.isArray(B))return[];if(typeof K==="string")return B.map((A)=>A?.[K]);return B},TK=(B,K)=>{if(!Array.isArray(B))return[];if(K===void 0)return B.filter((A)=>!!A);return B.filter((A)=>!!A?.[K])},gK=(B,K)=>{if(!Array.isArray(B))return[];if(K===void 0)return B.filter((A)=>!A);return B.filter((A)=>!A?.[K])},QB=(B,K,A,Q)=>{if(!Array.isArray(B))return[];return B.filter((O)=>{let U=O?.[K];if(A===void 0)return!!U;if(A==="eq"||A==="equalto")return U===Q;if(A==="ne")return U!==Q;if(A==="gt")return U>Q;if(A==="lt")return U<Q;if(A==="ge"||A==="gte")return U>=Q;if(A==="le"||A==="lte")return U<=Q;if(A==="in")return Q?.includes?.(U);if(A==="defined")return U!==void 0;if(A==="undefined")return U===void 0;if(A==="none")return U===null;if(A==="true")return U===!0;if(A==="false")return U===!1;return!!U})},xK=(B,K,A,Q)=>{if(!Array.isArray(B))return[];let O=QB(B,K,A,Q);return B.filter((U)=>!O.includes(U))},mK=(B,K)=>{if(B==null)return;return B[K]},pK=(B,K,A)=>{if(!Array.isArray(B)||B.length===0)return A;if(K){let O=B[0];for(let U=1;U<B.length;U++)if(B[U][K]>O[K])O=B[U];return O}let Q=B[0];for(let O=1;O<B.length;O++)if(B[O]>Q)Q=B[O];return Q},cK=(B,K,A)=>{if(!Array.isArray(B)||B.length===0)return A;if(K){let O=B[0];for(let U=1;U<B.length;U++)if(B[U][K]<O[K])O=B[U];return O}let Q=B[0];for(let O=1;O<B.length;O++)if(B[O]<Q)Q=B[O];return Q},vK=(B,K,A=0)=>{if(!Array.isArray(B))return A;let Q=Number(A);for(let O=0;O<B.length;O++){let U=K?B[O][K]:B[O];Q+=Number(U)||0}return Q},iK=(B)=>{try{let K=JSON.stringify(B,null,2),A=new String(K);return A.__safe__=!0,A}catch{return String(B)}},dK=(B)=>{let K=Bun.escapeHTML(String(B)),A=new String(K);return A.__safe__=!0,A},sK={a:"2",b:"2",c:"2",d:"3",e:"3",f:"3",g:"4",h:"4",i:"4",j:"5",k:"5",l:"5",m:"6",n:"6",o:"6",p:"7",q:"7",r:"7",s:"7",t:"8",u:"8",v:"8",w:"9",x:"9",y:"9",z:"9"},uK=(B)=>{let K=String(B).toLowerCase(),A=K.length,Q=Array(A);for(let O=0;O<A;O++)Q[O]=sK[K[O]]??K[O];return Q.join("")},rK=(B)=>{let K=String(B).split(`
|
|
16
|
+
`),A=String(K.length).length,Q="";for(let O=0;O<K.length;O++){if(O>0)Q+=`
|
|
17
|
+
`;Q+=`${String(O+1).padStart(A," ")}. ${K[O]}`}return Q},nK=(B)=>{if(!Array.isArray(B))return String(B);let K=(O,U=0)=>{let Y=" ".repeat(U),J="";for(let $=0;$<O.length;$++){let Z=O[$];if(Array.isArray(Z))J+=`
|
|
18
|
+
${Y}<ul>
|
|
19
|
+
${K(Z,U+1)}${Y}</ul>
|
|
20
|
+
`;else{if(J+=`${Y}<li>${Z}`,$+1<O.length&&Array.isArray(O[$+1]))J+=`
|
|
21
|
+
${Y}<ul>
|
|
22
|
+
${K(O[$+1],U+1)}${Y}</ul>
|
|
23
|
+
${Y}`,$++;J+=`</li>
|
|
24
|
+
`}}return J},A=K(B),Q=new String(A);return Q.__safe__=!0,Q},lK=(B)=>{let K=String(B).replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/"/g,"\\\""),A=new String(K);return A.__safe__=!0,A},oK=(B,K)=>{let A=parseInt(String(B),10);if(isNaN(A))return B;let Q=String(Math.abs(A)),O=Number(K)||1;if(O<1||O>Q.length)return B;return parseInt(Q[Q.length-O],10)},aK=(B)=>{return String(B).replace(/ /g,"%20").replace(/"/g,"%22").replace(/</g,"%3C").replace(/>/g,"%3E").replace(/\\/g,"%5C").replace(/\^/g,"%5E").replace(/`/g,"%60").replace(/\{/g,"%7B").replace(/\|/g,"%7C").replace(/\}/g,"%7D")},tK=(B,K)=>{let A=JSON.stringify(B).replace(/</g,"\\u003C").replace(/>/g,"\\u003E").replace(/&/g,"\\u0026"),O=`<script${K?` id="${String(K)}"`:""} type="application/json">${A}</script>`,U=new String(O);return U.__safe__=!0,U},eK=(B)=>{if(!Array.isArray(B))return B;return B.map((K)=>{let A=new String(K);return A.__safe__=!0,A})},BA=(B,K)=>{let A=String(K),Q=B;if(A==="s")return String(Q);if(A==="d"||A==="i")return String(parseInt(String(Q),10)||0);if(A==="f")return String(parseFloat(String(Q))||0);if(A==="x")return(parseInt(String(Q),10)||0).toString(16);if(A==="X")return(parseInt(String(Q),10)||0).toString(16).toUpperCase();if(A==="o")return(parseInt(String(Q),10)||0).toString(8);if(A==="b")return(parseInt(String(Q),10)||0).toString(2);if(A==="e")return(parseFloat(String(Q))||0).toExponential();let O=A.match(/^\.?(\d+)f$/);if(O){let Y=parseInt(O[1],10);return(parseFloat(String(Q))||0).toFixed(Y)}let U=A.match(/^(\d+)([sd])$/);if(U){let Y=parseInt(U[1],10),J=U[2];return(J==="d"?String(parseInt(String(Q),10)||0):String(Q)).padStart(Y,J==="d"?"0":" ")}return String(Q)},KA=(B,K=30)=>{let A=String(B),Q=Number(K),O="",U=0,Y=!1,J=[];for(let Z=0;Z<A.length&&U<Q;Z++){let X=A[Z];if(X==="<"){Y=!0;let M=A.slice(Z).match(/^<\/(\w+)/),G=A.slice(Z).match(/^<(\w+)/);if(M){let E=M[1].toLowerCase(),I=J.lastIndexOf(E);if(I!==-1)J.splice(I,1)}else if(G&&!A.slice(Z).match(/^<\w+[^>]*\/>/))J.push(G[1].toLowerCase())}if(O+=X,X===">")Y=!1;else if(!Y)U++}if(U>=Q&&A.length>O.length)O+="...";for(let Z=J.length-1;Z>=0;Z--)O+=`</${J[Z]}>`;let $=new String(O);return $.__safe__=!0,$},AA=(B,K=15)=>{let A=String(B),Q=Number(K),O="",U=0,Y=!1,J=!1,$=[];for(let X=0;X<A.length&&U<Q;X++){let M=A[X];if(M==="<"){Y=!0;let G=A.slice(X).match(/^<\/(\w+)/),E=A.slice(X).match(/^<(\w+)/);if(G){let I=G[1].toLowerCase(),W=$.lastIndexOf(I);if(W!==-1)$.splice(W,1)}else if(E&&!A.slice(X).match(/^<\w+[^>]*\/>/))$.push(E[1].toLowerCase())}if(O+=M,M===">")Y=!1;else if(!Y){let G=/\s/.test(M);if(!G&&!J)J=!0;else if(G&&J)J=!1,U++}}if(J)U++;if(U>=Q)O=O.trimEnd()+"...";for(let X=$.length-1;X>=0;X--)O+=`</${$[X]}>`;let Z=new String(O);return Z.__safe__=!0,Z},OA=(B,K=15)=>{let A=Number(K),Q=String(B).replace(t,(U)=>{let Y=U.length>A?U.slice(0,A)+"...":U;return`<a href="${U}">${Y}</a>`}),O=new String(Q);return O.__safe__=!0,O},QA=(B)=>{if(B==null||typeof B!=="object")return[];return Object.entries(B)},$A=(B,K=!0)=>{if(B==null||typeof B!=="object")return"";let A=[];for(let[Y,J]of Object.entries(B))if(J===!0)A.push(Y);else if(J!==!1&&J!=null){let $=Bun.escapeHTML(String(J));A.push(`${Y}="${$}"`)}let Q=A.join(" "),O=K&&Q?" "+Q:Q,U=new String(O);return U.__safe__=!0,U},h={upper:fB,lower:kB,capitalize:yB,capfirst:TB,title:gB,trim:xB,striptags:mB,escape:l,e:l,safe:pB,escapejs:cB,linebreaks:vB,linebreaksbr:iB,truncatechars:dB,truncatewords:sB,wordcount:uB,center:rB,ljust:nB,rjust:lB,cut:oB,slugify:aB,abs:tB,round:eB,int:BK,float:KK,floatformat:AK,add:OK,divisibleby:QK,filesizeformat:$K,length:KB,length_is:UK,first:ZK,last:JK,join:YK,slice:XK,reverse:MK,sort:GK,unique:FK,make_list:IK,dictsort:AB,dictsortreversed:EK,columns:RK,date:OB,time:zK,timesince:WK,timeuntil:PK,default:o,d:o,default_if_none:DK,yesno:LK,pluralize:_K,urlencode:jK,urlize:qK,json:a,tojson:a,random:CK,batch:NK,groupby:SK,wordwrap:wK,indent:VK,replace:bK,format:hK,string:fK,list:kK,map:yK,select:TK,reject:gK,selectattr:QB,rejectattr:xK,attr:mK,max:pK,min:cK,sum:vK,pprint:iK,forceescape:dK,phone2numeric:uK,linenumbers:rK,unordered_list:nK,addslashes:lK,get_digit:oK,iriencode:aK,json_script:tK,safeseq:eK,stringformat:BA,truncatechars_html:KA,truncatewords_html:AA,urlizetrunc:OA,items:QA,xmlattr:$A};var UA=(B,K)=>{let A=Number(B),Q=Number(K);if(Q===0)return!1;return A%Q===0},ZA=(B)=>{let K=Number(B);return Number.isInteger(K)&&K%2===0},JA=(B)=>{let K=Number(B);return Number.isInteger(K)&&K%2!==0},YA=(B)=>{return typeof B==="number"&&!isNaN(B)},XA=(B)=>{return Number.isInteger(B)},MA=(B)=>{return typeof B==="number"&&!Number.isInteger(B)&&!isNaN(B)},UB=(B,K)=>Number(B)>Number(K),GA=(B,K)=>Number(B)>=Number(K),ZB=(B,K)=>Number(B)<Number(K),FA=(B,K)=>Number(B)<=Number(K),IA=UB,EA=ZB,RA=(B)=>{return B!==c},c=(B)=>{return B===c},$B=(B)=>{return B===null},HA=(B)=>{return typeof B==="boolean"},zA=(B)=>{return typeof B==="string"},WA=(B)=>{return B!==null&&typeof B==="object"&&!Array.isArray(B)&&!(B instanceof Date)},PA=(B)=>{if(B==null)return!1;return typeof B==="string"||Array.isArray(B)||typeof B[Symbol.iterator]==="function"},DA=(B)=>{return Array.isArray(B)||typeof B==="string"},LA=(B)=>{return typeof B==="function"},_A=(B)=>{if(typeof B!=="string")return!1;return B===B.toLowerCase()&&B!==B.toUpperCase()},jA=(B)=>{if(typeof B!=="string")return!1;return B===B.toUpperCase()&&B!==B.toLowerCase()},qA=(B)=>{if(B==null)return!0;if(typeof B==="string"||Array.isArray(B))return B.length===0;if(typeof B==="object"){for(let K in B)return!1;return!0}return!1},CA=(B,K)=>{if(Array.isArray(K))return K.includes(B);if(typeof K==="string")return K.includes(String(B));if(typeof K==="object"&&K!==null)return B in K;return!1},JB=(B,K)=>B===K,NA=(B,K)=>B!==K,SA=(B,K)=>B===K,wA=JB,YB=(B)=>{if(B==null)return!1;if(typeof B==="boolean")return B;if(typeof B==="number")return B!==0;if(typeof B==="string")return B.length>0;if(Array.isArray(B))return B.length>0;if(typeof B==="object"){for(let K in B)return!0;return!1}return!0},VA=(B)=>!YB(B),bA=(B)=>B===!0,hA=(B)=>B===!1,f={divisibleby:UA,even:ZA,odd:JA,number:YA,integer:XA,float:MA,gt:UB,ge:GA,lt:ZB,le:FA,greaterthan:IA,lessthan:EA,defined:RA,undefined:c,none:$B,None:$B,boolean:HA,string:zA,mapping:WA,iterable:PA,sequence:DA,callable:LA,lower:_A,upper:jA,empty:qA,in:CA,eq:JB,ne:NA,sameas:SA,equalto:wA,truthy:YB,falsy:VA,true:bA,false:hA};class H{options;filters;tests;blocks=new Map;parentTemplate=null;source;constructor(B={}){if(this.options={autoescape:B.autoescape??!0,filters:B.filters??{},tests:B.tests??{},globals:B.globals??{},urlResolver:B.urlResolver??((K)=>`#${K}`),staticResolver:B.staticResolver??((K)=>`/static/${K}`),templateLoader:B.templateLoader??(async()=>{throw Error("Template loader not configured")}),timezone:B.timezone??void 0},this.filters={...h,...this.options.filters},this.options.timezone){let K=this.options.timezone;this.filters.date=(A,Q="N j, Y")=>{let O=A instanceof Date?A:new Date(A);if(isNaN(O.getTime()))return"";return this.formatDate(O,Q)},this.filters.time=(A,Q="H:i")=>{return this.filters.date(A,Q)}}this.tests={...f,...this.options.tests}}async render(B,K={}){let A=new w({...this.options.globals,...K});if(this.blocks.clear(),this.parentTemplate=null,this.templateNeedsAsync(B)){if(await this.collectBlocks(B,A),this.parentTemplate)return this.renderTemplateAsync(this.parentTemplate,A);return this.renderTemplateAsync(B,A)}return this.collectBlocksSync(B),this.renderTemplateSync(B,A)}templateNeedsAsync(B){for(let K of B.body){if(K.type==="Extends"||K.type==="Include")return!0;if(K.type==="If"){let A=K;if(this.nodesNeedAsync(A.body))return!0;for(let Q of A.elifs)if(this.nodesNeedAsync(Q.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="For"){let A=K;if(this.nodesNeedAsync(A.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="Block"){if(this.nodesNeedAsync(K.body))return!0}if(K.type==="With"){if(this.nodesNeedAsync(K.body))return!0}}return!1}nodesNeedAsync(B){for(let K of B){if(K.type==="Extends"||K.type==="Include")return!0;if(K.type==="If"){let A=K;if(this.nodesNeedAsync(A.body))return!0;for(let Q of A.elifs)if(this.nodesNeedAsync(Q.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="For"){let A=K;if(this.nodesNeedAsync(A.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(K.type==="Block"){if(this.nodesNeedAsync(K.body))return!0}if(K.type==="With"){if(this.nodesNeedAsync(K.body))return!0}}return!1}collectBlocksSync(B){for(let K of B.body)if(K.type==="Block")this.blocks.set(K.name,K)}renderTemplateSync(B,K){let A=[];for(let Q of B.body){let O=this.renderNodeSync(Q,K);if(O!==null)A.push(O)}return A.join("")}renderNodeSync(B,K){if(B.type==="Text")return B.value;if(B.type==="Output")return this.stringify(this.eval(B.expression,K));switch(B.type){case"If":return this.renderIfSync(B,K);case"For":return this.renderForSync(B,K);case"Block":return this.renderBlockSync(B,K);case"Set":return K.set(B.target,this.eval(B.value,K)),"";case"With":return this.renderWithSync(B,K);case"Url":return this.renderUrlSync(B,K);case"Static":return this.renderStaticSync(B,K);case"Now":return this.renderNowSync(B,K);case"Load":case"Extends":return null;case"Cycle":return this.renderCycleSync(B,K);case"Firstof":return this.renderFirstofSync(B,K);case"Ifchanged":return this.renderIfchangedSync(B,K);case"Regroup":return this.renderRegroupSync(B,K);case"Widthratio":return this.renderWidthratioSync(B,K);case"Lorem":return this.renderLoremSync(B,K);case"CsrfToken":return this.renderCsrfTokenSync();case"Debug":return this.renderDebugSync(K);case"Templatetag":return this.renderTemplatetagSync(B);default:return null}}renderIfSync(B,K){if(this.isTruthy(this.eval(B.test,K)))return this.renderNodesSync(B.body,K);for(let A of B.elifs)if(this.isTruthy(this.eval(A.test,K)))return this.renderNodesSync(A.body,K);return B.else_.length>0?this.renderNodesSync(B.else_,K):""}renderForSync(B,K){let A=this.eval(B.iter,K),Q=this.toIterable(A),O=Q.length;if(O===0)return this.renderNodesSync(B.else_,K);K.push(),K.pushForLoop(Q,0);let U;if(Array.isArray(B.target)){let Y=B.target,J=Y.length;if(O<25){U="";for(let $=0;$<O;$++){let Z=Q[$];if($>0)K.updateForLoop($,Q);let X=Array.isArray(Z)?Z:[Z,Z];for(let M=0;M<J;M++)K.set(Y[M],X[M]);U+=this.renderNodesSync(B.body,K)}}else{let $=Array(O);for(let Z=0;Z<O;Z++){let X=Q[Z];if(Z>0)K.updateForLoop(Z,Q);let M=Array.isArray(X)?X:[X,X];for(let G=0;G<J;G++)K.set(Y[G],M[G]);$[Z]=this.renderNodesSync(B.body,K)}U=$.join("")}}else{let Y=B.target;if(O<25){U="";for(let J=0;J<O;J++){if(J>0)K.updateForLoop(J,Q);K.set(Y,Q[J]),U+=this.renderNodesSync(B.body,K)}}else{let J=Array(O);for(let $=0;$<O;$++){if($>0)K.updateForLoop($,Q);K.set(Y,Q[$]),J[$]=this.renderNodesSync(B.body,K)}U=J.join("")}}return K.popForLoop(),K.pop(),U}renderBlockSync(B,K){let A=this.blocks.get(B.name)||B;K.push();let Q=this.renderNodesSync(B.body,K),O=new String(Q);O.__safe__=!0,K.set("block",{super:O});let U=this.renderNodesSync(A.body,K);return K.pop(),U}renderWithSync(B,K){K.push();for(let{target:Q,value:O}of B.assignments)K.set(Q,this.eval(O,K));let A=this.renderNodesSync(B.body,K);return K.pop(),A}renderUrlSync(B,K){let A=this.eval(B.name,K),Q=[];for(let Y=0;Y<B.args.length;Y++)Q.push(this.eval(B.args[Y],K));let O=this.evalObjectSync(B.kwargs,K),U=this.options.urlResolver(String(A),Q,O);if(B.asVar)return K.set(B.asVar,U),"";return U}renderStaticSync(B,K){let A=this.eval(B.path,K),Q=this.options.staticResolver(String(A));if(B.asVar)return K.set(B.asVar,Q),"";return Q}renderNowSync(B,K){let A=String(this.eval(B.format,K)),Q=this.formatDate(new Date,A);if(B.asVar)return K.set(B.asVar,Q),"";return Q}cycleState=new Map;renderCycleSync(B,K){let A=`cycle_${B.line}_${B.column}`,Q=this.cycleState.get(A)??0,O=[];for(let Y=0;Y<B.values.length;Y++)O.push(this.eval(B.values[Y],K));let U=O[Q%O.length];if(this.cycleState.set(A,Q+1),B.asVar)return K.set(B.asVar,U),B.silent?"":this.stringify(U);return this.stringify(U)}renderFirstofSync(B,K){for(let Q of B.values){let O=this.eval(Q,K);if(this.isTruthy(O)){if(B.asVar)return K.set(B.asVar,O),"";return this.stringify(O)}}let A=B.fallback?this.eval(B.fallback,K):"";if(B.asVar)return K.set(B.asVar,A),"";return this.stringify(A)}ifchangedState=new Map;renderIfchangedSync(B,K){let A=`ifchanged_${B.line}_${B.column}`,Q;if(B.values.length>0){let Y=[];for(let J=0;J<B.values.length;J++)Y.push(this.eval(B.values[J],K));Q=Y}else Q=this.renderNodesSync(B.body,K);let O=this.ifchangedState.get(A),U=!this.deepEqual(Q,O);if(this.ifchangedState.set(A,Q),U){if(B.values.length>0)return this.renderNodesSync(B.body,K);return Q}else return this.renderNodesSync(B.else_,K)}renderRegroupSync(B,K){let A=this.toIterable(this.eval(B.target,K)),Q=[],O=Symbol("initial"),U=[];for(let Y of A){let J=Y&&typeof Y==="object"?Y[B.key]:void 0;if(J!==O){if(U.length>0)Q.push({grouper:O,list:U});O=J,U=[Y]}else U.push(Y)}if(U.length>0)Q.push({grouper:O,list:U});return K.set(B.asVar,Q),""}renderWidthratioSync(B,K){let A=Number(this.eval(B.value,K)),Q=Number(this.eval(B.maxValue,K)),O=Number(this.eval(B.maxWidth,K)),U=Q===0?0:Math.round(A/Q*O);if(B.asVar)return K.set(B.asVar,U),"";return String(U)}renderLoremSync(B,K){let A=B.count?Number(this.eval(B.count,K)):1,Q=B.method,O=["lorem","ipsum","dolor","sit","amet","consectetur","adipiscing","elit","sed","do","eiusmod","tempor","incididunt","ut","labore","et","dolore","magna","aliqua","enim","ad","minim","veniam","quis","nostrud","exercitation","ullamco","laboris","nisi","aliquip","ex","ea","commodo","consequat","duis","aute","irure","in","reprehenderit","voluptate","velit","esse","cillum","fugiat","nulla","pariatur","excepteur","sint","occaecat","cupidatat","non","proident","sunt","culpa","qui","officia","deserunt","mollit","anim","id","est","laborum"],U=(Y)=>{if(B.random)return O[Math.floor(Math.random()*O.length)];return O[Y%O.length]};if(Q==="w"){let Y=[];for(let J=0;J<A;J++)Y.push(U(J));return Y.join(" ")}else if(Q==="p"||Q==="b"){let Y=[];for(let J=0;J<A;J++){let $=3+J%3,Z=[];for(let X=0;X<$;X++){let M=8+X%7,G=[];for(let E=0;E<M;E++)G.push(U(J*100+X*20+E));G[0]=G[0].charAt(0).toUpperCase()+G[0].slice(1),Z.push(G.join(" ")+".")}Y.push(Z.join(" "))}if(Q==="b")return Y.join(`
|
|
25
25
|
|
|
26
|
-
`);return
|
|
27
|
-
`)}return""}renderCsrfTokenSync(){return'<input type="hidden" name="csrfmiddlewaretoken" value="CSRF_TOKEN_PLACEHOLDER">'}renderDebugSync(B){let K=B.toObject?.()||{};return`<pre>${JSON.stringify(K,null,2)}</pre>`}renderTemplatetagSync(B){return{openblock:"{%",closeblock:"%}",openvariable:"{{",closevariable:"}}",openbrace:"{",closebrace:"}",opencomment:"{#",closecomment:"#}"}[B.tagType]||""}getDateInTimezone(B,K){if(!K)return{year:B.getFullYear(),month:B.getMonth(),day:B.getDate(),weekday:B.getDay(),hours:B.getHours(),minutes:B.getMinutes(),seconds:B.getSeconds()};let Q=new Intl.DateTimeFormat("en-US",{timeZone:K,year:"numeric",month:"2-digit",day:"2-digit",weekday:"short",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(B)
|
|
28
|
-
`;
|
|
29
|
-
`),G=M[0];for(let
|
|
30
|
-
`+(M[R].trim()===""?M[R]:X+M[R]);return G}case"stringformat":{let J=String(O),X=A;if(J==="s")return String(X);if(J==="d"||J==="i")return String(parseInt(String(X),10)||0);if(J==="f")return String(parseFloat(String(X))||0);if(J==="x")return(parseInt(String(X),10)||0).toString(16);if(J==="X")return(parseInt(String(X),10)||0).toString(16).toUpperCase();if(J==="o")return(parseInt(String(X),10)||0).toString(8);if(J==="b")return(parseInt(String(X),10)||0).toString(2);if(J==="e")return(parseFloat(String(X))||0).toExponential();let M=J.match(/^\.?(\d+)f$/);if(M)return(parseFloat(String(X))||0).toFixed(parseInt(M[1],10));let G=J.match(/^(0?)(\d+)([sd])$/);if(G){let[,R,F,W]=G,j=parseInt(F,10);return(W==="d"?String(parseInt(String(X),10)||0):String(X)).padStart(j,R?"0":" ")}return String(X)}case"json_script":{let J=JSON.stringify(A).replace(/</g,"\\u003C").replace(/>/g,"\\u003E").replace(/&/g,"\\u0026"),M=`<script${O?` id="${String(O)}"`:""} type="application/json">${J}</script>`,G=new String(M);return G.__safe__=!0,G}}}if($===2){let O=this.eval(B.args[0],K),J=this.eval(B.args[1],K);switch(Q){case"replace":return String(A??"").replaceAll(String(O),String(J));case"batch":{if(!Array.isArray(A))return[[A]];let X=Number(O)||1,M=J,G=[];for(let R=0;R<A.length;R+=X){let F=A.slice(R,R+X);while(M!==null&&F.length<X)F.push(M);G.push(F)}return G}case"sum":{if(!Array.isArray(A))return Number(J)||0;let X=Number(J)||0;for(let M=0;M<A.length;M++)X+=Number(O?A[M][O]:A[M])||0;return X}case"max":{if(!Array.isArray(A)||A.length===0)return J;if(O){let M=A[0];for(let G=1;G<A.length;G++)if(A[G][O]>M[O])M=A[G];return M}let X=A[0];for(let M=1;M<A.length;M++)if(A[M]>X)X=A[M];return X}case"min":{if(!Array.isArray(A)||A.length===0)return J;if(O){let M=A[0];for(let G=1;G<A.length;G++)if(A[G][O]<M[O])M=A[G];return M}let X=A[0];for(let M=1;M<A.length;M++)if(A[M]<X)X=A[M];return X}case"timesince":{let X=A instanceof Date?A:new Date(A),G=((O instanceof Date?O:new Date(O??Date.now())).getTime()-X.getTime())/1000,R=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[F,W,j]of R){let q=Math.floor(G/F);if(q>=1)return`${q} ${q===1?W:j}`}return"just now"}case"timeuntil":{let X=A instanceof Date?A:new Date(A),M=O instanceof Date?O:new Date(O??Date.now()),G=(X.getTime()-M.getTime())/1000,R=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[F,W,j]of R){let q=Math.floor(G/F);if(q>=1)return`${q} ${q===1?W:j}`}return"now"}}}let Z=[];for(let O=0;O<$;O++)Z.push(this.eval(B.args[O],K));let U=this.evalObjectSync(B.kwargs,K),Y=this.filters[Q];if(!Y){let O=Object.keys(this.filters),J=n(Q,O);throw new y(`Unknown filter '${Q}'`,{line:B.line,column:B.column,source:this.source,suggestion:J||void 0,availableOptions:O.slice(0,15)})}return Y(A,...Z,...Object.values(U))}evalBinaryOp(B,K){let A=this.eval(B.left,K),Q=B.operator;if(Q==="and")return this.isTruthy(A)?this.eval(B.right,K):A;if(Q==="or")return this.isTruthy(A)?A:this.eval(B.right,K);let $=this.eval(B.right,K);if(Q==="%"){if(typeof A==="number"&&typeof $==="number")return $===0?NaN:A%$;let Z=Number($);return Z===0?NaN:Number(A)%Z}if(Q==="+"){if(typeof A==="number"&&typeof $==="number")return A+$;return typeof A==="string"||typeof $==="string"?String(A)+String($):Number(A)+Number($)}switch(Q){case"-":return Number(A)-Number($);case"*":return Number(A)*Number($);case"/":return Number(A)/Number($);case"~":return String(A)+String($);default:return}}evalUnaryOp(B,K){let A=this.eval(B.operand,K);switch(B.operator){case"not":return!this.isTruthy(A);case"-":return-Number(A);case"+":return+Number(A);default:return A}}evalCompare(B,K){let A=this.eval(B.left,K),Q=B.ops;if(Q.length===1){let{operator:Z,right:U}=Q[0],Y=this.eval(U,K);if(Z==="==")return A===Y;if(Z==="!=")return A!==Y;if(Z==="<")return A<Y;if(Z===">")return A>Y;if(Z==="<=")return A<=Y;if(Z===">=")return A>=Y;if(Z==="in")return this.isIn(A,Y);if(Z==="not in")return!this.isIn(A,Y);if(Z==="is")return A===Y;if(Z==="is not")return A!==Y;return!1}let $=A;for(let{operator:Z,right:U}of Q){let Y=this.eval(U,K),O;switch(Z){case"==":O=$===Y;break;case"!=":O=$!==Y;break;case"<":O=$<Y;break;case">":O=$>Y;break;case"<=":O=$<=Y;break;case">=":O=$>=Y;break;case"in":O=this.isIn($,Y);break;case"not in":O=!this.isIn($,Y);break;case"is":O=$===Y;break;case"is not":O=$!==Y;break;default:O=!1}if(!O)return!1;$=Y}return!0}evalConditional(B,K){return this.isTruthy(this.eval(B.test,K))?this.eval(B.trueExpr,K):this.eval(B.falseExpr,K)}evalObjectLiteral(B,K){let A={};for(let{key:Q,value:$}of B.pairs)A[String(this.eval(Q,K))]=this.eval($,K);return A}evalFunctionCall(B,K){let A=this.eval(B.callee,K),Q=[];for(let Z=0;Z<B.args.length;Z++)Q.push(this.eval(B.args[Z],K));let $=this.evalObjectSync(B.kwargs,K);return typeof A==="function"?A(...Q,$):void 0}evalTest(B,K){let{test:A,negated:Q}=B;if(A==="defined"||A==="undefined"){let O=!1;if(B.node.type==="Name")O=K.has(B.node.name);else O=this.eval(B.node,K)!==void 0;let J=A==="defined"?O:!O;return Q?!J:J}let $=this.eval(B.node,K);if(B.args.length===0){let O;switch(A){case"even":{let J=Number($);O=Number.isInteger(J)&&J%2===0;break}case"odd":{let J=Number($);O=Number.isInteger(J)&&J%2!==0;break}case"number":O=typeof $==="number"&&!isNaN($);break;case"integer":O=Number.isInteger($);break;case"float":O=typeof $==="number"&&!Number.isInteger($)&&!isNaN($);break;case"none":case"None":O=$===null;break;case"boolean":O=typeof $==="boolean";break;case"string":O=typeof $==="string";break;case"mapping":O=$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Date);break;case"iterable":O=$!=null&&(typeof $==="string"||Array.isArray($)||typeof $[Symbol.iterator]==="function");break;case"sequence":O=Array.isArray($)||typeof $==="string";break;case"callable":O=typeof $==="function";break;case"lower":O=typeof $==="string"&&$===$.toLowerCase()&&$!==$.toUpperCase();break;case"upper":O=typeof $==="string"&&$===$.toUpperCase()&&$!==$.toLowerCase();break;case"empty":if($==null)O=!0;else if(typeof $==="string"||Array.isArray($))O=$.length===0;else if(typeof $==="object"){O=!0;for(let J in $){O=!1;break}}else O=!1;break;case"truthy":if($==null)O=!1;else if(typeof $==="boolean")O=$;else if(typeof $==="number")O=$!==0;else if(typeof $==="string")O=$.length>0;else if(Array.isArray($))O=$.length>0;else if(typeof $==="object"){O=!1;for(let J in $){O=!0;break}}else O=!0;break;case"falsy":if($==null)O=!0;else if(typeof $==="boolean")O=!$;else if(typeof $==="number")O=$===0;else if(typeof $==="string")O=$.length===0;else if(Array.isArray($))O=$.length===0;else if(typeof $==="object"){O=!0;for(let J in $){O=!1;break}}else O=!1;break;case"true":O=$===!0;break;case"false":O=$===!1;break;default:{let J=this.tests[A];if(!J)throw Error(`Unknown test: ${A}`);O=J($)}}return Q?!O:O}if(B.args.length===1){let O=this.eval(B.args[0],K),J;switch(A){case"divisibleby":{let X=Number($),M=Number(O);J=M!==0&&X%M===0;break}case"gt":case"greaterthan":J=Number($)>Number(O);break;case"ge":J=Number($)>=Number(O);break;case"lt":case"lessthan":J=Number($)<Number(O);break;case"le":J=Number($)<=Number(O);break;case"eq":case"equalto":case"sameas":J=$===O;break;case"ne":J=$!==O;break;case"in":if(Array.isArray(O))J=O.includes($);else if(typeof O==="string")J=O.includes(String($));else if(typeof O==="object"&&O!==null)J=$ in O;else J=!1;break;default:{let X=this.tests[A];if(!X)throw Error(`Unknown test: ${A}`);J=X($,O)}}return Q?!J:J}let Z=[];for(let O=0;O<B.args.length;O++)Z.push(this.eval(B.args[O],K));let U=this.tests[A];if(!U)throw Error(`Unknown test: ${A}`);let Y=U($,...Z);return Q?!Y:Y}evalObjectSync(B,K){let A={};for(let Q in B)A[Q]=this.eval(B[Q],K);return A}async collectBlocks(B,K){for(let A of B.body)if(A.type==="Extends"){let Q=this.eval(A.template,K);this.parentTemplate=await this.options.templateLoader(String(Q)),await this.collectBlocks(this.parentTemplate,K)}else if(A.type==="Block")this.blocks.set(A.name,A)}async renderTemplateAsync(B,K){let A=[];for(let Q of B.body){let $=await this.renderNodeAsync(Q,K);if($!==null)A.push($)}return A.join("")}async renderNodeAsync(B,K){switch(B.type){case"Text":return B.value;case"Output":return this.stringify(this.eval(B.expression,K));case"If":return this.renderIfAsync(B,K);case"For":return this.renderForAsync(B,K);case"Block":return this.renderBlockAsync(B,K);case"Extends":return null;case"Include":return this.renderInclude(B,K);case"Set":return K.set(B.target,this.eval(B.value,K)),"";case"With":return this.renderWithAsync(B,K);case"Load":return null;case"Url":return this.renderUrlSync(B,K);case"Static":return this.renderStaticSync(B,K);case"Now":return this.renderNowSync(B,K);case"Cycle":return this.renderCycleSync(B,K);case"Firstof":return this.renderFirstofSync(B,K);case"Ifchanged":return this.renderIfchangedSync(B,K);case"Regroup":return this.renderRegroupSync(B,K);case"Widthratio":return this.renderWidthratioSync(B,K);case"Lorem":return this.renderLoremSync(B,K);case"CsrfToken":return this.renderCsrfTokenSync();case"Debug":return this.renderDebugSync(K);case"Templatetag":return this.renderTemplatetagSync(B);default:return null}}async renderIfAsync(B,K){if(this.isTruthy(this.eval(B.test,K)))return this.renderNodesAsync(B.body,K);for(let A of B.elifs)if(this.isTruthy(this.eval(A.test,K)))return this.renderNodesAsync(A.body,K);return B.else_.length>0?this.renderNodesAsync(B.else_,K):""}async renderForAsync(B,K){let A=this.eval(B.iter,K),Q=this.toIterable(A),$=Q.length;if($===0)return this.renderNodesAsync(B.else_,K);let Z=Array($),U=Array.isArray(B.target);K.push(),K.pushForLoop(Q,0);for(let Y=0;Y<$;Y++){let O=Q[Y];if(Y>0)K.updateForLoop(Y,Q);if(U){let J=Array.isArray(O)?O:[O,O],X=B.target;for(let M=0;M<X.length;M++)K.set(X[M],J[M])}else K.set(B.target,O);Z[Y]=await this.renderNodesAsync(B.body,K)}return K.popForLoop(),K.pop(),Z.join("")}async renderBlockAsync(B,K){let A=this.blocks.get(B.name)||B;K.push();let Q=await this.renderNodesAsync(B.body,K),$=new String(Q);$.__safe__=!0,K.set("block",{super:$});let Z=await this.renderNodesAsync(A.body,K);return K.pop(),Z}async renderInclude(B,K){try{let A=this.eval(B.template,K),Q=await this.options.templateLoader(String(A)),$;if(B.only)$=new w(B.context?this.evalObjectSync(B.context,K):{});else{let Z=B.context?this.evalObjectSync(B.context,K):{};$=K.derived(Z)}return this.renderTemplateAsync(Q,$)}catch(A){if(B.ignoreMissing)return"";throw A}}async renderWithAsync(B,K){K.push();for(let{target:Q,value:$}of B.assignments)K.set(Q,this.eval($,K));let A=await this.renderNodesAsync(B.body,K);return K.pop(),A}async renderNodesAsync(B,K){let A=[];for(let Q of B){let $=await this.renderNodeAsync(Q,K);if($!==null)A.push($)}return A.join("")}async evaluate(B,K){return this.eval(B,K)}stringify(B){if(B==null)return"";if(typeof B==="string"){if(B.__safe__)return B;return this.options.autoescape?Bun.escapeHTML(B):B}if(typeof B==="boolean")return B?"True":"False";if(typeof B==="number")return String(B);let K=String(B);if(B.__safe__)return K;return this.options.autoescape?Bun.escapeHTML(K):K}isTruthy(B){if(typeof B==="boolean")return B;if(B==null)return!1;if(typeof B==="string")return B.length>0;if(typeof B==="number")return B!==0;if(Array.isArray(B))return B.length>0;if(typeof B==="object"){for(let K in B)return!0;return!1}return!0}deepEqual(B,K){if(B===K)return!0;if(B==null||K==null)return B===K;let A=typeof B;if(A!==typeof K)return!1;if(A!=="object")return!1;if(Array.isArray(B)){if(!Array.isArray(K)||B.length!==K.length)return!1;for(let $=0;$<B.length;$++)if(!this.deepEqual(B[$],K[$]))return!1;return!0}return JSON.stringify(B)===JSON.stringify(K)}isIn(B,K){if(Array.isArray(K))return K.includes(B);if(typeof K==="string")return K.includes(String(B));if(typeof K==="object"&&K!==null)return B in K;return!1}toIterable(B){if(Array.isArray(B))return B;if(B==null)return[];if(typeof B==="string")return B.split("");if(typeof B==="object"){if(typeof B[Symbol.iterator]==="function")return Array.from(B);let K=Object.keys(B),A=K.length,Q=Array(A);for(let $=0;$<A;$++){let Z=K[$],U=B[Z],Y=[Z,U];Y.key=Z,Y.value=U,Q[$]=Y}return Q}return[B]}addFilter(B,K){this.filters[B]=K}addTest(B,K){this.tests[B]=K}addGlobal(B,K){this.options.globals[B]=K}setSource(B){this.source=B}}function T(B,K={}){return new XB(K).compile(B)}function v(B,K={}){let A=T(B,K),Q=Function("__ctx","__helpers",`
|
|
26
|
+
`);return Y.map((J)=>`<p>${J}</p>`).join(`
|
|
27
|
+
`)}return""}renderCsrfTokenSync(){return'<input type="hidden" name="csrfmiddlewaretoken" value="CSRF_TOKEN_PLACEHOLDER">'}renderDebugSync(B){let K=B.toObject?.()||{};return`<pre>${JSON.stringify(K,null,2)}</pre>`}renderTemplatetagSync(B){return{openblock:"{%",closeblock:"%}",openvariable:"{{",closevariable:"}}",openbrace:"{",closebrace:"}",opencomment:"{#",closecomment:"#}"}[B.tagType]||""}getDateInTimezone(B,K){if(!K)return{year:B.getFullYear(),month:B.getMonth(),day:B.getDate(),weekday:B.getDay(),hours:B.getHours(),minutes:B.getMinutes(),seconds:B.getSeconds()};let Q=new Intl.DateTimeFormat("en-US",{timeZone:K,year:"numeric",month:"2-digit",day:"2-digit",weekday:"short",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(B),O=(Y)=>Q.find((J)=>J.type===Y)?.value||"",U={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};return{year:parseInt(O("year"),10),month:parseInt(O("month"),10)-1,day:parseInt(O("day"),10),weekday:U[O("weekday")]??0,hours:parseInt(O("hour"),10),minutes:parseInt(O("minute"),10),seconds:parseInt(O("second"),10)}}formatDate(B,K){let A=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Q=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],O=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],U=["January","February","March","April","May","June","July","August","September","October","November","December"],Y=this.options.timezone,{year:J,month:$,day:Z,weekday:X,hours:M,minutes:G,seconds:E}=this.getDateInTimezone(B,Y),I="";for(let W=0;W<K.length;W++){let j=K[W];switch(j){case"d":I+=String(Z).padStart(2,"0");break;case"j":I+=String(Z);break;case"D":I+=A[X];break;case"l":I+=Q[X];break;case"m":I+=String($+1).padStart(2,"0");break;case"n":I+=String($+1);break;case"M":I+=O[$];break;case"F":I+=U[$];break;case"y":I+=String(J).slice(-2);break;case"Y":I+=String(J);break;case"H":I+=String(M).padStart(2,"0");break;case"G":I+=String(M);break;case"i":I+=String(G).padStart(2,"0");break;case"s":I+=String(E).padStart(2,"0");break;case"a":I+=M<12?"a.m.":"p.m.";break;case"A":I+=M<12?"AM":"PM";break;case"g":I+=String(M%12||12);break;case"h":I+=String(M%12||12).padStart(2,"0");break;default:I+=j}}return I}renderNodesSync(B,K){let A=B.length;if(A===0)return"";if(A===1)return this.renderNodeSync(B[0],K)??"";if(A===2){let O=this.renderNodeSync(B[0],K)??"",U=this.renderNodeSync(B[1],K)??"";return O+U}let Q=[];for(let O=0;O<A;O++){let U=this.renderNodeSync(B[O],K);if(U!==null)Q.push(U)}return Q.join("")}eval(B,K){if(B.type==="Literal")return B.value;if(B.type==="Name")return K.get(B.name);if(B.type==="GetAttr")return this.evalGetAttr(B,K);switch(B.type){case"GetItem":return this.evalGetItem(B,K);case"FilterExpr":return this.evalFilter(B,K);case"BinaryOp":return this.evalBinaryOp(B,K);case"UnaryOp":return this.evalUnaryOp(B,K);case"Compare":return this.evalCompare(B,K);case"Conditional":return this.evalConditional(B,K);case"Array":{let A=B.elements,Q=[];for(let O=0;O<A.length;O++)Q.push(this.eval(A[O],K));return Q}case"Object":return this.evalObjectLiteral(B,K);case"FunctionCall":return this.evalFunctionCall(B,K);case"TestExpr":return this.evalTest(B,K);default:return}}evalGetAttr(B,K){let A=this.eval(B.object,K);if(A==null)return;let Q=B.attribute,O=A[Q];if(O===void 0){if(Array.isArray(A)){let U=parseInt(Q,10);if(!isNaN(U))return A[U]}return}if(typeof O==="function")return O.bind(A);return O}evalGetItem(B,K){let A=this.eval(B.object,K),Q=this.eval(B.index,K);if(A==null)return;return A[Q]}static TITLE_REGEX=/\b\w/g;static STRIPTAGS_REGEX=/<[^>]*>/g;static SLUGIFY_REGEX1=/[^\w\s-]/g;static SLUGIFY_REGEX2=/[\s_-]+/g;static SLUGIFY_REGEX3=/^-+|-+$/g;static WHITESPACE_REGEX=/\s+/;static URLIZE_REGEX=/(https?:\/\/[^\s]+)/g;static NEWLINE_REGEX=/\n/g;static DOUBLE_NEWLINE_REGEX=/\n\n+/;evalFilter(B,K){let A=this.eval(B.node,K),Q=B.filter,O=B.args.length;if(O===0)switch(Q){case"upper":return String(A??"").toUpperCase();case"lower":return String(A??"").toLowerCase();case"trim":return String(A??"").trim();case"capitalize":{let $=String(A??"");return $.charAt(0).toUpperCase()+$.slice(1).toLowerCase()}case"capfirst":{let $=String(A??"");return $.charAt(0).toUpperCase()+$.slice(1)}case"title":return String(A??"").replace(H.TITLE_REGEX,($)=>$.toUpperCase());case"striptags":return String(A??"").replace(H.STRIPTAGS_REGEX,"");case"slugify":return String(A??"").toLowerCase().replace(H.SLUGIFY_REGEX1,"").replace(H.SLUGIFY_REGEX2,"-").replace(H.SLUGIFY_REGEX3,"");case"wordcount":{let $=String(A??"").trim();return $?$.split(H.WHITESPACE_REGEX).length:0}case"escapejs":return JSON.stringify(String(A??"")).slice(1,-1);case"linebreaksbr":{let $=String(A??"").replace(H.NEWLINE_REGEX,"<br>"),Z=new String($);return Z.__safe__=!0,Z}case"linebreaks":{let $=String(A??"").split(H.DOUBLE_NEWLINE_REGEX),Z="";for(let M=0;M<$.length;M++){if(M>0)Z+=`
|
|
28
|
+
`;Z+=`<p>${$[M].replace(H.NEWLINE_REGEX,"<br>")}</p>`}let X=new String(Z);return X.__safe__=!0,X}case"urlencode":return encodeURIComponent(String(A??""));case"safe":{let $=new String(A??"");return $.__safe__=!0,$}case"escape":case"e":{if(A?.__safe__)return A;let $=new String(Bun.escapeHTML(String(A??"")));return $.__safe__=!0,$}case"forceescape":{let $=new String(Bun.escapeHTML(String(A??"")));return $.__safe__=!0,$}case"int":return parseInt(String(A),10)||0;case"float":return parseFloat(String(A))||0;case"abs":return Math.abs(Number(A)||0);case"filesizeformat":{let $=Number(A)||0,Z=["bytes","KB","MB","GB","TB","PB"],X=0,M=$;while(M>=1024&&X<Z.length-1)M/=1024,X++;return`${M.toFixed(1)} ${Z[X]}`}case"length":if(A==null)return 0;if(typeof A==="string"||Array.isArray(A))return A.length;if(typeof A==="object"){let $=0;for(let Z in A)$++;return $}return 0;case"first":if(Array.isArray(A))return A[0];if(typeof A==="string")return A[0];return A;case"last":if(Array.isArray(A))return A[A.length-1];if(typeof A==="string")return A[A.length-1];return A;case"reverse":if(Array.isArray(A))return[...A].reverse();if(typeof A==="string")return A.split("").reverse().join("");return A;case"sort":if(Array.isArray(A))return[...A].sort();return A;case"unique":if(Array.isArray(A))return[...new Set(A)];return A;case"list":case"make_list":if(Array.isArray(A))return A;if(typeof A==="string")return A.split("");if(A&&typeof A[Symbol.iterator]==="function")return[...A];if(typeof A==="object"&&A!==null)return Object.values(A);return[A];case"random":if(Array.isArray(A))return A[Math.floor(Math.random()*A.length)];return A;case"items":if(A==null||typeof A!=="object")return[];return Object.entries(A);case"string":return String(A??"");case"json":case"tojson":try{let $=new String(JSON.stringify(A));return $.__safe__=!0,$}catch{return""}case"pprint":try{let $=new String(JSON.stringify(A,null,2));return $.__safe__=!0,$}catch{return String(A)}case"urlize":{let $=String(A??"").replace(H.URLIZE_REGEX,'<a href="$1">$1</a>'),Z=new String($);return Z.__safe__=!0,Z}}if(O===1){let $=this.eval(B.args[0],K);switch(Q){case"default":case"d":if(A===void 0||A===null||A===""||A===!1)return $;return A;case"default_if_none":return A===null||A===void 0?$:A;case"truncatechars":{let Z=String(A??""),X=Number($)||30;if(Z.length<=X)return Z;return Z.slice(0,X-3)+"..."}case"truncatewords":{let Z=String(A??"").split(H.WHITESPACE_REGEX),X=Number($)||15;if(Z.length<=X)return A;return Z.slice(0,X).join(" ")+"..."}case"center":{let Z=String(A??""),X=Number($)||80,M=Math.max(0,X-Z.length),G=Math.floor(M/2);return" ".repeat(G)+Z+" ".repeat(M-G)}case"ljust":return String(A??"").padEnd(Number($)||80);case"rjust":return String(A??"").padStart(Number($)||80);case"cut":return String(A??"").split(String($)).join("");case"add":{let Z=Number(A),X=Number($);if(!isNaN(Z)&&!isNaN(X))return Z+X;return String(A)+String($)}case"divisibleby":return Number(A)%Number($)===0;case"round":return Number(Number(A).toFixed(Number($)||0));case"floatformat":{let Z=parseFloat(String(A));if(isNaN(Z))return"";let X=Number($);if(X===-1){let M=Z.toFixed(1);return M.endsWith(".0")?Math.round(Z).toString():M}return Z.toFixed(Math.abs(X))}case"get_digit":{let Z=parseInt(String(A),10);if(isNaN(Z))return A;let X=String(Math.abs(Z)),M=Number($)||1;if(M<1||M>X.length)return A;return parseInt(X[X.length-M],10)}case"join":if(Array.isArray(A))return A.join(String($??""));return String(A);case"slice":{if(!A)return A;let[Z,X]=String($).split(":"),M=Z?parseInt(Z,10):0,G=X?parseInt(X,10):void 0;if(Array.isArray(A)||typeof A==="string")return A.slice(M,G);return A}case"batch":{if(!Array.isArray(A))return[[A]];let Z=Number($)||1,X=[];for(let M=0;M<A.length;M+=Z)X.push(A.slice(M,M+Z));return X}case"columns":{if(!Array.isArray(A))return[[A]];let Z=Number($)||2,X=[];for(let M=0;M<A.length;M+=Z)X.push(A.slice(M,M+Z));return X}case"length_is":return(A==null?0:A.length??Object.keys(A).length??0)===Number($);case"attr":return A==null?void 0:A[$];case"dictsort":if(!Array.isArray(A))return A;return[...A].sort((Z,X)=>{let M=$?Z[$]:Z,G=$?X[$]:X;return M<G?-1:M>G?1:0});case"dictsortreversed":if(!Array.isArray(A))return A;return[...A].sort((Z,X)=>{let M=$?Z[$]:Z,G=$?X[$]:X;return M>G?-1:M<G?1:0});case"map":if(!Array.isArray(A))return[];if(typeof $==="string")return A.map((Z)=>Z?.[$]);return A;case"select":if(!Array.isArray(A))return[];if($===void 0)return A.filter((Z)=>!!Z);return A.filter((Z)=>!!Z?.[$]);case"reject":if(!Array.isArray(A))return[];if($===void 0)return A.filter((Z)=>!Z);return A.filter((Z)=>!Z?.[$]);case"groupby":{if(!Array.isArray(A))return[];let Z={};for(let M of A){let G=String($?M[$]:M);if(!(G in Z))Z[G]=[];Z[G].push(M)}let X=[];for(let M in Z)X.push({grouper:M,list:Z[M]});return X}case"date":case"time":{let Z=A instanceof Date?A:new Date(A);if(isNaN(Z.getTime()))return"";return this.formatDate(Z,String($||(Q==="time"?"H:i":"N j, Y")))}case"pluralize":{let Z=String($??"s"),[X,M]=Z.includes(",")?Z.split(","):["",Z];return Number(A)===1?X:M}case"yesno":{let[Z,X,M]=String($??"yes,no,maybe").split(",");if(A===!0)return Z;if(A===!1)return X;return M??X}case"json":case"tojson":try{let Z=new String(JSON.stringify(A,null,$));return Z.__safe__=!0,Z}catch{return""}case"urlizetrunc":{let Z=Number($)||15,X=String(A??"").replace(H.URLIZE_REGEX,(G)=>{let E=G.length>Z?G.slice(0,Z)+"...":G;return`<a href="${G}">${E}</a>`}),M=new String(X);return M.__safe__=!0,M}case"indent":{let Z=String(A??""),X=typeof $==="string"?$:" ".repeat(Number($)||4),M=Z.split(`
|
|
29
|
+
`),G=M[0];for(let E=1;E<M.length;E++)G+=`
|
|
30
|
+
`+(M[E].trim()===""?M[E]:X+M[E]);return G}case"stringformat":{let Z=String($),X=A;if(Z==="s")return String(X);if(Z==="d"||Z==="i")return String(parseInt(String(X),10)||0);if(Z==="f")return String(parseFloat(String(X))||0);if(Z==="x")return(parseInt(String(X),10)||0).toString(16);if(Z==="X")return(parseInt(String(X),10)||0).toString(16).toUpperCase();if(Z==="o")return(parseInt(String(X),10)||0).toString(8);if(Z==="b")return(parseInt(String(X),10)||0).toString(2);if(Z==="e")return(parseFloat(String(X))||0).toExponential();let M=Z.match(/^\.?(\d+)f$/);if(M)return(parseFloat(String(X))||0).toFixed(parseInt(M[1],10));let G=Z.match(/^(0?)(\d+)([sd])$/);if(G){let[,E,I,W]=G,j=parseInt(I,10);return(W==="d"?String(parseInt(String(X),10)||0):String(X)).padStart(j,E?"0":" ")}return String(X)}case"json_script":{let Z=JSON.stringify(A).replace(/</g,"\\u003C").replace(/>/g,"\\u003E").replace(/&/g,"\\u0026"),M=`<script${$?` id="${String($)}"`:""} type="application/json">${Z}</script>`,G=new String(M);return G.__safe__=!0,G}}}if(O===2){let $=this.eval(B.args[0],K),Z=this.eval(B.args[1],K);switch(Q){case"replace":return String(A??"").replaceAll(String($),String(Z));case"batch":{if(!Array.isArray(A))return[[A]];let X=Number($)||1,M=Z,G=[];for(let E=0;E<A.length;E+=X){let I=A.slice(E,E+X);while(M!==null&&I.length<X)I.push(M);G.push(I)}return G}case"sum":{if(!Array.isArray(A))return Number(Z)||0;let X=Number(Z)||0;for(let M=0;M<A.length;M++)X+=Number($?A[M][$]:A[M])||0;return X}case"max":{if(!Array.isArray(A)||A.length===0)return Z;if($){let M=A[0];for(let G=1;G<A.length;G++)if(A[G][$]>M[$])M=A[G];return M}let X=A[0];for(let M=1;M<A.length;M++)if(A[M]>X)X=A[M];return X}case"min":{if(!Array.isArray(A)||A.length===0)return Z;if($){let M=A[0];for(let G=1;G<A.length;G++)if(A[G][$]<M[$])M=A[G];return M}let X=A[0];for(let M=1;M<A.length;M++)if(A[M]<X)X=A[M];return X}case"timesince":{let X=A instanceof Date?A:new Date(A),G=(($ instanceof Date?$:new Date($??Date.now())).getTime()-X.getTime())/1000,E=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[I,W,j]of E){let q=Math.floor(G/I);if(q>=1)return`${q} ${q===1?W:j}`}return"just now"}case"timeuntil":{let X=A instanceof Date?A:new Date(A),M=$ instanceof Date?$:new Date($??Date.now()),G=(X.getTime()-M.getTime())/1000,E=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[I,W,j]of E){let q=Math.floor(G/I);if(q>=1)return`${q} ${q===1?W:j}`}return"now"}}}let U=[];for(let $=0;$<O;$++)U.push(this.eval(B.args[$],K));let Y=this.evalObjectSync(B.kwargs,K),J=this.filters[Q];if(!J){let $=Object.keys(this.filters),Z=n(Q,$);throw new y(`Unknown filter '${Q}'`,{line:B.line,column:B.column,source:this.source,suggestion:Z||void 0,availableOptions:$.slice(0,15)})}return J(A,...U,...Object.values(Y))}evalBinaryOp(B,K){let A=this.eval(B.left,K),Q=B.operator;if(Q==="and")return this.isTruthy(A)?this.eval(B.right,K):A;if(Q==="or")return this.isTruthy(A)?A:this.eval(B.right,K);let O=this.eval(B.right,K);if(Q==="%"){if(typeof A==="number"&&typeof O==="number")return O===0?NaN:A%O;let U=Number(O);return U===0?NaN:Number(A)%U}if(Q==="+"){if(typeof A==="number"&&typeof O==="number")return A+O;return typeof A==="string"||typeof O==="string"?String(A)+String(O):Number(A)+Number(O)}switch(Q){case"-":return Number(A)-Number(O);case"*":return Number(A)*Number(O);case"/":return Number(A)/Number(O);case"~":return String(A)+String(O);default:return}}evalUnaryOp(B,K){let A=this.eval(B.operand,K);switch(B.operator){case"not":return!this.isTruthy(A);case"-":return-Number(A);case"+":return+Number(A);default:return A}}evalCompare(B,K){let A=this.eval(B.left,K),Q=B.ops;if(Q.length===1){let{operator:U,right:Y}=Q[0],J=this.eval(Y,K);if(U==="==")return A===J;if(U==="!=")return A!==J;if(U==="<")return A<J;if(U===">")return A>J;if(U==="<=")return A<=J;if(U===">=")return A>=J;if(U==="in")return this.isIn(A,J);if(U==="not in")return!this.isIn(A,J);if(U==="is")return A===J;if(U==="is not")return A!==J;return!1}let O=A;for(let{operator:U,right:Y}of Q){let J=this.eval(Y,K),$;switch(U){case"==":$=O===J;break;case"!=":$=O!==J;break;case"<":$=O<J;break;case">":$=O>J;break;case"<=":$=O<=J;break;case">=":$=O>=J;break;case"in":$=this.isIn(O,J);break;case"not in":$=!this.isIn(O,J);break;case"is":$=O===J;break;case"is not":$=O!==J;break;default:$=!1}if(!$)return!1;O=J}return!0}evalConditional(B,K){return this.isTruthy(this.eval(B.test,K))?this.eval(B.trueExpr,K):this.eval(B.falseExpr,K)}evalObjectLiteral(B,K){let A={};for(let{key:Q,value:O}of B.pairs)A[String(this.eval(Q,K))]=this.eval(O,K);return A}evalFunctionCall(B,K){let A=this.eval(B.callee,K),Q=[];for(let U=0;U<B.args.length;U++)Q.push(this.eval(B.args[U],K));let O=this.evalObjectSync(B.kwargs,K);return typeof A==="function"?A(...Q,O):void 0}evalTest(B,K){let{test:A,negated:Q}=B;if(A==="defined"||A==="undefined"){let $=!1;if(B.node.type==="Name")$=K.has(B.node.name);else $=this.eval(B.node,K)!==void 0;let Z=A==="defined"?$:!$;return Q?!Z:Z}let O=this.eval(B.node,K);if(B.args.length===0){let $;switch(A){case"even":{let Z=Number(O);$=Number.isInteger(Z)&&Z%2===0;break}case"odd":{let Z=Number(O);$=Number.isInteger(Z)&&Z%2!==0;break}case"number":$=typeof O==="number"&&!isNaN(O);break;case"integer":$=Number.isInteger(O);break;case"float":$=typeof O==="number"&&!Number.isInteger(O)&&!isNaN(O);break;case"none":case"None":$=O===null;break;case"boolean":$=typeof O==="boolean";break;case"string":$=typeof O==="string";break;case"mapping":$=O!==null&&typeof O==="object"&&!Array.isArray(O)&&!(O instanceof Date);break;case"iterable":$=O!=null&&(typeof O==="string"||Array.isArray(O)||typeof O[Symbol.iterator]==="function");break;case"sequence":$=Array.isArray(O)||typeof O==="string";break;case"callable":$=typeof O==="function";break;case"lower":$=typeof O==="string"&&O===O.toLowerCase()&&O!==O.toUpperCase();break;case"upper":$=typeof O==="string"&&O===O.toUpperCase()&&O!==O.toLowerCase();break;case"empty":if(O==null)$=!0;else if(typeof O==="string"||Array.isArray(O))$=O.length===0;else if(typeof O==="object"){$=!0;for(let Z in O){$=!1;break}}else $=!1;break;case"truthy":if(O==null)$=!1;else if(typeof O==="boolean")$=O;else if(typeof O==="number")$=O!==0;else if(typeof O==="string")$=O.length>0;else if(Array.isArray(O))$=O.length>0;else if(typeof O==="object"){$=!1;for(let Z in O){$=!0;break}}else $=!0;break;case"falsy":if(O==null)$=!0;else if(typeof O==="boolean")$=!O;else if(typeof O==="number")$=O===0;else if(typeof O==="string")$=O.length===0;else if(Array.isArray(O))$=O.length===0;else if(typeof O==="object"){$=!0;for(let Z in O){$=!1;break}}else $=!1;break;case"true":$=O===!0;break;case"false":$=O===!1;break;default:{let Z=this.tests[A];if(!Z)throw Error(`Unknown test: ${A}`);$=Z(O)}}return Q?!$:$}if(B.args.length===1){let $=this.eval(B.args[0],K),Z;switch(A){case"divisibleby":{let X=Number(O),M=Number($);Z=M!==0&&X%M===0;break}case"gt":case"greaterthan":Z=Number(O)>Number($);break;case"ge":Z=Number(O)>=Number($);break;case"lt":case"lessthan":Z=Number(O)<Number($);break;case"le":Z=Number(O)<=Number($);break;case"eq":case"equalto":case"sameas":Z=O===$;break;case"ne":Z=O!==$;break;case"in":if(Array.isArray($))Z=$.includes(O);else if(typeof $==="string")Z=$.includes(String(O));else if(typeof $==="object"&&$!==null)Z=O in $;else Z=!1;break;default:{let X=this.tests[A];if(!X)throw Error(`Unknown test: ${A}`);Z=X(O,$)}}return Q?!Z:Z}let U=[];for(let $=0;$<B.args.length;$++)U.push(this.eval(B.args[$],K));let Y=this.tests[A];if(!Y)throw Error(`Unknown test: ${A}`);let J=Y(O,...U);return Q?!J:J}evalObjectSync(B,K){let A={};for(let Q in B)A[Q]=this.eval(B[Q],K);return A}async collectBlocks(B,K){for(let A of B.body)if(A.type==="Extends"){let Q=this.eval(A.template,K);this.parentTemplate=await this.options.templateLoader(String(Q)),await this.collectBlocks(this.parentTemplate,K)}else if(A.type==="Block")this.blocks.set(A.name,A)}async renderTemplateAsync(B,K){let A=[];for(let Q of B.body){let O=await this.renderNodeAsync(Q,K);if(O!==null)A.push(O)}return A.join("")}async renderNodeAsync(B,K){switch(B.type){case"Text":return B.value;case"Output":return this.stringify(this.eval(B.expression,K));case"If":return this.renderIfAsync(B,K);case"For":return this.renderForAsync(B,K);case"Block":return this.renderBlockAsync(B,K);case"Extends":return null;case"Include":return this.renderInclude(B,K);case"Set":return K.set(B.target,this.eval(B.value,K)),"";case"With":return this.renderWithAsync(B,K);case"Load":return null;case"Url":return this.renderUrlSync(B,K);case"Static":return this.renderStaticSync(B,K);case"Now":return this.renderNowSync(B,K);case"Cycle":return this.renderCycleSync(B,K);case"Firstof":return this.renderFirstofSync(B,K);case"Ifchanged":return this.renderIfchangedSync(B,K);case"Regroup":return this.renderRegroupSync(B,K);case"Widthratio":return this.renderWidthratioSync(B,K);case"Lorem":return this.renderLoremSync(B,K);case"CsrfToken":return this.renderCsrfTokenSync();case"Debug":return this.renderDebugSync(K);case"Templatetag":return this.renderTemplatetagSync(B);default:return null}}async renderIfAsync(B,K){if(this.isTruthy(this.eval(B.test,K)))return this.renderNodesAsync(B.body,K);for(let A of B.elifs)if(this.isTruthy(this.eval(A.test,K)))return this.renderNodesAsync(A.body,K);return B.else_.length>0?this.renderNodesAsync(B.else_,K):""}async renderForAsync(B,K){let A=this.eval(B.iter,K),Q=this.toIterable(A),O=Q.length;if(O===0)return this.renderNodesAsync(B.else_,K);let U=Array(O),Y=Array.isArray(B.target);K.push(),K.pushForLoop(Q,0);for(let J=0;J<O;J++){let $=Q[J];if(J>0)K.updateForLoop(J,Q);if(Y){let Z=Array.isArray($)?$:[$,$],X=B.target;for(let M=0;M<X.length;M++)K.set(X[M],Z[M])}else K.set(B.target,$);U[J]=await this.renderNodesAsync(B.body,K)}return K.popForLoop(),K.pop(),U.join("")}async renderBlockAsync(B,K){let A=this.blocks.get(B.name)||B;K.push();let Q=await this.renderNodesAsync(B.body,K),O=new String(Q);O.__safe__=!0,K.set("block",{super:O});let U=await this.renderNodesAsync(A.body,K);return K.pop(),U}async renderInclude(B,K){try{let A=this.eval(B.template,K),Q=await this.options.templateLoader(String(A)),O;if(B.only)O=new w(B.context?this.evalObjectSync(B.context,K):{});else{let U=B.context?this.evalObjectSync(B.context,K):{};O=K.derived(U)}return this.renderTemplateAsync(Q,O)}catch(A){if(B.ignoreMissing)return"";throw A}}async renderWithAsync(B,K){K.push();for(let{target:Q,value:O}of B.assignments)K.set(Q,this.eval(O,K));let A=await this.renderNodesAsync(B.body,K);return K.pop(),A}async renderNodesAsync(B,K){let A=[];for(let Q of B){let O=await this.renderNodeAsync(Q,K);if(O!==null)A.push(O)}return A.join("")}async evaluate(B,K){return this.eval(B,K)}stringify(B){if(B==null)return"";if(typeof B==="string"){if(B.__safe__)return B;return this.options.autoescape?Bun.escapeHTML(B):B}if(typeof B==="boolean")return B?"True":"False";if(typeof B==="number")return String(B);let K=String(B);if(B.__safe__)return K;return this.options.autoescape?Bun.escapeHTML(K):K}isTruthy(B){if(typeof B==="boolean")return B;if(B==null)return!1;if(typeof B==="string")return B.length>0;if(typeof B==="number")return B!==0;if(Array.isArray(B))return B.length>0;if(typeof B==="object"){for(let K in B)return!0;return!1}return!0}deepEqual(B,K){if(B===K)return!0;if(B==null||K==null)return B===K;let A=typeof B;if(A!==typeof K)return!1;if(A!=="object")return!1;if(Array.isArray(B)){if(!Array.isArray(K)||B.length!==K.length)return!1;for(let O=0;O<B.length;O++)if(!this.deepEqual(B[O],K[O]))return!1;return!0}return JSON.stringify(B)===JSON.stringify(K)}isIn(B,K){if(Array.isArray(K))return K.includes(B);if(typeof K==="string")return K.includes(String(B));if(typeof K==="object"&&K!==null)return B in K;return!1}toIterable(B){if(Array.isArray(B))return B;if(B==null)return[];if(typeof B==="string")return B.split("");if(typeof B==="object"){if(typeof B[Symbol.iterator]==="function")return Array.from(B);let K=Object.keys(B),A=K.length,Q=Array(A);for(let O=0;O<A;O++){let U=K[O],Y=B[U],J=[U,Y];J.key=U,J.value=Y,Q[O]=J}return Q}return[B]}addFilter(B,K){this.filters[B]=K}addTest(B,K){this.tests[B]=K}addGlobal(B,K){this.options.globals[B]=K}setSource(B){this.source=B}}function T(B,K={}){return new XB(K).compile(B)}function v(B,K={}){let A=T(B,K),Q=Function("__ctx","__helpers",`
|
|
31
31
|
const { escape, isTruthy, toArray, applyFilter, applyTest } = __helpers;
|
|
32
32
|
${A}
|
|
33
33
|
return render(__ctx);
|
|
34
|
-
`);return(
|
|
35
|
-
`;return`function ${this.options.functionName}(__ctx) {${A} let __out = '';${A}`+K+` return __out;${A}}`}compileNodes(B){return B.map((K)=>this.compileNode(K)).join("")}compileNode(B){switch(B.type){case"Text":return this.compileText(B);case"Output":return this.compileOutput(B);case"If":return this.compileIf(B);case"For":return this.compileFor(B);case"Set":return this.compileSet(B);case"With":return this.compileWith(B);case"Comment":return"";case"Extends":case"Block":case"Include":throw Error(`AOT compilation does not support '${B.type}' - use Environment.render() for templates with inheritance`);case"Url":case"Static":throw Error(`AOT compilation does not support '${B.type}' tag - use Environment.render() with urlResolver/staticResolver`);default:throw Error(`Unknown node type in AOT compiler: ${B.type}`)}}compileText(B){return` __out += ${JSON.stringify(B.value)};${this.nl()}`}compileOutput(B){let K=this.compileExpr(B.expression);if(this.options.autoescape&&!this.isMarkedSafe(B.expression))return` __out += escape(${K});${this.nl()}`;return` __out += (${K}) ?? '';${this.nl()}`}compileIf(B){let K="",A=this.compileExpr(B.test);K+=` if (isTruthy(${A})) {${this.nl()}`,K+=this.compileNodes(B.body),K+=" }";for(let Q of B.elifs){let
|
|
36
|
-
`}}function g(B,K){return new MB(K).flatten(B)}function x(B){return new GB().check(B)}class MB{loader;maxDepth;blocks=new Map;depth=0;constructor(B){this.loader=B.loader,this.maxDepth=B.maxDepth??10}flatten(B){return this.blocks.clear(),this.depth=0,this.processTemplate(B)}processTemplate(B,K=!0){if(this.depth>this.maxDepth)throw Error(`Maximum template inheritance depth (${this.maxDepth}) exceeded`);this.collectBlocks(B.body,K);let A=this.findExtends(B.body);if(A){let Q=this.getStaticTemplateName(A.template)
|
|
34
|
+
`);return(O)=>Q(O,fA)}var fA={escape:(B)=>{if(B==null)return"";if(typeof B==="object"&&B.__safe)return String(B.value??"");if(B?.__safe__)return String(B);return Bun.escapeHTML(String(B))},isTruthy:(B)=>{if(B==null)return!1;if(typeof B==="boolean")return B;if(typeof B==="number")return B!==0;if(typeof B==="string")return B.length>0;if(Array.isArray(B))return B.length>0;if(typeof B==="object"){for(let K in B)return!0;return!1}return!0},toArray:(B)=>{if(B==null)return[];if(Array.isArray(B))return B;if(typeof B==="string")return B.split("");if(typeof B==="object"){if(typeof B[Symbol.iterator]==="function")return[...B];return Object.entries(B)}return[]},applyFilter:(B,K,...A)=>{let Q=h[B];if(!Q)throw Error(`Unknown filter: ${B}`);return Q(K,...A)},applyTest:(B,K,...A)=>{let Q=f[B];if(!Q)throw Error(`Unknown test: ${B}`);return Q(K,...A)}};class XB{options;indent=0;varCounter=0;loopStack=[];localVars=[];constructor(B={}){this.options={functionName:B.functionName??"render",inlineHelpers:B.inlineHelpers??!0,minify:B.minify??!1,autoescape:B.autoescape??!0}}pushScope(){this.localVars.push(new Set)}popScope(){this.localVars.pop()}addLocalVar(B){if(this.localVars.length>0)this.localVars[this.localVars.length-1].add(B)}isLocalVar(B){for(let K=this.localVars.length-1;K>=0;K--)if(this.localVars[K].has(B))return!0;return!1}compile(B){let K=this.compileNodes(B.body),A=this.options.minify?"":`
|
|
35
|
+
`;return`function ${this.options.functionName}(__ctx) {${A} let __out = '';${A}`+K+` return __out;${A}}`}compileNodes(B){return B.map((K)=>this.compileNode(K)).join("")}compileNode(B){switch(B.type){case"Text":return this.compileText(B);case"Output":return this.compileOutput(B);case"If":return this.compileIf(B);case"For":return this.compileFor(B);case"Set":return this.compileSet(B);case"With":return this.compileWith(B);case"Comment":return"";case"Extends":case"Block":case"Include":throw Error(`AOT compilation does not support '${B.type}' - use Environment.render() for templates with inheritance`);case"Url":case"Static":throw Error(`AOT compilation does not support '${B.type}' tag - use Environment.render() with urlResolver/staticResolver`);default:throw Error(`Unknown node type in AOT compiler: ${B.type}`)}}compileText(B){return` __out += ${JSON.stringify(B.value)};${this.nl()}`}compileOutput(B){let K=this.compileExpr(B.expression);if(this.options.autoescape&&!this.isMarkedSafe(B.expression))return` __out += escape(${K});${this.nl()}`;return` __out += (${K}) ?? '';${this.nl()}`}compileIf(B){let K="",A=this.compileExpr(B.test);K+=` if (isTruthy(${A})) {${this.nl()}`,K+=this.compileNodes(B.body),K+=" }";for(let Q of B.elifs){let O=this.compileExpr(Q.test);K+=` else if (isTruthy(${O})) {${this.nl()}`,K+=this.compileNodes(Q.body),K+=" }"}if(B.else_.length>0)K+=` else {${this.nl()}`,K+=this.compileNodes(B.else_),K+=" }";return K+=this.nl(),K}compileFor(B){let K=this.genVar("iter"),A=this.genVar("i"),Q=this.genVar("len"),O=this.genVar("loop"),U=Array.isArray(B.target)?B.target[0]:B.target,Y=Array.isArray(B.target)&&B.target[1]?B.target[1]:null,J=this.loopStack.length>0?this.loopStack[this.loopStack.length-1]:null,$=this.compileExpr(B.iter),Z="";if(Z+=` const ${K} = toArray(${$});${this.nl()}`,Z+=` const ${Q} = ${K}.length;${this.nl()}`,B.else_.length>0)Z+=` if (${Q} === 0) {${this.nl()}`,Z+=this.compileNodes(B.else_),Z+=` } else {${this.nl()}`;if(Z+=` for (let ${A} = 0; ${A} < ${Q}; ${A}++) {${this.nl()}`,Y)Z+=` const ${U} = ${K}[${A}][0];${this.nl()}`,Z+=` const ${Y} = ${K}[${A}][1];${this.nl()}`;else Z+=` const ${U} = ${K}[${A}];${this.nl()}`;if(Z+=` const ${O} = {${this.nl()}`,Z+=` counter: ${A} + 1,${this.nl()}`,Z+=` counter0: ${A},${this.nl()}`,Z+=` revcounter: ${Q} - ${A},${this.nl()}`,Z+=` revcounter0: ${Q} - ${A} - 1,${this.nl()}`,Z+=` first: ${A} === 0,${this.nl()}`,Z+=` last: ${A} === ${Q} - 1,${this.nl()}`,Z+=` length: ${Q},${this.nl()}`,Z+=` index: ${A} + 1,${this.nl()}`,Z+=` index0: ${A},${this.nl()}`,J)Z+=` parentloop: ${J},${this.nl()}`,Z+=` parent: ${J}${this.nl()}`;else Z+=` parentloop: null,${this.nl()}`,Z+=` parent: null${this.nl()}`;Z+=` };${this.nl()}`,Z+=` const forloop = ${O};${this.nl()}`,Z+=` const loop = ${O};${this.nl()}`,this.loopStack.push(O);let X=this.compileNodes(B.body);if(Z+=X.replace(new RegExp(`__ctx\\.${U}`,"g"),U),this.loopStack.pop(),Z+=` }${this.nl()}`,B.else_.length>0)Z+=` }${this.nl()}`;return Z}compileSet(B){let K=this.compileExpr(B.value);return` const ${B.target} = ${K};${this.nl()}`}compileWith(B){let K=` {${this.nl()}`;this.pushScope();for(let{target:A,value:Q}of B.assignments){let O=this.compileExpr(Q);K+=` const ${A} = ${O};${this.nl()}`,this.addLocalVar(A)}return K+=this.compileNodes(B.body),K+=` }${this.nl()}`,this.popScope(),K}compileExpr(B){switch(B.type){case"Name":return this.compileName(B);case"Literal":return this.compileLiteral(B);case"Array":return this.compileArray(B);case"Object":return this.compileObject(B);case"BinaryOp":return this.compileBinaryOp(B);case"UnaryOp":return this.compileUnaryOp(B);case"Compare":return this.compileCompare(B);case"GetAttr":return this.compileGetAttr(B);case"GetItem":return this.compileGetItem(B);case"FilterExpr":return this.compileFilter(B);case"TestExpr":return this.compileTest(B);case"Conditional":return this.compileConditional(B);default:return"undefined"}}compileName(B){if(B.name==="true"||B.name==="True")return"true";if(B.name==="false"||B.name==="False")return"false";if(B.name==="none"||B.name==="None"||B.name==="null")return"null";if(B.name==="forloop"||B.name==="loop")return B.name;if(this.isLocalVar(B.name))return B.name;return`__ctx.${B.name}`}compileLiteral(B){if(typeof B.value==="string")return JSON.stringify(B.value);return String(B.value)}compileArray(B){return`[${B.elements.map((A)=>this.compileExpr(A)).join(", ")}]`}compileObject(B){return`{${B.pairs.map(({key:A,value:Q})=>{let O=this.compileExpr(A),U=this.compileExpr(Q);return`[${O}]: ${U}`}).join(", ")}}`}compileBinaryOp(B){let K=this.compileExpr(B.left),A=this.compileExpr(B.right);switch(B.operator){case"and":return`(${K} && ${A})`;case"or":return`(${K} || ${A})`;case"~":return`(String(${K}) + String(${A}))`;case"in":return`(Array.isArray(${A}) ? ${A}.includes(${K}) : String(${A}).includes(String(${K})))`;case"not in":return`!(Array.isArray(${A}) ? ${A}.includes(${K}) : String(${A}).includes(String(${K})))`;default:return`(${K} ${B.operator} ${A})`}}compileUnaryOp(B){let K=this.compileExpr(B.operand);switch(B.operator){case"not":return`!isTruthy(${K})`;case"-":return`-(${K})`;case"+":return`+(${K})`;default:return K}}compileCompare(B){let K=this.compileExpr(B.left);for(let{operator:A,right:Q}of B.ops){let O=this.compileExpr(Q);switch(A){case"==":case"===":K=`(${K} === ${O})`;break;case"!=":case"!==":K=`(${K} !== ${O})`;break;default:K=`(${K} ${A} ${O})`}}return K}compileGetAttr(B){return`${this.compileExpr(B.object)}?.${B.attribute}`}compileGetItem(B){let K=this.compileExpr(B.object),A=this.compileExpr(B.index);return`${K}?.[${A}]`}compileFilter(B){let K=this.compileExpr(B.node),A=B.args.map((Q)=>this.compileExpr(Q));switch(B.filter){case"upper":return`String(${K}).toUpperCase()`;case"lower":return`String(${K}).toLowerCase()`;case"title":return`String(${K}).replace(/\\b\\w/g, c => c.toUpperCase())`;case"trim":return`String(${K}).trim()`;case"length":return`(${K}?.length ?? Object.keys(${K} ?? {}).length)`;case"first":return`(${K})?.[0]`;case"last":return`(${K})?.[(${K})?.length - 1]`;case"default":return`((${K}) ?? ${A[0]??'""'})`;case"safe":return`{ __safe: true, value: String(${K}) }`;case"escape":case"e":return`escape(${K})`;case"join":return`(${K} ?? []).join(${A[0]??'""'})`;case"abs":return`Math.abs(${K})`;case"round":return A.length?`Number(${K}).toFixed(${A[0]})`:`Math.round(${K})`;case"int":return`parseInt(${K}, 10)`;case"float":return`parseFloat(${K})`;case"floatformat":return`Number(${K}).toFixed(${A[0]??1})`;case"filesizeformat":return`applyFilter('filesizeformat', ${K})`;default:let Q=A.length?", "+A.join(", "):"";return`applyFilter('${B.filter}', ${K}${Q})`}}compileTest(B){let K=this.compileExpr(B.node),A=B.args.map((O)=>this.compileExpr(O)),Q=B.negated?"!":"";switch(B.test){case"defined":return`${Q}(${K} !== undefined)`;case"undefined":return`${Q}(${K} === undefined)`;case"none":return`${Q}(${K} === null)`;case"even":return`${Q}(${K} % 2 === 0)`;case"odd":return`${Q}(${K} % 2 !== 0)`;case"divisibleby":return`${Q}(${K} % ${A[0]} === 0)`;case"empty":return`${Q}((${K} == null) || (${K}.length === 0) || (Object.keys(${K}).length === 0))`;case"iterable":return`${Q}(Array.isArray(${K}) || typeof ${K} === 'string')`;case"number":return`${Q}(typeof ${K} === 'number' && !isNaN(${K}))`;case"string":return`${Q}(typeof ${K} === 'string')`;default:let O=A.length?", "+A.join(", "):"";return`${Q}applyTest('${B.test}', ${K}${O})`}}compileConditional(B){let K=this.compileExpr(B.test),A=this.compileExpr(B.trueExpr),Q=this.compileExpr(B.falseExpr);return`(isTruthy(${K}) ? ${A} : ${Q})`}isMarkedSafe(B){if(B.type==="FilterExpr")return B.filter==="safe";return!1}genVar(B){return`__${B}${this.varCounter++}`}nl(){return this.options.minify?"":`
|
|
36
|
+
`}}function g(B,K){return new MB(K).flatten(B)}function x(B){return new GB().check(B)}class MB{loader;maxDepth;blocks=new Map;depth=0;constructor(B){this.loader=B.loader,this.maxDepth=B.maxDepth??10}flatten(B){return this.blocks.clear(),this.depth=0,this.processTemplate(B)}processTemplate(B,K=!0){if(this.depth>this.maxDepth)throw Error(`Maximum template inheritance depth (${this.maxDepth}) exceeded`);this.collectBlocks(B.body,K);let A=this.findExtends(B.body);if(A){let Q=this.getStaticTemplateName(A.template),O=this.loader.load(Q),U=this.loader.parse(O);this.depth++;let Y=this.processTemplate(U,!1);return this.depth--,{type:"Template",body:this.replaceBlocks(Y.body),line:B.line,column:B.column}}return{type:"Template",body:this.processNodes(B.body),line:B.line,column:B.column}}collectBlocks(B,K=!0){for(let A of B){if(A.type==="Block"){let Q=A;if(K||!this.blocks.has(Q.name))this.blocks.set(Q.name,Q)}this.collectBlocksFromNode(A,K)}}collectBlocksFromNode(B,K=!0){switch(B.type){case"If":{let A=B;this.collectBlocks(A.body,K);for(let Q of A.elifs)this.collectBlocks(Q.body,K);this.collectBlocks(A.else_,K);break}case"For":{let A=B;this.collectBlocks(A.body,K),this.collectBlocks(A.else_,K);break}case"With":{let A=B;this.collectBlocks(A.body,K);break}case"Block":{let A=B;this.collectBlocks(A.body,K);break}}}findExtends(B){for(let K of B)if(K.type==="Extends")return K;return null}processNodes(B){let K=[];for(let A of B){if(A.type==="Extends")continue;if(A.type==="Include"){let O=A,U=this.inlineInclude(O);K.push(...U);continue}if(A.type==="Block"){let O=A,U=this.blocks.get(O.name);if(U&&U!==O)K.push(...this.processNodes(U.body));else K.push(...this.processNodes(O.body));continue}let Q=this.processNode(A);if(Q)K.push(Q)}return K}processNode(B){switch(B.type){case"If":{let K=B;return{...K,body:this.processNodes(K.body),elifs:K.elifs.map((A)=>({test:A.test,body:this.processNodes(A.body)})),else_:this.processNodes(K.else_)}}case"For":{let K=B;return{...K,body:this.processNodes(K.body),else_:this.processNodes(K.else_)}}case"With":{let K=B;return{...K,body:this.processNodes(K.body)}}default:return B}}replaceBlocks(B){return this.processNodes(B)}inlineInclude(B){let K=this.getStaticTemplateName(B.template);try{let A=this.loader.load(K),Q=this.loader.parse(A);this.depth++;let O=this.processTemplate(Q);if(this.depth--,B.context&&Object.keys(B.context).length>0)return[{type:"With",assignments:Object.entries(B.context).map(([Y,J])=>({target:Y,value:J})),body:O.body,line:B.line,column:B.column}];return O.body}catch(A){if(B.ignoreMissing)return[];throw A}}getStaticTemplateName(B){if(B.type==="Literal"){let K=B;if(typeof K.value==="string")return K.value}throw Error(`AOT compilation requires static template names. Found dynamic expression at line ${B.line}. Use Environment.render() for dynamic template names.`)}}class GB{check(B){return this.checkNodes(B.body)}checkNodes(B){for(let K of B){let A=this.checkNode(K);if(!A.canFlatten)return A}return{canFlatten:!0}}checkNode(B){switch(B.type){case"Extends":{let K=B;if(!this.isStaticName(K.template))return{canFlatten:!1,reason:`Dynamic extends at line ${B.line} - use static string literal`};break}case"Include":{let K=B;if(!this.isStaticName(K.template))return{canFlatten:!1,reason:`Dynamic include at line ${B.line} - use static string literal`};break}case"If":{let K=B,A=this.checkNodes(K.body);if(!A.canFlatten)return A;for(let Q of K.elifs)if(A=this.checkNodes(Q.body),!A.canFlatten)return A;if(A=this.checkNodes(K.else_),!A.canFlatten)return A;break}case"For":{let K=B,A=this.checkNodes(K.body);if(!A.canFlatten)return A;if(A=this.checkNodes(K.else_),!A.canFlatten)return A;break}case"With":{let K=B,A=this.checkNodes(K.body);if(!A.canFlatten)return A;break}case"Block":{let K=B,A=this.checkNodes(K.body);if(!A.canFlatten)return A;break}}return{canFlatten:!0}}isStaticName(B){return B.type==="Literal"&&typeof B.value==="string"}}class i{data;constructor(){this.data={startTime:performance.now(),templateChain:[],mode:"runtime",isAsync:!1,contextKeys:[],contextSnapshot:{},filtersUsed:new Map,testsUsed:new Map,cacheHits:0,cacheMisses:0,queries:[],queryStats:{count:0,totalDuration:0,slowCount:0,n1Count:0,queryCounts:new Map},warnings:[]}}startLexer(){this.data._lexerStart=performance.now()}endLexer(){if(this.data._lexerStart)this.data.lexerTime=performance.now()-this.data._lexerStart}startParser(){this.data._parserStart=performance.now()}endParser(){if(this.data._parserStart)this.data.parserTime=performance.now()-this.data._parserStart}startRender(){this.data._renderStart=performance.now()}endRender(){if(this.data._renderStart)this.data.renderTime=performance.now()-this.data._renderStart;this.data.endTime=performance.now(),this.data.totalTime=this.data.endTime-this.data.startTime}addTemplate(B,K,A){if(this.data.templateChain.push({name:B,type:K,parent:A}),K==="root")this.data.rootTemplate=B}setMode(B){this.data.mode=B}setAsync(B){this.data.isAsync=B}captureContext(B){this.data.contextKeys=Object.keys(B);for(let[K,A]of Object.entries(B))this.data.contextSnapshot[K]=this.captureValue(A)}captureValue(B,K=0){let A=this.getType(B),Q=this.getPreview(B),O=this.isExpandable(B),U={type:A,preview:Q,value:B,expandable:O};if(O&&K<3){if(U.children={},Array.isArray(B))B.forEach((Y,J)=>{U.children[String(J)]=this.captureValue(Y,K+1)});else if(typeof B==="object"&&B!==null)for(let[Y,J]of Object.entries(B))U.children[Y]=this.captureValue(J,K+1)}return U}isExpandable(B){if(B===null||B===void 0)return!1;if(Array.isArray(B))return B.length>0;if(typeof B==="object")return Object.keys(B).length>0;return!1}getType(B){if(B===null)return"null";if(B===void 0)return"undefined";if(Array.isArray(B))return`Array(${B.length})`;if(B instanceof Date)return"Date";if(typeof B==="object")return"Object";return typeof B}getPreview(B,K=50){if(B===null)return"null";if(B===void 0)return"undefined";if(typeof B==="string")return B.length>K?`"${B.slice(0,K)}..."`:`"${B}"`;if(typeof B==="number"||typeof B==="boolean")return String(B);if(Array.isArray(B)){if(B.length===0)return"[]";if(B.length<=3)return`[${B.map((Q)=>this.getPreview(Q,15)).join(", ")}]`;return`[${this.getPreview(B[0],15)}, ... +${B.length-1}]`}if(B instanceof Date)return B.toISOString();if(typeof B==="object"){let A=Object.keys(B);if(A.length===0)return"{}";if(A.length<=2)return`{ ${A.join(", ")} }`;return`{ ${A.slice(0,2).join(", ")}, ... +${A.length-2} }`}if(typeof B==="function")return"function()";return String(B)}recordFilter(B){this.data.filtersUsed.set(B,(this.data.filtersUsed.get(B)||0)+1)}recordTest(B){this.data.testsUsed.set(B,(this.data.testsUsed.get(B)||0)+1)}recordCacheHit(){this.data.cacheHits++}recordCacheMiss(){this.data.cacheMisses++}addWarning(B){this.data.warnings.push(B)}recordQuery(B){let K=this.normalizeQuery(B.sql),A=this.data.queryStats.queryCounts.get(K)||0;this.data.queryStats.queryCounts.set(K,A+1);let Q=A>=2,O={...B,timestamp:performance.now(),isN1:Q};if(this.data.queries.push(O),this.data.queryStats.count++,this.data.queryStats.totalDuration+=B.duration,B.duration>100)this.data.queryStats.slowCount++;if(Q&&A===2)this.data.queryStats.n1Count++,this.addWarning(`N+1 query detected: ${K.slice(0,50)}...`)}normalizeQuery(B){return B.replace(/\s+/g," ").replace(/= \?/g,"= ?").replace(/= \$\d+/g,"= ?").replace(/= '\w+'/g,"= '?'").replace(/= \d+/g,"= ?").replace(/IN \([^)]+\)/gi,"IN (?)").trim()}getQueryStats(){return this.data.queryStats}getData(){return this.data}getSummary(){return{totalTime:this.data.totalTime||0,templateCount:this.data.templateChain.length,filterCount:this.data.filtersUsed.size,mode:this.data.mode}}}var k=null;function D(){return k=new i,k}function L(){if(k){let B=k.getData();return k=null,B}return null}var kA={position:"bottom",height:300,width:400,open:!1,dark:!0};function _(B,K={}){let A={...kA,...K},Q=`binja-dbg-${Date.now()}`,O=A.dark?yA:TA;return`
|
|
37
37
|
<!-- Binja Debug Panel -->
|
|
38
38
|
<div id="${Q}" class="binja-devtools" data-position="${A.position}" data-open="${A.open}">
|
|
39
|
-
<style>${gA(Q
|
|
40
|
-
${xA(Q,B
|
|
39
|
+
<style>${gA(Q,O,A)}</style>
|
|
40
|
+
${xA(Q,B,O,A)}
|
|
41
41
|
<script>${rA(Q,B,A)}</script>
|
|
42
42
|
</div>
|
|
43
43
|
<!-- /Binja Debug Panel -->
|
|
@@ -171,22 +171,22 @@ ${xA(Q,B,$,A)}
|
|
|
171
171
|
/* Empty State */
|
|
172
172
|
#${B} .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--text-muted); font-size: 12px; }
|
|
173
173
|
#${B} .empty-state svg { width: 32px; height: 32px; margin-bottom: 8px; opacity: 0.5; }
|
|
174
|
-
`}var
|
|
174
|
+
`}var R={logo:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>',close:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>',minimize:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14"/></svg>',dock:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 15h18"/></svg>',dockRight:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M15 3v18"/></svg>',popup:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 3v6h6"/></svg>',arrow:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18l6-6-6-6"/></svg>',perf:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>',context:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/></svg>',template:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><path d="M14 2v6h6"/></svg>',filter:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"/></svg>',database:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>',cache:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a10 10 0 1010 10H12V2z"/><path d="M12 2a10 10 0 00-8.66 15"/></svg>',warning:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>'};function xA(B,K,A,Q){let O=(K.totalTime||0).toFixed(1),U=K.queries?.length||0,Y=K.warnings.length>0||K.queryStats?.n1Count>0,$=[{id:"perf",icon:R.perf,label:"Performance",count:`${O}ms`},{id:"context",icon:R.context,label:"Context",count:Object.keys(K.contextSnapshot).length||null},{id:"templates",icon:R.template,label:"Templates",count:K.templateChain.length||null},{id:"filters",icon:R.filter,label:"Filters",count:K.filtersUsed.size||null},{id:"queries",icon:R.database,label:"Queries",count:U||null,warn:K.queryStats?.n1Count>0},{id:"cache",icon:R.cache,label:"Cache",count:K.cacheHits+K.cacheMisses||null},{id:"warnings",icon:R.warning,label:"Warnings",count:K.warnings.length||null,warn:Y}].map((Z,X)=>{let M=Z.count!==null?`<span class="count${Z.warn?" warn":""}">${Z.count}</span>`:"";return`<button class="devtools-tab${X===0?" active":""}" data-tab="${Z.id}">${Z.icon}${Z.label}${M}</button>`}).join("");return`
|
|
175
175
|
<button class="devtools-toggle" onclick="document.getElementById('${B}').dataset.open='true'">
|
|
176
|
-
${
|
|
176
|
+
${R.logo}
|
|
177
177
|
<span>Binja</span>
|
|
178
|
-
<span class="badge">${
|
|
178
|
+
<span class="badge">${O}ms</span>
|
|
179
179
|
</button>
|
|
180
180
|
|
|
181
181
|
<div class="devtools-panel">
|
|
182
182
|
<div class="devtools-resize"></div>
|
|
183
183
|
<div class="devtools-toolbar">
|
|
184
|
-
<div class="devtools-tabs">${
|
|
184
|
+
<div class="devtools-tabs">${$}</div>
|
|
185
185
|
<div class="devtools-actions">
|
|
186
|
-
<button class="devtools-btn" title="Dock to bottom" data-dock="bottom">${
|
|
187
|
-
<button class="devtools-btn" title="Dock to right" data-dock="right">${
|
|
188
|
-
<button class="devtools-btn" title="Popup" data-dock="popup">${
|
|
189
|
-
<button class="devtools-btn" title="Close" onclick="document.getElementById('${B}').dataset.open='false'">${
|
|
186
|
+
<button class="devtools-btn" title="Dock to bottom" data-dock="bottom">${R.dock}</button>
|
|
187
|
+
<button class="devtools-btn" title="Dock to right" data-dock="right">${R.dockRight}</button>
|
|
188
|
+
<button class="devtools-btn" title="Popup" data-dock="popup">${R.popup}</button>
|
|
189
|
+
<button class="devtools-btn" title="Close" onclick="document.getElementById('${B}').dataset.open='false'">${R.close}</button>
|
|
190
190
|
</div>
|
|
191
191
|
</div>
|
|
192
192
|
<div class="devtools-content">
|
|
@@ -198,7 +198,7 @@ ${xA(Q,B,$,A)}
|
|
|
198
198
|
${sA(K)}
|
|
199
199
|
${uA(K)}
|
|
200
200
|
</div>
|
|
201
|
-
</div>`}function mA(B){let K=B.totalTime||0.01,A=B.lexerTime||0,Q=B.parserTime||0
|
|
201
|
+
</div>`}function mA(B){let K=B.totalTime||0.01,A=B.lexerTime||0,Q=B.parserTime||0,O=B.renderTime||0,U=B.mode==="aot"?"AOT":"Runtime";return`
|
|
202
202
|
<div class="devtools-pane active" data-pane="perf">
|
|
203
203
|
<div class="perf-grid">
|
|
204
204
|
<div class="perf-card">
|
|
@@ -206,7 +206,7 @@ ${xA(Q,B,$,A)}
|
|
|
206
206
|
<div class="perf-card-label">Total Time</div>
|
|
207
207
|
</div>
|
|
208
208
|
<div class="perf-card">
|
|
209
|
-
<div class="perf-card-value" style="color:var(--accent)">${
|
|
209
|
+
<div class="perf-card-value" style="color:var(--accent)">${U}</div>
|
|
210
210
|
<div class="perf-card-label">Mode</div>
|
|
211
211
|
</div>
|
|
212
212
|
<div class="perf-card">
|
|
@@ -231,29 +231,29 @@ ${xA(Q,B,$,A)}
|
|
|
231
231
|
</div>
|
|
232
232
|
<div class="perf-row">
|
|
233
233
|
<span class="perf-row-label">Render</span>
|
|
234
|
-
<div class="perf-row-bar"><div class="perf-row-fill render" style="width:${
|
|
235
|
-
<span class="perf-row-value">${
|
|
234
|
+
<div class="perf-row-bar"><div class="perf-row-fill render" style="width:${O/K*100}%"></div></div>
|
|
235
|
+
<span class="perf-row-value">${O.toFixed(2)}ms</span>
|
|
236
236
|
</div>
|
|
237
237
|
</div>
|
|
238
|
-
</div>`}function pA(B){let K=Object.keys(B.contextSnapshot);if(K.length===0)return`<div class="devtools-pane" data-pane="context"><div class="empty-state">${
|
|
238
|
+
</div>`}function pA(B){let K=Object.keys(B.contextSnapshot);if(K.length===0)return`<div class="devtools-pane" data-pane="context"><div class="empty-state">${R.context}<span>No context variables</span></div></div>`;return`<div class="devtools-pane" data-pane="context"><div class="tree">${K.map((Q)=>FB(Q,B.contextSnapshot[Q])).join("")}</div></div>`}function FB(B,K){let A=K.expandable&&K.children&&Object.keys(K.children).length>0,Q=A?`<span class="tree-arrow">${R.arrow}</span>`:'<span class="tree-arrow" style="visibility:hidden">${icons.arrow}</span>',O=A?"expandable":"",U=cA(K.type),Y="";if(A&&K.children)Y=`<div class="tree-children">${Object.entries(K.children).map(([J,$])=>FB(J,$)).join("")}</div>`;return`
|
|
239
239
|
<div class="tree-item">
|
|
240
|
-
<div class="tree-row ${
|
|
240
|
+
<div class="tree-row ${O}">
|
|
241
241
|
${Q}
|
|
242
242
|
<span class="tree-key">${S(B)}</span>
|
|
243
243
|
<span class="tree-colon">:</span>
|
|
244
|
-
<span class="tree-value ${
|
|
244
|
+
<span class="tree-value ${U}">${S(K.preview)}</span>
|
|
245
245
|
<span class="tree-type">${K.type}</span>
|
|
246
246
|
</div>
|
|
247
|
-
${
|
|
248
|
-
</div>`}function cA(B){if(B==="string")return"string";if(B==="number"||B==="integer"||B==="float")return"number";if(B==="null"||B==="undefined")return"null";return""}function vA(B){if(B.templateChain.length===0)return`<div class="devtools-pane" data-pane="templates"><div class="empty-state">${
|
|
247
|
+
${Y}
|
|
248
|
+
</div>`}function cA(B){if(B==="string")return"string";if(B==="number"||B==="integer"||B==="float")return"number";if(B==="null"||B==="undefined")return"null";return""}function vA(B){if(B.templateChain.length===0)return`<div class="devtools-pane" data-pane="templates"><div class="empty-state">${R.template}<span>No templates loaded</span></div></div>`;return`<div class="devtools-pane" data-pane="templates"><div class="template-list">${B.templateChain.map((A)=>`
|
|
249
249
|
<div class="template-item">
|
|
250
|
-
<span class="template-icon">${
|
|
250
|
+
<span class="template-icon">${R.template}</span>
|
|
251
251
|
<span class="template-name">${S(A.name)}</span>
|
|
252
252
|
<span class="template-badge ${A.type}">${A.type}</span>
|
|
253
253
|
</div>
|
|
254
|
-
`).join("")}</div></div>`}function iA(B){let K=Array.from(B.filtersUsed.entries());if(K.length===0)return`<div class="devtools-pane" data-pane="filters"><div class="empty-state">${
|
|
255
|
-
<span class="filter-chip">${S(Q)}<span class="filter-count">\xD7${
|
|
256
|
-
`).join("")}</div></div>`}function dA(B){if(!B.queries||B.queries.length===0)return`<div class="devtools-pane" data-pane="queries"><div class="empty-state">${
|
|
254
|
+
`).join("")}</div></div>`}function iA(B){let K=Array.from(B.filtersUsed.entries());if(K.length===0)return`<div class="devtools-pane" data-pane="filters"><div class="empty-state">${R.filter}<span>No filters used</span></div></div>`;return`<div class="devtools-pane" data-pane="filters"><div class="filter-grid">${K.map(([Q,O])=>`
|
|
255
|
+
<span class="filter-chip">${S(Q)}<span class="filter-count">\xD7${O}</span></span>
|
|
256
|
+
`).join("")}</div></div>`}function dA(B){if(!B.queries||B.queries.length===0)return`<div class="devtools-pane" data-pane="queries"><div class="empty-state">${R.database}<span>No queries recorded</span></div></div>`;let K=B.queryStats,A=`
|
|
257
257
|
<div class="queries-stats">
|
|
258
258
|
<div class="queries-stat">
|
|
259
259
|
<div class="queries-stat-value">${K.count}</div>
|
|
@@ -271,16 +271,16 @@ ${xA(Q,B,$,A)}
|
|
|
271
271
|
<div class="queries-stat-value ${K.n1Count>0?"error":""}">${K.n1Count}</div>
|
|
272
272
|
<div class="queries-stat-label">N+1</div>
|
|
273
273
|
</div>
|
|
274
|
-
</div>`,Q=B.queries.map((
|
|
275
|
-
<div class="${
|
|
274
|
+
</div>`,Q=B.queries.map((O)=>{let U=O.duration>100,Y=["query-item",O.isN1?"n1":"",U?"slow":""].filter(Boolean).join(" "),J=O.isN1?'<span class="query-badge n1">N+1</span>':"",$=O.source?`<span class="query-source">${S(O.source)}</span>`:"",Z=O.rows!==void 0?`<span class="query-rows">${O.rows} rows</span>`:"";return`
|
|
275
|
+
<div class="${Y}">
|
|
276
276
|
<div class="query-header">
|
|
277
|
-
<span class="query-sql" title="${S(
|
|
277
|
+
<span class="query-sql" title="${S(O.sql)}">${S(O.sql)}</span>
|
|
278
278
|
<div class="query-meta">
|
|
279
|
-
${
|
|
280
|
-
<span class="query-time ${
|
|
279
|
+
${J}${$}${Z}
|
|
280
|
+
<span class="query-time ${U?"slow":""}">${O.duration.toFixed(1)}ms</span>
|
|
281
281
|
</div>
|
|
282
282
|
</div>
|
|
283
|
-
</div>`}).join("");return`<div class="devtools-pane" data-pane="queries">${A}<div class="query-list">${Q}</div></div>`}function sA(B){let K=B.cacheHits+B.cacheMisses;if(K===0)return`<div class="devtools-pane" data-pane="cache"><div class="empty-state">${
|
|
283
|
+
</div>`}).join("");return`<div class="devtools-pane" data-pane="queries">${A}<div class="query-list">${Q}</div></div>`}function sA(B){let K=B.cacheHits+B.cacheMisses;if(K===0)return`<div class="devtools-pane" data-pane="cache"><div class="empty-state">${R.cache}<span>No cache activity</span></div></div>`;let A=(B.cacheHits/K*100).toFixed(0);return`
|
|
284
284
|
<div class="devtools-pane" data-pane="cache">
|
|
285
285
|
<div class="cache-stats">
|
|
286
286
|
<div class="cache-stat">
|
|
@@ -296,9 +296,9 @@ ${xA(Q,B,$,A)}
|
|
|
296
296
|
<div class="cache-label">Hit Rate</div>
|
|
297
297
|
</div>
|
|
298
298
|
</div>
|
|
299
|
-
</div>`}function uA(B){if(B.warnings.length===0)return`<div class="devtools-pane" data-pane="warnings"><div class="empty-state">${
|
|
299
|
+
</div>`}function uA(B){if(B.warnings.length===0)return`<div class="devtools-pane" data-pane="warnings"><div class="empty-state">${R.warning}<span>No warnings</span></div></div>`;return`<div class="devtools-pane" data-pane="warnings"><div class="warning-list">${B.warnings.map((A)=>`
|
|
300
300
|
<div class="warning-item">
|
|
301
|
-
<span class="warning-icon">${
|
|
301
|
+
<span class="warning-icon">${R.warning}</span>
|
|
302
302
|
<span class="warning-text">${S(A)}</span>
|
|
303
303
|
</div>
|
|
304
304
|
`).join("")}</div></div>`}function rA(B,K,A){return`
|
|
@@ -368,5 +368,5 @@ ${xA(Q,B,$,A)}
|
|
|
368
368
|
document.body.style.cursor = '';
|
|
369
369
|
});
|
|
370
370
|
}
|
|
371
|
-
})();`}function S(B){return String(B).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}async function IB(B,K,A={},Q={}){let
|
|
372
|
-
Use Environment.render() for dynamic template names.`);let
|
|
371
|
+
})();`}function S(B){return String(B).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}async function IB(B,K,A={},Q={}){let O=D();O.captureContext(A),O.addTemplate(K,"root"),O.setMode("runtime"),O.startRender();let U=await B.render(K,A);O.endRender();let Y=L();if(Q.htmlOnly!==!1){if(!(U.includes("<html")||U.includes("<body")||U.includes("<!DOCTYPE")))return U}let J=_(Y,Q.panel);if(U.includes("</body>"))return U.replace("</body>",`${J}</body>`);return U+J}async function EB(B,K,A={},Q={}){let O=D();O.captureContext(A),O.setMode("runtime"),O.startRender();let U=await B.renderString(K,A);O.endRender();let Y=L();if(Q.htmlOnly!==!1){if(!(U.includes("<html")||U.includes("<body")))return U}let J=_(Y,Q.panel);if(U.includes("</body>"))return U.replace("</body>",`${J}</body>`);return U+J}function lA(B,K={}){return{async render(A,Q={}){return IB(B,A,Q,K)},async renderString(A,Q={}){return EB(B,A,Q,K)}}}function oA(B,K={}){return{hono(){return async(A,Q)=>{if(await Q(),!(A.res.headers.get("content-type")||"").includes("text/html"))return;let U=await A.res.text(),Y=D();Y.captureContext({}),Y.setMode("runtime"),Y.endRender();let J=L(),$=_(J,K.panel),Z=U.includes("</body>")?U.replace("</body>",`${$}</body>`):U+$;A.res=new Response(Z,{status:A.res.status,headers:A.res.headers})}},express(){return(A,Q,O)=>{let U=Q.send.bind(Q);Q.send=(Y)=>{if(!(Q.get("Content-Type")||"").includes("text/html")||typeof Y!=="string")return U(Y);let $=D();$.captureContext({}),$.setMode("runtime"),$.endRender();let Z=L(),X=_(Z,K.panel),M=Y.includes("</body>")?Y.replace("</body>",`${X}</body>`):Y+X;return U(M)},O()}}}}import*as V from"path";var RB=/<[^>]+>|:[a-zA-Z_]+|\(\?P<[^>]+>\[[^\]]+\]\)/g;class d{options;runtime;templateCache=new Map;routes=new Map;cacheHits=0;cacheMisses=0;constructor(B={}){this.options={templates:B.templates??"./templates",autoescape:B.autoescape??!0,filters:B.filters??{},globals:B.globals??{},urlResolver:B.urlResolver??this.defaultUrlResolver.bind(this),staticResolver:B.staticResolver??this.defaultStaticResolver.bind(this),cache:B.cache??!0,cacheMaxSize:B.cacheMaxSize??100,extensions:B.extensions??[".html",".jinja",".jinja2",""],debug:B.debug??!1,debugOptions:B.debugOptions??{},timezone:B.timezone??void 0},this.runtime=new H({autoescape:this.options.autoescape,filters:this.options.filters,globals:this.options.globals,urlResolver:this.options.urlResolver,staticResolver:this.options.staticResolver,templateLoader:this.loadTemplate.bind(this),timezone:this.options.timezone})}async render(B,K={}){if(this.options.debug)return this.renderWithDebug(B,K);let A=await this.loadTemplate(B);return this.runtime.render(A,K)}async renderString(B,K={}){if(this.options.debug)return this.renderStringWithDebug(B,K);let A=this.compile(B);return this.runtime.render(A,K)}async renderWithDebug(B,K){let A=D();A.captureContext(K),A.addTemplate(B,"root"),A.setMode("runtime"),A.startRender();let Q=await this.loadTemplate(B),O=this.runtime.render(Q,K);if(O&&typeof O.then==="function")O=await O;A.endRender();let U=L();return this.injectDebugPanel(String(O||""),U)}async renderStringWithDebug(B,K){let A=D();A.captureContext(K),A.setMode("runtime"),A.startRender();let Q=this.compile(B),O=this.runtime.render(Q,K);if(O&&typeof O.then==="function")O=await O;A.endRender();let U=L();return this.injectDebugPanel(String(O||""),U)}injectDebugPanel(B,K){if(!B||typeof B!=="string")return B||"";if(!(B.includes("<html")||B.includes("<body")||B.includes("<!DOCTYPE")))return B;let Q=_(K,this.options.debugOptions);if(B.includes("</body>"))return B.replace("</body>",`${Q}</body>`);return B+Q}compile(B){let A=new C(B).tokenize();return new N(A,B).parse()}async loadTemplate(B){if(this.options.cache&&this.templateCache.has(B)){this.cacheHits++;let O=this.templateCache.get(B);return this.templateCache.delete(B),this.templateCache.set(B,O),O}this.cacheMisses++;let K=await this.resolveTemplatePath(B);if(!K)throw Error(`Template not found: ${B}`);let A=await Bun.file(K).text(),Q=this.compile(A);if(this.options.cache){while(this.templateCache.size>=this.options.cacheMaxSize){let O=this.templateCache.keys().next().value;if(O)this.templateCache.delete(O)}this.templateCache.set(B,Q)}return Q}clearCache(){this.templateCache.clear(),this.cacheHits=0,this.cacheMisses=0}cacheSize(){return this.templateCache.size}cacheStats(){let B=this.cacheHits+this.cacheMisses;return{size:this.templateCache.size,maxSize:this.options.cacheMaxSize,hits:this.cacheHits,misses:this.cacheMisses,hitRate:B>0?this.cacheHits/B*100:0}}addFilter(B,K){this.runtime.addFilter(B,K)}addGlobal(B,K){this.runtime.addGlobal(B,K)}addUrl(B,K){this.routes.set(B,K)}addUrls(B){for(let[K,A]of Object.entries(B))this.routes.set(K,A)}async resolveTemplatePath(B){let K=V.resolve(this.options.templates,B);for(let A of this.options.extensions){let Q=K+A;if(await Bun.file(Q).exists())return Q}return null}defaultUrlResolver(B,K,A){let Q=this.routes.get(B);if(!Q)return console.warn(`URL pattern not found: ${B}`),`#${B}`;let O=Q;for(let Y in A){let J=encodeURIComponent(String(A[Y]));O=O.replaceAll(`:${Y}`,J),O=O.replaceAll(`<${Y}>`,J),O=O.replaceAll(`(?P<${Y}>[^/]+)`,J)}let U=0;return RB.lastIndex=0,O=O.replace(RB,()=>{if(U<K.length)return encodeURIComponent(String(K[U++]));return""}),O}defaultStaticResolver(B){return`/static/${B}`}}async function QQ(B,K={},A={}){return new d(A).renderString(B,K)}function $Q(B,K={}){let Q=new d(K).compile(B),O=new H({autoescape:K.autoescape??!0,filters:K.filters??{},globals:K.globals??{},urlResolver:K.urlResolver,staticResolver:K.staticResolver,templateLoader:async()=>Q});return{async render(U={}){return O.render(Q,U)}}}function UQ(B,K={}){let Q=new C(B).tokenize(),U=new N(Q,B).parse();return v(U,K)}async function ZQ(B,K){let A=K.extensions??[".html",".jinja",".jinja2",""],Q=V.resolve(K.templates),O={load(Z){let X=V.resolve(Q,Z);for(let M of A){let G=X+M,E=Bun.file(G),I=s("fs");if(I.existsSync(G))return I.readFileSync(G,"utf-8")}throw Error(`Template not found: ${Z}`)},parse(Z){let M=new C(Z).tokenize();return new N(M,Z).parse()}},U=O.load(B),Y=O.parse(U),J=x(Y);if(!J.canFlatten)throw Error(`Cannot compile template with AOT: ${J.reason}
|
|
372
|
+
Use Environment.render() for dynamic template names.`);let $=g(Y,{loader:O});return v($,K)}async function JQ(B,K){let A=K.extensions??[".html",".jinja",".jinja2",""],Q=V.resolve(K.templates),O=s("fs"),U={load(X){let M=V.resolve(Q,X);for(let G of A){let E=M+G;if(O.existsSync(E))return O.readFileSync(E,"utf-8")}throw Error(`Template not found: ${X}`)},parse(X){let G=new C(X).tokenize();return new N(G,X).parse()}},Y=U.load(B),J=U.parse(Y),$=x(J);if(!$.canFlatten)throw Error(`Cannot compile template with AOT: ${$.reason}`);let Z=g(J,{loader:U});return T(Z,K)}function YQ(B,K={}){let Q=new C(B).tokenize(),U=new N(Q,B).parse();return T(U,K)}export{IB as renderWithDebug,EB as renderStringWithDebug,QQ as render,_ as generateDebugPanel,g as flattenTemplate,oA as debugMiddleware,lA as createDebugRenderer,JQ as compileWithInheritanceToCode,ZQ as compileWithInheritance,YQ as compileToCode,UQ as compile,x as canFlatten,f as builtinTests,h as builtinFilters,b as TokenType,P as TemplateSyntaxError,y as TemplateRuntimeError,r as TemplateError,$Q as Template,H as Runtime,N as Parser,C as Lexer,d as Environment,w as Context};
|