@dogsbay/minja 0.2.0-beta.48

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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +603 -0
  3. package/bin/minja.js +1062 -0
  4. package/dist/browser.d.ts +11 -0
  5. package/dist/browser.d.ts.map +1 -0
  6. package/dist/browser.js +10 -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 +97 -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 +207 -0
  19. package/dist/evaluator.js.map +1 -0
  20. package/dist/index.d.ts +18 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +17 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/index.umd.js +1026 -0
  25. package/dist/index.umd.js.map +7 -0
  26. package/dist/index.umd.min.js +9 -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 +54 -0
  37. package/dist/loader.d.ts.map +1 -0
  38. package/dist/loader.js +91 -0
  39. package/dist/loader.js.map +1 -0
  40. package/dist/parser.d.ts +12 -0
  41. package/dist/parser.d.ts.map +1 -0
  42. package/dist/parser.js +501 -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 +415 -0
  47. package/dist/renderer.js.map +1 -0
  48. package/dist/types.d.ts +150 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +5 -0
  51. package/dist/types.js.map +1 -0
  52. package/package.json +62 -0
package/dist/loader.js ADDED
@@ -0,0 +1,91 @@
1
+ /**
2
+ * File loaders for {% include %} statements
3
+ * Pluggable interface supporting different environments
4
+ */
5
+ /**
6
+ * Fetch-based loader for browsers and service workers
7
+ * Uses the Fetch API to load files
8
+ */
9
+ export class FetchLoader {
10
+ /**
11
+ * Load a file using fetch
12
+ * @param path - Path to load (relative or absolute URL)
13
+ * @param basePath - Base URL to resolve relative paths
14
+ * @returns File contents
15
+ */
16
+ async load(path, basePath) {
17
+ const url = basePath ? new URL(path, basePath).href : path;
18
+ // Add cache busting parameter
19
+ const fetchUrl = `${url}?preventCache=${Date.now()}`;
20
+ const response = await fetch(fetchUrl);
21
+ if (!response.ok) {
22
+ throw new Error(`Failed to load ${url}: ${response.status} ${response.statusText}`);
23
+ }
24
+ return await response.text();
25
+ }
26
+ }
27
+ /**
28
+ * Filesystem loader for Node.js
29
+ * Uses fs.readFile to load files
30
+ */
31
+ export class FileSystemLoader {
32
+ /**
33
+ * Create a filesystem loader
34
+ * @param basePath - Base directory for resolving relative paths
35
+ */
36
+ constructor(basePath = process.cwd()) {
37
+ this.basePath = basePath;
38
+ }
39
+ /**
40
+ * Load a file from the filesystem
41
+ * @param path - Path to load (relative or absolute)
42
+ * @param basePath - Base path to resolve relative paths (overrides constructor basePath)
43
+ * @returns File contents
44
+ */
45
+ async load(path, basePath) {
46
+ // Dynamic import to avoid bundling fs in browser builds
47
+ const fs = await import('fs/promises');
48
+ const pathModule = await import('path');
49
+ const resolvedBasePath = basePath || this.basePath;
50
+ const resolvedPath = pathModule.isAbsolute(path)
51
+ ? path
52
+ : pathModule.resolve(resolvedBasePath, path);
53
+ try {
54
+ return await fs.readFile(resolvedPath, 'utf-8');
55
+ }
56
+ catch (error) {
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ throw new Error(`Failed to load ${resolvedPath}: ${message}`);
59
+ }
60
+ }
61
+ }
62
+ /**
63
+ * Memory-based loader for testing
64
+ * Stores files in a Map
65
+ */
66
+ export class MemoryLoader {
67
+ constructor(files = {}) {
68
+ this.files = new Map(Object.entries(files));
69
+ }
70
+ /**
71
+ * Add a file to the memory loader
72
+ */
73
+ addFile(path, content) {
74
+ this.files.set(path, content);
75
+ }
76
+ /**
77
+ * Load a file from memory
78
+ */
79
+ async load(path, basePath) {
80
+ // Simple path resolution for memory loader
81
+ const resolvedPath = basePath && !path.startsWith('/')
82
+ ? `${basePath}/${path}`.replace(/\/+/g, '/')
83
+ : path;
84
+ const content = this.files.get(resolvedPath);
85
+ if (content === undefined) {
86
+ throw new Error(`File not found: ${resolvedPath}`);
87
+ }
88
+ return content;
89
+ }
90
+ }
91
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Template parser
3
+ * Converts template strings into AST (Abstract Syntax Tree)
4
+ */
5
+ import type { ParseResult } from './types.js';
6
+ /**
7
+ * Parse a template string into an AST
8
+ * @param template - Template string to parse
9
+ * @returns Parse result with AST and errors
10
+ */
11
+ export declare function parse(template: string): ParseResult;
12
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAW,WAAW,EAAc,MAAM,YAAY,CAAA;AAGlE;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CA0hBnD"}
package/dist/parser.js ADDED
@@ -0,0 +1,501 @@
1
+ /**
2
+ * Template parser
3
+ * Converts template strings into AST (Abstract Syntax Tree)
4
+ */
5
+ import { parseExpression } from './evaluator.js';
6
+ /**
7
+ * Parse a template string into an AST
8
+ * @param template - Template string to parse
9
+ * @returns Parse result with AST and errors
10
+ */
11
+ export function parse(template) {
12
+ const errors = [];
13
+ const ast = [];
14
+ let position = 0;
15
+ let line = 1;
16
+ let column = 1;
17
+ /**
18
+ * Create a parse error
19
+ */
20
+ function createError(message) {
21
+ return { message, position, line, column };
22
+ }
23
+ /**
24
+ * Advance position tracking
25
+ */
26
+ function advance(count) {
27
+ for (let i = 0; i < count; i++) {
28
+ if (template[position + i] === '\n') {
29
+ line++;
30
+ column = 1;
31
+ }
32
+ else {
33
+ column++;
34
+ }
35
+ }
36
+ position += count;
37
+ }
38
+ /**
39
+ * Find the next occurrence of a string
40
+ */
41
+ function findNext(str, from = position) {
42
+ return template.indexOf(str, from);
43
+ }
44
+ /**
45
+ * Extract text between current position and a target position
46
+ */
47
+ function extractTo(target) {
48
+ const text = template.substring(position, target);
49
+ advance(target - position);
50
+ return text;
51
+ }
52
+ while (position < template.length) {
53
+ // Look for template tags
54
+ const varStart = findNext('{{', position);
55
+ const tagStart = findNext('{%', position);
56
+ const commentStart = findNext('{#', position);
57
+ // Find the nearest tag
58
+ const candidates = [
59
+ { pos: varStart, type: 'var' },
60
+ { pos: tagStart, type: 'tag' },
61
+ { pos: commentStart, type: 'comment' },
62
+ ].filter((c) => c.pos !== -1);
63
+ if (candidates.length === 0) {
64
+ // No more tags, rest is text
65
+ const text = template.substring(position);
66
+ if (text) {
67
+ ast.push({ type: 'text', value: text });
68
+ }
69
+ break;
70
+ }
71
+ // Sort to find nearest
72
+ candidates.sort((a, b) => a.pos - b.pos);
73
+ const nearest = candidates[0];
74
+ // Add text before tag
75
+ if (nearest.pos > position) {
76
+ ast.push({ type: 'text', value: extractTo(nearest.pos) });
77
+ }
78
+ // Parse the tag
79
+ if (nearest.type === 'var') {
80
+ // Variable: {{ name }}
81
+ advance(2); // Skip {{
82
+ const endPos = findNext('}}', position);
83
+ if (endPos === -1) {
84
+ errors.push(createError('Unclosed variable tag'));
85
+ break;
86
+ }
87
+ const varName = extractTo(endPos).trim();
88
+ advance(2); // Skip }}
89
+ ast.push({ type: 'variable', name: varName });
90
+ }
91
+ else if (nearest.type === 'comment') {
92
+ // Comment: {# ... #}
93
+ // Auto-strip newlines for comments (they produce no output)
94
+ // Only strip if the comment is on its own line
95
+ if (ast.length > 0 && ast[ast.length - 1].type === 'text') {
96
+ const lastNode = ast[ast.length - 1];
97
+ // Only strip if previous text ends with newline (comment is on its own line)
98
+ if (/\n[ \t]*$/.test(lastNode.value)) {
99
+ lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t]*$/, '');
100
+ }
101
+ }
102
+ advance(2); // Skip {#
103
+ const endPos = findNext('#}', position);
104
+ if (endPos === -1) {
105
+ errors.push(createError('Unclosed comment tag'));
106
+ break;
107
+ }
108
+ const commentText = extractTo(endPos);
109
+ advance(2); // Skip #}
110
+ ast.push({ type: 'comment', value: commentText });
111
+ // Auto-strip following newline if comment is on its own line
112
+ if (position < template.length && template[position] === '\n') {
113
+ advance(1);
114
+ // Also skip any indentation on the next line
115
+ while (position < template.length && /[ \t]/.test(template[position])) {
116
+ advance(1);
117
+ }
118
+ }
119
+ }
120
+ else if (nearest.type === 'tag') {
121
+ // Statement tag: {% ... %}
122
+ advance(2); // Skip {%
123
+ const endPos = findNext('%}', position);
124
+ if (endPos === -1) {
125
+ errors.push(createError('Unclosed statement tag'));
126
+ break;
127
+ }
128
+ let statement = extractTo(endPos).trim();
129
+ // Check for whitespace control characters
130
+ const hasLeftStrip = statement.startsWith('-');
131
+ const hasRightStrip = statement.endsWith('-');
132
+ // Strip whitespace control characters from statement
133
+ if (hasLeftStrip) {
134
+ statement = statement.substring(1).trim();
135
+ // Strip trailing whitespace from previous text node
136
+ if (ast.length > 0 && ast[ast.length - 1].type === 'text') {
137
+ const lastNode = ast[ast.length - 1];
138
+ lastNode.value = lastNode.value.replace(/[ \t]*\n[ \t\n]*$/, '');
139
+ }
140
+ }
141
+ if (hasRightStrip) {
142
+ statement = statement.substring(0, statement.length - 1).trim();
143
+ }
144
+ advance(2); // Skip %}
145
+ // If right strip, consume following whitespace
146
+ if (hasRightStrip) {
147
+ while (position < template.length && /[ \t\n]/.test(template[position])) {
148
+ advance(1);
149
+ }
150
+ }
151
+ // Parse different statement types
152
+ if (statement.startsWith('set ')) {
153
+ // {% set var = value %}
154
+ const setMatch = /^set\s+(\w+)\s*=\s*(.+)$/.exec(statement);
155
+ if (setMatch) {
156
+ try {
157
+ const expr = parseExpression(setMatch[2]);
158
+ ast.push({
159
+ type: 'set',
160
+ name: setMatch[1],
161
+ value: expr,
162
+ });
163
+ }
164
+ catch (error) {
165
+ errors.push(createError(`Invalid set expression: ${error.message}`));
166
+ }
167
+ }
168
+ else {
169
+ errors.push(createError('Invalid set syntax'));
170
+ }
171
+ }
172
+ else if (statement.startsWith('if ')) {
173
+ // {% if condition %} ... {% elif %} ... {% else %} ... {% endif %}
174
+ const condition = statement.substring(3).trim();
175
+ try {
176
+ const expr = parseExpression(condition);
177
+ // Find the body and elif/else/endif blocks
178
+ const { trueBranch, elifBranches, elseBranch, parseErrors } = parseIfBlock();
179
+ errors.push(...parseErrors);
180
+ ast.push({
181
+ type: 'if',
182
+ condition: expr,
183
+ trueBranch,
184
+ elifBranches: elifBranches.length > 0 ? elifBranches : undefined,
185
+ elseBranch: elseBranch.length > 0 ? elseBranch : undefined,
186
+ });
187
+ }
188
+ catch (error) {
189
+ errors.push(createError(`Invalid if expression: ${error.message}`));
190
+ }
191
+ }
192
+ else if (statement.startsWith('include ')) {
193
+ // {% include "path" %}
194
+ const includeMatch = /^include\s+["']([^"']+)["']/.exec(statement);
195
+ if (includeMatch) {
196
+ ast.push({
197
+ type: 'include',
198
+ path: includeMatch[1],
199
+ });
200
+ }
201
+ else {
202
+ errors.push(createError('Invalid include syntax'));
203
+ }
204
+ }
205
+ else if (statement.startsWith('switch ')) {
206
+ // {% switch variable %} ... {% case "value" %} ... {% endswitch %}
207
+ const switchExpr = statement.substring(7).trim();
208
+ try {
209
+ const expr = parseExpression(switchExpr);
210
+ const { cases, parseErrors } = parseSwitchBlock();
211
+ errors.push(...parseErrors);
212
+ ast.push({
213
+ type: 'switch',
214
+ expression: expr,
215
+ cases,
216
+ });
217
+ }
218
+ catch (error) {
219
+ errors.push(createError(`Invalid switch expression: ${error.message}`));
220
+ }
221
+ }
222
+ else if (statement.startsWith('leveloffset ')) {
223
+ // {% leveloffset +1 %} or {% leveloffset 2 %} or {% leveloffset -1 %}
224
+ const offsetMatch = /^leveloffset\s+([-+]?\d+)$/.exec(statement);
225
+ if (!offsetMatch) {
226
+ errors.push(createError('Invalid leveloffset syntax'));
227
+ }
228
+ else {
229
+ const offsetStr = offsetMatch[1];
230
+ const isRelative = offsetStr.startsWith('+') || offsetStr.startsWith('-');
231
+ const offset = parseInt(offsetStr, 10);
232
+ if (isNaN(offset)) {
233
+ errors.push(createError('Invalid leveloffset value'));
234
+ }
235
+ else {
236
+ // Find matching endleveloffset accounting for nesting
237
+ let depth = 0;
238
+ let searchPos = position;
239
+ let endPos = -1;
240
+ while (searchPos < template.length) {
241
+ const leveloffsetMatch = /{%-?\s*leveloffset\s+[-+]?\d+\s*-?%}/.exec(template.substring(searchPos));
242
+ const endleveloffsetMatch = /{%-?\s*endleveloffset\s*-?%}/.exec(template.substring(searchPos));
243
+ const leveloffsetPos = leveloffsetMatch ? searchPos + leveloffsetMatch.index : Infinity;
244
+ const endleveloffsetPos = endleveloffsetMatch ? searchPos + endleveloffsetMatch.index : Infinity;
245
+ if (leveloffsetPos < endleveloffsetPos) {
246
+ // Found nested leveloffset
247
+ depth++;
248
+ searchPos = leveloffsetPos + (leveloffsetMatch?.[0].length || 0);
249
+ }
250
+ else if (endleveloffsetPos < Infinity) {
251
+ // Found endleveloffset
252
+ if (depth === 0) {
253
+ // This is our matching endleveloffset
254
+ endPos = endleveloffsetPos;
255
+ break;
256
+ }
257
+ else {
258
+ depth--;
259
+ searchPos = endleveloffsetPos + (endleveloffsetMatch?.[0].length || 0);
260
+ }
261
+ }
262
+ else {
263
+ // No more tags found
264
+ break;
265
+ }
266
+ }
267
+ if (endPos === -1) {
268
+ errors.push(createError('Missing endleveloffset'));
269
+ }
270
+ else {
271
+ const bodyTemplate = extractTo(endPos);
272
+ // Find and skip the endleveloffset tag
273
+ const endMatch = /{%-?\s*endleveloffset\s*-?%}/.exec(template.substring(position));
274
+ if (endMatch) {
275
+ advance(endMatch[0].length);
276
+ }
277
+ const bodyResult = parse(bodyTemplate);
278
+ errors.push(...bodyResult.errors);
279
+ ast.push({
280
+ type: 'leveloffset',
281
+ offset,
282
+ isRelative,
283
+ body: bodyResult.ast,
284
+ });
285
+ }
286
+ }
287
+ }
288
+ }
289
+ // Ignore endif, endswitch, case, endleveloffset, etc. - they're handled by their opening tags
290
+ }
291
+ }
292
+ return { ast, errors };
293
+ /**
294
+ * Find an end tag like {% endif %}
295
+ */
296
+ function findEndTag(tagName) {
297
+ const pattern = new RegExp(`{%\\s*${tagName}\\s*%}`);
298
+ const match = pattern.exec(template.substring(position));
299
+ if (match) {
300
+ return {
301
+ start: position + match.index,
302
+ length: match[0].length,
303
+ };
304
+ }
305
+ return null;
306
+ }
307
+ /**
308
+ * Parse an if block with elif and else support
309
+ */
310
+ function parseIfBlock() {
311
+ const elifBranches = [];
312
+ const parseErrors = [];
313
+ let elseBranch = [];
314
+ // Find the next elif, else, or endif
315
+ let depth = 0;
316
+ let searchPos = position;
317
+ while (searchPos < template.length) {
318
+ const ifMatch = /{%-?\s*if\s+/.exec(template.substring(searchPos));
319
+ const elifMatch = /{%-?\s*elif\s+/.exec(template.substring(searchPos));
320
+ const elseMatch = /{%-?\s*else\s*-?%}/.exec(template.substring(searchPos));
321
+ const endifMatch = /{%-?\s*endif\s*-?%}/.exec(template.substring(searchPos));
322
+ // Find the nearest match
323
+ const matches = [
324
+ { type: 'if', match: ifMatch, pos: ifMatch ? searchPos + ifMatch.index : Infinity },
325
+ { type: 'elif', match: elifMatch, pos: elifMatch ? searchPos + elifMatch.index : Infinity },
326
+ { type: 'else', match: elseMatch, pos: elseMatch ? searchPos + elseMatch.index : Infinity },
327
+ { type: 'endif', match: endifMatch, pos: endifMatch ? searchPos + endifMatch.index : Infinity },
328
+ ].sort((a, b) => a.pos - b.pos);
329
+ const nearest = matches[0];
330
+ if (!nearest.match || nearest.pos === Infinity) {
331
+ parseErrors.push(createError('Missing endif'));
332
+ break;
333
+ }
334
+ if (nearest.type === 'if') {
335
+ depth++;
336
+ searchPos = nearest.pos + nearest.match[0].length;
337
+ }
338
+ else if (nearest.type === 'endif') {
339
+ if (depth === 0) {
340
+ // This is our endif
341
+ const bodyTemplate = extractTo(nearest.pos);
342
+ advance(nearest.match[0].length);
343
+ const bodyResult = parse(bodyTemplate);
344
+ parseErrors.push(...bodyResult.errors);
345
+ return {
346
+ trueBranch: bodyResult.ast,
347
+ elifBranches,
348
+ elseBranch,
349
+ parseErrors,
350
+ };
351
+ }
352
+ else {
353
+ depth--;
354
+ searchPos = nearest.pos + nearest.match[0].length;
355
+ }
356
+ }
357
+ else if (depth === 0 && (nearest.type === 'elif' || nearest.type === 'else')) {
358
+ // Parse the body before elif/else
359
+ const bodyTemplate = extractTo(nearest.pos);
360
+ const bodyResult = parse(bodyTemplate);
361
+ if (elifBranches.length === 0 && elseBranch.length === 0) {
362
+ // This is the trueBranch (before first elif/else)
363
+ parseErrors.push(...bodyResult.errors);
364
+ const trueBranch = bodyResult.ast;
365
+ // Now handle elif or else
366
+ if (nearest.type === 'elif') {
367
+ // Extract elif condition
368
+ advance(nearest.match[0].length);
369
+ const condMatch = /^([^%]+)%}/.exec(template.substring(position));
370
+ if (condMatch) {
371
+ const condStr = condMatch[1].trim();
372
+ advance(condMatch[0].length);
373
+ try {
374
+ const elifCondition = parseExpression(condStr);
375
+ const elifResult = parseIfBlock();
376
+ parseErrors.push(...elifResult.parseErrors);
377
+ elifBranches.push({
378
+ condition: elifCondition,
379
+ body: elifResult.trueBranch,
380
+ });
381
+ elifBranches.push(...(elifResult.elifBranches || []));
382
+ elseBranch = elifResult.elseBranch;
383
+ return {
384
+ trueBranch,
385
+ elifBranches,
386
+ elseBranch,
387
+ parseErrors,
388
+ };
389
+ }
390
+ catch (error) {
391
+ parseErrors.push(createError(`Invalid elif expression: ${error.message}`));
392
+ }
393
+ }
394
+ }
395
+ else {
396
+ // else
397
+ advance(nearest.match[0].length);
398
+ // Find endif for else block
399
+ const endifMatch = findEndTag('endif');
400
+ if (!endifMatch) {
401
+ parseErrors.push(createError('Missing endif after else'));
402
+ }
403
+ else {
404
+ const elseBodyTemplate = extractTo(endifMatch.start);
405
+ advance(endifMatch.length);
406
+ const elseBodyResult = parse(elseBodyTemplate);
407
+ parseErrors.push(...elseBodyResult.errors);
408
+ elseBranch = elseBodyResult.ast;
409
+ }
410
+ return {
411
+ trueBranch,
412
+ elifBranches,
413
+ elseBranch,
414
+ parseErrors,
415
+ };
416
+ }
417
+ }
418
+ }
419
+ else {
420
+ searchPos = nearest.pos + nearest.match[0].length;
421
+ }
422
+ }
423
+ return {
424
+ trueBranch: [],
425
+ elifBranches,
426
+ elseBranch,
427
+ parseErrors,
428
+ };
429
+ }
430
+ /**
431
+ * Parse a switch block with case support
432
+ */
433
+ function parseSwitchBlock() {
434
+ const cases = [];
435
+ const parseErrors = [];
436
+ while (position < template.length) {
437
+ // Find the next case or endswitch
438
+ const caseMatch = /{%-?\s*case\s+/.exec(template.substring(position));
439
+ const endswitchMatch = /{%-?\s*endswitch\s*-?%}/.exec(template.substring(position));
440
+ // Find which comes first
441
+ const casePos = caseMatch ? position + caseMatch.index : Infinity;
442
+ const endswitchPos = endswitchMatch ? position + endswitchMatch.index : Infinity;
443
+ if (endswitchPos < casePos) {
444
+ // Found endswitch before any case (or no case)
445
+ // Parse any remaining content before endswitch as the last case body
446
+ if (cases.length > 0 && position < endswitchPos) {
447
+ const bodyTemplate = extractTo(endswitchPos);
448
+ const bodyResult = parse(bodyTemplate);
449
+ parseErrors.push(...bodyResult.errors);
450
+ cases[cases.length - 1].body = bodyResult.ast;
451
+ }
452
+ // Skip endswitch
453
+ advance(endswitchPos - position + (endswitchMatch?.[0].length || 0));
454
+ break;
455
+ }
456
+ else if (casePos < Infinity) {
457
+ // Found a case
458
+ // If there's a previous case, parse its body
459
+ if (cases.length > 0 && position < casePos) {
460
+ const bodyTemplate = extractTo(casePos);
461
+ const bodyResult = parse(bodyTemplate);
462
+ parseErrors.push(...bodyResult.errors);
463
+ cases[cases.length - 1].body = bodyResult.ast;
464
+ }
465
+ else if (position < casePos) {
466
+ // Content before first case - skip it
467
+ extractTo(casePos);
468
+ }
469
+ // Parse the case value
470
+ advance(caseMatch[0].length);
471
+ // Extract the case value (until %})
472
+ const valueMatch = /([^%]+)%}/.exec(template.substring(position));
473
+ if (valueMatch) {
474
+ const valueStr = valueMatch[1].trim();
475
+ advance(valueMatch[0].length);
476
+ try {
477
+ const caseValue = parseExpression(valueStr);
478
+ cases.push({
479
+ value: caseValue,
480
+ body: [], // Will be filled in next iteration or at endswitch
481
+ });
482
+ }
483
+ catch (error) {
484
+ parseErrors.push(createError(`Invalid case value: ${error.message}`));
485
+ }
486
+ }
487
+ else {
488
+ parseErrors.push(createError('Invalid case syntax'));
489
+ break;
490
+ }
491
+ }
492
+ else {
493
+ // No case or endswitch found
494
+ parseErrors.push(createError('Missing endswitch'));
495
+ break;
496
+ }
497
+ }
498
+ return { cases, parseErrors };
499
+ }
500
+ }
501
+ //# 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;AA+D5E;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoC3F"}