@goreal-ai/echo-pdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/ai-judge/index.d.ts +177 -0
  2. package/dist/ai-judge/index.d.ts.map +1 -0
  3. package/dist/ai-judge/index.js +299 -0
  4. package/dist/ai-judge/index.js.map +1 -0
  5. package/dist/evaluator/evaluator.d.ts +136 -0
  6. package/dist/evaluator/evaluator.d.ts.map +1 -0
  7. package/dist/evaluator/evaluator.js +407 -0
  8. package/dist/evaluator/evaluator.js.map +1 -0
  9. package/dist/evaluator/index.d.ts +7 -0
  10. package/dist/evaluator/index.d.ts.map +1 -0
  11. package/dist/evaluator/index.js +8 -0
  12. package/dist/evaluator/index.js.map +1 -0
  13. package/dist/evaluator/operators.d.ts +105 -0
  14. package/dist/evaluator/operators.d.ts.map +1 -0
  15. package/dist/evaluator/operators.js +371 -0
  16. package/dist/evaluator/operators.js.map +1 -0
  17. package/dist/index.d.ts +115 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +388 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/parser/ast.d.ts +106 -0
  22. package/dist/parser/ast.d.ts.map +1 -0
  23. package/dist/parser/ast.js +260 -0
  24. package/dist/parser/ast.js.map +1 -0
  25. package/dist/parser/index.d.ts +8 -0
  26. package/dist/parser/index.d.ts.map +1 -0
  27. package/dist/parser/index.js +13 -0
  28. package/dist/parser/index.js.map +1 -0
  29. package/dist/parser/lexer.d.ts +199 -0
  30. package/dist/parser/lexer.d.ts.map +1 -0
  31. package/dist/parser/lexer.js +491 -0
  32. package/dist/parser/lexer.js.map +1 -0
  33. package/dist/parser/parser.d.ts +49 -0
  34. package/dist/parser/parser.d.ts.map +1 -0
  35. package/dist/parser/parser.js +615 -0
  36. package/dist/parser/parser.js.map +1 -0
  37. package/dist/plugins/index.d.ts +62 -0
  38. package/dist/plugins/index.d.ts.map +1 -0
  39. package/dist/plugins/index.js +170 -0
  40. package/dist/plugins/index.js.map +1 -0
  41. package/dist/renderer/index.d.ts +6 -0
  42. package/dist/renderer/index.d.ts.map +1 -0
  43. package/dist/renderer/index.js +5 -0
  44. package/dist/renderer/index.js.map +1 -0
  45. package/dist/renderer/renderer.d.ts +97 -0
  46. package/dist/renderer/renderer.d.ts.map +1 -0
  47. package/dist/renderer/renderer.js +243 -0
  48. package/dist/renderer/renderer.js.map +1 -0
  49. package/dist/types.d.ts +255 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +9 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +54 -0
@@ -0,0 +1,615 @@
1
+ /**
2
+ * @fileoverview Echo DSL Parser - AST Generation
3
+ *
4
+ * This file implements the parser for Echo DSL using Chevrotain.
5
+ * The parser converts a token stream into an Abstract Syntax Tree (AST).
6
+ *
7
+ * GRAMMAR (pseudo-BNF):
8
+ *
9
+ * template := (node)*
10
+ * node := text | variable | conditional | section | import | include
11
+ * text := TEXT
12
+ * variable := "{{" identifier ("??" defaultValue)? "}}"
13
+ * conditional := ifBlock (elseIfBlock)* (elseBlock)? endIf
14
+ * ifBlock := "[#IF" condition "]" (node)*
15
+ * elseIfBlock := "[ELSE IF" condition "]" (node)*
16
+ * elseBlock := "[ELSE]" (node)*
17
+ * endIf := "[END IF]"
18
+ * condition := "{{" identifier "}}" operator
19
+ * operator := "#" IDENTIFIER ("(" arguments ")")?
20
+ * arguments := value ("," value)*
21
+ * value := STRING | NUMBER | IDENTIFIER
22
+ * section := "[#SECTION" "name" "=" STRING "]" (node)* "[END SECTION]"
23
+ * import := "[#IMPORT" (STRING | path) "]"
24
+ * include := "[#INCLUDE" IDENTIFIER "]"
25
+ */
26
+ import { CstParser } from 'chevrotain';
27
+ import { allTokens, tokenize, formatLexerErrors, Text, VariableOpen, VariableClose, IfOpen, ElseIf, Else, EndIf, SectionOpen, EndSection, Import, Include, Operator, Identifier, StringLiteral, NumberLiteral, LParen, RParen, CloseBracket, DefaultOp, Equals, OperatorArgText, } from './lexer.js';
28
+ import { createTextNode, createVariableNode, createConditionalNode, createConditionExpr, createSectionNode, createImportNode, createIncludeNode, } from './ast.js';
29
+ // =============================================================================
30
+ // PARSER CLASS
31
+ // =============================================================================
32
+ /**
33
+ * Echo CST Parser
34
+ *
35
+ * Parses Echo template tokens into a Concrete Syntax Tree (CST).
36
+ * The CST is then transformed into our AST format using the visitor.
37
+ */
38
+ class EchoParser extends CstParser {
39
+ constructor() {
40
+ super(allTokens, {
41
+ recoveryEnabled: true,
42
+ nodeLocationTracking: 'full',
43
+ });
44
+ this.performSelfAnalysis();
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // GRAMMAR RULES
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Top-level rule: a template is a sequence of nodes
51
+ */
52
+ template = this.RULE('template', () => {
53
+ this.MANY(() => {
54
+ this.SUBRULE(this.node);
55
+ });
56
+ });
57
+ /**
58
+ * A node can be text, variable, conditional, section, import, or include
59
+ */
60
+ node = this.RULE('node', () => {
61
+ this.OR([
62
+ { ALT: () => this.SUBRULE(this.textNode) },
63
+ { ALT: () => this.SUBRULE(this.variableNode) },
64
+ { ALT: () => this.SUBRULE(this.conditionalNode) },
65
+ { ALT: () => this.SUBRULE(this.sectionNode) },
66
+ { ALT: () => this.SUBRULE(this.importNode) },
67
+ { ALT: () => this.SUBRULE(this.includeNode) },
68
+ ]);
69
+ });
70
+ /**
71
+ * Plain text node
72
+ */
73
+ textNode = this.RULE('textNode', () => {
74
+ this.CONSUME(Text);
75
+ });
76
+ /**
77
+ * Variable reference: {{path}} or {{path ?? "default"}}
78
+ */
79
+ variableNode = this.RULE('variableNode', () => {
80
+ this.CONSUME(VariableOpen);
81
+ this.CONSUME(Identifier);
82
+ this.OPTION(() => {
83
+ this.CONSUME(DefaultOp);
84
+ this.OR([
85
+ { ALT: () => this.CONSUME(StringLiteral) },
86
+ { ALT: () => this.CONSUME(NumberLiteral) },
87
+ ]);
88
+ });
89
+ this.CONSUME(VariableClose);
90
+ });
91
+ /**
92
+ * Conditional block: [#IF condition]...[ELSE IF]...[ELSE]...[END IF]
93
+ */
94
+ conditionalNode = this.RULE('conditionalNode', () => {
95
+ // [#IF condition]
96
+ this.CONSUME(IfOpen);
97
+ this.SUBRULE(this.condition);
98
+ this.CONSUME(CloseBracket);
99
+ // Body nodes
100
+ this.MANY(() => {
101
+ this.SUBRULE(this.node);
102
+ });
103
+ // Optional ELSE IF blocks
104
+ this.MANY2(() => {
105
+ this.SUBRULE(this.elseIfBlock);
106
+ });
107
+ // Optional ELSE block
108
+ this.OPTION(() => {
109
+ this.SUBRULE(this.elseBlock);
110
+ });
111
+ // [END IF]
112
+ this.CONSUME(EndIf);
113
+ });
114
+ /**
115
+ * ELSE IF block
116
+ */
117
+ elseIfBlock = this.RULE('elseIfBlock', () => {
118
+ this.CONSUME(ElseIf);
119
+ this.SUBRULE(this.condition);
120
+ this.CONSUME(CloseBracket);
121
+ this.MANY(() => {
122
+ this.SUBRULE(this.node);
123
+ });
124
+ });
125
+ /**
126
+ * ELSE block
127
+ */
128
+ elseBlock = this.RULE('elseBlock', () => {
129
+ this.CONSUME(Else);
130
+ this.MANY(() => {
131
+ this.SUBRULE(this.node);
132
+ });
133
+ });
134
+ /**
135
+ * Condition expression: {{var}} #operator(arg)
136
+ */
137
+ condition = this.RULE('condition', () => {
138
+ // Variable being tested
139
+ this.CONSUME(VariableOpen);
140
+ this.CONSUME(Identifier);
141
+ this.CONSUME(VariableClose);
142
+ // Operator
143
+ this.CONSUME(Operator);
144
+ // Optional arguments - free-form text
145
+ this.OPTION(() => {
146
+ this.CONSUME(LParen);
147
+ this.OPTION2(() => {
148
+ this.CONSUME(OperatorArgText);
149
+ });
150
+ this.CONSUME(RParen);
151
+ });
152
+ });
153
+ /**
154
+ * Section definition: [#SECTION name="..."]...[END SECTION]
155
+ */
156
+ sectionNode = this.RULE('sectionNode', () => {
157
+ this.CONSUME(SectionOpen);
158
+ this.CONSUME(Identifier); // "name"
159
+ this.CONSUME(Equals);
160
+ this.CONSUME(StringLiteral); // "value"
161
+ this.CONSUME(CloseBracket);
162
+ this.MANY(() => {
163
+ this.SUBRULE(this.node);
164
+ });
165
+ this.CONSUME(EndSection);
166
+ });
167
+ /**
168
+ * Import directive: [#IMPORT path]
169
+ */
170
+ importNode = this.RULE('importNode', () => {
171
+ this.CONSUME(Import);
172
+ this.OR([
173
+ { ALT: () => this.CONSUME(StringLiteral) },
174
+ { ALT: () => this.CONSUME(Identifier) },
175
+ ]);
176
+ this.CONSUME(CloseBracket);
177
+ });
178
+ /**
179
+ * Include directive: [#INCLUDE name]
180
+ */
181
+ includeNode = this.RULE('includeNode', () => {
182
+ this.CONSUME(Include);
183
+ this.CONSUME(Identifier);
184
+ this.CONSUME(CloseBracket);
185
+ });
186
+ }
187
+ // =============================================================================
188
+ // PARSER INSTANCE
189
+ // =============================================================================
190
+ const parserInstance = new EchoParser();
191
+ // =============================================================================
192
+ // CST TO AST VISITOR
193
+ // =============================================================================
194
+ /**
195
+ * Get the base CST visitor class from our parser instance.
196
+ */
197
+ const BaseCstVisitor = parserInstance.getBaseCstVisitorConstructor();
198
+ /**
199
+ * Default source location for fallback.
200
+ */
201
+ const defaultLocation = {
202
+ startLine: 1,
203
+ startColumn: 1,
204
+ endLine: 1,
205
+ endColumn: 1,
206
+ };
207
+ /**
208
+ * CST Visitor that transforms the Concrete Syntax Tree into our AST.
209
+ */
210
+ class EchoAstVisitor extends BaseCstVisitor {
211
+ constructor() {
212
+ super();
213
+ this.validateVisitor();
214
+ }
215
+ /**
216
+ * Visit the root template rule.
217
+ */
218
+ template(ctx) {
219
+ const nodes = [];
220
+ if (ctx.node) {
221
+ for (const nodeCtx of ctx.node) {
222
+ const node = this.visit(nodeCtx);
223
+ if (node) {
224
+ nodes.push(node);
225
+ }
226
+ }
227
+ }
228
+ return nodes;
229
+ }
230
+ /**
231
+ * Visit a node (dispatches to specific node type).
232
+ */
233
+ node(ctx) {
234
+ if (ctx.textNode?.[0]) {
235
+ return this.visit(ctx.textNode[0]);
236
+ }
237
+ if (ctx.variableNode?.[0]) {
238
+ return this.visit(ctx.variableNode[0]);
239
+ }
240
+ if (ctx.conditionalNode?.[0]) {
241
+ return this.visit(ctx.conditionalNode[0]);
242
+ }
243
+ if (ctx.sectionNode?.[0]) {
244
+ return this.visit(ctx.sectionNode[0]);
245
+ }
246
+ if (ctx.importNode?.[0]) {
247
+ return this.visit(ctx.importNode[0]);
248
+ }
249
+ if (ctx.includeNode?.[0]) {
250
+ return this.visit(ctx.includeNode[0]);
251
+ }
252
+ return undefined;
253
+ }
254
+ /**
255
+ * Visit a text node.
256
+ */
257
+ textNode(ctx) {
258
+ const token = ctx.Text?.[0];
259
+ if (!token) {
260
+ return createTextNode('', defaultLocation);
261
+ }
262
+ return createTextNode(token.image, getTokenLocation(token));
263
+ }
264
+ /**
265
+ * Visit a variable node.
266
+ */
267
+ variableNode(ctx) {
268
+ const openToken = ctx.VariableOpen?.[0];
269
+ const closeToken = ctx.VariableClose?.[0];
270
+ const identifierToken = ctx.Identifier?.[0];
271
+ if (!identifierToken) {
272
+ return createVariableNode('', defaultLocation);
273
+ }
274
+ const path = identifierToken.image;
275
+ let defaultValue;
276
+ if (ctx.DefaultOp && (ctx.StringLiteral || ctx.NumberLiteral)) {
277
+ const valueToken = ctx.StringLiteral?.[0] ?? ctx.NumberLiteral?.[0];
278
+ if (valueToken) {
279
+ defaultValue = stripQuotes(valueToken.image);
280
+ }
281
+ }
282
+ const location = openToken && closeToken
283
+ ? mergeLocations(getTokenLocation(openToken), getTokenLocation(closeToken))
284
+ : getTokenLocation(identifierToken);
285
+ return createVariableNode(path, location, defaultValue);
286
+ }
287
+ /**
288
+ * Visit a conditional node.
289
+ */
290
+ conditionalNode(ctx) {
291
+ const ifOpenToken = ctx.IfOpen?.[0];
292
+ const endIfToken = ctx.EndIf?.[0];
293
+ // Parse the main condition
294
+ const conditionCtx = ctx.condition?.[0];
295
+ const condition = conditionCtx
296
+ ? this.visit(conditionCtx)
297
+ : createConditionExpr('', 'exists');
298
+ // Parse body nodes
299
+ const consequent = [];
300
+ if (ctx.node) {
301
+ for (const nodeCtx of ctx.node) {
302
+ const node = this.visit(nodeCtx);
303
+ if (node) {
304
+ consequent.push(node);
305
+ }
306
+ }
307
+ }
308
+ // Build the alternate chain (ELSE IF and ELSE blocks)
309
+ let alternate;
310
+ // Handle ELSE block (process first as it's the end of the chain)
311
+ if (ctx.elseBlock?.[0]) {
312
+ const elseNodes = this.visit(ctx.elseBlock[0]);
313
+ alternate = elseNodes;
314
+ }
315
+ // Handle ELSE IF blocks (in reverse order to build the chain)
316
+ if (ctx.elseIfBlock) {
317
+ for (let i = ctx.elseIfBlock.length - 1; i >= 0; i--) {
318
+ const elseIfCtx = ctx.elseIfBlock[i];
319
+ if (elseIfCtx) {
320
+ const elseIfResult = this.visitElseIfBlockWithAlternate(elseIfCtx, alternate);
321
+ alternate = elseIfResult;
322
+ }
323
+ }
324
+ }
325
+ const location = ifOpenToken && endIfToken
326
+ ? mergeLocations(getTokenLocation(ifOpenToken), getTokenLocation(endIfToken))
327
+ : defaultLocation;
328
+ return createConditionalNode(condition, consequent, location, alternate);
329
+ }
330
+ /**
331
+ * Visit an ELSE IF block and create a ConditionalNode with alternate.
332
+ *
333
+ * This method handles the CstNode structure from Chevrotain, using runtime
334
+ * validation to safely access the children property.
335
+ */
336
+ visitElseIfBlockWithAlternate(ctx, nextAlternate) {
337
+ // Safely extract children with runtime validation
338
+ const children = getCstChildren(ctx, 'elseIfBlock');
339
+ const elseIfToken = children.ElseIf?.[0];
340
+ const closeBracketToken = children.CloseBracket?.[0];
341
+ const conditionCtx = children.condition?.[0];
342
+ const condition = conditionCtx
343
+ ? this.visit(conditionCtx)
344
+ : createConditionExpr('', 'exists');
345
+ const consequent = [];
346
+ if (children.node) {
347
+ for (const nodeCtx of children.node) {
348
+ const node = this.visit(nodeCtx);
349
+ if (node) {
350
+ consequent.push(node);
351
+ }
352
+ }
353
+ }
354
+ const location = elseIfToken && closeBracketToken
355
+ ? mergeLocations(getTokenLocation(elseIfToken), getTokenLocation(closeBracketToken))
356
+ : defaultLocation;
357
+ return createConditionalNode(condition, consequent, location, nextAlternate);
358
+ }
359
+ /**
360
+ * Visit an ELSE IF block.
361
+ *
362
+ * NOTE: This method exists to satisfy Chevrotain's visitor validation but should
363
+ * never be called directly. ELSE IF blocks are only meaningful within the context
364
+ * of a conditional chain, where they need the `nextAlternate` parameter.
365
+ *
366
+ * Use `visitElseIfBlockWithAlternate` instead, which is called from `conditionalNode`
367
+ * to properly build the ELSE IF chain with alternates.
368
+ *
369
+ * @throws Error always - this method should not be called directly
370
+ */
371
+ elseIfBlock(_ctx) {
372
+ throw new Error('elseIfBlock visitor should not be called directly. ' +
373
+ 'ELSE IF blocks are processed via visitElseIfBlockWithAlternate from conditionalNode.');
374
+ }
375
+ /**
376
+ * Visit an ELSE block.
377
+ */
378
+ elseBlock(ctx) {
379
+ const nodes = [];
380
+ if (ctx.node) {
381
+ for (const nodeCtx of ctx.node) {
382
+ const node = this.visit(nodeCtx);
383
+ if (node) {
384
+ nodes.push(node);
385
+ }
386
+ }
387
+ }
388
+ return nodes;
389
+ }
390
+ /**
391
+ * Visit a condition expression.
392
+ */
393
+ condition(ctx) {
394
+ const identifierToken = ctx.Identifier?.[0];
395
+ const operatorToken = ctx.Operator?.[0];
396
+ const variable = identifierToken?.image ?? '';
397
+ const operator = (operatorToken?.image ?? '#exists').replace(/^#/, '');
398
+ let argument;
399
+ // Get the free-form argument text
400
+ const argTextToken = ctx.OperatorArgText?.[0];
401
+ if (argTextToken) {
402
+ let argText = argTextToken.image.trim();
403
+ // Strip surrounding quotes if present (backwards compatibility)
404
+ argText = stripQuotes(argText);
405
+ // Check if it looks like a number
406
+ const num = parseFloat(argText);
407
+ if (!isNaN(num) && String(num) === argText) {
408
+ argument = num;
409
+ }
410
+ // Check if it contains commas (for list operators like #one_of)
411
+ else if (argText.includes(',')) {
412
+ argument = argText.split(',').map(s => stripQuotes(s.trim()));
413
+ }
414
+ // Otherwise treat as plain text
415
+ else {
416
+ argument = argText;
417
+ }
418
+ }
419
+ return createConditionExpr(variable, operator, argument);
420
+ }
421
+ /**
422
+ * Visit a section node.
423
+ */
424
+ sectionNode(ctx) {
425
+ const sectionOpenToken = ctx.SectionOpen?.[0];
426
+ const endSectionToken = ctx.EndSection?.[0];
427
+ const nameToken = ctx.StringLiteral?.[0];
428
+ const name = nameToken ? stripQuotes(nameToken.image) : '';
429
+ const body = [];
430
+ if (ctx.node) {
431
+ for (const nodeCtx of ctx.node) {
432
+ const node = this.visit(nodeCtx);
433
+ if (node) {
434
+ body.push(node);
435
+ }
436
+ }
437
+ }
438
+ const location = sectionOpenToken && endSectionToken
439
+ ? mergeLocations(getTokenLocation(sectionOpenToken), getTokenLocation(endSectionToken))
440
+ : defaultLocation;
441
+ return createSectionNode(name, body, location);
442
+ }
443
+ /**
444
+ * Visit an import node.
445
+ */
446
+ importNode(ctx) {
447
+ const importToken = ctx.Import?.[0];
448
+ const closeBracketToken = ctx.CloseBracket?.[0];
449
+ let path;
450
+ if (ctx.StringLiteral?.[0]) {
451
+ path = stripQuotes(ctx.StringLiteral[0].image);
452
+ }
453
+ else if (ctx.Identifier?.[0]) {
454
+ path = ctx.Identifier[0].image;
455
+ }
456
+ else {
457
+ path = '';
458
+ }
459
+ const location = importToken && closeBracketToken
460
+ ? mergeLocations(getTokenLocation(importToken), getTokenLocation(closeBracketToken))
461
+ : defaultLocation;
462
+ return createImportNode(path, location);
463
+ }
464
+ /**
465
+ * Visit an include node.
466
+ */
467
+ includeNode(ctx) {
468
+ const includeToken = ctx.Include?.[0];
469
+ const closeBracketToken = ctx.CloseBracket?.[0];
470
+ const identifierToken = ctx.Identifier?.[0];
471
+ const name = identifierToken?.image ?? '';
472
+ const location = includeToken && closeBracketToken
473
+ ? mergeLocations(getTokenLocation(includeToken), getTokenLocation(closeBracketToken))
474
+ : defaultLocation;
475
+ return createIncludeNode(name, location);
476
+ }
477
+ }
478
+ // Create singleton visitor instance
479
+ const astVisitor = new EchoAstVisitor();
480
+ // =============================================================================
481
+ // UTILITY FUNCTIONS
482
+ // =============================================================================
483
+ /**
484
+ * Safely extract children from a CstNode with runtime validation.
485
+ *
486
+ * Chevrotain's CstNode has a `children` property containing the parsed elements.
487
+ * This helper provides type-safe access with runtime validation to guard against
488
+ * unexpected structure changes.
489
+ *
490
+ * @param ctx - The CstNode to extract children from
491
+ * @param expectedRule - Optional rule name to validate (for better error messages)
492
+ * @returns The children object, typed as T
493
+ * @throws Error if children property is missing or invalid
494
+ */
495
+ function getCstChildren(ctx, expectedRule) {
496
+ if (!ctx || typeof ctx !== 'object') {
497
+ throw new Error(`Invalid CST node${expectedRule ? ` for rule "${expectedRule}"` : ''}: expected object, got ${typeof ctx}`);
498
+ }
499
+ if (!('children' in ctx)) {
500
+ throw new Error(`Invalid CST node${expectedRule ? ` for rule "${expectedRule}"` : ''}: missing "children" property`);
501
+ }
502
+ const children = ctx.children;
503
+ if (!children || typeof children !== 'object') {
504
+ throw new Error(`Invalid CST node${expectedRule ? ` for rule "${expectedRule}"` : ''}: "children" must be an object`);
505
+ }
506
+ return children;
507
+ }
508
+ /**
509
+ * Extract source location from a token.
510
+ */
511
+ export function getTokenLocation(token) {
512
+ return {
513
+ startLine: token.startLine ?? 1,
514
+ startColumn: token.startColumn ?? 1,
515
+ endLine: token.endLine ?? 1,
516
+ endColumn: token.endColumn ?? 1,
517
+ source: token.image,
518
+ };
519
+ }
520
+ /**
521
+ * Merge two source locations into one spanning both.
522
+ */
523
+ function mergeLocations(start, end) {
524
+ return {
525
+ startLine: start.startLine,
526
+ startColumn: start.startColumn,
527
+ endLine: end.endLine,
528
+ endColumn: end.endColumn,
529
+ };
530
+ }
531
+ /**
532
+ * Strip quotes from a string literal token.
533
+ */
534
+ function stripQuotes(str) {
535
+ if ((str.startsWith('"') && str.endsWith('"')) ||
536
+ (str.startsWith("'") && str.endsWith("'"))) {
537
+ return str.slice(1, -1);
538
+ }
539
+ return str;
540
+ }
541
+ /**
542
+ * Format parser errors for display.
543
+ */
544
+ function formatParserErrors(errors) {
545
+ return errors.map((error) => {
546
+ const token = error.token;
547
+ return {
548
+ code: 'PARSE_ERROR',
549
+ message: error.message,
550
+ location: token ? getTokenLocation(token) : undefined,
551
+ };
552
+ });
553
+ }
554
+ // =============================================================================
555
+ // PUBLIC API
556
+ // =============================================================================
557
+ /**
558
+ * Parse an Echo template into an AST.
559
+ *
560
+ * @param template - The Echo template string
561
+ * @returns ParseResult with AST or errors
562
+ *
563
+ * @example
564
+ * ```typescript
565
+ * const result = parse('Hello {{name}}!');
566
+ * if (result.success) {
567
+ * console.log('AST:', result.ast);
568
+ * } else {
569
+ * console.error('Errors:', result.errors);
570
+ * }
571
+ * ```
572
+ */
573
+ export function parse(template) {
574
+ // Step 1: Tokenize the input
575
+ const lexResult = tokenize(template);
576
+ if (lexResult.errors.length > 0) {
577
+ return {
578
+ success: false,
579
+ errors: formatLexerErrors(lexResult.errors).map((msg) => ({
580
+ code: 'LEXER_ERROR',
581
+ message: msg,
582
+ })),
583
+ };
584
+ }
585
+ // Step 2: Parse tokens to CST
586
+ parserInstance.input = lexResult.tokens;
587
+ const cst = parserInstance.template();
588
+ if (parserInstance.errors.length > 0) {
589
+ return {
590
+ success: false,
591
+ errors: formatParserErrors(parserInstance.errors),
592
+ };
593
+ }
594
+ // Step 3: Transform CST to AST
595
+ try {
596
+ const ast = astVisitor.visit(cst);
597
+ return {
598
+ success: true,
599
+ ast,
600
+ errors: [],
601
+ };
602
+ }
603
+ catch (error) {
604
+ return {
605
+ success: false,
606
+ errors: [
607
+ {
608
+ code: 'AST_ERROR',
609
+ message: error instanceof Error ? error.message : 'Unknown AST transformation error',
610
+ },
611
+ ],
612
+ };
613
+ }
614
+ }
615
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"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"}