@dogsbay/minja 0.2.0-beta.48 → 0.2.0-beta.50
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/bin/minja.js +9 -6
- package/dist/evaluator.d.ts.map +1 -1
- package/dist/evaluator.js +8 -2
- package/dist/evaluator.js.map +1 -1
- package/dist/index.umd.js +9 -6
- package/dist/index.umd.js.map +2 -2
- package/dist/index.umd.min.js +4 -4
- package/dist/index.umd.min.js.map +3 -3
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +9 -2
- package/dist/renderer.js.map +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/bin/minja.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* minja v0.2.0-beta.
|
|
3
|
+
* minja v0.2.0-beta.50
|
|
4
4
|
* Minimal, secure Jinja2/Nunjucks subset for documentation preprocessing
|
|
5
5
|
* @license MIT
|
|
6
6
|
*/
|
|
@@ -87,7 +87,7 @@ function parseExpression(expr) {
|
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
if (/^[\w
|
|
90
|
+
if (/^[\w.-]+$/.test(expr)) {
|
|
91
91
|
return { type: "variable", name: expr };
|
|
92
92
|
}
|
|
93
93
|
throw new Error(`Invalid expression: ${expr}`);
|
|
@@ -705,7 +705,8 @@ async function render(template, options = {}) {
|
|
|
705
705
|
maxIncludeDepth = 10,
|
|
706
706
|
timeout = 5e3,
|
|
707
707
|
hyphenToUnderscore = false,
|
|
708
|
-
undefinedBehavior = "empty"
|
|
708
|
+
undefinedBehavior = "empty",
|
|
709
|
+
undefinedConditions = "preserve"
|
|
709
710
|
} = options;
|
|
710
711
|
const timeoutPromise = new Promise((_, reject) => {
|
|
711
712
|
setTimeout(() => reject(new Error("Template rendering timeout")), timeout);
|
|
@@ -725,7 +726,8 @@ async function render(template, options = {}) {
|
|
|
725
726
|
includeDepth: 0,
|
|
726
727
|
maxIncludeDepth,
|
|
727
728
|
basePath,
|
|
728
|
-
undefinedBehavior
|
|
729
|
+
undefinedBehavior,
|
|
730
|
+
undefinedConditions
|
|
729
731
|
});
|
|
730
732
|
return await Promise.race([renderPromise, timeoutPromise]);
|
|
731
733
|
}
|
|
@@ -785,7 +787,7 @@ async function renderNode(node, options) {
|
|
|
785
787
|
case "comment":
|
|
786
788
|
return "";
|
|
787
789
|
case "if": {
|
|
788
|
-
if (options.undefinedBehavior === "preserve") {
|
|
790
|
+
if (options.undefinedBehavior === "preserve" && options.undefinedConditions !== "falsy") {
|
|
789
791
|
const undefinedRefs = findUndefinedRefs(node.condition, context);
|
|
790
792
|
if (undefinedRefs.length > 0) {
|
|
791
793
|
return ifNodeToSource(node);
|
|
@@ -841,7 +843,8 @@ async function renderNode(node, options) {
|
|
|
841
843
|
includeDepth: includeDepth + 1,
|
|
842
844
|
maxIncludeDepth,
|
|
843
845
|
basePath: newBasePath,
|
|
844
|
-
undefinedBehavior: options.undefinedBehavior
|
|
846
|
+
undefinedBehavior: options.undefinedBehavior,
|
|
847
|
+
undefinedConditions: options.undefinedConditions
|
|
845
848
|
});
|
|
846
849
|
} catch (error) {
|
|
847
850
|
if (options.undefinedBehavior === "preserve") {
|
package/dist/evaluator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEtD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAiHxD;AA6CD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CA+C/E"}
|
package/dist/evaluator.js
CHANGED
|
@@ -96,8 +96,14 @@ export function parseExpression(expr) {
|
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
// Handle simple variable lookup (with dot notation)
|
|
100
|
-
|
|
99
|
+
// Handle simple variable lookup (with dot notation).
|
|
100
|
+
// Hyphens are allowed in identifiers so AsciiDoc-style attribute
|
|
101
|
+
// names (`product-version`, `ptp-events-rest-api`) work inside
|
|
102
|
+
// `{% if %}` conditions — they resolve via `hyphenToUnderscore` in
|
|
103
|
+
// Context.get, just like `{{ product-version }}` interpolations.
|
|
104
|
+
// Minja has no subtraction operator, so a `-` is never ambiguous
|
|
105
|
+
// here; negative number literals are matched earlier.
|
|
106
|
+
if (/^[\w.-]+$/.test(expr)) {
|
|
101
107
|
return { type: 'variable', name: expr };
|
|
102
108
|
}
|
|
103
109
|
// If we can't parse it, throw an error
|
package/dist/evaluator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* minja v0.2.0-beta.
|
|
2
|
+
* minja v0.2.0-beta.50
|
|
3
3
|
* Minimal, secure Jinja2/Nunjucks subset for documentation preprocessing
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
@@ -111,7 +111,7 @@ var minja = (() => {
|
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
-
if (/^[\w
|
|
114
|
+
if (/^[\w.-]+$/.test(expr)) {
|
|
115
115
|
return { type: "variable", name: expr };
|
|
116
116
|
}
|
|
117
117
|
throw new Error(`Invalid expression: ${expr}`);
|
|
@@ -729,7 +729,8 @@ var minja = (() => {
|
|
|
729
729
|
maxIncludeDepth = 10,
|
|
730
730
|
timeout = 5e3,
|
|
731
731
|
hyphenToUnderscore = false,
|
|
732
|
-
undefinedBehavior = "empty"
|
|
732
|
+
undefinedBehavior = "empty",
|
|
733
|
+
undefinedConditions = "preserve"
|
|
733
734
|
} = options;
|
|
734
735
|
const timeoutPromise = new Promise((_, reject) => {
|
|
735
736
|
setTimeout(() => reject(new Error("Template rendering timeout")), timeout);
|
|
@@ -749,7 +750,8 @@ var minja = (() => {
|
|
|
749
750
|
includeDepth: 0,
|
|
750
751
|
maxIncludeDepth,
|
|
751
752
|
basePath,
|
|
752
|
-
undefinedBehavior
|
|
753
|
+
undefinedBehavior,
|
|
754
|
+
undefinedConditions
|
|
753
755
|
});
|
|
754
756
|
return await Promise.race([renderPromise, timeoutPromise]);
|
|
755
757
|
}
|
|
@@ -809,7 +811,7 @@ var minja = (() => {
|
|
|
809
811
|
case "comment":
|
|
810
812
|
return "";
|
|
811
813
|
case "if": {
|
|
812
|
-
if (options.undefinedBehavior === "preserve") {
|
|
814
|
+
if (options.undefinedBehavior === "preserve" && options.undefinedConditions !== "falsy") {
|
|
813
815
|
const undefinedRefs = findUndefinedRefs(node.condition, context);
|
|
814
816
|
if (undefinedRefs.length > 0) {
|
|
815
817
|
return ifNodeToSource(node);
|
|
@@ -865,7 +867,8 @@ var minja = (() => {
|
|
|
865
867
|
includeDepth: includeDepth + 1,
|
|
866
868
|
maxIncludeDepth,
|
|
867
869
|
basePath: newBasePath,
|
|
868
|
-
undefinedBehavior: options.undefinedBehavior
|
|
870
|
+
undefinedBehavior: options.undefinedBehavior,
|
|
871
|
+
undefinedConditions: options.undefinedConditions
|
|
869
872
|
});
|
|
870
873
|
} catch (error) {
|
|
871
874
|
if (options.undefinedBehavior === "preserve") {
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/browser.ts", "../src/evaluator.ts", "../src/parser.ts", "../src/context.ts", "../src/loader-fetch.ts", "../src/renderer.ts", "../src/loader-memory.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Browser-only entry point (excludes FileSystemLoader)\n */\n\nexport { render } from './renderer.js'\nexport { parse } from './parser.js'\nexport { parseExpression, evaluateExpression } from './evaluator.js'\nexport { Context } from './context.js'\nexport { FetchLoader } from './loader-fetch.js'\nexport { MemoryLoader } from './loader-memory.js'\n\nexport type {\n // AST types\n ASTNode,\n TextNode,\n VariableNode,\n SetNode,\n IfNode,\n IncludeNode,\n CommentNode,\n\n // Expression types\n Expression,\n LiteralExpression,\n VariableExpression,\n BinaryExpression,\n UnaryExpression,\n\n // Options and interfaces\n RenderOptions,\n Loader,\n IContext,\n ParseResult,\n ParseError,\n} from './types.js'\n", "/**\n * Safe expression evaluator\n * Evaluates expressions WITHOUT using eval() or new Function()\n * Only allows whitelisted operations\n */\n\nimport type { Expression, IContext } from './types.js'\n\n/**\n * Parse an expression string into an Expression AST\n * @param expr - Expression string to parse\n * @returns Expression AST\n */\nexport function parseExpression(expr: string): Expression {\n expr = expr.trim()\n\n // Handle boolean literals\n if (expr === 'true') {\n return { type: 'literal', value: true }\n }\n if (expr === 'false') {\n return { type: 'literal', value: false }\n }\n if (expr === 'null') {\n return { type: 'literal', value: null }\n }\n\n // Handle string literals (double quotes)\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle string literals (single quotes)\n if (expr.startsWith(\"'\") && expr.endsWith(\"'\")) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle number literals\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { type: 'literal', value: parseFloat(expr) }\n }\n\n // Handle parenthesized expressions\n if (expr.startsWith('(') && expr.endsWith(')')) {\n // Check if parentheses are balanced for the entire expression\n let depth = 0\n let balanced = true\n\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++\n } else if (expr[i] === ')') {\n depth--\n }\n\n // If depth hits 0 before the end, the outer parens aren't wrapping everything\n if (depth === 0 && i < expr.length - 1) {\n balanced = false\n break\n }\n }\n\n // If balanced, unwrap and recursively parse\n if (balanced && depth === 0) {\n return parseExpression(expr.slice(1, -1))\n }\n }\n\n // Handle logical NOT\n if (expr.startsWith('not ')) {\n return {\n type: 'unary',\n operator: 'not',\n operand: parseExpression(expr.substring(4))\n }\n }\n\n // Handle logical OR (lowest precedence)\n const orMatch = findOperator(expr, ' or ')\n if (orMatch !== -1) {\n return {\n type: 'binary',\n operator: 'or',\n left: parseExpression(expr.substring(0, orMatch)),\n right: parseExpression(expr.substring(orMatch + 4))\n }\n }\n\n // Handle logical AND\n const andMatch = findOperator(expr, ' and ')\n if (andMatch !== -1) {\n return {\n type: 'binary',\n operator: 'and',\n left: parseExpression(expr.substring(0, andMatch)),\n right: parseExpression(expr.substring(andMatch + 5))\n }\n }\n\n // Handle comparison operators\n const comparisonOps = ['==', '!=', '<=', '>=', '<', '>']\n for (const op of comparisonOps) {\n const opMatch = findOperator(expr, ` ${op} `)\n if (opMatch !== -1) {\n return {\n type: 'binary',\n operator: op as '==' | '!=' | '<' | '>' | '<=' | '>=',\n left: parseExpression(expr.substring(0, opMatch)),\n right: parseExpression(expr.substring(opMatch + op.length + 2))\n }\n }\n }\n\n // Handle simple variable lookup (with dot notation)\n if (/^[\\w.]+$/.test(expr)) {\n return { type: 'variable', name: expr }\n }\n\n // If we can't parse it, throw an error\n throw new Error(`Invalid expression: ${expr}`)\n}\n\n/**\n * Find the position of an operator, respecting string literals\n * @param expr - Expression string\n * @param operator - Operator to find\n * @returns Position of operator or -1 if not found\n */\nfunction findOperator(expr: string, operator: string): number {\n let inString: string | null = null\n let depth = 0\n\n for (let i = 0; i < expr.length; i++) {\n const char = expr[i]\n\n // Track string literals\n if ((char === '\"' || char === \"'\") && (i === 0 || expr[i - 1] !== '\\\\')) {\n if (inString === char) {\n inString = null\n } else if (inString === null) {\n inString = char\n }\n continue\n }\n\n // Track parentheses depth\n if (!inString) {\n if (char === '(') {\n depth++\n } else if (char === ')') {\n depth--\n }\n }\n\n // Look for operator at depth 0, outside strings\n if (!inString && depth === 0) {\n if (expr.substring(i, i + operator.length) === operator) {\n return i\n }\n }\n }\n\n return -1\n}\n\n/**\n * Evaluate an expression in a given context\n * @param expr - Expression to evaluate\n * @param context - Variable context\n * @returns Evaluated value\n */\nexport function evaluateExpression(expr: Expression, context: IContext): unknown {\n switch (expr.type) {\n case 'literal':\n return expr.value\n\n case 'variable':\n return context.get(expr.name)\n\n case 'binary': {\n const left = evaluateExpression(expr.left, context)\n const right = evaluateExpression(expr.right, context)\n\n switch (expr.operator) {\n case '==':\n // eslint-disable-next-line eqeqeq\n return left == right\n case '!=':\n // eslint-disable-next-line eqeqeq\n return left != right\n case '<':\n return (left as number) < (right as number)\n case '>':\n return (left as number) > (right as number)\n case '<=':\n return (left as number) <= (right as number)\n case '>=':\n return (left as number) >= (right as number)\n case 'and':\n return isTruthy(left) && isTruthy(right)\n case 'or':\n return isTruthy(left) || isTruthy(right)\n }\n break\n }\n\n case 'unary': {\n const operand = evaluateExpression(expr.operand, context)\n\n switch (expr.operator) {\n case 'not':\n return !isTruthy(operand)\n }\n break\n }\n }\n\n return undefined\n}\n\n/**\n * Determine if a value is truthy in template context\n * @param value - Value to check\n * @returns true if truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n", "/**\n * Template parser\n * Converts template strings into AST (Abstract Syntax Tree)\n */\n\nimport type { ASTNode, ParseResult, ParseError } from './types.js'\nimport { parseExpression } from './evaluator.js'\n\n/**\n * Parse a template string into an AST\n * @param template - Template string to parse\n * @returns Parse result with AST and errors\n */\nexport function parse(template: string): ParseResult {\n const errors: ParseError[] = []\n const ast: ASTNode[] = []\n\n let position = 0\n let line = 1\n let column = 1\n\n /**\n * Create a parse error\n */\n function createError(message: string): ParseError {\n return { message, position, line, column }\n }\n\n /**\n * Advance position tracking\n */\n function advance(count: number): void {\n for (let i = 0; i < count; i++) {\n if (template[position + i] === '\\n') {\n line++\n column = 1\n } else {\n column++\n }\n }\n position += count\n }\n\n /**\n * Find the next occurrence of a string\n */\n function findNext(str: string, from: number = position): number {\n return template.indexOf(str, from)\n }\n\n /**\n * Extract text between current position and a target position\n */\n function extractTo(target: number): string {\n const text = template.substring(position, target)\n advance(target - position)\n return text\n }\n\n while (position < template.length) {\n // Look for template tags\n const varStart = findNext('{{', position)\n const tagStart = findNext('{%', position)\n const commentStart = findNext('{#', position)\n\n // Find the nearest tag\n const candidates = [\n { pos: varStart, type: 'var' },\n { pos: tagStart, type: 'tag' },\n { pos: commentStart, type: 'comment' },\n ].filter((c) => c.pos !== -1)\n\n if (candidates.length === 0) {\n // No more tags, rest is text\n const text = template.substring(position)\n if (text) {\n ast.push({ type: 'text', value: text })\n }\n break\n }\n\n // Sort to find nearest\n candidates.sort((a, b) => a.pos - b.pos)\n const nearest = candidates[0]\n\n // Add text before tag\n if (nearest.pos > position) {\n ast.push({ type: 'text', value: extractTo(nearest.pos) })\n }\n\n // Parse the tag\n if (nearest.type === 'var') {\n // Variable: {{ name }}\n advance(2) // Skip {{\n const endPos = findNext('}}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed variable tag'))\n break\n }\n\n const varName = extractTo(endPos).trim()\n advance(2) // Skip }}\n\n ast.push({ type: 'variable', name: varName })\n } else if (nearest.type === 'comment') {\n // Comment: {# ... #}\n // Auto-strip newlines for comments (they produce no output)\n // Only strip if the comment is on its own line\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n // Only strip if previous text ends with newline (comment is on its own line)\n if (/\\n[ \\t]*$/.test(lastNode.value)) {\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t]*$/, '')\n }\n }\n\n advance(2) // Skip {#\n const endPos = findNext('#}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed comment tag'))\n break\n }\n\n const commentText = extractTo(endPos)\n advance(2) // Skip #}\n\n ast.push({ type: 'comment', value: commentText })\n\n // Auto-strip following newline if comment is on its own line\n if (position < template.length && template[position] === '\\n') {\n advance(1)\n // Also skip any indentation on the next line\n while (position < template.length && /[ \\t]/.test(template[position])) {\n advance(1)\n }\n }\n } else if (nearest.type === 'tag') {\n // Statement tag: {% ... %}\n advance(2) // Skip {%\n const endPos = findNext('%}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed statement tag'))\n break\n }\n\n let statement = extractTo(endPos).trim()\n\n // Check for whitespace control characters\n const hasLeftStrip = statement.startsWith('-')\n const hasRightStrip = statement.endsWith('-')\n\n // Strip whitespace control characters from statement\n if (hasLeftStrip) {\n statement = statement.substring(1).trim()\n // Strip trailing whitespace from previous text node\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t\\n]*$/, '')\n }\n }\n if (hasRightStrip) {\n statement = statement.substring(0, statement.length - 1).trim()\n }\n\n advance(2) // Skip %}\n\n // If right strip, consume following whitespace\n if (hasRightStrip) {\n while (position < template.length && /[ \\t\\n]/.test(template[position])) {\n advance(1)\n }\n }\n\n // Parse different statement types\n if (statement.startsWith('set ')) {\n // {% set var = value %}\n const setMatch = /^set\\s+(\\w+)\\s*=\\s*(.+)$/.exec(statement)\n if (setMatch) {\n try {\n const expr = parseExpression(setMatch[2])\n\n ast.push({\n type: 'set',\n name: setMatch[1],\n value: expr,\n })\n } catch (error) {\n errors.push(createError(`Invalid set expression: ${(error as Error).message}`))\n }\n } else {\n errors.push(createError('Invalid set syntax'))\n }\n } else if (statement.startsWith('if ')) {\n // {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}\n const condition = statement.substring(3).trim()\n\n try {\n const expr = parseExpression(condition)\n\n // Find the body and elif/else/endif blocks\n const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'if',\n condition: expr,\n trueBranch,\n elifBranches: elifBranches.length > 0 ? elifBranches : undefined,\n elseBranch: elseBranch.length > 0 ? elseBranch : undefined,\n })\n } catch (error) {\n errors.push(createError(`Invalid if expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('include ')) {\n // {% include \"path\" %}\n const includeMatch = /^include\\s+[\"']([^\"']+)[\"']/.exec(statement)\n if (includeMatch) {\n ast.push({\n type: 'include',\n path: includeMatch[1],\n })\n } else {\n errors.push(createError('Invalid include syntax'))\n }\n } else if (statement.startsWith('switch ')) {\n // {% switch variable %} ... {% case \"value\" %} ... {% endswitch %}\n const switchExpr = statement.substring(7).trim()\n\n try {\n const expr = parseExpression(switchExpr)\n const { cases, parseErrors } = parseSwitchBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'switch',\n expression: expr,\n cases,\n })\n } catch (error) {\n errors.push(createError(`Invalid switch expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('leveloffset ')) {\n // {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}\n const offsetMatch = /^leveloffset\\s+([-+]?\\d+)$/.exec(statement)\n\n if (!offsetMatch) {\n errors.push(createError('Invalid leveloffset syntax'))\n } else {\n const offsetStr = offsetMatch[1]\n const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-')\n const offset = parseInt(offsetStr, 10)\n\n if (isNaN(offset)) {\n errors.push(createError('Invalid leveloffset value'))\n } else {\n // Find matching endleveloffset accounting for nesting\n let depth = 0\n let searchPos = position\n let endPos = -1\n\n while (searchPos < template.length) {\n const leveloffsetMatch = /{%-?\\s*leveloffset\\s+[-+]?\\d+\\s*-?%}/.exec(template.substring(searchPos))\n const endleveloffsetMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(searchPos))\n\n const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity\n const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity\n\n if (leveloffsetPos < endleveloffsetPos) {\n // Found nested leveloffset\n depth++\n searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0)\n } else if (endleveloffsetPos < Infinity) {\n // Found endleveloffset\n if (depth === 0) {\n // This is our matching endleveloffset\n endPos = endleveloffsetPos\n break\n } else {\n depth--\n searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0)\n }\n } else {\n // No more tags found\n break\n }\n }\n\n if (endPos === -1) {\n errors.push(createError('Missing endleveloffset'))\n } else {\n const bodyTemplate = extractTo(endPos)\n // Find and skip the endleveloffset tag\n const endMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(position))\n if (endMatch) {\n advance(endMatch[0].length)\n }\n\n const bodyResult = parse(bodyTemplate)\n errors.push(...bodyResult.errors)\n\n ast.push({\n type: 'leveloffset',\n offset,\n isRelative,\n body: bodyResult.ast,\n })\n }\n }\n }\n }\n // Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags\n }\n }\n\n return { ast, errors }\n\n /**\n * Find an end tag like {% endif %}\n */\n function findEndTag(tagName: string): { start: number; length: number } | null {\n const pattern = new RegExp(`{%\\\\s*${tagName}\\\\s*%}`)\n const match = pattern.exec(template.substring(position))\n\n if (match) {\n return {\n start: position + match.index,\n length: match[0].length,\n }\n }\n\n return null\n }\n\n /**\n * Parse an if block with elif and else support\n */\n function parseIfBlock(): {\n trueBranch: ASTNode[]\n elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }>\n elseBranch: ASTNode[]\n parseErrors: ParseError[]\n } {\n const elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n let elseBranch: ASTNode[] = []\n\n // Find the next elif, else, or endif\n let depth = 0\n let searchPos = position\n\n while (searchPos < template.length) {\n const ifMatch = /{%-?\\s*if\\s+/.exec(template.substring(searchPos))\n const elifMatch = /{%-?\\s*elif\\s+/.exec(template.substring(searchPos))\n const elseMatch = /{%-?\\s*else\\s*-?%}/.exec(template.substring(searchPos))\n const endifMatch = /{%-?\\s*endif\\s*-?%}/.exec(template.substring(searchPos))\n\n // Find the nearest match\n const matches = [\n { type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },\n { type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },\n { type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },\n { type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },\n ].sort((a, b) => a.pos - b.pos)\n\n const nearest = matches[0]\n\n if (!nearest.match || nearest.pos === Infinity) {\n parseErrors.push(createError('Missing endif'))\n break\n }\n\n if (nearest.type === 'if') {\n depth++\n searchPos = nearest.pos + nearest.match[0].length\n } else if (nearest.type === 'endif') {\n if (depth === 0) {\n // This is our endif\n const bodyTemplate = extractTo(nearest.pos)\n advance(nearest.match[0].length)\n\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n\n return {\n trueBranch: bodyResult.ast,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } else {\n depth--\n searchPos = nearest.pos + nearest.match[0].length\n }\n } else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {\n // Parse the body before elif/else\n const bodyTemplate = extractTo(nearest.pos)\n const bodyResult = parse(bodyTemplate)\n\n if (elifBranches.length === 0 && elseBranch.length === 0) {\n // This is the trueBranch (before first elif/else)\n parseErrors.push(...bodyResult.errors)\n const trueBranch = bodyResult.ast\n\n // Now handle elif or else\n if (nearest.type === 'elif') {\n // Extract elif condition\n advance(nearest.match[0].length)\n const condMatch = /^([^%]+)%}/.exec(template.substring(position))\n if (condMatch) {\n const condStr = condMatch[1].trim()\n advance(condMatch[0].length)\n\n try {\n const elifCondition = parseExpression(condStr)\n const elifResult = parseIfBlock()\n parseErrors.push(...elifResult.parseErrors)\n\n elifBranches.push({\n condition: elifCondition,\n body: elifResult.trueBranch,\n })\n elifBranches.push(...(elifResult.elifBranches || []))\n elseBranch = elifResult.elseBranch\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } catch (error) {\n parseErrors.push(createError(`Invalid elif expression: ${(error as Error).message}`))\n }\n }\n } else {\n // else\n advance(nearest.match[0].length)\n\n // Find endif for else block\n const endifMatch = findEndTag('endif')\n if (!endifMatch) {\n parseErrors.push(createError('Missing endif after else'))\n } else {\n const elseBodyTemplate = extractTo(endifMatch.start)\n advance(endifMatch.length)\n\n const elseBodyResult = parse(elseBodyTemplate)\n parseErrors.push(...elseBodyResult.errors)\n elseBranch = elseBodyResult.ast\n }\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n }\n } else {\n searchPos = nearest.pos + nearest.match[0].length\n }\n }\n\n return {\n trueBranch: [],\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n\n /**\n * Parse a switch block with case support\n */\n function parseSwitchBlock(): {\n cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }>\n parseErrors: ParseError[]\n } {\n const cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n\n while (position < template.length) {\n // Find the next case or endswitch\n const caseMatch = /{%-?\\s*case\\s+/.exec(template.substring(position))\n const endswitchMatch = /{%-?\\s*endswitch\\s*-?%}/.exec(template.substring(position))\n\n // Find which comes first\n const casePos = caseMatch ? position + caseMatch.index : Infinity\n const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity\n\n if (endswitchPos < casePos) {\n // Found endswitch before any case (or no case)\n // Parse any remaining content before endswitch as the last case body\n if (cases.length > 0 && position < endswitchPos) {\n const bodyTemplate = extractTo(endswitchPos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n }\n\n // Skip endswitch\n advance(endswitchPos - position + (endswitchMatch?.[0].length || 0))\n break\n } else if (casePos < Infinity) {\n // Found a case\n // If there's a previous case, parse its body\n if (cases.length > 0 && position < casePos) {\n const bodyTemplate = extractTo(casePos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n } else if (position < casePos) {\n // Content before first case - skip it\n extractTo(casePos)\n }\n\n // Parse the case value\n advance(caseMatch![0].length)\n\n // Extract the case value (until %})\n const valueMatch = /([^%]+)%}/.exec(template.substring(position))\n if (valueMatch) {\n const valueStr = valueMatch[1].trim()\n advance(valueMatch[0].length)\n\n try {\n const caseValue = parseExpression(valueStr)\n cases.push({\n value: caseValue,\n body: [], // Will be filled in next iteration or at endswitch\n })\n } catch (error) {\n parseErrors.push(createError(`Invalid case value: ${(error as Error).message}`))\n }\n } else {\n parseErrors.push(createError('Invalid case syntax'))\n break\n }\n } else {\n // No case or endswitch found\n parseErrors.push(createError('Missing endswitch'))\n break\n }\n }\n\n return { cases, parseErrors }\n }\n}\n", "/**\n * Context management for variable scoping\n * Supports nested scopes with inheritance\n */\n\nimport type { IContext } from './types.js'\n\nexport interface ContextOptions {\n /**\n * Convert hyphenated variable names to underscores during lookup.\n */\n hyphenToUnderscore?: boolean\n}\n\nexport class Context implements IContext {\n private variables: Map<string, unknown>\n private parent: Context | null\n private options: ContextOptions\n\n constructor(parent?: Context, options?: ContextOptions) {\n this.variables = new Map()\n this.parent = parent || null\n this.options = options || parent?.options || {}\n }\n\n /**\n * Get a variable from the context (supports dot notation)\n * @param name - Variable name (can use dot notation like \"obj.prop.subprop\")\n * @returns The variable value or undefined\n */\n get(name: string): unknown {\n // Convert hyphens to underscores if option is enabled\n const normalizedName = this.options.hyphenToUnderscore\n ? name.replace(/-/g, '_')\n : name\n\n const parts = normalizedName.split('.')\n const rootName = parts[0]\n\n // Look up the root variable in current scope or parent scopes\n let value: unknown\n if (this.variables.has(rootName)) {\n value = this.variables.get(rootName)\n } else if (this.parent) {\n value = this.parent.get(rootName)\n } else {\n return undefined\n }\n\n // Navigate nested properties\n for (let i = 1; i < parts.length; i++) {\n if (value === null || value === undefined) {\n return undefined\n }\n\n // Only allow property access on plain objects (prevent prototype pollution)\n if (typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n // Prevent access to prototype chain\n if (!Object.prototype.hasOwnProperty.call(value, parts[i])) {\n return undefined\n }\n\n value = (value as Record<string, unknown>)[parts[i]]\n }\n\n return value\n }\n\n /**\n * Set a variable in the current context\n * @param name - Variable name (can use dot notation)\n * @param value - Value to set\n */\n set(name: string, value: unknown): void {\n const parts = name.split('.')\n\n if (parts.length === 1) {\n // Simple assignment\n this.variables.set(name, value)\n return\n }\n\n // Nested assignment - navigate to parent object\n const rootName = parts[0]\n let target = this.variables.get(rootName) as Record<string, unknown> | undefined\n\n if (!target || typeof target !== 'object' || Array.isArray(target)) {\n // Create new object if root doesn't exist or isn't an object\n target = {}\n this.variables.set(rootName, target)\n }\n\n // Navigate to the parent of the target property\n for (let i = 1; i < parts.length - 1; i++) {\n const key = parts[i]\n\n if (\n !target[key] ||\n typeof target[key] !== 'object' ||\n Array.isArray(target[key])\n ) {\n target[key] = {}\n }\n\n target = target[key] as Record<string, unknown>\n }\n\n // Set the final property\n target[parts[parts.length - 1]] = value\n }\n\n /**\n * Create a child scope\n * @returns A new Context with this context as parent\n */\n push(): Context {\n return new Context(this, this.options)\n }\n\n /**\n * Return to parent scope\n * @returns The parent context or null if at root\n */\n pop(): Context | null {\n return this.parent\n }\n\n /**\n * Create a context from a plain object\n * @param data - Plain object to convert to context\n * @param options - Context options\n * @returns New Context instance\n */\n static from(data: Record<string, unknown>, options?: ContextOptions): Context {\n const ctx = new Context(undefined, options)\n for (const [key, value] of Object.entries(data)) {\n ctx.set(key, value)\n }\n return ctx\n }\n}\n", "/**\n * Fetch-based loader for browsers and service workers\n */\n\nimport type { Loader } from './types.js'\n\nexport class FetchLoader implements Loader {\n async load(path: string, basePath?: string): Promise<string> {\n const url = basePath ? new URL(path, basePath).href : path\n const fetchUrl = `${url}?preventCache=${Date.now()}`\n\n const response = await fetch(fetchUrl)\n\n if (!response.ok) {\n throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`)\n }\n\n return await response.text()\n }\n}\n", "/**\n * Template renderer\n * Combines parser, evaluator, and loader to render templates\n */\n\nimport type { ASTNode, Expression, RenderOptions, Loader } from './types.js'\nimport { parse } from './parser.js'\nimport { Context } from './context.js'\nimport { evaluateExpression } from './evaluator.js'\nimport { FetchLoader } from './loader-fetch.js'\n\n/**\n * Transform markdown headings by applying level offset\n * Clamps to valid markdown range (1-6)\n * @param text - Text content to transform\n * @param offset - Level offset to apply\n * @returns Transformed text with adjusted heading levels\n */\nfunction transformHeadings(text: string, offset: number): string {\n if (offset === 0) {\n return text\n }\n\n // Match markdown headings: # through ######\n return text.replace(/^(#{1,6})(\\s+)/gm, (_match, hashes, space) => {\n const currentLevel = hashes.length\n const newLevel = Math.max(1, Math.min(6, currentLevel + offset))\n return '#'.repeat(newLevel) + space\n })\n}\n\n/**\n * Resolve a relative path against a base path\n * @param path - Relative or absolute path\n * @param basePath - Base path to resolve against\n * @returns Resolved path\n */\nfunction resolvePath(path: string, basePath: string): string {\n // If path is absolute, return as-is\n if (path.startsWith('/')) {\n return path\n }\n\n // Ensure basePath ends with /\n const base = basePath.endsWith('/') ? basePath : basePath + '/'\n\n // Combine and normalize\n const combined = base + path\n\n // Normalize . and .. segments\n const parts = combined.split('/')\n const resolved: string[] = []\n\n for (const part of parts) {\n if (part === '.' || part === '') {\n continue\n } else if (part === '..') {\n resolved.pop()\n } else {\n resolved.push(part)\n }\n }\n\n // Preserve leading slash if original had one\n const prefix = combined.startsWith('/') ? '/' : ''\n return prefix + resolved.join('/')\n}\n\n/**\n * Render a template string\n * @param template - Template string to render\n * @param options - Render options\n * @returns Rendered output\n */\nexport async function render(template: string, options: RenderOptions = {}): Promise<string> {\n const {\n loader = new FetchLoader(),\n context: initialContext = {},\n basePath = '',\n maxIncludeDepth = 10,\n timeout = 5000,\n hyphenToUnderscore = false,\n undefinedBehavior = 'empty',\n } = options\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Template rendering timeout')), timeout)\n })\n\n // Render with timeout\n const renderPromise = renderInternal(template, {\n loader,\n context: Context.from(\n {\n ...initialContext,\n // Built-in variables\n date: new Date().toISOString().split('T')[0],\n timestamp: Date.now(),\n _levelOffset: 0,\n },\n { hyphenToUnderscore }\n ),\n includeDepth: 0,\n maxIncludeDepth,\n basePath,\n undefinedBehavior,\n })\n\n return await Promise.race([renderPromise, timeoutPromise])\n}\n\ninterface InternalRenderOptions {\n loader: Loader\n context: Context\n includeDepth: number\n maxIncludeDepth: number\n basePath: string\n undefinedBehavior: 'empty' | 'throw' | 'preserve'\n}\n\n/**\n * Internal rendering function with depth tracking\n */\nasync function renderInternal(\n template: string,\n options: InternalRenderOptions\n): Promise<string> {\n const { includeDepth, maxIncludeDepth } = options\n\n // Check recursion depth\n if (includeDepth > maxIncludeDepth) {\n throw new Error(`Maximum include depth (${maxIncludeDepth}) exceeded`)\n }\n\n // Parse template\n const parseResult = parse(template)\n\n if (parseResult.errors.length > 0) {\n const errorMessages = parseResult.errors.map((e) => e.message).join(', ')\n throw new Error(`Parse errors: ${errorMessages}`)\n }\n\n // Render AST\n return await renderNodes(parseResult.ast, options)\n}\n\n/**\n * Render an array of AST nodes\n */\nasync function renderNodes(nodes: ASTNode[], options: InternalRenderOptions): Promise<string> {\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(await renderNode(node, options))\n }\n\n return parts.join('')\n}\n\n/**\n * Render a single AST node\n */\nasync function renderNode(node: ASTNode, options: InternalRenderOptions): Promise<string> {\n const { loader, context, includeDepth, maxIncludeDepth, basePath } = options\n\n switch (node.type) {\n case 'text': {\n // Apply leveloffset if active\n const currentOffset = context.get('_levelOffset') as number || 0\n if (currentOffset === 0) {\n return node.value\n }\n return transformHeadings(node.value, currentOffset)\n }\n\n case 'variable': {\n const value = context.get(node.name)\n if (value === undefined || value === null) {\n // Apply the undefined-variable policy. See RenderOptions.undefinedBehavior.\n switch (options.undefinedBehavior) {\n case 'throw':\n throw new Error(`Undefined variable: ${node.name}`)\n case 'preserve':\n // Round-trip the source form so downstream tooling (or a\n // second-pass minja run with the value supplied) can pick\n // up where we left off.\n return `{{ ${node.name} }}`\n case 'empty':\n default:\n return ''\n }\n }\n const str = String(value)\n // If the value contains template syntax, re-process it\n if (str.includes('{{') || str.includes('{%')) {\n return await renderInternal(str, options)\n }\n return str\n }\n\n case 'set': {\n const value = evaluateExpression(node.value, context)\n context.set(node.name, value)\n return ''\n }\n\n case 'comment':\n return ''\n\n case 'if': {\n // In preserve mode, an `if` whose condition references an\n // undefined identifier can't be evaluated \u2014 we don't know\n // which branch to take. Preserve the whole `{% if \u2026 %}\u2026{% endif %}`\n // verbatim so a second pass (with the value supplied) can\n // resolve it. See plans/format-asciidoc-import.md.\n if (options.undefinedBehavior === 'preserve') {\n const undefinedRefs = findUndefinedRefs(node.condition, context)\n if (undefinedRefs.length > 0) {\n return ifNodeToSource(node)\n }\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n if (findUndefinedRefs(elif.condition, context).length > 0) {\n return ifNodeToSource(node)\n }\n }\n }\n }\n\n const condition = evaluateExpression(node.condition, context)\n\n if (isTruthy(condition)) {\n return await renderNodes(node.trueBranch, options)\n }\n\n // Check elif branches\n if (node.elifBranches) {\n for (const elifBranch of node.elifBranches) {\n const elifCondition = evaluateExpression(elifBranch.condition, context)\n if (isTruthy(elifCondition)) {\n return await renderNodes(elifBranch.body, options)\n }\n }\n }\n\n // Render else branch if present\n if (node.elseBranch) {\n return await renderNodes(node.elseBranch, options)\n }\n\n return ''\n }\n\n case 'include': {\n try {\n // Load the included file\n const includedContent = await loader.load(node.path, basePath)\n\n // Determine new base path for nested includes\n let newBasePath = basePath\n\n // If path looks like a URL, extract base\n if (node.path.includes('://')) {\n const url = new URL(node.path)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else if (basePath) {\n // Relative path - resolve against current base\n if (basePath.includes('://')) {\n const url = new URL(node.path, basePath)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else {\n // File path - resolve relative to current base and extract directory\n const resolvedPath = resolvePath(node.path, basePath)\n const lastSlash = resolvedPath.lastIndexOf('/')\n newBasePath = lastSlash >= 0 ? resolvedPath.substring(0, lastSlash + 1) : basePath\n }\n } else if (node.path.includes('/')) {\n // No base path but include has directory - use that as base\n const lastSlash = node.path.lastIndexOf('/')\n newBasePath = node.path.substring(0, lastSlash + 1)\n }\n\n // Render the included template (recursive)\n return await renderInternal(includedContent, {\n loader,\n context,\n includeDepth: includeDepth + 1,\n maxIncludeDepth,\n basePath: newBasePath,\n undefinedBehavior: options.undefinedBehavior,\n })\n } catch (error) {\n // In `preserve` mode, an unresolvable include is preserved\n // as the original directive so a later renderer pass (with\n // the file in place) can resolve it. Matches the semantic\n // of `preserve` for undefined variables. Without this,\n // multi-stage pipelines (e.g. dogsbay's convert + build\n // preprocessor for AsciiDoc imports) lose the directive at\n // stage 1 because targets only exist after stage 2 has\n // converted sibling files.\n if (options.undefinedBehavior === 'preserve') {\n return `{% include \"${node.path}\" %}`\n }\n const message = error instanceof Error ? error.message : String(error)\n console.error(`Failed to include ${node.path}:`, message)\n return `<!-- Include error: ${node.path} -->`\n }\n }\n\n case 'switch': {\n const switchValue = evaluateExpression(node.expression, context)\n\n // Find matching case\n for (const caseItem of node.cases) {\n const caseValue = evaluateExpression(caseItem.value, context)\n // eslint-disable-next-line eqeqeq\n if (switchValue == caseValue) {\n return await renderNodes(caseItem.body, options)\n }\n }\n\n // No matching case found\n return ''\n }\n\n case 'leveloffset': {\n // Calculate new offset (relative or absolute)\n const parentOffset = context.get('_levelOffset') as number || 0\n const newOffset = node.isRelative ? parentOffset + node.offset : node.offset\n\n // Store current offset to restore later\n const previousOffset = parentOffset\n\n // Set new offset in context\n context.set('_levelOffset', newOffset)\n\n try {\n // Render body with offset active\n const result = await renderNodes(node.body, options)\n return result\n } finally {\n // Always restore previous offset\n context.set('_levelOffset', previousOffset)\n }\n }\n\n default:\n // TypeScript exhaustiveness check\n const _exhaustive: never = node\n return _exhaustive\n }\n}\n\n/**\n * Determine if a value is truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n\n// ============================================================================\n// Preserve-mode helpers \u2014 round-trip AST back to Jinja source so an\n// undefined-referencing block can survive into the rendered output for\n// a downstream pass to resolve.\n// ============================================================================\n\n/**\n * Walk an expression AST, return the names of any `variable` references\n * whose context lookup is undefined. Empty array = all refs are bound.\n */\nfunction findUndefinedRefs(expr: Expression, context: Context): string[] {\n const out: string[] = []\n function walk(e: Expression): void {\n switch (e.type) {\n case 'variable':\n if (context.get(e.name) === undefined) out.push(e.name)\n break\n case 'binary':\n walk(e.left)\n walk(e.right)\n break\n case 'unary':\n walk(e.operand)\n break\n case 'literal':\n break\n }\n }\n walk(expr)\n return out\n}\n\n/**\n * Serialize an Expression back to Jinja source. Used by preserve mode\n * to reconstruct `{% if \u2026 %}` headers when the condition can't be\n * evaluated. Operator precedence isn't tracked; the output is\n * conservatively parenthesized for binary/unary so a re-parse round-\n * trips to the same AST shape (modulo redundant parens).\n */\nfunction expressionToSource(expr: Expression): string {\n switch (expr.type) {\n case 'literal':\n if (typeof expr.value === 'string') return JSON.stringify(expr.value)\n if (expr.value === null) return 'null'\n return String(expr.value)\n case 'variable':\n return expr.name\n case 'unary':\n return `not ${expressionToSource(expr.operand)}`\n case 'binary':\n return `(${expressionToSource(expr.left)} ${expr.operator} ${expressionToSource(expr.right)})`\n }\n}\n\n/**\n * Serialize ASTNode[] back to Jinja source. Mirrors the parser's syntax\n * for every node type so a preserved block can be re-rendered later\n * with the missing values supplied.\n *\n * Throws on shapes we don't support (deep nested includes, switch);\n * preserve mode is opt-in and a hard error here beats silent\n * truncation. The shapes covered are everything md2md emits in the\n * AsciiDoc pipeline.\n */\nfunction nodesToSource(nodes: ASTNode[]): string {\n return nodes.map(nodeToSource).join('')\n}\n\nfunction nodeToSource(node: ASTNode): string {\n switch (node.type) {\n case 'text':\n return node.value\n case 'variable':\n return `{{ ${node.name} }}`\n case 'set':\n return `{% set ${node.name} = ${expressionToSource(node.value)} %}`\n case 'comment':\n // Parser strips comment content; emit a placeholder so the block\n // structure round-trips even when the prose inside doesn't.\n return '{# \u2026 #}'\n case 'if':\n return ifNodeToSource(node)\n case 'include':\n return `{% include \"${node.path}\" %}`\n case 'leveloffset': {\n const sign = node.isRelative && node.offset >= 0 ? '+' : ''\n return `{% leveloffset ${sign}${node.offset} %}${nodesToSource(node.body)}{% endleveloffset %}`\n }\n case 'switch': {\n // Conservative round-trip; switch isn't on the AsciiDoc hot path\n // but we have an AST shape, so emit it.\n const cases = node.cases\n .map((c) => `{% case ${expressionToSource(c.value)} %}${nodesToSource(c.body)}`)\n .join('')\n return `{% switch ${expressionToSource(node.expression)} %}${cases}{% endswitch %}`\n }\n }\n}\n\nfunction ifNodeToSource(node: Extract<ASTNode, { type: 'if' }>): string {\n const parts = [`{% if ${expressionToSource(node.condition)} %}`, nodesToSource(node.trueBranch)]\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n parts.push(`{% elif ${expressionToSource(elif.condition)} %}`, nodesToSource(elif.body))\n }\n }\n if (node.elseBranch) {\n parts.push(`{% else %}`, nodesToSource(node.elseBranch))\n }\n parts.push(`{% endif %}`)\n return parts.join('')\n}\n", "/**\n * Memory-based loader for testing\n */\n\nimport type { Loader } from './types.js'\n\nexport class MemoryLoader implements Loader {\n private files: Map<string, string>\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map(Object.entries(files))\n }\n\n addFile(path: string, content: string): void {\n this.files.set(path, content)\n }\n\n async load(path: string, basePath?: string): Promise<string> {\n // Resolve path with normalization of . and .. segments\n const combined = basePath && !path.startsWith('/')\n ? `${basePath}/${path}`\n : path\n\n const parts = combined.split('/')\n const normalized: string[] = []\n for (const part of parts) {\n if (part === '.' || part === '') continue\n if (part === '..') { normalized.pop(); continue }\n normalized.push(part)\n }\n const prefix = combined.startsWith('/') ? '/' : ''\n const resolvedPath = prefix + normalized.join('/')\n\n const content = this.files.get(resolvedPath)\n\n if (content === undefined) {\n throw new Error(`File not found: ${resolvedPath}`)\n }\n\n return content\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Browser-only entry point (excludes FileSystemLoader)\n */\n\nexport { render } from './renderer.js'\nexport { parse } from './parser.js'\nexport { parseExpression, evaluateExpression } from './evaluator.js'\nexport { Context } from './context.js'\nexport { FetchLoader } from './loader-fetch.js'\nexport { MemoryLoader } from './loader-memory.js'\n\nexport type {\n // AST types\n ASTNode,\n TextNode,\n VariableNode,\n SetNode,\n IfNode,\n IncludeNode,\n CommentNode,\n\n // Expression types\n Expression,\n LiteralExpression,\n VariableExpression,\n BinaryExpression,\n UnaryExpression,\n\n // Options and interfaces\n RenderOptions,\n Loader,\n IContext,\n ParseResult,\n ParseError,\n} from './types.js'\n", "/**\n * Safe expression evaluator\n * Evaluates expressions WITHOUT using eval() or new Function()\n * Only allows whitelisted operations\n */\n\nimport type { Expression, IContext } from './types.js'\n\n/**\n * Parse an expression string into an Expression AST\n * @param expr - Expression string to parse\n * @returns Expression AST\n */\nexport function parseExpression(expr: string): Expression {\n expr = expr.trim()\n\n // Handle boolean literals\n if (expr === 'true') {\n return { type: 'literal', value: true }\n }\n if (expr === 'false') {\n return { type: 'literal', value: false }\n }\n if (expr === 'null') {\n return { type: 'literal', value: null }\n }\n\n // Handle string literals (double quotes)\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle string literals (single quotes)\n if (expr.startsWith(\"'\") && expr.endsWith(\"'\")) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle number literals\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { type: 'literal', value: parseFloat(expr) }\n }\n\n // Handle parenthesized expressions\n if (expr.startsWith('(') && expr.endsWith(')')) {\n // Check if parentheses are balanced for the entire expression\n let depth = 0\n let balanced = true\n\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++\n } else if (expr[i] === ')') {\n depth--\n }\n\n // If depth hits 0 before the end, the outer parens aren't wrapping everything\n if (depth === 0 && i < expr.length - 1) {\n balanced = false\n break\n }\n }\n\n // If balanced, unwrap and recursively parse\n if (balanced && depth === 0) {\n return parseExpression(expr.slice(1, -1))\n }\n }\n\n // Handle logical NOT\n if (expr.startsWith('not ')) {\n return {\n type: 'unary',\n operator: 'not',\n operand: parseExpression(expr.substring(4))\n }\n }\n\n // Handle logical OR (lowest precedence)\n const orMatch = findOperator(expr, ' or ')\n if (orMatch !== -1) {\n return {\n type: 'binary',\n operator: 'or',\n left: parseExpression(expr.substring(0, orMatch)),\n right: parseExpression(expr.substring(orMatch + 4))\n }\n }\n\n // Handle logical AND\n const andMatch = findOperator(expr, ' and ')\n if (andMatch !== -1) {\n return {\n type: 'binary',\n operator: 'and',\n left: parseExpression(expr.substring(0, andMatch)),\n right: parseExpression(expr.substring(andMatch + 5))\n }\n }\n\n // Handle comparison operators\n const comparisonOps = ['==', '!=', '<=', '>=', '<', '>']\n for (const op of comparisonOps) {\n const opMatch = findOperator(expr, ` ${op} `)\n if (opMatch !== -1) {\n return {\n type: 'binary',\n operator: op as '==' | '!=' | '<' | '>' | '<=' | '>=',\n left: parseExpression(expr.substring(0, opMatch)),\n right: parseExpression(expr.substring(opMatch + op.length + 2))\n }\n }\n }\n\n // Handle simple variable lookup (with dot notation).\n // Hyphens are allowed in identifiers so AsciiDoc-style attribute\n // names (`product-version`, `ptp-events-rest-api`) work inside\n // `{% if %}` conditions \u2014 they resolve via `hyphenToUnderscore` in\n // Context.get, just like `{{ product-version }}` interpolations.\n // Minja has no subtraction operator, so a `-` is never ambiguous\n // here; negative number literals are matched earlier.\n if (/^[\\w.-]+$/.test(expr)) {\n return { type: 'variable', name: expr }\n }\n\n // If we can't parse it, throw an error\n throw new Error(`Invalid expression: ${expr}`)\n}\n\n/**\n * Find the position of an operator, respecting string literals\n * @param expr - Expression string\n * @param operator - Operator to find\n * @returns Position of operator or -1 if not found\n */\nfunction findOperator(expr: string, operator: string): number {\n let inString: string | null = null\n let depth = 0\n\n for (let i = 0; i < expr.length; i++) {\n const char = expr[i]\n\n // Track string literals\n if ((char === '\"' || char === \"'\") && (i === 0 || expr[i - 1] !== '\\\\')) {\n if (inString === char) {\n inString = null\n } else if (inString === null) {\n inString = char\n }\n continue\n }\n\n // Track parentheses depth\n if (!inString) {\n if (char === '(') {\n depth++\n } else if (char === ')') {\n depth--\n }\n }\n\n // Look for operator at depth 0, outside strings\n if (!inString && depth === 0) {\n if (expr.substring(i, i + operator.length) === operator) {\n return i\n }\n }\n }\n\n return -1\n}\n\n/**\n * Evaluate an expression in a given context\n * @param expr - Expression to evaluate\n * @param context - Variable context\n * @returns Evaluated value\n */\nexport function evaluateExpression(expr: Expression, context: IContext): unknown {\n switch (expr.type) {\n case 'literal':\n return expr.value\n\n case 'variable':\n return context.get(expr.name)\n\n case 'binary': {\n const left = evaluateExpression(expr.left, context)\n const right = evaluateExpression(expr.right, context)\n\n switch (expr.operator) {\n case '==':\n // eslint-disable-next-line eqeqeq\n return left == right\n case '!=':\n // eslint-disable-next-line eqeqeq\n return left != right\n case '<':\n return (left as number) < (right as number)\n case '>':\n return (left as number) > (right as number)\n case '<=':\n return (left as number) <= (right as number)\n case '>=':\n return (left as number) >= (right as number)\n case 'and':\n return isTruthy(left) && isTruthy(right)\n case 'or':\n return isTruthy(left) || isTruthy(right)\n }\n break\n }\n\n case 'unary': {\n const operand = evaluateExpression(expr.operand, context)\n\n switch (expr.operator) {\n case 'not':\n return !isTruthy(operand)\n }\n break\n }\n }\n\n return undefined\n}\n\n/**\n * Determine if a value is truthy in template context\n * @param value - Value to check\n * @returns true if truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n", "/**\n * Template parser\n * Converts template strings into AST (Abstract Syntax Tree)\n */\n\nimport type { ASTNode, ParseResult, ParseError } from './types.js'\nimport { parseExpression } from './evaluator.js'\n\n/**\n * Parse a template string into an AST\n * @param template - Template string to parse\n * @returns Parse result with AST and errors\n */\nexport function parse(template: string): ParseResult {\n const errors: ParseError[] = []\n const ast: ASTNode[] = []\n\n let position = 0\n let line = 1\n let column = 1\n\n /**\n * Create a parse error\n */\n function createError(message: string): ParseError {\n return { message, position, line, column }\n }\n\n /**\n * Advance position tracking\n */\n function advance(count: number): void {\n for (let i = 0; i < count; i++) {\n if (template[position + i] === '\\n') {\n line++\n column = 1\n } else {\n column++\n }\n }\n position += count\n }\n\n /**\n * Find the next occurrence of a string\n */\n function findNext(str: string, from: number = position): number {\n return template.indexOf(str, from)\n }\n\n /**\n * Extract text between current position and a target position\n */\n function extractTo(target: number): string {\n const text = template.substring(position, target)\n advance(target - position)\n return text\n }\n\n while (position < template.length) {\n // Look for template tags\n const varStart = findNext('{{', position)\n const tagStart = findNext('{%', position)\n const commentStart = findNext('{#', position)\n\n // Find the nearest tag\n const candidates = [\n { pos: varStart, type: 'var' },\n { pos: tagStart, type: 'tag' },\n { pos: commentStart, type: 'comment' },\n ].filter((c) => c.pos !== -1)\n\n if (candidates.length === 0) {\n // No more tags, rest is text\n const text = template.substring(position)\n if (text) {\n ast.push({ type: 'text', value: text })\n }\n break\n }\n\n // Sort to find nearest\n candidates.sort((a, b) => a.pos - b.pos)\n const nearest = candidates[0]\n\n // Add text before tag\n if (nearest.pos > position) {\n ast.push({ type: 'text', value: extractTo(nearest.pos) })\n }\n\n // Parse the tag\n if (nearest.type === 'var') {\n // Variable: {{ name }}\n advance(2) // Skip {{\n const endPos = findNext('}}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed variable tag'))\n break\n }\n\n const varName = extractTo(endPos).trim()\n advance(2) // Skip }}\n\n ast.push({ type: 'variable', name: varName })\n } else if (nearest.type === 'comment') {\n // Comment: {# ... #}\n // Auto-strip newlines for comments (they produce no output)\n // Only strip if the comment is on its own line\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n // Only strip if previous text ends with newline (comment is on its own line)\n if (/\\n[ \\t]*$/.test(lastNode.value)) {\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t]*$/, '')\n }\n }\n\n advance(2) // Skip {#\n const endPos = findNext('#}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed comment tag'))\n break\n }\n\n const commentText = extractTo(endPos)\n advance(2) // Skip #}\n\n ast.push({ type: 'comment', value: commentText })\n\n // Auto-strip following newline if comment is on its own line\n if (position < template.length && template[position] === '\\n') {\n advance(1)\n // Also skip any indentation on the next line\n while (position < template.length && /[ \\t]/.test(template[position])) {\n advance(1)\n }\n }\n } else if (nearest.type === 'tag') {\n // Statement tag: {% ... %}\n advance(2) // Skip {%\n const endPos = findNext('%}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed statement tag'))\n break\n }\n\n let statement = extractTo(endPos).trim()\n\n // Check for whitespace control characters\n const hasLeftStrip = statement.startsWith('-')\n const hasRightStrip = statement.endsWith('-')\n\n // Strip whitespace control characters from statement\n if (hasLeftStrip) {\n statement = statement.substring(1).trim()\n // Strip trailing whitespace from previous text node\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t\\n]*$/, '')\n }\n }\n if (hasRightStrip) {\n statement = statement.substring(0, statement.length - 1).trim()\n }\n\n advance(2) // Skip %}\n\n // If right strip, consume following whitespace\n if (hasRightStrip) {\n while (position < template.length && /[ \\t\\n]/.test(template[position])) {\n advance(1)\n }\n }\n\n // Parse different statement types\n if (statement.startsWith('set ')) {\n // {% set var = value %}\n const setMatch = /^set\\s+(\\w+)\\s*=\\s*(.+)$/.exec(statement)\n if (setMatch) {\n try {\n const expr = parseExpression(setMatch[2])\n\n ast.push({\n type: 'set',\n name: setMatch[1],\n value: expr,\n })\n } catch (error) {\n errors.push(createError(`Invalid set expression: ${(error as Error).message}`))\n }\n } else {\n errors.push(createError('Invalid set syntax'))\n }\n } else if (statement.startsWith('if ')) {\n // {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}\n const condition = statement.substring(3).trim()\n\n try {\n const expr = parseExpression(condition)\n\n // Find the body and elif/else/endif blocks\n const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'if',\n condition: expr,\n trueBranch,\n elifBranches: elifBranches.length > 0 ? elifBranches : undefined,\n elseBranch: elseBranch.length > 0 ? elseBranch : undefined,\n })\n } catch (error) {\n errors.push(createError(`Invalid if expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('include ')) {\n // {% include \"path\" %}\n const includeMatch = /^include\\s+[\"']([^\"']+)[\"']/.exec(statement)\n if (includeMatch) {\n ast.push({\n type: 'include',\n path: includeMatch[1],\n })\n } else {\n errors.push(createError('Invalid include syntax'))\n }\n } else if (statement.startsWith('switch ')) {\n // {% switch variable %} ... {% case \"value\" %} ... {% endswitch %}\n const switchExpr = statement.substring(7).trim()\n\n try {\n const expr = parseExpression(switchExpr)\n const { cases, parseErrors } = parseSwitchBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'switch',\n expression: expr,\n cases,\n })\n } catch (error) {\n errors.push(createError(`Invalid switch expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('leveloffset ')) {\n // {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}\n const offsetMatch = /^leveloffset\\s+([-+]?\\d+)$/.exec(statement)\n\n if (!offsetMatch) {\n errors.push(createError('Invalid leveloffset syntax'))\n } else {\n const offsetStr = offsetMatch[1]\n const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-')\n const offset = parseInt(offsetStr, 10)\n\n if (isNaN(offset)) {\n errors.push(createError('Invalid leveloffset value'))\n } else {\n // Find matching endleveloffset accounting for nesting\n let depth = 0\n let searchPos = position\n let endPos = -1\n\n while (searchPos < template.length) {\n const leveloffsetMatch = /{%-?\\s*leveloffset\\s+[-+]?\\d+\\s*-?%}/.exec(template.substring(searchPos))\n const endleveloffsetMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(searchPos))\n\n const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity\n const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity\n\n if (leveloffsetPos < endleveloffsetPos) {\n // Found nested leveloffset\n depth++\n searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0)\n } else if (endleveloffsetPos < Infinity) {\n // Found endleveloffset\n if (depth === 0) {\n // This is our matching endleveloffset\n endPos = endleveloffsetPos\n break\n } else {\n depth--\n searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0)\n }\n } else {\n // No more tags found\n break\n }\n }\n\n if (endPos === -1) {\n errors.push(createError('Missing endleveloffset'))\n } else {\n const bodyTemplate = extractTo(endPos)\n // Find and skip the endleveloffset tag\n const endMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(position))\n if (endMatch) {\n advance(endMatch[0].length)\n }\n\n const bodyResult = parse(bodyTemplate)\n errors.push(...bodyResult.errors)\n\n ast.push({\n type: 'leveloffset',\n offset,\n isRelative,\n body: bodyResult.ast,\n })\n }\n }\n }\n }\n // Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags\n }\n }\n\n return { ast, errors }\n\n /**\n * Find an end tag like {% endif %}\n */\n function findEndTag(tagName: string): { start: number; length: number } | null {\n const pattern = new RegExp(`{%\\\\s*${tagName}\\\\s*%}`)\n const match = pattern.exec(template.substring(position))\n\n if (match) {\n return {\n start: position + match.index,\n length: match[0].length,\n }\n }\n\n return null\n }\n\n /**\n * Parse an if block with elif and else support\n */\n function parseIfBlock(): {\n trueBranch: ASTNode[]\n elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }>\n elseBranch: ASTNode[]\n parseErrors: ParseError[]\n } {\n const elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n let elseBranch: ASTNode[] = []\n\n // Find the next elif, else, or endif\n let depth = 0\n let searchPos = position\n\n while (searchPos < template.length) {\n const ifMatch = /{%-?\\s*if\\s+/.exec(template.substring(searchPos))\n const elifMatch = /{%-?\\s*elif\\s+/.exec(template.substring(searchPos))\n const elseMatch = /{%-?\\s*else\\s*-?%}/.exec(template.substring(searchPos))\n const endifMatch = /{%-?\\s*endif\\s*-?%}/.exec(template.substring(searchPos))\n\n // Find the nearest match\n const matches = [\n { type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },\n { type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },\n { type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },\n { type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },\n ].sort((a, b) => a.pos - b.pos)\n\n const nearest = matches[0]\n\n if (!nearest.match || nearest.pos === Infinity) {\n parseErrors.push(createError('Missing endif'))\n break\n }\n\n if (nearest.type === 'if') {\n depth++\n searchPos = nearest.pos + nearest.match[0].length\n } else if (nearest.type === 'endif') {\n if (depth === 0) {\n // This is our endif\n const bodyTemplate = extractTo(nearest.pos)\n advance(nearest.match[0].length)\n\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n\n return {\n trueBranch: bodyResult.ast,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } else {\n depth--\n searchPos = nearest.pos + nearest.match[0].length\n }\n } else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {\n // Parse the body before elif/else\n const bodyTemplate = extractTo(nearest.pos)\n const bodyResult = parse(bodyTemplate)\n\n if (elifBranches.length === 0 && elseBranch.length === 0) {\n // This is the trueBranch (before first elif/else)\n parseErrors.push(...bodyResult.errors)\n const trueBranch = bodyResult.ast\n\n // Now handle elif or else\n if (nearest.type === 'elif') {\n // Extract elif condition\n advance(nearest.match[0].length)\n const condMatch = /^([^%]+)%}/.exec(template.substring(position))\n if (condMatch) {\n const condStr = condMatch[1].trim()\n advance(condMatch[0].length)\n\n try {\n const elifCondition = parseExpression(condStr)\n const elifResult = parseIfBlock()\n parseErrors.push(...elifResult.parseErrors)\n\n elifBranches.push({\n condition: elifCondition,\n body: elifResult.trueBranch,\n })\n elifBranches.push(...(elifResult.elifBranches || []))\n elseBranch = elifResult.elseBranch\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } catch (error) {\n parseErrors.push(createError(`Invalid elif expression: ${(error as Error).message}`))\n }\n }\n } else {\n // else\n advance(nearest.match[0].length)\n\n // Find endif for else block\n const endifMatch = findEndTag('endif')\n if (!endifMatch) {\n parseErrors.push(createError('Missing endif after else'))\n } else {\n const elseBodyTemplate = extractTo(endifMatch.start)\n advance(endifMatch.length)\n\n const elseBodyResult = parse(elseBodyTemplate)\n parseErrors.push(...elseBodyResult.errors)\n elseBranch = elseBodyResult.ast\n }\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n }\n } else {\n searchPos = nearest.pos + nearest.match[0].length\n }\n }\n\n return {\n trueBranch: [],\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n\n /**\n * Parse a switch block with case support\n */\n function parseSwitchBlock(): {\n cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }>\n parseErrors: ParseError[]\n } {\n const cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n\n while (position < template.length) {\n // Find the next case or endswitch\n const caseMatch = /{%-?\\s*case\\s+/.exec(template.substring(position))\n const endswitchMatch = /{%-?\\s*endswitch\\s*-?%}/.exec(template.substring(position))\n\n // Find which comes first\n const casePos = caseMatch ? position + caseMatch.index : Infinity\n const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity\n\n if (endswitchPos < casePos) {\n // Found endswitch before any case (or no case)\n // Parse any remaining content before endswitch as the last case body\n if (cases.length > 0 && position < endswitchPos) {\n const bodyTemplate = extractTo(endswitchPos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n }\n\n // Skip endswitch\n advance(endswitchPos - position + (endswitchMatch?.[0].length || 0))\n break\n } else if (casePos < Infinity) {\n // Found a case\n // If there's a previous case, parse its body\n if (cases.length > 0 && position < casePos) {\n const bodyTemplate = extractTo(casePos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n } else if (position < casePos) {\n // Content before first case - skip it\n extractTo(casePos)\n }\n\n // Parse the case value\n advance(caseMatch![0].length)\n\n // Extract the case value (until %})\n const valueMatch = /([^%]+)%}/.exec(template.substring(position))\n if (valueMatch) {\n const valueStr = valueMatch[1].trim()\n advance(valueMatch[0].length)\n\n try {\n const caseValue = parseExpression(valueStr)\n cases.push({\n value: caseValue,\n body: [], // Will be filled in next iteration or at endswitch\n })\n } catch (error) {\n parseErrors.push(createError(`Invalid case value: ${(error as Error).message}`))\n }\n } else {\n parseErrors.push(createError('Invalid case syntax'))\n break\n }\n } else {\n // No case or endswitch found\n parseErrors.push(createError('Missing endswitch'))\n break\n }\n }\n\n return { cases, parseErrors }\n }\n}\n", "/**\n * Context management for variable scoping\n * Supports nested scopes with inheritance\n */\n\nimport type { IContext } from './types.js'\n\nexport interface ContextOptions {\n /**\n * Convert hyphenated variable names to underscores during lookup.\n */\n hyphenToUnderscore?: boolean\n}\n\nexport class Context implements IContext {\n private variables: Map<string, unknown>\n private parent: Context | null\n private options: ContextOptions\n\n constructor(parent?: Context, options?: ContextOptions) {\n this.variables = new Map()\n this.parent = parent || null\n this.options = options || parent?.options || {}\n }\n\n /**\n * Get a variable from the context (supports dot notation)\n * @param name - Variable name (can use dot notation like \"obj.prop.subprop\")\n * @returns The variable value or undefined\n */\n get(name: string): unknown {\n // Convert hyphens to underscores if option is enabled\n const normalizedName = this.options.hyphenToUnderscore\n ? name.replace(/-/g, '_')\n : name\n\n const parts = normalizedName.split('.')\n const rootName = parts[0]\n\n // Look up the root variable in current scope or parent scopes\n let value: unknown\n if (this.variables.has(rootName)) {\n value = this.variables.get(rootName)\n } else if (this.parent) {\n value = this.parent.get(rootName)\n } else {\n return undefined\n }\n\n // Navigate nested properties\n for (let i = 1; i < parts.length; i++) {\n if (value === null || value === undefined) {\n return undefined\n }\n\n // Only allow property access on plain objects (prevent prototype pollution)\n if (typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n // Prevent access to prototype chain\n if (!Object.prototype.hasOwnProperty.call(value, parts[i])) {\n return undefined\n }\n\n value = (value as Record<string, unknown>)[parts[i]]\n }\n\n return value\n }\n\n /**\n * Set a variable in the current context\n * @param name - Variable name (can use dot notation)\n * @param value - Value to set\n */\n set(name: string, value: unknown): void {\n const parts = name.split('.')\n\n if (parts.length === 1) {\n // Simple assignment\n this.variables.set(name, value)\n return\n }\n\n // Nested assignment - navigate to parent object\n const rootName = parts[0]\n let target = this.variables.get(rootName) as Record<string, unknown> | undefined\n\n if (!target || typeof target !== 'object' || Array.isArray(target)) {\n // Create new object if root doesn't exist or isn't an object\n target = {}\n this.variables.set(rootName, target)\n }\n\n // Navigate to the parent of the target property\n for (let i = 1; i < parts.length - 1; i++) {\n const key = parts[i]\n\n if (\n !target[key] ||\n typeof target[key] !== 'object' ||\n Array.isArray(target[key])\n ) {\n target[key] = {}\n }\n\n target = target[key] as Record<string, unknown>\n }\n\n // Set the final property\n target[parts[parts.length - 1]] = value\n }\n\n /**\n * Create a child scope\n * @returns A new Context with this context as parent\n */\n push(): Context {\n return new Context(this, this.options)\n }\n\n /**\n * Return to parent scope\n * @returns The parent context or null if at root\n */\n pop(): Context | null {\n return this.parent\n }\n\n /**\n * Create a context from a plain object\n * @param data - Plain object to convert to context\n * @param options - Context options\n * @returns New Context instance\n */\n static from(data: Record<string, unknown>, options?: ContextOptions): Context {\n const ctx = new Context(undefined, options)\n for (const [key, value] of Object.entries(data)) {\n ctx.set(key, value)\n }\n return ctx\n }\n}\n", "/**\n * Fetch-based loader for browsers and service workers\n */\n\nimport type { Loader } from './types.js'\n\nexport class FetchLoader implements Loader {\n async load(path: string, basePath?: string): Promise<string> {\n const url = basePath ? new URL(path, basePath).href : path\n const fetchUrl = `${url}?preventCache=${Date.now()}`\n\n const response = await fetch(fetchUrl)\n\n if (!response.ok) {\n throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`)\n }\n\n return await response.text()\n }\n}\n", "/**\n * Template renderer\n * Combines parser, evaluator, and loader to render templates\n */\n\nimport type { ASTNode, Expression, RenderOptions, Loader } from './types.js'\nimport { parse } from './parser.js'\nimport { Context } from './context.js'\nimport { evaluateExpression } from './evaluator.js'\nimport { FetchLoader } from './loader-fetch.js'\n\n/**\n * Transform markdown headings by applying level offset\n * Clamps to valid markdown range (1-6)\n * @param text - Text content to transform\n * @param offset - Level offset to apply\n * @returns Transformed text with adjusted heading levels\n */\nfunction transformHeadings(text: string, offset: number): string {\n if (offset === 0) {\n return text\n }\n\n // Match markdown headings: # through ######\n return text.replace(/^(#{1,6})(\\s+)/gm, (_match, hashes, space) => {\n const currentLevel = hashes.length\n const newLevel = Math.max(1, Math.min(6, currentLevel + offset))\n return '#'.repeat(newLevel) + space\n })\n}\n\n/**\n * Resolve a relative path against a base path\n * @param path - Relative or absolute path\n * @param basePath - Base path to resolve against\n * @returns Resolved path\n */\nfunction resolvePath(path: string, basePath: string): string {\n // If path is absolute, return as-is\n if (path.startsWith('/')) {\n return path\n }\n\n // Ensure basePath ends with /\n const base = basePath.endsWith('/') ? basePath : basePath + '/'\n\n // Combine and normalize\n const combined = base + path\n\n // Normalize . and .. segments\n const parts = combined.split('/')\n const resolved: string[] = []\n\n for (const part of parts) {\n if (part === '.' || part === '') {\n continue\n } else if (part === '..') {\n resolved.pop()\n } else {\n resolved.push(part)\n }\n }\n\n // Preserve leading slash if original had one\n const prefix = combined.startsWith('/') ? '/' : ''\n return prefix + resolved.join('/')\n}\n\n/**\n * Render a template string\n * @param template - Template string to render\n * @param options - Render options\n * @returns Rendered output\n */\nexport async function render(template: string, options: RenderOptions = {}): Promise<string> {\n const {\n loader = new FetchLoader(),\n context: initialContext = {},\n basePath = '',\n maxIncludeDepth = 10,\n timeout = 5000,\n hyphenToUnderscore = false,\n undefinedBehavior = 'empty',\n undefinedConditions = 'preserve',\n } = options\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Template rendering timeout')), timeout)\n })\n\n // Render with timeout\n const renderPromise = renderInternal(template, {\n loader,\n context: Context.from(\n {\n ...initialContext,\n // Built-in variables\n date: new Date().toISOString().split('T')[0],\n timestamp: Date.now(),\n _levelOffset: 0,\n },\n { hyphenToUnderscore }\n ),\n includeDepth: 0,\n maxIncludeDepth,\n basePath,\n undefinedBehavior,\n undefinedConditions,\n })\n\n return await Promise.race([renderPromise, timeoutPromise])\n}\n\ninterface InternalRenderOptions {\n loader: Loader\n context: Context\n includeDepth: number\n maxIncludeDepth: number\n basePath: string\n undefinedBehavior: 'empty' | 'throw' | 'preserve'\n undefinedConditions: 'preserve' | 'falsy'\n}\n\n/**\n * Internal rendering function with depth tracking\n */\nasync function renderInternal(\n template: string,\n options: InternalRenderOptions\n): Promise<string> {\n const { includeDepth, maxIncludeDepth } = options\n\n // Check recursion depth\n if (includeDepth > maxIncludeDepth) {\n throw new Error(`Maximum include depth (${maxIncludeDepth}) exceeded`)\n }\n\n // Parse template\n const parseResult = parse(template)\n\n if (parseResult.errors.length > 0) {\n const errorMessages = parseResult.errors.map((e) => e.message).join(', ')\n throw new Error(`Parse errors: ${errorMessages}`)\n }\n\n // Render AST\n return await renderNodes(parseResult.ast, options)\n}\n\n/**\n * Render an array of AST nodes\n */\nasync function renderNodes(nodes: ASTNode[], options: InternalRenderOptions): Promise<string> {\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(await renderNode(node, options))\n }\n\n return parts.join('')\n}\n\n/**\n * Render a single AST node\n */\nasync function renderNode(node: ASTNode, options: InternalRenderOptions): Promise<string> {\n const { loader, context, includeDepth, maxIncludeDepth, basePath } = options\n\n switch (node.type) {\n case 'text': {\n // Apply leveloffset if active\n const currentOffset = context.get('_levelOffset') as number || 0\n if (currentOffset === 0) {\n return node.value\n }\n return transformHeadings(node.value, currentOffset)\n }\n\n case 'variable': {\n const value = context.get(node.name)\n if (value === undefined || value === null) {\n // Apply the undefined-variable policy. See RenderOptions.undefinedBehavior.\n switch (options.undefinedBehavior) {\n case 'throw':\n throw new Error(`Undefined variable: ${node.name}`)\n case 'preserve':\n // Round-trip the source form so downstream tooling (or a\n // second-pass minja run with the value supplied) can pick\n // up where we left off.\n return `{{ ${node.name} }}`\n case 'empty':\n default:\n return ''\n }\n }\n const str = String(value)\n // If the value contains template syntax, re-process it\n if (str.includes('{{') || str.includes('{%')) {\n return await renderInternal(str, options)\n }\n return str\n }\n\n case 'set': {\n const value = evaluateExpression(node.value, context)\n context.set(node.name, value)\n return ''\n }\n\n case 'comment':\n return ''\n\n case 'if': {\n // In preserve mode, an `if` whose condition references an\n // undefined identifier can't be evaluated \u2014 we don't know\n // which branch to take. Preserve the whole `{% if \u2026 %}\u2026{% endif %}`\n // verbatim so a second pass (with the value supplied) can\n // resolve it. See plans/format-asciidoc-import.md.\n //\n // Except when `undefinedConditions === 'falsy'`: this is a\n // terminal build with no later pass, so treat the undefined\n // reference as falsy (AsciiDoc `ifdef::attr[]` semantics) and\n // evaluate now rather than leak the directive to readers.\n if (options.undefinedBehavior === 'preserve' && options.undefinedConditions !== 'falsy') {\n const undefinedRefs = findUndefinedRefs(node.condition, context)\n if (undefinedRefs.length > 0) {\n return ifNodeToSource(node)\n }\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n if (findUndefinedRefs(elif.condition, context).length > 0) {\n return ifNodeToSource(node)\n }\n }\n }\n }\n\n const condition = evaluateExpression(node.condition, context)\n\n if (isTruthy(condition)) {\n return await renderNodes(node.trueBranch, options)\n }\n\n // Check elif branches\n if (node.elifBranches) {\n for (const elifBranch of node.elifBranches) {\n const elifCondition = evaluateExpression(elifBranch.condition, context)\n if (isTruthy(elifCondition)) {\n return await renderNodes(elifBranch.body, options)\n }\n }\n }\n\n // Render else branch if present\n if (node.elseBranch) {\n return await renderNodes(node.elseBranch, options)\n }\n\n return ''\n }\n\n case 'include': {\n try {\n // Load the included file\n const includedContent = await loader.load(node.path, basePath)\n\n // Determine new base path for nested includes\n let newBasePath = basePath\n\n // If path looks like a URL, extract base\n if (node.path.includes('://')) {\n const url = new URL(node.path)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else if (basePath) {\n // Relative path - resolve against current base\n if (basePath.includes('://')) {\n const url = new URL(node.path, basePath)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else {\n // File path - resolve relative to current base and extract directory\n const resolvedPath = resolvePath(node.path, basePath)\n const lastSlash = resolvedPath.lastIndexOf('/')\n newBasePath = lastSlash >= 0 ? resolvedPath.substring(0, lastSlash + 1) : basePath\n }\n } else if (node.path.includes('/')) {\n // No base path but include has directory - use that as base\n const lastSlash = node.path.lastIndexOf('/')\n newBasePath = node.path.substring(0, lastSlash + 1)\n }\n\n // Render the included template (recursive)\n return await renderInternal(includedContent, {\n loader,\n context,\n includeDepth: includeDepth + 1,\n maxIncludeDepth,\n basePath: newBasePath,\n undefinedBehavior: options.undefinedBehavior,\n undefinedConditions: options.undefinedConditions,\n })\n } catch (error) {\n // In `preserve` mode, an unresolvable include is preserved\n // as the original directive so a later renderer pass (with\n // the file in place) can resolve it. Matches the semantic\n // of `preserve` for undefined variables. Without this,\n // multi-stage pipelines (e.g. dogsbay's convert + build\n // preprocessor for AsciiDoc imports) lose the directive at\n // stage 1 because targets only exist after stage 2 has\n // converted sibling files.\n if (options.undefinedBehavior === 'preserve') {\n return `{% include \"${node.path}\" %}`\n }\n const message = error instanceof Error ? error.message : String(error)\n console.error(`Failed to include ${node.path}:`, message)\n return `<!-- Include error: ${node.path} -->`\n }\n }\n\n case 'switch': {\n const switchValue = evaluateExpression(node.expression, context)\n\n // Find matching case\n for (const caseItem of node.cases) {\n const caseValue = evaluateExpression(caseItem.value, context)\n // eslint-disable-next-line eqeqeq\n if (switchValue == caseValue) {\n return await renderNodes(caseItem.body, options)\n }\n }\n\n // No matching case found\n return ''\n }\n\n case 'leveloffset': {\n // Calculate new offset (relative or absolute)\n const parentOffset = context.get('_levelOffset') as number || 0\n const newOffset = node.isRelative ? parentOffset + node.offset : node.offset\n\n // Store current offset to restore later\n const previousOffset = parentOffset\n\n // Set new offset in context\n context.set('_levelOffset', newOffset)\n\n try {\n // Render body with offset active\n const result = await renderNodes(node.body, options)\n return result\n } finally {\n // Always restore previous offset\n context.set('_levelOffset', previousOffset)\n }\n }\n\n default:\n // TypeScript exhaustiveness check\n const _exhaustive: never = node\n return _exhaustive\n }\n}\n\n/**\n * Determine if a value is truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n\n// ============================================================================\n// Preserve-mode helpers \u2014 round-trip AST back to Jinja source so an\n// undefined-referencing block can survive into the rendered output for\n// a downstream pass to resolve.\n// ============================================================================\n\n/**\n * Walk an expression AST, return the names of any `variable` references\n * whose context lookup is undefined. Empty array = all refs are bound.\n */\nfunction findUndefinedRefs(expr: Expression, context: Context): string[] {\n const out: string[] = []\n function walk(e: Expression): void {\n switch (e.type) {\n case 'variable':\n if (context.get(e.name) === undefined) out.push(e.name)\n break\n case 'binary':\n walk(e.left)\n walk(e.right)\n break\n case 'unary':\n walk(e.operand)\n break\n case 'literal':\n break\n }\n }\n walk(expr)\n return out\n}\n\n/**\n * Serialize an Expression back to Jinja source. Used by preserve mode\n * to reconstruct `{% if \u2026 %}` headers when the condition can't be\n * evaluated. Operator precedence isn't tracked; the output is\n * conservatively parenthesized for binary/unary so a re-parse round-\n * trips to the same AST shape (modulo redundant parens).\n */\nfunction expressionToSource(expr: Expression): string {\n switch (expr.type) {\n case 'literal':\n if (typeof expr.value === 'string') return JSON.stringify(expr.value)\n if (expr.value === null) return 'null'\n return String(expr.value)\n case 'variable':\n return expr.name\n case 'unary':\n return `not ${expressionToSource(expr.operand)}`\n case 'binary':\n return `(${expressionToSource(expr.left)} ${expr.operator} ${expressionToSource(expr.right)})`\n }\n}\n\n/**\n * Serialize ASTNode[] back to Jinja source. Mirrors the parser's syntax\n * for every node type so a preserved block can be re-rendered later\n * with the missing values supplied.\n *\n * Throws on shapes we don't support (deep nested includes, switch);\n * preserve mode is opt-in and a hard error here beats silent\n * truncation. The shapes covered are everything md2md emits in the\n * AsciiDoc pipeline.\n */\nfunction nodesToSource(nodes: ASTNode[]): string {\n return nodes.map(nodeToSource).join('')\n}\n\nfunction nodeToSource(node: ASTNode): string {\n switch (node.type) {\n case 'text':\n return node.value\n case 'variable':\n return `{{ ${node.name} }}`\n case 'set':\n return `{% set ${node.name} = ${expressionToSource(node.value)} %}`\n case 'comment':\n // Parser strips comment content; emit a placeholder so the block\n // structure round-trips even when the prose inside doesn't.\n return '{# \u2026 #}'\n case 'if':\n return ifNodeToSource(node)\n case 'include':\n return `{% include \"${node.path}\" %}`\n case 'leveloffset': {\n const sign = node.isRelative && node.offset >= 0 ? '+' : ''\n return `{% leveloffset ${sign}${node.offset} %}${nodesToSource(node.body)}{% endleveloffset %}`\n }\n case 'switch': {\n // Conservative round-trip; switch isn't on the AsciiDoc hot path\n // but we have an AST shape, so emit it.\n const cases = node.cases\n .map((c) => `{% case ${expressionToSource(c.value)} %}${nodesToSource(c.body)}`)\n .join('')\n return `{% switch ${expressionToSource(node.expression)} %}${cases}{% endswitch %}`\n }\n }\n}\n\nfunction ifNodeToSource(node: Extract<ASTNode, { type: 'if' }>): string {\n const parts = [`{% if ${expressionToSource(node.condition)} %}`, nodesToSource(node.trueBranch)]\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n parts.push(`{% elif ${expressionToSource(elif.condition)} %}`, nodesToSource(elif.body))\n }\n }\n if (node.elseBranch) {\n parts.push(`{% else %}`, nodesToSource(node.elseBranch))\n }\n parts.push(`{% endif %}`)\n return parts.join('')\n}\n", "/**\n * Memory-based loader for testing\n */\n\nimport type { Loader } from './types.js'\n\nexport class MemoryLoader implements Loader {\n private files: Map<string, string>\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map(Object.entries(files))\n }\n\n addFile(path: string, content: string): void {\n this.files.set(path, content)\n }\n\n async load(path: string, basePath?: string): Promise<string> {\n // Resolve path with normalization of . and .. segments\n const combined = basePath && !path.startsWith('/')\n ? `${basePath}/${path}`\n : path\n\n const parts = combined.split('/')\n const normalized: string[] = []\n for (const part of parts) {\n if (part === '.' || part === '') continue\n if (part === '..') { normalized.pop(); continue }\n normalized.push(part)\n }\n const prefix = combined.startsWith('/') ? '/' : ''\n const resolvedPath = prefix + normalized.join('/')\n\n const content = this.files.get(resolvedPath)\n\n if (content === undefined) {\n throw new Error(`File not found: ${resolvedPath}`)\n }\n\n return content\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["endPos", "endifMatch", "isTruthy"]
|
|
7
7
|
}
|
package/dist/index.umd.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* minja v0.2.0-beta.
|
|
2
|
+
* minja v0.2.0-beta.50
|
|
3
3
|
* Minimal, secure Jinja2/Nunjucks subset for documentation preprocessing
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
6
|
-
"use strict";var minja=(()=>{var
|
|
7
|
-
`?(i++,r=1):r++;t+=h}function u(h,
|
|
8
|
-
`)for(c(1);t<e.length&&/[ \t]/.test(e[t]);)c(1)}else if(d.type==="tag"){c(2);let g=u("%}",t);if(g===-1){s.push(o("Unclosed statement tag"));break}let f=a(g).trim(),w=f.startsWith("-"),I=f.endsWith("-");if(w&&(f=f.substring(1).trim(),n.length>0&&n[n.length-1].type==="text")){let b=n[n.length-1];b.value=b.value.replace(/[ \t]*\n[ \t\n]*$/,"")}if(I&&(f=f.substring(0,f.length-1).trim()),c(2),I)for(;t<e.length&&/[ \t\n]/.test(e[t]);)c(1);if(f.startsWith("set ")){let b=/^set\s+(\w+)\s*=\s*(.+)$/.exec(f);if(b)try{let l=x(b[2]);n.push({type:"set",name:b[1],value:l})}catch(l){s.push(o(`Invalid set expression: ${l.message}`))}else s.push(o("Invalid set syntax"))}else if(f.startsWith("if ")){let b=f.substring(3).trim();try{let l=x(b),{trueBranch:S,elifBranches:E,elseBranch:k,parseErrors:v}=O();s.push(...v),n.push({type:"if",condition:l,trueBranch:S,elifBranches:E.length>0?E:void 0,elseBranch:k.length>0?k:void 0})}catch(l){s.push(o(`Invalid if expression: ${l.message}`))}}else if(f.startsWith("include ")){let b=/^include\s+["']([^"']+)["']/.exec(f);b?n.push({type:"include",path:b[1]}):s.push(o("Invalid include syntax"))}else if(f.startsWith("switch ")){let b=f.substring(7).trim();try{let l=x(b),{cases:S,parseErrors:E}=F();s.push(...E),n.push({type:"switch",expression:l,cases:S})}catch(l){s.push(o(`Invalid switch expression: ${l.message}`))}}else if(f.startsWith("leveloffset ")){let b=/^leveloffset\s+([-+]?\d+)$/.exec(f);if(!b)s.push(o("Invalid leveloffset syntax"));else{let l=b[1],S=l.startsWith("+")||l.startsWith("-"),E=parseInt(l,10);if(isNaN(E))s.push(o("Invalid leveloffset value"));else{let k=0,v=t,M=-1;for(;v<e.length;){let B=/{%-?\s*leveloffset\s+[-+]?\d+\s*-?%}/.exec(e.substring(v)),T=/{%-?\s*endleveloffset\s*-?%}/.exec(e.substring(v)),W=B?v+B.index:1/0,D=T?v+T.index:1/0;if(W<D)k++,v=W+(B?.[0].length||0);else if(D<1/0)if(k===0){M=D;break}else k--,v=D+(T?.[0].length||0);else break}if(M===-1)s.push(o("Missing endleveloffset"));else{let B=a(M),T=/{%-?\s*endleveloffset\s*-?%}/.exec(e.substring(t));T&&c(T[0].length);let W=N(B);s.push(...W.errors),n.push({type:"leveloffset",offset:E,isRelative:S,body:W.ast})}}}}}}return{ast:n,errors:s};function y(h){let m=new RegExp(`{%\\s*${h}\\s*%}`).exec(e.substring(t));return m?{start:t+m.index,length:m[0].length}:null}function O(){let h=[],p=[],m=[],$=0,d=t;for(;d<e.length;){let g=/{%-?\s*if\s+/.exec(e.substring(d)),f=/{%-?\s*elif\s+/.exec(e.substring(d)),w=/{%-?\s*else\s*-?%}/.exec(e.substring(d)),I=/{%-?\s*endif\s*-?%}/.exec(e.substring(d)),l=[{type:"if",match:g,pos:g?d+g.index:1/0},{type:"elif",match:f,pos:f?d+f.index:1/0},{type:"else",match:w,pos:w?d+w.index:1/0},{type:"endif",match:I,pos:I?d+I.index:1/0}].sort((S,E)=>S.pos-E.pos)[0];if(!l.match||l.pos===1/0){p.push(o("Missing endif"));break}if(l.type==="if")$++,d=l.pos+l.match[0].length;else if(l.type==="endif")if($===0){let S=a(l.pos);c(l.match[0].length);let E=N(S);return p.push(...E.errors),{trueBranch:E.ast,elifBranches:h,elseBranch:m,parseErrors:p}}else $--,d=l.pos+l.match[0].length;else if($===0&&(l.type==="elif"||l.type==="else")){let S=a(l.pos),E=N(S);if(h.length===0&&m.length===0){p.push(...E.errors);let k=E.ast;if(l.type==="elif"){c(l.match[0].length);let v=/^([^%]+)%}/.exec(e.substring(t));if(v){let M=v[1].trim();c(v[0].length);try{let B=x(M),T=O();return p.push(...T.parseErrors),h.push({condition:B,body:T.trueBranch}),h.push(...T.elifBranches||[]),m=T.elseBranch,{trueBranch:k,elifBranches:h,elseBranch:m,parseErrors:p}}catch(B){p.push(o(`Invalid elif expression: ${B.message}`))}}}else{c(l.match[0].length);let v=y("endif");if(!v)p.push(o("Missing endif after else"));else{let M=a(v.start);c(v.length);let B=N(M);p.push(...B.errors),m=B.ast}return{trueBranch:k,elifBranches:h,elseBranch:m,parseErrors:p}}}}else d=l.pos+l.match[0].length}return{trueBranch:[],elifBranches:h,elseBranch:m,parseErrors:p}}function F(){let h=[],p=[];for(;t<e.length;){let m=/{%-?\s*case\s+/.exec(e.substring(t)),$=/{%-?\s*endswitch\s*-?%}/.exec(e.substring(t)),d=m?t+m.index:1/0,g=$?t+$.index:1/0;if(g<d){if(h.length>0&&t<g){let f=a(g),w=N(f);p.push(...w.errors),h[h.length-1].body=w.ast}c(g-t+($?.[0].length||0));break}else if(d<1/0){if(h.length>0&&t<d){let w=a(d),I=N(w);p.push(...I.errors),h[h.length-1].body=I.ast}else t<d&&a(d);c(m[0].length);let f=/([^%]+)%}/.exec(e.substring(t));if(f){let w=f[1].trim();c(f[0].length);try{let I=x(w);h.push({value:I,body:[]})}catch(I){p.push(o(`Invalid case value: ${I.message}`))}}else{p.push(o("Invalid case syntax"));break}}else{p.push(o("Missing endswitch"));break}}return{cases:h,parseErrors:p}}}var A=class e{constructor(s,n){this.variables=new Map,this.parent=s||null,this.options=n||s?.options||{}}get(s){let t=(this.options.hyphenToUnderscore?s.replace(/-/g,"_"):s).split("."),i=t[0],r;if(this.variables.has(i))r=this.variables.get(i);else if(this.parent)r=this.parent.get(i);else return;for(let o=1;o<t.length;o++){if(r==null||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,t[o]))return;r=r[t[o]]}return r}set(s,n){let t=s.split(".");if(t.length===1){this.variables.set(s,n);return}let i=t[0],r=this.variables.get(i);(!r||typeof r!="object"||Array.isArray(r))&&(r={},this.variables.set(i,r));for(let o=1;o<t.length-1;o++){let c=t[o];(!r[c]||typeof r[c]!="object"||Array.isArray(r[c]))&&(r[c]={}),r=r[c]}r[t[t.length-1]]=n}push(){return new e(this,this.options)}pop(){return this.parent}static from(s,n){let t=new e(void 0,n);for(let[i,r]of Object.entries(s))t.set(i,r);return t}};var j=class{async load(s,n){let t=n?new URL(s,n).href:s,i=`${t}?preventCache=${Date.now()}`,r=await fetch(i);if(!r.ok)throw new Error(`Failed to load ${t}: ${r.status} ${r.statusText}`);return await r.text()}};function se(e,s){return s===0?e:e.replace(/^(#{1,6})(\s+)/gm,(n,t,i)=>{let r=t.length,o=Math.max(1,Math.min(6,r+s));return"#".repeat(o)+i})}function ne(e,s){if(e.startsWith("/"))return e;let t=(s.endsWith("/")?s:s+"/")+e,i=t.split("/"),r=[];for(let c of i)c==="."||c===""||(c===".."?r.pop():r.push(c));return(t.startsWith("/")?"/":"")+r.join("/")}async function K(e,s={}){let{loader:n=new j,context:t={},basePath:i="",maxIncludeDepth:r=10,timeout:o=5e3,hyphenToUnderscore:c=!1,undefinedBehavior:u="empty"}=s,a=new Promise((O,F)=>{setTimeout(()=>F(new Error("Template rendering timeout")),o)}),y=H(e,{loader:n,context:A.from({...t,date:new Date().toISOString().split("T")[0],timestamp:Date.now(),_levelOffset:0},{hyphenToUnderscore:c}),includeDepth:0,maxIncludeDepth:r,basePath:i,undefinedBehavior:u});return await Promise.race([y,a])}async function H(e,s){let{includeDepth:n,maxIncludeDepth:t}=s;if(n>t)throw new Error(`Maximum include depth (${t}) exceeded`);let i=N(e);if(i.errors.length>0){let r=i.errors.map(o=>o.message).join(", ");throw new Error(`Parse errors: ${r}`)}return await C(i.ast,s)}async function C(e,s){let n=[];for(let t of e)n.push(await re(t,s));return n.join("")}async function re(e,s){let{loader:n,context:t,includeDepth:i,maxIncludeDepth:r,basePath:o}=s;switch(e.type){case"text":{let u=t.get("_levelOffset")||0;return u===0?e.value:se(e.value,u)}case"variable":{let u=t.get(e.name);if(u==null)switch(s.undefinedBehavior){case"throw":throw new Error(`Undefined variable: ${e.name}`);case"preserve":return`{{ ${e.name} }}`;case"empty":default:return""}let a=String(u);return a.includes("{{")||a.includes("{%")?await H(a,s):a}case"set":{let u=P(e.value,t);return t.set(e.name,u),""}case"comment":return"";case"if":{if(s.undefinedBehavior==="preserve"){if(G(e.condition,t).length>0)return J(e);if(e.elifBranches){for(let y of e.elifBranches)if(G(y.condition,t).length>0)return J(e)}}let u=P(e.condition,t);if(q(u))return await C(e.trueBranch,s);if(e.elifBranches)for(let a of e.elifBranches){let y=P(a.condition,t);if(q(y))return await C(a.body,s)}return e.elseBranch?await C(e.elseBranch,s):""}case"include":try{let u=await n.load(e.path,o),a=o;if(e.path.includes("://")){let y=new URL(e.path);a=y.href.substring(0,y.href.lastIndexOf("/")+1)}else if(o)if(o.includes("://")){let y=new URL(e.path,o);a=y.href.substring(0,y.href.lastIndexOf("/")+1)}else{let y=ne(e.path,o),O=y.lastIndexOf("/");a=O>=0?y.substring(0,O+1):o}else if(e.path.includes("/")){let y=e.path.lastIndexOf("/");a=e.path.substring(0,y+1)}return await H(u,{loader:n,context:t,includeDepth:i+1,maxIncludeDepth:r,basePath:a,undefinedBehavior:s.undefinedBehavior})}catch(u){if(s.undefinedBehavior==="preserve")return`{% include "${e.path}" %}`;let a=u instanceof Error?u.message:String(u);return console.error(`Failed to include ${e.path}:`,a),`<!-- Include error: ${e.path} -->`}case"switch":{let u=P(e.expression,t);for(let a of e.cases){let y=P(a.value,t);if(u==y)return await C(a.body,s)}return""}case"leveloffset":{let u=t.get("_levelOffset")||0,a=e.isRelative?u+e.offset:e.offset,y=u;t.set("_levelOffset",a);try{return await C(e.body,s)}finally{t.set("_levelOffset",y)}}default:return e}}function q(e){return!(e==null||e===!1||e===0||e==="")}function G(e,s){let n=[];function t(i){switch(i.type){case"variable":s.get(i.name)===void 0&&n.push(i.name);break;case"binary":t(i.left),t(i.right);break;case"unary":t(i.operand);break;case"literal":break}}return t(e),n}function R(e){switch(e.type){case"literal":return typeof e.value=="string"?JSON.stringify(e.value):e.value===null?"null":String(e.value);case"variable":return e.name;case"unary":return`not ${R(e.operand)}`;case"binary":return`(${R(e.left)} ${e.operator} ${R(e.right)})`}}function U(e){return e.map(ie).join("")}function ie(e){switch(e.type){case"text":return e.value;case"variable":return`{{ ${e.name} }}`;case"set":return`{% set ${e.name} = ${R(e.value)} %}`;case"comment":return"{# \u2026 #}";case"if":return J(e);case"include":return`{% include "${e.path}" %}`;case"leveloffset":return`{% leveloffset ${e.isRelative&&e.offset>=0?"+":""}${e.offset} %}${U(e.body)}{% endleveloffset %}`;case"switch":{let s=e.cases.map(n=>`{% case ${R(n.value)} %}${U(n.body)}`).join("");return`{% switch ${R(e.expression)} %}${s}{% endswitch %}`}}}function J(e){let s=[`{% if ${R(e.condition)} %}`,U(e.trueBranch)];if(e.elifBranches)for(let n of e.elifBranches)s.push(`{% elif ${R(n.condition)} %}`,U(n.body));return e.elseBranch&&s.push("{% else %}",U(e.elseBranch)),s.push("{% endif %}"),s.join("")}var _=class{constructor(s={}){this.files=new Map(Object.entries(s))}addFile(s,n){this.files.set(s,n)}async load(s,n){let t=n&&!s.startsWith("/")?`${n}/${s}`:s,i=t.split("/"),r=[];for(let a of i)if(!(a==="."||a==="")){if(a===".."){r.pop();continue}r.push(a)}let c=(t.startsWith("/")?"/":"")+r.join("/"),u=this.files.get(c);if(u===void 0)throw new Error(`File not found: ${c}`);return u}};return te(oe);})();
|
|
6
|
+
"use strict";var minja=(()=>{var F=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var Y=Object.prototype.hasOwnProperty;var Z=(e,s)=>{for(var n in s)F(e,n,{get:s[n],enumerable:!0})},ee=(e,s,n,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let i of X(s))!Y.call(e,i)&&i!==n&&F(e,i,{get:()=>s[i],enumerable:!(t=Q(s,i))||t.enumerable});return e};var te=e=>ee(F({},"__esModule",{value:!0}),e);var oe={};Z(oe,{Context:()=>C,FetchLoader:()=>A,MemoryLoader:()=>_,evaluateExpression:()=>P,parse:()=>N,parseExpression:()=>x,render:()=>K});function x(e){if(e=e.trim(),e==="true")return{type:"literal",value:!0};if(e==="false")return{type:"literal",value:!1};if(e==="null")return{type:"literal",value:null};if(e.startsWith('"')&&e.endsWith('"'))return{type:"literal",value:e.slice(1,-1)};if(e.startsWith("'")&&e.endsWith("'"))return{type:"literal",value:e.slice(1,-1)};if(/^-?\d+(\.\d+)?$/.test(e))return{type:"literal",value:parseFloat(e)};if(e.startsWith("(")&&e.endsWith(")")){let i=0,r=!0;for(let o=0;o<e.length;o++)if(e[o]==="("?i++:e[o]===")"&&i--,i===0&&o<e.length-1){r=!1;break}if(r&&i===0)return x(e.slice(1,-1))}if(e.startsWith("not "))return{type:"unary",operator:"not",operand:x(e.substring(4))};let s=V(e," or ");if(s!==-1)return{type:"binary",operator:"or",left:x(e.substring(0,s)),right:x(e.substring(s+4))};let n=V(e," and ");if(n!==-1)return{type:"binary",operator:"and",left:x(e.substring(0,n)),right:x(e.substring(n+5))};let t=["==","!=","<=",">=","<",">"];for(let i of t){let r=V(e,` ${i} `);if(r!==-1)return{type:"binary",operator:i,left:x(e.substring(0,r)),right:x(e.substring(r+i.length+2))}}if(/^[\w.-]+$/.test(e))return{type:"variable",name:e};throw new Error(`Invalid expression: ${e}`)}function V(e,s){let n=null,t=0;for(let i=0;i<e.length;i++){let r=e[i];if((r==='"'||r==="'")&&(i===0||e[i-1]!=="\\")){n===r?n=null:n===null&&(n=r);continue}if(n||(r==="("?t++:r===")"&&t--),!n&&t===0&&e.substring(i,i+s.length)===s)return i}return-1}function P(e,s){switch(e.type){case"literal":return e.value;case"variable":return s.get(e.name);case"binary":{let n=P(e.left,s),t=P(e.right,s);switch(e.operator){case"==":return n==t;case"!=":return n!=t;case"<":return n<t;case">":return n>t;case"<=":return n<=t;case">=":return n>=t;case"and":return L(n)&&L(t);case"or":return L(n)||L(t)}break}case"unary":{let n=P(e.operand,s);switch(e.operator){case"not":return!L(n)}break}}}function L(e){return!(e==null||e===!1||e===0||e==="")}function N(e){let s=[],n=[],t=0,i=1,r=1;function o(h){return{message:h,position:t,line:i,column:r}}function c(h){for(let d=0;d<h;d++)e[t+d]===`
|
|
7
|
+
`?(i++,r=1):r++;t+=h}function u(h,d=t){return e.indexOf(h,d)}function a(h){let d=e.substring(t,h);return c(h-t),d}for(;t<e.length;){let h=u("{{",t),d=u("{%",t),m=u("{#",t),$=[{pos:h,type:"var"},{pos:d,type:"tag"},{pos:m,type:"comment"}].filter(g=>g.pos!==-1);if($.length===0){let g=e.substring(t);g&&n.push({type:"text",value:g});break}$.sort((g,f)=>g.pos-f.pos);let p=$[0];if(p.pos>t&&n.push({type:"text",value:a(p.pos)}),p.type==="var"){c(2);let g=u("}}",t);if(g===-1){s.push(o("Unclosed variable tag"));break}let f=a(g).trim();c(2),n.push({type:"variable",name:f})}else if(p.type==="comment"){if(n.length>0&&n[n.length-1].type==="text"){let w=n[n.length-1];/\n[ \t]*$/.test(w.value)&&(w.value=w.value.replace(/[ \t]*\n[ \t]*$/,""))}c(2);let g=u("#}",t);if(g===-1){s.push(o("Unclosed comment tag"));break}let f=a(g);if(c(2),n.push({type:"comment",value:f}),t<e.length&&e[t]===`
|
|
8
|
+
`)for(c(1);t<e.length&&/[ \t]/.test(e[t]);)c(1)}else if(p.type==="tag"){c(2);let g=u("%}",t);if(g===-1){s.push(o("Unclosed statement tag"));break}let f=a(g).trim(),w=f.startsWith("-"),I=f.endsWith("-");if(w&&(f=f.substring(1).trim(),n.length>0&&n[n.length-1].type==="text")){let b=n[n.length-1];b.value=b.value.replace(/[ \t]*\n[ \t\n]*$/,"")}if(I&&(f=f.substring(0,f.length-1).trim()),c(2),I)for(;t<e.length&&/[ \t\n]/.test(e[t]);)c(1);if(f.startsWith("set ")){let b=/^set\s+(\w+)\s*=\s*(.+)$/.exec(f);if(b)try{let l=x(b[2]);n.push({type:"set",name:b[1],value:l})}catch(l){s.push(o(`Invalid set expression: ${l.message}`))}else s.push(o("Invalid set syntax"))}else if(f.startsWith("if ")){let b=f.substring(3).trim();try{let l=x(b),{trueBranch:S,elifBranches:E,elseBranch:k,parseErrors:v}=R();s.push(...v),n.push({type:"if",condition:l,trueBranch:S,elifBranches:E.length>0?E:void 0,elseBranch:k.length>0?k:void 0})}catch(l){s.push(o(`Invalid if expression: ${l.message}`))}}else if(f.startsWith("include ")){let b=/^include\s+["']([^"']+)["']/.exec(f);b?n.push({type:"include",path:b[1]}):s.push(o("Invalid include syntax"))}else if(f.startsWith("switch ")){let b=f.substring(7).trim();try{let l=x(b),{cases:S,parseErrors:E}=J();s.push(...E),n.push({type:"switch",expression:l,cases:S})}catch(l){s.push(o(`Invalid switch expression: ${l.message}`))}}else if(f.startsWith("leveloffset ")){let b=/^leveloffset\s+([-+]?\d+)$/.exec(f);if(!b)s.push(o("Invalid leveloffset syntax"));else{let l=b[1],S=l.startsWith("+")||l.startsWith("-"),E=parseInt(l,10);if(isNaN(E))s.push(o("Invalid leveloffset value"));else{let k=0,v=t,M=-1;for(;v<e.length;){let B=/{%-?\s*leveloffset\s+[-+]?\d+\s*-?%}/.exec(e.substring(v)),T=/{%-?\s*endleveloffset\s*-?%}/.exec(e.substring(v)),W=B?v+B.index:1/0,D=T?v+T.index:1/0;if(W<D)k++,v=W+(B?.[0].length||0);else if(D<1/0)if(k===0){M=D;break}else k--,v=D+(T?.[0].length||0);else break}if(M===-1)s.push(o("Missing endleveloffset"));else{let B=a(M),T=/{%-?\s*endleveloffset\s*-?%}/.exec(e.substring(t));T&&c(T[0].length);let W=N(B);s.push(...W.errors),n.push({type:"leveloffset",offset:E,isRelative:S,body:W.ast})}}}}}}return{ast:n,errors:s};function y(h){let m=new RegExp(`{%\\s*${h}\\s*%}`).exec(e.substring(t));return m?{start:t+m.index,length:m[0].length}:null}function R(){let h=[],d=[],m=[],$=0,p=t;for(;p<e.length;){let g=/{%-?\s*if\s+/.exec(e.substring(p)),f=/{%-?\s*elif\s+/.exec(e.substring(p)),w=/{%-?\s*else\s*-?%}/.exec(e.substring(p)),I=/{%-?\s*endif\s*-?%}/.exec(e.substring(p)),l=[{type:"if",match:g,pos:g?p+g.index:1/0},{type:"elif",match:f,pos:f?p+f.index:1/0},{type:"else",match:w,pos:w?p+w.index:1/0},{type:"endif",match:I,pos:I?p+I.index:1/0}].sort((S,E)=>S.pos-E.pos)[0];if(!l.match||l.pos===1/0){d.push(o("Missing endif"));break}if(l.type==="if")$++,p=l.pos+l.match[0].length;else if(l.type==="endif")if($===0){let S=a(l.pos);c(l.match[0].length);let E=N(S);return d.push(...E.errors),{trueBranch:E.ast,elifBranches:h,elseBranch:m,parseErrors:d}}else $--,p=l.pos+l.match[0].length;else if($===0&&(l.type==="elif"||l.type==="else")){let S=a(l.pos),E=N(S);if(h.length===0&&m.length===0){d.push(...E.errors);let k=E.ast;if(l.type==="elif"){c(l.match[0].length);let v=/^([^%]+)%}/.exec(e.substring(t));if(v){let M=v[1].trim();c(v[0].length);try{let B=x(M),T=R();return d.push(...T.parseErrors),h.push({condition:B,body:T.trueBranch}),h.push(...T.elifBranches||[]),m=T.elseBranch,{trueBranch:k,elifBranches:h,elseBranch:m,parseErrors:d}}catch(B){d.push(o(`Invalid elif expression: ${B.message}`))}}}else{c(l.match[0].length);let v=y("endif");if(!v)d.push(o("Missing endif after else"));else{let M=a(v.start);c(v.length);let B=N(M);d.push(...B.errors),m=B.ast}return{trueBranch:k,elifBranches:h,elseBranch:m,parseErrors:d}}}}else p=l.pos+l.match[0].length}return{trueBranch:[],elifBranches:h,elseBranch:m,parseErrors:d}}function J(){let h=[],d=[];for(;t<e.length;){let m=/{%-?\s*case\s+/.exec(e.substring(t)),$=/{%-?\s*endswitch\s*-?%}/.exec(e.substring(t)),p=m?t+m.index:1/0,g=$?t+$.index:1/0;if(g<p){if(h.length>0&&t<g){let f=a(g),w=N(f);d.push(...w.errors),h[h.length-1].body=w.ast}c(g-t+($?.[0].length||0));break}else if(p<1/0){if(h.length>0&&t<p){let w=a(p),I=N(w);d.push(...I.errors),h[h.length-1].body=I.ast}else t<p&&a(p);c(m[0].length);let f=/([^%]+)%}/.exec(e.substring(t));if(f){let w=f[1].trim();c(f[0].length);try{let I=x(w);h.push({value:I,body:[]})}catch(I){d.push(o(`Invalid case value: ${I.message}`))}}else{d.push(o("Invalid case syntax"));break}}else{d.push(o("Missing endswitch"));break}}return{cases:h,parseErrors:d}}}var C=class e{constructor(s,n){this.variables=new Map,this.parent=s||null,this.options=n||s?.options||{}}get(s){let t=(this.options.hyphenToUnderscore?s.replace(/-/g,"_"):s).split("."),i=t[0],r;if(this.variables.has(i))r=this.variables.get(i);else if(this.parent)r=this.parent.get(i);else return;for(let o=1;o<t.length;o++){if(r==null||typeof r!="object"||Array.isArray(r)||!Object.prototype.hasOwnProperty.call(r,t[o]))return;r=r[t[o]]}return r}set(s,n){let t=s.split(".");if(t.length===1){this.variables.set(s,n);return}let i=t[0],r=this.variables.get(i);(!r||typeof r!="object"||Array.isArray(r))&&(r={},this.variables.set(i,r));for(let o=1;o<t.length-1;o++){let c=t[o];(!r[c]||typeof r[c]!="object"||Array.isArray(r[c]))&&(r[c]={}),r=r[c]}r[t[t.length-1]]=n}push(){return new e(this,this.options)}pop(){return this.parent}static from(s,n){let t=new e(void 0,n);for(let[i,r]of Object.entries(s))t.set(i,r);return t}};var A=class{async load(s,n){let t=n?new URL(s,n).href:s,i=`${t}?preventCache=${Date.now()}`,r=await fetch(i);if(!r.ok)throw new Error(`Failed to load ${t}: ${r.status} ${r.statusText}`);return await r.text()}};function se(e,s){return s===0?e:e.replace(/^(#{1,6})(\s+)/gm,(n,t,i)=>{let r=t.length,o=Math.max(1,Math.min(6,r+s));return"#".repeat(o)+i})}function ne(e,s){if(e.startsWith("/"))return e;let t=(s.endsWith("/")?s:s+"/")+e,i=t.split("/"),r=[];for(let c of i)c==="."||c===""||(c===".."?r.pop():r.push(c));return(t.startsWith("/")?"/":"")+r.join("/")}async function K(e,s={}){let{loader:n=new A,context:t={},basePath:i="",maxIncludeDepth:r=10,timeout:o=5e3,hyphenToUnderscore:c=!1,undefinedBehavior:u="empty",undefinedConditions:a="preserve"}=s,y=new Promise((J,h)=>{setTimeout(()=>h(new Error("Template rendering timeout")),o)}),R=z(e,{loader:n,context:C.from({...t,date:new Date().toISOString().split("T")[0],timestamp:Date.now(),_levelOffset:0},{hyphenToUnderscore:c}),includeDepth:0,maxIncludeDepth:r,basePath:i,undefinedBehavior:u,undefinedConditions:a});return await Promise.race([R,y])}async function z(e,s){let{includeDepth:n,maxIncludeDepth:t}=s;if(n>t)throw new Error(`Maximum include depth (${t}) exceeded`);let i=N(e);if(i.errors.length>0){let r=i.errors.map(o=>o.message).join(", ");throw new Error(`Parse errors: ${r}`)}return await j(i.ast,s)}async function j(e,s){let n=[];for(let t of e)n.push(await re(t,s));return n.join("")}async function re(e,s){let{loader:n,context:t,includeDepth:i,maxIncludeDepth:r,basePath:o}=s;switch(e.type){case"text":{let u=t.get("_levelOffset")||0;return u===0?e.value:se(e.value,u)}case"variable":{let u=t.get(e.name);if(u==null)switch(s.undefinedBehavior){case"throw":throw new Error(`Undefined variable: ${e.name}`);case"preserve":return`{{ ${e.name} }}`;case"empty":default:return""}let a=String(u);return a.includes("{{")||a.includes("{%")?await z(a,s):a}case"set":{let u=P(e.value,t);return t.set(e.name,u),""}case"comment":return"";case"if":{if(s.undefinedBehavior==="preserve"&&s.undefinedConditions!=="falsy"){if(G(e.condition,t).length>0)return H(e);if(e.elifBranches){for(let y of e.elifBranches)if(G(y.condition,t).length>0)return H(e)}}let u=P(e.condition,t);if(q(u))return await j(e.trueBranch,s);if(e.elifBranches)for(let a of e.elifBranches){let y=P(a.condition,t);if(q(y))return await j(a.body,s)}return e.elseBranch?await j(e.elseBranch,s):""}case"include":try{let u=await n.load(e.path,o),a=o;if(e.path.includes("://")){let y=new URL(e.path);a=y.href.substring(0,y.href.lastIndexOf("/")+1)}else if(o)if(o.includes("://")){let y=new URL(e.path,o);a=y.href.substring(0,y.href.lastIndexOf("/")+1)}else{let y=ne(e.path,o),R=y.lastIndexOf("/");a=R>=0?y.substring(0,R+1):o}else if(e.path.includes("/")){let y=e.path.lastIndexOf("/");a=e.path.substring(0,y+1)}return await z(u,{loader:n,context:t,includeDepth:i+1,maxIncludeDepth:r,basePath:a,undefinedBehavior:s.undefinedBehavior,undefinedConditions:s.undefinedConditions})}catch(u){if(s.undefinedBehavior==="preserve")return`{% include "${e.path}" %}`;let a=u instanceof Error?u.message:String(u);return console.error(`Failed to include ${e.path}:`,a),`<!-- Include error: ${e.path} -->`}case"switch":{let u=P(e.expression,t);for(let a of e.cases){let y=P(a.value,t);if(u==y)return await j(a.body,s)}return""}case"leveloffset":{let u=t.get("_levelOffset")||0,a=e.isRelative?u+e.offset:e.offset,y=u;t.set("_levelOffset",a);try{return await j(e.body,s)}finally{t.set("_levelOffset",y)}}default:return e}}function q(e){return!(e==null||e===!1||e===0||e==="")}function G(e,s){let n=[];function t(i){switch(i.type){case"variable":s.get(i.name)===void 0&&n.push(i.name);break;case"binary":t(i.left),t(i.right);break;case"unary":t(i.operand);break;case"literal":break}}return t(e),n}function O(e){switch(e.type){case"literal":return typeof e.value=="string"?JSON.stringify(e.value):e.value===null?"null":String(e.value);case"variable":return e.name;case"unary":return`not ${O(e.operand)}`;case"binary":return`(${O(e.left)} ${e.operator} ${O(e.right)})`}}function U(e){return e.map(ie).join("")}function ie(e){switch(e.type){case"text":return e.value;case"variable":return`{{ ${e.name} }}`;case"set":return`{% set ${e.name} = ${O(e.value)} %}`;case"comment":return"{# \u2026 #}";case"if":return H(e);case"include":return`{% include "${e.path}" %}`;case"leveloffset":return`{% leveloffset ${e.isRelative&&e.offset>=0?"+":""}${e.offset} %}${U(e.body)}{% endleveloffset %}`;case"switch":{let s=e.cases.map(n=>`{% case ${O(n.value)} %}${U(n.body)}`).join("");return`{% switch ${O(e.expression)} %}${s}{% endswitch %}`}}}function H(e){let s=[`{% if ${O(e.condition)} %}`,U(e.trueBranch)];if(e.elifBranches)for(let n of e.elifBranches)s.push(`{% elif ${O(n.condition)} %}`,U(n.body));return e.elseBranch&&s.push("{% else %}",U(e.elseBranch)),s.push("{% endif %}"),s.join("")}var _=class{constructor(s={}){this.files=new Map(Object.entries(s))}addFile(s,n){this.files.set(s,n)}async load(s,n){let t=n&&!s.startsWith("/")?`${n}/${s}`:s,i=t.split("/"),r=[];for(let a of i)if(!(a==="."||a==="")){if(a===".."){r.pop();continue}r.push(a)}let c=(t.startsWith("/")?"/":"")+r.join("/"),u=this.files.get(c);if(u===void 0)throw new Error(`File not found: ${c}`);return u}};return te(oe);})();
|
|
9
9
|
//# sourceMappingURL=index.umd.min.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/browser.ts", "../src/evaluator.ts", "../src/parser.ts", "../src/context.ts", "../src/loader-fetch.ts", "../src/renderer.ts", "../src/loader-memory.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Browser-only entry point (excludes FileSystemLoader)\n */\n\nexport { render } from './renderer.js'\nexport { parse } from './parser.js'\nexport { parseExpression, evaluateExpression } from './evaluator.js'\nexport { Context } from './context.js'\nexport { FetchLoader } from './loader-fetch.js'\nexport { MemoryLoader } from './loader-memory.js'\n\nexport type {\n // AST types\n ASTNode,\n TextNode,\n VariableNode,\n SetNode,\n IfNode,\n IncludeNode,\n CommentNode,\n\n // Expression types\n Expression,\n LiteralExpression,\n VariableExpression,\n BinaryExpression,\n UnaryExpression,\n\n // Options and interfaces\n RenderOptions,\n Loader,\n IContext,\n ParseResult,\n ParseError,\n} from './types.js'\n", "/**\n * Safe expression evaluator\n * Evaluates expressions WITHOUT using eval() or new Function()\n * Only allows whitelisted operations\n */\n\nimport type { Expression, IContext } from './types.js'\n\n/**\n * Parse an expression string into an Expression AST\n * @param expr - Expression string to parse\n * @returns Expression AST\n */\nexport function parseExpression(expr: string): Expression {\n expr = expr.trim()\n\n // Handle boolean literals\n if (expr === 'true') {\n return { type: 'literal', value: true }\n }\n if (expr === 'false') {\n return { type: 'literal', value: false }\n }\n if (expr === 'null') {\n return { type: 'literal', value: null }\n }\n\n // Handle string literals (double quotes)\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle string literals (single quotes)\n if (expr.startsWith(\"'\") && expr.endsWith(\"'\")) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle number literals\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { type: 'literal', value: parseFloat(expr) }\n }\n\n // Handle parenthesized expressions\n if (expr.startsWith('(') && expr.endsWith(')')) {\n // Check if parentheses are balanced for the entire expression\n let depth = 0\n let balanced = true\n\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++\n } else if (expr[i] === ')') {\n depth--\n }\n\n // If depth hits 0 before the end, the outer parens aren't wrapping everything\n if (depth === 0 && i < expr.length - 1) {\n balanced = false\n break\n }\n }\n\n // If balanced, unwrap and recursively parse\n if (balanced && depth === 0) {\n return parseExpression(expr.slice(1, -1))\n }\n }\n\n // Handle logical NOT\n if (expr.startsWith('not ')) {\n return {\n type: 'unary',\n operator: 'not',\n operand: parseExpression(expr.substring(4))\n }\n }\n\n // Handle logical OR (lowest precedence)\n const orMatch = findOperator(expr, ' or ')\n if (orMatch !== -1) {\n return {\n type: 'binary',\n operator: 'or',\n left: parseExpression(expr.substring(0, orMatch)),\n right: parseExpression(expr.substring(orMatch + 4))\n }\n }\n\n // Handle logical AND\n const andMatch = findOperator(expr, ' and ')\n if (andMatch !== -1) {\n return {\n type: 'binary',\n operator: 'and',\n left: parseExpression(expr.substring(0, andMatch)),\n right: parseExpression(expr.substring(andMatch + 5))\n }\n }\n\n // Handle comparison operators\n const comparisonOps = ['==', '!=', '<=', '>=', '<', '>']\n for (const op of comparisonOps) {\n const opMatch = findOperator(expr, ` ${op} `)\n if (opMatch !== -1) {\n return {\n type: 'binary',\n operator: op as '==' | '!=' | '<' | '>' | '<=' | '>=',\n left: parseExpression(expr.substring(0, opMatch)),\n right: parseExpression(expr.substring(opMatch + op.length + 2))\n }\n }\n }\n\n // Handle simple variable lookup (with dot notation)\n if (/^[\\w.]+$/.test(expr)) {\n return { type: 'variable', name: expr }\n }\n\n // If we can't parse it, throw an error\n throw new Error(`Invalid expression: ${expr}`)\n}\n\n/**\n * Find the position of an operator, respecting string literals\n * @param expr - Expression string\n * @param operator - Operator to find\n * @returns Position of operator or -1 if not found\n */\nfunction findOperator(expr: string, operator: string): number {\n let inString: string | null = null\n let depth = 0\n\n for (let i = 0; i < expr.length; i++) {\n const char = expr[i]\n\n // Track string literals\n if ((char === '\"' || char === \"'\") && (i === 0 || expr[i - 1] !== '\\\\')) {\n if (inString === char) {\n inString = null\n } else if (inString === null) {\n inString = char\n }\n continue\n }\n\n // Track parentheses depth\n if (!inString) {\n if (char === '(') {\n depth++\n } else if (char === ')') {\n depth--\n }\n }\n\n // Look for operator at depth 0, outside strings\n if (!inString && depth === 0) {\n if (expr.substring(i, i + operator.length) === operator) {\n return i\n }\n }\n }\n\n return -1\n}\n\n/**\n * Evaluate an expression in a given context\n * @param expr - Expression to evaluate\n * @param context - Variable context\n * @returns Evaluated value\n */\nexport function evaluateExpression(expr: Expression, context: IContext): unknown {\n switch (expr.type) {\n case 'literal':\n return expr.value\n\n case 'variable':\n return context.get(expr.name)\n\n case 'binary': {\n const left = evaluateExpression(expr.left, context)\n const right = evaluateExpression(expr.right, context)\n\n switch (expr.operator) {\n case '==':\n // eslint-disable-next-line eqeqeq\n return left == right\n case '!=':\n // eslint-disable-next-line eqeqeq\n return left != right\n case '<':\n return (left as number) < (right as number)\n case '>':\n return (left as number) > (right as number)\n case '<=':\n return (left as number) <= (right as number)\n case '>=':\n return (left as number) >= (right as number)\n case 'and':\n return isTruthy(left) && isTruthy(right)\n case 'or':\n return isTruthy(left) || isTruthy(right)\n }\n break\n }\n\n case 'unary': {\n const operand = evaluateExpression(expr.operand, context)\n\n switch (expr.operator) {\n case 'not':\n return !isTruthy(operand)\n }\n break\n }\n }\n\n return undefined\n}\n\n/**\n * Determine if a value is truthy in template context\n * @param value - Value to check\n * @returns true if truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n", "/**\n * Template parser\n * Converts template strings into AST (Abstract Syntax Tree)\n */\n\nimport type { ASTNode, ParseResult, ParseError } from './types.js'\nimport { parseExpression } from './evaluator.js'\n\n/**\n * Parse a template string into an AST\n * @param template - Template string to parse\n * @returns Parse result with AST and errors\n */\nexport function parse(template: string): ParseResult {\n const errors: ParseError[] = []\n const ast: ASTNode[] = []\n\n let position = 0\n let line = 1\n let column = 1\n\n /**\n * Create a parse error\n */\n function createError(message: string): ParseError {\n return { message, position, line, column }\n }\n\n /**\n * Advance position tracking\n */\n function advance(count: number): void {\n for (let i = 0; i < count; i++) {\n if (template[position + i] === '\\n') {\n line++\n column = 1\n } else {\n column++\n }\n }\n position += count\n }\n\n /**\n * Find the next occurrence of a string\n */\n function findNext(str: string, from: number = position): number {\n return template.indexOf(str, from)\n }\n\n /**\n * Extract text between current position and a target position\n */\n function extractTo(target: number): string {\n const text = template.substring(position, target)\n advance(target - position)\n return text\n }\n\n while (position < template.length) {\n // Look for template tags\n const varStart = findNext('{{', position)\n const tagStart = findNext('{%', position)\n const commentStart = findNext('{#', position)\n\n // Find the nearest tag\n const candidates = [\n { pos: varStart, type: 'var' },\n { pos: tagStart, type: 'tag' },\n { pos: commentStart, type: 'comment' },\n ].filter((c) => c.pos !== -1)\n\n if (candidates.length === 0) {\n // No more tags, rest is text\n const text = template.substring(position)\n if (text) {\n ast.push({ type: 'text', value: text })\n }\n break\n }\n\n // Sort to find nearest\n candidates.sort((a, b) => a.pos - b.pos)\n const nearest = candidates[0]\n\n // Add text before tag\n if (nearest.pos > position) {\n ast.push({ type: 'text', value: extractTo(nearest.pos) })\n }\n\n // Parse the tag\n if (nearest.type === 'var') {\n // Variable: {{ name }}\n advance(2) // Skip {{\n const endPos = findNext('}}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed variable tag'))\n break\n }\n\n const varName = extractTo(endPos).trim()\n advance(2) // Skip }}\n\n ast.push({ type: 'variable', name: varName })\n } else if (nearest.type === 'comment') {\n // Comment: {# ... #}\n // Auto-strip newlines for comments (they produce no output)\n // Only strip if the comment is on its own line\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n // Only strip if previous text ends with newline (comment is on its own line)\n if (/\\n[ \\t]*$/.test(lastNode.value)) {\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t]*$/, '')\n }\n }\n\n advance(2) // Skip {#\n const endPos = findNext('#}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed comment tag'))\n break\n }\n\n const commentText = extractTo(endPos)\n advance(2) // Skip #}\n\n ast.push({ type: 'comment', value: commentText })\n\n // Auto-strip following newline if comment is on its own line\n if (position < template.length && template[position] === '\\n') {\n advance(1)\n // Also skip any indentation on the next line\n while (position < template.length && /[ \\t]/.test(template[position])) {\n advance(1)\n }\n }\n } else if (nearest.type === 'tag') {\n // Statement tag: {% ... %}\n advance(2) // Skip {%\n const endPos = findNext('%}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed statement tag'))\n break\n }\n\n let statement = extractTo(endPos).trim()\n\n // Check for whitespace control characters\n const hasLeftStrip = statement.startsWith('-')\n const hasRightStrip = statement.endsWith('-')\n\n // Strip whitespace control characters from statement\n if (hasLeftStrip) {\n statement = statement.substring(1).trim()\n // Strip trailing whitespace from previous text node\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t\\n]*$/, '')\n }\n }\n if (hasRightStrip) {\n statement = statement.substring(0, statement.length - 1).trim()\n }\n\n advance(2) // Skip %}\n\n // If right strip, consume following whitespace\n if (hasRightStrip) {\n while (position < template.length && /[ \\t\\n]/.test(template[position])) {\n advance(1)\n }\n }\n\n // Parse different statement types\n if (statement.startsWith('set ')) {\n // {% set var = value %}\n const setMatch = /^set\\s+(\\w+)\\s*=\\s*(.+)$/.exec(statement)\n if (setMatch) {\n try {\n const expr = parseExpression(setMatch[2])\n\n ast.push({\n type: 'set',\n name: setMatch[1],\n value: expr,\n })\n } catch (error) {\n errors.push(createError(`Invalid set expression: ${(error as Error).message}`))\n }\n } else {\n errors.push(createError('Invalid set syntax'))\n }\n } else if (statement.startsWith('if ')) {\n // {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}\n const condition = statement.substring(3).trim()\n\n try {\n const expr = parseExpression(condition)\n\n // Find the body and elif/else/endif blocks\n const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'if',\n condition: expr,\n trueBranch,\n elifBranches: elifBranches.length > 0 ? elifBranches : undefined,\n elseBranch: elseBranch.length > 0 ? elseBranch : undefined,\n })\n } catch (error) {\n errors.push(createError(`Invalid if expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('include ')) {\n // {% include \"path\" %}\n const includeMatch = /^include\\s+[\"']([^\"']+)[\"']/.exec(statement)\n if (includeMatch) {\n ast.push({\n type: 'include',\n path: includeMatch[1],\n })\n } else {\n errors.push(createError('Invalid include syntax'))\n }\n } else if (statement.startsWith('switch ')) {\n // {% switch variable %} ... {% case \"value\" %} ... {% endswitch %}\n const switchExpr = statement.substring(7).trim()\n\n try {\n const expr = parseExpression(switchExpr)\n const { cases, parseErrors } = parseSwitchBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'switch',\n expression: expr,\n cases,\n })\n } catch (error) {\n errors.push(createError(`Invalid switch expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('leveloffset ')) {\n // {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}\n const offsetMatch = /^leveloffset\\s+([-+]?\\d+)$/.exec(statement)\n\n if (!offsetMatch) {\n errors.push(createError('Invalid leveloffset syntax'))\n } else {\n const offsetStr = offsetMatch[1]\n const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-')\n const offset = parseInt(offsetStr, 10)\n\n if (isNaN(offset)) {\n errors.push(createError('Invalid leveloffset value'))\n } else {\n // Find matching endleveloffset accounting for nesting\n let depth = 0\n let searchPos = position\n let endPos = -1\n\n while (searchPos < template.length) {\n const leveloffsetMatch = /{%-?\\s*leveloffset\\s+[-+]?\\d+\\s*-?%}/.exec(template.substring(searchPos))\n const endleveloffsetMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(searchPos))\n\n const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity\n const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity\n\n if (leveloffsetPos < endleveloffsetPos) {\n // Found nested leveloffset\n depth++\n searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0)\n } else if (endleveloffsetPos < Infinity) {\n // Found endleveloffset\n if (depth === 0) {\n // This is our matching endleveloffset\n endPos = endleveloffsetPos\n break\n } else {\n depth--\n searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0)\n }\n } else {\n // No more tags found\n break\n }\n }\n\n if (endPos === -1) {\n errors.push(createError('Missing endleveloffset'))\n } else {\n const bodyTemplate = extractTo(endPos)\n // Find and skip the endleveloffset tag\n const endMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(position))\n if (endMatch) {\n advance(endMatch[0].length)\n }\n\n const bodyResult = parse(bodyTemplate)\n errors.push(...bodyResult.errors)\n\n ast.push({\n type: 'leveloffset',\n offset,\n isRelative,\n body: bodyResult.ast,\n })\n }\n }\n }\n }\n // Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags\n }\n }\n\n return { ast, errors }\n\n /**\n * Find an end tag like {% endif %}\n */\n function findEndTag(tagName: string): { start: number; length: number } | null {\n const pattern = new RegExp(`{%\\\\s*${tagName}\\\\s*%}`)\n const match = pattern.exec(template.substring(position))\n\n if (match) {\n return {\n start: position + match.index,\n length: match[0].length,\n }\n }\n\n return null\n }\n\n /**\n * Parse an if block with elif and else support\n */\n function parseIfBlock(): {\n trueBranch: ASTNode[]\n elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }>\n elseBranch: ASTNode[]\n parseErrors: ParseError[]\n } {\n const elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n let elseBranch: ASTNode[] = []\n\n // Find the next elif, else, or endif\n let depth = 0\n let searchPos = position\n\n while (searchPos < template.length) {\n const ifMatch = /{%-?\\s*if\\s+/.exec(template.substring(searchPos))\n const elifMatch = /{%-?\\s*elif\\s+/.exec(template.substring(searchPos))\n const elseMatch = /{%-?\\s*else\\s*-?%}/.exec(template.substring(searchPos))\n const endifMatch = /{%-?\\s*endif\\s*-?%}/.exec(template.substring(searchPos))\n\n // Find the nearest match\n const matches = [\n { type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },\n { type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },\n { type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },\n { type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },\n ].sort((a, b) => a.pos - b.pos)\n\n const nearest = matches[0]\n\n if (!nearest.match || nearest.pos === Infinity) {\n parseErrors.push(createError('Missing endif'))\n break\n }\n\n if (nearest.type === 'if') {\n depth++\n searchPos = nearest.pos + nearest.match[0].length\n } else if (nearest.type === 'endif') {\n if (depth === 0) {\n // This is our endif\n const bodyTemplate = extractTo(nearest.pos)\n advance(nearest.match[0].length)\n\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n\n return {\n trueBranch: bodyResult.ast,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } else {\n depth--\n searchPos = nearest.pos + nearest.match[0].length\n }\n } else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {\n // Parse the body before elif/else\n const bodyTemplate = extractTo(nearest.pos)\n const bodyResult = parse(bodyTemplate)\n\n if (elifBranches.length === 0 && elseBranch.length === 0) {\n // This is the trueBranch (before first elif/else)\n parseErrors.push(...bodyResult.errors)\n const trueBranch = bodyResult.ast\n\n // Now handle elif or else\n if (nearest.type === 'elif') {\n // Extract elif condition\n advance(nearest.match[0].length)\n const condMatch = /^([^%]+)%}/.exec(template.substring(position))\n if (condMatch) {\n const condStr = condMatch[1].trim()\n advance(condMatch[0].length)\n\n try {\n const elifCondition = parseExpression(condStr)\n const elifResult = parseIfBlock()\n parseErrors.push(...elifResult.parseErrors)\n\n elifBranches.push({\n condition: elifCondition,\n body: elifResult.trueBranch,\n })\n elifBranches.push(...(elifResult.elifBranches || []))\n elseBranch = elifResult.elseBranch\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } catch (error) {\n parseErrors.push(createError(`Invalid elif expression: ${(error as Error).message}`))\n }\n }\n } else {\n // else\n advance(nearest.match[0].length)\n\n // Find endif for else block\n const endifMatch = findEndTag('endif')\n if (!endifMatch) {\n parseErrors.push(createError('Missing endif after else'))\n } else {\n const elseBodyTemplate = extractTo(endifMatch.start)\n advance(endifMatch.length)\n\n const elseBodyResult = parse(elseBodyTemplate)\n parseErrors.push(...elseBodyResult.errors)\n elseBranch = elseBodyResult.ast\n }\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n }\n } else {\n searchPos = nearest.pos + nearest.match[0].length\n }\n }\n\n return {\n trueBranch: [],\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n\n /**\n * Parse a switch block with case support\n */\n function parseSwitchBlock(): {\n cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }>\n parseErrors: ParseError[]\n } {\n const cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n\n while (position < template.length) {\n // Find the next case or endswitch\n const caseMatch = /{%-?\\s*case\\s+/.exec(template.substring(position))\n const endswitchMatch = /{%-?\\s*endswitch\\s*-?%}/.exec(template.substring(position))\n\n // Find which comes first\n const casePos = caseMatch ? position + caseMatch.index : Infinity\n const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity\n\n if (endswitchPos < casePos) {\n // Found endswitch before any case (or no case)\n // Parse any remaining content before endswitch as the last case body\n if (cases.length > 0 && position < endswitchPos) {\n const bodyTemplate = extractTo(endswitchPos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n }\n\n // Skip endswitch\n advance(endswitchPos - position + (endswitchMatch?.[0].length || 0))\n break\n } else if (casePos < Infinity) {\n // Found a case\n // If there's a previous case, parse its body\n if (cases.length > 0 && position < casePos) {\n const bodyTemplate = extractTo(casePos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n } else if (position < casePos) {\n // Content before first case - skip it\n extractTo(casePos)\n }\n\n // Parse the case value\n advance(caseMatch![0].length)\n\n // Extract the case value (until %})\n const valueMatch = /([^%]+)%}/.exec(template.substring(position))\n if (valueMatch) {\n const valueStr = valueMatch[1].trim()\n advance(valueMatch[0].length)\n\n try {\n const caseValue = parseExpression(valueStr)\n cases.push({\n value: caseValue,\n body: [], // Will be filled in next iteration or at endswitch\n })\n } catch (error) {\n parseErrors.push(createError(`Invalid case value: ${(error as Error).message}`))\n }\n } else {\n parseErrors.push(createError('Invalid case syntax'))\n break\n }\n } else {\n // No case or endswitch found\n parseErrors.push(createError('Missing endswitch'))\n break\n }\n }\n\n return { cases, parseErrors }\n }\n}\n", "/**\n * Context management for variable scoping\n * Supports nested scopes with inheritance\n */\n\nimport type { IContext } from './types.js'\n\nexport interface ContextOptions {\n /**\n * Convert hyphenated variable names to underscores during lookup.\n */\n hyphenToUnderscore?: boolean\n}\n\nexport class Context implements IContext {\n private variables: Map<string, unknown>\n private parent: Context | null\n private options: ContextOptions\n\n constructor(parent?: Context, options?: ContextOptions) {\n this.variables = new Map()\n this.parent = parent || null\n this.options = options || parent?.options || {}\n }\n\n /**\n * Get a variable from the context (supports dot notation)\n * @param name - Variable name (can use dot notation like \"obj.prop.subprop\")\n * @returns The variable value or undefined\n */\n get(name: string): unknown {\n // Convert hyphens to underscores if option is enabled\n const normalizedName = this.options.hyphenToUnderscore\n ? name.replace(/-/g, '_')\n : name\n\n const parts = normalizedName.split('.')\n const rootName = parts[0]\n\n // Look up the root variable in current scope or parent scopes\n let value: unknown\n if (this.variables.has(rootName)) {\n value = this.variables.get(rootName)\n } else if (this.parent) {\n value = this.parent.get(rootName)\n } else {\n return undefined\n }\n\n // Navigate nested properties\n for (let i = 1; i < parts.length; i++) {\n if (value === null || value === undefined) {\n return undefined\n }\n\n // Only allow property access on plain objects (prevent prototype pollution)\n if (typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n // Prevent access to prototype chain\n if (!Object.prototype.hasOwnProperty.call(value, parts[i])) {\n return undefined\n }\n\n value = (value as Record<string, unknown>)[parts[i]]\n }\n\n return value\n }\n\n /**\n * Set a variable in the current context\n * @param name - Variable name (can use dot notation)\n * @param value - Value to set\n */\n set(name: string, value: unknown): void {\n const parts = name.split('.')\n\n if (parts.length === 1) {\n // Simple assignment\n this.variables.set(name, value)\n return\n }\n\n // Nested assignment - navigate to parent object\n const rootName = parts[0]\n let target = this.variables.get(rootName) as Record<string, unknown> | undefined\n\n if (!target || typeof target !== 'object' || Array.isArray(target)) {\n // Create new object if root doesn't exist or isn't an object\n target = {}\n this.variables.set(rootName, target)\n }\n\n // Navigate to the parent of the target property\n for (let i = 1; i < parts.length - 1; i++) {\n const key = parts[i]\n\n if (\n !target[key] ||\n typeof target[key] !== 'object' ||\n Array.isArray(target[key])\n ) {\n target[key] = {}\n }\n\n target = target[key] as Record<string, unknown>\n }\n\n // Set the final property\n target[parts[parts.length - 1]] = value\n }\n\n /**\n * Create a child scope\n * @returns A new Context with this context as parent\n */\n push(): Context {\n return new Context(this, this.options)\n }\n\n /**\n * Return to parent scope\n * @returns The parent context or null if at root\n */\n pop(): Context | null {\n return this.parent\n }\n\n /**\n * Create a context from a plain object\n * @param data - Plain object to convert to context\n * @param options - Context options\n * @returns New Context instance\n */\n static from(data: Record<string, unknown>, options?: ContextOptions): Context {\n const ctx = new Context(undefined, options)\n for (const [key, value] of Object.entries(data)) {\n ctx.set(key, value)\n }\n return ctx\n }\n}\n", "/**\n * Fetch-based loader for browsers and service workers\n */\n\nimport type { Loader } from './types.js'\n\nexport class FetchLoader implements Loader {\n async load(path: string, basePath?: string): Promise<string> {\n const url = basePath ? new URL(path, basePath).href : path\n const fetchUrl = `${url}?preventCache=${Date.now()}`\n\n const response = await fetch(fetchUrl)\n\n if (!response.ok) {\n throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`)\n }\n\n return await response.text()\n }\n}\n", "/**\n * Template renderer\n * Combines parser, evaluator, and loader to render templates\n */\n\nimport type { ASTNode, Expression, RenderOptions, Loader } from './types.js'\nimport { parse } from './parser.js'\nimport { Context } from './context.js'\nimport { evaluateExpression } from './evaluator.js'\nimport { FetchLoader } from './loader-fetch.js'\n\n/**\n * Transform markdown headings by applying level offset\n * Clamps to valid markdown range (1-6)\n * @param text - Text content to transform\n * @param offset - Level offset to apply\n * @returns Transformed text with adjusted heading levels\n */\nfunction transformHeadings(text: string, offset: number): string {\n if (offset === 0) {\n return text\n }\n\n // Match markdown headings: # through ######\n return text.replace(/^(#{1,6})(\\s+)/gm, (_match, hashes, space) => {\n const currentLevel = hashes.length\n const newLevel = Math.max(1, Math.min(6, currentLevel + offset))\n return '#'.repeat(newLevel) + space\n })\n}\n\n/**\n * Resolve a relative path against a base path\n * @param path - Relative or absolute path\n * @param basePath - Base path to resolve against\n * @returns Resolved path\n */\nfunction resolvePath(path: string, basePath: string): string {\n // If path is absolute, return as-is\n if (path.startsWith('/')) {\n return path\n }\n\n // Ensure basePath ends with /\n const base = basePath.endsWith('/') ? basePath : basePath + '/'\n\n // Combine and normalize\n const combined = base + path\n\n // Normalize . and .. segments\n const parts = combined.split('/')\n const resolved: string[] = []\n\n for (const part of parts) {\n if (part === '.' || part === '') {\n continue\n } else if (part === '..') {\n resolved.pop()\n } else {\n resolved.push(part)\n }\n }\n\n // Preserve leading slash if original had one\n const prefix = combined.startsWith('/') ? '/' : ''\n return prefix + resolved.join('/')\n}\n\n/**\n * Render a template string\n * @param template - Template string to render\n * @param options - Render options\n * @returns Rendered output\n */\nexport async function render(template: string, options: RenderOptions = {}): Promise<string> {\n const {\n loader = new FetchLoader(),\n context: initialContext = {},\n basePath = '',\n maxIncludeDepth = 10,\n timeout = 5000,\n hyphenToUnderscore = false,\n undefinedBehavior = 'empty',\n } = options\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Template rendering timeout')), timeout)\n })\n\n // Render with timeout\n const renderPromise = renderInternal(template, {\n loader,\n context: Context.from(\n {\n ...initialContext,\n // Built-in variables\n date: new Date().toISOString().split('T')[0],\n timestamp: Date.now(),\n _levelOffset: 0,\n },\n { hyphenToUnderscore }\n ),\n includeDepth: 0,\n maxIncludeDepth,\n basePath,\n undefinedBehavior,\n })\n\n return await Promise.race([renderPromise, timeoutPromise])\n}\n\ninterface InternalRenderOptions {\n loader: Loader\n context: Context\n includeDepth: number\n maxIncludeDepth: number\n basePath: string\n undefinedBehavior: 'empty' | 'throw' | 'preserve'\n}\n\n/**\n * Internal rendering function with depth tracking\n */\nasync function renderInternal(\n template: string,\n options: InternalRenderOptions\n): Promise<string> {\n const { includeDepth, maxIncludeDepth } = options\n\n // Check recursion depth\n if (includeDepth > maxIncludeDepth) {\n throw new Error(`Maximum include depth (${maxIncludeDepth}) exceeded`)\n }\n\n // Parse template\n const parseResult = parse(template)\n\n if (parseResult.errors.length > 0) {\n const errorMessages = parseResult.errors.map((e) => e.message).join(', ')\n throw new Error(`Parse errors: ${errorMessages}`)\n }\n\n // Render AST\n return await renderNodes(parseResult.ast, options)\n}\n\n/**\n * Render an array of AST nodes\n */\nasync function renderNodes(nodes: ASTNode[], options: InternalRenderOptions): Promise<string> {\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(await renderNode(node, options))\n }\n\n return parts.join('')\n}\n\n/**\n * Render a single AST node\n */\nasync function renderNode(node: ASTNode, options: InternalRenderOptions): Promise<string> {\n const { loader, context, includeDepth, maxIncludeDepth, basePath } = options\n\n switch (node.type) {\n case 'text': {\n // Apply leveloffset if active\n const currentOffset = context.get('_levelOffset') as number || 0\n if (currentOffset === 0) {\n return node.value\n }\n return transformHeadings(node.value, currentOffset)\n }\n\n case 'variable': {\n const value = context.get(node.name)\n if (value === undefined || value === null) {\n // Apply the undefined-variable policy. See RenderOptions.undefinedBehavior.\n switch (options.undefinedBehavior) {\n case 'throw':\n throw new Error(`Undefined variable: ${node.name}`)\n case 'preserve':\n // Round-trip the source form so downstream tooling (or a\n // second-pass minja run with the value supplied) can pick\n // up where we left off.\n return `{{ ${node.name} }}`\n case 'empty':\n default:\n return ''\n }\n }\n const str = String(value)\n // If the value contains template syntax, re-process it\n if (str.includes('{{') || str.includes('{%')) {\n return await renderInternal(str, options)\n }\n return str\n }\n\n case 'set': {\n const value = evaluateExpression(node.value, context)\n context.set(node.name, value)\n return ''\n }\n\n case 'comment':\n return ''\n\n case 'if': {\n // In preserve mode, an `if` whose condition references an\n // undefined identifier can't be evaluated \u2014 we don't know\n // which branch to take. Preserve the whole `{% if \u2026 %}\u2026{% endif %}`\n // verbatim so a second pass (with the value supplied) can\n // resolve it. See plans/format-asciidoc-import.md.\n if (options.undefinedBehavior === 'preserve') {\n const undefinedRefs = findUndefinedRefs(node.condition, context)\n if (undefinedRefs.length > 0) {\n return ifNodeToSource(node)\n }\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n if (findUndefinedRefs(elif.condition, context).length > 0) {\n return ifNodeToSource(node)\n }\n }\n }\n }\n\n const condition = evaluateExpression(node.condition, context)\n\n if (isTruthy(condition)) {\n return await renderNodes(node.trueBranch, options)\n }\n\n // Check elif branches\n if (node.elifBranches) {\n for (const elifBranch of node.elifBranches) {\n const elifCondition = evaluateExpression(elifBranch.condition, context)\n if (isTruthy(elifCondition)) {\n return await renderNodes(elifBranch.body, options)\n }\n }\n }\n\n // Render else branch if present\n if (node.elseBranch) {\n return await renderNodes(node.elseBranch, options)\n }\n\n return ''\n }\n\n case 'include': {\n try {\n // Load the included file\n const includedContent = await loader.load(node.path, basePath)\n\n // Determine new base path for nested includes\n let newBasePath = basePath\n\n // If path looks like a URL, extract base\n if (node.path.includes('://')) {\n const url = new URL(node.path)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else if (basePath) {\n // Relative path - resolve against current base\n if (basePath.includes('://')) {\n const url = new URL(node.path, basePath)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else {\n // File path - resolve relative to current base and extract directory\n const resolvedPath = resolvePath(node.path, basePath)\n const lastSlash = resolvedPath.lastIndexOf('/')\n newBasePath = lastSlash >= 0 ? resolvedPath.substring(0, lastSlash + 1) : basePath\n }\n } else if (node.path.includes('/')) {\n // No base path but include has directory - use that as base\n const lastSlash = node.path.lastIndexOf('/')\n newBasePath = node.path.substring(0, lastSlash + 1)\n }\n\n // Render the included template (recursive)\n return await renderInternal(includedContent, {\n loader,\n context,\n includeDepth: includeDepth + 1,\n maxIncludeDepth,\n basePath: newBasePath,\n undefinedBehavior: options.undefinedBehavior,\n })\n } catch (error) {\n // In `preserve` mode, an unresolvable include is preserved\n // as the original directive so a later renderer pass (with\n // the file in place) can resolve it. Matches the semantic\n // of `preserve` for undefined variables. Without this,\n // multi-stage pipelines (e.g. dogsbay's convert + build\n // preprocessor for AsciiDoc imports) lose the directive at\n // stage 1 because targets only exist after stage 2 has\n // converted sibling files.\n if (options.undefinedBehavior === 'preserve') {\n return `{% include \"${node.path}\" %}`\n }\n const message = error instanceof Error ? error.message : String(error)\n console.error(`Failed to include ${node.path}:`, message)\n return `<!-- Include error: ${node.path} -->`\n }\n }\n\n case 'switch': {\n const switchValue = evaluateExpression(node.expression, context)\n\n // Find matching case\n for (const caseItem of node.cases) {\n const caseValue = evaluateExpression(caseItem.value, context)\n // eslint-disable-next-line eqeqeq\n if (switchValue == caseValue) {\n return await renderNodes(caseItem.body, options)\n }\n }\n\n // No matching case found\n return ''\n }\n\n case 'leveloffset': {\n // Calculate new offset (relative or absolute)\n const parentOffset = context.get('_levelOffset') as number || 0\n const newOffset = node.isRelative ? parentOffset + node.offset : node.offset\n\n // Store current offset to restore later\n const previousOffset = parentOffset\n\n // Set new offset in context\n context.set('_levelOffset', newOffset)\n\n try {\n // Render body with offset active\n const result = await renderNodes(node.body, options)\n return result\n } finally {\n // Always restore previous offset\n context.set('_levelOffset', previousOffset)\n }\n }\n\n default:\n // TypeScript exhaustiveness check\n const _exhaustive: never = node\n return _exhaustive\n }\n}\n\n/**\n * Determine if a value is truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n\n// ============================================================================\n// Preserve-mode helpers \u2014 round-trip AST back to Jinja source so an\n// undefined-referencing block can survive into the rendered output for\n// a downstream pass to resolve.\n// ============================================================================\n\n/**\n * Walk an expression AST, return the names of any `variable` references\n * whose context lookup is undefined. Empty array = all refs are bound.\n */\nfunction findUndefinedRefs(expr: Expression, context: Context): string[] {\n const out: string[] = []\n function walk(e: Expression): void {\n switch (e.type) {\n case 'variable':\n if (context.get(e.name) === undefined) out.push(e.name)\n break\n case 'binary':\n walk(e.left)\n walk(e.right)\n break\n case 'unary':\n walk(e.operand)\n break\n case 'literal':\n break\n }\n }\n walk(expr)\n return out\n}\n\n/**\n * Serialize an Expression back to Jinja source. Used by preserve mode\n * to reconstruct `{% if \u2026 %}` headers when the condition can't be\n * evaluated. Operator precedence isn't tracked; the output is\n * conservatively parenthesized for binary/unary so a re-parse round-\n * trips to the same AST shape (modulo redundant parens).\n */\nfunction expressionToSource(expr: Expression): string {\n switch (expr.type) {\n case 'literal':\n if (typeof expr.value === 'string') return JSON.stringify(expr.value)\n if (expr.value === null) return 'null'\n return String(expr.value)\n case 'variable':\n return expr.name\n case 'unary':\n return `not ${expressionToSource(expr.operand)}`\n case 'binary':\n return `(${expressionToSource(expr.left)} ${expr.operator} ${expressionToSource(expr.right)})`\n }\n}\n\n/**\n * Serialize ASTNode[] back to Jinja source. Mirrors the parser's syntax\n * for every node type so a preserved block can be re-rendered later\n * with the missing values supplied.\n *\n * Throws on shapes we don't support (deep nested includes, switch);\n * preserve mode is opt-in and a hard error here beats silent\n * truncation. The shapes covered are everything md2md emits in the\n * AsciiDoc pipeline.\n */\nfunction nodesToSource(nodes: ASTNode[]): string {\n return nodes.map(nodeToSource).join('')\n}\n\nfunction nodeToSource(node: ASTNode): string {\n switch (node.type) {\n case 'text':\n return node.value\n case 'variable':\n return `{{ ${node.name} }}`\n case 'set':\n return `{% set ${node.name} = ${expressionToSource(node.value)} %}`\n case 'comment':\n // Parser strips comment content; emit a placeholder so the block\n // structure round-trips even when the prose inside doesn't.\n return '{# \u2026 #}'\n case 'if':\n return ifNodeToSource(node)\n case 'include':\n return `{% include \"${node.path}\" %}`\n case 'leveloffset': {\n const sign = node.isRelative && node.offset >= 0 ? '+' : ''\n return `{% leveloffset ${sign}${node.offset} %}${nodesToSource(node.body)}{% endleveloffset %}`\n }\n case 'switch': {\n // Conservative round-trip; switch isn't on the AsciiDoc hot path\n // but we have an AST shape, so emit it.\n const cases = node.cases\n .map((c) => `{% case ${expressionToSource(c.value)} %}${nodesToSource(c.body)}`)\n .join('')\n return `{% switch ${expressionToSource(node.expression)} %}${cases}{% endswitch %}`\n }\n }\n}\n\nfunction ifNodeToSource(node: Extract<ASTNode, { type: 'if' }>): string {\n const parts = [`{% if ${expressionToSource(node.condition)} %}`, nodesToSource(node.trueBranch)]\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n parts.push(`{% elif ${expressionToSource(elif.condition)} %}`, nodesToSource(elif.body))\n }\n }\n if (node.elseBranch) {\n parts.push(`{% else %}`, nodesToSource(node.elseBranch))\n }\n parts.push(`{% endif %}`)\n return parts.join('')\n}\n", "/**\n * Memory-based loader for testing\n */\n\nimport type { Loader } from './types.js'\n\nexport class MemoryLoader implements Loader {\n private files: Map<string, string>\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map(Object.entries(files))\n }\n\n addFile(path: string, content: string): void {\n this.files.set(path, content)\n }\n\n async load(path: string, basePath?: string): Promise<string> {\n // Resolve path with normalization of . and .. segments\n const combined = basePath && !path.startsWith('/')\n ? `${basePath}/${path}`\n : path\n\n const parts = combined.split('/')\n const normalized: string[] = []\n for (const part of parts) {\n if (part === '.' || part === '') continue\n if (part === '..') { normalized.pop(); continue }\n normalized.push(part)\n }\n const prefix = combined.startsWith('/') ? '/' : ''\n const resolvedPath = prefix + normalized.join('/')\n\n const content = this.files.get(resolvedPath)\n\n if (content === undefined) {\n throw new Error(`File not found: ${resolvedPath}`)\n }\n\n return content\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["browser_exports", "__export", "Context", "FetchLoader", "MemoryLoader", "evaluateExpression", "parse", "parseExpression", "render", "parseExpression", "expr", "depth", "balanced", "i", "orMatch", "findOperator", "andMatch", "comparisonOps", "op", "opMatch", "operator", "inString", "char", "evaluateExpression", "context", "left", "right", "isTruthy", "operand", "value", "parse", "template", "errors", "ast", "position", "line", "column", "createError", "message", "advance", "count", "i", "findNext", "str", "from", "extractTo", "target", "text", "varStart", "tagStart", "commentStart", "candidates", "c", "a", "b", "nearest", "endPos", "varName", "lastNode", "commentText", "statement", "hasLeftStrip", "hasRightStrip", "setMatch", "expr", "parseExpression", "error", "condition", "trueBranch", "elifBranches", "elseBranch", "parseErrors", "parseIfBlock", "includeMatch", "switchExpr", "cases", "parseSwitchBlock", "offsetMatch", "offsetStr", "isRelative", "offset", "depth", "searchPos", "leveloffsetMatch", "endleveloffsetMatch", "leveloffsetPos", "endleveloffsetPos", "bodyTemplate", "endMatch", "bodyResult", "findEndTag", "tagName", "match", "ifMatch", "elifMatch", "elseMatch", "endifMatch", "condMatch", "condStr", "elifCondition", "elifResult", "elseBodyTemplate", "elseBodyResult", "caseMatch", "endswitchMatch", "casePos", "endswitchPos", "valueMatch", "valueStr", "caseValue", "Context", "_Context", "parent", "options", "name", "parts", "rootName", "value", "i", "target", "key", "data", "ctx", "FetchLoader", "path", "basePath", "url", "fetchUrl", "response", "transformHeadings", "text", "offset", "_match", "hashes", "space", "currentLevel", "newLevel", "resolvePath", "path", "basePath", "combined", "parts", "resolved", "part", "render", "template", "options", "loader", "FetchLoader", "initialContext", "maxIncludeDepth", "timeout", "hyphenToUnderscore", "undefinedBehavior", "timeoutPromise", "_", "reject", "renderPromise", "renderInternal", "Context", "includeDepth", "parseResult", "parse", "errorMessages", "e", "renderNodes", "nodes", "node", "renderNode", "context", "currentOffset", "value", "str", "evaluateExpression", "findUndefinedRefs", "ifNodeToSource", "elif", "condition", "isTruthy", "elifBranch", "elifCondition", "includedContent", "newBasePath", "url", "resolvedPath", "lastSlash", "error", "message", "switchValue", "caseItem", "caseValue", "parentOffset", "newOffset", "previousOffset", "expr", "out", "walk", "expressionToSource", "nodesToSource", "nodeToSource", "cases", "c", "MemoryLoader", "files", "path", "content", "basePath", "combined", "parts", "normalized", "part", "resolvedPath"]
|
|
4
|
+
"sourcesContent": ["/**\n * Browser-only entry point (excludes FileSystemLoader)\n */\n\nexport { render } from './renderer.js'\nexport { parse } from './parser.js'\nexport { parseExpression, evaluateExpression } from './evaluator.js'\nexport { Context } from './context.js'\nexport { FetchLoader } from './loader-fetch.js'\nexport { MemoryLoader } from './loader-memory.js'\n\nexport type {\n // AST types\n ASTNode,\n TextNode,\n VariableNode,\n SetNode,\n IfNode,\n IncludeNode,\n CommentNode,\n\n // Expression types\n Expression,\n LiteralExpression,\n VariableExpression,\n BinaryExpression,\n UnaryExpression,\n\n // Options and interfaces\n RenderOptions,\n Loader,\n IContext,\n ParseResult,\n ParseError,\n} from './types.js'\n", "/**\n * Safe expression evaluator\n * Evaluates expressions WITHOUT using eval() or new Function()\n * Only allows whitelisted operations\n */\n\nimport type { Expression, IContext } from './types.js'\n\n/**\n * Parse an expression string into an Expression AST\n * @param expr - Expression string to parse\n * @returns Expression AST\n */\nexport function parseExpression(expr: string): Expression {\n expr = expr.trim()\n\n // Handle boolean literals\n if (expr === 'true') {\n return { type: 'literal', value: true }\n }\n if (expr === 'false') {\n return { type: 'literal', value: false }\n }\n if (expr === 'null') {\n return { type: 'literal', value: null }\n }\n\n // Handle string literals (double quotes)\n if (expr.startsWith('\"') && expr.endsWith('\"')) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle string literals (single quotes)\n if (expr.startsWith(\"'\") && expr.endsWith(\"'\")) {\n return { type: 'literal', value: expr.slice(1, -1) }\n }\n\n // Handle number literals\n if (/^-?\\d+(\\.\\d+)?$/.test(expr)) {\n return { type: 'literal', value: parseFloat(expr) }\n }\n\n // Handle parenthesized expressions\n if (expr.startsWith('(') && expr.endsWith(')')) {\n // Check if parentheses are balanced for the entire expression\n let depth = 0\n let balanced = true\n\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] === '(') {\n depth++\n } else if (expr[i] === ')') {\n depth--\n }\n\n // If depth hits 0 before the end, the outer parens aren't wrapping everything\n if (depth === 0 && i < expr.length - 1) {\n balanced = false\n break\n }\n }\n\n // If balanced, unwrap and recursively parse\n if (balanced && depth === 0) {\n return parseExpression(expr.slice(1, -1))\n }\n }\n\n // Handle logical NOT\n if (expr.startsWith('not ')) {\n return {\n type: 'unary',\n operator: 'not',\n operand: parseExpression(expr.substring(4))\n }\n }\n\n // Handle logical OR (lowest precedence)\n const orMatch = findOperator(expr, ' or ')\n if (orMatch !== -1) {\n return {\n type: 'binary',\n operator: 'or',\n left: parseExpression(expr.substring(0, orMatch)),\n right: parseExpression(expr.substring(orMatch + 4))\n }\n }\n\n // Handle logical AND\n const andMatch = findOperator(expr, ' and ')\n if (andMatch !== -1) {\n return {\n type: 'binary',\n operator: 'and',\n left: parseExpression(expr.substring(0, andMatch)),\n right: parseExpression(expr.substring(andMatch + 5))\n }\n }\n\n // Handle comparison operators\n const comparisonOps = ['==', '!=', '<=', '>=', '<', '>']\n for (const op of comparisonOps) {\n const opMatch = findOperator(expr, ` ${op} `)\n if (opMatch !== -1) {\n return {\n type: 'binary',\n operator: op as '==' | '!=' | '<' | '>' | '<=' | '>=',\n left: parseExpression(expr.substring(0, opMatch)),\n right: parseExpression(expr.substring(opMatch + op.length + 2))\n }\n }\n }\n\n // Handle simple variable lookup (with dot notation).\n // Hyphens are allowed in identifiers so AsciiDoc-style attribute\n // names (`product-version`, `ptp-events-rest-api`) work inside\n // `{% if %}` conditions \u2014 they resolve via `hyphenToUnderscore` in\n // Context.get, just like `{{ product-version }}` interpolations.\n // Minja has no subtraction operator, so a `-` is never ambiguous\n // here; negative number literals are matched earlier.\n if (/^[\\w.-]+$/.test(expr)) {\n return { type: 'variable', name: expr }\n }\n\n // If we can't parse it, throw an error\n throw new Error(`Invalid expression: ${expr}`)\n}\n\n/**\n * Find the position of an operator, respecting string literals\n * @param expr - Expression string\n * @param operator - Operator to find\n * @returns Position of operator or -1 if not found\n */\nfunction findOperator(expr: string, operator: string): number {\n let inString: string | null = null\n let depth = 0\n\n for (let i = 0; i < expr.length; i++) {\n const char = expr[i]\n\n // Track string literals\n if ((char === '\"' || char === \"'\") && (i === 0 || expr[i - 1] !== '\\\\')) {\n if (inString === char) {\n inString = null\n } else if (inString === null) {\n inString = char\n }\n continue\n }\n\n // Track parentheses depth\n if (!inString) {\n if (char === '(') {\n depth++\n } else if (char === ')') {\n depth--\n }\n }\n\n // Look for operator at depth 0, outside strings\n if (!inString && depth === 0) {\n if (expr.substring(i, i + operator.length) === operator) {\n return i\n }\n }\n }\n\n return -1\n}\n\n/**\n * Evaluate an expression in a given context\n * @param expr - Expression to evaluate\n * @param context - Variable context\n * @returns Evaluated value\n */\nexport function evaluateExpression(expr: Expression, context: IContext): unknown {\n switch (expr.type) {\n case 'literal':\n return expr.value\n\n case 'variable':\n return context.get(expr.name)\n\n case 'binary': {\n const left = evaluateExpression(expr.left, context)\n const right = evaluateExpression(expr.right, context)\n\n switch (expr.operator) {\n case '==':\n // eslint-disable-next-line eqeqeq\n return left == right\n case '!=':\n // eslint-disable-next-line eqeqeq\n return left != right\n case '<':\n return (left as number) < (right as number)\n case '>':\n return (left as number) > (right as number)\n case '<=':\n return (left as number) <= (right as number)\n case '>=':\n return (left as number) >= (right as number)\n case 'and':\n return isTruthy(left) && isTruthy(right)\n case 'or':\n return isTruthy(left) || isTruthy(right)\n }\n break\n }\n\n case 'unary': {\n const operand = evaluateExpression(expr.operand, context)\n\n switch (expr.operator) {\n case 'not':\n return !isTruthy(operand)\n }\n break\n }\n }\n\n return undefined\n}\n\n/**\n * Determine if a value is truthy in template context\n * @param value - Value to check\n * @returns true if truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n", "/**\n * Template parser\n * Converts template strings into AST (Abstract Syntax Tree)\n */\n\nimport type { ASTNode, ParseResult, ParseError } from './types.js'\nimport { parseExpression } from './evaluator.js'\n\n/**\n * Parse a template string into an AST\n * @param template - Template string to parse\n * @returns Parse result with AST and errors\n */\nexport function parse(template: string): ParseResult {\n const errors: ParseError[] = []\n const ast: ASTNode[] = []\n\n let position = 0\n let line = 1\n let column = 1\n\n /**\n * Create a parse error\n */\n function createError(message: string): ParseError {\n return { message, position, line, column }\n }\n\n /**\n * Advance position tracking\n */\n function advance(count: number): void {\n for (let i = 0; i < count; i++) {\n if (template[position + i] === '\\n') {\n line++\n column = 1\n } else {\n column++\n }\n }\n position += count\n }\n\n /**\n * Find the next occurrence of a string\n */\n function findNext(str: string, from: number = position): number {\n return template.indexOf(str, from)\n }\n\n /**\n * Extract text between current position and a target position\n */\n function extractTo(target: number): string {\n const text = template.substring(position, target)\n advance(target - position)\n return text\n }\n\n while (position < template.length) {\n // Look for template tags\n const varStart = findNext('{{', position)\n const tagStart = findNext('{%', position)\n const commentStart = findNext('{#', position)\n\n // Find the nearest tag\n const candidates = [\n { pos: varStart, type: 'var' },\n { pos: tagStart, type: 'tag' },\n { pos: commentStart, type: 'comment' },\n ].filter((c) => c.pos !== -1)\n\n if (candidates.length === 0) {\n // No more tags, rest is text\n const text = template.substring(position)\n if (text) {\n ast.push({ type: 'text', value: text })\n }\n break\n }\n\n // Sort to find nearest\n candidates.sort((a, b) => a.pos - b.pos)\n const nearest = candidates[0]\n\n // Add text before tag\n if (nearest.pos > position) {\n ast.push({ type: 'text', value: extractTo(nearest.pos) })\n }\n\n // Parse the tag\n if (nearest.type === 'var') {\n // Variable: {{ name }}\n advance(2) // Skip {{\n const endPos = findNext('}}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed variable tag'))\n break\n }\n\n const varName = extractTo(endPos).trim()\n advance(2) // Skip }}\n\n ast.push({ type: 'variable', name: varName })\n } else if (nearest.type === 'comment') {\n // Comment: {# ... #}\n // Auto-strip newlines for comments (they produce no output)\n // Only strip if the comment is on its own line\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n // Only strip if previous text ends with newline (comment is on its own line)\n if (/\\n[ \\t]*$/.test(lastNode.value)) {\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t]*$/, '')\n }\n }\n\n advance(2) // Skip {#\n const endPos = findNext('#}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed comment tag'))\n break\n }\n\n const commentText = extractTo(endPos)\n advance(2) // Skip #}\n\n ast.push({ type: 'comment', value: commentText })\n\n // Auto-strip following newline if comment is on its own line\n if (position < template.length && template[position] === '\\n') {\n advance(1)\n // Also skip any indentation on the next line\n while (position < template.length && /[ \\t]/.test(template[position])) {\n advance(1)\n }\n }\n } else if (nearest.type === 'tag') {\n // Statement tag: {% ... %}\n advance(2) // Skip {%\n const endPos = findNext('%}', position)\n\n if (endPos === -1) {\n errors.push(createError('Unclosed statement tag'))\n break\n }\n\n let statement = extractTo(endPos).trim()\n\n // Check for whitespace control characters\n const hasLeftStrip = statement.startsWith('-')\n const hasRightStrip = statement.endsWith('-')\n\n // Strip whitespace control characters from statement\n if (hasLeftStrip) {\n statement = statement.substring(1).trim()\n // Strip trailing whitespace from previous text node\n if (ast.length > 0 && ast[ast.length - 1].type === 'text') {\n const lastNode = ast[ast.length - 1] as { type: 'text'; value: string }\n lastNode.value = lastNode.value.replace(/[ \\t]*\\n[ \\t\\n]*$/, '')\n }\n }\n if (hasRightStrip) {\n statement = statement.substring(0, statement.length - 1).trim()\n }\n\n advance(2) // Skip %}\n\n // If right strip, consume following whitespace\n if (hasRightStrip) {\n while (position < template.length && /[ \\t\\n]/.test(template[position])) {\n advance(1)\n }\n }\n\n // Parse different statement types\n if (statement.startsWith('set ')) {\n // {% set var = value %}\n const setMatch = /^set\\s+(\\w+)\\s*=\\s*(.+)$/.exec(statement)\n if (setMatch) {\n try {\n const expr = parseExpression(setMatch[2])\n\n ast.push({\n type: 'set',\n name: setMatch[1],\n value: expr,\n })\n } catch (error) {\n errors.push(createError(`Invalid set expression: ${(error as Error).message}`))\n }\n } else {\n errors.push(createError('Invalid set syntax'))\n }\n } else if (statement.startsWith('if ')) {\n // {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}\n const condition = statement.substring(3).trim()\n\n try {\n const expr = parseExpression(condition)\n\n // Find the body and elif/else/endif blocks\n const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'if',\n condition: expr,\n trueBranch,\n elifBranches: elifBranches.length > 0 ? elifBranches : undefined,\n elseBranch: elseBranch.length > 0 ? elseBranch : undefined,\n })\n } catch (error) {\n errors.push(createError(`Invalid if expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('include ')) {\n // {% include \"path\" %}\n const includeMatch = /^include\\s+[\"']([^\"']+)[\"']/.exec(statement)\n if (includeMatch) {\n ast.push({\n type: 'include',\n path: includeMatch[1],\n })\n } else {\n errors.push(createError('Invalid include syntax'))\n }\n } else if (statement.startsWith('switch ')) {\n // {% switch variable %} ... {% case \"value\" %} ... {% endswitch %}\n const switchExpr = statement.substring(7).trim()\n\n try {\n const expr = parseExpression(switchExpr)\n const { cases, parseErrors } = parseSwitchBlock()\n errors.push(...parseErrors)\n\n ast.push({\n type: 'switch',\n expression: expr,\n cases,\n })\n } catch (error) {\n errors.push(createError(`Invalid switch expression: ${(error as Error).message}`))\n }\n } else if (statement.startsWith('leveloffset ')) {\n // {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}\n const offsetMatch = /^leveloffset\\s+([-+]?\\d+)$/.exec(statement)\n\n if (!offsetMatch) {\n errors.push(createError('Invalid leveloffset syntax'))\n } else {\n const offsetStr = offsetMatch[1]\n const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-')\n const offset = parseInt(offsetStr, 10)\n\n if (isNaN(offset)) {\n errors.push(createError('Invalid leveloffset value'))\n } else {\n // Find matching endleveloffset accounting for nesting\n let depth = 0\n let searchPos = position\n let endPos = -1\n\n while (searchPos < template.length) {\n const leveloffsetMatch = /{%-?\\s*leveloffset\\s+[-+]?\\d+\\s*-?%}/.exec(template.substring(searchPos))\n const endleveloffsetMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(searchPos))\n\n const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity\n const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity\n\n if (leveloffsetPos < endleveloffsetPos) {\n // Found nested leveloffset\n depth++\n searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0)\n } else if (endleveloffsetPos < Infinity) {\n // Found endleveloffset\n if (depth === 0) {\n // This is our matching endleveloffset\n endPos = endleveloffsetPos\n break\n } else {\n depth--\n searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0)\n }\n } else {\n // No more tags found\n break\n }\n }\n\n if (endPos === -1) {\n errors.push(createError('Missing endleveloffset'))\n } else {\n const bodyTemplate = extractTo(endPos)\n // Find and skip the endleveloffset tag\n const endMatch = /{%-?\\s*endleveloffset\\s*-?%}/.exec(template.substring(position))\n if (endMatch) {\n advance(endMatch[0].length)\n }\n\n const bodyResult = parse(bodyTemplate)\n errors.push(...bodyResult.errors)\n\n ast.push({\n type: 'leveloffset',\n offset,\n isRelative,\n body: bodyResult.ast,\n })\n }\n }\n }\n }\n // Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags\n }\n }\n\n return { ast, errors }\n\n /**\n * Find an end tag like {% endif %}\n */\n function findEndTag(tagName: string): { start: number; length: number } | null {\n const pattern = new RegExp(`{%\\\\s*${tagName}\\\\s*%}`)\n const match = pattern.exec(template.substring(position))\n\n if (match) {\n return {\n start: position + match.index,\n length: match[0].length,\n }\n }\n\n return null\n }\n\n /**\n * Parse an if block with elif and else support\n */\n function parseIfBlock(): {\n trueBranch: ASTNode[]\n elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }>\n elseBranch: ASTNode[]\n parseErrors: ParseError[]\n } {\n const elifBranches: Array<{ condition: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n let elseBranch: ASTNode[] = []\n\n // Find the next elif, else, or endif\n let depth = 0\n let searchPos = position\n\n while (searchPos < template.length) {\n const ifMatch = /{%-?\\s*if\\s+/.exec(template.substring(searchPos))\n const elifMatch = /{%-?\\s*elif\\s+/.exec(template.substring(searchPos))\n const elseMatch = /{%-?\\s*else\\s*-?%}/.exec(template.substring(searchPos))\n const endifMatch = /{%-?\\s*endif\\s*-?%}/.exec(template.substring(searchPos))\n\n // Find the nearest match\n const matches = [\n { type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },\n { type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },\n { type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },\n { type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },\n ].sort((a, b) => a.pos - b.pos)\n\n const nearest = matches[0]\n\n if (!nearest.match || nearest.pos === Infinity) {\n parseErrors.push(createError('Missing endif'))\n break\n }\n\n if (nearest.type === 'if') {\n depth++\n searchPos = nearest.pos + nearest.match[0].length\n } else if (nearest.type === 'endif') {\n if (depth === 0) {\n // This is our endif\n const bodyTemplate = extractTo(nearest.pos)\n advance(nearest.match[0].length)\n\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n\n return {\n trueBranch: bodyResult.ast,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } else {\n depth--\n searchPos = nearest.pos + nearest.match[0].length\n }\n } else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {\n // Parse the body before elif/else\n const bodyTemplate = extractTo(nearest.pos)\n const bodyResult = parse(bodyTemplate)\n\n if (elifBranches.length === 0 && elseBranch.length === 0) {\n // This is the trueBranch (before first elif/else)\n parseErrors.push(...bodyResult.errors)\n const trueBranch = bodyResult.ast\n\n // Now handle elif or else\n if (nearest.type === 'elif') {\n // Extract elif condition\n advance(nearest.match[0].length)\n const condMatch = /^([^%]+)%}/.exec(template.substring(position))\n if (condMatch) {\n const condStr = condMatch[1].trim()\n advance(condMatch[0].length)\n\n try {\n const elifCondition = parseExpression(condStr)\n const elifResult = parseIfBlock()\n parseErrors.push(...elifResult.parseErrors)\n\n elifBranches.push({\n condition: elifCondition,\n body: elifResult.trueBranch,\n })\n elifBranches.push(...(elifResult.elifBranches || []))\n elseBranch = elifResult.elseBranch\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n } catch (error) {\n parseErrors.push(createError(`Invalid elif expression: ${(error as Error).message}`))\n }\n }\n } else {\n // else\n advance(nearest.match[0].length)\n\n // Find endif for else block\n const endifMatch = findEndTag('endif')\n if (!endifMatch) {\n parseErrors.push(createError('Missing endif after else'))\n } else {\n const elseBodyTemplate = extractTo(endifMatch.start)\n advance(endifMatch.length)\n\n const elseBodyResult = parse(elseBodyTemplate)\n parseErrors.push(...elseBodyResult.errors)\n elseBranch = elseBodyResult.ast\n }\n\n return {\n trueBranch,\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n }\n } else {\n searchPos = nearest.pos + nearest.match[0].length\n }\n }\n\n return {\n trueBranch: [],\n elifBranches,\n elseBranch,\n parseErrors,\n }\n }\n\n /**\n * Parse a switch block with case support\n */\n function parseSwitchBlock(): {\n cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }>\n parseErrors: ParseError[]\n } {\n const cases: Array<{ value: import('./types.js').Expression; body: ASTNode[] }> = []\n const parseErrors: ParseError[] = []\n\n while (position < template.length) {\n // Find the next case or endswitch\n const caseMatch = /{%-?\\s*case\\s+/.exec(template.substring(position))\n const endswitchMatch = /{%-?\\s*endswitch\\s*-?%}/.exec(template.substring(position))\n\n // Find which comes first\n const casePos = caseMatch ? position + caseMatch.index : Infinity\n const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity\n\n if (endswitchPos < casePos) {\n // Found endswitch before any case (or no case)\n // Parse any remaining content before endswitch as the last case body\n if (cases.length > 0 && position < endswitchPos) {\n const bodyTemplate = extractTo(endswitchPos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n }\n\n // Skip endswitch\n advance(endswitchPos - position + (endswitchMatch?.[0].length || 0))\n break\n } else if (casePos < Infinity) {\n // Found a case\n // If there's a previous case, parse its body\n if (cases.length > 0 && position < casePos) {\n const bodyTemplate = extractTo(casePos)\n const bodyResult = parse(bodyTemplate)\n parseErrors.push(...bodyResult.errors)\n cases[cases.length - 1].body = bodyResult.ast\n } else if (position < casePos) {\n // Content before first case - skip it\n extractTo(casePos)\n }\n\n // Parse the case value\n advance(caseMatch![0].length)\n\n // Extract the case value (until %})\n const valueMatch = /([^%]+)%}/.exec(template.substring(position))\n if (valueMatch) {\n const valueStr = valueMatch[1].trim()\n advance(valueMatch[0].length)\n\n try {\n const caseValue = parseExpression(valueStr)\n cases.push({\n value: caseValue,\n body: [], // Will be filled in next iteration or at endswitch\n })\n } catch (error) {\n parseErrors.push(createError(`Invalid case value: ${(error as Error).message}`))\n }\n } else {\n parseErrors.push(createError('Invalid case syntax'))\n break\n }\n } else {\n // No case or endswitch found\n parseErrors.push(createError('Missing endswitch'))\n break\n }\n }\n\n return { cases, parseErrors }\n }\n}\n", "/**\n * Context management for variable scoping\n * Supports nested scopes with inheritance\n */\n\nimport type { IContext } from './types.js'\n\nexport interface ContextOptions {\n /**\n * Convert hyphenated variable names to underscores during lookup.\n */\n hyphenToUnderscore?: boolean\n}\n\nexport class Context implements IContext {\n private variables: Map<string, unknown>\n private parent: Context | null\n private options: ContextOptions\n\n constructor(parent?: Context, options?: ContextOptions) {\n this.variables = new Map()\n this.parent = parent || null\n this.options = options || parent?.options || {}\n }\n\n /**\n * Get a variable from the context (supports dot notation)\n * @param name - Variable name (can use dot notation like \"obj.prop.subprop\")\n * @returns The variable value or undefined\n */\n get(name: string): unknown {\n // Convert hyphens to underscores if option is enabled\n const normalizedName = this.options.hyphenToUnderscore\n ? name.replace(/-/g, '_')\n : name\n\n const parts = normalizedName.split('.')\n const rootName = parts[0]\n\n // Look up the root variable in current scope or parent scopes\n let value: unknown\n if (this.variables.has(rootName)) {\n value = this.variables.get(rootName)\n } else if (this.parent) {\n value = this.parent.get(rootName)\n } else {\n return undefined\n }\n\n // Navigate nested properties\n for (let i = 1; i < parts.length; i++) {\n if (value === null || value === undefined) {\n return undefined\n }\n\n // Only allow property access on plain objects (prevent prototype pollution)\n if (typeof value !== 'object' || Array.isArray(value)) {\n return undefined\n }\n\n // Prevent access to prototype chain\n if (!Object.prototype.hasOwnProperty.call(value, parts[i])) {\n return undefined\n }\n\n value = (value as Record<string, unknown>)[parts[i]]\n }\n\n return value\n }\n\n /**\n * Set a variable in the current context\n * @param name - Variable name (can use dot notation)\n * @param value - Value to set\n */\n set(name: string, value: unknown): void {\n const parts = name.split('.')\n\n if (parts.length === 1) {\n // Simple assignment\n this.variables.set(name, value)\n return\n }\n\n // Nested assignment - navigate to parent object\n const rootName = parts[0]\n let target = this.variables.get(rootName) as Record<string, unknown> | undefined\n\n if (!target || typeof target !== 'object' || Array.isArray(target)) {\n // Create new object if root doesn't exist or isn't an object\n target = {}\n this.variables.set(rootName, target)\n }\n\n // Navigate to the parent of the target property\n for (let i = 1; i < parts.length - 1; i++) {\n const key = parts[i]\n\n if (\n !target[key] ||\n typeof target[key] !== 'object' ||\n Array.isArray(target[key])\n ) {\n target[key] = {}\n }\n\n target = target[key] as Record<string, unknown>\n }\n\n // Set the final property\n target[parts[parts.length - 1]] = value\n }\n\n /**\n * Create a child scope\n * @returns A new Context with this context as parent\n */\n push(): Context {\n return new Context(this, this.options)\n }\n\n /**\n * Return to parent scope\n * @returns The parent context or null if at root\n */\n pop(): Context | null {\n return this.parent\n }\n\n /**\n * Create a context from a plain object\n * @param data - Plain object to convert to context\n * @param options - Context options\n * @returns New Context instance\n */\n static from(data: Record<string, unknown>, options?: ContextOptions): Context {\n const ctx = new Context(undefined, options)\n for (const [key, value] of Object.entries(data)) {\n ctx.set(key, value)\n }\n return ctx\n }\n}\n", "/**\n * Fetch-based loader for browsers and service workers\n */\n\nimport type { Loader } from './types.js'\n\nexport class FetchLoader implements Loader {\n async load(path: string, basePath?: string): Promise<string> {\n const url = basePath ? new URL(path, basePath).href : path\n const fetchUrl = `${url}?preventCache=${Date.now()}`\n\n const response = await fetch(fetchUrl)\n\n if (!response.ok) {\n throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`)\n }\n\n return await response.text()\n }\n}\n", "/**\n * Template renderer\n * Combines parser, evaluator, and loader to render templates\n */\n\nimport type { ASTNode, Expression, RenderOptions, Loader } from './types.js'\nimport { parse } from './parser.js'\nimport { Context } from './context.js'\nimport { evaluateExpression } from './evaluator.js'\nimport { FetchLoader } from './loader-fetch.js'\n\n/**\n * Transform markdown headings by applying level offset\n * Clamps to valid markdown range (1-6)\n * @param text - Text content to transform\n * @param offset - Level offset to apply\n * @returns Transformed text with adjusted heading levels\n */\nfunction transformHeadings(text: string, offset: number): string {\n if (offset === 0) {\n return text\n }\n\n // Match markdown headings: # through ######\n return text.replace(/^(#{1,6})(\\s+)/gm, (_match, hashes, space) => {\n const currentLevel = hashes.length\n const newLevel = Math.max(1, Math.min(6, currentLevel + offset))\n return '#'.repeat(newLevel) + space\n })\n}\n\n/**\n * Resolve a relative path against a base path\n * @param path - Relative or absolute path\n * @param basePath - Base path to resolve against\n * @returns Resolved path\n */\nfunction resolvePath(path: string, basePath: string): string {\n // If path is absolute, return as-is\n if (path.startsWith('/')) {\n return path\n }\n\n // Ensure basePath ends with /\n const base = basePath.endsWith('/') ? basePath : basePath + '/'\n\n // Combine and normalize\n const combined = base + path\n\n // Normalize . and .. segments\n const parts = combined.split('/')\n const resolved: string[] = []\n\n for (const part of parts) {\n if (part === '.' || part === '') {\n continue\n } else if (part === '..') {\n resolved.pop()\n } else {\n resolved.push(part)\n }\n }\n\n // Preserve leading slash if original had one\n const prefix = combined.startsWith('/') ? '/' : ''\n return prefix + resolved.join('/')\n}\n\n/**\n * Render a template string\n * @param template - Template string to render\n * @param options - Render options\n * @returns Rendered output\n */\nexport async function render(template: string, options: RenderOptions = {}): Promise<string> {\n const {\n loader = new FetchLoader(),\n context: initialContext = {},\n basePath = '',\n maxIncludeDepth = 10,\n timeout = 5000,\n hyphenToUnderscore = false,\n undefinedBehavior = 'empty',\n undefinedConditions = 'preserve',\n } = options\n\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Template rendering timeout')), timeout)\n })\n\n // Render with timeout\n const renderPromise = renderInternal(template, {\n loader,\n context: Context.from(\n {\n ...initialContext,\n // Built-in variables\n date: new Date().toISOString().split('T')[0],\n timestamp: Date.now(),\n _levelOffset: 0,\n },\n { hyphenToUnderscore }\n ),\n includeDepth: 0,\n maxIncludeDepth,\n basePath,\n undefinedBehavior,\n undefinedConditions,\n })\n\n return await Promise.race([renderPromise, timeoutPromise])\n}\n\ninterface InternalRenderOptions {\n loader: Loader\n context: Context\n includeDepth: number\n maxIncludeDepth: number\n basePath: string\n undefinedBehavior: 'empty' | 'throw' | 'preserve'\n undefinedConditions: 'preserve' | 'falsy'\n}\n\n/**\n * Internal rendering function with depth tracking\n */\nasync function renderInternal(\n template: string,\n options: InternalRenderOptions\n): Promise<string> {\n const { includeDepth, maxIncludeDepth } = options\n\n // Check recursion depth\n if (includeDepth > maxIncludeDepth) {\n throw new Error(`Maximum include depth (${maxIncludeDepth}) exceeded`)\n }\n\n // Parse template\n const parseResult = parse(template)\n\n if (parseResult.errors.length > 0) {\n const errorMessages = parseResult.errors.map((e) => e.message).join(', ')\n throw new Error(`Parse errors: ${errorMessages}`)\n }\n\n // Render AST\n return await renderNodes(parseResult.ast, options)\n}\n\n/**\n * Render an array of AST nodes\n */\nasync function renderNodes(nodes: ASTNode[], options: InternalRenderOptions): Promise<string> {\n const parts: string[] = []\n\n for (const node of nodes) {\n parts.push(await renderNode(node, options))\n }\n\n return parts.join('')\n}\n\n/**\n * Render a single AST node\n */\nasync function renderNode(node: ASTNode, options: InternalRenderOptions): Promise<string> {\n const { loader, context, includeDepth, maxIncludeDepth, basePath } = options\n\n switch (node.type) {\n case 'text': {\n // Apply leveloffset if active\n const currentOffset = context.get('_levelOffset') as number || 0\n if (currentOffset === 0) {\n return node.value\n }\n return transformHeadings(node.value, currentOffset)\n }\n\n case 'variable': {\n const value = context.get(node.name)\n if (value === undefined || value === null) {\n // Apply the undefined-variable policy. See RenderOptions.undefinedBehavior.\n switch (options.undefinedBehavior) {\n case 'throw':\n throw new Error(`Undefined variable: ${node.name}`)\n case 'preserve':\n // Round-trip the source form so downstream tooling (or a\n // second-pass minja run with the value supplied) can pick\n // up where we left off.\n return `{{ ${node.name} }}`\n case 'empty':\n default:\n return ''\n }\n }\n const str = String(value)\n // If the value contains template syntax, re-process it\n if (str.includes('{{') || str.includes('{%')) {\n return await renderInternal(str, options)\n }\n return str\n }\n\n case 'set': {\n const value = evaluateExpression(node.value, context)\n context.set(node.name, value)\n return ''\n }\n\n case 'comment':\n return ''\n\n case 'if': {\n // In preserve mode, an `if` whose condition references an\n // undefined identifier can't be evaluated \u2014 we don't know\n // which branch to take. Preserve the whole `{% if \u2026 %}\u2026{% endif %}`\n // verbatim so a second pass (with the value supplied) can\n // resolve it. See plans/format-asciidoc-import.md.\n //\n // Except when `undefinedConditions === 'falsy'`: this is a\n // terminal build with no later pass, so treat the undefined\n // reference as falsy (AsciiDoc `ifdef::attr[]` semantics) and\n // evaluate now rather than leak the directive to readers.\n if (options.undefinedBehavior === 'preserve' && options.undefinedConditions !== 'falsy') {\n const undefinedRefs = findUndefinedRefs(node.condition, context)\n if (undefinedRefs.length > 0) {\n return ifNodeToSource(node)\n }\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n if (findUndefinedRefs(elif.condition, context).length > 0) {\n return ifNodeToSource(node)\n }\n }\n }\n }\n\n const condition = evaluateExpression(node.condition, context)\n\n if (isTruthy(condition)) {\n return await renderNodes(node.trueBranch, options)\n }\n\n // Check elif branches\n if (node.elifBranches) {\n for (const elifBranch of node.elifBranches) {\n const elifCondition = evaluateExpression(elifBranch.condition, context)\n if (isTruthy(elifCondition)) {\n return await renderNodes(elifBranch.body, options)\n }\n }\n }\n\n // Render else branch if present\n if (node.elseBranch) {\n return await renderNodes(node.elseBranch, options)\n }\n\n return ''\n }\n\n case 'include': {\n try {\n // Load the included file\n const includedContent = await loader.load(node.path, basePath)\n\n // Determine new base path for nested includes\n let newBasePath = basePath\n\n // If path looks like a URL, extract base\n if (node.path.includes('://')) {\n const url = new URL(node.path)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else if (basePath) {\n // Relative path - resolve against current base\n if (basePath.includes('://')) {\n const url = new URL(node.path, basePath)\n newBasePath = url.href.substring(0, url.href.lastIndexOf('/') + 1)\n } else {\n // File path - resolve relative to current base and extract directory\n const resolvedPath = resolvePath(node.path, basePath)\n const lastSlash = resolvedPath.lastIndexOf('/')\n newBasePath = lastSlash >= 0 ? resolvedPath.substring(0, lastSlash + 1) : basePath\n }\n } else if (node.path.includes('/')) {\n // No base path but include has directory - use that as base\n const lastSlash = node.path.lastIndexOf('/')\n newBasePath = node.path.substring(0, lastSlash + 1)\n }\n\n // Render the included template (recursive)\n return await renderInternal(includedContent, {\n loader,\n context,\n includeDepth: includeDepth + 1,\n maxIncludeDepth,\n basePath: newBasePath,\n undefinedBehavior: options.undefinedBehavior,\n undefinedConditions: options.undefinedConditions,\n })\n } catch (error) {\n // In `preserve` mode, an unresolvable include is preserved\n // as the original directive so a later renderer pass (with\n // the file in place) can resolve it. Matches the semantic\n // of `preserve` for undefined variables. Without this,\n // multi-stage pipelines (e.g. dogsbay's convert + build\n // preprocessor for AsciiDoc imports) lose the directive at\n // stage 1 because targets only exist after stage 2 has\n // converted sibling files.\n if (options.undefinedBehavior === 'preserve') {\n return `{% include \"${node.path}\" %}`\n }\n const message = error instanceof Error ? error.message : String(error)\n console.error(`Failed to include ${node.path}:`, message)\n return `<!-- Include error: ${node.path} -->`\n }\n }\n\n case 'switch': {\n const switchValue = evaluateExpression(node.expression, context)\n\n // Find matching case\n for (const caseItem of node.cases) {\n const caseValue = evaluateExpression(caseItem.value, context)\n // eslint-disable-next-line eqeqeq\n if (switchValue == caseValue) {\n return await renderNodes(caseItem.body, options)\n }\n }\n\n // No matching case found\n return ''\n }\n\n case 'leveloffset': {\n // Calculate new offset (relative or absolute)\n const parentOffset = context.get('_levelOffset') as number || 0\n const newOffset = node.isRelative ? parentOffset + node.offset : node.offset\n\n // Store current offset to restore later\n const previousOffset = parentOffset\n\n // Set new offset in context\n context.set('_levelOffset', newOffset)\n\n try {\n // Render body with offset active\n const result = await renderNodes(node.body, options)\n return result\n } finally {\n // Always restore previous offset\n context.set('_levelOffset', previousOffset)\n }\n }\n\n default:\n // TypeScript exhaustiveness check\n const _exhaustive: never = node\n return _exhaustive\n }\n}\n\n/**\n * Determine if a value is truthy\n */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (value === 0 || value === '') {\n return false\n }\n return true\n}\n\n// ============================================================================\n// Preserve-mode helpers \u2014 round-trip AST back to Jinja source so an\n// undefined-referencing block can survive into the rendered output for\n// a downstream pass to resolve.\n// ============================================================================\n\n/**\n * Walk an expression AST, return the names of any `variable` references\n * whose context lookup is undefined. Empty array = all refs are bound.\n */\nfunction findUndefinedRefs(expr: Expression, context: Context): string[] {\n const out: string[] = []\n function walk(e: Expression): void {\n switch (e.type) {\n case 'variable':\n if (context.get(e.name) === undefined) out.push(e.name)\n break\n case 'binary':\n walk(e.left)\n walk(e.right)\n break\n case 'unary':\n walk(e.operand)\n break\n case 'literal':\n break\n }\n }\n walk(expr)\n return out\n}\n\n/**\n * Serialize an Expression back to Jinja source. Used by preserve mode\n * to reconstruct `{% if \u2026 %}` headers when the condition can't be\n * evaluated. Operator precedence isn't tracked; the output is\n * conservatively parenthesized for binary/unary so a re-parse round-\n * trips to the same AST shape (modulo redundant parens).\n */\nfunction expressionToSource(expr: Expression): string {\n switch (expr.type) {\n case 'literal':\n if (typeof expr.value === 'string') return JSON.stringify(expr.value)\n if (expr.value === null) return 'null'\n return String(expr.value)\n case 'variable':\n return expr.name\n case 'unary':\n return `not ${expressionToSource(expr.operand)}`\n case 'binary':\n return `(${expressionToSource(expr.left)} ${expr.operator} ${expressionToSource(expr.right)})`\n }\n}\n\n/**\n * Serialize ASTNode[] back to Jinja source. Mirrors the parser's syntax\n * for every node type so a preserved block can be re-rendered later\n * with the missing values supplied.\n *\n * Throws on shapes we don't support (deep nested includes, switch);\n * preserve mode is opt-in and a hard error here beats silent\n * truncation. The shapes covered are everything md2md emits in the\n * AsciiDoc pipeline.\n */\nfunction nodesToSource(nodes: ASTNode[]): string {\n return nodes.map(nodeToSource).join('')\n}\n\nfunction nodeToSource(node: ASTNode): string {\n switch (node.type) {\n case 'text':\n return node.value\n case 'variable':\n return `{{ ${node.name} }}`\n case 'set':\n return `{% set ${node.name} = ${expressionToSource(node.value)} %}`\n case 'comment':\n // Parser strips comment content; emit a placeholder so the block\n // structure round-trips even when the prose inside doesn't.\n return '{# \u2026 #}'\n case 'if':\n return ifNodeToSource(node)\n case 'include':\n return `{% include \"${node.path}\" %}`\n case 'leveloffset': {\n const sign = node.isRelative && node.offset >= 0 ? '+' : ''\n return `{% leveloffset ${sign}${node.offset} %}${nodesToSource(node.body)}{% endleveloffset %}`\n }\n case 'switch': {\n // Conservative round-trip; switch isn't on the AsciiDoc hot path\n // but we have an AST shape, so emit it.\n const cases = node.cases\n .map((c) => `{% case ${expressionToSource(c.value)} %}${nodesToSource(c.body)}`)\n .join('')\n return `{% switch ${expressionToSource(node.expression)} %}${cases}{% endswitch %}`\n }\n }\n}\n\nfunction ifNodeToSource(node: Extract<ASTNode, { type: 'if' }>): string {\n const parts = [`{% if ${expressionToSource(node.condition)} %}`, nodesToSource(node.trueBranch)]\n if (node.elifBranches) {\n for (const elif of node.elifBranches) {\n parts.push(`{% elif ${expressionToSource(elif.condition)} %}`, nodesToSource(elif.body))\n }\n }\n if (node.elseBranch) {\n parts.push(`{% else %}`, nodesToSource(node.elseBranch))\n }\n parts.push(`{% endif %}`)\n return parts.join('')\n}\n", "/**\n * Memory-based loader for testing\n */\n\nimport type { Loader } from './types.js'\n\nexport class MemoryLoader implements Loader {\n private files: Map<string, string>\n\n constructor(files: Record<string, string> = {}) {\n this.files = new Map(Object.entries(files))\n }\n\n addFile(path: string, content: string): void {\n this.files.set(path, content)\n }\n\n async load(path: string, basePath?: string): Promise<string> {\n // Resolve path with normalization of . and .. segments\n const combined = basePath && !path.startsWith('/')\n ? `${basePath}/${path}`\n : path\n\n const parts = combined.split('/')\n const normalized: string[] = []\n for (const part of parts) {\n if (part === '.' || part === '') continue\n if (part === '..') { normalized.pop(); continue }\n normalized.push(part)\n }\n const prefix = combined.startsWith('/') ? '/' : ''\n const resolvedPath = prefix + normalized.join('/')\n\n const content = this.files.get(resolvedPath)\n\n if (content === undefined) {\n throw new Error(`File not found: ${resolvedPath}`)\n }\n\n return content\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;4bAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,aAAAE,EAAA,gBAAAC,EAAA,iBAAAC,EAAA,uBAAAC,EAAA,UAAAC,EAAA,oBAAAC,EAAA,WAAAC,ICaO,SAASC,EAAgBC,EAA0B,CAIxD,GAHAA,EAAOA,EAAK,KAAK,EAGbA,IAAS,OACX,MAAO,CAAE,KAAM,UAAW,MAAO,EAAK,EAExC,GAAIA,IAAS,QACX,MAAO,CAAE,KAAM,UAAW,MAAO,EAAM,EAEzC,GAAIA,IAAS,OACX,MAAO,CAAE,KAAM,UAAW,MAAO,IAAK,EAIxC,GAAIA,EAAK,WAAW,GAAG,GAAKA,EAAK,SAAS,GAAG,EAC3C,MAAO,CAAE,KAAM,UAAW,MAAOA,EAAK,MAAM,EAAG,EAAE,CAAE,EAIrD,GAAIA,EAAK,WAAW,GAAG,GAAKA,EAAK,SAAS,GAAG,EAC3C,MAAO,CAAE,KAAM,UAAW,MAAOA,EAAK,MAAM,EAAG,EAAE,CAAE,EAIrD,GAAI,kBAAkB,KAAKA,CAAI,EAC7B,MAAO,CAAE,KAAM,UAAW,MAAO,WAAWA,CAAI,CAAE,EAIpD,GAAIA,EAAK,WAAW,GAAG,GAAKA,EAAK,SAAS,GAAG,EAAG,CAE9C,IAAIC,EAAQ,EACRC,EAAW,GAEf,QAASC,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAQ/B,GAPIH,EAAKG,CAAC,IAAM,IACdF,IACSD,EAAKG,CAAC,IAAM,KACrBF,IAIEA,IAAU,GAAKE,EAAIH,EAAK,OAAS,EAAG,CACtCE,EAAW,GACX,KACF,CAIF,GAAIA,GAAYD,IAAU,EACxB,OAAOF,EAAgBC,EAAK,MAAM,EAAG,EAAE,CAAC,CAE5C,CAGA,GAAIA,EAAK,WAAW,MAAM,EACxB,MAAO,CACL,KAAM,QACN,SAAU,MACV,QAASD,EAAgBC,EAAK,UAAU,CAAC,CAAC,CAC5C,EAIF,IAAMI,EAAUC,EAAaL,EAAM,MAAM,EACzC,GAAII,IAAY,GACd,MAAO,CACL,KAAM,SACN,SAAU,KACV,KAAML,EAAgBC,EAAK,UAAU,EAAGI,CAAO,CAAC,EAChD,MAAOL,EAAgBC,EAAK,UAAUI,EAAU,CAAC,CAAC,CACpD,EAIF,IAAME,EAAWD,EAAaL,EAAM,OAAO,EAC3C,GAAIM,IAAa,GACf,MAAO,CACL,KAAM,SACN,SAAU,MACV,KAAMP,EAAgBC,EAAK,UAAU,EAAGM,CAAQ,CAAC,EACjD,MAAOP,EAAgBC,EAAK,UAAUM,EAAW,CAAC,CAAC,CACrD,EAIF,IAAMC,EAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACvD,QAAWC,KAAMD,EAAe,CAC9B,IAAME,EAAUJ,EAAaL,EAAM,IAAIQ,CAAE,GAAG,EAC5C,GAAIC,IAAY,GACd,MAAO,CACL,KAAM,SACN,SAAUD,EACV,KAAMT,EAAgBC,EAAK,UAAU,EAAGS,CAAO,CAAC,EAChD,MAAOV,EAAgBC,EAAK,UAAUS,EAAUD,EAAG,OAAS,CAAC,CAAC,CAChE,CAEJ,CASA,GAAI,YAAY,KAAKR,CAAI,EACvB,MAAO,CAAE,KAAM,WAAY,KAAMA,CAAK,EAIxC,MAAM,IAAI,MAAM,uBAAuBA,CAAI,EAAE,CAC/C,CAQA,SAASK,EAAaL,EAAcU,EAA0B,CAC5D,IAAIC,EAA0B,KAC1BV,EAAQ,EAEZ,QAAS,EAAI,EAAG,EAAID,EAAK,OAAQ,IAAK,CACpC,IAAMY,EAAOZ,EAAK,CAAC,EAGnB,IAAKY,IAAS,KAAOA,IAAS,OAAS,IAAM,GAAKZ,EAAK,EAAI,CAAC,IAAM,MAAO,CACnEW,IAAaC,EACfD,EAAW,KACFA,IAAa,OACtBA,EAAWC,GAEb,QACF,CAYA,GATKD,IACCC,IAAS,IACXX,IACSW,IAAS,KAClBX,KAKA,CAACU,GAAYV,IAAU,GACrBD,EAAK,UAAU,EAAG,EAAIU,EAAS,MAAM,IAAMA,EAC7C,OAAO,CAGb,CAEA,MAAO,EACT,CAQO,SAASG,EAAmBb,EAAkBc,EAA4B,CAC/E,OAAQd,EAAK,KAAM,CACjB,IAAK,UACH,OAAOA,EAAK,MAEd,IAAK,WACH,OAAOc,EAAQ,IAAId,EAAK,IAAI,EAE9B,IAAK,SAAU,CACb,IAAMe,EAAOF,EAAmBb,EAAK,KAAMc,CAAO,EAC5CE,EAAQH,EAAmBb,EAAK,MAAOc,CAAO,EAEpD,OAAQd,EAAK,SAAU,CACrB,IAAK,KAEH,OAAOe,GAAQC,EACjB,IAAK,KAEH,OAAOD,GAAQC,EACjB,IAAK,IACH,OAAQD,EAAmBC,EAC7B,IAAK,IACH,OAAQD,EAAmBC,EAC7B,IAAK,KACH,OAAQD,GAAoBC,EAC9B,IAAK,KACH,OAAQD,GAAoBC,EAC9B,IAAK,MACH,OAAOC,EAASF,CAAI,GAAKE,EAASD,CAAK,EACzC,IAAK,KACH,OAAOC,EAASF,CAAI,GAAKE,EAASD,CAAK,CAC3C,CACA,KACF,CAEA,IAAK,QAAS,CACZ,IAAME,EAAUL,EAAmBb,EAAK,QAASc,CAAO,EAExD,OAAQd,EAAK,SAAU,CACrB,IAAK,MACH,MAAO,CAACiB,EAASC,CAAO,CAC5B,CACA,KACF,CACF,CAGF,CAOA,SAASD,EAASE,EAAyB,CAIzC,MAHI,EAAuBA,GAAU,MAAQA,IAAU,IAGnDA,IAAU,GAAKA,IAAU,GAI/B,CClOO,SAASC,EAAMC,EAA+B,CACnD,IAAMC,EAAuB,CAAC,EACxBC,EAAiB,CAAC,EAEpBC,EAAW,EACXC,EAAO,EACPC,EAAS,EAKb,SAASC,EAAYC,EAA6B,CAChD,MAAO,CAAE,QAAAA,EAAS,SAAAJ,EAAU,KAAAC,EAAM,OAAAC,CAAO,CAC3C,CAKA,SAASG,EAAQC,EAAqB,CACpC,QAASC,EAAI,EAAGA,EAAID,EAAOC,IACrBV,EAASG,EAAWO,CAAC,IAAM;AAAA,GAC7BN,IACAC,EAAS,GAETA,IAGJF,GAAYM,CACd,CAKA,SAASE,EAASC,EAAaC,EAAeV,EAAkB,CAC9D,OAAOH,EAAS,QAAQY,EAAKC,CAAI,CACnC,CAKA,SAASC,EAAUC,EAAwB,CACzC,IAAMC,EAAOhB,EAAS,UAAUG,EAAUY,CAAM,EAChD,OAAAP,EAAQO,EAASZ,CAAQ,EAClBa,CACT,CAEA,KAAOb,EAAWH,EAAS,QAAQ,CAEjC,IAAMiB,EAAWN,EAAS,KAAMR,CAAQ,EAClCe,EAAWP,EAAS,KAAMR,CAAQ,EAClCgB,EAAeR,EAAS,KAAMR,CAAQ,EAGtCiB,EAAa,CACjB,CAAE,IAAKH,EAAU,KAAM,KAAM,EAC7B,CAAE,IAAKC,EAAU,KAAM,KAAM,EAC7B,CAAE,IAAKC,EAAc,KAAM,SAAU,CACvC,EAAE,OAAQE,GAAMA,EAAE,MAAQ,EAAE,EAE5B,GAAID,EAAW,SAAW,EAAG,CAE3B,IAAMJ,EAAOhB,EAAS,UAAUG,CAAQ,EACpCa,GACFd,EAAI,KAAK,CAAE,KAAM,OAAQ,MAAOc,CAAK,CAAC,EAExC,KACF,CAGAI,EAAW,KAAK,CAACE,EAAGC,IAAMD,EAAE,IAAMC,EAAE,GAAG,EACvC,IAAMC,EAAUJ,EAAW,CAAC,EAQ5B,GALII,EAAQ,IAAMrB,GAChBD,EAAI,KAAK,CAAE,KAAM,OAAQ,MAAOY,EAAUU,EAAQ,GAAG,CAAE,CAAC,EAItDA,EAAQ,OAAS,MAAO,CAE1BhB,EAAQ,CAAC,EACT,IAAMiB,EAASd,EAAS,KAAMR,CAAQ,EAEtC,GAAIsB,IAAW,GAAI,CACjBxB,EAAO,KAAKK,EAAY,uBAAuB,CAAC,EAChD,KACF,CAEA,IAAMoB,EAAUZ,EAAUW,CAAM,EAAE,KAAK,EACvCjB,EAAQ,CAAC,EAETN,EAAI,KAAK,CAAE,KAAM,WAAY,KAAMwB,CAAQ,CAAC,CAC9C,SAAWF,EAAQ,OAAS,UAAW,CAIrC,GAAItB,EAAI,OAAS,GAAKA,EAAIA,EAAI,OAAS,CAAC,EAAE,OAAS,OAAQ,CACzD,IAAMyB,EAAWzB,EAAIA,EAAI,OAAS,CAAC,EAE/B,YAAY,KAAKyB,EAAS,KAAK,IACjCA,EAAS,MAAQA,EAAS,MAAM,QAAQ,kBAAmB,EAAE,EAEjE,CAEAnB,EAAQ,CAAC,EACT,IAAMiB,EAASd,EAAS,KAAMR,CAAQ,EAEtC,GAAIsB,IAAW,GAAI,CACjBxB,EAAO,KAAKK,EAAY,sBAAsB,CAAC,EAC/C,KACF,CAEA,IAAMsB,EAAcd,EAAUW,CAAM,EAMpC,GALAjB,EAAQ,CAAC,EAETN,EAAI,KAAK,CAAE,KAAM,UAAW,MAAO0B,CAAY,CAAC,EAG5CzB,EAAWH,EAAS,QAAUA,EAASG,CAAQ,IAAM;AAAA,EAGvD,IAFAK,EAAQ,CAAC,EAEFL,EAAWH,EAAS,QAAU,QAAQ,KAAKA,EAASG,CAAQ,CAAC,GAClEK,EAAQ,CAAC,CAGf,SAAWgB,EAAQ,OAAS,MAAO,CAEjChB,EAAQ,CAAC,EACT,IAAMiB,EAASd,EAAS,KAAMR,CAAQ,EAEtC,GAAIsB,IAAW,GAAI,CACjBxB,EAAO,KAAKK,EAAY,wBAAwB,CAAC,EACjD,KACF,CAEA,IAAIuB,EAAYf,EAAUW,CAAM,EAAE,KAAK,EAGjCK,EAAeD,EAAU,WAAW,GAAG,EACvCE,EAAgBF,EAAU,SAAS,GAAG,EAG5C,GAAIC,IACFD,EAAYA,EAAU,UAAU,CAAC,EAAE,KAAK,EAEpC3B,EAAI,OAAS,GAAKA,EAAIA,EAAI,OAAS,CAAC,EAAE,OAAS,QAAQ,CACzD,IAAMyB,EAAWzB,EAAIA,EAAI,OAAS,CAAC,EACnCyB,EAAS,MAAQA,EAAS,MAAM,QAAQ,oBAAqB,EAAE,CACjE,CASF,GAPII,IACFF,EAAYA,EAAU,UAAU,EAAGA,EAAU,OAAS,CAAC,EAAE,KAAK,GAGhErB,EAAQ,CAAC,EAGLuB,EACF,KAAO5B,EAAWH,EAAS,QAAU,UAAU,KAAKA,EAASG,CAAQ,CAAC,GACpEK,EAAQ,CAAC,EAKb,GAAIqB,EAAU,WAAW,MAAM,EAAG,CAEhC,IAAMG,EAAW,2BAA2B,KAAKH,CAAS,EAC1D,GAAIG,EACF,GAAI,CACF,IAAMC,EAAOC,EAAgBF,EAAS,CAAC,CAAC,EAExC9B,EAAI,KAAK,CACP,KAAM,MACN,KAAM8B,EAAS,CAAC,EAChB,MAAOC,CACT,CAAC,CACH,OAASE,EAAO,CACdlC,EAAO,KAAKK,EAAY,2BAA4B6B,EAAgB,OAAO,EAAE,CAAC,CAChF,MAEAlC,EAAO,KAAKK,EAAY,oBAAoB,CAAC,CAEjD,SAAWuB,EAAU,WAAW,KAAK,EAAG,CAEtC,IAAMO,EAAYP,EAAU,UAAU,CAAC,EAAE,KAAK,EAE9C,GAAI,CACF,IAAMI,EAAOC,EAAgBE,CAAS,EAGhC,CAAE,WAAAC,EAAY,aAAAC,EAAc,WAAAC,EAAY,YAAAC,CAAY,EAAIC,EAAa,EAC3ExC,EAAO,KAAK,GAAGuC,CAAW,EAE1BtC,EAAI,KAAK,CACP,KAAM,KACN,UAAW+B,EACX,WAAAI,EACA,aAAcC,EAAa,OAAS,EAAIA,EAAe,OACvD,WAAYC,EAAW,OAAS,EAAIA,EAAa,MACnD,CAAC,CACH,OAASJ,EAAO,CACdlC,EAAO,KAAKK,EAAY,0BAA2B6B,EAAgB,OAAO,EAAE,CAAC,CAC/E,CACF,SAAWN,EAAU,WAAW,UAAU,EAAG,CAE3C,IAAMa,EAAe,8BAA8B,KAAKb,CAAS,EAC7Da,EACFxC,EAAI,KAAK,CACP,KAAM,UACN,KAAMwC,EAAa,CAAC,CACtB,CAAC,EAEDzC,EAAO,KAAKK,EAAY,wBAAwB,CAAC,CAErD,SAAWuB,EAAU,WAAW,SAAS,EAAG,CAE1C,IAAMc,EAAad,EAAU,UAAU,CAAC,EAAE,KAAK,EAE/C,GAAI,CACF,IAAMI,EAAOC,EAAgBS,CAAU,EACjC,CAAE,MAAAC,EAAO,YAAAJ,CAAY,EAAIK,EAAiB,EAChD5C,EAAO,KAAK,GAAGuC,CAAW,EAE1BtC,EAAI,KAAK,CACP,KAAM,SACN,WAAY+B,EACZ,MAAAW,CACF,CAAC,CACH,OAAST,EAAO,CACdlC,EAAO,KAAKK,EAAY,8BAA+B6B,EAAgB,OAAO,EAAE,CAAC,CACnF,CACF,SAAWN,EAAU,WAAW,cAAc,EAAG,CAE/C,IAAMiB,EAAc,6BAA6B,KAAKjB,CAAS,EAE/D,GAAI,CAACiB,EACH7C,EAAO,KAAKK,EAAY,4BAA4B,CAAC,MAChD,CACL,IAAMyC,EAAYD,EAAY,CAAC,EACzBE,EAAaD,EAAU,WAAW,GAAG,GAAKA,EAAU,WAAW,GAAG,EAClEE,EAAS,SAASF,EAAW,EAAE,EAErC,GAAI,MAAME,CAAM,EACdhD,EAAO,KAAKK,EAAY,2BAA2B,CAAC,MAC/C,CAEL,IAAI4C,EAAQ,EACRC,EAAYhD,EACZsB,EAAS,GAEb,KAAO0B,EAAYnD,EAAS,QAAQ,CAClC,IAAMoD,EAAmB,uCAAuC,KAAKpD,EAAS,UAAUmD,CAAS,CAAC,EAC5FE,EAAsB,+BAA+B,KAAKrD,EAAS,UAAUmD,CAAS,CAAC,EAEvFG,EAAiBF,EAAmBD,EAAYC,EAAiB,MAAQ,IACzEG,EAAoBF,EAAsBF,EAAYE,EAAoB,MAAQ,IAExF,GAAIC,EAAiBC,EAEnBL,IACAC,EAAYG,GAAkBF,IAAmB,CAAC,EAAE,QAAU,WACrDG,EAAoB,IAE7B,GAAIL,IAAU,EAAG,CAEfzB,EAAS8B,EACT,KACF,MACEL,IACAC,EAAYI,GAAqBF,IAAsB,CAAC,EAAE,QAAU,OAItE,MAEJ,CAEA,GAAI5B,IAAW,GACbxB,EAAO,KAAKK,EAAY,wBAAwB,CAAC,MAC5C,CACL,IAAMkD,EAAe1C,EAAUW,CAAM,EAE/BgC,EAAW,+BAA+B,KAAKzD,EAAS,UAAUG,CAAQ,CAAC,EAC7EsD,GACFjD,EAAQiD,EAAS,CAAC,EAAE,MAAM,EAG5B,IAAMC,EAAa3D,EAAMyD,CAAY,EACrCvD,EAAO,KAAK,GAAGyD,EAAW,MAAM,EAEhCxD,EAAI,KAAK,CACP,KAAM,cACN,OAAA+C,EACA,WAAAD,EACA,KAAMU,EAAW,GACnB,CAAC,CACH,CACF,CACF,CACF,CAEF,CACF,CAEA,MAAO,CAAE,IAAAxD,EAAK,OAAAD,CAAO,EAKrB,SAAS0D,EAAWC,EAA2D,CAE7E,IAAMC,EADU,IAAI,OAAO,SAASD,CAAO,QAAQ,EAC7B,KAAK5D,EAAS,UAAUG,CAAQ,CAAC,EAEvD,OAAI0D,EACK,CACL,MAAO1D,EAAW0D,EAAM,MACxB,OAAQA,EAAM,CAAC,EAAE,MACnB,EAGK,IACT,CAKA,SAASpB,GAKP,CACA,IAAMH,EAAuF,CAAC,EACxFE,EAA4B,CAAC,EAC/BD,EAAwB,CAAC,EAGzBW,EAAQ,EACRC,EAAYhD,EAEhB,KAAOgD,EAAYnD,EAAS,QAAQ,CAClC,IAAM8D,EAAU,eAAe,KAAK9D,EAAS,UAAUmD,CAAS,CAAC,EAC3DY,EAAY,iBAAiB,KAAK/D,EAAS,UAAUmD,CAAS,CAAC,EAC/Da,EAAY,qBAAqB,KAAKhE,EAAS,UAAUmD,CAAS,CAAC,EACnEc,EAAa,sBAAsB,KAAKjE,EAAS,UAAUmD,CAAS,CAAC,EAUrE3B,EAPU,CACd,CAAE,KAAM,KAAM,MAAOsC,EAAS,IAAKA,EAAUX,EAAYW,EAAQ,MAAQ,GAAS,EAClF,CAAE,KAAM,OAAQ,MAAOC,EAAW,IAAKA,EAAYZ,EAAYY,EAAU,MAAQ,GAAS,EAC1F,CAAE,KAAM,OAAQ,MAAOC,EAAW,IAAKA,EAAYb,EAAYa,EAAU,MAAQ,GAAS,EAC1F,CAAE,KAAM,QAAS,MAAOC,EAAY,IAAKA,EAAad,EAAYc,EAAW,MAAQ,GAAS,CAChG,EAAE,KAAK,CAAC3C,EAAGC,IAAMD,EAAE,IAAMC,EAAE,GAAG,EAEN,CAAC,EAEzB,GAAI,CAACC,EAAQ,OAASA,EAAQ,MAAQ,IAAU,CAC9CgB,EAAY,KAAKlC,EAAY,eAAe,CAAC,EAC7C,KACF,CAEA,GAAIkB,EAAQ,OAAS,KACnB0B,IACAC,EAAY3B,EAAQ,IAAMA,EAAQ,MAAM,CAAC,EAAE,eAClCA,EAAQ,OAAS,QAC1B,GAAI0B,IAAU,EAAG,CAEf,IAAMM,EAAe1C,EAAUU,EAAQ,GAAG,EAC1ChB,EAAQgB,EAAQ,MAAM,CAAC,EAAE,MAAM,EAE/B,IAAMkC,EAAa3D,EAAMyD,CAAY,EACrC,OAAAhB,EAAY,KAAK,GAAGkB,EAAW,MAAM,EAE9B,CACL,WAAYA,EAAW,IACvB,aAAApB,EACA,WAAAC,EACA,YAAAC,CACF,CACF,MACEU,IACAC,EAAY3B,EAAQ,IAAMA,EAAQ,MAAM,CAAC,EAAE,eAEpC0B,IAAU,IAAM1B,EAAQ,OAAS,QAAUA,EAAQ,OAAS,QAAS,CAE9E,IAAMgC,EAAe1C,EAAUU,EAAQ,GAAG,EACpCkC,EAAa3D,EAAMyD,CAAY,EAErC,GAAIlB,EAAa,SAAW,GAAKC,EAAW,SAAW,EAAG,CAExDC,EAAY,KAAK,GAAGkB,EAAW,MAAM,EACrC,IAAMrB,EAAaqB,EAAW,IAG9B,GAAIlC,EAAQ,OAAS,OAAQ,CAE3BhB,EAAQgB,EAAQ,MAAM,CAAC,EAAE,MAAM,EAC/B,IAAM0C,EAAY,aAAa,KAAKlE,EAAS,UAAUG,CAAQ,CAAC,EAChE,GAAI+D,EAAW,CACb,IAAMC,EAAUD,EAAU,CAAC,EAAE,KAAK,EAClC1D,EAAQ0D,EAAU,CAAC,EAAE,MAAM,EAE3B,GAAI,CACF,IAAME,EAAgBlC,EAAgBiC,CAAO,EACvCE,EAAa5B,EAAa,EAChC,OAAAD,EAAY,KAAK,GAAG6B,EAAW,WAAW,EAE1C/B,EAAa,KAAK,CAChB,UAAW8B,EACX,KAAMC,EAAW,UACnB,CAAC,EACD/B,EAAa,KAAK,GAAI+B,EAAW,cAAgB,CAAC,CAAE,EACpD9B,EAAa8B,EAAW,WAEjB,CACL,WAAAhC,EACA,aAAAC,EACA,WAAAC,EACA,YAAAC,CACF,CACF,OAASL,EAAO,CACdK,EAAY,KAAKlC,EAAY,4BAA6B6B,EAAgB,OAAO,EAAE,CAAC,CACtF,CACF,CACF,KAAO,CAEL3B,EAAQgB,EAAQ,MAAM,CAAC,EAAE,MAAM,EAG/B,IAAMyC,EAAaN,EAAW,OAAO,EACrC,GAAI,CAACM,EACHzB,EAAY,KAAKlC,EAAY,0BAA0B,CAAC,MACnD,CACL,IAAMgE,EAAmBxD,EAAUmD,EAAW,KAAK,EACnDzD,EAAQyD,EAAW,MAAM,EAEzB,IAAMM,EAAiBxE,EAAMuE,CAAgB,EAC7C9B,EAAY,KAAK,GAAG+B,EAAe,MAAM,EACzChC,EAAagC,EAAe,GAC9B,CAEA,MAAO,CACL,WAAAlC,EACA,aAAAC,EACA,WAAAC,EACA,YAAAC,CACF,CACF,CACF,CACF,MACEW,EAAY3B,EAAQ,IAAMA,EAAQ,MAAM,CAAC,EAAE,MAE/C,CAEA,MAAO,CACL,WAAY,CAAC,EACb,aAAAc,EACA,WAAAC,EACA,YAAAC,CACF,CACF,CAKA,SAASK,GAGP,CACA,IAAMD,EAA4E,CAAC,EAC7EJ,EAA4B,CAAC,EAEnC,KAAOrC,EAAWH,EAAS,QAAQ,CAEjC,IAAMwE,EAAY,iBAAiB,KAAKxE,EAAS,UAAUG,CAAQ,CAAC,EAC9DsE,EAAiB,0BAA0B,KAAKzE,EAAS,UAAUG,CAAQ,CAAC,EAG5EuE,EAAUF,EAAYrE,EAAWqE,EAAU,MAAQ,IACnDG,EAAeF,EAAiBtE,EAAWsE,EAAe,MAAQ,IAExE,GAAIE,EAAeD,EAAS,CAG1B,GAAI9B,EAAM,OAAS,GAAKzC,EAAWwE,EAAc,CAC/C,IAAMnB,EAAe1C,EAAU6D,CAAY,EACrCjB,EAAa3D,EAAMyD,CAAY,EACrChB,EAAY,KAAK,GAAGkB,EAAW,MAAM,EACrCd,EAAMA,EAAM,OAAS,CAAC,EAAE,KAAOc,EAAW,GAC5C,CAGAlD,EAAQmE,EAAexE,GAAYsE,IAAiB,CAAC,EAAE,QAAU,EAAE,EACnE,KACF,SAAWC,EAAU,IAAU,CAG7B,GAAI9B,EAAM,OAAS,GAAKzC,EAAWuE,EAAS,CAC1C,IAAMlB,EAAe1C,EAAU4D,CAAO,EAChChB,EAAa3D,EAAMyD,CAAY,EACrChB,EAAY,KAAK,GAAGkB,EAAW,MAAM,EACrCd,EAAMA,EAAM,OAAS,CAAC,EAAE,KAAOc,EAAW,GAC5C,MAAWvD,EAAWuE,GAEpB5D,EAAU4D,CAAO,EAInBlE,EAAQgE,EAAW,CAAC,EAAE,MAAM,EAG5B,IAAMI,EAAa,YAAY,KAAK5E,EAAS,UAAUG,CAAQ,CAAC,EAChE,GAAIyE,EAAY,CACd,IAAMC,EAAWD,EAAW,CAAC,EAAE,KAAK,EACpCpE,EAAQoE,EAAW,CAAC,EAAE,MAAM,EAE5B,GAAI,CACF,IAAME,EAAY5C,EAAgB2C,CAAQ,EAC1CjC,EAAM,KAAK,CACT,MAAOkC,EACP,KAAM,CAAC,CACT,CAAC,CACH,OAAS3C,EAAO,CACdK,EAAY,KAAKlC,EAAY,uBAAwB6B,EAAgB,OAAO,EAAE,CAAC,CACjF,CACF,KAAO,CACLK,EAAY,KAAKlC,EAAY,qBAAqB,CAAC,EACnD,KACF,CACF,KAAO,CAELkC,EAAY,KAAKlC,EAAY,mBAAmB,CAAC,EACjD,KACF,CACF,CAEA,MAAO,CAAE,MAAAsC,EAAO,YAAAJ,CAAY,CAC9B,CACF,CCzhBO,IAAMuC,EAAN,MAAMC,CAA4B,CAKvC,YAAYC,EAAkBC,EAA0B,CACtD,KAAK,UAAY,IAAI,IACrB,KAAK,OAASD,GAAU,KACxB,KAAK,QAAUC,GAAWD,GAAQ,SAAW,CAAC,CAChD,CAOA,IAAIE,EAAuB,CAMzB,IAAMC,GAJiB,KAAK,QAAQ,mBAChCD,EAAK,QAAQ,KAAM,GAAG,EACtBA,GAEyB,MAAM,GAAG,EAChCE,EAAWD,EAAM,CAAC,EAGpBE,EACJ,GAAI,KAAK,UAAU,IAAID,CAAQ,EAC7BC,EAAQ,KAAK,UAAU,IAAID,CAAQ,UAC1B,KAAK,OACdC,EAAQ,KAAK,OAAO,IAAID,CAAQ,MAEhC,QAIF,QAASE,EAAI,EAAGA,EAAIH,EAAM,OAAQG,IAAK,CAWrC,GAVID,GAAU,MAKV,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,GAKhD,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAOF,EAAMG,CAAC,CAAC,EACvD,OAGFD,EAASA,EAAkCF,EAAMG,CAAC,CAAC,CACrD,CAEA,OAAOD,CACT,CAOA,IAAIH,EAAcG,EAAsB,CACtC,IAAMF,EAAQD,EAAK,MAAM,GAAG,EAE5B,GAAIC,EAAM,SAAW,EAAG,CAEtB,KAAK,UAAU,IAAID,EAAMG,CAAK,EAC9B,MACF,CAGA,IAAMD,EAAWD,EAAM,CAAC,EACpBI,EAAS,KAAK,UAAU,IAAIH,CAAQ,GAEpC,CAACG,GAAU,OAAOA,GAAW,UAAY,MAAM,QAAQA,CAAM,KAE/DA,EAAS,CAAC,EACV,KAAK,UAAU,IAAIH,EAAUG,CAAM,GAIrC,QAASD,EAAI,EAAGA,EAAIH,EAAM,OAAS,EAAGG,IAAK,CACzC,IAAME,EAAML,EAAMG,CAAC,GAGjB,CAACC,EAAOC,CAAG,GACX,OAAOD,EAAOC,CAAG,GAAM,UACvB,MAAM,QAAQD,EAAOC,CAAG,CAAC,KAEzBD,EAAOC,CAAG,EAAI,CAAC,GAGjBD,EAASA,EAAOC,CAAG,CACrB,CAGAD,EAAOJ,EAAMA,EAAM,OAAS,CAAC,CAAC,EAAIE,CACpC,CAMA,MAAgB,CACd,OAAO,IAAIN,EAAQ,KAAM,KAAK,OAAO,CACvC,CAMA,KAAsB,CACpB,OAAO,KAAK,MACd,CAQA,OAAO,KAAKU,EAA+BR,EAAmC,CAC5E,IAAMS,EAAM,IAAIX,EAAQ,OAAWE,CAAO,EAC1C,OAAW,CAACO,EAAKH,CAAK,IAAK,OAAO,QAAQI,CAAI,EAC5CC,EAAI,IAAIF,EAAKH,CAAK,EAEpB,OAAOK,CACT,CACF,ECzIO,IAAMC,EAAN,KAAoC,CACzC,MAAM,KAAKC,EAAcC,EAAoC,CAC3D,IAAMC,EAAMD,EAAW,IAAI,IAAID,EAAMC,CAAQ,EAAE,KAAOD,EAChDG,EAAW,GAAGD,CAAG,iBAAiB,KAAK,IAAI,CAAC,GAE5CE,EAAW,MAAM,MAAMD,CAAQ,EAErC,GAAI,CAACC,EAAS,GACZ,MAAM,IAAI,MAAM,kBAAkBF,CAAG,KAAKE,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAGpF,OAAO,MAAMA,EAAS,KAAK,CAC7B,CACF,ECDA,SAASC,GAAkBC,EAAcC,EAAwB,CAC/D,OAAIA,IAAW,EACND,EAIFA,EAAK,QAAQ,mBAAoB,CAACE,EAAQC,EAAQC,IAAU,CACjE,IAAMC,EAAeF,EAAO,OACtBG,EAAW,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGD,EAAeJ,CAAM,CAAC,EAC/D,MAAO,IAAI,OAAOK,CAAQ,EAAIF,CAChC,CAAC,CACH,CAQA,SAASG,GAAYC,EAAcC,EAA0B,CAE3D,GAAID,EAAK,WAAW,GAAG,EACrB,OAAOA,EAOT,IAAME,GAHOD,EAAS,SAAS,GAAG,EAAIA,EAAWA,EAAW,KAGpCD,EAGlBG,EAAQD,EAAS,MAAM,GAAG,EAC1BE,EAAqB,CAAC,EAE5B,QAAWC,KAAQF,EACbE,IAAS,KAAOA,IAAS,KAElBA,IAAS,KAClBD,EAAS,IAAI,EAEbA,EAAS,KAAKC,CAAI,GAMtB,OADeH,EAAS,WAAW,GAAG,EAAI,IAAM,IAChCE,EAAS,KAAK,GAAG,CACnC,CAQA,eAAsBE,EAAOC,EAAkBC,EAAyB,CAAC,EAAoB,CAC3F,GAAM,CACJ,OAAAC,EAAS,IAAIC,EACb,QAASC,EAAiB,CAAC,EAC3B,SAAAV,EAAW,GACX,gBAAAW,EAAkB,GAClB,QAAAC,EAAU,IACV,mBAAAC,EAAqB,GACrB,kBAAAC,EAAoB,QACpB,oBAAAC,EAAsB,UACxB,EAAIR,EAGES,EAAiB,IAAI,QAAe,CAACC,EAAGC,IAAW,CACvD,WAAW,IAAMA,EAAO,IAAI,MAAM,4BAA4B,CAAC,EAAGN,CAAO,CAC3E,CAAC,EAGKO,EAAgBC,EAAed,EAAU,CAC7C,OAAAE,EACA,QAASa,EAAQ,KACf,CACE,GAAGX,EAEH,KAAM,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAC3C,UAAW,KAAK,IAAI,EACpB,aAAc,CAChB,EACA,CAAE,mBAAAG,CAAmB,CACvB,EACA,aAAc,EACd,gBAAAF,EACA,SAAAX,EACA,kBAAAc,EACA,oBAAAC,CACF,CAAC,EAED,OAAO,MAAM,QAAQ,KAAK,CAACI,EAAeH,CAAc,CAAC,CAC3D,CAeA,eAAeI,EACbd,EACAC,EACiB,CACjB,GAAM,CAAE,aAAAe,EAAc,gBAAAX,CAAgB,EAAIJ,EAG1C,GAAIe,EAAeX,EACjB,MAAM,IAAI,MAAM,0BAA0BA,CAAe,YAAY,EAIvE,IAAMY,EAAcC,EAAMlB,CAAQ,EAElC,GAAIiB,EAAY,OAAO,OAAS,EAAG,CACjC,IAAME,EAAgBF,EAAY,OAAO,IAAKG,GAAMA,EAAE,OAAO,EAAE,KAAK,IAAI,EACxE,MAAM,IAAI,MAAM,iBAAiBD,CAAa,EAAE,CAClD,CAGA,OAAO,MAAME,EAAYJ,EAAY,IAAKhB,CAAO,CACnD,CAKA,eAAeoB,EAAYC,EAAkBrB,EAAiD,CAC5F,IAAML,EAAkB,CAAC,EAEzB,QAAW2B,KAAQD,EACjB1B,EAAM,KAAK,MAAM4B,GAAWD,EAAMtB,CAAO,CAAC,EAG5C,OAAOL,EAAM,KAAK,EAAE,CACtB,CAKA,eAAe4B,GAAWD,EAAetB,EAAiD,CACxF,GAAM,CAAE,OAAAC,EAAQ,QAAAuB,EAAS,aAAAT,EAAc,gBAAAX,EAAiB,SAAAX,CAAS,EAAIO,EAErE,OAAQsB,EAAK,KAAM,CACjB,IAAK,OAAQ,CAEX,IAAMG,EAAgBD,EAAQ,IAAI,cAAc,GAAe,EAC/D,OAAIC,IAAkB,EACbH,EAAK,MAEPvC,GAAkBuC,EAAK,MAAOG,CAAa,CACpD,CAEA,IAAK,WAAY,CACf,IAAMC,EAAQF,EAAQ,IAAIF,EAAK,IAAI,EACnC,GAA2BI,GAAU,KAEnC,OAAQ1B,EAAQ,kBAAmB,CACjC,IAAK,QACH,MAAM,IAAI,MAAM,uBAAuBsB,EAAK,IAAI,EAAE,EACpD,IAAK,WAIH,MAAO,MAAMA,EAAK,IAAI,MACxB,IAAK,QACL,QACE,MAAO,EACX,CAEF,IAAMK,EAAM,OAAOD,CAAK,EAExB,OAAIC,EAAI,SAAS,IAAI,GAAKA,EAAI,SAAS,IAAI,EAClC,MAAMd,EAAec,EAAK3B,CAAO,EAEnC2B,CACT,CAEA,IAAK,MAAO,CACV,IAAMD,EAAQE,EAAmBN,EAAK,MAAOE,CAAO,EACpD,OAAAA,EAAQ,IAAIF,EAAK,KAAMI,CAAK,EACrB,EACT,CAEA,IAAK,UACH,MAAO,GAET,IAAK,KAAM,CAWT,GAAI1B,EAAQ,oBAAsB,YAAcA,EAAQ,sBAAwB,QAAS,CAEvF,GADsB6B,EAAkBP,EAAK,UAAWE,CAAO,EAC7C,OAAS,EACzB,OAAOM,EAAeR,CAAI,EAE5B,GAAIA,EAAK,cACP,QAAWS,KAAQT,EAAK,aACtB,GAAIO,EAAkBE,EAAK,UAAWP,CAAO,EAAE,OAAS,EACtD,OAAOM,EAAeR,CAAI,EAIlC,CAEA,IAAMU,EAAYJ,EAAmBN,EAAK,UAAWE,CAAO,EAE5D,GAAIS,EAASD,CAAS,EACpB,OAAO,MAAMZ,EAAYE,EAAK,WAAYtB,CAAO,EAInD,GAAIsB,EAAK,aACP,QAAWY,KAAcZ,EAAK,aAAc,CAC1C,IAAMa,EAAgBP,EAAmBM,EAAW,UAAWV,CAAO,EACtE,GAAIS,EAASE,CAAa,EACxB,OAAO,MAAMf,EAAYc,EAAW,KAAMlC,CAAO,CAErD,CAIF,OAAIsB,EAAK,WACA,MAAMF,EAAYE,EAAK,WAAYtB,CAAO,EAG5C,EACT,CAEA,IAAK,UACH,GAAI,CAEF,IAAMoC,EAAkB,MAAMnC,EAAO,KAAKqB,EAAK,KAAM7B,CAAQ,EAGzD4C,EAAc5C,EAGlB,GAAI6B,EAAK,KAAK,SAAS,KAAK,EAAG,CAC7B,IAAMgB,EAAM,IAAI,IAAIhB,EAAK,IAAI,EAC7Be,EAAcC,EAAI,KAAK,UAAU,EAAGA,EAAI,KAAK,YAAY,GAAG,EAAI,CAAC,CACnE,SAAW7C,EAET,GAAIA,EAAS,SAAS,KAAK,EAAG,CAC5B,IAAM6C,EAAM,IAAI,IAAIhB,EAAK,KAAM7B,CAAQ,EACvC4C,EAAcC,EAAI,KAAK,UAAU,EAAGA,EAAI,KAAK,YAAY,GAAG,EAAI,CAAC,CACnE,KAAO,CAEL,IAAMC,EAAehD,GAAY+B,EAAK,KAAM7B,CAAQ,EAC9C+C,EAAYD,EAAa,YAAY,GAAG,EAC9CF,EAAcG,GAAa,EAAID,EAAa,UAAU,EAAGC,EAAY,CAAC,EAAI/C,CAC5E,SACS6B,EAAK,KAAK,SAAS,GAAG,EAAG,CAElC,IAAMkB,EAAYlB,EAAK,KAAK,YAAY,GAAG,EAC3Ce,EAAcf,EAAK,KAAK,UAAU,EAAGkB,EAAY,CAAC,CACpD,CAGA,OAAO,MAAM3B,EAAeuB,EAAiB,CAC3C,OAAAnC,EACA,QAAAuB,EACA,aAAcT,EAAe,EAC7B,gBAAAX,EACA,SAAUiC,EACV,kBAAmBrC,EAAQ,kBAC3B,oBAAqBA,EAAQ,mBAC/B,CAAC,CACH,OAASyC,EAAO,CASd,GAAIzC,EAAQ,oBAAsB,WAChC,MAAO,eAAesB,EAAK,IAAI,OAEjC,IAAMoB,EAAUD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACrE,eAAQ,MAAM,qBAAqBnB,EAAK,IAAI,IAAKoB,CAAO,EACjD,uBAAuBpB,EAAK,IAAI,MACzC,CAGF,IAAK,SAAU,CACb,IAAMqB,EAAcf,EAAmBN,EAAK,WAAYE,CAAO,EAG/D,QAAWoB,KAAYtB,EAAK,MAAO,CACjC,IAAMuB,EAAYjB,EAAmBgB,EAAS,MAAOpB,CAAO,EAE5D,GAAImB,GAAeE,EACjB,OAAO,MAAMzB,EAAYwB,EAAS,KAAM5C,CAAO,CAEnD,CAGA,MAAO,EACT,CAEA,IAAK,cAAe,CAElB,IAAM8C,EAAetB,EAAQ,IAAI,cAAc,GAAe,EACxDuB,EAAYzB,EAAK,WAAawB,EAAexB,EAAK,OAASA,EAAK,OAGhE0B,EAAiBF,EAGvBtB,EAAQ,IAAI,eAAgBuB,CAAS,EAErC,GAAI,CAGF,OADe,MAAM3B,EAAYE,EAAK,KAAMtB,CAAO,CAErD,QAAE,CAEAwB,EAAQ,IAAI,eAAgBwB,CAAc,CAC5C,CACF,CAEA,QAGE,OAD2B1B,CAE/B,CACF,CAKA,SAASW,EAASP,EAAyB,CAIzC,MAHI,EAAuBA,GAAU,MAAQA,IAAU,IAGnDA,IAAU,GAAKA,IAAU,GAI/B,CAYA,SAASG,EAAkBoB,EAAkBzB,EAA4B,CACvE,IAAM0B,EAAgB,CAAC,EACvB,SAASC,EAAKhC,EAAqB,CACjC,OAAQA,EAAE,KAAM,CACd,IAAK,WACCK,EAAQ,IAAIL,EAAE,IAAI,IAAM,QAAW+B,EAAI,KAAK/B,EAAE,IAAI,EACtD,MACF,IAAK,SACHgC,EAAKhC,EAAE,IAAI,EACXgC,EAAKhC,EAAE,KAAK,EACZ,MACF,IAAK,QACHgC,EAAKhC,EAAE,OAAO,EACd,MACF,IAAK,UACH,KACJ,CACF,CACA,OAAAgC,EAAKF,CAAI,EACFC,CACT,CASA,SAASE,EAAmBH,EAA0B,CACpD,OAAQA,EAAK,KAAM,CACjB,IAAK,UACH,OAAI,OAAOA,EAAK,OAAU,SAAiB,KAAK,UAAUA,EAAK,KAAK,EAChEA,EAAK,QAAU,KAAa,OACzB,OAAOA,EAAK,KAAK,EAC1B,IAAK,WACH,OAAOA,EAAK,KACd,IAAK,QACH,MAAO,OAAOG,EAAmBH,EAAK,OAAO,CAAC,GAChD,IAAK,SACH,MAAO,IAAIG,EAAmBH,EAAK,IAAI,CAAC,IAAIA,EAAK,QAAQ,IAAIG,EAAmBH,EAAK,KAAK,CAAC,GAC/F,CACF,CAYA,SAASI,EAAchC,EAA0B,CAC/C,OAAOA,EAAM,IAAIiC,EAAY,EAAE,KAAK,EAAE,CACxC,CAEA,SAASA,GAAahC,EAAuB,CAC3C,OAAQA,EAAK,KAAM,CACjB,IAAK,OACH,OAAOA,EAAK,MACd,IAAK,WACH,MAAO,MAAMA,EAAK,IAAI,MACxB,IAAK,MACH,MAAO,UAAUA,EAAK,IAAI,MAAM8B,EAAmB9B,EAAK,KAAK,CAAC,MAChE,IAAK,UAGH,MAAO,eACT,IAAK,KACH,OAAOQ,EAAeR,CAAI,EAC5B,IAAK,UACH,MAAO,eAAeA,EAAK,IAAI,OACjC,IAAK,cAEH,MAAO,kBADMA,EAAK,YAAcA,EAAK,QAAU,EAAI,IAAM,EAC5B,GAAGA,EAAK,MAAM,MAAM+B,EAAc/B,EAAK,IAAI,CAAC,uBAE3E,IAAK,SAAU,CAGb,IAAMiC,EAAQjC,EAAK,MAChB,IAAKkC,GAAM,WAAWJ,EAAmBI,EAAE,KAAK,CAAC,MAAMH,EAAcG,EAAE,IAAI,CAAC,EAAE,EAC9E,KAAK,EAAE,EACV,MAAO,aAAaJ,EAAmB9B,EAAK,UAAU,CAAC,MAAMiC,CAAK,iBACpE,CACF,CACF,CAEA,SAASzB,EAAeR,EAAgD,CACtE,IAAM3B,EAAQ,CAAC,SAASyD,EAAmB9B,EAAK,SAAS,CAAC,MAAO+B,EAAc/B,EAAK,UAAU,CAAC,EAC/F,GAAIA,EAAK,aACP,QAAWS,KAAQT,EAAK,aACtB3B,EAAM,KAAK,WAAWyD,EAAmBrB,EAAK,SAAS,CAAC,MAAOsB,EAActB,EAAK,IAAI,CAAC,EAG3F,OAAIT,EAAK,YACP3B,EAAM,KAAK,aAAc0D,EAAc/B,EAAK,UAAU,CAAC,EAEzD3B,EAAM,KAAK,aAAa,EACjBA,EAAM,KAAK,EAAE,CACtB,CCjeO,IAAM8D,EAAN,KAAqC,CAG1C,YAAYC,EAAgC,CAAC,EAAG,CAC9C,KAAK,MAAQ,IAAI,IAAI,OAAO,QAAQA,CAAK,CAAC,CAC5C,CAEA,QAAQC,EAAcC,EAAuB,CAC3C,KAAK,MAAM,IAAID,EAAMC,CAAO,CAC9B,CAEA,MAAM,KAAKD,EAAcE,EAAoC,CAE3D,IAAMC,EAAWD,GAAY,CAACF,EAAK,WAAW,GAAG,EAC7C,GAAGE,CAAQ,IAAIF,CAAI,GACnBA,EAEEI,EAAQD,EAAS,MAAM,GAAG,EAC1BE,EAAuB,CAAC,EAC9B,QAAWC,KAAQF,EACjB,GAAI,EAAAE,IAAS,KAAOA,IAAS,IAC7B,IAAIA,IAAS,KAAM,CAAED,EAAW,IAAI,EAAG,QAAS,CAChDA,EAAW,KAAKC,CAAI,EAGtB,IAAMC,GADSJ,EAAS,WAAW,GAAG,EAAI,IAAM,IAClBE,EAAW,KAAK,GAAG,EAE3CJ,EAAU,KAAK,MAAM,IAAIM,CAAY,EAE3C,GAAIN,IAAY,OACd,MAAM,IAAI,MAAM,mBAAmBM,CAAY,EAAE,EAGnD,OAAON,CACT,CACF",
|
|
6
|
+
"names": ["browser_exports", "__export", "Context", "FetchLoader", "MemoryLoader", "evaluateExpression", "parse", "parseExpression", "render", "parseExpression", "expr", "depth", "balanced", "i", "orMatch", "findOperator", "andMatch", "comparisonOps", "op", "opMatch", "operator", "inString", "char", "evaluateExpression", "context", "left", "right", "isTruthy", "operand", "value", "parse", "template", "errors", "ast", "position", "line", "column", "createError", "message", "advance", "count", "i", "findNext", "str", "from", "extractTo", "target", "text", "varStart", "tagStart", "commentStart", "candidates", "c", "a", "b", "nearest", "endPos", "varName", "lastNode", "commentText", "statement", "hasLeftStrip", "hasRightStrip", "setMatch", "expr", "parseExpression", "error", "condition", "trueBranch", "elifBranches", "elseBranch", "parseErrors", "parseIfBlock", "includeMatch", "switchExpr", "cases", "parseSwitchBlock", "offsetMatch", "offsetStr", "isRelative", "offset", "depth", "searchPos", "leveloffsetMatch", "endleveloffsetMatch", "leveloffsetPos", "endleveloffsetPos", "bodyTemplate", "endMatch", "bodyResult", "findEndTag", "tagName", "match", "ifMatch", "elifMatch", "elseMatch", "endifMatch", "condMatch", "condStr", "elifCondition", "elifResult", "elseBodyTemplate", "elseBodyResult", "caseMatch", "endswitchMatch", "casePos", "endswitchPos", "valueMatch", "valueStr", "caseValue", "Context", "_Context", "parent", "options", "name", "parts", "rootName", "value", "i", "target", "key", "data", "ctx", "FetchLoader", "path", "basePath", "url", "fetchUrl", "response", "transformHeadings", "text", "offset", "_match", "hashes", "space", "currentLevel", "newLevel", "resolvePath", "path", "basePath", "combined", "parts", "resolved", "part", "render", "template", "options", "loader", "FetchLoader", "initialContext", "maxIncludeDepth", "timeout", "hyphenToUnderscore", "undefinedBehavior", "undefinedConditions", "timeoutPromise", "_", "reject", "renderPromise", "renderInternal", "Context", "includeDepth", "parseResult", "parse", "errorMessages", "e", "renderNodes", "nodes", "node", "renderNode", "context", "currentOffset", "value", "str", "evaluateExpression", "findUndefinedRefs", "ifNodeToSource", "elif", "condition", "isTruthy", "elifBranch", "elifCondition", "includedContent", "newBasePath", "url", "resolvedPath", "lastSlash", "error", "message", "switchValue", "caseItem", "caseValue", "parentOffset", "newOffset", "previousOffset", "expr", "out", "walk", "expressionToSource", "nodesToSource", "nodeToSource", "cases", "c", "MemoryLoader", "files", "path", "content", "basePath", "combined", "parts", "normalized", "part", "resolvedPath"]
|
|
7
7
|
}
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAuB,aAAa,EAAU,MAAM,YAAY,CAAA;AA+D5E;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAuB,aAAa,EAAU,MAAM,YAAY,CAAA;AA+D5E;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC3F"}
|
package/dist/renderer.js
CHANGED
|
@@ -64,7 +64,7 @@ function resolvePath(path, basePath) {
|
|
|
64
64
|
* @returns Rendered output
|
|
65
65
|
*/
|
|
66
66
|
export async function render(template, options = {}) {
|
|
67
|
-
const { loader = new FetchLoader(), context: initialContext = {}, basePath = '', maxIncludeDepth = 10, timeout = 5000, hyphenToUnderscore = false, undefinedBehavior = 'empty', } = options;
|
|
67
|
+
const { loader = new FetchLoader(), context: initialContext = {}, basePath = '', maxIncludeDepth = 10, timeout = 5000, hyphenToUnderscore = false, undefinedBehavior = 'empty', undefinedConditions = 'preserve', } = options;
|
|
68
68
|
// Create timeout promise
|
|
69
69
|
const timeoutPromise = new Promise((_, reject) => {
|
|
70
70
|
setTimeout(() => reject(new Error('Template rendering timeout')), timeout);
|
|
@@ -83,6 +83,7 @@ export async function render(template, options = {}) {
|
|
|
83
83
|
maxIncludeDepth,
|
|
84
84
|
basePath,
|
|
85
85
|
undefinedBehavior,
|
|
86
|
+
undefinedConditions,
|
|
86
87
|
});
|
|
87
88
|
return await Promise.race([renderPromise, timeoutPromise]);
|
|
88
89
|
}
|
|
@@ -165,7 +166,12 @@ async function renderNode(node, options) {
|
|
|
165
166
|
// which branch to take. Preserve the whole `{% if … %}…{% endif %}`
|
|
166
167
|
// verbatim so a second pass (with the value supplied) can
|
|
167
168
|
// resolve it. See plans/format-asciidoc-import.md.
|
|
168
|
-
|
|
169
|
+
//
|
|
170
|
+
// Except when `undefinedConditions === 'falsy'`: this is a
|
|
171
|
+
// terminal build with no later pass, so treat the undefined
|
|
172
|
+
// reference as falsy (AsciiDoc `ifdef::attr[]` semantics) and
|
|
173
|
+
// evaluate now rather than leak the directive to readers.
|
|
174
|
+
if (options.undefinedBehavior === 'preserve' && options.undefinedConditions !== 'falsy') {
|
|
169
175
|
const undefinedRefs = findUndefinedRefs(node.condition, context);
|
|
170
176
|
if (undefinedRefs.length > 0) {
|
|
171
177
|
return ifNodeToSource(node);
|
|
@@ -234,6 +240,7 @@ async function renderNode(node, options) {
|
|
|
234
240
|
maxIncludeDepth,
|
|
235
241
|
basePath: newBasePath,
|
|
236
242
|
undefinedBehavior: options.undefinedBehavior,
|
|
243
|
+
undefinedConditions: options.undefinedConditions,
|
|
237
244
|
});
|
|
238
245
|
}
|
|
239
246
|
catch (error) {
|
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -118,6 +118,21 @@ export interface RenderOptions {
|
|
|
118
118
|
* See plans/format-asciidoc-import.md.
|
|
119
119
|
*/
|
|
120
120
|
undefinedBehavior?: 'empty' | 'throw' | 'preserve';
|
|
121
|
+
/**
|
|
122
|
+
* How `{% if %}` conditions that reference an undefined variable
|
|
123
|
+
* behave. Only consulted when `undefinedBehavior` is `'preserve'`.
|
|
124
|
+
*
|
|
125
|
+
* - `'preserve'` (default) — round-trip the whole
|
|
126
|
+
* `{% if … %}…{% endif %}` verbatim so a later pass (with the value
|
|
127
|
+
* supplied) can resolve it. Back-compat with the migrate pipeline.
|
|
128
|
+
* - `'falsy'` — treat the undefined reference as falsy and evaluate
|
|
129
|
+
* the condition now, dropping (or `else`-branching) the block. This
|
|
130
|
+
* matches AsciiDoc `ifdef::attr[]` semantics, where an undefined
|
|
131
|
+
* attribute is false. Use for a *terminal* build where no further
|
|
132
|
+
* Minja pass will run — undefined `{{ var }}` interpolations are
|
|
133
|
+
* still preserved, but dangling conditionals don't leak to readers.
|
|
134
|
+
*/
|
|
135
|
+
undefinedConditions?: 'preserve' | 'falsy';
|
|
121
136
|
}
|
|
122
137
|
export interface IContext {
|
|
123
138
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|