@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,319 @@
1
+ "use strict";
2
+ /**
3
+ * SQL (PostgreSQL) stdlib binding for Elo
4
+ *
5
+ * This module defines how Elo IR functions are emitted as PostgreSQL SQL code.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SQL_OP_MAP = void 0;
9
+ exports.isNativeBinaryOp = isNativeBinaryOp;
10
+ exports.createSQLBinding = createSQLBinding;
11
+ const types_1 = require("../types");
12
+ const stdlib_1 = require("../stdlib");
13
+ /**
14
+ * Map IR function names to SQL operators
15
+ */
16
+ exports.SQL_OP_MAP = {
17
+ 'add': '+', 'sub': '-', 'mul': '*', 'div': '/', 'mod': '%',
18
+ 'lt': '<', 'gt': '>', 'lte': '<=', 'gte': '>=',
19
+ 'eq': '=', 'neq': '<>', 'and': 'AND', 'or': 'OR',
20
+ };
21
+ /**
22
+ * Check if a call will be emitted as a native SQL binary operator
23
+ */
24
+ function isNativeBinaryOp(ir) {
25
+ if (ir.type !== 'call')
26
+ return false;
27
+ return exports.SQL_OP_MAP[ir.fn] !== undefined && ir.argTypes.length === 2;
28
+ }
29
+ /**
30
+ * Helper for SQL binary operators
31
+ */
32
+ function sqlBinaryOp(op) {
33
+ return (args, ctx) => {
34
+ const left = ctx.emitWithParens(args[0], op, 'left');
35
+ const right = ctx.emitWithParens(args[1], op, 'right');
36
+ return `${left} ${op} ${right}`;
37
+ };
38
+ }
39
+ /**
40
+ * Create the SQL standard library binding
41
+ */
42
+ function createSQLBinding() {
43
+ const sqlLib = new stdlib_1.StdLib();
44
+ // Temporal nullary functions
45
+ sqlLib.register('today', [], (0, stdlib_1.nullary)('CURRENT_DATE'));
46
+ sqlLib.register('now', [], (0, stdlib_1.nullary)('CURRENT_TIMESTAMP'));
47
+ sqlLib.register('bot', [], (0, stdlib_1.nullary)("TIMESTAMP '0001-01-01 00:00:00'"));
48
+ sqlLib.register('eot', [], (0, stdlib_1.nullary)("TIMESTAMP '9999-12-31 23:59:59'"));
49
+ // Period boundary functions using date_trunc
50
+ const periodBoundarySQL = {
51
+ 'start_of_day': { truncate: 'day' },
52
+ 'end_of_day': { truncate: 'day', end: "+ INTERVAL '1 day' - INTERVAL '1 second'" },
53
+ 'start_of_week': { truncate: 'week' },
54
+ 'end_of_week': { truncate: 'week', end: "+ INTERVAL '6 days'" },
55
+ 'start_of_month': { truncate: 'month' },
56
+ 'end_of_month': { truncate: 'month', end: "+ INTERVAL '1 month' - INTERVAL '1 day'" },
57
+ 'start_of_quarter': { truncate: 'quarter' },
58
+ 'end_of_quarter': { truncate: 'quarter', end: "+ INTERVAL '3 months' - INTERVAL '1 day'" },
59
+ 'start_of_year': { truncate: 'year' },
60
+ 'end_of_year': { truncate: 'year', end: "+ INTERVAL '1 year' - INTERVAL '1 day'" },
61
+ };
62
+ for (const [fn, { truncate, end }] of Object.entries(periodBoundarySQL)) {
63
+ sqlLib.register(fn, [types_1.Types.datetime], (args, ctx) => {
64
+ const arg = args[0];
65
+ let baseExpr;
66
+ if (arg.type === 'call' && arg.fn === 'now') {
67
+ baseExpr = fn.includes('_day') ? 'CURRENT_TIMESTAMP' : 'CURRENT_DATE';
68
+ }
69
+ else {
70
+ baseExpr = ctx.emit(arg);
71
+ }
72
+ const truncated = `date_trunc('${truncate}', ${baseExpr})`;
73
+ return end ? `${truncated} ${end}` : truncated;
74
+ });
75
+ }
76
+ // String concatenation uses || in SQL
77
+ sqlLib.register('add', [types_1.Types.string, types_1.Types.string], sqlBinaryOp('||'));
78
+ // String multiplication (repeat) uses REPEAT function in PostgreSQL
79
+ sqlLib.register('mul', [types_1.Types.string, types_1.Types.int], (args, ctx) => `REPEAT(${ctx.emit(args[0])}, ${ctx.emit(args[1])})`);
80
+ sqlLib.register('mul', [types_1.Types.int, types_1.Types.string], (args, ctx) => `REPEAT(${ctx.emit(args[1])}, ${ctx.emit(args[0])})`);
81
+ // List concatenation uses || in PostgreSQL (array concatenation)
82
+ sqlLib.register('add', [types_1.Types.array, types_1.Types.array], sqlBinaryOp('||'));
83
+ // SQL uses native operators for all types - type generalization handles all combinations
84
+ sqlLib.register('add', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('+'));
85
+ sqlLib.register('sub', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('-'));
86
+ sqlLib.register('mul', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('*'));
87
+ sqlLib.register('div', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('/'));
88
+ sqlLib.register('mod', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('%'));
89
+ sqlLib.register('pow', [types_1.Types.any, types_1.Types.any], (0, stdlib_1.fnCall)('POWER'));
90
+ // Temporal arithmetic
91
+ // Special case: today() + duration('P1D') -> CURRENT_DATE + INTERVAL '1 day' (for TOMORROW)
92
+ sqlLib.register('add', [types_1.Types.date, types_1.Types.duration], (args, ctx) => {
93
+ const leftArg = args[0];
94
+ const rightArg = args[1];
95
+ if (leftArg.type === 'call' && leftArg.fn === 'today' &&
96
+ rightArg.type === 'duration_literal' && rightArg.value === 'P1D') {
97
+ return "CURRENT_DATE + INTERVAL '1 day'";
98
+ }
99
+ const left = ctx.emitWithParens(args[0], '+', 'left');
100
+ const right = ctx.emitWithParens(args[1], '+', 'right');
101
+ return `${left} + ${right}`;
102
+ });
103
+ // Other temporal additions are covered by any,any registration
104
+ // Special case: today() - duration('P1D') -> CURRENT_DATE - INTERVAL '1 day' (for YESTERDAY)
105
+ sqlLib.register('sub', [types_1.Types.date, types_1.Types.duration], (args, ctx) => {
106
+ const leftArg = args[0];
107
+ const rightArg = args[1];
108
+ if (leftArg.type === 'call' && leftArg.fn === 'today' &&
109
+ rightArg.type === 'duration_literal' && rightArg.value === 'P1D') {
110
+ return "CURRENT_DATE - INTERVAL '1 day'";
111
+ }
112
+ const left = ctx.emitWithParens(args[0], '-', 'left');
113
+ const right = ctx.emitWithParens(args[1], '-', 'right');
114
+ return `${left} - ${right}`;
115
+ });
116
+ // Date - Date returns an INTERVAL (PostgreSQL returns integer days, convert to interval)
117
+ sqlLib.register('sub', [types_1.Types.date, types_1.Types.date], (args, ctx) => {
118
+ const left = ctx.emitWithParens(args[0], '-', 'left');
119
+ const right = ctx.emitWithParens(args[1], '-', 'right');
120
+ return `(${left} - ${right}) * INTERVAL '1 day'`;
121
+ });
122
+ sqlLib.register('sub', [types_1.Types.datetime, types_1.Types.datetime], (args, ctx) => {
123
+ const left = ctx.emitWithParens(args[0], '-', 'left');
124
+ const right = ctx.emitWithParens(args[1], '-', 'right');
125
+ return `${left} - ${right}`; // TIMESTAMP - TIMESTAMP already returns INTERVAL in PostgreSQL
126
+ });
127
+ // Other temporal subtractions and duration scaling are covered by any,any registrations
128
+ // Comparison operators - SQL handles all types, type generalization applies
129
+ sqlLib.register('lt', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('<'));
130
+ sqlLib.register('gt', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('>'));
131
+ sqlLib.register('lte', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('<='));
132
+ sqlLib.register('gte', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('>='));
133
+ sqlLib.register('eq', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('='));
134
+ sqlLib.register('neq', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('<>'));
135
+ // Logical operators
136
+ sqlLib.register('and', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('AND'));
137
+ sqlLib.register('or', [types_1.Types.any, types_1.Types.any], sqlBinaryOp('OR'));
138
+ // Unary operators - type generalization handles int, float, and any
139
+ sqlLib.register('neg', [types_1.Types.any], (args, ctx) => {
140
+ const operand = ctx.emit(args[0]);
141
+ if (isNativeBinaryOp(args[0]))
142
+ return `-(${operand})`;
143
+ return `-${operand}`;
144
+ });
145
+ sqlLib.register('pos', [types_1.Types.any], (args, ctx) => {
146
+ const operand = ctx.emit(args[0]);
147
+ if (isNativeBinaryOp(args[0]))
148
+ return `+(${operand})`;
149
+ return `+${operand}`;
150
+ });
151
+ sqlLib.register('not', [types_1.Types.any], (args, ctx) => {
152
+ const operand = ctx.emit(args[0]);
153
+ if (isNativeBinaryOp(args[0]))
154
+ return `NOT (${operand})`;
155
+ return `NOT ${operand}`;
156
+ });
157
+ // Assert function - type generalization handles bool and any
158
+ sqlLib.register('assert', [types_1.Types.any], (args, ctx) => {
159
+ const condition = ctx.emit(args[0]);
160
+ return `CASE WHEN ${condition} THEN TRUE ELSE (SELECT pg_terminate_backend(pg_backend_pid())) END`;
161
+ });
162
+ sqlLib.register('assert', [types_1.Types.any, types_1.Types.string], (args, ctx) => {
163
+ const condition = ctx.emit(args[0]);
164
+ return `CASE WHEN ${condition} THEN TRUE ELSE (SELECT pg_terminate_backend(pg_backend_pid())) END`;
165
+ });
166
+ // AssertFails - expects a function to throw when called
167
+ // In PostgreSQL, we use a DO block with exception handling
168
+ sqlLib.register('assertFails', [types_1.Types.fn], (args, ctx) => {
169
+ // For SQL, assertFails tests are skipped since PostgreSQL exception handling
170
+ // requires procedural context that's not available in pure SQL expressions
171
+ return `TRUE /* assertFails not supported in SQL */`;
172
+ });
173
+ // Array functions
174
+ sqlLib.register('length', [types_1.Types.array], (args, ctx) => `COALESCE(CARDINALITY(${ctx.emit(args[0])}), 0)`);
175
+ sqlLib.register('at', [types_1.Types.array, types_1.Types.int], (args, ctx) => `${ctx.emit(args[0])}[${ctx.emit(args[1])} + 1]`);
176
+ sqlLib.register('first', [types_1.Types.array], (args, ctx) => `${ctx.emit(args[0])}[1]`);
177
+ sqlLib.register('last', [types_1.Types.array], (args, ctx) => `${ctx.emit(args[0])}[CARDINALITY(${ctx.emit(args[0])})]`);
178
+ sqlLib.register('isEmpty', [types_1.Types.array], (args, ctx) => `(COALESCE(CARDINALITY(${ctx.emit(args[0])}), 0) = 0)`);
179
+ // String functions
180
+ sqlLib.register('length', [types_1.Types.string], (args, ctx) => `LENGTH(${ctx.emit(args[0])})`);
181
+ sqlLib.register('upper', [types_1.Types.string], (args, ctx) => `UPPER(${ctx.emit(args[0])})`);
182
+ sqlLib.register('lower', [types_1.Types.string], (args, ctx) => `LOWER(${ctx.emit(args[0])})`);
183
+ sqlLib.register('trim', [types_1.Types.string], (args, ctx) => `TRIM(${ctx.emit(args[0])})`);
184
+ sqlLib.register('startsWith', [types_1.Types.string, types_1.Types.string], (args, ctx) => `starts_with(${ctx.emit(args[0])}, ${ctx.emit(args[1])})`);
185
+ sqlLib.register('endsWith', [types_1.Types.string, types_1.Types.string], (args, ctx) => `(${ctx.emit(args[0])} LIKE '%' || ${ctx.emit(args[1])})`);
186
+ sqlLib.register('contains', [types_1.Types.string, types_1.Types.string], (args, ctx) => `(POSITION(${ctx.emit(args[1])} IN ${ctx.emit(args[0])}) > 0)`);
187
+ // PostgreSQL SUBSTRING is 1-based, Elo is 0-based
188
+ sqlLib.register('substring', [types_1.Types.string, types_1.Types.int, types_1.Types.int], (args, ctx) => `SUBSTRING(${ctx.emit(args[0])} FROM ${ctx.emit(args[1])} + 1 FOR ${ctx.emit(args[2])})`);
189
+ sqlLib.register('concat', [types_1.Types.string, types_1.Types.string], (args, ctx) => `CONCAT(${ctx.emit(args[0])}, ${ctx.emit(args[1])})`);
190
+ // indexOf returns NULL when not found, 0-based index otherwise
191
+ // POSITION returns 1-based (or 0 if not found), NULLIF converts 0 to NULL
192
+ sqlLib.register('indexOf', [types_1.Types.string, types_1.Types.string], (args, ctx) => `(NULLIF(POSITION(${ctx.emit(args[1])} IN ${ctx.emit(args[0])}), 0) - 1)`);
193
+ sqlLib.register('replace', [types_1.Types.string, types_1.Types.string, types_1.Types.string], (args, ctx) => `REGEXP_REPLACE(${ctx.emit(args[0])}, ${ctx.emit(args[1])}, ${ctx.emit(args[2])})`);
194
+ sqlLib.register('replaceAll', [types_1.Types.string, types_1.Types.string, types_1.Types.string], (args, ctx) => `REGEXP_REPLACE(${ctx.emit(args[0])}, ${ctx.emit(args[1])}, ${ctx.emit(args[2])}, 'g')`);
195
+ sqlLib.register('isEmpty', [types_1.Types.string], (args, ctx) => `(LENGTH(${ctx.emit(args[0])}) = 0)`);
196
+ sqlLib.register('padStart', [types_1.Types.string, types_1.Types.int, types_1.Types.string], (args, ctx) => `LPAD(${ctx.emit(args[0])}, ${ctx.emit(args[1])}, ${ctx.emit(args[2])})`);
197
+ sqlLib.register('padEnd', [types_1.Types.string, types_1.Types.int, types_1.Types.string], (args, ctx) => `RPAD(${ctx.emit(args[0])}, ${ctx.emit(args[1])}, ${ctx.emit(args[2])})`);
198
+ // Numeric functions
199
+ sqlLib.register('abs', [types_1.Types.int], (args, ctx) => `ABS(${ctx.emit(args[0])})`);
200
+ sqlLib.register('abs', [types_1.Types.float], (args, ctx) => `ABS(${ctx.emit(args[0])})`);
201
+ sqlLib.register('round', [types_1.Types.int], (args, ctx) => ctx.emit(args[0]));
202
+ sqlLib.register('round', [types_1.Types.float], (args, ctx) => `ROUND(${ctx.emit(args[0])})`);
203
+ sqlLib.register('floor', [types_1.Types.int], (args, ctx) => ctx.emit(args[0]));
204
+ sqlLib.register('floor', [types_1.Types.float], (args, ctx) => `FLOOR(${ctx.emit(args[0])})`);
205
+ sqlLib.register('ceil', [types_1.Types.int], (args, ctx) => ctx.emit(args[0]));
206
+ sqlLib.register('ceil', [types_1.Types.float], (args, ctx) => `CEIL(${ctx.emit(args[0])})`);
207
+ // Temporal extraction functions
208
+ sqlLib.register('year', [types_1.Types.date], (args, ctx) => `EXTRACT(YEAR FROM ${ctx.emit(args[0])})`);
209
+ sqlLib.register('year', [types_1.Types.datetime], (args, ctx) => `EXTRACT(YEAR FROM ${ctx.emit(args[0])})`);
210
+ sqlLib.register('month', [types_1.Types.date], (args, ctx) => `EXTRACT(MONTH FROM ${ctx.emit(args[0])})`);
211
+ sqlLib.register('month', [types_1.Types.datetime], (args, ctx) => `EXTRACT(MONTH FROM ${ctx.emit(args[0])})`);
212
+ sqlLib.register('day', [types_1.Types.date], (args, ctx) => `EXTRACT(DAY FROM ${ctx.emit(args[0])})`);
213
+ sqlLib.register('day', [types_1.Types.datetime], (args, ctx) => `EXTRACT(DAY FROM ${ctx.emit(args[0])})`);
214
+ sqlLib.register('hour', [types_1.Types.datetime], (args, ctx) => `EXTRACT(HOUR FROM ${ctx.emit(args[0])})`);
215
+ sqlLib.register('minute', [types_1.Types.datetime], (args, ctx) => `EXTRACT(MINUTE FROM ${ctx.emit(args[0])})`);
216
+ // Type introspection - map PostgreSQL types to Elo type names
217
+ sqlLib.register('typeOf', [types_1.Types.any], (args, ctx) => {
218
+ const v = ctx.emit(args[0]);
219
+ return `CASE WHEN ${v} IS NULL THEN 'Null' ` +
220
+ `WHEN pg_typeof(${v})::text LIKE '%[]' THEN 'List' ` +
221
+ `ELSE CASE pg_typeof(${v})::text ` +
222
+ `WHEN 'integer' THEN 'Int' ` +
223
+ `WHEN 'bigint' THEN 'Int' ` +
224
+ `WHEN 'double precision' THEN 'Float' ` +
225
+ `WHEN 'numeric' THEN 'Float' ` +
226
+ `WHEN 'boolean' THEN 'Bool' ` +
227
+ `WHEN 'text' THEN 'String' ` +
228
+ `WHEN 'character varying' THEN 'String' ` +
229
+ `WHEN 'unknown' THEN 'String' ` +
230
+ `WHEN 'interval' THEN 'Duration' ` +
231
+ `WHEN 'date' THEN 'DateTime' ` +
232
+ `WHEN 'timestamp without time zone' THEN 'DateTime' ` +
233
+ `WHEN 'timestamp with time zone' THEN 'DateTime' ` +
234
+ `ELSE 'Tuple' END END`;
235
+ });
236
+ // Null handling
237
+ sqlLib.register('isNull', [types_1.Types.any], (args, ctx) => `${ctx.emit(args[0])} IS NULL`);
238
+ // Data path navigation - uses PostgreSQL jsonb #> operator with text array path
239
+ sqlLib.register('fetch', [types_1.Types.any, types_1.Types.fn], (args, ctx) => {
240
+ const data = ctx.emit(args[0]);
241
+ const path = ctx.emit(args[1]);
242
+ // Convert path array to text array and use jsonb #> operator
243
+ return `(${data})::jsonb #> (${path})::text[]`;
244
+ });
245
+ sqlLib.register('patch', [types_1.Types.any, types_1.Types.fn, types_1.Types.any], (args, ctx) => {
246
+ const data = ctx.emit(args[0]);
247
+ const path = ctx.emit(args[1]);
248
+ const value = ctx.emit(args[2]);
249
+ // Use the elo_patch function which handles path creation
250
+ return `elo_patch((${data})::jsonb, (${path})::text[], to_jsonb(${value}))`;
251
+ });
252
+ // Data merge functions
253
+ sqlLib.register('merge', [types_1.Types.any, types_1.Types.any], (args, ctx) => {
254
+ const a = ctx.emit(args[0]);
255
+ const b = ctx.emit(args[1]);
256
+ // PostgreSQL jsonb || operator performs shallow merge
257
+ return `(${a})::jsonb || (${b})::jsonb`;
258
+ });
259
+ sqlLib.register('deepMerge', [types_1.Types.any, types_1.Types.any], (args, ctx) => {
260
+ const a = ctx.emit(args[0]);
261
+ const b = ctx.emit(args[1]);
262
+ return `elo_deep_merge((${a})::jsonb, (${b})::jsonb)`;
263
+ });
264
+ // Error handling - uses elo_fail() PL/pgSQL function that raises an exception
265
+ sqlLib.register('fail', [types_1.Types.string], (args, ctx) => `elo_fail(${ctx.emit(args[0])})`);
266
+ // Type selectors (information contracts)
267
+ // These use elo_* PL/pgSQL functions that return NULL on parse failure
268
+ // Int - identity for int, truncate for float, parse for string
269
+ sqlLib.register('Int', [types_1.Types.int], (args, ctx) => ctx.emit(args[0]));
270
+ sqlLib.register('Int', [types_1.Types.float], (args, ctx) => `TRUNC(${ctx.emit(args[0])})::INTEGER`);
271
+ sqlLib.register('Int', [types_1.Types.string], (args, ctx) => `elo_int(${ctx.emit(args[0])})`);
272
+ sqlLib.register('Int', [types_1.Types.any], (args, ctx) => `elo_int(${ctx.emit(args[0])})`);
273
+ // Float - identity for float, convert for int, parse for string
274
+ sqlLib.register('Float', [types_1.Types.float], (args, ctx) => ctx.emit(args[0]));
275
+ sqlLib.register('Float', [types_1.Types.int], (args, ctx) => `${ctx.emit(args[0])}::DOUBLE PRECISION`);
276
+ sqlLib.register('Float', [types_1.Types.string], (args, ctx) => `elo_float(${ctx.emit(args[0])})`);
277
+ sqlLib.register('Float', [types_1.Types.any], (args, ctx) => `elo_float(${ctx.emit(args[0])})`);
278
+ // Bool - identity for bool, parse "true"/"false" for string
279
+ sqlLib.register('Bool', [types_1.Types.bool], (args, ctx) => ctx.emit(args[0]));
280
+ sqlLib.register('Bool', [types_1.Types.string], (args, ctx) => {
281
+ const v = ctx.emit(args[0]);
282
+ return `CASE ${v} WHEN 'true' THEN TRUE WHEN 'false' THEN FALSE ELSE NULL END`;
283
+ });
284
+ sqlLib.register('Bool', [types_1.Types.any], (args, ctx) => {
285
+ const v = ctx.emit(args[0]);
286
+ return `CASE ${v} WHEN 'true' THEN TRUE WHEN 'false' THEN FALSE ELSE NULL END`;
287
+ });
288
+ // Date - identity for date, parse ISO for string
289
+ sqlLib.register('Date', [types_1.Types.date], (args, ctx) => ctx.emit(args[0]));
290
+ sqlLib.register('Date', [types_1.Types.string], (args, ctx) => `elo_date(${ctx.emit(args[0])})`);
291
+ sqlLib.register('Date', [types_1.Types.any], (args, ctx) => `elo_date(${ctx.emit(args[0])})`);
292
+ // Datetime - identity for datetime, parse ISO for string
293
+ sqlLib.register('Datetime', [types_1.Types.datetime], (args, ctx) => ctx.emit(args[0]));
294
+ sqlLib.register('Datetime', [types_1.Types.string], (args, ctx) => `elo_datetime(${ctx.emit(args[0])})`);
295
+ sqlLib.register('Datetime', [types_1.Types.any], (args, ctx) => `elo_datetime(${ctx.emit(args[0])})`);
296
+ // Duration - identity for duration, parse ISO for string
297
+ sqlLib.register('Duration', [types_1.Types.duration], (args, ctx) => ctx.emit(args[0]));
298
+ sqlLib.register('Duration', [types_1.Types.string], (args, ctx) => `elo_duration(${ctx.emit(args[0])})`);
299
+ sqlLib.register('Duration', [types_1.Types.any], (args, ctx) => `elo_duration(${ctx.emit(args[0])})`);
300
+ // Data - identity for non-strings, parse JSON for strings
301
+ sqlLib.register('Data', [types_1.Types.array], (args, ctx) => ctx.emit(args[0]));
302
+ sqlLib.register('Data', [types_1.Types.object], (args, ctx) => ctx.emit(args[0]));
303
+ sqlLib.register('Data', [types_1.Types.string], (args, ctx) => `elo_data(${ctx.emit(args[0])})`);
304
+ sqlLib.register('Data', [types_1.Types.any], (args, ctx) => `elo_data(${ctx.emit(args[0])})`);
305
+ // List manipulation functions
306
+ // PostgreSQL doesn't have built-in array_reverse, use subquery with ordinality
307
+ sqlLib.register('reverse', [types_1.Types.array], (args, ctx) => {
308
+ const arr = ctx.emit(args[0]);
309
+ return `(SELECT ARRAY_AGG(elem ORDER BY ord DESC) FROM UNNEST(${arr}) WITH ORDINALITY AS t(elem, ord))`;
310
+ });
311
+ // Join list elements with separator
312
+ sqlLib.register('join', [types_1.Types.array, types_1.Types.string], (args, ctx) => `array_to_string(${ctx.emit(args[0])}, ${ctx.emit(args[1])})`);
313
+ // Split string into list
314
+ sqlLib.register('split', [types_1.Types.string, types_1.Types.string], (args, ctx) => `string_to_array(${ctx.emit(args[0])}, ${ctx.emit(args[1])})`);
315
+ // No fallback - unknown functions should fail at compile time
316
+ // (StdLib.emit() will throw if no implementation is found)
317
+ return sqlLib;
318
+ }
319
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../src/bindings/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,225 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const fs_1 = require("fs");
5
+ const parser_1 = require("./parser");
6
+ const ruby_1 = require("./compilers/ruby");
7
+ const javascript_1 = require("./compilers/javascript");
8
+ const sql_1 = require("./compilers/sql");
9
+ const preludes_1 = require("./preludes");
10
+ // Map CLI target names to prelude target names
11
+ function toPreludeTarget(target) {
12
+ return target === 'js' ? 'javascript' : target;
13
+ }
14
+ function parseArgs(args) {
15
+ const options = {
16
+ target: 'js' // default target
17
+ };
18
+ for (let i = 0; i < args.length; i++) {
19
+ const arg = args[i];
20
+ switch (arg) {
21
+ case '-e':
22
+ case '--expression':
23
+ options.expression = args[++i];
24
+ break;
25
+ case '-f':
26
+ case '--file':
27
+ options.outputFile = args[++i];
28
+ break;
29
+ case '-t':
30
+ case '--target':
31
+ const target = args[++i];
32
+ if (target !== 'ruby' && target !== 'js' && target !== 'sql') {
33
+ console.error(`Invalid target: ${target}. Must be one of: ruby, js, sql`);
34
+ process.exit(1);
35
+ }
36
+ options.target = target;
37
+ break;
38
+ case '-p':
39
+ case '--prelude':
40
+ options.prelude = true;
41
+ break;
42
+ case '--prelude-only':
43
+ options.preludeOnly = true;
44
+ break;
45
+ case '-h':
46
+ case '--help':
47
+ printHelp();
48
+ process.exit(0);
49
+ break;
50
+ case '-':
51
+ // Read from stdin
52
+ options.inputFile = '-';
53
+ break;
54
+ default:
55
+ // If it doesn't start with -, treat it as input file
56
+ if (!arg.startsWith('-') && !options.inputFile && !options.expression) {
57
+ options.inputFile = arg;
58
+ }
59
+ else if (!arg.startsWith('-')) {
60
+ console.error(`Unknown argument: ${arg}`);
61
+ printHelp();
62
+ process.exit(1);
63
+ }
64
+ }
65
+ }
66
+ return options;
67
+ }
68
+ function printHelp() {
69
+ console.log(`
70
+ Elo Compiler (eloc) - Compile Elo expressions to Ruby, JavaScript, or SQL
71
+
72
+ Usage:
73
+ eloc [options] [input-file]
74
+
75
+ Options:
76
+ -e, --expression <expr> Expression to compile (like ruby -e)
77
+ -t, --target <lang> Target language: ruby, js (default), sql
78
+ -p, --prelude Include necessary library imports/requires
79
+ --prelude-only Output only the prelude (no expression needed)
80
+ -f, --file <path> Output to file instead of stdout
81
+ -h, --help Show this help message
82
+
83
+ Examples:
84
+ # Compile expression to JavaScript (default)
85
+ eloc -e "2 + 3 * 4"
86
+
87
+ # Compile expression to Ruby
88
+ eloc -e "2 + 3 * 4" -t ruby
89
+
90
+ # Compile expression to SQL
91
+ eloc -e "2 + 3 * 4" -t sql
92
+
93
+ # Compile with prelude (includes required libraries)
94
+ eloc -e "NOW + PT2H" -t ruby -p
95
+
96
+ # Compile from file
97
+ eloc input.elo -t ruby
98
+
99
+ # Compile to file
100
+ eloc -e "2 + 3" -t ruby -f output.rb
101
+
102
+ # Compile file to file
103
+ eloc input.elo -t js -f output.js
104
+
105
+ # Compile from stdin
106
+ echo "2 + 3 * 4" | eloc -
107
+ cat input.elo | eloc - -t ruby
108
+
109
+ For evaluating expressions, use the 'elo' command instead.
110
+ `);
111
+ }
112
+ function compile(source, target, options = {}) {
113
+ const ast = (0, parser_1.parse)(source);
114
+ const { includePrelude = false } = options;
115
+ let code;
116
+ switch (target) {
117
+ case 'ruby': {
118
+ const result = (0, ruby_1.compileToRubyWithMeta)(ast);
119
+ code = result.code;
120
+ break;
121
+ }
122
+ case 'js': {
123
+ const result = (0, javascript_1.compileToJavaScriptWithMeta)(ast);
124
+ code = result.code;
125
+ break;
126
+ }
127
+ case 'sql': {
128
+ const result = (0, sql_1.compileToSQLWithMeta)(ast);
129
+ code = result.code;
130
+ break;
131
+ }
132
+ }
133
+ if (includePrelude) {
134
+ const preludeContent = (0, preludes_1.getPrelude)(toPreludeTarget(target));
135
+ if (preludeContent) {
136
+ code = `${preludeContent}\n\n${code}`;
137
+ }
138
+ }
139
+ return code;
140
+ }
141
+ function main() {
142
+ const args = process.argv.slice(2);
143
+ if (args.length === 0) {
144
+ printHelp();
145
+ process.exit(0);
146
+ }
147
+ const options = parseArgs(args);
148
+ // Handle --prelude-only: just output the prelude and exit
149
+ if (options.preludeOnly) {
150
+ const prelude = (0, preludes_1.getPrelude)(toPreludeTarget(options.target));
151
+ console.log(prelude);
152
+ return;
153
+ }
154
+ // Get the source expression(s)
155
+ let sources;
156
+ if (options.expression) {
157
+ sources = [options.expression];
158
+ }
159
+ else if (options.inputFile) {
160
+ try {
161
+ // Use file descriptor 0 for stdin when input is '-'
162
+ const content = options.inputFile === '-'
163
+ ? (0, fs_1.readFileSync)(0, 'utf-8')
164
+ : (0, fs_1.readFileSync)(options.inputFile, 'utf-8');
165
+ // Split into lines - keep all lines but mark empty/comment lines as null
166
+ // so we can output empty lines for them to preserve line numbers
167
+ sources = content.split('\n').map(line => {
168
+ const trimmed = line.trim();
169
+ return (trimmed === '' || trimmed.startsWith('#')) ? '' : line;
170
+ });
171
+ }
172
+ catch (error) {
173
+ console.error(`Error reading ${options.inputFile === '-' ? 'stdin' : `file ${options.inputFile}`}: ${error}`);
174
+ process.exit(1);
175
+ }
176
+ }
177
+ else {
178
+ console.error('Error: Must provide either -e <expression>, an input file, or - for stdin');
179
+ printHelp();
180
+ process.exit(1);
181
+ }
182
+ // Compile each expression
183
+ let results;
184
+ try {
185
+ results = sources.map((source, index) => {
186
+ try {
187
+ const trimmed = source.trim();
188
+ // Skip empty lines and comment lines - return empty result
189
+ if (trimmed === '' || trimmed.startsWith('#')) {
190
+ return '';
191
+ }
192
+ return compile(trimmed, options.target, {
193
+ includePrelude: index === 0 && options.prelude
194
+ });
195
+ }
196
+ catch (error) {
197
+ throw new Error(`Line ${index + 1}: ${error}`);
198
+ }
199
+ });
200
+ }
201
+ catch (error) {
202
+ console.error(`Compilation error: ${error}`);
203
+ process.exit(1);
204
+ }
205
+ // Join lines with newlines
206
+ const output = results.join('\n');
207
+ // Output the result
208
+ if (options.outputFile) {
209
+ try {
210
+ // Only add trailing newline if output doesn't already end with one
211
+ const finalOutput = output.endsWith('\n') ? output : output + '\n';
212
+ (0, fs_1.writeFileSync)(options.outputFile, finalOutput, 'utf-8');
213
+ console.error(`Compiled to ${options.outputFile}`);
214
+ }
215
+ catch (error) {
216
+ console.error(`Error writing file ${options.outputFile}: ${error}`);
217
+ process.exit(1);
218
+ }
219
+ }
220
+ else {
221
+ console.log(output);
222
+ }
223
+ }
224
+ main();
225
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}