@jbrowse/jexl 3.0.1 → 3.1.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 (76) hide show
  1. package/README.md +24 -25
  2. package/dist/Expression.d.ts +16 -6
  3. package/dist/Expression.js +34 -8
  4. package/dist/Expression.js.map +1 -1
  5. package/dist/Jexl.d.ts +13 -12
  6. package/dist/Jexl.js +31 -30
  7. package/dist/Jexl.js.map +1 -1
  8. package/dist/Lexer.d.ts +9 -8
  9. package/dist/Lexer.js +61 -19
  10. package/dist/Lexer.js.map +1 -1
  11. package/dist/evaluator/Evaluator.d.ts +20 -34
  12. package/dist/evaluator/Evaluator.js +19 -64
  13. package/dist/evaluator/Evaluator.js.map +1 -1
  14. package/dist/evaluator/compile.d.ts +27 -0
  15. package/dist/evaluator/compile.js +261 -0
  16. package/dist/evaluator/compile.js.map +1 -0
  17. package/dist/grammar.d.ts +29 -9
  18. package/dist/grammar.js +19 -3
  19. package/dist/grammar.js.map +1 -1
  20. package/dist/parser/Parser.d.ts +5 -7
  21. package/dist/parser/Parser.js +33 -5
  22. package/dist/parser/Parser.js.map +1 -1
  23. package/dist/parser/handlers.d.ts +0 -6
  24. package/dist/parser/handlers.js +54 -46
  25. package/dist/parser/handlers.js.map +1 -1
  26. package/dist/parser/states.d.ts +2 -2
  27. package/dist/parser/states.js +5 -21
  28. package/dist/parser/states.js.map +1 -1
  29. package/dist/types.d.ts +18 -7
  30. package/esm/Expression.d.ts +16 -6
  31. package/esm/Expression.js +34 -8
  32. package/esm/Expression.js.map +1 -1
  33. package/esm/Jexl.d.ts +13 -12
  34. package/esm/Jexl.js +31 -30
  35. package/esm/Jexl.js.map +1 -1
  36. package/esm/Lexer.d.ts +9 -8
  37. package/esm/Lexer.js +61 -19
  38. package/esm/Lexer.js.map +1 -1
  39. package/esm/evaluator/Evaluator.d.ts +20 -34
  40. package/esm/evaluator/Evaluator.js +19 -31
  41. package/esm/evaluator/Evaluator.js.map +1 -1
  42. package/esm/evaluator/compile.d.ts +27 -0
  43. package/esm/evaluator/compile.js +258 -0
  44. package/esm/evaluator/compile.js.map +1 -0
  45. package/esm/grammar.d.ts +29 -9
  46. package/esm/grammar.js +18 -3
  47. package/esm/grammar.js.map +1 -1
  48. package/esm/parser/Parser.d.ts +5 -7
  49. package/esm/parser/Parser.js +33 -5
  50. package/esm/parser/Parser.js.map +1 -1
  51. package/esm/parser/handlers.d.ts +0 -6
  52. package/esm/parser/handlers.js +54 -45
  53. package/esm/parser/handlers.js.map +1 -1
  54. package/esm/parser/states.d.ts +2 -2
  55. package/esm/parser/states.js +5 -21
  56. package/esm/parser/states.js.map +1 -1
  57. package/esm/types.d.ts +18 -7
  58. package/package.json +27 -29
  59. package/src/Expression.ts +33 -13
  60. package/src/Jexl.ts +59 -21
  61. package/src/Lexer.ts +63 -28
  62. package/src/evaluator/Evaluator.ts +27 -44
  63. package/src/evaluator/compile.ts +310 -0
  64. package/src/grammar.ts +66 -17
  65. package/src/parser/Parser.ts +35 -21
  66. package/src/parser/handlers.ts +96 -73
  67. package/src/parser/states.ts +7 -23
  68. package/src/types.ts +22 -7
  69. package/CHANGELOG.md +0 -249
  70. package/dist/evaluator/handlers.d.ts +0 -112
  71. package/dist/evaluator/handlers.js +0 -208
  72. package/dist/evaluator/handlers.js.map +0 -1
  73. package/esm/evaluator/handlers.d.ts +0 -112
  74. package/esm/evaluator/handlers.js +0 -194
  75. package/esm/evaluator/handlers.js.map +0 -1
  76. package/src/evaluator/handlers.ts +0 -212
package/README.md CHANGED
@@ -1,16 +1,14 @@
1
1
  # @jbrowse/jexl
2
2
 
3
- A fork of the jexl lang for jbrowse
3
+ A fork of the TomFrost/jexl minimal expression lang for jbrowse
4
4
 
5
- ## What's New in v3.0
5
+ Major changes include
6
6
 
7
- Version 3.0 is a major simplification of Jexl with breaking changes:
8
-
9
- - **Synchronous only** - All evaluation is synchronous. No async/await needed.
10
- - **No transforms** - The pipe operator (`|`) has been removed. Use functions instead.
11
- - **No filter expressions** - Relative filter syntax like `array[.property == value]` has been removed. Regular bracket notation for indexing (`array[0]`, `object["key"]`) still works.
12
-
13
- See [CHANGELOG.md](CHANGELOG.md) for migration guide.
7
+ - Removing async
8
+ - Remove 'transforms' (use functions instead)
9
+ - Remove array filtering expressions
10
+ - Added template strings
11
+ - Added multiple expression evaluation
14
12
 
15
13
  ## Quick Examples
16
14
 
@@ -85,14 +83,15 @@ jexl.eval('`Price: \\$100`')
85
83
 
86
84
  ### Operators
87
85
 
88
- **Unary:** `!` (negate)
86
+ **Unary:** `!` (logical negation), `-` (arithmetic negation)
89
87
 
90
88
  **Binary:**
91
89
 
92
90
  - Arithmetic: `+`, `-`, `*`, `/`, `//` (floor division), `%`, `^` (power)
93
91
  - Comparison: `==`, `!=`, `>`, `>=`, `<`, `<=`, `in`
94
92
  - Logical: `&&`, `||`
95
- - Assignment: `=` (assigns value to variable)
93
+ - Assignment: `=` (assigns a value to a bare variable name; `a.b = 1` is not
94
+ supported)
96
95
 
97
96
  **Ternary:** `condition ? consequent : alternate`
98
97
 
@@ -130,18 +129,6 @@ jexl.eval('max(temperature, threshold)')
130
129
  // evaluates with context
131
130
  ```
132
131
 
133
- ### Multiple Expressions
134
-
135
- Separate multiple expressions with semicolons. The result is the value of the last expression:
136
-
137
- ```javascript
138
- jexl.eval('5; 10; 15')
139
- // 15
140
-
141
- jexl.eval('1 + 1; 2 + 2; 3 + 3')
142
- // 6
143
- ```
144
-
145
132
  ### Variable Assignment
146
133
 
147
134
  Assign values to variables using `=` (no `let`, `var`, or `const` needed). Assignments mutate the context and return the assigned value:
@@ -162,6 +149,8 @@ jexl.eval('x = 5; y = x * 2; y', context)
162
149
  // context is now { x: 5, y: 10 }
163
150
  ```
164
151
 
152
+ Separate multiple expressions with semicolons. The result is the value of the last expression:
153
+
165
154
  ## API
166
155
 
167
156
  ### Evaluation
@@ -201,8 +190,10 @@ jexl.eval('max(1, 5, 3)') // 5
201
190
 
202
191
  ```javascript
203
192
  // Add a binary operator
204
- jexl.addBinaryOp('~=', 20, (left, right) =>
205
- left.toLowerCase() === right.toLowerCase()
193
+ jexl.addBinaryOp(
194
+ '~=',
195
+ 20,
196
+ (left, right) => left.toLowerCase() === right.toLowerCase()
206
197
  )
207
198
 
208
199
  jexl.eval('"Hello" ~= "hello"') // true
@@ -216,3 +207,11 @@ jexl.eval('~3.7') // 3
216
207
  ## License
217
208
 
218
209
  MIT License, same as TomFrost/Jexl
210
+
211
+ ## Publishing
212
+
213
+ [Trusted publishing](https://docs.npmjs.com/about-trusted-publishing) via GitHub Actions.
214
+
215
+ ```bash
216
+ npm version patch # or minor/major
217
+ ```
@@ -1,13 +1,23 @@
1
+ import Lexer from './Lexer.ts';
2
+ import type { CompiledNode } from './evaluator/compile.ts';
3
+ import type { Grammar } from './grammar.ts';
1
4
  import type { AstNode } from './types.ts';
2
- interface Grammar {
3
- elements: Record<string, any>;
4
- [key: string]: any;
5
- }
6
5
  declare class Expression {
7
6
  _grammar: Grammar;
8
7
  _exprStr: string;
9
8
  _ast: AstNode | null;
10
- constructor(grammar: Grammar, exprStr: string);
9
+ _lexer: Lexer;
10
+ _compiled: boolean;
11
+ _fn: CompiledNode | null;
12
+ /**
13
+ * @param {{}} grammar The grammar to compile and evaluate against
14
+ * @param {string} exprStr The Jexl expression string
15
+ * @param {Lexer} [lexer] A Lexer to reuse. Lexers memoize the regex used to
16
+ * split expressions, which is expensive to build, so passing a shared
17
+ * one avoids paying that cost per expression. It must be invalidated
18
+ * via {@link Lexer#_clearCache} whenever the grammar's elements change.
19
+ */
20
+ constructor(grammar: Grammar, exprStr: string, lexer?: Lexer);
11
21
  /**
12
22
  * Forces a compilation of the expression string that this Expression object
13
23
  * was constructed with. This function can be called multiple times; useful
@@ -22,7 +32,7 @@ declare class Expression {
22
32
  * @returns {*} the result of the evaluation.
23
33
  * @throws {*} on error
24
34
  */
25
- eval(context?: {}): any;
35
+ eval(context?: {}): import("./types.ts").JexlValue;
26
36
  _getAst(): AstNode | null;
27
37
  }
28
38
  export default Expression;
@@ -9,12 +9,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  const Lexer_ts_1 = __importDefault(require("./Lexer.js"));
11
11
  const Evaluator_ts_1 = __importDefault(require("./evaluator/Evaluator.js"));
12
+ const compile_ts_1 = require("./evaluator/compile.js");
12
13
  const Parser_ts_1 = __importDefault(require("./parser/Parser.js"));
13
14
  class Expression {
14
- constructor(grammar, exprStr) {
15
+ _grammar;
16
+ _exprStr;
17
+ _ast;
18
+ _lexer;
19
+ _compiled = false;
20
+ // the AST lowered to closures, so repeated eval() calls skip node dispatch
21
+ _fn = null;
22
+ /**
23
+ * @param {{}} grammar The grammar to compile and evaluate against
24
+ * @param {string} exprStr The Jexl expression string
25
+ * @param {Lexer} [lexer] A Lexer to reuse. Lexers memoize the regex used to
26
+ * split expressions, which is expensive to build, so passing a shared
27
+ * one avoids paying that cost per expression. It must be invalidated
28
+ * via {@link Lexer#_clearCache} whenever the grammar's elements change.
29
+ */
30
+ constructor(grammar, exprStr, lexer) {
15
31
  this._grammar = grammar;
16
32
  this._exprStr = exprStr;
17
33
  this._ast = null;
34
+ this._lexer = lexer ?? new Lexer_ts_1.default(grammar);
18
35
  }
19
36
  /**
20
37
  * Forces a compilation of the expression string that this Expression object
@@ -23,11 +40,13 @@ class Expression {
23
40
  * @returns {Expression} this Expression instance, for convenience
24
41
  */
25
42
  compile() {
26
- const lexer = new Lexer_ts_1.default(this._grammar);
27
- const parser = new Parser_ts_1.default(this._grammar, lexer);
28
- const tokens = lexer.tokenize(this._exprStr);
43
+ const parser = new Parser_ts_1.default(this._grammar, this._lexer);
44
+ const tokens = this._lexer.tokenize(this._exprStr);
29
45
  parser.addTokens(tokens);
30
46
  this._ast = parser.complete();
47
+ // lower the tree to closures once, here, so that eval() is just a call
48
+ this._fn = this._ast ? (0, compile_ts_1.compileAst)(this._ast, this._grammar) : null;
49
+ this._compiled = true;
31
50
  return this;
32
51
  }
33
52
  /**
@@ -38,12 +57,19 @@ class Expression {
38
57
  * @throws {*} on error
39
58
  */
40
59
  eval(context = {}) {
41
- const ast = this._getAst();
42
- const evaluator = new Evaluator_ts_1.default(this._grammar, context);
43
- return evaluator.eval(ast);
60
+ if (!this._compiled) {
61
+ this.compile();
62
+ }
63
+ // an expression with no tokens (empty or whitespace-only) has no AST
64
+ if (!this._fn) {
65
+ return undefined;
66
+ }
67
+ return this._fn(new Evaluator_ts_1.default(this._grammar, context));
44
68
  }
45
69
  _getAst() {
46
- if (!this._ast) {
70
+ // tracked separately from _ast, which is legitimately null for an
71
+ // expression with no tokens and would otherwise recompile on every eval
72
+ if (!this._compiled) {
47
73
  this.compile();
48
74
  }
49
75
  return this._ast;
@@ -1 +1 @@
1
- {"version":3,"file":"Expression.js","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH,0DAA8B;AAC9B,4EAAgD;AAChD,mEAAuC;AASvC,MAAM,UAAU;IAKd,YAAY,OAAgB,EAAE,OAAe;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,MAAM,KAAK,GAAG,IAAI,kBAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,MAAM,GAAG,IAAI,mBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,GAAG,EAAE;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC1B,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACvD,OAAO,SAAS,CAAC,IAAI,CAAC,GAAI,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;CACF;AAED,kBAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"Expression.js","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH,0DAA8B;AAC9B,4EAAgD;AAChD,uDAAmD;AACnD,mEAAuC;AAMvC,MAAM,UAAU;IACd,QAAQ,CAAS;IACjB,QAAQ,CAAQ;IAChB,IAAI,CAAgB;IACpB,MAAM,CAAO;IACb,SAAS,GAAG,KAAK,CAAA;IACjB,2EAA2E;IAC3E,GAAG,GAAwB,IAAI,CAAA;IAE/B;;;;;;;OAOG;IACH,YAAY,OAAgB,EAAE,OAAe,EAAE,KAAa;QAC1D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,IAAI,kBAAK,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,MAAM,MAAM,GAAG,IAAI,mBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC7B,uEAAuE;QACvE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,uBAAU,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;OAMG;IACH,IAAI,CAAC,OAAO,GAAG,EAAE;QACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;QACD,qEAAqE;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,sBAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,OAAO;QACL,kEAAkE;QAClE,wEAAwE;QACxE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;CACF;AAED,kBAAe,UAAU,CAAA"}
package/dist/Jexl.d.ts CHANGED
@@ -1,8 +1,7 @@
1
1
  import Expression from './Expression.ts';
2
- interface Grammar {
3
- elements: Record<string, any>;
4
- functions: Record<string, (...args: any[]) => any>;
5
- }
2
+ import Lexer from './Lexer.ts';
3
+ import type { BinaryOpEval, BinaryOpEvalOnDemand, Grammar, GrammarElement } from './grammar.ts';
4
+ import type { JexlValue } from './types.ts';
6
5
  /**
7
6
  * Jexl is the Javascript Expression Language, capable of parsing and
8
7
  * evaluating basic to complex expression strings, combined with advanced
@@ -11,6 +10,7 @@ interface Grammar {
11
10
  */
12
11
  declare class Jexl {
13
12
  _grammar: Grammar;
13
+ _lexer: Lexer;
14
14
  constructor();
15
15
  /**
16
16
  * Adds a binary operator to Jexl at the specified precedence. The higher the
@@ -31,7 +31,8 @@ declare class Jexl {
31
31
  * left.eval() or right.eval() will return that operand's actual value.
32
32
  * This is useful to conditionally evaluate operands.
33
33
  */
34
- addBinaryOp(operator: string, precedence: number, fn: (left: any, right: any) => any, manualEval?: boolean): void;
34
+ addBinaryOp(operator: string, precedence: number, fn: BinaryOpEval, manualEval?: false): void;
35
+ addBinaryOp(operator: string, precedence: number, fn: BinaryOpEvalOnDemand, manualEval: true): void;
35
36
  /**
36
37
  * Adds or replaces an expression function in this Jexl instance.
37
38
  * @param {string} name The name of the expression function, as it will be
@@ -40,14 +41,14 @@ declare class Jexl {
40
41
  * expression function is invoked. It will be provided with each argument
41
42
  * supplied in the expression, in the same order.
42
43
  */
43
- addFunction(name: string, fn: (...args: any[]) => any): void;
44
+ addFunction(name: string, fn: (...args: JexlValue[]) => JexlValue): void;
44
45
  /**
45
46
  * Syntactic sugar for calling {@link #addFunction} repeatedly. This function
46
47
  * accepts a map of one or more expression function names to their javascript
47
48
  * function counterpart.
48
49
  * @param {{}} map A map of expression function names to javascript functions
49
50
  */
50
- addFunctions(map: Record<string, (...args: any[]) => any>): void;
51
+ addFunctions(map: Record<string, (...args: JexlValue[]) => JexlValue>): void;
51
52
  /**
52
53
  * Adds a unary operator to Jexl. Unary operators are currently only supported
53
54
  * on the left side of the value on which it will operate.
@@ -56,7 +57,7 @@ declare class Jexl {
56
57
  * will be called with one argument: the literal value to the right of the
57
58
  * operator. It should return the resulting value.
58
59
  */
59
- addUnaryOp(operator: string, fn: (right: any) => any): void;
60
+ addUnaryOp(operator: string, fn: (right: JexlValue) => JexlValue): void;
60
61
  /**
61
62
  * Creates an Expression object from the given Jexl expression string, and
62
63
  * immediately compiles it. The returned Expression object can then be
@@ -78,7 +79,7 @@ declare class Jexl {
78
79
  * @param {string} name The name of the expression function
79
80
  * @returns {function} The expression function
80
81
  */
81
- getFunction(name: string): (...args: any[]) => any;
82
+ getFunction(name: string): ((...args: JexlValue[]) => JexlValue) | undefined;
82
83
  /**
83
84
  * Evaluates a Jexl string within an optional context.
84
85
  * @param {string} expression The Jexl expression to be evaluated
@@ -87,14 +88,14 @@ declare class Jexl {
87
88
  * @returns {*} the result of the evaluation.
88
89
  * @throws {*} on error
89
90
  */
90
- eval(expression: string, context?: {}): any;
91
+ eval(expression: string, context?: {}): JexlValue;
91
92
  /**
92
93
  * A JavaScript template literal to allow expressions to be defined by the
93
94
  * syntax: expr`40 + 2`
94
95
  * @param {Array<string>} strs
95
96
  * @param {...any} args
96
97
  */
97
- expr(strs: TemplateStringsArray, ...args: any[]): Expression;
98
+ expr(strs: TemplateStringsArray, ...args: JexlValue[]): Expression;
98
99
  /**
99
100
  * Removes a binary or unary operator from the Jexl grammar.
100
101
  * @param {string} operator The operator string to be removed
@@ -107,7 +108,7 @@ declare class Jexl {
107
108
  * grammar element
108
109
  * @private
109
110
  */
110
- _addGrammarElement(str: string, obj: any): void;
111
+ _addGrammarElement(str: string, obj: GrammarElement): void;
111
112
  }
112
113
  declare const jexlInstance: Jexl;
113
114
  export default jexlInstance;
package/dist/Jexl.js CHANGED
@@ -9,6 +9,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.Jexl = void 0;
11
11
  const Expression_ts_1 = __importDefault(require("./Expression.js"));
12
+ const Lexer_ts_1 = __importDefault(require("./Lexer.js"));
12
13
  const grammar_ts_1 = require("./grammar.js");
13
14
  /**
14
15
  * Jexl is the Javascript Expression Language, capable of parsing and
@@ -17,35 +18,25 @@ const grammar_ts_1 = require("./grammar.js");
17
18
  * @constructor
18
19
  */
19
20
  class Jexl {
21
+ _grammar;
22
+ // shared by every Expression this instance creates, so that the expensive
23
+ // element-splitting regex is built once rather than per compile
24
+ _lexer;
20
25
  constructor() {
21
26
  this._grammar = (0, grammar_ts_1.getGrammar)();
27
+ this._lexer = new Lexer_ts_1.default(this._grammar);
22
28
  this.expr = this.expr.bind(this);
23
29
  }
24
- /**
25
- * Adds a binary operator to Jexl at the specified precedence. The higher the
26
- * precedence, the earlier the operator is applied in the order of operations.
27
- * For example, * has a higher precedence than +, because multiplication comes
28
- * before division.
29
- *
30
- * Please see grammar.js for a listing of all default operators and their
31
- * precedence values in order to choose the appropriate precedence for the
32
- * new operator.
33
- * @param {string} operator The operator string to be added
34
- * @param {number} precedence The operator's precedence
35
- * @param {function} fn A function to run to calculate the result. The function
36
- * will be called with two arguments: left and right, denoting the values
37
- * on either side of the operator. It should return the resulting value.
38
- * @param {boolean} [manualEval] If true, the `left` and `right` arguments
39
- * will be wrapped in objects with an `eval` function. Calling
40
- * left.eval() or right.eval() will return that operand's actual value.
41
- * This is useful to conditionally evaluate operands.
42
- */
43
30
  addBinaryOp(operator, precedence, fn, manualEval) {
44
- this._addGrammarElement(operator, {
45
- type: 'binaryOp',
46
- precedence: precedence,
47
- [manualEval ? 'evalOnDemand' : 'eval']: fn
48
- });
31
+ // the overloads above pair `fn` with `manualEval`; the implementation
32
+ // signature can't express that correlation, hence the assertions
33
+ this._addGrammarElement(operator, manualEval
34
+ ? {
35
+ type: 'binaryOp',
36
+ precedence,
37
+ evalOnDemand: fn
38
+ }
39
+ : { type: 'binaryOp', precedence, eval: fn });
49
40
  }
50
41
  /**
51
42
  * Adds or replaces an expression function in this Jexl instance.
@@ -78,7 +69,7 @@ class Jexl {
78
69
  addUnaryOp(operator, fn) {
79
70
  this._addGrammarElement(operator, {
80
71
  type: 'unaryOp',
81
- weight: Infinity,
72
+ precedence: Infinity,
82
73
  eval: fn
83
74
  });
84
75
  }
@@ -101,7 +92,7 @@ class Jexl {
101
92
  * @returns {Expression} The Expression object representing the given string
102
93
  */
103
94
  createExpression(expression) {
104
- return new Expression_ts_1.default(this._grammar, expression);
95
+ return new Expression_ts_1.default(this._grammar, expression, this._lexer);
105
96
  }
106
97
  /**
107
98
  * Retrieves a previously set expression function.
@@ -131,10 +122,18 @@ class Jexl {
131
122
  */
132
123
  expr(strs, ...args) {
133
124
  let exprStr = '';
134
- for (let idx = 0; idx < strs.length; idx++) {
135
- exprStr += strs[idx];
125
+ for (const [idx, str] of strs.entries()) {
126
+ exprStr += str;
136
127
  if (idx < args.length) {
137
- exprStr += args[idx];
128
+ const arg = args[idx];
129
+ if (typeof arg === 'string' ||
130
+ typeof arg === 'number' ||
131
+ typeof arg === 'boolean') {
132
+ exprStr += String(arg);
133
+ }
134
+ else if (arg != null) {
135
+ exprStr += JSON.stringify(arg);
136
+ }
138
137
  }
139
138
  }
140
139
  return this.createExpression(exprStr);
@@ -145,8 +144,9 @@ class Jexl {
145
144
  */
146
145
  removeOp(operator) {
147
146
  const elem = this._grammar.elements[operator];
148
- if (elem && (elem.type === 'binaryOp' || elem.type === 'unaryOp')) {
147
+ if (elem?.type === 'binaryOp' || elem?.type === 'unaryOp') {
149
148
  Reflect.deleteProperty(this._grammar.elements, operator);
149
+ this._lexer._clearCache();
150
150
  }
151
151
  }
152
152
  /**
@@ -158,6 +158,7 @@ class Jexl {
158
158
  */
159
159
  _addGrammarElement(str, obj) {
160
160
  this._grammar.elements[str] = obj;
161
+ this._lexer._clearCache();
161
162
  }
162
163
  }
163
164
  exports.Jexl = Jexl;
package/dist/Jexl.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Jexl.js","sourceRoot":"","sources":["../src/Jexl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Jexl.js","sourceRoot":"","sources":["../src/Jexl.ts"],"names":[],"mappings":"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"}
package/dist/Lexer.d.ts CHANGED
@@ -1,7 +1,5 @@
1
- import type { Token } from './types.ts';
2
- interface Grammar {
3
- elements: Record<string, any>;
4
- }
1
+ import type { Grammar } from './grammar.ts';
2
+ import type { TemplatePart, Token } from './types.ts';
5
3
  /**
6
4
  * Lexer is a collection of stateless, statically-accessed functions for the
7
5
  * lexical parsing of a Jexl string. Its responsibility is to identify the
@@ -17,6 +15,12 @@ declare class Lexer {
17
15
  _splitRegex?: RegExp;
18
16
  _escQuoteRegexCache: Map<string, RegExp>;
19
17
  constructor(grammar: Grammar);
18
+ /**
19
+ * Discards the memoized split regex, so that it is rebuilt on the next
20
+ * tokenize. Must be called whenever the grammar's elements change, since the
21
+ * regex is derived from their keys.
22
+ */
23
+ _clearCache(): void;
20
24
  /**
21
25
  * Splits a Jexl expression string into an array of expression elements.
22
26
  * @param {string} str A Jexl expression string
@@ -121,10 +125,7 @@ declare class Lexer {
121
125
  * @private
122
126
  */
123
127
  _unquote(str: string): string;
124
- _parseTemplateString(str: string): {
125
- type: "static" | "interpolation";
126
- value: string;
127
- }[];
128
+ _parseTemplateString(str: string): TemplatePart[];
128
129
  _unescapeTemplateString(str: string): string;
129
130
  }
130
131
  export default Lexer;
package/dist/Lexer.js CHANGED
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const numericRegex = /^-?(?:(?:[0-9]*\.[0-9]+)|[0-9]+)$/;
8
8
  const identRegex = /^[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][a-zA-Zа-яА-Я0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*$/;
9
- const escEscRegex = /\\\\/;
9
+ const escEscRegex = /\\\\/g;
10
10
  const whitespaceRegex = /^\s*$/;
11
11
  const preOpRegexElems = [
12
12
  // Template strings
@@ -26,13 +26,20 @@ const postOpRegexElems = [
26
26
  // Numerics (without negative symbol)
27
27
  String.raw `(?:(?:[0-9]*\.[0-9]+)|[0-9]+)`
28
28
  ];
29
+ const unaryMinusToken = () => ({
30
+ type: 'unaryOp',
31
+ value: '-',
32
+ raw: '-'
33
+ });
29
34
  const minusNegatesAfter = new Set([
30
35
  'binaryOp',
31
36
  'unaryOp',
32
37
  'openParen',
33
38
  'openBracket',
34
39
  'question',
35
- 'colon'
40
+ 'colon',
41
+ 'comma',
42
+ 'semicolon'
36
43
  ]);
37
44
  /**
38
45
  * Lexer is a collection of stateless, statically-accessed functions for the
@@ -45,10 +52,20 @@ const minusNegatesAfter = new Set([
45
52
  * @type {{}}
46
53
  */
47
54
  class Lexer {
55
+ _grammar;
56
+ _splitRegex;
57
+ _escQuoteRegexCache = new Map();
48
58
  constructor(grammar) {
49
- this._escQuoteRegexCache = new Map();
50
59
  this._grammar = grammar;
51
60
  }
61
+ /**
62
+ * Discards the memoized split regex, so that it is rebuilt on the next
63
+ * tokenize. Must be called whenever the grammar's elements change, since the
64
+ * regex is derived from their keys.
65
+ */
66
+ _clearCache() {
67
+ this._splitRegex = undefined;
68
+ }
52
69
  /**
53
70
  * Splits a Jexl expression string into an array of expression elements.
54
71
  * @param {string} str A Jexl expression string
@@ -72,21 +89,35 @@ class Lexer {
72
89
  getTokens(elements) {
73
90
  const tokens = [];
74
91
  let negate = false;
75
- for (let i = 0; i < elements.length; i++) {
76
- if (this._isWhitespace(elements[i])) {
77
- if (tokens.length) {
78
- tokens[tokens.length - 1].raw += elements[i];
92
+ for (const element of elements) {
93
+ if (this._isWhitespace(element)) {
94
+ const last = tokens.at(-1);
95
+ if (last) {
96
+ last.raw += element;
79
97
  }
80
98
  }
81
- else if (elements[i] === '-' && this._isNegative(tokens)) {
99
+ else if (element === '-' && this._isNegative(tokens)) {
100
+ // a second prefix minus in a row ("- -x"): emit the pending one as a
101
+ // unary operator so this one can negate whatever comes next
102
+ if (negate) {
103
+ tokens.push(unaryMinusToken());
104
+ }
82
105
  negate = true;
83
106
  }
84
- else {
85
- if (negate) {
86
- elements[i] = '-' + elements[i];
87
- negate = false;
107
+ else if (negate) {
108
+ negate = false;
109
+ if (numericRegex.exec(element)) {
110
+ // fold the sign into the number, so "-1" stays a single literal
111
+ tokens.push(this._createToken('-' + element));
112
+ }
113
+ else {
114
+ // anything else gets a standalone prefix operator, letting "-x",
115
+ // "-(a + b)" and "-foo.bar" negate a computed value
116
+ tokens.push(unaryMinusToken(), this._createToken(element));
88
117
  }
89
- tokens.push(this._createToken(elements[i]));
118
+ }
119
+ else {
120
+ tokens.push(this._createToken(element));
90
121
  }
91
122
  }
92
123
  // Catch a - at the end of the string. Let the parser handle that issue.
@@ -156,7 +187,7 @@ class Lexer {
156
187
  else if (element === 'true' || element === 'false') {
157
188
  token.value = element === 'true';
158
189
  }
159
- else if (this._grammar.elements[element]) {
190
+ else if (Object.hasOwn(this._grammar.elements, element)) {
160
191
  token.type = this._grammar.elements[element].type;
161
192
  }
162
193
  else if (identRegex.exec(element)) {
@@ -254,8 +285,8 @@ class Lexer {
254
285
  }
255
286
  return str
256
287
  .slice(1, -1)
257
- .replace(escQuoteRegex, quote)
258
- .replace(escEscRegex, '\\');
288
+ .replaceAll(escQuoteRegex, quote)
289
+ .replaceAll(escEscRegex, '\\');
259
290
  }
260
291
  _parseTemplateString(str) {
261
292
  const parts = [];
@@ -277,14 +308,25 @@ class Lexer {
277
308
  const interpStart = current + 2;
278
309
  current += 2;
279
310
  while (current < str.length && braceDepth > 0) {
280
- if (str[current] === '\\') {
311
+ const char = str[current];
312
+ if (char === '\\') {
281
313
  current += 2;
282
314
  continue;
283
315
  }
284
- if (str[current] === '{') {
316
+ // skip over string literals so that braces inside them, as in
317
+ // `${ f('}') }`, don't unbalance the depth count
318
+ if (char === '"' || char === "'") {
319
+ current++;
320
+ while (current < str.length && str[current] !== char) {
321
+ current += str[current] === '\\' ? 2 : 1;
322
+ }
323
+ current++;
324
+ continue;
325
+ }
326
+ if (char === '{') {
285
327
  braceDepth++;
286
328
  }
287
- if (str[current] === '}') {
329
+ else if (char === '}') {
288
330
  braceDepth--;
289
331
  }
290
332
  current++;
package/dist/Lexer.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../src/Lexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../src/Lexer.ts"],"names":[],"mappings":"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"}