@jbrowse/jexl 4.0.1 → 5.0.1

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 (110) hide show
  1. package/README.md +163 -20
  2. package/dist/Expression.d.ts +16 -0
  3. package/dist/Expression.js +28 -4
  4. package/dist/Expression.js.map +1 -1
  5. package/dist/Jexl.d.ts +20 -8
  6. package/dist/Jexl.js +34 -15
  7. package/dist/Jexl.js.map +1 -1
  8. package/dist/Lexer.d.ts +4 -3
  9. package/dist/Lexer.js +29 -21
  10. package/dist/Lexer.js.map +1 -1
  11. package/dist/analyze.d.ts +84 -0
  12. package/dist/analyze.js +259 -0
  13. package/dist/analyze.js.map +1 -0
  14. package/dist/check.d.ts +109 -0
  15. package/dist/check.js +1267 -0
  16. package/dist/check.js.map +1 -0
  17. package/dist/collections.d.ts +3 -0
  18. package/dist/collections.js +140 -0
  19. package/dist/collections.js.map +1 -0
  20. package/dist/conditions.d.ts +62 -0
  21. package/dist/conditions.js +207 -0
  22. package/dist/conditions.js.map +1 -0
  23. package/dist/errors.d.ts +5 -0
  24. package/dist/errors.js +18 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/evaluator/compile.d.ts +10 -7
  27. package/dist/evaluator/compile.js +292 -99
  28. package/dist/evaluator/compile.js.map +1 -1
  29. package/dist/grammar.d.ts +22 -9
  30. package/dist/grammar.js +83 -55
  31. package/dist/grammar.js.map +1 -1
  32. package/dist/index.d.ts +9 -0
  33. package/dist/index.js +16 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/operators.d.ts +34 -0
  36. package/dist/operators.js +131 -0
  37. package/dist/operators.js.map +1 -0
  38. package/dist/parser/Parser.d.ts +48 -91
  39. package/dist/parser/Parser.js +347 -221
  40. package/dist/parser/Parser.js.map +1 -1
  41. package/dist/types.d.ts +11 -5
  42. package/esm/Expression.d.ts +16 -0
  43. package/esm/Expression.js +28 -4
  44. package/esm/Expression.js.map +1 -1
  45. package/esm/Jexl.d.ts +20 -8
  46. package/esm/Jexl.js +34 -15
  47. package/esm/Jexl.js.map +1 -1
  48. package/esm/Lexer.d.ts +4 -3
  49. package/esm/Lexer.js +29 -21
  50. package/esm/Lexer.js.map +1 -1
  51. package/esm/analyze.d.ts +84 -0
  52. package/esm/analyze.js +256 -0
  53. package/esm/analyze.js.map +1 -0
  54. package/esm/check.d.ts +109 -0
  55. package/esm/check.js +1260 -0
  56. package/esm/check.js.map +1 -0
  57. package/esm/collections.d.ts +3 -0
  58. package/esm/collections.js +137 -0
  59. package/esm/collections.js.map +1 -0
  60. package/esm/conditions.d.ts +62 -0
  61. package/esm/conditions.js +200 -0
  62. package/esm/conditions.js.map +1 -0
  63. package/esm/errors.d.ts +5 -0
  64. package/esm/errors.js +14 -0
  65. package/esm/errors.js.map +1 -0
  66. package/esm/evaluator/compile.d.ts +10 -7
  67. package/esm/evaluator/compile.js +292 -99
  68. package/esm/evaluator/compile.js.map +1 -1
  69. package/esm/grammar.d.ts +22 -9
  70. package/esm/grammar.js +79 -53
  71. package/esm/grammar.js.map +1 -1
  72. package/esm/index.d.ts +9 -0
  73. package/esm/index.js +4 -0
  74. package/esm/index.js.map +1 -1
  75. package/esm/operators.d.ts +34 -0
  76. package/esm/operators.js +123 -0
  77. package/esm/operators.js.map +1 -0
  78. package/esm/parser/Parser.d.ts +48 -91
  79. package/esm/parser/Parser.js +349 -192
  80. package/esm/parser/Parser.js.map +1 -1
  81. package/esm/types.d.ts +11 -5
  82. package/package.json +1 -1
  83. package/src/Expression.ts +34 -4
  84. package/src/Jexl.ts +52 -16
  85. package/src/Lexer.ts +32 -21
  86. package/src/analyze.ts +378 -0
  87. package/src/check.ts +1682 -0
  88. package/src/collections.ts +148 -0
  89. package/src/conditions.ts +262 -0
  90. package/src/errors.ts +15 -0
  91. package/src/evaluator/compile.ts +351 -102
  92. package/src/grammar.ts +137 -55
  93. package/src/index.ts +15 -0
  94. package/src/operators.ts +151 -0
  95. package/src/parser/Parser.ts +389 -199
  96. package/src/types.ts +13 -3
  97. package/dist/parser/handlers.d.ts +0 -115
  98. package/dist/parser/handlers.js +0 -352
  99. package/dist/parser/handlers.js.map +0 -1
  100. package/dist/parser/states.d.ts +0 -47
  101. package/dist/parser/states.js +0 -176
  102. package/dist/parser/states.js.map +0 -1
  103. package/esm/parser/handlers.d.ts +0 -115
  104. package/esm/parser/handlers.js +0 -328
  105. package/esm/parser/handlers.js.map +0 -1
  106. package/esm/parser/states.d.ts +0 -47
  107. package/esm/parser/states.js +0 -140
  108. package/esm/parser/states.js.map +0 -1
  109. package/src/parser/handlers.ts +0 -372
  110. package/src/parser/states.ts +0 -159
@@ -5,6 +5,7 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.compileAst = compileAst;
8
+ const grammar_ts_1 = require("../grammar.js");
8
9
  /**
9
10
  * Writes a key that a plain assignment would mishandle. Storing to
10
11
  * "__proto__" invokes the prototype setter rather than creating a property, so
@@ -23,15 +24,23 @@ function defineOwn(target, key, value) {
23
24
  function assignOwn(target, key, value) {
24
25
  target[key] = value;
25
26
  }
27
+ /** The key `subject[index]` reads under, or undefined when it reads nothing. */
28
+ function memberKey(index) {
29
+ return typeof index === 'string' || typeof index === 'number'
30
+ ? index
31
+ : indexKey(index);
32
+ }
26
33
  /**
27
34
  * The key a bracket index that is neither a string nor a number reads under:
28
35
  * its string form, when it has one worth using.
29
36
  *
30
37
  * A boolean and an array of primitives do — `['a']` is the key `'a'`, exactly
31
- * as JS would index by it. A plain object does not, since '[object Object]' is
32
- * not a key anything is stored under, so it and an array holding one answer
33
- * `undefined` instead; indexing by either reached that lookup and missed
34
- * anyway. null and undefined are the same case.
38
+ * as JS would index by it, and how a `@gmod/vcf` INFO value (always a list,
39
+ * `Number=1` included) indexes a lookup table. A multi-valued list is the key
40
+ * `'a,b'`, and misses rather than guess which value was meant. A plain object
41
+ * does not, since '[object Object]' is not a key anything is stored under, so
42
+ * it and an array holding one answer `undefined` instead. null and undefined
43
+ * are the same case.
35
44
  */
36
45
  function indexKey(value) {
37
46
  if (typeof value === 'boolean') {
@@ -47,17 +56,159 @@ function isKeyPart(value) {
47
56
  typeof value === 'number' ||
48
57
  typeof value === 'boolean');
49
58
  }
50
- /** Renders an interpolated value for a template literal. */
51
- function stringify(value) {
52
- if (value == null) {
53
- return '';
59
+ /**
60
+ * The value of an object or array literal holding only primitives, built once.
61
+ * Indexing such a table, as in `{CDS: 'red', exon: 'blue'}[feature.type]`,
62
+ * can only yield a primitive, so the table never escapes and one frozen copy
63
+ * serves every evaluation.
64
+ */
65
+ function literalTable(node) {
66
+ const literal = node;
67
+ if (literal.type === 'ArrayLiteral') {
68
+ return literal.value.every((item) => item.type === 'Literal')
69
+ ? Object.freeze(literal.value.map((item) => item.value))
70
+ : undefined;
54
71
  }
55
- if (typeof value === 'string' ||
56
- typeof value === 'number' ||
57
- typeof value === 'boolean') {
58
- return String(value);
72
+ if (literal.type === 'ObjectLiteral') {
73
+ const entries = Object.entries(literal.value);
74
+ if (entries.every(([, value]) => value.type === 'Literal')) {
75
+ const table = {};
76
+ for (const [key, value] of entries) {
77
+ defineOwn(table, key, value.value);
78
+ }
79
+ return Object.freeze(table);
80
+ }
59
81
  }
60
- return JSON.stringify(value);
82
+ return undefined;
83
+ }
84
+ const unassigned = Symbol('unassigned');
85
+ /**
86
+ * One call of a lambda. A name the lambda binds reads from `args`, a name bound
87
+ * by a lambda around it from `outer`, a name the expression assigns from
88
+ * `locals` — the evaluation's own, captured when the lambda was made, so a
89
+ * lambda called after its evaluation ends still sees them — and any other name
90
+ * from `context`.
91
+ */
92
+ class LambdaFrame {
93
+ args;
94
+ outer;
95
+ context;
96
+ locals;
97
+ constructor(args, outer, context, locals) {
98
+ this.args = args;
99
+ this.outer = outer;
100
+ this.context = context;
101
+ this.locals = locals;
102
+ }
103
+ }
104
+ // the closures compiled inside a lambda are handed its LambdaFrame in place of
105
+ // the context, and only the ones that read a name, below, look inside it
106
+ const asFrame = (env) => env;
107
+ const asContext = (frame) => frame;
108
+ function compileName(name, grammar, scope) {
109
+ let hops = 0;
110
+ for (let p = scope.params; p; p = p.outer) {
111
+ const index = p.names.indexOf(name);
112
+ if (index !== -1) {
113
+ return hops === 0 ? (env) => asFrame(env).args[index] : climb(hops, index);
114
+ }
115
+ hops++;
116
+ }
117
+ const read = grammar.variableReader?.(name) ??
118
+ ((ctx) => ctx[name]);
119
+ const fromContext = scope.params
120
+ ? (env) => read(asFrame(env).context)
121
+ : read;
122
+ const slot = scope.locals?.slots.get(name);
123
+ if (slot === undefined) {
124
+ return fromContext;
125
+ }
126
+ if (scope.params) {
127
+ return (env) => {
128
+ const local = asFrame(env).locals[slot];
129
+ return local === unassigned ? fromContext(env) : local;
130
+ };
131
+ }
132
+ const { frame } = scope.locals;
133
+ return (env) => {
134
+ const local = frame.locals[slot];
135
+ return local === unassigned ? fromContext(env) : local;
136
+ };
137
+ }
138
+ function climb(hops, index) {
139
+ return (env) => {
140
+ let frame = asFrame(env);
141
+ for (let i = 0; i < hops; i++) {
142
+ frame = frame.outer;
143
+ }
144
+ return frame.args[index];
145
+ };
146
+ }
147
+ function assignedNames(ast, names = new Set()) {
148
+ const node = ast;
149
+ switch (node?.type) {
150
+ case 'AssignmentExpression': {
151
+ names.add(node.left.value);
152
+ assignedNames(node.right, names);
153
+ break;
154
+ }
155
+ case 'Identifier': {
156
+ assignedNames(node.from, names);
157
+ break;
158
+ }
159
+ case 'BinaryExpression': {
160
+ assignedNames(node.left, names);
161
+ assignedNames(node.right, names);
162
+ break;
163
+ }
164
+ case 'UnaryExpression': {
165
+ assignedNames(node.right, names);
166
+ break;
167
+ }
168
+ case 'ConditionalExpression': {
169
+ assignedNames(node.test, names);
170
+ assignedNames(node.consequent, names);
171
+ assignedNames(node.alternate, names);
172
+ break;
173
+ }
174
+ case 'FilterExpression': {
175
+ assignedNames(node.subject, names);
176
+ assignedNames(node.expr, names);
177
+ break;
178
+ }
179
+ case 'ArrayLiteral':
180
+ case 'FunctionCall':
181
+ case 'SequenceExpression': {
182
+ const children = node.type === 'ArrayLiteral'
183
+ ? node.value
184
+ : node.type === 'FunctionCall'
185
+ ? node.args
186
+ : node.expressions;
187
+ for (const child of children) {
188
+ assignedNames(child, names);
189
+ }
190
+ break;
191
+ }
192
+ case 'ObjectLiteral': {
193
+ for (const child of Object.values(node.value)) {
194
+ assignedNames(child, names);
195
+ }
196
+ break;
197
+ }
198
+ case 'TemplateLiteral': {
199
+ for (const part of node.parts) {
200
+ if (part.type === 'expression') {
201
+ assignedNames(part.value, names);
202
+ }
203
+ }
204
+ break;
205
+ }
206
+ case 'Lambda': {
207
+ assignedNames(node.body, names);
208
+ break;
209
+ }
210
+ }
211
+ return names;
61
212
  }
62
213
  /**
63
214
  * Lowers an expression tree into a tree of closures, resolving each node's type
@@ -68,16 +219,54 @@ function stringify(value) {
68
219
  * times.
69
220
  *
70
221
  * Operators are bound here, so a grammar change after compilation requires
71
- * recompiling, which is what {@link Expression#compile} already documents.
72
- * Functions are looked up per call, since they are commonly registered after
73
- * an expression has been compiled.
222
+ * recompiling. Functions are looked up per call, since they are commonly
223
+ * registered after an expression has been compiled.
74
224
  *
75
- * @param {{}} ast An expression tree, as produced by the Parser
76
- * @param {{}} grammar The grammar to resolve operators against
77
- * @returns {function} a closure returning the expression's value
78
- * @throws {Error} if the tree contains an unrecognized node type
225
+ * Each name the expression assigns gets a slot, numbered at compile time, in a
226
+ * frame that lasts one evaluation, so an assignment never touches the context
227
+ * and a context reused from one evaluation to the next comes back unchanged. A
228
+ * name reads its slot once assigned, and resolves as usual until then. An
229
+ * expression that assigns nothing gets no frame. The frame is not a layer over
230
+ * the context via `Object.create`: V8 gives every object used as a prototype a
231
+ * map of its own, which made evaluating against a context built per evaluation
232
+ * six times slower.
79
233
  */
80
234
  function compileAst(ast, grammar) {
235
+ const names = [...assignedNames(ast)];
236
+ if (names.length === 0) {
237
+ return compileNode(ast, grammar, {});
238
+ }
239
+ const slots = new Map(names.map((name, i) => [name, i]));
240
+ const empty = names.map(() => unassigned);
241
+ const frame = { locals: empty };
242
+ const fn = compileNode(ast, grammar, { locals: { slots, frame } });
243
+ // saved and restored, so a function that evaluates this same expression
244
+ // again from inside it leaves the outer evaluation's locals intact
245
+ return (ctx) => {
246
+ const outer = frame.locals;
247
+ frame.locals = empty.slice();
248
+ try {
249
+ return fn(ctx);
250
+ }
251
+ finally {
252
+ frame.locals = outer;
253
+ }
254
+ };
255
+ }
256
+ /** Renders an interpolated value for a template literal. */
257
+ function stringify(value) {
258
+ if (value == null) {
259
+ return '';
260
+ }
261
+ if (typeof value === 'string' ||
262
+ typeof value === 'number' ||
263
+ typeof value === 'boolean') {
264
+ return String(value);
265
+ }
266
+ return JSON.stringify(value);
267
+ }
268
+ function compileNode(ast, grammar, scope) {
269
+ const compile = (child) => compileNode(child, grammar, scope);
81
270
  // AstNode types its `type` as a plain string so the Parser can build the tree
82
271
  // loosely; narrowing to the union once, here, lets every case below see its
83
272
  // own node type instead of repeating the same cast in each branch
@@ -90,46 +279,56 @@ function compileAst(ast, grammar) {
90
279
  case 'Identifier': {
91
280
  const name = node.value;
92
281
  if (!node.from) {
93
- return (ctx) => ctx[name];
282
+ return compileName(name, grammar, scope);
283
+ }
284
+ const from = compile(node.from);
285
+ const { getMember } = grammar;
286
+ if (getMember) {
287
+ return (ctx) => {
288
+ const target = from(ctx);
289
+ return target == null
290
+ ? undefined
291
+ : getMember(target, name);
292
+ };
94
293
  }
95
- const from = compileAst(node.from, grammar);
96
294
  return (ctx) => {
97
- const subject = from(ctx);
98
- if (subject == null) {
99
- return undefined;
100
- }
101
- // an identifier chained off an array reads through its first element
102
- const target = Array.isArray(subject) ? subject[0] : subject;
295
+ const target = from(ctx);
103
296
  return target == null ? undefined : target[name];
104
297
  };
105
298
  }
106
299
  case 'BinaryExpression': {
107
300
  const op = grammar.elements[node.operator];
108
- if (op?.type !== 'binaryOp') {
109
- // matches the tree-walking behaviour: an unknown operator yields
110
- // undefined without evaluating either operand
111
- return () => undefined;
112
- }
113
- const left = compileAst(node.left, grammar);
114
- const right = compileAst(node.right, grammar);
115
- const { evalOnDemand } = op;
116
- if (evalOnDemand) {
117
- // operands stay unevaluated behind an `eval` thunk, so operators such
118
- // as && and || can short-circuit
301
+ const left = compile(node.left);
302
+ const right = compile(node.right);
303
+ if (op?.type === 'binaryOp' && op.evalOnDemand) {
304
+ const { evalOnDemand } = op;
305
+ if (evalOnDemand === grammar_ts_1.and) {
306
+ return (ctx) => {
307
+ const value = left(ctx);
308
+ return value ? right(ctx) : value;
309
+ };
310
+ }
311
+ if (evalOnDemand === grammar_ts_1.or) {
312
+ return (ctx) => {
313
+ const value = left(ctx);
314
+ return value || right(ctx);
315
+ };
316
+ }
317
+ if (evalOnDemand === grammar_ts_1.nullish) {
318
+ return (ctx) => left(ctx) ?? right(ctx);
319
+ }
320
+ // a host's operator gets its operands unevaluated, behind `eval`
321
+ // thunks, so that it can short-circuit as it chooses
119
322
  return (ctx) => evalOnDemand({ eval: () => left(ctx) }, { eval: () => right(ctx) });
120
323
  }
121
- const fn = op.eval;
324
+ const fn = op?.type === 'binaryOp' ? op.eval : undefined;
122
325
  if (!fn) {
123
- return (ctx) => {
124
- left(ctx);
125
- right(ctx);
126
- return undefined;
127
- };
326
+ throw new Error(`Unknown binary operator '${node.operator}'`);
128
327
  }
129
328
  return (ctx) => fn(left(ctx), right(ctx));
130
329
  }
131
330
  case 'UnaryExpression': {
132
- const right = compileAst(node.right, grammar);
331
+ const right = compile(node.right);
133
332
  const elem = grammar.elements[node.operator];
134
333
  const fn = elem?.type === 'unaryOp'
135
334
  ? elem.eval
@@ -137,22 +336,14 @@ function compileAst(ast, grammar) {
137
336
  ? elem.unaryEval
138
337
  : undefined;
139
338
  if (!fn) {
140
- // the operand is still evaluated for an unknown operator, as before
141
- return (ctx) => {
142
- right(ctx);
143
- return undefined;
144
- };
339
+ throw new Error(`Unknown unary operator '${node.operator}'`);
145
340
  }
146
341
  return (ctx) => fn(right(ctx));
147
342
  }
148
343
  case 'ConditionalExpression': {
149
- const test = compileAst(node.test, grammar);
150
- const consequent = node.consequent
151
- ? compileAst(node.consequent, grammar)
152
- : undefined;
153
- const alternate = node.alternate
154
- ? compileAst(node.alternate, grammar)
155
- : undefined;
344
+ const test = compile(node.test);
345
+ const consequent = node.consequent ? compile(node.consequent) : undefined;
346
+ const alternate = node.alternate ? compile(node.alternate) : undefined;
156
347
  return (ctx) => {
157
348
  const res = test(ctx);
158
349
  if (res) {
@@ -163,43 +354,29 @@ function compileAst(ast, grammar) {
163
354
  };
164
355
  }
165
356
  case 'FilterExpression': {
166
- const subject = compileAst(node.subject, grammar);
167
- const index = compileAst(node.expr, grammar);
357
+ const table = literalTable(node.subject);
358
+ const subject = table ? () => table : compile(node.subject);
359
+ const index = compile(node.expr);
360
+ const { getMember } = grammar;
361
+ if (getMember) {
362
+ return (ctx) => {
363
+ const subjectVal = subject(ctx);
364
+ const key = memberKey(index(ctx));
365
+ return subjectVal == null || key === undefined
366
+ ? undefined
367
+ : getMember(subjectVal, key);
368
+ };
369
+ }
168
370
  return (ctx) => {
169
371
  const subjectVal = subject(ctx);
170
- const indexVal = index(ctx);
171
- if (subjectVal == null) {
172
- return undefined;
173
- }
174
- if (typeof indexVal === 'string' || typeof indexVal === 'number') {
175
- return subjectVal[indexVal];
176
- }
177
- // A value with a meaningful string form is indexed by it, which is what
178
- // JS does and what this did until the evaluator was lowered to closures
179
- // — the tree-walking version was a bare `subject?.[index]`. Answering
180
- // `undefined` for everything else reads as a deliberate strictness and
181
- // is not: nothing wanted it, and the shape it rejects is common.
182
- //
183
- // That shape is a one-element array. Every `@gmod/vcf` INFO value is a
184
- // list — `Number=1` included, so `CLNSIG=Pathogenic` parses to
185
- // `['Pathogenic']` — and the natural way to colour by one is a lookup
186
- // table indexed by it. The miss is silent, because such an expression
187
- // always carries a `|| fallback` for the values it has no entry for,
188
- // and that fallback then answers for every record.
189
- //
190
- // A multi-valued list still misses — `['a','b']` is the key 'a,b' —
191
- // which is the honest answer rather than a lucky one: reading through
192
- // to the first element would be the index guessing which value was
193
- // meant. `Identifier` above does read through a one-element array, but
194
- // it is navigating rather than selecting, so it has nothing to guess.
195
- const key = indexKey(indexVal);
196
- return key === undefined
372
+ const key = memberKey(index(ctx));
373
+ return subjectVal == null || key === undefined
197
374
  ? undefined
198
375
  : subjectVal[key];
199
376
  };
200
377
  }
201
378
  case 'ArrayLiteral': {
202
- const items = node.value.map((item) => compileAst(item, grammar));
379
+ const items = node.value.map(compile);
203
380
  const len = items.length;
204
381
  return (ctx) => {
205
382
  const out = new Array(len);
@@ -212,7 +389,7 @@ function compileAst(ast, grammar) {
212
389
  case 'ObjectLiteral': {
213
390
  const entries = Object.entries(node.value);
214
391
  const keys = entries.map(([key]) => key);
215
- const values = entries.map(([, value]) => compileAst(value, grammar));
392
+ const values = entries.map(([, value]) => compile(value));
216
393
  const len = keys.length;
217
394
  // resolved once, here, so the common case keeps its plain store
218
395
  const store = keys.includes('__proto__') ? defineOwn : assignOwn;
@@ -231,7 +408,7 @@ function compileAst(ast, grammar) {
231
408
  const { value } = part;
232
409
  return () => value;
233
410
  }
234
- const expr = compileAst(part.value, grammar);
411
+ const expr = compile(part.value);
235
412
  return (ctx) => stringify(expr(ctx));
236
413
  });
237
414
  return (ctx) => {
@@ -244,7 +421,7 @@ function compileAst(ast, grammar) {
244
421
  }
245
422
  case 'FunctionCall': {
246
423
  const { name } = node;
247
- const args = node.args.map((arg) => compileAst(arg, grammar));
424
+ const args = node.args.map(compile);
248
425
  // hasOwn, so that inherited Object.prototype members such as `toString`
249
426
  // and `constructor` aren't callable as Jexl functions. Resolved per call
250
427
  // rather than baked in, since functions are routinely registered after
@@ -287,7 +464,7 @@ function compileAst(ast, grammar) {
287
464
  }
288
465
  }
289
466
  case 'SequenceExpression': {
290
- const exprs = node.expressions.map((expr) => compileAst(expr, grammar));
467
+ const exprs = node.expressions.map(compile);
291
468
  const len = exprs.length;
292
469
  return (ctx) => {
293
470
  let last;
@@ -298,13 +475,29 @@ function compileAst(ast, grammar) {
298
475
  };
299
476
  }
300
477
  case 'AssignmentExpression': {
301
- const name = node.left.value;
302
- const right = compileAst(node.right, grammar);
303
- const store = name === '__proto__' ? defineOwn : assignOwn;
304
- return (ctx) => {
305
- const value = right(ctx);
306
- store(ctx, name, value);
307
- return value;
478
+ if (scope.params) {
479
+ throw new Error('Assignment is not supported in a lambda');
480
+ }
481
+ const right = compile(node.right);
482
+ const { slots, frame } = scope.locals;
483
+ const slot = slots.get(node.left.value);
484
+ return (ctx) => (frame.locals[slot] = right(ctx));
485
+ }
486
+ case 'Lambda': {
487
+ const body = compileNode(node.body, grammar, {
488
+ ...scope,
489
+ params: { names: node.params, outer: scope.params }
490
+ });
491
+ if (!scope.params) {
492
+ const frame = scope.locals?.frame;
493
+ return (ctx) => {
494
+ const locals = frame?.locals;
495
+ return (...args) => body(asContext(new LambdaFrame(args, undefined, ctx, locals)));
496
+ };
497
+ }
498
+ return (env) => {
499
+ const outer = asFrame(env);
500
+ return (...args) => body(asContext(new LambdaFrame(args, outer, outer.context, outer.locals)));
308
501
  };
309
502
  }
310
503
  default: {
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/evaluator/compile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/evaluator/compile.ts"],"names":[],"mappings":"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"}
package/dist/grammar.d.ts CHANGED
@@ -30,6 +30,8 @@ export interface BinaryOp {
30
30
  * which is how `-x` is distinguished from `a - x`.
31
31
  */
32
32
  unaryEval?: (right: JexlValue) => JexlValue;
33
+ /** Groups a chain from the right, so `a ^ b ^ c` is `a ^ (b ^ c)`. */
34
+ rightAssociative?: boolean;
33
35
  }
34
36
  export type UnaryOpEval = (right: JexlValue) => JexlValue;
35
37
  export interface UnaryOp {
@@ -39,23 +41,34 @@ export interface UnaryOp {
39
41
  }
40
42
  /**
41
43
  * The punctuation elements of the grammar. Unlike operators these carry no
42
- * behavior of their own; the Parser's state machine gives them meaning. The
43
- * type is a literal union rather than `string` so that `GrammarElement` is a
44
- * discriminated union, letting operator properties be accessed without casts.
44
+ * behavior of their own; the Parser gives them meaning. The type is a literal
45
+ * union rather than `string` so that `GrammarElement` is a discriminated union,
46
+ * letting operator properties be accessed without casts.
45
47
  */
46
48
  export interface SimpleElement {
47
- type: 'dot' | 'openBracket' | 'closeBracket' | 'openCurl' | 'closeCurl' | 'colon' | 'comma' | 'openParen' | 'closeParen' | 'question' | 'semicolon';
49
+ type: 'dot' | 'openBracket' | 'closeBracket' | 'openCurl' | 'closeCurl' | 'colon' | 'comma' | 'openParen' | 'closeParen' | 'question' | 'semicolon' | 'arrow';
48
50
  }
49
51
  export type GrammarElement = BinaryOp | UnaryOp | SimpleElement;
50
52
  /** A registered function, as jexl calls it once the operands are evaluated. */
51
53
  export type GrammarFn = (...args: JexlValue[]) => JexlValue;
54
+ /**
55
+ * Reads `key` off `subject` for `subject.key` and `subject[key]`, in place of
56
+ * a plain property read. Like a registered function, it is handed host values
57
+ * jexl has no type for, so the subject is only promised not to be nullish.
58
+ */
59
+ export type GetMember = (subject: NonNullable<unknown>, key: string | number) => unknown;
60
+ /**
61
+ * Called once per bare variable name as an expression compiles. A reader it
62
+ * returns replaces `context[name]` for that name; `undefined` keeps it.
63
+ */
64
+ export type VariableReader = (name: string) => ((context: Record<string, unknown>) => unknown) | undefined;
52
65
  export interface Grammar {
53
66
  elements: Record<string, GrammarElement>;
54
67
  functions: Record<string, GrammarFn>;
68
+ getMember?: GetMember;
69
+ variableReader?: VariableReader;
55
70
  }
56
- /**
57
- * Returns the binding power of a grammar element, or 0 for elements that
58
- * aren't operators and therefore don't participate in precedence.
59
- */
60
- export declare function precedenceOf(elem: GrammarElement | undefined): number;
71
+ export declare const and: BinaryOpEvalOnDemand;
72
+ export declare const or: BinaryOpEvalOnDemand;
73
+ export declare const nullish: BinaryOpEvalOnDemand;
61
74
  export declare const getGrammar: () => Grammar;