@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.
- package/LICENSE +21 -0
- package/README.md +322 -0
- package/bin/elo +2 -0
- package/bin/eloc +2 -0
- package/dist/src/ast.d.ts +309 -0
- package/dist/src/ast.d.ts.map +1 -0
- package/dist/src/ast.js +173 -0
- package/dist/src/ast.js.map +1 -0
- package/dist/src/bindings/javascript.d.ts +17 -0
- package/dist/src/bindings/javascript.d.ts.map +1 -0
- package/dist/src/bindings/javascript.js +350 -0
- package/dist/src/bindings/javascript.js.map +1 -0
- package/dist/src/bindings/ruby.d.ts +20 -0
- package/dist/src/bindings/ruby.d.ts.map +1 -0
- package/dist/src/bindings/ruby.js +365 -0
- package/dist/src/bindings/ruby.js.map +1 -0
- package/dist/src/bindings/sql.d.ts +20 -0
- package/dist/src/bindings/sql.d.ts.map +1 -0
- package/dist/src/bindings/sql.js +319 -0
- package/dist/src/bindings/sql.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +225 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/compile.d.ts +47 -0
- package/dist/src/compile.d.ts.map +1 -0
- package/dist/src/compile.js +55 -0
- package/dist/src/compile.js.map +1 -0
- package/dist/src/compilers/javascript.d.ts +41 -0
- package/dist/src/compilers/javascript.d.ts.map +1 -0
- package/dist/src/compilers/javascript.js +323 -0
- package/dist/src/compilers/javascript.js.map +1 -0
- package/dist/src/compilers/ruby.d.ts +40 -0
- package/dist/src/compilers/ruby.d.ts.map +1 -0
- package/dist/src/compilers/ruby.js +326 -0
- package/dist/src/compilers/ruby.js.map +1 -0
- package/dist/src/compilers/sql.d.ts +37 -0
- package/dist/src/compilers/sql.d.ts.map +1 -0
- package/dist/src/compilers/sql.js +164 -0
- package/dist/src/compilers/sql.js.map +1 -0
- package/dist/src/elo.d.ts +3 -0
- package/dist/src/elo.d.ts.map +1 -0
- package/dist/src/elo.js +187 -0
- package/dist/src/elo.js.map +1 -0
- package/dist/src/eloc.d.ts +3 -0
- package/dist/src/eloc.d.ts.map +1 -0
- package/dist/src/eloc.js +232 -0
- package/dist/src/eloc.js.map +1 -0
- package/dist/src/eval.d.ts +3 -0
- package/dist/src/eval.d.ts.map +1 -0
- package/dist/src/eval.js +196 -0
- package/dist/src/eval.js.map +1 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +36 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ir.d.ts +295 -0
- package/dist/src/ir.d.ts.map +1 -0
- package/dist/src/ir.js +224 -0
- package/dist/src/ir.js.map +1 -0
- package/dist/src/parser.d.ts +137 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +1266 -0
- package/dist/src/parser.js.map +1 -0
- package/dist/src/preludes/index.d.ts +14 -0
- package/dist/src/preludes/index.d.ts.map +1 -0
- package/dist/src/preludes/index.js +27 -0
- package/dist/src/preludes/index.js.map +1 -0
- package/dist/src/runtime.d.ts +23 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +326 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/stdlib.d.ts +121 -0
- package/dist/src/stdlib.d.ts.map +1 -0
- package/dist/src/stdlib.js +237 -0
- package/dist/src/stdlib.js.map +1 -0
- package/dist/src/transform.d.ts +38 -0
- package/dist/src/transform.d.ts.map +1 -0
- package/dist/src/transform.js +322 -0
- package/dist/src/transform.js.map +1 -0
- package/dist/src/typedefs.d.ts +50 -0
- package/dist/src/typedefs.d.ts.map +1 -0
- package/dist/src/typedefs.js +294 -0
- package/dist/src/typedefs.js.map +1 -0
- package/dist/src/types.d.ts +54 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +62 -0
- package/dist/src/types.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"elo.d.ts","sourceRoot":"","sources":["../../src/elo.ts"],"names":[],"mappings":""}
|