@duckcodeailabs/dql-core 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 (74) hide show
  1. package/LICENSE +123 -0
  2. package/dist/ast/index.d.ts +4 -0
  3. package/dist/ast/index.d.ts.map +1 -0
  4. package/dist/ast/index.js +4 -0
  5. package/dist/ast/index.js.map +1 -0
  6. package/dist/ast/nodes.d.ts +205 -0
  7. package/dist/ast/nodes.d.ts.map +1 -0
  8. package/dist/ast/nodes.js +33 -0
  9. package/dist/ast/nodes.js.map +1 -0
  10. package/dist/ast/printer.d.ts +3 -0
  11. package/dist/ast/printer.d.ts.map +1 -0
  12. package/dist/ast/printer.js +157 -0
  13. package/dist/ast/printer.js.map +1 -0
  14. package/dist/ast/visitor.d.ts +45 -0
  15. package/dist/ast/visitor.d.ts.map +1 -0
  16. package/dist/ast/visitor.js +155 -0
  17. package/dist/ast/visitor.js.map +1 -0
  18. package/dist/errors/diagnostic.d.ts +23 -0
  19. package/dist/errors/diagnostic.d.ts.map +1 -0
  20. package/dist/errors/diagnostic.js +13 -0
  21. package/dist/errors/diagnostic.js.map +1 -0
  22. package/dist/errors/index.d.ts +3 -0
  23. package/dist/errors/index.d.ts.map +1 -0
  24. package/dist/errors/index.js +3 -0
  25. package/dist/errors/index.js.map +1 -0
  26. package/dist/errors/reporter.d.ts +22 -0
  27. package/dist/errors/reporter.d.ts.map +1 -0
  28. package/dist/errors/reporter.js +64 -0
  29. package/dist/errors/reporter.js.map +1 -0
  30. package/dist/formatter/formatter.d.ts +8 -0
  31. package/dist/formatter/formatter.d.ts.map +1 -0
  32. package/dist/formatter/formatter.js +243 -0
  33. package/dist/formatter/formatter.js.map +1 -0
  34. package/dist/formatter/index.d.ts +2 -0
  35. package/dist/formatter/index.d.ts.map +1 -0
  36. package/dist/formatter/index.js +2 -0
  37. package/dist/formatter/index.js.map +1 -0
  38. package/dist/index.d.ts +7 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +9 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lexer/index.d.ts +3 -0
  43. package/dist/lexer/index.d.ts.map +1 -0
  44. package/dist/lexer/index.js +3 -0
  45. package/dist/lexer/index.js.map +1 -0
  46. package/dist/lexer/lexer.d.ts +43 -0
  47. package/dist/lexer/lexer.d.ts.map +1 -0
  48. package/dist/lexer/lexer.js +346 -0
  49. package/dist/lexer/lexer.js.map +1 -0
  50. package/dist/lexer/token.d.ts +72 -0
  51. package/dist/lexer/token.d.ts.map +1 -0
  52. package/dist/lexer/token.js +170 -0
  53. package/dist/lexer/token.js.map +1 -0
  54. package/dist/parser/index.d.ts +2 -0
  55. package/dist/parser/index.d.ts.map +1 -0
  56. package/dist/parser/index.js +2 -0
  57. package/dist/parser/index.js.map +1 -0
  58. package/dist/parser/parser.d.ts +50 -0
  59. package/dist/parser/parser.d.ts.map +1 -0
  60. package/dist/parser/parser.js +1024 -0
  61. package/dist/parser/parser.js.map +1 -0
  62. package/dist/semantic/analyzer.d.ts +27 -0
  63. package/dist/semantic/analyzer.d.ts.map +1 -0
  64. package/dist/semantic/analyzer.js +580 -0
  65. package/dist/semantic/analyzer.js.map +1 -0
  66. package/dist/semantic/index.d.ts +4 -0
  67. package/dist/semantic/index.d.ts.map +1 -0
  68. package/dist/semantic/index.js +3 -0
  69. package/dist/semantic/index.js.map +1 -0
  70. package/dist/semantic/semantic-layer.d.ts +118 -0
  71. package/dist/semantic/semantic-layer.d.ts.map +1 -0
  72. package/dist/semantic/semantic-layer.js +264 -0
  73. package/dist/semantic/semantic-layer.js.map +1 -0
  74. package/package.json +49 -0
@@ -0,0 +1,580 @@
1
+ import { DiagnosticReporter, DQLSemanticError } from '../errors/reporter.js';
2
+ import { NodeKind, } from '../ast/nodes.js';
3
+ const COMMON_OPTIONAL = {
4
+ title: 'string',
5
+ title_font_size: 'number',
6
+ theme: 'string',
7
+ color: 'string',
8
+ show_grid: 'boolean',
9
+ show_legend: 'boolean',
10
+ width: 'number',
11
+ height: 'number',
12
+ // Interactive features
13
+ on_click: 'string',
14
+ drill_down: 'string',
15
+ link_to: 'string',
16
+ filter_by: 'any',
17
+ drill_hierarchy: 'string',
18
+ drill_path: 'string',
19
+ drill_mode: 'string',
20
+ // Chart enhancements
21
+ y2: 'identifier',
22
+ tooltip: 'any',
23
+ format_x: 'string',
24
+ format_y: 'string',
25
+ color_rule: 'string',
26
+ connection: 'string',
27
+ // Table enhancements
28
+ pin_columns: 'string[]',
29
+ row_color: 'string',
30
+ };
31
+ const CHART_ARG_SCHEMAS = {
32
+ line: {
33
+ required: { x: 'identifier', y: 'identifier' },
34
+ optional: {
35
+ ...COMMON_OPTIONAL,
36
+ line_width: 'number',
37
+ fill_opacity: 'number',
38
+ x_axis_label: 'string',
39
+ y_axis_label: 'string',
40
+ stroke_dash: 'string',
41
+ },
42
+ },
43
+ bar: {
44
+ required: { x: 'identifier', y: 'identifier' },
45
+ optional: {
46
+ ...COMMON_OPTIONAL,
47
+ orientation: 'string',
48
+ bar_width: 'number',
49
+ x_axis_label: 'string',
50
+ y_axis_label: 'string',
51
+ },
52
+ },
53
+ scatter: {
54
+ required: { x: 'identifier', y: 'identifier' },
55
+ optional: {
56
+ ...COMMON_OPTIONAL,
57
+ size: 'identifier',
58
+ x_axis_label: 'string',
59
+ y_axis_label: 'string',
60
+ },
61
+ },
62
+ area: {
63
+ required: { x: 'identifier', y: 'identifier' },
64
+ optional: {
65
+ ...COMMON_OPTIONAL,
66
+ fill_opacity: 'number',
67
+ x_axis_label: 'string',
68
+ y_axis_label: 'string',
69
+ },
70
+ },
71
+ pie: {
72
+ required: { x: 'identifier', y: 'identifier' },
73
+ optional: {
74
+ ...COMMON_OPTIONAL,
75
+ inner_radius: 'number',
76
+ },
77
+ },
78
+ heatmap: {
79
+ required: { x: 'identifier', y: 'identifier' },
80
+ optional: {
81
+ ...COMMON_OPTIONAL,
82
+ color_field: 'identifier',
83
+ x_axis_label: 'string',
84
+ y_axis_label: 'string',
85
+ },
86
+ },
87
+ kpi: {
88
+ required: {},
89
+ optional: {
90
+ ...COMMON_OPTIONAL,
91
+ metrics: 'string[]',
92
+ compare_to_previous: 'boolean',
93
+ formatting: 'string',
94
+ },
95
+ },
96
+ table: {
97
+ required: {},
98
+ optional: {
99
+ ...COMMON_OPTIONAL,
100
+ columns: 'string[]',
101
+ sortable: 'boolean',
102
+ page_size: 'number',
103
+ },
104
+ },
105
+ metric: {
106
+ required: {},
107
+ optional: {
108
+ ...COMMON_OPTIONAL,
109
+ format: 'string',
110
+ compare_to_previous: 'boolean',
111
+ },
112
+ },
113
+ stacked_bar: {
114
+ required: { x: 'identifier', y: 'identifier' },
115
+ optional: {
116
+ ...COMMON_OPTIONAL,
117
+ orientation: 'string',
118
+ x_axis_label: 'string',
119
+ y_axis_label: 'string',
120
+ },
121
+ },
122
+ grouped_bar: {
123
+ required: { x: 'identifier', y: 'identifier' },
124
+ optional: {
125
+ ...COMMON_OPTIONAL,
126
+ orientation: 'string',
127
+ x_axis_label: 'string',
128
+ y_axis_label: 'string',
129
+ },
130
+ },
131
+ combo: {
132
+ required: { x: 'identifier', y: 'identifier' },
133
+ optional: {
134
+ ...COMMON_OPTIONAL,
135
+ color_field: 'identifier',
136
+ line_width: 'number',
137
+ x_axis_label: 'string',
138
+ y_axis_label: 'string',
139
+ },
140
+ },
141
+ histogram: {
142
+ required: { x: 'identifier' },
143
+ optional: {
144
+ ...COMMON_OPTIONAL,
145
+ y: 'identifier',
146
+ x_axis_label: 'string',
147
+ y_axis_label: 'string',
148
+ },
149
+ },
150
+ funnel: {
151
+ required: { x: 'identifier', y: 'identifier' },
152
+ optional: {
153
+ ...COMMON_OPTIONAL,
154
+ x_axis_label: 'string',
155
+ y_axis_label: 'string',
156
+ },
157
+ },
158
+ treemap: {
159
+ required: { x: 'identifier', y: 'identifier' },
160
+ optional: {
161
+ ...COMMON_OPTIONAL,
162
+ color_field: 'identifier',
163
+ },
164
+ },
165
+ sankey: {
166
+ required: { x: 'identifier', y: 'identifier' },
167
+ optional: {
168
+ ...COMMON_OPTIONAL,
169
+ color_field: 'identifier',
170
+ },
171
+ },
172
+ sparkline: {
173
+ required: { x: 'identifier', y: 'identifier' },
174
+ optional: {
175
+ ...COMMON_OPTIONAL,
176
+ line_width: 'number',
177
+ },
178
+ },
179
+ small_multiples: {
180
+ required: { x: 'identifier', y: 'identifier', facet: 'identifier' },
181
+ optional: {
182
+ ...COMMON_OPTIONAL,
183
+ color_field: 'identifier',
184
+ line_width: 'number',
185
+ x_axis_label: 'string',
186
+ y_axis_label: 'string',
187
+ },
188
+ },
189
+ gauge: {
190
+ required: { y: 'identifier' },
191
+ optional: {
192
+ ...COMMON_OPTIONAL,
193
+ },
194
+ },
195
+ waterfall: {
196
+ required: { x: 'identifier', y: 'identifier' },
197
+ optional: {
198
+ ...COMMON_OPTIONAL,
199
+ x_axis_label: 'string',
200
+ y_axis_label: 'string',
201
+ },
202
+ },
203
+ boxplot: {
204
+ required: { x: 'identifier', y: 'identifier' },
205
+ optional: {
206
+ ...COMMON_OPTIONAL,
207
+ x_axis_label: 'string',
208
+ y_axis_label: 'string',
209
+ },
210
+ },
211
+ geo: {
212
+ required: { x: 'identifier', y: 'identifier' },
213
+ optional: {
214
+ ...COMMON_OPTIONAL,
215
+ color_field: 'identifier',
216
+ },
217
+ },
218
+ };
219
+ // ---- Filter Argument Schemas ----
220
+ const FILTER_ARG_SCHEMAS = {
221
+ dropdown: {
222
+ required: { label: 'string', param: 'string' },
223
+ optional: { default_value: 'string', placeholder: 'string', width: 'number' },
224
+ },
225
+ date_range: {
226
+ required: { label: 'string', param: 'string' },
227
+ optional: { default_value: 'string', format: 'string', width: 'number' },
228
+ },
229
+ text: {
230
+ required: { label: 'string', param: 'string' },
231
+ optional: { placeholder: 'string', debounce: 'number', width: 'number' },
232
+ },
233
+ multi_select: {
234
+ required: { label: 'string', param: 'string' },
235
+ optional: { default_value: 'string[]', placeholder: 'string', width: 'number' },
236
+ },
237
+ range: {
238
+ required: { label: 'string', param: 'string' },
239
+ optional: { min: 'number', max: 'number', step: 'number', width: 'number' },
240
+ },
241
+ };
242
+ const SAFE_RLS_COLUMN = /^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;
243
+ const RLS_TEMPLATE_VARIABLE = /^\{[A-Za-z_][A-Za-z0-9_.]*\}$/;
244
+ // ---- Analyzer ----
245
+ export class SemanticAnalyzer {
246
+ reporter;
247
+ scopes = [];
248
+ constructor() {
249
+ this.reporter = new DiagnosticReporter();
250
+ }
251
+ analyze(program) {
252
+ this.reporter.clear();
253
+ this.scopes = [];
254
+ for (const stmt of program.statements) {
255
+ switch (stmt.kind) {
256
+ case NodeKind.Dashboard:
257
+ this.analyzeDashboard(stmt);
258
+ break;
259
+ case NodeKind.ChartCall:
260
+ this.analyzeChartCall(stmt);
261
+ break;
262
+ case NodeKind.Workbook:
263
+ this.analyzeWorkbook(stmt);
264
+ break;
265
+ case NodeKind.ImportDecl:
266
+ // Import validation is handled at compile time
267
+ break;
268
+ case NodeKind.BlockDecl:
269
+ this.analyzeBlockDecl(stmt);
270
+ break;
271
+ }
272
+ }
273
+ return this.reporter.getAll();
274
+ }
275
+ validate(program) {
276
+ const diagnostics = this.analyze(program);
277
+ const errors = diagnostics.filter((d) => d.severity === 'error');
278
+ if (errors.length > 0) {
279
+ throw new DQLSemanticError(`Semantic errors found: ${errors.map((e) => e.message).join('; ')}`, errors);
280
+ }
281
+ }
282
+ analyzeWorkbook(node) {
283
+ this.validateDecorators(node.decorators, 'dashboard');
284
+ if (node.pages.length === 0) {
285
+ this.reporter.warning('Workbook has no pages.', node.span);
286
+ }
287
+ for (const page of node.pages) {
288
+ this.analyzePage(page);
289
+ }
290
+ }
291
+ analyzePage(node) {
292
+ this.pushScope();
293
+ this.analyzeBodyItems(node.body, node.span);
294
+ this.popScope();
295
+ }
296
+ analyzeBlockDecl(node) {
297
+ this.validateDecorators(node.decorators, 'dashboard');
298
+ if (!node.name || node.name.trim().length === 0) {
299
+ this.reporter.error('Block must have a non-empty name.', node.span);
300
+ }
301
+ if (!node.domain) {
302
+ this.reporter.warning('Block is missing a domain declaration.', node.span);
303
+ }
304
+ if (node.blockType === 'semantic') {
305
+ // Semantic blocks carry provenance (metricRef) and optionally pre-compiled SQL
306
+ // produced by an import adapter (dbt YAML, schema introspection, MetricFlow).
307
+ // Having both metricRef and query is the canonical imported-block shape.
308
+ if (!node.metricRef) {
309
+ this.reporter.warning('A semantic block should declare the dbt metric it references via metric = "metric_name".', node.span);
310
+ }
311
+ if (node.query && !node.metricRef) {
312
+ this.reporter.error('A semantic block must not contain a query field. Semantic blocks route to the MetricFlow API at query time; only custom blocks execute raw SQL. Declare this block as type = "custom" or remove the query field and add metric = "metric_name".', node.span);
313
+ }
314
+ }
315
+ else if (node.blockType === 'custom') {
316
+ // Custom blocks route to the SQL runtime — they must contain a query.
317
+ if (!node.query) {
318
+ this.reporter.error('A custom block must have a query field containing the certified SQL. Add a query = """SELECT ...""" block.', node.span);
319
+ }
320
+ if (node.metricRef) {
321
+ this.reporter.warning('A custom block should not declare a metric reference. The metric field is only meaningful on semantic blocks.', node.span);
322
+ }
323
+ }
324
+ // Validate SQL interpolations in block query
325
+ if (node.query) {
326
+ // Register block params as variables so SQL interpolations resolve
327
+ this.pushScope();
328
+ if (node.params) {
329
+ for (const p of node.params.params) {
330
+ this.currentScope().variables.set(p.name, {
331
+ kind: NodeKind.VariableDecl,
332
+ name: p.name,
333
+ initializer: p.initializer,
334
+ span: p.span,
335
+ });
336
+ }
337
+ }
338
+ this.validateSQLInterpolations(node.query);
339
+ this.popScope();
340
+ }
341
+ }
342
+ analyzeDashboard(node) {
343
+ this.validateDecorators(node.decorators, 'dashboard');
344
+ this.pushScope();
345
+ this.analyzeBodyItems(node.body, node.span);
346
+ this.popScope();
347
+ }
348
+ analyzeBodyItems(body, parentSpan) {
349
+ if (body.length === 0) {
350
+ this.reporter.warning('Dashboard/page has no charts.', parentSpan);
351
+ }
352
+ for (const item of body) {
353
+ switch (item.kind) {
354
+ case NodeKind.VariableDecl:
355
+ this.analyzeVariableDecl(item);
356
+ break;
357
+ case NodeKind.ParamDecl:
358
+ this.analyzeParamDecl(item);
359
+ break;
360
+ case NodeKind.ChartCall:
361
+ this.analyzeChartCall(item);
362
+ break;
363
+ case NodeKind.FilterCall:
364
+ this.analyzeFilterCall(item);
365
+ break;
366
+ case NodeKind.UseDecl:
367
+ // Use declarations are resolved at compile time
368
+ break;
369
+ case NodeKind.LayoutBlock:
370
+ for (const row of item.rows) {
371
+ for (const rowItem of row.items) {
372
+ if (rowItem.node.kind === NodeKind.ChartCall) {
373
+ this.analyzeChartCall(rowItem.node);
374
+ }
375
+ else if (rowItem.node.kind === NodeKind.FilterCall) {
376
+ this.analyzeFilterCall(rowItem.node);
377
+ }
378
+ }
379
+ }
380
+ break;
381
+ }
382
+ }
383
+ }
384
+ analyzeParamDecl(node) {
385
+ const scope = this.currentScope();
386
+ if (scope.variables.has(node.name)) {
387
+ this.reporter.error(`Parameter '${node.name}' conflicts with an existing variable in this scope.`, node.span);
388
+ }
389
+ // Register param as a variable so SQL interpolations can reference it
390
+ scope.variables.set(node.name, {
391
+ kind: NodeKind.VariableDecl,
392
+ name: node.name,
393
+ initializer: node.defaultValue ?? { kind: NodeKind.StringLiteral, value: '', span: node.span },
394
+ span: node.span,
395
+ });
396
+ }
397
+ analyzeChartCall(node) {
398
+ this.validateDecorators(node.decorators, 'chart');
399
+ this.validateChartArgs(node);
400
+ this.validateSQLInterpolations(node.query);
401
+ }
402
+ analyzeFilterCall(node) {
403
+ const schema = FILTER_ARG_SCHEMAS[node.filterType];
404
+ if (!schema)
405
+ return;
406
+ const provided = new Set(node.args.map((a) => a.name));
407
+ // Check required args
408
+ for (const [name] of Object.entries(schema.required)) {
409
+ if (!provided.has(name)) {
410
+ this.reporter.error(`filter.${node.filterType} requires argument '${name}'.`, node.span, `Add ${name} = "..." to the filter call.`);
411
+ }
412
+ }
413
+ // Check for unknown args
414
+ for (const arg of node.args) {
415
+ if (!(arg.name in schema.required) && !(arg.name in schema.optional)) {
416
+ this.reporter.warning(`Unknown argument '${arg.name}' for filter.${node.filterType}.`, arg.span, `Valid arguments: ${[...Object.keys(schema.required), ...Object.keys(schema.optional)].join(', ')}`);
417
+ }
418
+ }
419
+ // Validate SQL interpolations in filter query if present
420
+ if (node.query) {
421
+ this.validateSQLInterpolations(node.query);
422
+ }
423
+ // Register filter param as an implicitly-defined variable so dashboards can
424
+ // reference it in SQL templates via {param_name} without a separate `param` declaration.
425
+ const paramArg = node.args.find((a) => a.name === 'param');
426
+ if (paramArg && paramArg.value.kind === NodeKind.StringLiteral) {
427
+ const scope = this.currentScope();
428
+ const paramName = paramArg.value.value;
429
+ if (!scope.variables.has(paramName)) {
430
+ const defaultArg = node.args.find((a) => a.name === 'default_value');
431
+ const initializer = defaultArg?.value ?? { kind: NodeKind.StringLiteral, value: '', span: node.span };
432
+ scope.variables.set(paramName, {
433
+ kind: NodeKind.VariableDecl,
434
+ name: paramName,
435
+ initializer,
436
+ span: node.span,
437
+ });
438
+ }
439
+ }
440
+ }
441
+ analyzeVariableDecl(node) {
442
+ const scope = this.currentScope();
443
+ if (scope.variables.has(node.name)) {
444
+ this.reporter.error(`Variable '${node.name}' is already declared in this scope.`, node.span);
445
+ }
446
+ scope.variables.set(node.name, node);
447
+ }
448
+ validateChartArgs(node) {
449
+ const schema = CHART_ARG_SCHEMAS[node.chartType];
450
+ if (!schema)
451
+ return;
452
+ const provided = new Set(node.args.map((a) => a.name));
453
+ // Check required args
454
+ for (const [name] of Object.entries(schema.required)) {
455
+ if (!provided.has(name)) {
456
+ this.reporter.error(`chart.${node.chartType} requires argument '${name}'.`, node.span, `Add ${name} = <column_name> to the chart call.`);
457
+ }
458
+ }
459
+ // Check for unknown args
460
+ for (const arg of node.args) {
461
+ if (!(arg.name in schema.required) && !(arg.name in schema.optional)) {
462
+ this.reporter.warning(`Unknown argument '${arg.name}' for chart.${node.chartType}.`, arg.span, `Valid arguments: ${[...Object.keys(schema.required), ...Object.keys(schema.optional)].join(', ')}`);
463
+ }
464
+ }
465
+ const drillHierarchyArg = node.args.find((a) => a.name === 'drill_hierarchy');
466
+ const drillPathArg = node.args.find((a) => a.name === 'drill_path');
467
+ const drillModeArg = node.args.find((a) => a.name === 'drill_mode');
468
+ if ((drillPathArg || drillModeArg) && !drillHierarchyArg) {
469
+ this.reporter.warning('drill_path/drill_mode provided without drill_hierarchy. Hierarchy-driven drill may not activate.', (drillPathArg ?? drillModeArg ?? node).span);
470
+ }
471
+ if (drillModeArg && drillModeArg.value.kind === NodeKind.StringLiteral) {
472
+ const drillMode = drillModeArg.value.value;
473
+ const allowedModes = new Set(['modal', 'replace', 'expand']);
474
+ if (!allowedModes.has(drillMode)) {
475
+ this.reporter.error(`Invalid drill_mode '${drillMode}'. Allowed values: modal, replace, expand.`, drillModeArg.span);
476
+ }
477
+ }
478
+ }
479
+ validateSQLInterpolations(node) {
480
+ for (const interp of node.interpolations) {
481
+ if (!this.resolveVariable(interp.variableName)) {
482
+ this.reporter.error(`Undefined variable '${interp.variableName}' in SQL template.`, interp.span, `Declare it with: let ${interp.variableName} = ...`);
483
+ }
484
+ }
485
+ }
486
+ validateDecorators(decorators, context) {
487
+ for (const dec of decorators) {
488
+ switch (dec.name) {
489
+ case 'schedule':
490
+ if (dec.arguments.length === 0) {
491
+ this.reporter.error('@schedule requires at least one argument (e.g., daily, "9:00 AM").', dec.span);
492
+ }
493
+ break;
494
+ case 'email_to':
495
+ if (dec.arguments.length === 0) {
496
+ this.reporter.error('@email_to requires at least one email address.', dec.span);
497
+ }
498
+ break;
499
+ case 'cache':
500
+ case 'slack_channel':
501
+ case 'refresh':
502
+ // Valid decorators with future implementation
503
+ break;
504
+ case 'if':
505
+ if (context !== 'chart') {
506
+ this.reporter.error('@if can only be applied to chart declarations.', dec.span);
507
+ }
508
+ if (dec.arguments.length === 0) {
509
+ this.reporter.error('@if requires a parameter name as argument (e.g., @if(show_details)).', dec.span);
510
+ }
511
+ break;
512
+ case 'rls':
513
+ if (context !== 'chart') {
514
+ this.reporter.error('@rls can only be applied to chart declarations.', dec.span);
515
+ }
516
+ if (dec.arguments.length < 2) {
517
+ this.reporter.error('@rls requires two arguments: column name and value (e.g., @rls("org_id", "{user.org}")).', dec.span);
518
+ }
519
+ if (dec.arguments.length >= 1) {
520
+ const columnArg = dec.arguments[0];
521
+ const columnName = columnArg.kind === NodeKind.StringLiteral
522
+ ? columnArg.value
523
+ : (columnArg.kind === NodeKind.Identifier ? columnArg.name : '');
524
+ if (!columnName || !SAFE_RLS_COLUMN.test(columnName.trim())) {
525
+ this.reporter.error('@rls first argument must be a safe SQL column identifier (letters/numbers/underscores, optional dot paths).', dec.span);
526
+ }
527
+ }
528
+ if (dec.arguments.length >= 2 && dec.arguments[1].kind === NodeKind.StringLiteral) {
529
+ const raw = dec.arguments[1].value.trim();
530
+ if (raw.startsWith('{') && raw.endsWith('}') && !RLS_TEMPLATE_VARIABLE.test(raw)) {
531
+ this.reporter.error('@rls template values must use {variable_name} or {scope.name} format.', dec.span);
532
+ }
533
+ }
534
+ break;
535
+ case 'annotate':
536
+ if (context !== 'chart') {
537
+ this.reporter.error('@annotate can only be applied to chart declarations.', dec.span);
538
+ }
539
+ if (dec.arguments.length < 2) {
540
+ this.reporter.error('@annotate requires at least 2 arguments: x value and label (e.g., @annotate("2024-06-01", "Launch")).', dec.span);
541
+ }
542
+ break;
543
+ case 'materialize':
544
+ if (context !== 'chart') {
545
+ this.reporter.error('@materialize can only be applied to chart declarations.', dec.span);
546
+ }
547
+ break;
548
+ case 'alert':
549
+ break;
550
+ default:
551
+ this.reporter.warning(`Unknown decorator '@${dec.name}'.`, dec.span, `Valid decorators: @schedule, @email_to, @cache, @slack_channel, @refresh, @if, @rls, @annotate, @materialize, @alert`);
552
+ }
553
+ }
554
+ }
555
+ resolveVariable(name) {
556
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
557
+ const found = this.scopes[i].variables.get(name);
558
+ if (found)
559
+ return found;
560
+ }
561
+ return undefined;
562
+ }
563
+ pushScope() {
564
+ this.scopes.push({ variables: new Map() });
565
+ }
566
+ popScope() {
567
+ this.scopes.pop();
568
+ }
569
+ currentScope() {
570
+ if (this.scopes.length === 0) {
571
+ this.pushScope();
572
+ }
573
+ return this.scopes[this.scopes.length - 1];
574
+ }
575
+ }
576
+ export function analyze(program) {
577
+ const analyzer = new SemanticAnalyzer();
578
+ return analyzer.analyze(program);
579
+ }
580
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/semantic/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { SemanticAnalyzer, analyze } from './analyzer.js';
2
+ export { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseBlockCompanionDefinition, } from './semantic-layer.js';
3
+ export type { MetricDefinition, DimensionDefinition, HierarchyDefinition, BlockCompanionDefinition, HierarchyLevelDefinition, HierarchyDrillPathDefinition, HierarchyRollupType, SemanticLayerConfig, } from './semantic-layer.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { SemanticAnalyzer, analyze } from './analyzer.js';
2
+ export { SemanticLayer, parseMetricDefinition, parseDimensionDefinition, parseHierarchyDefinition, parseBlockCompanionDefinition, } from './semantic-layer.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC"}