@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
package/dist/grammar.js CHANGED
@@ -4,17 +4,39 @@
4
4
  * Copyright 2020 Tom Shawver
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.getGrammar = void 0;
8
- exports.precedenceOf = precedenceOf;
9
- /**
10
- * Returns the binding power of a grammar element, or 0 for elements that
11
- * aren't operators and therefore don't participate in precedence.
12
- */
13
- function precedenceOf(elem) {
14
- return elem && (elem.type === 'binaryOp' || elem.type === 'unaryOp')
15
- ? elem.precedence
16
- : 0;
17
- }
7
+ exports.getGrammar = exports.nullish = exports.or = exports.and = void 0;
8
+ /* eslint eqeqeq:0 */
9
+ const collections_ts_1 = require("./collections.js");
10
+ const operators_ts_1 = require("./operators.js");
11
+ const plus = (left, right) => left + right;
12
+ const minus = (left, right) => left - right;
13
+ const times = (left, right) => left * right;
14
+ const divide = (left, right) => left / right;
15
+ const floorDivide = (left, right) => Math.floor(left / right);
16
+ const modulo = (left, right) => left % right;
17
+ const power = (left, right) => left ** right;
18
+ const loose = (left, right) => left == right;
19
+ // a missing value orders against nothing, as bcftools skips one; JavaScript
20
+ // alone would read null as 0, making [null, 0.2] < 0.05 true
21
+ const greater = (left, right) => left != null && right != null && left > right;
22
+ const atLeast = (left, right) => left != null && right != null && left >= right;
23
+ const less = (left, right) => left != null && right != null && left < right;
24
+ const atMost = (left, right) => left != null && right != null && left <= right;
25
+ // named so the compiler can recognize the built-in forms and short-circuit
26
+ // without the thunks a host's evalOnDemand operator is handed
27
+ const and = (left, right) => {
28
+ const leftVal = left.eval();
29
+ return leftVal ? right.eval() : leftVal;
30
+ };
31
+ exports.and = and;
32
+ const or = (left, right) => {
33
+ const leftVal = left.eval();
34
+ return leftVal || right.eval();
35
+ };
36
+ exports.or = or;
37
+ const nullish = (left, right) => left.eval() ?? right.eval();
38
+ exports.nullish = nullish;
39
+ const equals = (left, right) => (0, operators_ts_1.isList)(left, right) ? (0, operators_ts_1.anyPair)(loose, left, right) : left == right;
18
40
  const getGrammar = () => ({
19
41
  /**
20
42
  * A map of all expression elements to their properties. Note that changes
@@ -33,111 +55,117 @@ const getGrammar = () => ({
33
55
  ')': { type: 'closeParen' },
34
56
  '?': { type: 'question' },
35
57
  ';': { type: 'semicolon' },
58
+ '=>': { type: 'arrow' },
36
59
  '+': {
37
60
  type: 'binaryOp',
38
61
  precedence: 30,
39
- eval: (left, right) => left + right
62
+ eval: (left, right) => (0, operators_ts_1.addsPairwise)(left, right)
63
+ ? (0, operators_ts_1.pairwise)(plus, left, right)
64
+ : plus(left, right)
40
65
  },
41
66
  '-': {
42
67
  type: 'binaryOp',
43
68
  precedence: 30,
44
- eval: (left, right) => left - right,
45
- unaryEval: (right) => -right
69
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right) ? (0, operators_ts_1.pairwise)(minus, left, right) : minus(left, right),
70
+ unaryEval: (right) => Array.isArray(right)
71
+ ? right.map((value) => -value)
72
+ : -right
46
73
  },
47
74
  '*': {
48
75
  type: 'binaryOp',
49
76
  precedence: 40,
50
- eval: (left, right) => left * right
77
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right) ? (0, operators_ts_1.pairwise)(times, left, right) : times(left, right)
51
78
  },
52
79
  '/': {
53
80
  type: 'binaryOp',
54
81
  precedence: 40,
55
- eval: (left, right) => left / right
82
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right)
83
+ ? (0, operators_ts_1.pairwise)(divide, left, right)
84
+ : divide(left, right)
56
85
  },
57
86
  '//': {
58
87
  type: 'binaryOp',
59
88
  precedence: 40,
60
- eval: (left, right) => Math.floor(left / right)
89
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right)
90
+ ? (0, operators_ts_1.pairwise)(floorDivide, left, right)
91
+ : floorDivide(left, right)
61
92
  },
62
93
  '%': {
63
94
  type: 'binaryOp',
64
95
  precedence: 50,
65
- eval: (left, right) => left % right
96
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right)
97
+ ? (0, operators_ts_1.pairwise)(modulo, left, right)
98
+ : modulo(left, right)
66
99
  },
67
100
  '^': {
68
101
  type: 'binaryOp',
69
102
  precedence: 50,
70
- eval: (left, right) => left ** right
103
+ rightAssociative: true,
104
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right) ? (0, operators_ts_1.pairwise)(power, left, right) : power(left, right)
71
105
  },
72
106
  '==': {
73
107
  type: 'binaryOp',
74
108
  precedence: 20,
75
- eval: (left, right) => left == right
109
+ eval: equals
76
110
  },
77
111
  '!=': {
78
112
  type: 'binaryOp',
79
113
  precedence: 20,
80
- eval: (left, right) => left != right
114
+ eval: (left, right) => !equals(left, right)
115
+ },
116
+ '~': {
117
+ type: 'binaryOp',
118
+ precedence: 20,
119
+ eval: operators_ts_1.matches
120
+ },
121
+ '!~': {
122
+ type: 'binaryOp',
123
+ precedence: 20,
124
+ eval: (left, right) => !(0, operators_ts_1.matches)(left, right)
81
125
  },
82
126
  '>': {
83
127
  type: 'binaryOp',
84
128
  precedence: 20,
85
- eval: (left, right) => left > right
129
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right)
130
+ ? (0, operators_ts_1.anyPair)(greater, left, right)
131
+ : greater(left, right)
86
132
  },
87
133
  '>=': {
88
134
  type: 'binaryOp',
89
135
  precedence: 20,
90
- eval: (left, right) => left >= right
136
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right)
137
+ ? (0, operators_ts_1.anyPair)(atLeast, left, right)
138
+ : atLeast(left, right)
91
139
  },
92
140
  '<': {
93
141
  type: 'binaryOp',
94
142
  precedence: 20,
95
- eval: (left, right) => left < right
143
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right) ? (0, operators_ts_1.anyPair)(less, left, right) : less(left, right)
96
144
  },
97
145
  '<=': {
98
146
  type: 'binaryOp',
99
147
  precedence: 20,
100
- eval: (left, right) => left <= right
148
+ eval: (left, right) => (0, operators_ts_1.isList)(left, right) ? (0, operators_ts_1.anyPair)(atMost, left, right) : atMost(left, right)
101
149
  },
102
150
  '&&': {
103
151
  type: 'binaryOp',
104
- precedence: 10,
105
- evalOnDemand: (left, right) => {
106
- const leftVal = left.eval();
107
- if (!leftVal) {
108
- return leftVal;
109
- }
110
- return right.eval();
111
- }
152
+ precedence: 11,
153
+ evalOnDemand: exports.and
112
154
  },
113
155
  '||': {
114
156
  type: 'binaryOp',
115
157
  precedence: 10,
116
- evalOnDemand: (left, right) => {
117
- const leftVal = left.eval();
118
- if (leftVal) {
119
- return leftVal;
120
- }
121
- return right.eval();
122
- }
158
+ evalOnDemand: exports.or
159
+ },
160
+ '??': {
161
+ type: 'binaryOp',
162
+ precedence: 10,
163
+ evalOnDemand: exports.nullish
123
164
  },
124
165
  in: {
125
166
  type: 'binaryOp',
126
167
  precedence: 20,
127
- eval: (left, right) => {
128
- if (typeof right === 'string') {
129
- // only a primitive has a meaningful substring form. An absent or
130
- // structured left operand is not "in" a string, and must not be
131
- // coerced to '' — every string contains the empty string, so that
132
- // made `feature.missingAttr in "someString"` true for every feature.
133
- return typeof left === 'string' ||
134
- typeof left === 'number' ||
135
- typeof left === 'boolean'
136
- ? right.includes(String(left))
137
- : false;
138
- }
139
- return Array.isArray(right) ? right.includes(left) : false;
140
- }
168
+ eval: operators_ts_1.isIn
141
169
  },
142
170
  '!': {
143
171
  type: 'unaryOp',
@@ -166,7 +194,7 @@ const getGrammar = () => ({
166
194
  * than throw. An error is only appropriate when the function would normally
167
195
  * return a value, but cannot due to some other failure.
168
196
  */
169
- functions: {}
197
+ functions: { ...collections_ts_1.collectionFunctions }
170
198
  });
171
199
  exports.getGrammar = getGrammar;
172
200
  //# sourceMappingURL=grammar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"grammar.js","sourceRoot":"","sources":["../src/grammar.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grammar.js","sourceRoot":"","sources":["../src/grammar.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,14 @@
1
1
  export { Jexl, default } from './Jexl.ts';
2
+ export type { JexlOptions } from './Jexl.ts';
3
+ export type { GetMember, VariableReader } from './grammar.ts';
2
4
  export { default as Expression } from './Expression.ts';
5
+ export { analyze } from './analyze.ts';
6
+ export { check, print, recordOf, union } from './check.ts';
7
+ export { callSubject, conditions, fromConditions, pathSubject, printCondition } from './conditions.ts';
3
8
  export { default as Lexer } from './Lexer.ts';
9
+ export { JexlSyntaxError } from './errors.ts';
4
10
  export { getGrammar } from './grammar.ts';
11
+ export type * from './analyze.ts';
12
+ export type * from './check.ts';
13
+ export type * from './conditions.ts';
5
14
  export type * from './types.ts';
package/dist/index.js CHANGED
@@ -7,14 +7,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.getGrammar = exports.Lexer = exports.Expression = exports.default = exports.Jexl = void 0;
10
+ exports.getGrammar = exports.JexlSyntaxError = exports.Lexer = exports.printCondition = exports.pathSubject = exports.fromConditions = exports.conditions = exports.callSubject = exports.union = exports.recordOf = exports.print = exports.check = exports.analyze = exports.Expression = exports.default = exports.Jexl = void 0;
11
11
  var Jexl_ts_1 = require("./Jexl.js");
12
12
  Object.defineProperty(exports, "Jexl", { enumerable: true, get: function () { return Jexl_ts_1.Jexl; } });
13
13
  Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(Jexl_ts_1).default; } });
14
14
  var Expression_ts_1 = require("./Expression.js");
15
15
  Object.defineProperty(exports, "Expression", { enumerable: true, get: function () { return __importDefault(Expression_ts_1).default; } });
16
+ var analyze_ts_1 = require("./analyze.js");
17
+ Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return analyze_ts_1.analyze; } });
18
+ var check_ts_1 = require("./check.js");
19
+ Object.defineProperty(exports, "check", { enumerable: true, get: function () { return check_ts_1.check; } });
20
+ Object.defineProperty(exports, "print", { enumerable: true, get: function () { return check_ts_1.print; } });
21
+ Object.defineProperty(exports, "recordOf", { enumerable: true, get: function () { return check_ts_1.recordOf; } });
22
+ Object.defineProperty(exports, "union", { enumerable: true, get: function () { return check_ts_1.union; } });
23
+ var conditions_ts_1 = require("./conditions.js");
24
+ Object.defineProperty(exports, "callSubject", { enumerable: true, get: function () { return conditions_ts_1.callSubject; } });
25
+ Object.defineProperty(exports, "conditions", { enumerable: true, get: function () { return conditions_ts_1.conditions; } });
26
+ Object.defineProperty(exports, "fromConditions", { enumerable: true, get: function () { return conditions_ts_1.fromConditions; } });
27
+ Object.defineProperty(exports, "pathSubject", { enumerable: true, get: function () { return conditions_ts_1.pathSubject; } });
28
+ Object.defineProperty(exports, "printCondition", { enumerable: true, get: function () { return conditions_ts_1.printCondition; } });
16
29
  var Lexer_ts_1 = require("./Lexer.js");
17
30
  Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return __importDefault(Lexer_ts_1).default; } });
31
+ var errors_ts_1 = require("./errors.js");
32
+ Object.defineProperty(exports, "JexlSyntaxError", { enumerable: true, get: function () { return errors_ts_1.JexlSyntaxError; } });
18
33
  var grammar_ts_1 = require("./grammar.js");
19
34
  Object.defineProperty(exports, "getGrammar", { enumerable: true, get: function () { return grammar_ts_1.getGrammar; } });
20
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,qCAAyC;AAAhC,+FAAA,IAAI,OAAA;AAAE,mHAAA,OAAO,OAAA;AACtB,iDAAuD;AAA9C,4HAAA,OAAO,OAAc;AAC9B,uCAA6C;AAApC,kHAAA,OAAO,OAAS;AACzB,2CAAyC;AAAhC,wGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,qCAAyC;AAAhC,+FAAA,IAAI,OAAA;AAAE,mHAAA,OAAO,OAAA;AAGtB,iDAAuD;AAA9C,4HAAA,OAAO,OAAc;AAC9B,2CAAsC;AAA7B,qGAAA,OAAO,OAAA;AAChB,uCAA0D;AAAjD,iGAAA,KAAK,OAAA;AAAE,iGAAA,KAAK,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAAE,iGAAA,KAAK,OAAA;AACtC,iDAMwB;AALtB,4GAAA,WAAW,OAAA;AACX,2GAAA,UAAU,OAAA;AACV,+GAAA,cAAc,OAAA;AACd,4GAAA,WAAW,OAAA;AACX,+GAAA,cAAc,OAAA;AAEhB,uCAA6C;AAApC,kHAAA,OAAO,OAAS;AACzB,yCAA6C;AAApC,4GAAA,eAAe,OAAA;AACxB,2CAAyC;AAAhC,wGAAA,UAAU,OAAA"}
@@ -0,0 +1,34 @@
1
+ import type { JexlValue } from './types.ts';
2
+ type Test = (left: JexlValue, right: JexlValue) => boolean;
3
+ type Arithmetic = (left: JexlValue, right: JexlValue) => JexlValue;
4
+ export declare function isList(left: JexlValue, right: JexlValue): boolean;
5
+ /**
6
+ * A comparison over list operands: it holds when it holds for any value, as
7
+ * bcftools compares a multi-valued tag, so `AF > 0.05` is true when any
8
+ * allele's frequency is and `CLNSIG == 'Pathogenic'` when any significance is.
9
+ * Each operator calls this only once {@link isList} says it must, so the
10
+ * comparison of two single values stays a direct call V8 can inline.
11
+ */
12
+ export declare function anyPair(test: Test, left: JexlValue, right: JexlValue): boolean;
13
+ /**
14
+ * Whether `+` pairs its operands value by value: only when a list is involved
15
+ * and neither side holds text, so `REF + '>' + ALT` still joins as JavaScript
16
+ * joins, `'A>T,C'`, while `DP + 1` adds.
17
+ */
18
+ export declare function addsPairwise(left: JexlValue, right: JexlValue): boolean;
19
+ /**
20
+ * Arithmetic over list operands, value by value, as bcftools and R apply it:
21
+ * `AC / AN` divides each count, and a list of one, or a lone value, pairs with
22
+ * every value of the other side. Lists of two other lengths have no pairing
23
+ * and yield undefined.
24
+ */
25
+ export declare function pairwise(fn: Arithmetic, left: JexlValue, right: JexlValue): JexlValue;
26
+ /** Whether a value, or any value of a list, matches a pattern string. */
27
+ export declare function matches(value: JexlValue, pattern: JexlValue): boolean;
28
+ /**
29
+ * Whether a value is in a container: a substring of a string, a member of a
30
+ * list or Set, or a key of a Map or plain object. A list on the left is in
31
+ * the container when any of its values is.
32
+ */
33
+ export declare function isIn(left: JexlValue, right: JexlValue): boolean;
34
+ export {};
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ /*
3
+ * Jexl
4
+ * Copyright 2020 Tom Shawver
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isList = isList;
8
+ exports.anyPair = anyPair;
9
+ exports.addsPairwise = addsPairwise;
10
+ exports.pairwise = pairwise;
11
+ exports.matches = matches;
12
+ exports.isIn = isIn;
13
+ function isList(left, right) {
14
+ return Array.isArray(left) || Array.isArray(right);
15
+ }
16
+ /**
17
+ * A comparison over list operands: it holds when it holds for any value, as
18
+ * bcftools compares a multi-valued tag, so `AF > 0.05` is true when any
19
+ * allele's frequency is and `CLNSIG == 'Pathogenic'` when any significance is.
20
+ * Each operator calls this only once {@link isList} says it must, so the
21
+ * comparison of two single values stays a direct call V8 can inline.
22
+ */
23
+ function anyPair(test, left, right) {
24
+ return Array.isArray(left)
25
+ ? left.some((l) => anyPair(test, l, right))
26
+ : Array.isArray(right)
27
+ ? right.some((r) => anyPair(test, left, r))
28
+ : test(left, right);
29
+ }
30
+ function hasText(value) {
31
+ return (typeof value === 'string' ||
32
+ (Array.isArray(value) && value.some((item) => typeof item === 'string')));
33
+ }
34
+ /**
35
+ * Whether `+` pairs its operands value by value: only when a list is involved
36
+ * and neither side holds text, so `REF + '>' + ALT` still joins as JavaScript
37
+ * joins, `'A>T,C'`, while `DP + 1` adds.
38
+ */
39
+ function addsPairwise(left, right) {
40
+ return isList(left, right) && !hasText(left) && !hasText(right);
41
+ }
42
+ /**
43
+ * Arithmetic over list operands, value by value, as bcftools and R apply it:
44
+ * `AC / AN` divides each count, and a list of one, or a lone value, pairs with
45
+ * every value of the other side. Lists of two other lengths have no pairing
46
+ * and yield undefined.
47
+ */
48
+ function pairwise(fn, left, right) {
49
+ const ls = Array.isArray(left) ? left : [left];
50
+ const rs = Array.isArray(right) ? right : [right];
51
+ if (ls.length !== rs.length && ls.length !== 1 && rs.length !== 1) {
52
+ return undefined;
53
+ }
54
+ const length = ls.length === 1 ? rs.length : ls.length;
55
+ const out = new Array(length);
56
+ for (let i = 0; i < length; i++) {
57
+ out[i] = fn(ls.length === 1 ? ls[0] : ls[i], rs.length === 1 ? rs[0] : rs[i]);
58
+ }
59
+ return out;
60
+ }
61
+ const patterns = new Map();
62
+ const MAX_PATTERNS = 1000;
63
+ /**
64
+ * The regular expression a pattern string stands for. A leading `(?i)`, the
65
+ * inline flag PCRE, Python and Go read, makes it case-insensitive.
66
+ */
67
+ function regex(pattern) {
68
+ let re = patterns.get(pattern);
69
+ if (!re) {
70
+ try {
71
+ re = pattern.startsWith('(?i)')
72
+ ? new RegExp(pattern.slice(4), 'i')
73
+ : new RegExp(pattern);
74
+ }
75
+ catch {
76
+ throw new Error(`Invalid regular expression: ${pattern}`);
77
+ }
78
+ if (patterns.size >= MAX_PATTERNS) {
79
+ patterns.clear();
80
+ }
81
+ patterns.set(pattern, re);
82
+ }
83
+ return re;
84
+ }
85
+ /** Whether a value, or any value of a list, matches a pattern string. */
86
+ function matches(value, pattern) {
87
+ if (typeof pattern !== 'string') {
88
+ return false;
89
+ }
90
+ const re = regex(pattern);
91
+ const test = (v) => (typeof v === 'string' ||
92
+ typeof v === 'number' ||
93
+ typeof v === 'boolean') &&
94
+ re.test(String(v));
95
+ return Array.isArray(value) ? value.some(test) : test(value);
96
+ }
97
+ /**
98
+ * Whether a value is in a container: a substring of a string, a member of a
99
+ * list or Set, or a key of a Map or plain object. A list on the left is in
100
+ * the container when any of its values is.
101
+ */
102
+ function isIn(left, right) {
103
+ if (Array.isArray(left)) {
104
+ return left.some((l) => isIn(l, right));
105
+ }
106
+ if (typeof right === 'string') {
107
+ // only a primitive has a meaningful substring form. An absent or
108
+ // structured left operand is not "in" a string, and must not be coerced
109
+ // to '' — every string contains the empty string
110
+ return typeof left === 'string' ||
111
+ typeof left === 'number' ||
112
+ typeof left === 'boolean'
113
+ ? right.includes(String(left))
114
+ : false;
115
+ }
116
+ if (Array.isArray(right)) {
117
+ return right.includes(left);
118
+ }
119
+ if (right instanceof Set || right instanceof Map) {
120
+ return right.has(left);
121
+ }
122
+ if (typeof right === 'object' &&
123
+ right !== null &&
124
+ (typeof left === 'string' ||
125
+ typeof left === 'number' ||
126
+ typeof left === 'boolean')) {
127
+ return Object.hasOwn(right, String(left));
128
+ }
129
+ return false;
130
+ }
131
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../src/operators.ts"],"names":[],"mappings":"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"}
@@ -1,104 +1,61 @@
1
+ import { JexlSyntaxError } from '../errors.ts';
1
2
  import type Lexer from '../Lexer.ts';
2
3
  import type { Grammar } from '../grammar.ts';
3
- import type { AstNode, Token } from '../types.ts';
4
+ import type { AstNode, AstNodeUnion, Lambda, ObjectLiteral, TemplateLiteral, TemplatePart, Token } from '../types.ts';
5
+ export { JexlSyntaxError } from '../errors.ts';
4
6
  /**
5
- * The Parser is a state machine that converts tokens from the {@link Lexer}
6
- * into an Abstract Syntax Tree (AST), capable of being evaluated in any
7
- * context by {@link compileAst}. The Parser expects that all tokens
8
- * provided to it are legal and typed properly according to the grammar, but
9
- * accepts that the tokens may still be in an invalid order or in some other
10
- * unparsable configuration that requires it to throw an Error.
11
- * @param {{}} grammar The grammar object to use to parse Jexl strings
12
- * @param {string} [prefix] A string prefix to prepend to the expression string
13
- * for error messaging purposes. This is useful for when a new Parser is
14
- * instantiated to parse an subexpression, as the parent Parser's
15
- * expression string thus far can be passed for a more user-friendly
16
- * error message.
17
- * @param {{}} [stopMap] A mapping of token types to any truthy value. When the
18
- * token type is encountered, the parser will return the mapped value
19
- * instead of boolean false.
7
+ * Converts the tokens from the {@link Lexer} into an Abstract Syntax Tree, for
8
+ * {@link compileAst} to lower to closures. A Pratt parser: each level of the
9
+ * grammar is a method, from `_sequence` (loosest) down to `_primary`, and
10
+ * binary operators are climbed by the precedence the grammar gives them, so
11
+ * operators a host registers slot in without the parser knowing them.
20
12
  */
21
13
  declare class Parser {
22
14
  _grammar: Grammar;
23
15
  _lexer: Lexer;
24
- _state: string;
25
- _tree: AstNode | null;
26
- _exprStr: string;
27
- _stopMap: Record<string, string>;
28
- _cursor?: AstNode | null;
29
- _subParser?: Parser;
30
- _parentStop?: boolean;
31
- _nextIdentEncapsulate?: boolean;
32
- _curObjKey?: string;
33
- _sequenceExpressions?: AstNode[];
34
- constructor(grammar: Grammar, lexer: Lexer, prefix?: string, stopMap?: Record<string, string>);
16
+ _tokens: Token[];
17
+ _pos: number;
18
+ _offset: number;
19
+ _grouped?: WeakSet<AstNode>;
20
+ _lambdaDepth: number;
35
21
  /**
36
- * Processes a new token into the AST and manages the transitions of the state
37
- * machine.
38
- * @param {{type: <string>}} token A token object, as provided by the
39
- * {@link Lexer#tokenize} function.
40
- * @throws {Error} if a token is added when the Parser has been marked as
41
- * complete by {@link #complete}, or if an unexpected token type is added.
42
- * @returns {boolean|*} the stopState value if this parser encountered a token
43
- * in the stopState mapb false if tokens can continue.
44
- */
45
- addToken(token: Token): string | false;
46
- /**
47
- * Processes an array of tokens iteratively through the {@link #addToken}
48
- * function.
49
- * @param {Array<{type: <string>}>} tokens An array of tokens, as provided by
50
- * the {@link Lexer#tokenize} function.
22
+ * @param offset where the tokens start in the source, so that an error
23
+ * inside a template interpolation reports its place in the whole
51
24
  */
25
+ constructor(grammar: Grammar, lexer: Lexer, offset?: number);
26
+ parse(source: string): AstNodeUnion | null;
52
27
  addTokens(tokens: Token[]): void;
53
28
  /**
54
- * Marks this Parser instance as completed and retrieves the full AST.
55
- * @returns {{}|null} a full expression tree, ready for evaluation by the
56
- * {@link compileAst} function, or null if no tokens were passed to
57
- * the parser before complete was called
58
- * @throws {Error} if the parser is not in a state where it's legal to end
59
- * the expression, indicating that the expression is incomplete
60
- */
61
- complete(): AstNode | null;
62
- /**
63
- * Ends a subexpression by completing the subParser and passing its result
64
- * to the subHandler configured in the current state.
65
- * @private
66
- */
67
- _endSubExpression(): void;
68
- /**
69
- * Places a new tree node at the current position of the cursor (to the 'right'
70
- * property) and then advances the cursor to the new node. This function also
71
- * handles setting the parent of the new node.
72
- * @param {{type: <string>}} node A node to be added to the AST
73
- * @private
74
- */
75
- _placeAtCursor(node: AstNode): void;
76
- /**
77
- * Places a tree node before the current position of the cursor, replacing
78
- * the node that the cursor currently points to. This should only be called in
79
- * cases where the cursor is known to exist, and the provided node already
80
- * contains a pointer to what's at the cursor currently.
81
- * @param {{type: <string>}} node A node to be added to the AST
82
- * @private
83
- */
84
- _placeBeforeCursor(node: AstNode): void;
85
- /**
86
- * Sets the parent of a node by creating a non-enumerable _parent property
87
- * that points to the supplied parent argument.
88
- * @param {{type: <string>}} node A node of the AST on which to set a new
89
- * parent
90
- * @param {{type: <string>}} parent An existing node of the AST to serve as the
91
- * parent of the new node
92
- * @private
93
- */
94
- _setParent(node: AstNode, parent: AstNode): void;
95
- /**
96
- * Prepares the Parser to accept a subexpression by (re)instantiating the
97
- * subParser.
98
- * @param {string} [exprStr] The expression string to prefix to the new Parser
99
- * @returns {Parser} the new subParser, also stored on this instance
100
- * @private
101
- */
102
- _startSubExpression(exprStr?: string): Parser;
29
+ * @returns the expression tree, or null for an expression with no tokens
30
+ * @throws {JexlSyntaxError} if the tokens do not form exactly one expression
31
+ */
32
+ complete(): AstNodeUnion | null;
33
+ _sequence(): AstNodeUnion;
34
+ _assignment(): AstNodeUnion;
35
+ _atLambda(): boolean;
36
+ /** Parses the lambda {@link _atLambda} found, whose shape it has checked. */
37
+ _lambda(): Lambda;
38
+ _ternary(): AstNodeUnion;
39
+ /**
40
+ * Parses operands joined by binary operators that bind tighter than `floor`.
41
+ * One exactly at `floor` binds only when it continues a right-associative
42
+ * chain, which is how `a ^ b ^ c` groups from the right.
43
+ */
44
+ _binary(floor: number, rightAssociative?: boolean): AstNodeUnion;
45
+ /** `a ?? b || c` has no grouping a reader can guess; JS refuses it too. */
46
+ _mixesNullish(operator: string, ...operands: AstNodeUnion[]): boolean;
47
+ _unary(): AstNodeUnion;
48
+ _postfix(subject: AstNodeUnion): AstNodeUnion;
49
+ _primary(): AstNodeUnion;
50
+ _list(close: string): AstNode[];
51
+ _object(): ObjectLiteral;
52
+ _template(tokenParts: TemplatePart[], index: number): TemplateLiteral;
53
+ _peek(): Token | undefined;
54
+ _next(): Token;
55
+ _eat(type: string): boolean;
56
+ _expect(type: string): Token;
57
+ _unexpected(index: number): JexlSyntaxError;
58
+ _error(message: string, index: number): JexlSyntaxError;
59
+ _offsetOf(index: number): number;
103
60
  }
104
61
  export default Parser;