simplex-lang 0.0.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/README.md +32 -0
- package/build/src/compiler.d.ts +34 -0
- package/build/src/compiler.js +347 -0
- package/build/src/compiler.js.map +1 -0
- package/build/src/errors.d.ts +11 -0
- package/build/src/errors.js +18 -0
- package/build/src/errors.js.map +1 -0
- package/build/src/index.d.ts +3 -0
- package/build/src/index.js +4 -0
- package/build/src/index.js.map +1 -0
- package/build/src/simplex-tree.d.ts +111 -0
- package/build/src/simplex-tree.js +2 -0
- package/build/src/simplex-tree.js.map +1 -0
- package/build/src/utils.d.ts +15 -0
- package/build/src/utils.js +98 -0
- package/build/src/utils.js.map +1 -0
- package/package.json +80 -0
- package/parser/index.d.ts +209 -0
- package/parser/index.js +5114 -0
- package/parser/index.js.map +1 -0
- package/parser/package.json +7 -0
- package/src/compiler.ts +538 -0
- package/src/errors.ts +21 -0
- package/src/index.ts +3 -0
- package/src/simplex-tree.ts +155 -0
- package/src/simplex.peggy +710 -0
- package/src/utils.ts +119 -0
package/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# SimplEx <!-- omit in toc -->
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/simplex-lang)
|
|
4
|
+
[](https://github.com/wmakeev/simplex/actions/workflows/main.yml)
|
|
5
|
+
<!-- [](https://app.codecov.io/gh/wmakeev/simplex/tree/master/) -->
|
|
6
|
+

|
|
7
|
+
[](https://peggyjs.org/)
|
|
8
|
+
|
|
9
|
+
> **SimpEx** - javascript **Simpl**e **Ex**pression language
|
|
10
|
+
|
|
11
|
+
## Table of contents <!-- omit in toc -->
|
|
12
|
+
|
|
13
|
+
- [Quick start](#quick-start)
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { compile } from 'simplex-lang'
|
|
19
|
+
|
|
20
|
+
const fn = compile(`(a + b) * min(a, b) + 10`, {
|
|
21
|
+
globals: {
|
|
22
|
+
min: Math.min
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const result = fn({ a: 2, b: 3 })
|
|
27
|
+
|
|
28
|
+
console.log(result)
|
|
29
|
+
// ↳ 20
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
<img alt="In the process of development" src="under-construction.png"/>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BinaryExpression, ExpressionStatement, Location, LogicalExpression, UnaryExpression } from './simplex-tree.js';
|
|
2
|
+
interface ContextHelpers<Data, Globals> {
|
|
3
|
+
castToBoolean(this: void, val: unknown): boolean;
|
|
4
|
+
ensureFunction(this: void, val: unknown): Function;
|
|
5
|
+
getIdentifierValue(this: void, identifierName: string, globals: Globals, data: Data): unknown;
|
|
6
|
+
getProperty(this: void, obj: unknown, key: unknown): unknown;
|
|
7
|
+
callFunction(this: void, fn: unknown, args: unknown[] | null): unknown;
|
|
8
|
+
pipe(this: void, head: unknown, tail: {
|
|
9
|
+
opt: boolean;
|
|
10
|
+
next: (_: unknown) => unknown;
|
|
11
|
+
}[]): unknown;
|
|
12
|
+
}
|
|
13
|
+
type ExpressionUnaryOperators = Record<UnaryExpression['operator'], (val: unknown) => unknown>;
|
|
14
|
+
export declare const defaultUnaryOperators: ExpressionUnaryOperators;
|
|
15
|
+
type ExpressionBinaryOperators = Record<BinaryExpression['operator'] | LogicalExpression['operator'], (left: unknown, right: unknown) => unknown>;
|
|
16
|
+
export declare const defaultBinaryOperators: ExpressionBinaryOperators;
|
|
17
|
+
interface ExpressionOperators {
|
|
18
|
+
unaryOperators: Record<UnaryExpression['operator'], (val: unknown) => unknown>;
|
|
19
|
+
binaryOperators: Record<BinaryExpression['operator'] | LogicalExpression['operator'], (left: unknown, right: unknown) => unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface SourceLocation {
|
|
22
|
+
len: number;
|
|
23
|
+
location: Location;
|
|
24
|
+
}
|
|
25
|
+
export interface VisitResult {
|
|
26
|
+
code: string;
|
|
27
|
+
offsets: SourceLocation[];
|
|
28
|
+
}
|
|
29
|
+
export declare function traverse(tree: ExpressionStatement): VisitResult;
|
|
30
|
+
export type CompileOptions<Data, Globals> = Partial<ContextHelpers<Data, Globals> & ExpressionOperators & {
|
|
31
|
+
globals: Globals;
|
|
32
|
+
}>;
|
|
33
|
+
export declare function compile<Data = Record<string, unknown>, Globals = null>(expression: string, options?: CompileOptions<Data, Globals>): (data?: Data) => unknown;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { parse } from '@project/simplex-parser';
|
|
2
|
+
import { ExpressionError, UnexpectedTypeError } from './errors.js';
|
|
3
|
+
import { bool, ensureFunction, isSimple, num, prettyType, relComp, toStr } from './utils.js';
|
|
4
|
+
import assert from 'node:assert';
|
|
5
|
+
var hasOwn = Object.hasOwn;
|
|
6
|
+
var ERROR_STACK_REGEX = /<anonymous>:(?<row>\d+):(?<col>\d+)/g;
|
|
7
|
+
const defaultContextHelpers = {
|
|
8
|
+
castToBoolean: bool,
|
|
9
|
+
ensureFunction,
|
|
10
|
+
getIdentifierValue: (identifierName, globals, data) => {
|
|
11
|
+
if (identifierName === 'undefined')
|
|
12
|
+
return undefined;
|
|
13
|
+
if (globals != null && Object.hasOwn(globals, identifierName)) {
|
|
14
|
+
return globals[identifierName];
|
|
15
|
+
}
|
|
16
|
+
if (data != null && Object.hasOwn(data, identifierName)) {
|
|
17
|
+
return data[identifierName];
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`Unknown identifier - ${identifierName}`);
|
|
20
|
+
},
|
|
21
|
+
getProperty(obj, key) {
|
|
22
|
+
if (obj == null)
|
|
23
|
+
return obj;
|
|
24
|
+
if (typeof obj !== 'object') {
|
|
25
|
+
throw new UnexpectedTypeError('object', prettyType(obj));
|
|
26
|
+
}
|
|
27
|
+
if (isSimple(key) === false) {
|
|
28
|
+
throw new UnexpectedTypeError('object key to be simple type', prettyType(key));
|
|
29
|
+
}
|
|
30
|
+
if (hasOwn(obj, key)) {
|
|
31
|
+
// @ts-expect-error Type cannot be used as an index type
|
|
32
|
+
return obj[key];
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
},
|
|
36
|
+
callFunction(fn, args) {
|
|
37
|
+
return (args === null
|
|
38
|
+
? ensureFunction(fn)()
|
|
39
|
+
: ensureFunction(fn).apply(null, args));
|
|
40
|
+
},
|
|
41
|
+
pipe(head, tail) {
|
|
42
|
+
var result = head;
|
|
43
|
+
for (const it of tail) {
|
|
44
|
+
if (it.opt && result == null)
|
|
45
|
+
return result;
|
|
46
|
+
result = it.next(result);
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
export const defaultUnaryOperators = {
|
|
52
|
+
'+': val => num(val),
|
|
53
|
+
'-': val => -num(val),
|
|
54
|
+
'not': val => !bool(val),
|
|
55
|
+
'typeof': val => typeof val
|
|
56
|
+
};
|
|
57
|
+
export const defaultBinaryOperators = {
|
|
58
|
+
'!=': (a, b) => a !== b,
|
|
59
|
+
'==': (a, b) => a === b,
|
|
60
|
+
'*': (a, b) => num(a) * num(b),
|
|
61
|
+
'+': (a, b) => num(a) + num(b),
|
|
62
|
+
'&': (a, b) => toStr(a) + toStr(b),
|
|
63
|
+
'-': (a, b) => num(a) - num(b),
|
|
64
|
+
'/': (a, b) => num(a) / num(b),
|
|
65
|
+
'mod': (a, b) => {
|
|
66
|
+
return num(a) % num(b);
|
|
67
|
+
},
|
|
68
|
+
'<': (a, b) => relComp(a) < relComp(b),
|
|
69
|
+
'<=': (a, b) => relComp(a) <= relComp(b),
|
|
70
|
+
'>': (a, b) => relComp(a) > relComp(b),
|
|
71
|
+
'>=': (a, b) => relComp(a) >= relComp(b),
|
|
72
|
+
'in': (a, b) => {
|
|
73
|
+
if (isSimple(a) && b != null && typeof b === 'object') {
|
|
74
|
+
return Object.hasOwn(b, a);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw new TypeError(`Cannot use "in" operator to search for ${prettyType(a)} key in ${prettyType(b)}`);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
'^': (a, b) => num(a) ** num(b),
|
|
81
|
+
'and': (a, b) => bool(a) && bool(b),
|
|
82
|
+
'or': (a, b) => bool(a) || bool(b)
|
|
83
|
+
};
|
|
84
|
+
const PIPE_LTR = '_';
|
|
85
|
+
const codePart = (codePart, ownerNode) => ({
|
|
86
|
+
code: codePart,
|
|
87
|
+
offsets: [{ len: codePart.length, location: ownerNode.location }]
|
|
88
|
+
});
|
|
89
|
+
const combineVisitResults = (parts) => {
|
|
90
|
+
return parts.reduce((res, it) => {
|
|
91
|
+
return {
|
|
92
|
+
code: res.code + it.code,
|
|
93
|
+
offsets: res.offsets.concat(it.offsets)
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const visitors = {
|
|
98
|
+
Literal: node => {
|
|
99
|
+
const parts = [codePart(JSON.stringify(node.value), node)];
|
|
100
|
+
return parts;
|
|
101
|
+
},
|
|
102
|
+
Identifier: node => {
|
|
103
|
+
if (node.name === PIPE_LTR)
|
|
104
|
+
return [codePart(PIPE_LTR, node)];
|
|
105
|
+
const parts = [
|
|
106
|
+
codePart(`get(${JSON.stringify(node.name)})`, node)
|
|
107
|
+
];
|
|
108
|
+
return parts;
|
|
109
|
+
},
|
|
110
|
+
UnaryExpression: (node, visit) => {
|
|
111
|
+
const parts = [
|
|
112
|
+
codePart(`uop["${node.operator}"](`, node),
|
|
113
|
+
...visit(node.argument),
|
|
114
|
+
codePart(')', node)
|
|
115
|
+
];
|
|
116
|
+
return parts;
|
|
117
|
+
},
|
|
118
|
+
BinaryExpression: (node, visit) => {
|
|
119
|
+
const parts = [
|
|
120
|
+
codePart(`bop["${node.operator}"](`, node),
|
|
121
|
+
...visit(node.left),
|
|
122
|
+
codePart(',', node),
|
|
123
|
+
...visit(node.right),
|
|
124
|
+
codePart(')', node)
|
|
125
|
+
];
|
|
126
|
+
return parts;
|
|
127
|
+
},
|
|
128
|
+
LogicalExpression: (node, visit) => {
|
|
129
|
+
const parts = [
|
|
130
|
+
codePart(`bop["${node.operator}"](`, node),
|
|
131
|
+
...visit(node.left),
|
|
132
|
+
codePart(',', node),
|
|
133
|
+
...visit(node.right),
|
|
134
|
+
codePart(')', node)
|
|
135
|
+
];
|
|
136
|
+
return parts;
|
|
137
|
+
},
|
|
138
|
+
ConditionalExpression: (node, visit) => {
|
|
139
|
+
const parts = [
|
|
140
|
+
codePart('(bool(', node),
|
|
141
|
+
...visit(node.test),
|
|
142
|
+
codePart(')?', node),
|
|
143
|
+
...visit(node.consequent),
|
|
144
|
+
codePart(':', node),
|
|
145
|
+
...(node.alternate !== null
|
|
146
|
+
? visit(node.alternate)
|
|
147
|
+
: [codePart('undefined', node)]),
|
|
148
|
+
codePart(')', node)
|
|
149
|
+
];
|
|
150
|
+
return parts;
|
|
151
|
+
},
|
|
152
|
+
ObjectExpression: (node, visit) => {
|
|
153
|
+
const innerObj = node.properties
|
|
154
|
+
.map((p) => {
|
|
155
|
+
if (p.key.type === 'Identifier') {
|
|
156
|
+
return [codePart(p.key.name, p), visit(p.value)];
|
|
157
|
+
}
|
|
158
|
+
//
|
|
159
|
+
else if (p.key.type === 'Literal') {
|
|
160
|
+
// TODO look for ECMA spec
|
|
161
|
+
return [codePart(JSON.stringify(p.key.value), p), visit(p.value)];
|
|
162
|
+
}
|
|
163
|
+
//
|
|
164
|
+
else {
|
|
165
|
+
// TODO Restrict on parse step
|
|
166
|
+
// TODO Error with locations
|
|
167
|
+
throw new TypeError(`Incorrect object key type ${p.key.type}`);
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
.flatMap(([k, v]) => {
|
|
171
|
+
return [k, codePart(':', node), ...v, codePart(',', node)];
|
|
172
|
+
});
|
|
173
|
+
// remove last comma
|
|
174
|
+
if (innerObj.length > 1) {
|
|
175
|
+
innerObj.pop();
|
|
176
|
+
}
|
|
177
|
+
const parts = [
|
|
178
|
+
codePart('{', node),
|
|
179
|
+
...innerObj,
|
|
180
|
+
codePart('}', node)
|
|
181
|
+
];
|
|
182
|
+
return parts;
|
|
183
|
+
},
|
|
184
|
+
ArrayExpression: (node, visit) => {
|
|
185
|
+
const innerArrParts = node.elements.flatMap(el => {
|
|
186
|
+
return el === null
|
|
187
|
+
? [codePart(',', node)]
|
|
188
|
+
: [...visit(el), codePart(',', node)];
|
|
189
|
+
});
|
|
190
|
+
// remove last comma
|
|
191
|
+
if (innerArrParts.length > 1) {
|
|
192
|
+
innerArrParts.pop();
|
|
193
|
+
}
|
|
194
|
+
const parts = [
|
|
195
|
+
codePart('[', node),
|
|
196
|
+
...innerArrParts,
|
|
197
|
+
codePart(']', node)
|
|
198
|
+
];
|
|
199
|
+
return parts;
|
|
200
|
+
},
|
|
201
|
+
MemberExpression: (node, visit) => {
|
|
202
|
+
const { computed, object, property } = node;
|
|
203
|
+
// TODO Pass computed to prop?
|
|
204
|
+
const parts = [
|
|
205
|
+
codePart('prop(', node),
|
|
206
|
+
...visit(object),
|
|
207
|
+
codePart(',', node),
|
|
208
|
+
...(computed
|
|
209
|
+
? visit(property)
|
|
210
|
+
: [codePart(JSON.stringify(property.name), property)]),
|
|
211
|
+
codePart(')', node)
|
|
212
|
+
];
|
|
213
|
+
return parts;
|
|
214
|
+
},
|
|
215
|
+
CallExpression: (node, visit) => {
|
|
216
|
+
const innerArgs = node.arguments.length > 0
|
|
217
|
+
? node.arguments.flatMap(arg => [...visit(arg), codePart(',', node)])
|
|
218
|
+
: null;
|
|
219
|
+
// remove last comma
|
|
220
|
+
innerArgs?.pop();
|
|
221
|
+
const parts = [
|
|
222
|
+
codePart('call(', node),
|
|
223
|
+
...visit(node.callee),
|
|
224
|
+
codePart(',', node),
|
|
225
|
+
...(innerArgs === null
|
|
226
|
+
? [codePart('null', node)]
|
|
227
|
+
: [codePart('[', node), ...innerArgs, codePart(']', node)]),
|
|
228
|
+
codePart(')', node)
|
|
229
|
+
];
|
|
230
|
+
return parts;
|
|
231
|
+
},
|
|
232
|
+
NullishCoalescingExpression: (node, visit) => {
|
|
233
|
+
const parts = [
|
|
234
|
+
codePart('(', node),
|
|
235
|
+
...visit(node.left),
|
|
236
|
+
codePart('??', node),
|
|
237
|
+
...visit(node.right),
|
|
238
|
+
codePart(')', node)
|
|
239
|
+
];
|
|
240
|
+
return parts;
|
|
241
|
+
},
|
|
242
|
+
PipeSequence: (node, visit) => {
|
|
243
|
+
const headCode = visit(node.head);
|
|
244
|
+
const tailsCodeArrInner = node.tail.flatMap(t => {
|
|
245
|
+
const opt = t.operator === '|?';
|
|
246
|
+
const tailParts = [
|
|
247
|
+
codePart(`{opt:${opt},next:function(${PIPE_LTR}){return `, t.expression),
|
|
248
|
+
...visit(t.expression),
|
|
249
|
+
codePart(`}}`, t.expression),
|
|
250
|
+
codePart(`,`, t.expression)
|
|
251
|
+
];
|
|
252
|
+
return tailParts;
|
|
253
|
+
});
|
|
254
|
+
// remove last comma
|
|
255
|
+
tailsCodeArrInner.pop();
|
|
256
|
+
const parts = [
|
|
257
|
+
codePart('pipe(', node),
|
|
258
|
+
...headCode,
|
|
259
|
+
codePart(',[', node),
|
|
260
|
+
...tailsCodeArrInner,
|
|
261
|
+
codePart('])', node)
|
|
262
|
+
];
|
|
263
|
+
return parts;
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const visit = node => {
|
|
267
|
+
const nodeTypeVisitor = visitors[node.type];
|
|
268
|
+
if (nodeTypeVisitor === undefined) {
|
|
269
|
+
throw new Error(`No handler for node type - ${node.type}`);
|
|
270
|
+
}
|
|
271
|
+
const innerVisit = (childNode) => {
|
|
272
|
+
return visit(childNode, node);
|
|
273
|
+
};
|
|
274
|
+
// @ts-expect-error skip node is never
|
|
275
|
+
return nodeTypeVisitor(node, innerVisit);
|
|
276
|
+
};
|
|
277
|
+
export function traverse(tree) {
|
|
278
|
+
return combineVisitResults(visit(tree.expression, null));
|
|
279
|
+
}
|
|
280
|
+
function getExpressionErrorLocation(colOffset, locations) {
|
|
281
|
+
var curCol = 0;
|
|
282
|
+
for (const loc of locations) {
|
|
283
|
+
curCol += loc.len;
|
|
284
|
+
if (curCol >= colOffset)
|
|
285
|
+
return loc.location;
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
export function compile(expression, options) {
|
|
290
|
+
const tree = parse(expression);
|
|
291
|
+
const traverseResult = traverse(tree);
|
|
292
|
+
const { code: expressionCode, offsets } = traverseResult;
|
|
293
|
+
const bootstrapCodeHead = [
|
|
294
|
+
`var bool = ctx.castToBoolean;`,
|
|
295
|
+
`var bop = ctx.binaryOperators;`,
|
|
296
|
+
`var uop = ctx.unaryOperators;`,
|
|
297
|
+
`var call = ctx.callFunction;`,
|
|
298
|
+
`var getIdentifierValue = ctx.getIdentifierValue;`,
|
|
299
|
+
`var prop = ctx.getProperty;`,
|
|
300
|
+
`var pipe = ctx.pipe;`,
|
|
301
|
+
`var globals = ctx.globals ?? null;`,
|
|
302
|
+
`return data => {`,
|
|
303
|
+
`var get = name => getIdentifierValue(name, globals, data);`,
|
|
304
|
+
`return `
|
|
305
|
+
].join('');
|
|
306
|
+
const bootstrapCodeHeadLen = bootstrapCodeHead.length;
|
|
307
|
+
const functionCode = bootstrapCodeHead + expressionCode + ';}';
|
|
308
|
+
const func = new Function('ctx', functionCode)({
|
|
309
|
+
...defaultContextHelpers,
|
|
310
|
+
...{
|
|
311
|
+
unaryOperators: defaultUnaryOperators,
|
|
312
|
+
binaryOperators: defaultBinaryOperators
|
|
313
|
+
},
|
|
314
|
+
...options
|
|
315
|
+
});
|
|
316
|
+
return function (data) {
|
|
317
|
+
try {
|
|
318
|
+
return func(data);
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
assert.ok(err instanceof Error);
|
|
322
|
+
const stackRows = err.stack?.split('\n').map(row => row.trim());
|
|
323
|
+
const evalRow = stackRows?.find(row => row.startsWith('at eval '));
|
|
324
|
+
if (evalRow === undefined) {
|
|
325
|
+
throw err;
|
|
326
|
+
}
|
|
327
|
+
ERROR_STACK_REGEX.lastIndex = 0;
|
|
328
|
+
const match = ERROR_STACK_REGEX.exec(evalRow);
|
|
329
|
+
if (match == null) {
|
|
330
|
+
throw err;
|
|
331
|
+
}
|
|
332
|
+
const rowOffsetStr = match.groups?.['row'];
|
|
333
|
+
const colOffsetStr = match.groups?.['col'];
|
|
334
|
+
if (rowOffsetStr === undefined || colOffsetStr === undefined) {
|
|
335
|
+
throw err;
|
|
336
|
+
}
|
|
337
|
+
const rowOffset = Number.parseInt(rowOffsetStr);
|
|
338
|
+
assert.equal(rowOffset, 3);
|
|
339
|
+
const colOffset = Number.parseInt(colOffsetStr);
|
|
340
|
+
const adjustedColOffset = colOffset - bootstrapCodeHeadLen;
|
|
341
|
+
assert.ok(adjustedColOffset >= 0);
|
|
342
|
+
const errorLocation = getExpressionErrorLocation(adjustedColOffset, offsets);
|
|
343
|
+
throw new ExpressionError(err, errorLocation);
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Location } from './simplex-tree.js';
|
|
2
|
+
export declare class ExpressionError extends Error {
|
|
3
|
+
location: Location | null;
|
|
4
|
+
constructor(error: Error, location: Location | null);
|
|
5
|
+
}
|
|
6
|
+
export declare class UnexpectedTypeError extends TypeError {
|
|
7
|
+
expectedType: string;
|
|
8
|
+
receivedType: string;
|
|
9
|
+
I18N_STRING: string;
|
|
10
|
+
constructor(expectedType: string, receivedType: string);
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class ExpressionError extends Error {
|
|
2
|
+
location;
|
|
3
|
+
constructor(error, location) {
|
|
4
|
+
super(error.message, { cause: error });
|
|
5
|
+
this.location = location;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class UnexpectedTypeError extends TypeError {
|
|
9
|
+
expectedType;
|
|
10
|
+
receivedType;
|
|
11
|
+
I18N_STRING = 'UNEXPECTED_TYPE';
|
|
12
|
+
constructor(expectedType, receivedType) {
|
|
13
|
+
super(`Expected ${expectedType}, but got ${receivedType} instead.`);
|
|
14
|
+
this.expectedType = expectedType;
|
|
15
|
+
this.receivedType = receivedType;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAG/B;IAFT,YACE,KAAY,EACL,QAAyB;QAEhC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAF/B,aAAQ,GAAR,QAAQ,CAAiB;IAGlC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IAIvC;IACA;IAJT,WAAW,GAAG,iBAAiB,CAAA;IAE/B,YACS,YAAoB,EACpB,YAAoB;QAE3B,KAAK,CAAC,YAAY,YAAY,aAAa,YAAY,WAAW,CAAC,CAAA;QAH5D,iBAAY,GAAZ,YAAY,CAAQ;QACpB,iBAAY,GAAZ,YAAY,CAAQ;IAG7B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export type Expression = ArrayExpression | BinaryExpression | CallExpression | ConditionalExpression | IdentifierExpression | LogicalExpression | LiteralExpression | MemberExpression | ObjectExpression | NullishCoalescingExpression | PipeSequence | UnaryExpression;
|
|
2
|
+
export type ExpressionType = Expression['type'];
|
|
3
|
+
export type ExpressionByType = {
|
|
4
|
+
[P in ExpressionType]: Extract<Expression, {
|
|
5
|
+
type: P;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
export interface LocationOffset {
|
|
9
|
+
offset: number;
|
|
10
|
+
line: number;
|
|
11
|
+
column: number;
|
|
12
|
+
}
|
|
13
|
+
export interface Location {
|
|
14
|
+
start: LocationOffset;
|
|
15
|
+
end: LocationOffset;
|
|
16
|
+
}
|
|
17
|
+
export interface ExpressionStatement {
|
|
18
|
+
type: 'ExpressionStatement';
|
|
19
|
+
expression: Expression;
|
|
20
|
+
location: Location;
|
|
21
|
+
}
|
|
22
|
+
export interface LiteralExpression {
|
|
23
|
+
type: 'Literal';
|
|
24
|
+
value: string | number | null | boolean;
|
|
25
|
+
location: Location;
|
|
26
|
+
}
|
|
27
|
+
export interface IdentifierExpression {
|
|
28
|
+
type: 'Identifier';
|
|
29
|
+
name: string;
|
|
30
|
+
location: Location;
|
|
31
|
+
}
|
|
32
|
+
export interface PropertyAssignment {
|
|
33
|
+
type: 'Property';
|
|
34
|
+
key: Expression;
|
|
35
|
+
value: Expression;
|
|
36
|
+
kind: 'init';
|
|
37
|
+
location: Location;
|
|
38
|
+
}
|
|
39
|
+
export interface ObjectExpression {
|
|
40
|
+
type: 'ObjectExpression';
|
|
41
|
+
properties: PropertyAssignment[];
|
|
42
|
+
location: Location;
|
|
43
|
+
}
|
|
44
|
+
export interface ArrayExpression {
|
|
45
|
+
type: 'ArrayExpression';
|
|
46
|
+
elements: (Expression | null)[];
|
|
47
|
+
location: Location;
|
|
48
|
+
}
|
|
49
|
+
export type MemberExpression = {
|
|
50
|
+
type: 'MemberExpression';
|
|
51
|
+
computed: false;
|
|
52
|
+
object: IdentifierExpression | ObjectExpression | ArrayExpression;
|
|
53
|
+
property: IdentifierExpression;
|
|
54
|
+
location: Location;
|
|
55
|
+
} | {
|
|
56
|
+
type: 'MemberExpression';
|
|
57
|
+
computed: true;
|
|
58
|
+
object: IdentifierExpression | ObjectExpression | ArrayExpression;
|
|
59
|
+
property: Expression;
|
|
60
|
+
location: Location;
|
|
61
|
+
};
|
|
62
|
+
export interface CallExpression {
|
|
63
|
+
type: 'CallExpression';
|
|
64
|
+
callee: Expression;
|
|
65
|
+
arguments: Expression[];
|
|
66
|
+
location: Location;
|
|
67
|
+
}
|
|
68
|
+
export interface UnaryExpression {
|
|
69
|
+
type: 'UnaryExpression';
|
|
70
|
+
operator: '-' | '+' | 'not' | 'typeof';
|
|
71
|
+
argument: Expression;
|
|
72
|
+
prefix: true;
|
|
73
|
+
location: Location;
|
|
74
|
+
}
|
|
75
|
+
export interface BinaryExpression {
|
|
76
|
+
type: 'BinaryExpression';
|
|
77
|
+
operator: '+' | '-' | '*' | '/' | 'mod' | '==' | '!=' | '>' | '>=' | '<' | '<=' | 'in' | '^' | '&';
|
|
78
|
+
left: Expression;
|
|
79
|
+
right: Expression;
|
|
80
|
+
location: Location;
|
|
81
|
+
}
|
|
82
|
+
export interface LogicalExpression {
|
|
83
|
+
type: 'LogicalExpression';
|
|
84
|
+
operator: 'and' | 'or';
|
|
85
|
+
left: Expression;
|
|
86
|
+
right: Expression;
|
|
87
|
+
location: Location;
|
|
88
|
+
}
|
|
89
|
+
export interface ConditionalExpression {
|
|
90
|
+
type: 'ConditionalExpression';
|
|
91
|
+
test: Expression;
|
|
92
|
+
consequent: Expression;
|
|
93
|
+
alternate: Expression | null;
|
|
94
|
+
location: Location;
|
|
95
|
+
}
|
|
96
|
+
export interface NullishCoalescingExpression {
|
|
97
|
+
type: 'NullishCoalescingExpression';
|
|
98
|
+
operator: '??';
|
|
99
|
+
left: Expression;
|
|
100
|
+
right: Expression;
|
|
101
|
+
location: Location;
|
|
102
|
+
}
|
|
103
|
+
export interface PipeSequence {
|
|
104
|
+
type: 'PipeSequence';
|
|
105
|
+
head: Expression;
|
|
106
|
+
tail: {
|
|
107
|
+
operator: '|?' | '|';
|
|
108
|
+
expression: Expression;
|
|
109
|
+
}[];
|
|
110
|
+
location: Location;
|
|
111
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplex-tree.js","sourceRoot":"","sources":["../../src/simplex-tree.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts instances of Number, String and Boolean to primitives
|
|
3
|
+
*/
|
|
4
|
+
export declare function unbox(value: unknown): {} | null | undefined;
|
|
5
|
+
export declare function num(val: unknown): number;
|
|
6
|
+
export declare function toStr(val: unknown): string;
|
|
7
|
+
export declare function relComp(val: unknown): number | string | bigint;
|
|
8
|
+
export declare function bool(val: unknown): boolean;
|
|
9
|
+
export declare function ensureFunction(val: unknown): Function;
|
|
10
|
+
export declare function isObj(val: unknown): val is object;
|
|
11
|
+
export declare function isSimple(val: unknown): val is number | string | boolean | bigint | null | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the type of a value in a neat, user-readable way
|
|
14
|
+
*/
|
|
15
|
+
export declare function prettyType(val: unknown): "object" | "number" | "undefined" | "null" | "true" | "false" | "-infinity" | "infinity" | "NaN" | "string" | "unknown type" | "array";
|