@jbrowse/jexl 5.0.1 → 6.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.
Files changed (99) hide show
  1. package/README.md +8 -3
  2. package/dist/Expression.d.ts +0 -12
  3. package/dist/Expression.js +0 -16
  4. package/dist/Expression.js.map +1 -1
  5. package/dist/Jexl.js +12 -16
  6. package/dist/Jexl.js.map +1 -1
  7. package/dist/Lexer.d.ts +12 -94
  8. package/dist/Lexer.js +41 -142
  9. package/dist/Lexer.js.map +1 -1
  10. package/dist/analyze.d.ts +2 -0
  11. package/dist/analyze.js +7 -7
  12. package/dist/analyze.js.map +1 -1
  13. package/dist/check.d.ts +0 -5
  14. package/dist/check.js +62 -240
  15. package/dist/check.js.map +1 -1
  16. package/dist/collections.d.ts +7 -0
  17. package/dist/collections.js +9 -2
  18. package/dist/collections.js.map +1 -1
  19. package/dist/conditions.d.ts +1 -1
  20. package/dist/conditions.js +28 -50
  21. package/dist/conditions.js.map +1 -1
  22. package/dist/errors.d.ts +5 -0
  23. package/dist/errors.js +8 -0
  24. package/dist/errors.js.map +1 -1
  25. package/dist/evaluator/compile.js +37 -24
  26. package/dist/evaluator/compile.js.map +1 -1
  27. package/dist/grammar.d.ts +2 -2
  28. package/dist/grammar.js +1 -8
  29. package/dist/grammar.js.map +1 -1
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.js +3 -2
  32. package/dist/index.js.map +1 -1
  33. package/dist/operators.d.ts +5 -0
  34. package/dist/operators.js +9 -5
  35. package/dist/operators.js.map +1 -1
  36. package/dist/parser/Parser.d.ts +11 -12
  37. package/dist/parser/Parser.js +4 -10
  38. package/dist/parser/Parser.js.map +1 -1
  39. package/dist/print.d.ts +9 -0
  40. package/dist/print.js +183 -0
  41. package/dist/print.js.map +1 -0
  42. package/dist/types.d.ts +18 -21
  43. package/esm/Expression.d.ts +0 -12
  44. package/esm/Expression.js +0 -16
  45. package/esm/Expression.js.map +1 -1
  46. package/esm/Jexl.js +12 -16
  47. package/esm/Jexl.js.map +1 -1
  48. package/esm/Lexer.d.ts +12 -94
  49. package/esm/Lexer.js +40 -142
  50. package/esm/Lexer.js.map +1 -1
  51. package/esm/analyze.d.ts +2 -0
  52. package/esm/analyze.js +6 -7
  53. package/esm/analyze.js.map +1 -1
  54. package/esm/check.d.ts +0 -5
  55. package/esm/check.js +29 -206
  56. package/esm/check.js.map +1 -1
  57. package/esm/collections.d.ts +7 -0
  58. package/esm/collections.js +8 -1
  59. package/esm/collections.js.map +1 -1
  60. package/esm/conditions.d.ts +1 -1
  61. package/esm/conditions.js +27 -49
  62. package/esm/conditions.js.map +1 -1
  63. package/esm/errors.d.ts +5 -0
  64. package/esm/errors.js +7 -0
  65. package/esm/errors.js.map +1 -1
  66. package/esm/evaluator/compile.js +37 -24
  67. package/esm/evaluator/compile.js.map +1 -1
  68. package/esm/grammar.d.ts +2 -2
  69. package/esm/grammar.js +1 -8
  70. package/esm/grammar.js.map +1 -1
  71. package/esm/index.d.ts +2 -1
  72. package/esm/index.js +2 -1
  73. package/esm/index.js.map +1 -1
  74. package/esm/operators.d.ts +5 -0
  75. package/esm/operators.js +8 -5
  76. package/esm/operators.js.map +1 -1
  77. package/esm/parser/Parser.d.ts +11 -12
  78. package/esm/parser/Parser.js +4 -8
  79. package/esm/parser/Parser.js.map +1 -1
  80. package/esm/print.d.ts +9 -0
  81. package/esm/print.js +177 -0
  82. package/esm/print.js.map +1 -0
  83. package/esm/types.d.ts +18 -21
  84. package/package.json +2 -1
  85. package/src/Expression.ts +0 -20
  86. package/src/Jexl.ts +13 -20
  87. package/src/Lexer.ts +42 -144
  88. package/src/analyze.ts +10 -10
  89. package/src/check.ts +48 -250
  90. package/src/collections.ts +11 -1
  91. package/src/conditions.ts +39 -62
  92. package/src/errors.ts +10 -0
  93. package/src/evaluator/compile.ts +49 -36
  94. package/src/grammar.ts +3 -9
  95. package/src/index.ts +2 -1
  96. package/src/operators.ts +10 -6
  97. package/src/parser/Parser.ts +13 -19
  98. package/src/print.ts +203 -0
  99. package/src/types.ts +19 -23
package/dist/print.js ADDED
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ /*
3
+ * Jexl
4
+ * Copyright 2020 Tom Shawver
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isName = isName;
8
+ exports.key = key;
9
+ exports.quote = quote;
10
+ exports.print = print;
11
+ const Lexer_ts_1 = require("./Lexer.js");
12
+ const grammar_ts_1 = require("./grammar.js");
13
+ const { elements } = (0, grammar_ts_1.getGrammar)();
14
+ // print knows where only the built-in operators bind, so a host's own ones
15
+ // print with their operands parenthesized
16
+ function builtIn(operator) {
17
+ const element = elements[operator];
18
+ return element?.type === 'binaryOp' ? element : undefined;
19
+ }
20
+ const LOGICAL = new Set(['||', '&&']);
21
+ // how tightly each form binds, mirroring the Parser's levels: `;`, then `=`
22
+ // and lambdas, then `?:`, then binary operators, then prefix operators
23
+ const SEQUENCE = 0;
24
+ const ASSIGNMENT = 1;
25
+ const CONDITIONAL = 2;
26
+ const CUSTOM_BINARY = 3;
27
+ const UNARY = 100;
28
+ const WORDS = new Set([
29
+ 'true',
30
+ 'false',
31
+ 'null',
32
+ ...Object.keys(elements).filter((word) => Lexer_ts_1.identRegex.test(word))
33
+ ]);
34
+ function isName(text) {
35
+ return Lexer_ts_1.identRegex.test(text) && !WORDS.has(text);
36
+ }
37
+ function key(name) {
38
+ return isName(name) ? `.${name}` : `[${quote(name)}]`;
39
+ }
40
+ function quote(text) {
41
+ return `'${text.replaceAll('\\', '\\\\').replaceAll("'", String.raw `\'`)}'`;
42
+ }
43
+ function precedenceOf(node) {
44
+ switch (node.type) {
45
+ case 'SequenceExpression': {
46
+ return SEQUENCE;
47
+ }
48
+ case 'AssignmentExpression':
49
+ case 'Lambda': {
50
+ return ASSIGNMENT;
51
+ }
52
+ case 'ConditionalExpression': {
53
+ // with no alternate, it ends only before `)`, `]`, `}`, `,`, `;` or the end
54
+ return node.alternate ? CONDITIONAL : SEQUENCE;
55
+ }
56
+ case 'BinaryExpression': {
57
+ return builtIn(node.operator)?.precedence ?? CUSTOM_BINARY;
58
+ }
59
+ case 'UnaryExpression': {
60
+ return UNARY;
61
+ }
62
+ default: {
63
+ return Infinity;
64
+ }
65
+ }
66
+ }
67
+ function within(node, least) {
68
+ const text = print(node);
69
+ return precedenceOf(node) < least ? `(${text})` : text;
70
+ }
71
+ function binaryOperand(parent, child, left) {
72
+ const op = builtIn(parent.operator);
73
+ if (!op) {
74
+ return within(child, UNARY);
75
+ }
76
+ const own = op.precedence;
77
+ const theirs = precedenceOf(child);
78
+ const chained = child.type === 'BinaryExpression' &&
79
+ !!op.rightAssociative &&
80
+ !!builtIn(child.operator)?.rightAssociative;
81
+ const mixesNullish = child.type === 'BinaryExpression' &&
82
+ ((parent.operator === '??' && LOGICAL.has(child.operator)) ||
83
+ (child.operator === '??' && LOGICAL.has(parent.operator)));
84
+ const text = print(child);
85
+ return theirs < own || (theirs === own && left === chained) || mixesNullish
86
+ ? `(${text})`
87
+ : text;
88
+ }
89
+ /**
90
+ * Renders a tree back to expression text, for messages and suggestions. The
91
+ * text parses back to the same tree.
92
+ */
93
+ function print(node) {
94
+ switch (node.type) {
95
+ case 'Literal': {
96
+ const { value } = node;
97
+ if (typeof value === 'string') {
98
+ return quote(value);
99
+ }
100
+ // a number too large for a double reads as Infinity, which is a name
101
+ return Object.is(value, -0)
102
+ ? '-0'
103
+ : value === Infinity
104
+ ? '1e999'
105
+ : value === -Infinity
106
+ ? '-1e999'
107
+ : String(value);
108
+ }
109
+ case 'Identifier': {
110
+ return node.from
111
+ ? within(node.from, Infinity) + key(node.value)
112
+ : node.value;
113
+ }
114
+ case 'FilterExpression': {
115
+ return `${within(node.subject, Infinity)}[${within(node.expr, ASSIGNMENT)}]`;
116
+ }
117
+ case 'BinaryExpression': {
118
+ return `${binaryOperand(node, node.left, true)} ${node.operator} ${binaryOperand(node, node.right, false)}`;
119
+ }
120
+ case 'UnaryExpression': {
121
+ const { operator } = node;
122
+ const right = within(node.right, UNARY);
123
+ // the Lexer folds a minus before a digit into the number
124
+ if (operator === '-' && /^\d/.test(right)) {
125
+ return `-(${right})`;
126
+ }
127
+ return Lexer_ts_1.identRegex.test(operator)
128
+ ? `${operator} ${right}`
129
+ : operator + right;
130
+ }
131
+ case 'ConditionalExpression': {
132
+ const test = within(node.test, CUSTOM_BINARY);
133
+ const consequent = node.consequent
134
+ ? ` ${within(node.consequent, ASSIGNMENT)} `
135
+ : '';
136
+ const alternate = node.alternate
137
+ ? ` ${within(node.alternate, ASSIGNMENT)}`
138
+ : '';
139
+ return `${test} ?${consequent}:${alternate}`;
140
+ }
141
+ case 'FunctionCall': {
142
+ const args = node.args.map((arg) => within(arg, ASSIGNMENT));
143
+ return `${node.name}(${args.join(', ')})`;
144
+ }
145
+ case 'ArrayLiteral': {
146
+ const items = node.value.map((item) => within(item, ASSIGNMENT));
147
+ return `[${items.join(', ')}]`;
148
+ }
149
+ case 'ObjectLiteral': {
150
+ const entries = Object.entries(node.value).map(([name, value]) => `${isName(name) ? name : quote(name)}: ${within(value, ASSIGNMENT)}`);
151
+ return `{${entries.join(', ')}}`;
152
+ }
153
+ case 'TemplateLiteral': {
154
+ const parts = node.parts.map((part) => part.type === 'static'
155
+ ? part.value
156
+ .replaceAll('\\', '\\\\')
157
+ .replaceAll('`', '\\`')
158
+ .replaceAll('${', '\\${')
159
+ : `\${${print(part.value)}}`);
160
+ return `\`${parts.join('')}\``;
161
+ }
162
+ case 'SequenceExpression': {
163
+ const { expressions } = node;
164
+ const text = expressions
165
+ .map((expr) => within(expr, ASSIGNMENT))
166
+ .join('; ');
167
+ return expressions.length === 1 ? `${text};` : text;
168
+ }
169
+ case 'AssignmentExpression': {
170
+ return `${node.left.value} = ${within(node.right, ASSIGNMENT)}`;
171
+ }
172
+ case 'Lambda': {
173
+ const params = node.params.length === 1
174
+ ? node.params[0]
175
+ : `(${node.params.join(', ')})`;
176
+ return `${params} => ${within(node.body, ASSIGNMENT)}`;
177
+ }
178
+ default: {
179
+ return '?';
180
+ }
181
+ }
182
+ }
183
+ //# sourceMappingURL=print.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print.js","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -12,35 +12,31 @@ export interface Token {
12
12
  value: string | number | boolean | null | TemplatePart[];
13
13
  raw: string;
14
14
  }
15
- export interface AstNode {
16
- type: string;
17
- right?: AstNode;
18
- }
19
- export interface Literal extends AstNode {
15
+ export interface Literal {
20
16
  type: 'Literal';
21
17
  value: string | number | boolean | null;
22
18
  }
23
- export interface Identifier extends AstNode {
19
+ export interface Identifier {
24
20
  type: 'Identifier';
25
21
  value: string;
26
22
  from?: AstNode;
27
23
  }
28
- export interface BinaryExpression extends AstNode {
24
+ export interface BinaryExpression {
29
25
  type: 'BinaryExpression';
30
26
  operator: string;
31
27
  left: AstNode;
32
- right?: AstNode;
28
+ right: AstNode;
33
29
  }
34
- export interface UnaryExpression extends AstNode {
30
+ export interface UnaryExpression {
35
31
  type: 'UnaryExpression';
36
32
  operator: string;
37
- right?: AstNode;
33
+ right: AstNode;
38
34
  }
39
- export interface ArrayLiteral extends AstNode {
35
+ export interface ArrayLiteral {
40
36
  type: 'ArrayLiteral';
41
37
  value: AstNode[];
42
38
  }
43
- export interface ObjectLiteral extends AstNode {
39
+ export interface ObjectLiteral {
44
40
  type: 'ObjectLiteral';
45
41
  value: Record<string, AstNode>;
46
42
  }
@@ -51,41 +47,42 @@ export type TemplateLiteralPart = {
51
47
  type: 'expression';
52
48
  value: AstNode;
53
49
  };
54
- export interface TemplateLiteral extends AstNode {
50
+ export interface TemplateLiteral {
55
51
  type: 'TemplateLiteral';
56
52
  parts: TemplateLiteralPart[];
57
53
  }
58
- export interface FunctionCall extends AstNode {
54
+ export interface FunctionCall {
59
55
  type: 'FunctionCall';
60
56
  name: string;
61
57
  args: AstNode[];
62
58
  }
63
- export interface FilterExpression extends AstNode {
59
+ export interface FilterExpression {
64
60
  type: 'FilterExpression';
65
61
  expr: AstNode;
66
62
  subject: AstNode;
67
63
  }
68
- export interface ConditionalExpression extends AstNode {
64
+ export interface ConditionalExpression {
69
65
  type: 'ConditionalExpression';
70
66
  test: AstNode;
71
67
  consequent?: AstNode;
72
68
  alternate?: AstNode;
73
69
  }
74
- export interface SequenceExpression extends AstNode {
70
+ export interface SequenceExpression {
75
71
  type: 'SequenceExpression';
76
72
  expressions: AstNode[];
77
73
  }
78
- export interface AssignmentExpression extends AstNode {
74
+ export interface AssignmentExpression {
79
75
  type: 'AssignmentExpression';
80
76
  operator: '=';
81
77
  left: Identifier;
78
+ right: AstNode;
82
79
  }
83
- export interface Lambda extends AstNode {
80
+ export interface Lambda {
84
81
  type: 'Lambda';
85
82
  params: string[];
86
83
  body: AstNode;
87
84
  }
88
- export type AstNodeUnion = Literal | Identifier | BinaryExpression | UnaryExpression | ArrayLiteral | ObjectLiteral | TemplateLiteral | FunctionCall | FilterExpression | ConditionalExpression | SequenceExpression | AssignmentExpression | Lambda;
89
- export type NodeByType<T extends AstNodeUnion['type']> = Extract<AstNodeUnion, {
85
+ export type AstNode = Literal | Identifier | BinaryExpression | UnaryExpression | ArrayLiteral | ObjectLiteral | TemplateLiteral | FunctionCall | FilterExpression | ConditionalExpression | SequenceExpression | AssignmentExpression | Lambda;
86
+ export type NodeByType<T extends AstNode['type']> = Extract<AstNode, {
90
87
  type: T;
91
88
  }>;
@@ -1,6 +1,4 @@
1
1
  import Lexer from './Lexer.ts';
2
- import type { AnalyzeOptions } from './analyze.ts';
3
- import type { CheckOptions } from './check.ts';
4
2
  import type { CompiledNode } from './evaluator/compile.ts';
5
3
  import type { Grammar } from './grammar.ts';
6
4
  import type { AstNode } from './types.ts';
@@ -42,15 +40,5 @@ declare class Expression {
42
40
  get source(): string;
43
41
  /** The parsed tree, or null for an expression with no tokens. */
44
42
  get ast(): AstNode | null;
45
- /**
46
- * Lists what the expression reads from its context, without evaluating it.
47
- * See {@link analyze}.
48
- */
49
- analyze(options?: AnalyzeOptions): import("./analyze.ts").Analysis;
50
- /**
51
- * Checks the expression against a host's fields and functions, without
52
- * evaluating it. See {@link check}.
53
- */
54
- check(options?: CheckOptions): import("./check.ts").CheckResult;
55
43
  }
56
44
  export default Expression;
package/esm/Expression.js CHANGED
@@ -3,8 +3,6 @@
3
3
  * Copyright 2020 Tom Shawver
4
4
  */
5
5
  import Lexer from "./Lexer.js";
6
- import { analyze } from "./analyze.js";
7
- import { check } from "./check.js";
8
6
  import { compileAst } from "./evaluator/compile.js";
9
7
  import Parser from "./parser/Parser.js";
10
8
  class Expression {
@@ -73,20 +71,6 @@ class Expression {
73
71
  }
74
72
  return this._ast;
75
73
  }
76
- /**
77
- * Lists what the expression reads from its context, without evaluating it.
78
- * See {@link analyze}.
79
- */
80
- analyze(options) {
81
- return analyze(this.ast, options);
82
- }
83
- /**
84
- * Checks the expression against a host's fields and functions, without
85
- * evaluating it. See {@link check}.
86
- */
87
- check(options) {
88
- return check(this.ast, options);
89
- }
90
74
  }
91
75
  export default Expression;
92
76
  //# sourceMappingURL=Expression.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Expression.js","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,MAAM,MAAM,oBAAoB,CAAA;AAQvC,MAAM,UAAU;IACd,QAAQ,CAAS;IACjB,QAAQ,CAAQ;IAChB;;oDAEgD;IAChD,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,KAAK,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvE,uEAAuE;QACvE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,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,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,iEAAiE;IACjE,IAAI,GAAG;QACL,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAAwB;QAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAsB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;CACF;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"Expression.js","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,MAAM,MAAM,oBAAoB,CAAA;AAMvC,MAAM,UAAU;IACd,QAAQ,CAAS;IACjB,QAAQ,CAAQ;IAChB;;oDAEgD;IAChD,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,KAAK,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvE,uEAAuE;QACvE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,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,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,iEAAiE;IACjE,IAAI,GAAG;QACL,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,eAAe,UAAU,CAAA"}
package/esm/Jexl.js CHANGED
@@ -24,24 +24,21 @@ class Jexl {
24
24
  this.expr = this.expr.bind(this);
25
25
  }
26
26
  addBinaryOp(operator, precedence, fn, manualEval) {
27
- // replacing `-` keeps its prefix form, which is a separate operation
27
+ // a replacement keeps how the operator parses: `-` its prefix form, `^`
28
+ // its grouping from the right
28
29
  const previous = this._grammar.elements[operator];
29
- const unaryEval = previous?.type === 'binaryOp' ? previous.unaryEval : undefined;
30
+ const { unaryEval, rightAssociative } = previous?.type === 'binaryOp' ? previous : {};
30
31
  // the overloads above pair `fn` with `manualEval`; the implementation
31
32
  // signature can't express that correlation, hence the assertions
32
- this._addGrammarElement(operator, manualEval
33
- ? {
34
- type: 'binaryOp',
35
- precedence,
36
- evalOnDemand: fn,
37
- unaryEval
38
- }
39
- : {
40
- type: 'binaryOp',
41
- precedence,
42
- eval: fn,
43
- unaryEval
44
- });
33
+ this._addGrammarElement(operator, {
34
+ type: 'binaryOp',
35
+ precedence,
36
+ unaryEval,
37
+ rightAssociative,
38
+ ...(manualEval
39
+ ? { evalOnDemand: fn }
40
+ : { eval: fn })
41
+ });
45
42
  }
46
43
  /**
47
44
  * Adds or replaces an expression function in this Jexl instance.
@@ -76,7 +73,6 @@ class Jexl {
76
73
  addUnaryOp(operator, fn) {
77
74
  this._addGrammarElement(operator, {
78
75
  type: 'unaryOp',
79
- precedence: Infinity,
80
76
  eval: fn
81
77
  });
82
78
  }
package/esm/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":"AAAA;;;GAGG;AAEH,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AA0BzC,MAAM,YAAY,GAAG,MAAM,CAAA;AAE3B;;;;;GAKG;AACH,MAAM,IAAI;IACR,QAAQ,CAAS;IACjB,0EAA0E;IAC1E,gEAAgE;IAChE,MAAM,CAAO;IACb,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAA;IAEzC,YAAY,EAAE,SAAS,EAAE,cAAc,KAAkB,EAAE;QACzD,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,UAAU,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAA;QAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAiCD,WAAW,CACT,QAAgB,EAChB,UAAkB,EAClB,EAAsC,EACtC,UAAoB;QAEpB,wEAAwE;QACxE,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACjD,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GACnC,QAAQ,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/C,sEAAsE;QACtE,iEAAiE;QACjE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YAChC,IAAI,EAAE,UAAU;YAChB,UAAU;YACV,SAAS;YACT,gBAAgB;YAChB,GAAG,CAAC,UAAU;gBACZ,CAAC,CAAC,EAAE,YAAY,EAAE,EAA0B,EAAE;gBAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,EAA6B,EAAE,CAAC;SAC7C,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,IAAY,EAAE,EAAe;QACvC,uEAAuE;QACvE,uEAAuE;QACvE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAA0B,CAAA;IAC5D,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,GAAgC;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC7C,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,QAAgB,EAAE,EAAe;QAC1C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YAChC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAA4B;SACnC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,UAAkB;QACxB,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAA;YACtD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAA;YAC5D,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;QAC1C,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,UAAkB;QACjC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC/D,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,UAAkB;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAA;IACrC,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,UAAkB,EAAE,OAAO,GAAG,EAAE;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,IAA0B,EAAE,GAAG,IAAiB;QACnD,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACxC,OAAO,IAAI,GAAG,CAAA;YACd,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;gBACrB,IACE,OAAO,GAAG,KAAK,QAAQ;oBACvB,OAAO,GAAG,KAAK,QAAQ;oBACvB,OAAO,GAAG,KAAK,SAAS,EACxB,CAAC;oBACD,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAA;gBACxB,CAAC;qBAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACvC,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,QAAgB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC7C,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACxD,IAAI,CAAC,eAAe,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,GAAW,EAAE,GAAmB;QACjD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;QACjC,IAAI,CAAC,eAAe,EAAE,CAAA;IACxB,CAAC;IAED,eAAe;QACb,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;CACF;AAED,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAA;AAC/B,eAAe,YAAY,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,CAAA"}
package/esm/Lexer.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { Grammar } from './grammar.ts';
2
2
  import type { TemplatePart, Token } from './types.ts';
3
+ export declare const identRegex: RegExp;
3
4
  /**
4
5
  * Lexer handles the lexical parsing of a Jexl string. Its responsibility is to
5
6
  * identify the "parts of speech" of a Jexl expression, and tokenize and label
@@ -22,110 +23,27 @@ declare class Lexer {
22
23
  * regex is derived from their keys.
23
24
  */
24
25
  _clearCache(): void;
25
- /**
26
- * Splits a Jexl expression string into an array of expression elements.
27
- * @param {string} str A Jexl expression string
28
- * @returns {Array<string>} An array of substrings defining the functional
29
- * elements of the expression.
30
- */
26
+ /** Splits a Jexl string into its elements: tokens and runs of whitespace. */
31
27
  getElements(str: string): string[];
32
28
  /**
33
- * Converts an array of expression elements into an array of tokens. Note that
34
- * the resulting array may not equal the element array in length, as any
35
- * elements that consist only of whitespace get appended to the previous
36
- * token's "raw" property. For the structure of a token object, please see
37
- * {@link Lexer#tokenize}.
38
- * @param {Array<string>} elements An array of Jexl expression elements to be
39
- * converted to tokens
40
- * @returns {Array<{type, value, raw}>} an array of token objects.
29
+ * The tokens for a list of elements. Whitespace makes no token of its own;
30
+ * it joins the `raw` of the token before it.
41
31
  */
42
32
  getTokens(elements: string[]): Token[];
43
33
  /**
44
- * Converts a Jexl string into an array of tokens. Each token is an object
45
- * in the following format:
46
- *
47
- * {
48
- * type: <string>,
49
- * [name]: <string>,
50
- * value: <boolean|number|string>,
51
- * raw: <string>
52
- * }
53
- *
54
- * Type is one of the following:
55
- *
56
- * literal, identifier, binaryOp, unaryOp
57
- *
58
- * OR, if the token is a control character its type is the name of the element
59
- * defined in the Grammar.
60
- *
61
- * Name appears only if the token is a control string found in
62
- * {@link grammar#elements}, and is set to the name of the element.
63
- *
64
- * Value is the value of the token in the correct type (boolean or numeric as
65
- * appropriate). Raw is the string representation of this value taken directly
66
- * from the expression string, including any trailing spaces.
67
- * @param {string} str The Jexl string to be tokenized
68
- * @returns {Array<{type, value, raw}>} an array of token objects.
69
- * @throws {Error} if the provided string contains an invalid token.
34
+ * Splits a Jexl string into tokens. A token's `type` is `literal`,
35
+ * `templateString`, `identifier` or the type of the grammar element it
36
+ * spells; its `value` is a literal's value or the template's parts; its `raw`
37
+ * is its source text and any whitespace after it.
38
+ * @throws {JexlSyntaxError} for text that is no token
70
39
  */
71
40
  tokenize(str: string): Token[];
72
- /**
73
- * Creates a new token object from an element of a Jexl string. See
74
- * {@link Lexer#tokenize} for a description of the token object.
75
- * @param {string} element The element from which a token should be made
76
- * @returns {{value: number|boolean|string, [name]: string, type: string,
77
- * raw: string}} a token object describing the provided element.
78
- * @throws {Error} if the provided string is not a valid expression element.
79
- * @private
80
- */
81
41
  _createToken(element: string, offset?: number): Token;
82
- /**
83
- * Escapes a string so that it can be treated as a string literal within a
84
- * regular expression. A word such as `in` also stops matching inside a
85
- * longer name.
86
- * @param {string} str The string to be escaped
87
- * @returns {string} the RegExp-escaped string.
88
- * @see https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions
89
- * @private
90
- */
42
+ /** A grammar element's text as a regex. A word such as `in` also stops
43
+ * matching inside a longer name. */
91
44
  _escapeRegExp(str: string): string;
92
- /**
93
- * Gets a RegEx object appropriate for splitting a Jexl string into its core
94
- * elements.
95
- * @returns {RegExp} An element-splitting RegExp object
96
- * @private
97
- */
98
45
  _getSplitRegex(): RegExp;
99
- /**
100
- * Determines whether the addition of a '-' token should be interpreted as a
101
- * negative symbol for an upcoming number, given an array of tokens already
102
- * processed.
103
- * @param {Array<Object>} tokens An array of tokens already processed
104
- * @returns {boolean} true if adding a '-' should be considered a negative
105
- * symbol; false otherwise
106
- * @private
107
- */
108
- _isNegative(tokens: Token[]): boolean;
109
- /**
110
- * A utility function to determine if a string consists of only space
111
- * characters.
112
- * @param {string} str A string to be tested
113
- * @returns {boolean} true if the string is empty or consists of only spaces;
114
- * false otherwise.
115
- * @private
116
- */
117
- _isWhitespace(str: string): boolean;
118
- /**
119
- * Removes the beginning and trailing quotes from a string, unescapes any
120
- * escaped quotes on its interior, and unescapes any escaped escape
121
- * characters. Note that this function is not defensive; it assumes that the
122
- * provided string is not empty, and that its first and last characters are
123
- * actually quotes.
124
- * @param {string} str A string whose first and last characters are quotes
125
- * @returns {string} a string with the surrounding quotes stripped and escapes
126
- * properly processed.
127
- * @private
128
- */
46
+ /** A quoted string literal's text, unquoted and unescaped. */
129
47
  _unquote(str: string): string;
130
48
  _parseTemplateString(str: string, offset?: number): TemplatePart[];
131
49
  _unescapeTemplateString(str: string): string;