@enspirit/elo 0.9.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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -0
  3. package/bin/elo +2 -0
  4. package/bin/eloc +2 -0
  5. package/dist/src/ast.d.ts +309 -0
  6. package/dist/src/ast.d.ts.map +1 -0
  7. package/dist/src/ast.js +173 -0
  8. package/dist/src/ast.js.map +1 -0
  9. package/dist/src/bindings/javascript.d.ts +17 -0
  10. package/dist/src/bindings/javascript.d.ts.map +1 -0
  11. package/dist/src/bindings/javascript.js +350 -0
  12. package/dist/src/bindings/javascript.js.map +1 -0
  13. package/dist/src/bindings/ruby.d.ts +20 -0
  14. package/dist/src/bindings/ruby.d.ts.map +1 -0
  15. package/dist/src/bindings/ruby.js +365 -0
  16. package/dist/src/bindings/ruby.js.map +1 -0
  17. package/dist/src/bindings/sql.d.ts +20 -0
  18. package/dist/src/bindings/sql.d.ts.map +1 -0
  19. package/dist/src/bindings/sql.js +319 -0
  20. package/dist/src/bindings/sql.js.map +1 -0
  21. package/dist/src/cli.d.ts +3 -0
  22. package/dist/src/cli.d.ts.map +1 -0
  23. package/dist/src/cli.js +225 -0
  24. package/dist/src/cli.js.map +1 -0
  25. package/dist/src/compile.d.ts +47 -0
  26. package/dist/src/compile.d.ts.map +1 -0
  27. package/dist/src/compile.js +55 -0
  28. package/dist/src/compile.js.map +1 -0
  29. package/dist/src/compilers/javascript.d.ts +41 -0
  30. package/dist/src/compilers/javascript.d.ts.map +1 -0
  31. package/dist/src/compilers/javascript.js +323 -0
  32. package/dist/src/compilers/javascript.js.map +1 -0
  33. package/dist/src/compilers/ruby.d.ts +40 -0
  34. package/dist/src/compilers/ruby.d.ts.map +1 -0
  35. package/dist/src/compilers/ruby.js +326 -0
  36. package/dist/src/compilers/ruby.js.map +1 -0
  37. package/dist/src/compilers/sql.d.ts +37 -0
  38. package/dist/src/compilers/sql.d.ts.map +1 -0
  39. package/dist/src/compilers/sql.js +164 -0
  40. package/dist/src/compilers/sql.js.map +1 -0
  41. package/dist/src/elo.d.ts +3 -0
  42. package/dist/src/elo.d.ts.map +1 -0
  43. package/dist/src/elo.js +187 -0
  44. package/dist/src/elo.js.map +1 -0
  45. package/dist/src/eloc.d.ts +3 -0
  46. package/dist/src/eloc.d.ts.map +1 -0
  47. package/dist/src/eloc.js +232 -0
  48. package/dist/src/eloc.js.map +1 -0
  49. package/dist/src/eval.d.ts +3 -0
  50. package/dist/src/eval.d.ts.map +1 -0
  51. package/dist/src/eval.js +196 -0
  52. package/dist/src/eval.js.map +1 -0
  53. package/dist/src/index.d.ts +17 -0
  54. package/dist/src/index.d.ts.map +1 -0
  55. package/dist/src/index.js +36 -0
  56. package/dist/src/index.js.map +1 -0
  57. package/dist/src/ir.d.ts +295 -0
  58. package/dist/src/ir.d.ts.map +1 -0
  59. package/dist/src/ir.js +224 -0
  60. package/dist/src/ir.js.map +1 -0
  61. package/dist/src/parser.d.ts +137 -0
  62. package/dist/src/parser.d.ts.map +1 -0
  63. package/dist/src/parser.js +1266 -0
  64. package/dist/src/parser.js.map +1 -0
  65. package/dist/src/preludes/index.d.ts +14 -0
  66. package/dist/src/preludes/index.d.ts.map +1 -0
  67. package/dist/src/preludes/index.js +27 -0
  68. package/dist/src/preludes/index.js.map +1 -0
  69. package/dist/src/runtime.d.ts +23 -0
  70. package/dist/src/runtime.d.ts.map +1 -0
  71. package/dist/src/runtime.js +326 -0
  72. package/dist/src/runtime.js.map +1 -0
  73. package/dist/src/stdlib.d.ts +121 -0
  74. package/dist/src/stdlib.d.ts.map +1 -0
  75. package/dist/src/stdlib.js +237 -0
  76. package/dist/src/stdlib.js.map +1 -0
  77. package/dist/src/transform.d.ts +38 -0
  78. package/dist/src/transform.d.ts.map +1 -0
  79. package/dist/src/transform.js +322 -0
  80. package/dist/src/transform.js.map +1 -0
  81. package/dist/src/typedefs.d.ts +50 -0
  82. package/dist/src/typedefs.d.ts.map +1 -0
  83. package/dist/src/typedefs.js +294 -0
  84. package/dist/src/typedefs.js.map +1 -0
  85. package/dist/src/types.d.ts +54 -0
  86. package/dist/src/types.d.ts.map +1 -0
  87. package/dist/src/types.js +62 -0
  88. package/dist/src/types.js.map +1 -0
  89. package/package.json +66 -0
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileToRuby = compileToRuby;
4
+ exports.compileToRubyWithMeta = compileToRubyWithMeta;
5
+ const ir_1 = require("../ir");
6
+ const transform_1 = require("../transform");
7
+ const ruby_1 = require("../bindings/ruby");
8
+ const runtime_1 = require("../runtime");
9
+ /**
10
+ * Ruby operator precedence (higher = binds tighter)
11
+ */
12
+ const RUBY_PRECEDENCE = {
13
+ '||': 0,
14
+ '&&': 1,
15
+ '==': 2, '!=': 2,
16
+ '<': 3, '>': 3, '<=': 3, '>=': 3,
17
+ '+': 4, '-': 4,
18
+ '*': 5, '/': 5, '%': 5,
19
+ '**': 6,
20
+ };
21
+ /**
22
+ * Check if an IR expression needs parentheses when used as child of a binary op
23
+ */
24
+ function needsParens(child, parentOp, side) {
25
+ if (!(0, ruby_1.isNativeBinaryOp)(child))
26
+ return false;
27
+ const call = child;
28
+ const childOp = ruby_1.RUBY_OP_MAP[call.fn];
29
+ if (!childOp)
30
+ return false;
31
+ const parentPrec = RUBY_PRECEDENCE[parentOp] || 0;
32
+ const childPrec = RUBY_PRECEDENCE[childOp] || 0;
33
+ if (childPrec < parentPrec)
34
+ return true;
35
+ if (childPrec === parentPrec && side === 'right' && (parentOp === '-' || parentOp === '/')) {
36
+ return true;
37
+ }
38
+ // Non-associative operators in Ruby need parens when chained
39
+ const nonAssociative = ['==', '!=', '<', '>', '<=', '>='];
40
+ if (childPrec === parentPrec && nonAssociative.includes(parentOp) && nonAssociative.includes(childOp)) {
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ // Create the Ruby standard library binding
46
+ const rubyLib = (0, ruby_1.createRubyBinding)();
47
+ /**
48
+ * Compiles Elo expressions to Ruby code
49
+ *
50
+ * This compiler works in two phases:
51
+ * 1. Transform AST to typed IR
52
+ * 2. Emit Ruby from IR (tracking required helpers)
53
+ * 3. Wrap with helper definitions if needed
54
+ *
55
+ * If the expression uses `_` (input variable), the output is a lambda
56
+ * that takes `_` as a parameter.
57
+ */
58
+ function compileToRuby(expr, options) {
59
+ const result = compileToRubyWithMeta(expr, options);
60
+ return result.code;
61
+ }
62
+ /**
63
+ * Compiles Elo expressions to Ruby with metadata about input usage.
64
+ * Use this when you need to know if the expression uses input.
65
+ *
66
+ * Every Elo program compiles to a lambda taking _ as input parameter.
67
+ * The usesInput field indicates whether _ is actually referenced.
68
+ */
69
+ function compileToRubyWithMeta(expr, options) {
70
+ const ir = (0, transform_1.transform)(expr);
71
+ const actuallyUsesInput = (0, ir_1.usesInput)(ir);
72
+ const result = emitRubyWithHelpers(ir);
73
+ // Resolve helper dependencies
74
+ const allHelpers = new Set(result.requiredHelpers);
75
+ for (const helper of result.requiredHelpers) {
76
+ const deps = runtime_1.RUBY_HELPER_DEPS[helper];
77
+ if (deps) {
78
+ for (const dep of deps) {
79
+ allHelpers.add(dep);
80
+ }
81
+ }
82
+ }
83
+ // Build helper definitions (sorted for deterministic output)
84
+ const helperDefs = Array.from(allHelpers)
85
+ .sort()
86
+ .map(name => runtime_1.RUBY_HELPERS[name].replace(/\n\s*/g, '; ').replace(/; end/, ' end'))
87
+ .join('; ');
88
+ // Always wrap as a lambda taking _ as input parameter
89
+ // When execute is true, add .call(nil) to call the lambda and ; to make it a statement
90
+ const suffix = options?.execute ? '.call(nil);' : '';
91
+ if (result.requiredHelpers.size === 0) {
92
+ return { code: `->(_) { ${result.code} }${suffix}`, usesInput: actuallyUsesInput };
93
+ }
94
+ return { code: `->(_) { ${helperDefs}; ${result.code} }${suffix}`, usesInput: actuallyUsesInput };
95
+ }
96
+ /**
97
+ * Emit Ruby with helper tracking
98
+ */
99
+ function emitRubyWithHelpers(ir) {
100
+ // Reset counter for deterministic output
101
+ typeParserVarCounter = 0;
102
+ const requiredHelpers = new Set();
103
+ const code = emitRuby(ir, requiredHelpers);
104
+ return { code, requiredHelpers };
105
+ }
106
+ /**
107
+ * Emit Ruby code from IR
108
+ */
109
+ function emitRuby(ir, requiredHelpers) {
110
+ const ctx = {
111
+ emit: (child) => emitRuby(child, requiredHelpers),
112
+ emitWithParens: (child, parentOp, side) => {
113
+ const emitted = emitRuby(child, requiredHelpers);
114
+ if (needsParens(child, parentOp, side)) {
115
+ return `(${emitted})`;
116
+ }
117
+ return emitted;
118
+ },
119
+ requireHelper: requiredHelpers ? (name) => requiredHelpers.add(name) : undefined,
120
+ };
121
+ switch (ir.type) {
122
+ case 'int_literal':
123
+ case 'float_literal':
124
+ return ir.value.toString();
125
+ case 'bool_literal':
126
+ return ir.value.toString();
127
+ case 'null_literal':
128
+ return 'nil';
129
+ case 'string_literal': {
130
+ // Ruby double-quoted strings: escape backslash and double quote
131
+ const escaped = ir.value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
132
+ return `"${escaped}"`;
133
+ }
134
+ case 'date_literal':
135
+ return `Date.parse('${ir.value}')`;
136
+ case 'datetime_literal':
137
+ return `DateTime.parse('${ir.value}')`;
138
+ case 'duration_literal':
139
+ return `ActiveSupport::Duration.parse('${ir.value}')`;
140
+ case 'object_literal': {
141
+ const props = ir.properties.map(p => `${p.key}: ${ctx.emit(p.value)}`).join(', ');
142
+ return `{${props}}`;
143
+ }
144
+ case 'array_literal': {
145
+ const elements = ir.elements.map(e => ctx.emit(e)).join(', ');
146
+ return `[${elements}]`;
147
+ }
148
+ case 'variable':
149
+ return ir.name;
150
+ case 'member_access': {
151
+ const object = ctx.emit(ir.object);
152
+ const needsParensForMember = ir.object.type === 'call' && (0, ruby_1.isNativeBinaryOp)(ir.object);
153
+ const objectExpr = needsParensForMember ? `(${object})` : object;
154
+ return `${objectExpr}[:${ir.property}]`;
155
+ }
156
+ case 'let': {
157
+ // Collect all consecutive let bindings for flattened output
158
+ const allBindings = [];
159
+ let current = ir;
160
+ while (current.type === 'let') {
161
+ for (const b of current.bindings) {
162
+ allBindings.push({ name: b.name, value: ctx.emit(b.value) });
163
+ }
164
+ current = current.body;
165
+ }
166
+ const assignments = allBindings.map(b => `${b.name} = ${b.value}`).join('; ');
167
+ const body = ctx.emit(current);
168
+ return `(${assignments}; ${body})`;
169
+ }
170
+ case 'call':
171
+ return rubyLib.emit(ir.fn, ir.args, ir.argTypes, ctx);
172
+ case 'if': {
173
+ const cond = ctx.emit(ir.condition);
174
+ const thenBranch = ctx.emit(ir.then);
175
+ const elseBranch = ctx.emit(ir.else);
176
+ return `(${cond}) ? (${thenBranch}) : (${elseBranch})`;
177
+ }
178
+ case 'lambda': {
179
+ const params = ir.params.map(p => p.name).join(', ');
180
+ const body = ctx.emit(ir.body);
181
+ return `->(${params}) { ${body} }`;
182
+ }
183
+ case 'apply': {
184
+ const fn = ctx.emit(ir.fn);
185
+ const args = ir.args.map(a => ctx.emit(a)).join(', ');
186
+ return `${fn}.call(${args})`;
187
+ }
188
+ case 'alternative': {
189
+ // Compile to lambda with early returns for non-nil values
190
+ const alts = ir.alternatives;
191
+ const parts = alts.slice(0, -1).map((alt) => {
192
+ const code = ctx.emit(alt);
193
+ return `v = ${code}; return v unless v.nil?`;
194
+ });
195
+ // Last alternative is just returned directly
196
+ const last = ctx.emit(alts[alts.length - 1]);
197
+ parts.push(last);
198
+ return `->() { ${parts.join('; ')} }.call`;
199
+ }
200
+ case 'datapath': {
201
+ // Compile datapath as an array of segments (symbols for strings, integers for numbers)
202
+ const segments = ir.segments.map(s => typeof s === 'string' ? `:${s}` : s.toString());
203
+ return `[${segments.join(', ')}]`;
204
+ }
205
+ case 'typedef': {
206
+ // Generate parser lambda for the type and bind it
207
+ const parserCode = emitTypeExprParser(ir.typeExpr, ctx);
208
+ ctx.requireHelper?.('p_unwrap');
209
+ const body = ctx.emit(ir.body);
210
+ // The type name becomes a lambda that calls the parser and unwraps
211
+ return `(_p_${ir.name} = ${parserCode}; ${ir.name} = ->(v) { p_unwrap(_p_${ir.name}.call(v, '')) }; ${body})`;
212
+ }
213
+ }
214
+ }
215
+ /**
216
+ * Counter for generating unique variable names in nested type parsers
217
+ */
218
+ let typeParserVarCounter = 0;
219
+ /**
220
+ * Get a unique variable suffix for type parser variables
221
+ */
222
+ function nextVarSuffix() {
223
+ return `_${typeParserVarCounter++}`;
224
+ }
225
+ /**
226
+ * Emit a parser lambda for a type expression in Ruby
227
+ */
228
+ function emitTypeExprParser(typeExpr, ctx) {
229
+ switch (typeExpr.kind) {
230
+ case 'type_ref': {
231
+ // Map type name to parser helper
232
+ const parserMap = {
233
+ 'Any': 'p_any',
234
+ 'String': 'p_string',
235
+ 'Int': 'p_int',
236
+ 'Float': 'p_float',
237
+ 'Bool': 'p_bool',
238
+ 'Boolean': 'p_bool',
239
+ 'Datetime': 'p_datetime',
240
+ };
241
+ const parserName = parserMap[typeExpr.name];
242
+ if (parserName) {
243
+ ctx.requireHelper?.(parserName);
244
+ return `method(:${parserName})`;
245
+ }
246
+ // Check if it's a user-defined type (uppercase identifier not in built-ins)
247
+ // User-defined types are referenced as _p_TypeName
248
+ const firstChar = typeExpr.name.charAt(0);
249
+ if (firstChar === firstChar.toUpperCase() && firstChar !== firstChar.toLowerCase()) {
250
+ return `_p_${typeExpr.name}`;
251
+ }
252
+ throw new Error(`Unknown type in type definition: ${typeExpr.name}`);
253
+ }
254
+ case 'type_schema': {
255
+ // Object schema: generate inline parser lambda
256
+ // Use unique variable names to avoid Ruby closure issues with nested schemas
257
+ ctx.requireHelper?.('p_ok');
258
+ ctx.requireHelper?.('p_fail');
259
+ const suffix = nextVarSuffix();
260
+ const oVar = `_o${suffix}`;
261
+ const propParsers = typeExpr.properties.map(prop => {
262
+ const propParser = emitTypeExprParser(prop.typeExpr, ctx);
263
+ return { key: prop.key, parser: propParser, optional: prop.optional };
264
+ });
265
+ const knownKeys = typeExpr.properties.map(p => p.key);
266
+ // Generate object parser with unique variable names
267
+ const propChecks = propParsers.map(({ key, parser, optional }) => {
268
+ const rVar = `_r_${key}${suffix}`;
269
+ if (optional) {
270
+ // Optional: if value is null/undefined, skip attribute; otherwise parse
271
+ return `unless v[:${key}].nil?; ${rVar} = (${parser}).call(v[:${key}], p + '.${key}'); return p_fail(p, nil, [${rVar}]) unless ${rVar}[:success]; ${oVar}[:${key}] = ${rVar}[:value]; end`;
272
+ }
273
+ // Required: parse and fail if not successful
274
+ return `${rVar} = (${parser}).call(v[:${key}], p + '.${key}'); return p_fail(p, nil, [${rVar}]) unless ${rVar}[:success]; ${oVar}[:${key}] = ${rVar}[:value]`;
275
+ }).join('; ');
276
+ // Handle extras based on the extras mode
277
+ let extrasCheck;
278
+ const knownKeysArr = knownKeys.map(k => `:${k}`).join(', ');
279
+ const ksVar = `_ks${suffix}`;
280
+ if (typeExpr.extras === undefined || typeExpr.extras === 'closed') {
281
+ // Closed: fail if any extra keys exist
282
+ extrasCheck = `${ksVar} = [${knownKeysArr}]; v.each_key { |_k| return p_fail(p + '.' + _k.to_s, 'unexpected attribute') unless ${ksVar}.include?(_k) }`;
283
+ }
284
+ else if (typeExpr.extras === 'ignored') {
285
+ // Ignored: no check, extras are silently ignored
286
+ extrasCheck = '';
287
+ }
288
+ else {
289
+ // Typed extras: parse each extra key with the given type
290
+ const extrasParser = emitTypeExprParser(typeExpr.extras, ctx);
291
+ const epVar = `_ep${suffix}`;
292
+ const reVar = `_re${suffix}`;
293
+ extrasCheck = `${ksVar} = [${knownKeysArr}]; ${epVar} = ${extrasParser}; v.each_key { |_k| unless ${ksVar}.include?(_k); ${reVar} = ${epVar}.call(v[_k], p + '.' + _k.to_s); return p_fail(p, nil, [${reVar}]) unless ${reVar}[:success]; ${oVar}[_k] = ${reVar}[:value]; end }`;
294
+ }
295
+ return `->(v, p) { return p_fail(p, 'expected object, got ' + (v.nil? ? 'Null' : v.class.to_s)) unless v.is_a?(Hash); ${oVar} = {}; ${propChecks}; ${extrasCheck}; p_ok(${oVar}, p) }`;
296
+ }
297
+ case 'subtype_constraint': {
298
+ // Subtype constraint: Int(i | i > 0)
299
+ // First parse with base type, then check constraint
300
+ ctx.requireHelper?.('p_ok');
301
+ ctx.requireHelper?.('p_fail');
302
+ const baseParser = emitTypeExprParser(typeExpr.baseType, ctx);
303
+ const constraintCode = ctx.emit(typeExpr.constraint);
304
+ const varName = typeExpr.variable;
305
+ return `->(v, p) { _r = (${baseParser}).call(v, p); return _r unless _r[:success]; ${varName} = _r[:value]; return p_fail(p, 'constraint violated') unless (${constraintCode}); _r }`;
306
+ }
307
+ case 'array_type': {
308
+ // Array type: [Int]
309
+ // Parse each element with the element type
310
+ ctx.requireHelper?.('p_ok');
311
+ ctx.requireHelper?.('p_fail');
312
+ const elemParser = emitTypeExprParser(typeExpr.elementType, ctx);
313
+ return `->(v, p) { return p_fail(p, 'expected array, got ' + (v.nil? ? 'Null' : v.class.to_s)) unless v.is_a?(Array); _el = ${elemParser}; _a = []; v.each_with_index { |_e, _i| _r = _el.call(_e, p + '.' + _i.to_s); return p_fail(p, nil, [_r]) unless _r[:success]; _a << _r[:value] }; p_ok(_a, p) }`;
314
+ }
315
+ case 'union_type': {
316
+ // Union type: Int|String
317
+ // Try each type in order, return first successful parse (PEG-style)
318
+ ctx.requireHelper?.('p_fail');
319
+ const parsers = typeExpr.types.map(t => emitTypeExprParser(t, ctx));
320
+ // Generate tries: call each parser directly in order
321
+ const tries = parsers.map(p => `_r = (${p}).call(v, p); return _r if _r[:success]; _causes << _r`).join('; ');
322
+ return `->(v, p) { _causes = []; ${tries}; p_fail(p, 'no union alternative matched', _causes) }`;
323
+ }
324
+ }
325
+ }
326
+ //# sourceMappingURL=ruby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruby.js","sourceRoot":"","sources":["../../../src/compilers/ruby.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Expr } from '../ast';
2
+ /**
3
+ * SQL compilation options
4
+ */
5
+ export interface SQLCompileOptions {
6
+ /** If true, always mark as using input (even if _ is not used) */
7
+ asFunction?: boolean;
8
+ }
9
+ /**
10
+ * Result of SQL compilation
11
+ */
12
+ export interface SQLCompileResult {
13
+ /** The generated SQL code */
14
+ code: string;
15
+ /** Whether the code uses the input parameter $1 */
16
+ usesInput: boolean;
17
+ }
18
+ /**
19
+ * Compiles Elo expressions to PostgreSQL SQL
20
+ *
21
+ * This compiler works in two phases:
22
+ * 1. Transform AST to typed IR
23
+ * 2. Emit SQL from IR
24
+ *
25
+ * If the expression uses `_` (input variable), it is compiled as `$1`
26
+ * (PostgreSQL parameter placeholder).
27
+ */
28
+ export declare function compileToSQL(expr: Expr, options?: SQLCompileOptions): string;
29
+ /**
30
+ * Compiles Elo expressions to SQL with metadata about input usage.
31
+ * Use this when you need to know if the expression uses input parameter $1.
32
+ *
33
+ * Note: SQL compilation allows undefined variables since they represent
34
+ * database column names, not program variables with potential global access.
35
+ */
36
+ export declare function compileToSQLWithMeta(expr: Expr, options?: SQLCompileOptions): SQLCompileResult;
37
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../../src/compilers/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO9B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAC;CACpB;AAsCD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAG5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAO9F"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileToSQL = compileToSQL;
4
+ exports.compileToSQLWithMeta = compileToSQLWithMeta;
5
+ const ir_1 = require("../ir");
6
+ const transform_1 = require("../transform");
7
+ const sql_1 = require("../bindings/sql");
8
+ /**
9
+ * SQL operator precedence (higher = binds tighter)
10
+ */
11
+ const SQL_PRECEDENCE = {
12
+ 'OR': 0,
13
+ 'AND': 1,
14
+ '=': 2, '<>': 2,
15
+ '<': 3, '>': 3, '<=': 3, '>=': 3,
16
+ '+': 4, '-': 4,
17
+ '*': 5, '/': 5, '%': 5,
18
+ };
19
+ /**
20
+ * Check if an IR expression needs parentheses when used as child of a binary op
21
+ */
22
+ function needsParens(child, parentOp, side) {
23
+ if (!(0, sql_1.isNativeBinaryOp)(child))
24
+ return false;
25
+ const call = child;
26
+ const childOp = sql_1.SQL_OP_MAP[call.fn];
27
+ if (!childOp)
28
+ return false;
29
+ const parentPrec = SQL_PRECEDENCE[parentOp] || 0;
30
+ const childPrec = SQL_PRECEDENCE[childOp] || 0;
31
+ if (childPrec < parentPrec)
32
+ return true;
33
+ if (childPrec === parentPrec && side === 'right' && (parentOp === '-' || parentOp === '/')) {
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ // Create the SQL standard library binding
39
+ const sqlLib = (0, sql_1.createSQLBinding)();
40
+ /**
41
+ * Compiles Elo expressions to PostgreSQL SQL
42
+ *
43
+ * This compiler works in two phases:
44
+ * 1. Transform AST to typed IR
45
+ * 2. Emit SQL from IR
46
+ *
47
+ * If the expression uses `_` (input variable), it is compiled as `$1`
48
+ * (PostgreSQL parameter placeholder).
49
+ */
50
+ function compileToSQL(expr, options) {
51
+ const result = compileToSQLWithMeta(expr, options);
52
+ return result.code;
53
+ }
54
+ /**
55
+ * Compiles Elo expressions to SQL with metadata about input usage.
56
+ * Use this when you need to know if the expression uses input parameter $1.
57
+ *
58
+ * Note: SQL compilation allows undefined variables since they represent
59
+ * database column names, not program variables with potential global access.
60
+ */
61
+ function compileToSQLWithMeta(expr, options) {
62
+ // SQL allows undefined variables since they represent column names
63
+ const ir = (0, transform_1.transform)(expr, new Map(), new Set(), { allowUndefinedVariables: true });
64
+ const needsInput = (0, ir_1.usesInput)(ir) || options?.asFunction;
65
+ const code = emitSQL(ir);
66
+ return { code, usesInput: needsInput || false };
67
+ }
68
+ /**
69
+ * Emit SQL code from IR
70
+ */
71
+ function emitSQL(ir) {
72
+ const ctx = {
73
+ emit: emitSQL,
74
+ emitWithParens: (child, parentOp, side) => {
75
+ const emitted = emitSQL(child);
76
+ if (needsParens(child, parentOp, side)) {
77
+ return `(${emitted})`;
78
+ }
79
+ return emitted;
80
+ },
81
+ };
82
+ switch (ir.type) {
83
+ case 'int_literal':
84
+ case 'float_literal':
85
+ return ir.value.toString();
86
+ case 'bool_literal':
87
+ return ir.value ? 'TRUE' : 'FALSE';
88
+ case 'null_literal':
89
+ return 'NULL';
90
+ case 'string_literal': {
91
+ // SQL strings use single quotes, escape single quotes by doubling
92
+ const escaped = ir.value.replace(/'/g, "''");
93
+ return `'${escaped}'`;
94
+ }
95
+ case 'date_literal':
96
+ return `DATE '${ir.value}'`;
97
+ case 'datetime_literal': {
98
+ // Convert ISO8601 to PostgreSQL TIMESTAMP format
99
+ const formatted = ir.value.replace('T', ' ').replace('Z', '').split('.')[0];
100
+ return `TIMESTAMP '${formatted}'`;
101
+ }
102
+ case 'duration_literal':
103
+ return `INTERVAL '${ir.value}'`;
104
+ case 'object_literal': {
105
+ if (ir.properties.length === 0) {
106
+ return `'{}'::jsonb`;
107
+ }
108
+ const args = ir.properties
109
+ .map(p => `'${p.key}', ${emitSQL(p.value)}`)
110
+ .join(', ');
111
+ return `jsonb_build_object(${args})`;
112
+ }
113
+ case 'array_literal': {
114
+ const elements = ir.elements.map(e => emitSQL(e)).join(', ');
115
+ return `ARRAY[${elements}]`;
116
+ }
117
+ case 'variable':
118
+ // Map _ to $1 (PostgreSQL parameter placeholder for input)
119
+ return ir.name === '_' ? '$1' : ir.name;
120
+ case 'member_access': {
121
+ const object = emitSQL(ir.object);
122
+ const objectType = (0, ir_1.inferType)(ir.object);
123
+ const needsParensForMember = ir.object.type === 'call' && (0, sql_1.isNativeBinaryOp)(ir.object);
124
+ const objectExpr = needsParensForMember ? `(${object})` : object;
125
+ // Use JSON access for object types
126
+ if (objectType.kind === 'object') {
127
+ return `${objectExpr}->>'${ir.property}'`;
128
+ }
129
+ return `${objectExpr}.${ir.property}`;
130
+ }
131
+ case 'let': {
132
+ const bindingCols = ir.bindings
133
+ .map(b => `${emitSQL(b.value)} AS ${b.name}`)
134
+ .join(', ');
135
+ const body = emitSQL(ir.body);
136
+ return `(SELECT ${body} FROM (SELECT ${bindingCols}) AS _let)`;
137
+ }
138
+ case 'call':
139
+ return sqlLib.emit(ir.fn, ir.args, ir.argTypes, ctx);
140
+ case 'if': {
141
+ const cond = emitSQL(ir.condition);
142
+ const thenBranch = emitSQL(ir.then);
143
+ const elseBranch = emitSQL(ir.else);
144
+ return `CASE WHEN ${cond} THEN ${thenBranch} ELSE ${elseBranch} END`;
145
+ }
146
+ case 'lambda':
147
+ throw new Error('Lambda expressions are not supported in SQL target');
148
+ case 'apply':
149
+ throw new Error('Lambda invocation is not supported in SQL target');
150
+ case 'alternative': {
151
+ // Compile to COALESCE - returns first non-NULL value
152
+ const alts = ir.alternatives.map(emitSQL).join(', ');
153
+ return `COALESCE(${alts})`;
154
+ }
155
+ case 'datapath': {
156
+ // Compile datapath as an array of path segments for use with fetch
157
+ const segments = ir.segments.map(s => typeof s === 'string' ? `'${s}'` : s.toString());
158
+ return `ARRAY[${segments.join(', ')}]`;
159
+ }
160
+ case 'typedef':
161
+ throw new Error('Type definitions are not yet supported in SQL compilation');
162
+ }
163
+ }
164
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../src/compilers/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=elo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elo.d.ts","sourceRoot":"","sources":["../../src/elo.ts"],"names":[],"mappings":""}