@dogsbay/minja 0.2.0-beta.100

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.
Files changed (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +623 -0
  3. package/bin/minja.js +1225 -0
  4. package/dist/browser.d.ts +12 -0
  5. package/dist/browser.d.ts.map +1 -0
  6. package/dist/browser.js +11 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/cli.d.ts +5 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +98 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/context.d.ts +47 -0
  13. package/dist/context.d.ts.map +1 -0
  14. package/dist/context.js +112 -0
  15. package/dist/context.js.map +1 -0
  16. package/dist/evaluator.d.ts +20 -0
  17. package/dist/evaluator.d.ts.map +1 -0
  18. package/dist/evaluator.js +213 -0
  19. package/dist/evaluator.js.map +1 -0
  20. package/dist/index.d.ts +20 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +18 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/index.umd.js +1160 -0
  25. package/dist/index.umd.js.map +7 -0
  26. package/dist/index.umd.min.js +12 -0
  27. package/dist/index.umd.min.js.map +7 -0
  28. package/dist/loader-fetch.d.ts +8 -0
  29. package/dist/loader-fetch.d.ts.map +1 -0
  30. package/dist/loader-fetch.js +15 -0
  31. package/dist/loader-fetch.js.map +1 -0
  32. package/dist/loader-memory.d.ts +11 -0
  33. package/dist/loader-memory.d.ts.map +1 -0
  34. package/dist/loader-memory.js +36 -0
  35. package/dist/loader-memory.js.map +1 -0
  36. package/dist/loader.d.ts +73 -0
  37. package/dist/loader.d.ts.map +1 -0
  38. package/dist/loader.js +159 -0
  39. package/dist/loader.js.map +1 -0
  40. package/dist/parser.d.ts +7 -0
  41. package/dist/parser.d.ts.map +1 -0
  42. package/dist/parser.js +609 -0
  43. package/dist/parser.js.map +1 -0
  44. package/dist/renderer.d.ts +13 -0
  45. package/dist/renderer.d.ts.map +1 -0
  46. package/dist/renderer.js +494 -0
  47. package/dist/renderer.js.map +1 -0
  48. package/dist/scan.d.ts +46 -0
  49. package/dist/scan.d.ts.map +1 -0
  50. package/dist/scan.js +46 -0
  51. package/dist/scan.js.map +1 -0
  52. package/dist/types.d.ts +175 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +5 -0
  55. package/dist/types.js.map +1 -0
  56. package/package.json +72 -0
package/dist/parser.js ADDED
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Template parser
3
+ * Converts template strings into AST (Abstract Syntax Tree)
4
+ */
5
+ import { parseExpression } from './evaluator.js';
6
+ /**
7
+ * Statement keywords the parser understands. Openers dispatch below; the
8
+ * end/branch keywords are consumed by their opening tags (stray ones are
9
+ * ignored, matching historical behavior). Anything OUTSIDE this set is an
10
+ * unknown statement and is preserved verbatim in the output — silently
11
+ * deleting author content is never acceptable.
12
+ */
13
+ const KNOWN_TAG_KEYWORDS = new Set([
14
+ 'set',
15
+ 'if',
16
+ 'include',
17
+ 'switch',
18
+ 'leveloffset',
19
+ 'raw',
20
+ 'endif',
21
+ 'elif',
22
+ 'else',
23
+ 'endswitch',
24
+ 'case',
25
+ 'endleveloffset',
26
+ 'endraw',
27
+ ]);
28
+ /**
29
+ * Parse a template string into an AST
30
+ * @param template - Template string to parse
31
+ * @returns Parse result with AST and errors
32
+ */
33
+ /**
34
+ * Apply a closing tag's LEFT whitespace-control marker to the body it closes.
35
+ *
36
+ * `{%- endif %}` must strip the whitespace before it — including the newline —
37
+ * exactly as `{%-` does on an opening tag. Block bodies are extracted by
38
+ * matching the end tag textually (`/{%-?\s*endif\s*-?%}/`), and the `-?` was
39
+ * matched but never acted on, so the body kept its trailing newline. Combined
40
+ * with the newline that follows the tag, an AsciiDoc conditional written
41
+ * inline in a paragraph —
42
+ *
43
+ * Welcome to the official {{ product_title }}
44
+ * {%- if not openshift_rosa %}
45
+ * {{ product_version }}
46
+ * {%- endif %}
47
+ * documentation, where you can learn…
48
+ *
49
+ * — rendered a BLANK line after the version, splitting one sentence into two
50
+ * paragraphs mid-clause. Jinja2 produces no blank line here.
51
+ */
52
+ function stripBodyForEndTag(body, endTag) {
53
+ return endTag.startsWith('{%-') ? body.replace(/[ \t]*\n[ \t\n]*$/, '') : body;
54
+ }
55
+ export function parse(template) {
56
+ const errors = [];
57
+ const ast = [];
58
+ let position = 0;
59
+ let line = 1;
60
+ let column = 1;
61
+ /**
62
+ * Create a parse error
63
+ */
64
+ function createError(message) {
65
+ return { message, position, line, column };
66
+ }
67
+ /**
68
+ * Advance position tracking
69
+ */
70
+ function advance(count) {
71
+ for (let i = 0; i < count; i++) {
72
+ if (template[position + i] === '\n') {
73
+ line++;
74
+ column = 1;
75
+ }
76
+ else {
77
+ column++;
78
+ }
79
+ }
80
+ position += count;
81
+ }
82
+ /**
83
+ * Find the next occurrence of a string
84
+ */
85
+ function findNext(str, from = position) {
86
+ return template.indexOf(str, from);
87
+ }
88
+ /**
89
+ * Extract text between current position and a target position
90
+ */
91
+ function extractTo(target) {
92
+ const text = template.substring(position, target);
93
+ advance(target - position);
94
+ return text;
95
+ }
96
+ while (position < template.length) {
97
+ // Look for template tags
98
+ const varStart = findNext('{{', position);
99
+ const tagStart = findNext('{%', position);
100
+ const commentStart = findNext('{#', position);
101
+ // Find the nearest tag
102
+ const candidates = [
103
+ { pos: varStart, type: 'var' },
104
+ { pos: tagStart, type: 'tag' },
105
+ { pos: commentStart, type: 'comment' },
106
+ ].filter((c) => c.pos !== -1);
107
+ if (candidates.length === 0) {
108
+ // No more tags, rest is text
109
+ const text = template.substring(position);
110
+ if (text) {
111
+ ast.push({ type: 'text', value: text });
112
+ }
113
+ break;
114
+ }
115
+ // Sort to find nearest
116
+ candidates.sort((a, b) => a.pos - b.pos);
117
+ const nearest = candidates[0];
118
+ // Add text before tag
119
+ if (nearest.pos > position) {
120
+ ast.push({ type: 'text', value: extractTo(nearest.pos) });
121
+ }
122
+ // Parse the tag
123
+ if (nearest.type === 'var') {
124
+ // Variable: {{ name }}
125
+ advance(2); // Skip {{
126
+ const endPos = findNext('}}', position);
127
+ if (endPos === -1) {
128
+ errors.push(createError('Unclosed variable tag'));
129
+ break;
130
+ }
131
+ const varName = extractTo(endPos).trim();
132
+ advance(2); // Skip }}
133
+ ast.push({ type: 'variable', name: varName });
134
+ }
135
+ else if (nearest.type === 'comment') {
136
+ // Comment: {# ... #}
137
+ // Auto-strip newlines for comments (they produce no output)
138
+ // Only strip if the comment is on its own line
139
+ if (ast.length > 0 && ast[ast.length - 1].type === 'text') {
140
+ const lastNode = ast[ast.length - 1];
141
+ // Only strip if previous text ends with newline (comment is on its own line)
142
+ if (/\n[ \t]*$/.test(lastNode.value)) {
143
+ lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t]*$/, '');
144
+ }
145
+ }
146
+ advance(2); // Skip {#
147
+ const endPos = findNext('#}', position);
148
+ if (endPos === -1) {
149
+ errors.push(createError('Unclosed comment tag'));
150
+ break;
151
+ }
152
+ const commentText = extractTo(endPos);
153
+ advance(2); // Skip #}
154
+ ast.push({ type: 'comment', value: commentText });
155
+ // Auto-strip following newline if comment is on its own line
156
+ if (position < template.length && template[position] === '\n') {
157
+ advance(1);
158
+ // Also skip any indentation on the next line
159
+ while (position < template.length && /[ \t]/.test(template[position])) {
160
+ advance(1);
161
+ }
162
+ }
163
+ }
164
+ else if (nearest.type === 'tag') {
165
+ // Statement tag: {% ... %}
166
+ const tagStart = position;
167
+ advance(2); // Skip {%
168
+ const endPos = findNext('%}', position);
169
+ if (endPos === -1) {
170
+ errors.push(createError('Unclosed statement tag'));
171
+ break;
172
+ }
173
+ // Peek the keyword BEFORE whitespace-control processing, so raw
174
+ // blocks and unknown tags are handled without side effects.
175
+ const peeked = template.substring(position, endPos).trim();
176
+ const peekKeyword = peeked.replace(/^-\s*/, '').replace(/\s*-$/, '').split(/\s+/)[0] ?? '';
177
+ if (peekKeyword === 'raw') {
178
+ // {% raw %} ... {% endraw %} — Jinja semantics: everything between
179
+ // the markers passes through COMPLETELY unevaluated; the markers
180
+ // themselves produce no output. Whitespace-control markers are
181
+ // honored on both tags.
182
+ const openerLeftStrip = peeked.startsWith('-');
183
+ const openerRightStrip = peeked.endsWith('-');
184
+ if (openerLeftStrip && ast.length > 0 && ast[ast.length - 1].type === 'text') {
185
+ const lastNode = ast[ast.length - 1];
186
+ lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t\n]*$/, '');
187
+ }
188
+ extractTo(endPos);
189
+ advance(2); // Skip %}
190
+ if (openerRightStrip) {
191
+ while (position < template.length && /[ \t\n]/.test(template[position])) {
192
+ advance(1);
193
+ }
194
+ }
195
+ const endrawMatch = /\{%-?\s*endraw\s*-?%\}/.exec(template.substring(position));
196
+ if (!endrawMatch) {
197
+ errors.push(createError('Unclosed raw block'));
198
+ break;
199
+ }
200
+ const endrawAbs = position + endrawMatch.index;
201
+ let content = extractTo(endrawAbs);
202
+ const endrawTag = endrawMatch[0];
203
+ if (endrawTag.startsWith('{%-')) {
204
+ content = content.replace(/[ \t]*\n[ \t\n]*$/, '');
205
+ }
206
+ advance(endrawTag.length);
207
+ if (endrawTag.endsWith('-%}')) {
208
+ while (position < template.length && /[ \t\n]/.test(template[position])) {
209
+ advance(1);
210
+ }
211
+ }
212
+ if (content) {
213
+ ast.push({ type: 'text', value: content });
214
+ }
215
+ continue;
216
+ }
217
+ if (!KNOWN_TAG_KEYWORDS.has(peekKeyword)) {
218
+ // Unknown statement: preserve the tag verbatim (it was previously
219
+ // silently dropped). No whitespace control is applied — the bytes
220
+ // pass through exactly as authored.
221
+ extractTo(endPos);
222
+ advance(2); // Skip %}
223
+ ast.push({ type: 'text', value: template.substring(tagStart, endPos + 2) });
224
+ continue;
225
+ }
226
+ let statement = extractTo(endPos).trim();
227
+ // Check for whitespace control characters
228
+ const hasLeftStrip = statement.startsWith('-');
229
+ const hasRightStrip = statement.endsWith('-');
230
+ // Strip whitespace control characters from statement
231
+ if (hasLeftStrip) {
232
+ statement = statement.substring(1).trim();
233
+ // Strip trailing whitespace from previous text node
234
+ if (ast.length > 0 && ast[ast.length - 1].type === 'text') {
235
+ const lastNode = ast[ast.length - 1];
236
+ lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t\n]*$/, '');
237
+ }
238
+ }
239
+ if (hasRightStrip) {
240
+ statement = statement.substring(0, statement.length - 1).trim();
241
+ }
242
+ advance(2); // Skip %}
243
+ // If right strip, consume following whitespace
244
+ if (hasRightStrip) {
245
+ while (position < template.length && /[ \t\n]/.test(template[position])) {
246
+ advance(1);
247
+ }
248
+ }
249
+ // Parse different statement types
250
+ if (statement.startsWith('set ')) {
251
+ // {% set var = value %}
252
+ const setMatch = /^set\s+(\w+)\s*=\s*(.+)$/.exec(statement);
253
+ if (setMatch) {
254
+ try {
255
+ const expr = parseExpression(setMatch[2]);
256
+ ast.push({
257
+ type: 'set',
258
+ name: setMatch[1],
259
+ value: expr,
260
+ });
261
+ }
262
+ catch (error) {
263
+ errors.push(createError(`Invalid set expression: ${error.message}`));
264
+ }
265
+ }
266
+ else {
267
+ errors.push(createError('Invalid set syntax'));
268
+ }
269
+ }
270
+ else if (statement.startsWith('if ')) {
271
+ // {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}
272
+ const condition = statement.substring(3).trim();
273
+ try {
274
+ const expr = parseExpression(condition);
275
+ // Find the body and elif/else/endif blocks
276
+ const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock();
277
+ errors.push(...parseErrors);
278
+ ast.push({
279
+ type: 'if',
280
+ condition: expr,
281
+ trueBranch,
282
+ elifBranches: elifBranches.length > 0 ? elifBranches : undefined,
283
+ elseBranch: elseBranch.length > 0 ? elseBranch : undefined,
284
+ });
285
+ }
286
+ catch (error) {
287
+ errors.push(createError(`Invalid if expression: ${error.message}`));
288
+ }
289
+ }
290
+ else if (statement.startsWith('include ')) {
291
+ // {% include "path" %}
292
+ const includeMatch = /^include\s+["']([^"']+)["']/.exec(statement);
293
+ if (includeMatch) {
294
+ ast.push({
295
+ type: 'include',
296
+ path: includeMatch[1],
297
+ });
298
+ }
299
+ else {
300
+ errors.push(createError('Invalid include syntax'));
301
+ }
302
+ }
303
+ else if (statement.startsWith('switch ')) {
304
+ // {% switch variable %} ... {% case "value" %} ... {% endswitch %}
305
+ const switchExpr = statement.substring(7).trim();
306
+ try {
307
+ const expr = parseExpression(switchExpr);
308
+ const { cases, parseErrors } = parseSwitchBlock();
309
+ errors.push(...parseErrors);
310
+ ast.push({
311
+ type: 'switch',
312
+ expression: expr,
313
+ cases,
314
+ });
315
+ }
316
+ catch (error) {
317
+ errors.push(createError(`Invalid switch expression: ${error.message}`));
318
+ }
319
+ }
320
+ else if (statement.startsWith('leveloffset ')) {
321
+ // {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}
322
+ const offsetMatch = /^leveloffset\s+([-+]?\d+)$/.exec(statement);
323
+ if (!offsetMatch) {
324
+ errors.push(createError('Invalid leveloffset syntax'));
325
+ }
326
+ else {
327
+ const offsetStr = offsetMatch[1];
328
+ const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-');
329
+ const offset = parseInt(offsetStr, 10);
330
+ if (isNaN(offset)) {
331
+ errors.push(createError('Invalid leveloffset value'));
332
+ }
333
+ else {
334
+ // Find matching endleveloffset accounting for nesting
335
+ let depth = 0;
336
+ let searchPos = position;
337
+ let endPos = -1;
338
+ while (searchPos < template.length) {
339
+ const leveloffsetMatch = /{%-?\s*leveloffset\s+[-+]?\d+\s*-?%}/.exec(template.substring(searchPos));
340
+ const endleveloffsetMatch = /{%-?\s*endleveloffset\s*-?%}/.exec(template.substring(searchPos));
341
+ const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity;
342
+ const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity;
343
+ if (leveloffsetPos < endleveloffsetPos) {
344
+ // Found nested leveloffset
345
+ depth++;
346
+ searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0);
347
+ }
348
+ else if (endleveloffsetPos < Infinity) {
349
+ // Found endleveloffset
350
+ if (depth === 0) {
351
+ // This is our matching endleveloffset
352
+ endPos = endleveloffsetPos;
353
+ break;
354
+ }
355
+ else {
356
+ depth--;
357
+ searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0);
358
+ }
359
+ }
360
+ else {
361
+ // No more tags found
362
+ break;
363
+ }
364
+ }
365
+ if (endPos === -1) {
366
+ errors.push(createError('Missing endleveloffset'));
367
+ }
368
+ else {
369
+ const bodyTemplate = extractTo(endPos);
370
+ // Find and skip the endleveloffset tag
371
+ const endMatch = /{%-?\s*endleveloffset\s*-?%}/.exec(template.substring(position));
372
+ if (endMatch) {
373
+ advance(endMatch[0].length);
374
+ }
375
+ const bodyResult = parse(bodyTemplate);
376
+ errors.push(...bodyResult.errors);
377
+ ast.push({
378
+ type: 'leveloffset',
379
+ offset,
380
+ isRelative,
381
+ body: bodyResult.ast,
382
+ });
383
+ }
384
+ }
385
+ }
386
+ }
387
+ // Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags
388
+ }
389
+ }
390
+ return { ast, errors };
391
+ /**
392
+ * Find an end tag like {% endif %}
393
+ */
394
+ function findEndTag(tagName) {
395
+ // `-?` on BOTH sides: without it this could not match `{%- endif %}`, so an
396
+ // `{% else %}` branch closed with a whitespace-controlled endif failed to
397
+ // parse at all — the page threw "Missing endif after else" and the build
398
+ // preprocessor copied it through UNRENDERED, variables and directives and
399
+ // all. Three OpenShift pages were shipping that way.
400
+ const pattern = new RegExp(`{%-?\\s*${tagName}\\s*-?%}`);
401
+ const match = pattern.exec(template.substring(position));
402
+ if (match) {
403
+ return {
404
+ start: position + match.index,
405
+ length: match[0].length,
406
+ tag: match[0],
407
+ };
408
+ }
409
+ return null;
410
+ }
411
+ /**
412
+ * Parse an if block with elif and else support
413
+ */
414
+ function parseIfBlock() {
415
+ const elifBranches = [];
416
+ const parseErrors = [];
417
+ let elseBranch = [];
418
+ // Find the next elif, else, or endif
419
+ let depth = 0;
420
+ let searchPos = position;
421
+ while (searchPos < template.length) {
422
+ const ifMatch = /{%-?\s*if\s+/.exec(template.substring(searchPos));
423
+ const elifMatch = /{%-?\s*elif\s+/.exec(template.substring(searchPos));
424
+ const elseMatch = /{%-?\s*else\s*-?%}/.exec(template.substring(searchPos));
425
+ const endifMatch = /{%-?\s*endif\s*-?%}/.exec(template.substring(searchPos));
426
+ // Find the nearest match
427
+ const matches = [
428
+ { type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },
429
+ { type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },
430
+ { type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },
431
+ { type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },
432
+ ].sort((a, b) => a.pos - b.pos);
433
+ const nearest = matches[0];
434
+ if (!nearest.match || nearest.pos === Infinity) {
435
+ parseErrors.push(createError('Missing endif'));
436
+ break;
437
+ }
438
+ if (nearest.type === 'if') {
439
+ depth++;
440
+ searchPos = nearest.pos + nearest.match[0].length;
441
+ }
442
+ else if (nearest.type === 'endif') {
443
+ if (depth === 0) {
444
+ // This is our endif
445
+ const bodyTemplate = stripBodyForEndTag(extractTo(nearest.pos), nearest.match[0]);
446
+ advance(nearest.match[0].length);
447
+ if (nearest.match[0].endsWith('-%}')) {
448
+ while (position < template.length && /[ \t\n]/.test(template[position]))
449
+ advance(1);
450
+ }
451
+ const bodyResult = parse(bodyTemplate);
452
+ parseErrors.push(...bodyResult.errors);
453
+ return {
454
+ trueBranch: bodyResult.ast,
455
+ elifBranches,
456
+ elseBranch,
457
+ parseErrors,
458
+ };
459
+ }
460
+ else {
461
+ depth--;
462
+ searchPos = nearest.pos + nearest.match[0].length;
463
+ }
464
+ }
465
+ else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {
466
+ // Parse the body before elif/else
467
+ const bodyTemplate = stripBodyForEndTag(extractTo(nearest.pos), nearest.match[0]);
468
+ const bodyResult = parse(bodyTemplate);
469
+ if (elifBranches.length === 0 && elseBranch.length === 0) {
470
+ // This is the trueBranch (before first elif/else)
471
+ parseErrors.push(...bodyResult.errors);
472
+ const trueBranch = bodyResult.ast;
473
+ // Now handle elif or else
474
+ if (nearest.type === 'elif') {
475
+ // Extract elif condition
476
+ advance(nearest.match[0].length);
477
+ const condMatch = /^([^%]+)%}/.exec(template.substring(position));
478
+ if (condMatch) {
479
+ const condStr = condMatch[1].trim();
480
+ advance(condMatch[0].length);
481
+ try {
482
+ const elifCondition = parseExpression(condStr);
483
+ const elifResult = parseIfBlock();
484
+ parseErrors.push(...elifResult.parseErrors);
485
+ elifBranches.push({
486
+ condition: elifCondition,
487
+ body: elifResult.trueBranch,
488
+ });
489
+ elifBranches.push(...(elifResult.elifBranches || []));
490
+ elseBranch = elifResult.elseBranch;
491
+ return {
492
+ trueBranch,
493
+ elifBranches,
494
+ elseBranch,
495
+ parseErrors,
496
+ };
497
+ }
498
+ catch (error) {
499
+ parseErrors.push(createError(`Invalid elif expression: ${error.message}`));
500
+ }
501
+ }
502
+ }
503
+ else {
504
+ // else
505
+ advance(nearest.match[0].length);
506
+ // Find endif for else block
507
+ const endifMatch = findEndTag('endif');
508
+ if (!endifMatch) {
509
+ parseErrors.push(createError('Missing endif after else'));
510
+ }
511
+ else {
512
+ const elseBodyTemplate = stripBodyForEndTag(extractTo(endifMatch.start), endifMatch.tag);
513
+ advance(endifMatch.length);
514
+ const elseBodyResult = parse(elseBodyTemplate);
515
+ parseErrors.push(...elseBodyResult.errors);
516
+ elseBranch = elseBodyResult.ast;
517
+ }
518
+ return {
519
+ trueBranch,
520
+ elifBranches,
521
+ elseBranch,
522
+ parseErrors,
523
+ };
524
+ }
525
+ }
526
+ }
527
+ else {
528
+ searchPos = nearest.pos + nearest.match[0].length;
529
+ }
530
+ }
531
+ return {
532
+ trueBranch: [],
533
+ elifBranches,
534
+ elseBranch,
535
+ parseErrors,
536
+ };
537
+ }
538
+ /**
539
+ * Parse a switch block with case support
540
+ */
541
+ function parseSwitchBlock() {
542
+ const cases = [];
543
+ const parseErrors = [];
544
+ while (position < template.length) {
545
+ // Find the next case or endswitch
546
+ const caseMatch = /{%-?\s*case\s+/.exec(template.substring(position));
547
+ const endswitchMatch = /{%-?\s*endswitch\s*-?%}/.exec(template.substring(position));
548
+ // Find which comes first
549
+ const casePos = caseMatch ? position + caseMatch.index : Infinity;
550
+ const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity;
551
+ if (endswitchPos < casePos) {
552
+ // Found endswitch before any case (or no case)
553
+ // Parse any remaining content before endswitch as the last case body
554
+ if (cases.length > 0 && position < endswitchPos) {
555
+ const bodyTemplate = extractTo(endswitchPos);
556
+ const bodyResult = parse(bodyTemplate);
557
+ parseErrors.push(...bodyResult.errors);
558
+ cases[cases.length - 1].body = bodyResult.ast;
559
+ }
560
+ // Skip endswitch
561
+ advance(endswitchPos - position + (endswitchMatch?.[0].length || 0));
562
+ break;
563
+ }
564
+ else if (casePos < Infinity) {
565
+ // Found a case
566
+ // If there's a previous case, parse its body
567
+ if (cases.length > 0 && position < casePos) {
568
+ const bodyTemplate = extractTo(casePos);
569
+ const bodyResult = parse(bodyTemplate);
570
+ parseErrors.push(...bodyResult.errors);
571
+ cases[cases.length - 1].body = bodyResult.ast;
572
+ }
573
+ else if (position < casePos) {
574
+ // Content before first case - skip it
575
+ extractTo(casePos);
576
+ }
577
+ // Parse the case value
578
+ advance(caseMatch[0].length);
579
+ // Extract the case value (until %})
580
+ const valueMatch = /([^%]+)%}/.exec(template.substring(position));
581
+ if (valueMatch) {
582
+ const valueStr = valueMatch[1].trim();
583
+ advance(valueMatch[0].length);
584
+ try {
585
+ const caseValue = parseExpression(valueStr);
586
+ cases.push({
587
+ value: caseValue,
588
+ body: [], // Will be filled in next iteration or at endswitch
589
+ });
590
+ }
591
+ catch (error) {
592
+ parseErrors.push(createError(`Invalid case value: ${error.message}`));
593
+ }
594
+ }
595
+ else {
596
+ parseErrors.push(createError('Invalid case syntax'));
597
+ break;
598
+ }
599
+ }
600
+ else {
601
+ // No case or endswitch found
602
+ parseErrors.push(createError('Missing endswitch'));
603
+ break;
604
+ }
605
+ }
606
+ return { cases, parseErrors };
607
+ }
608
+ }
609
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Template renderer
3
+ * Combines parser, evaluator, and loader to render templates
4
+ */
5
+ import type { RenderOptions } from './types.js';
6
+ /**
7
+ * Render a template string
8
+ * @param template - Template string to render
9
+ * @param options - Render options
10
+ * @returns Rendered output
11
+ */
12
+ export declare function render(template: string, options?: RenderOptions): Promise<string>;
13
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +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;AAoG5E;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC3F"}