@enspirit/elo 0.9.4 → 0.9.7
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/README.md +3 -1
- package/dist/src/ast.d.ts +29 -6
- package/dist/src/ast.d.ts.map +1 -1
- package/dist/src/ast.js +14 -3
- package/dist/src/ast.js.map +1 -1
- package/dist/src/bindings/javascript.d.ts.map +1 -1
- package/dist/src/bindings/javascript.js +14 -2
- package/dist/src/bindings/javascript.js.map +1 -1
- package/dist/src/bindings/ruby.d.ts.map +1 -1
- package/dist/src/bindings/ruby.js +23 -2
- package/dist/src/bindings/ruby.js.map +1 -1
- package/dist/src/bindings/sql.d.ts.map +1 -1
- package/dist/src/bindings/sql.js +36 -0
- package/dist/src/bindings/sql.js.map +1 -1
- package/dist/src/compilers/javascript.d.ts +2 -0
- package/dist/src/compilers/javascript.d.ts.map +1 -1
- package/dist/src/compilers/javascript.js +41 -13
- package/dist/src/compilers/javascript.js.map +1 -1
- package/dist/src/compilers/ruby.d.ts +2 -0
- package/dist/src/compilers/ruby.d.ts.map +1 -1
- package/dist/src/compilers/ruby.js +39 -13
- package/dist/src/compilers/ruby.js.map +1 -1
- package/dist/src/compilers/sql.js +12 -5
- package/dist/src/compilers/sql.js.map +1 -1
- package/dist/src/eloc.js +10 -4
- package/dist/src/eloc.js.map +1 -1
- package/dist/src/ir.d.ts +23 -4
- package/dist/src/ir.d.ts.map +1 -1
- package/dist/src/ir.js +12 -2
- package/dist/src/ir.js.map +1 -1
- package/dist/src/parser.d.ts +52 -1
- package/dist/src/parser.d.ts.map +1 -1
- package/dist/src/parser.js +253 -8
- package/dist/src/parser.js.map +1 -1
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/runtime.js +12 -0
- package/dist/src/runtime.js.map +1 -1
- package/dist/src/transform.d.ts.map +1 -1
- package/dist/src/transform.js +15 -3
- package/dist/src/transform.js.map +1 -1
- package/dist/src/typedefs.d.ts.map +1 -1
- package/dist/src/typedefs.js +11 -0
- package/dist/src/typedefs.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -225
- package/dist/src/cli.js.map +0 -1
- package/dist/src/eval.d.ts +0 -3
- package/dist/src/eval.d.ts.map +0 -1
- package/dist/src/eval.js +0 -196
- package/dist/src/eval.js.map +0 -1
package/dist/src/eval.js
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const fs_1 = require("fs");
|
|
8
|
-
const parser_1 = require("./parser");
|
|
9
|
-
const javascript_1 = require("./compilers/javascript");
|
|
10
|
-
const dayjs_1 = __importDefault(require("dayjs"));
|
|
11
|
-
const duration_1 = __importDefault(require("dayjs/plugin/duration"));
|
|
12
|
-
const isoWeek_1 = __importDefault(require("dayjs/plugin/isoWeek"));
|
|
13
|
-
const quarterOfYear_1 = __importDefault(require("dayjs/plugin/quarterOfYear"));
|
|
14
|
-
dayjs_1.default.extend(duration_1.default);
|
|
15
|
-
dayjs_1.default.extend(isoWeek_1.default);
|
|
16
|
-
dayjs_1.default.extend(quarterOfYear_1.default);
|
|
17
|
-
function parseArgs(args) {
|
|
18
|
-
const options = {};
|
|
19
|
-
for (let i = 0; i < args.length; i++) {
|
|
20
|
-
const arg = args[i];
|
|
21
|
-
switch (arg) {
|
|
22
|
-
case '-e':
|
|
23
|
-
case '--expression':
|
|
24
|
-
options.expression = args[++i];
|
|
25
|
-
break;
|
|
26
|
-
case '-d':
|
|
27
|
-
case '--data':
|
|
28
|
-
options.inputData = args[++i];
|
|
29
|
-
break;
|
|
30
|
-
case '--stdin':
|
|
31
|
-
options.stdinData = true;
|
|
32
|
-
break;
|
|
33
|
-
case '-h':
|
|
34
|
-
case '--help':
|
|
35
|
-
printHelp();
|
|
36
|
-
process.exit(0);
|
|
37
|
-
break;
|
|
38
|
-
case '-':
|
|
39
|
-
// Read expression from stdin
|
|
40
|
-
options.inputFile = '-';
|
|
41
|
-
break;
|
|
42
|
-
default:
|
|
43
|
-
// If it doesn't start with -, treat it as input file
|
|
44
|
-
if (!arg.startsWith('-') && !options.inputFile && !options.expression) {
|
|
45
|
-
options.inputFile = arg;
|
|
46
|
-
}
|
|
47
|
-
else if (!arg.startsWith('-')) {
|
|
48
|
-
console.error(`Unknown argument: ${arg}`);
|
|
49
|
-
printHelp();
|
|
50
|
-
process.exit(1);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return options;
|
|
55
|
-
}
|
|
56
|
-
function printHelp() {
|
|
57
|
-
console.log(`
|
|
58
|
-
Elo Evaluator (elo) - Evaluate Elo expressions
|
|
59
|
-
|
|
60
|
-
Usage:
|
|
61
|
-
elo [options] [input-file]
|
|
62
|
-
|
|
63
|
-
Options:
|
|
64
|
-
-e, --expression <expr> Expression to evaluate (like ruby -e)
|
|
65
|
-
-d, --data <json> JSON input data for _ variable (or @file to read from file)
|
|
66
|
-
--stdin Read input data as JSON from stdin
|
|
67
|
-
-h, --help Show this help message
|
|
68
|
-
|
|
69
|
-
Examples:
|
|
70
|
-
# Evaluate a simple expression
|
|
71
|
-
elo -e "2 + 3 * 4"
|
|
72
|
-
|
|
73
|
-
# Evaluate with input data
|
|
74
|
-
elo -e "_.x + _.y" -d '{"x": 1, "y": 2}'
|
|
75
|
-
|
|
76
|
-
# Evaluate with input data from file
|
|
77
|
-
elo -e "_.name" -d @data.json
|
|
78
|
-
|
|
79
|
-
# Evaluate from .elo file
|
|
80
|
-
elo expressions.elo
|
|
81
|
-
|
|
82
|
-
# Pipe data through stdin
|
|
83
|
-
echo '{"x": 10}' | elo -e "_.x * 2" --stdin
|
|
84
|
-
|
|
85
|
-
# Read expression from stdin
|
|
86
|
-
echo "2 + 3" | elo -
|
|
87
|
-
`);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Parse input data from CLI option (JSON string or @file path)
|
|
91
|
-
*/
|
|
92
|
-
function parseInputData(inputData) {
|
|
93
|
-
let jsonString = inputData;
|
|
94
|
-
// If starts with @, read from file
|
|
95
|
-
if (inputData.startsWith('@')) {
|
|
96
|
-
const filePath = inputData.slice(1);
|
|
97
|
-
try {
|
|
98
|
-
jsonString = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
console.error(`Error reading input file ${filePath}: ${error}`);
|
|
102
|
-
process.exit(1);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
return JSON.parse(jsonString);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
console.error(`Error parsing input JSON: ${error}`);
|
|
110
|
-
process.exit(1);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Compile and evaluate a single Elo expression
|
|
115
|
-
*/
|
|
116
|
-
function evaluate(source, inputValue) {
|
|
117
|
-
const ast = (0, parser_1.parse)(source);
|
|
118
|
-
const result = (0, javascript_1.compileToJavaScriptWithMeta)(ast);
|
|
119
|
-
// Create function with dayjs in scope
|
|
120
|
-
// The compiled code is always a function that takes _ as input
|
|
121
|
-
const execFn = new Function('dayjs', `return ${result.code}`);
|
|
122
|
-
const fn = execFn(dayjs_1.default);
|
|
123
|
-
return fn(inputValue);
|
|
124
|
-
}
|
|
125
|
-
function main() {
|
|
126
|
-
const args = process.argv.slice(2);
|
|
127
|
-
if (args.length === 0) {
|
|
128
|
-
printHelp();
|
|
129
|
-
process.exit(0);
|
|
130
|
-
}
|
|
131
|
-
const options = parseArgs(args);
|
|
132
|
-
// Get the source expression(s)
|
|
133
|
-
let sources;
|
|
134
|
-
if (options.expression) {
|
|
135
|
-
sources = [options.expression];
|
|
136
|
-
}
|
|
137
|
-
else if (options.inputFile) {
|
|
138
|
-
try {
|
|
139
|
-
// Use file descriptor 0 for stdin when input is '-'
|
|
140
|
-
const content = options.inputFile === '-'
|
|
141
|
-
? (0, fs_1.readFileSync)(0, 'utf-8')
|
|
142
|
-
: (0, fs_1.readFileSync)(options.inputFile, 'utf-8');
|
|
143
|
-
// Split into lines - keep all lines but mark empty/comment lines as null
|
|
144
|
-
sources = content.split('\n').map(line => {
|
|
145
|
-
const trimmed = line.trim();
|
|
146
|
-
return (trimmed === '' || trimmed.startsWith('#')) ? '' : line;
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
console.error(`Error reading ${options.inputFile === '-' ? 'stdin' : `file ${options.inputFile}`}: ${error}`);
|
|
151
|
-
process.exit(1);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
console.error('Error: Must provide either -e <expression>, an input file, or - for stdin');
|
|
156
|
-
printHelp();
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
159
|
-
// Get input data
|
|
160
|
-
let inputValue = null;
|
|
161
|
-
if (options.stdinData) {
|
|
162
|
-
try {
|
|
163
|
-
const stdinContent = (0, fs_1.readFileSync)(0, 'utf-8');
|
|
164
|
-
inputValue = JSON.parse(stdinContent);
|
|
165
|
-
}
|
|
166
|
-
catch (error) {
|
|
167
|
-
console.error(`Error reading/parsing stdin: ${error}`);
|
|
168
|
-
process.exit(1);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
else if (options.inputData) {
|
|
172
|
-
inputValue = parseInputData(options.inputData);
|
|
173
|
-
}
|
|
174
|
-
// Evaluate each expression
|
|
175
|
-
const outputs = [];
|
|
176
|
-
for (let i = 0; i < sources.length; i++) {
|
|
177
|
-
const source = sources[i];
|
|
178
|
-
const trimmed = source.trim();
|
|
179
|
-
// Skip empty lines and comments
|
|
180
|
-
if (trimmed === '' || trimmed.startsWith('#')) {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
try {
|
|
184
|
-
const result = evaluate(trimmed, inputValue);
|
|
185
|
-
outputs.push(JSON.stringify(result));
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
console.error(`Error on line ${i + 1}: ${error}`);
|
|
189
|
-
process.exit(1);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// Output results
|
|
193
|
-
console.log(outputs.join('\n'));
|
|
194
|
-
}
|
|
195
|
-
main();
|
|
196
|
-
//# sourceMappingURL=eval.js.map
|
package/dist/src/eval.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/eval.ts"],"names":[],"mappings":"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"}
|