@jbrowse/jexl 5.0.2 → 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.
- package/README.md +4 -1
- package/dist/Jexl.js +12 -16
- package/dist/Jexl.js.map +1 -1
- package/dist/Lexer.d.ts +12 -94
- package/dist/Lexer.js +41 -142
- package/dist/Lexer.js.map +1 -1
- package/dist/analyze.d.ts +2 -0
- package/dist/analyze.js +7 -7
- package/dist/analyze.js.map +1 -1
- package/dist/check.js +30 -30
- package/dist/check.js.map +1 -1
- package/dist/collections.d.ts +7 -0
- package/dist/collections.js +9 -2
- package/dist/collections.js.map +1 -1
- package/dist/conditions.d.ts +1 -1
- package/dist/conditions.js +25 -47
- package/dist/conditions.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +8 -0
- package/dist/errors.js.map +1 -1
- package/dist/evaluator/compile.js +37 -24
- package/dist/evaluator/compile.js.map +1 -1
- package/dist/grammar.d.ts +2 -2
- package/dist/grammar.js +1 -8
- package/dist/grammar.js.map +1 -1
- package/dist/operators.d.ts +5 -0
- package/dist/operators.js +9 -5
- package/dist/operators.js.map +1 -1
- package/dist/parser/Parser.d.ts +11 -12
- package/dist/parser/Parser.js +4 -10
- package/dist/parser/Parser.js.map +1 -1
- package/dist/print.d.ts +1 -1
- package/dist/print.js +41 -47
- package/dist/print.js.map +1 -1
- package/dist/types.d.ts +18 -21
- package/esm/Jexl.js +12 -16
- package/esm/Jexl.js.map +1 -1
- package/esm/Lexer.d.ts +12 -94
- package/esm/Lexer.js +40 -142
- package/esm/Lexer.js.map +1 -1
- package/esm/analyze.d.ts +2 -0
- package/esm/analyze.js +6 -7
- package/esm/analyze.js.map +1 -1
- package/esm/check.js +28 -28
- package/esm/check.js.map +1 -1
- package/esm/collections.d.ts +7 -0
- package/esm/collections.js +8 -1
- package/esm/collections.js.map +1 -1
- package/esm/conditions.d.ts +1 -1
- package/esm/conditions.js +26 -48
- package/esm/conditions.js.map +1 -1
- package/esm/errors.d.ts +5 -0
- package/esm/errors.js +7 -0
- package/esm/errors.js.map +1 -1
- package/esm/evaluator/compile.js +37 -24
- package/esm/evaluator/compile.js.map +1 -1
- package/esm/grammar.d.ts +2 -2
- package/esm/grammar.js +1 -8
- package/esm/grammar.js.map +1 -1
- package/esm/operators.d.ts +5 -0
- package/esm/operators.js +8 -5
- package/esm/operators.js.map +1 -1
- package/esm/parser/Parser.d.ts +11 -12
- package/esm/parser/Parser.js +4 -8
- package/esm/parser/Parser.js.map +1 -1
- package/esm/print.d.ts +1 -1
- package/esm/print.js +41 -47
- package/esm/print.js.map +1 -1
- package/esm/types.d.ts +18 -21
- package/package.json +1 -1
- package/src/Jexl.ts +13 -20
- package/src/Lexer.ts +42 -144
- package/src/analyze.ts +10 -10
- package/src/check.ts +47 -53
- package/src/collections.ts +11 -1
- package/src/conditions.ts +38 -61
- package/src/errors.ts +10 -0
- package/src/evaluator/compile.ts +49 -36
- package/src/grammar.ts +3 -9
- package/src/operators.ts +10 -6
- package/src/parser/Parser.ts +13 -19
- package/src/print.ts +50 -52
- package/src/types.ts +19 -23
package/esm/Lexer.js
CHANGED
|
@@ -17,22 +17,20 @@ const wholeWord = (word) => `(?<!${identPart})${word}(?!${identPart})`;
|
|
|
17
17
|
// unsigned: whether a leading '-' negates is decided separately, in getTokens
|
|
18
18
|
const numberPattern = String.raw `(?:(?:[0-9]*\.[0-9]+)|[0-9]+)(?:[eE][+-]?[0-9]+)?`;
|
|
19
19
|
const numericRegex = new RegExp(`^-?${numberPattern}$`);
|
|
20
|
-
const identRegex = new RegExp(`^${identPattern}$`);
|
|
21
|
-
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
const
|
|
25
|
-
// the escapes a template string's static text recognizes. One pass, so the
|
|
26
|
-
// backslash an escaped backslash yields can't be re-read as the start of the
|
|
27
|
-
// escape that follows it
|
|
20
|
+
export const identRegex = new RegExp(`^${identPattern}$`);
|
|
21
|
+
// the escapes each kind of literal recognizes. One pass, so the backslash an
|
|
22
|
+
// escaped backslash yields can't be re-read as the start of the escape that
|
|
23
|
+
// follows it
|
|
24
|
+
const quoteEscRegex = { "'": /\\([\\'])/g, '"': /\\([\\"])/g };
|
|
28
25
|
const templateEscRegex = /\\([`$\\])/g;
|
|
29
26
|
const whitespaceRegex = /^\s*$/;
|
|
27
|
+
// a backslash and the character after it are a pair, so an escaped backslash
|
|
28
|
+
// before the closing quote can't escape that quote
|
|
29
|
+
const quoted = (quote) => String.raw `${quote}(?:\\[\s\S]|[^${quote}\\])*${quote}`;
|
|
30
30
|
const preOpRegexElems = [
|
|
31
|
-
|
|
32
|
-
'
|
|
33
|
-
|
|
34
|
-
String.raw `'(?:(?:\\')|[^'])*'`,
|
|
35
|
-
String.raw `"(?:(?:\\")|[^"])*"`,
|
|
31
|
+
quoted('`'),
|
|
32
|
+
quoted("'"),
|
|
33
|
+
quoted('"'),
|
|
36
34
|
// Whitespace
|
|
37
35
|
String.raw `\s+`,
|
|
38
36
|
// ahead of the grammar's '.', so that '.5' is a number rather than a dot
|
|
@@ -53,8 +51,11 @@ const minusNegatesAfter = new Set([
|
|
|
53
51
|
'colon',
|
|
54
52
|
'comma',
|
|
55
53
|
'semicolon',
|
|
56
|
-
'arrow'
|
|
54
|
+
'arrow',
|
|
55
|
+
'assign'
|
|
57
56
|
]);
|
|
57
|
+
// whether a `-` after this token negates what follows rather than subtracting
|
|
58
|
+
const negates = (last) => !last || minusNegatesAfter.has(last.type);
|
|
58
59
|
/**
|
|
59
60
|
* Lexer handles the lexical parsing of a Jexl string. Its responsibility is to
|
|
60
61
|
* identify the "parts of speech" of a Jexl expression, and tokenize and label
|
|
@@ -81,25 +82,13 @@ class Lexer {
|
|
|
81
82
|
_clearCache() {
|
|
82
83
|
this._splitRegex = undefined;
|
|
83
84
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Splits a Jexl expression string into an array of expression elements.
|
|
86
|
-
* @param {string} str A Jexl expression string
|
|
87
|
-
* @returns {Array<string>} An array of substrings defining the functional
|
|
88
|
-
* elements of the expression.
|
|
89
|
-
*/
|
|
85
|
+
/** Splits a Jexl string into its elements: tokens and runs of whitespace. */
|
|
90
86
|
getElements(str) {
|
|
91
|
-
|
|
92
|
-
return str.split(regex).filter(Boolean);
|
|
87
|
+
return str.split(this._getSplitRegex()).filter(Boolean);
|
|
93
88
|
}
|
|
94
89
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
* elements that consist only of whitespace get appended to the previous
|
|
98
|
-
* token's "raw" property. For the structure of a token object, please see
|
|
99
|
-
* {@link Lexer#tokenize}.
|
|
100
|
-
* @param {Array<string>} elements An array of Jexl expression elements to be
|
|
101
|
-
* converted to tokens
|
|
102
|
-
* @returns {Array<{type, value, raw}>} an array of token objects.
|
|
90
|
+
* The tokens for a list of elements. Whitespace makes no token of its own;
|
|
91
|
+
* it joins the `raw` of the token before it.
|
|
103
92
|
*/
|
|
104
93
|
getTokens(elements) {
|
|
105
94
|
const tokens = [];
|
|
@@ -110,13 +99,13 @@ class Lexer {
|
|
|
110
99
|
let pendingMinus;
|
|
111
100
|
let offset = 0;
|
|
112
101
|
for (const element of elements) {
|
|
113
|
-
if (
|
|
102
|
+
if (whitespaceRegex.test(element)) {
|
|
114
103
|
const last = pendingMinus ?? tokens.at(-1);
|
|
115
104
|
if (last) {
|
|
116
105
|
last.raw += element;
|
|
117
106
|
}
|
|
118
107
|
}
|
|
119
|
-
else if (element === '-' &&
|
|
108
|
+
else if (element === '-' && negates(tokens.at(-1))) {
|
|
120
109
|
// a second prefix minus in a row ("- -x"): emit the pending one as a
|
|
121
110
|
// unary operator so this one can negate whatever comes next
|
|
122
111
|
if (pendingMinus) {
|
|
@@ -125,7 +114,7 @@ class Lexer {
|
|
|
125
114
|
pendingMinus = unaryMinusToken();
|
|
126
115
|
}
|
|
127
116
|
else if (pendingMinus) {
|
|
128
|
-
if (numericRegex.
|
|
117
|
+
if (numericRegex.test(element)) {
|
|
129
118
|
// fold the sign into the number, so "-1" stays a single literal
|
|
130
119
|
const token = this._createToken('-' + element, offset);
|
|
131
120
|
token.raw = pendingMinus.raw + element;
|
|
@@ -150,46 +139,15 @@ class Lexer {
|
|
|
150
139
|
return tokens;
|
|
151
140
|
}
|
|
152
141
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* [name]: <string>,
|
|
159
|
-
* value: <boolean|number|string>,
|
|
160
|
-
* raw: <string>
|
|
161
|
-
* }
|
|
162
|
-
*
|
|
163
|
-
* Type is one of the following:
|
|
164
|
-
*
|
|
165
|
-
* literal, identifier, binaryOp, unaryOp
|
|
166
|
-
*
|
|
167
|
-
* OR, if the token is a control character its type is the name of the element
|
|
168
|
-
* defined in the Grammar.
|
|
169
|
-
*
|
|
170
|
-
* Name appears only if the token is a control string found in
|
|
171
|
-
* {@link grammar#elements}, and is set to the name of the element.
|
|
172
|
-
*
|
|
173
|
-
* Value is the value of the token in the correct type (boolean or numeric as
|
|
174
|
-
* appropriate). Raw is the string representation of this value taken directly
|
|
175
|
-
* from the expression string, including any trailing spaces.
|
|
176
|
-
* @param {string} str The Jexl string to be tokenized
|
|
177
|
-
* @returns {Array<{type, value, raw}>} an array of token objects.
|
|
178
|
-
* @throws {Error} if the provided string contains an invalid token.
|
|
142
|
+
* Splits a Jexl string into tokens. A token's `type` is `literal`,
|
|
143
|
+
* `templateString`, `identifier` or the type of the grammar element it
|
|
144
|
+
* spells; its `value` is a literal's value or the template's parts; its `raw`
|
|
145
|
+
* is its source text and any whitespace after it.
|
|
146
|
+
* @throws {JexlSyntaxError} for text that is no token
|
|
179
147
|
*/
|
|
180
148
|
tokenize(str) {
|
|
181
|
-
|
|
182
|
-
return this.getTokens(elements);
|
|
149
|
+
return this.getTokens(this.getElements(str));
|
|
183
150
|
}
|
|
184
|
-
/**
|
|
185
|
-
* Creates a new token object from an element of a Jexl string. See
|
|
186
|
-
* {@link Lexer#tokenize} for a description of the token object.
|
|
187
|
-
* @param {string} element The element from which a token should be made
|
|
188
|
-
* @returns {{value: number|boolean|string, [name]: string, type: string,
|
|
189
|
-
* raw: string}} a token object describing the provided element.
|
|
190
|
-
* @throws {Error} if the provided string is not a valid expression element.
|
|
191
|
-
* @private
|
|
192
|
-
*/
|
|
193
151
|
_createToken(element, offset = 0) {
|
|
194
152
|
const token = {
|
|
195
153
|
type: 'literal',
|
|
@@ -204,7 +162,7 @@ class Lexer {
|
|
|
204
162
|
else if (element.startsWith('"') || element.startsWith("'")) {
|
|
205
163
|
token.value = this._unquote(element);
|
|
206
164
|
}
|
|
207
|
-
else if (numericRegex.
|
|
165
|
+
else if (numericRegex.test(element)) {
|
|
208
166
|
token.value = parseFloat(element);
|
|
209
167
|
}
|
|
210
168
|
else if (element === 'true' || element === 'false') {
|
|
@@ -216,7 +174,7 @@ class Lexer {
|
|
|
216
174
|
else if (Object.hasOwn(this._grammar.elements, element)) {
|
|
217
175
|
token.type = this._grammar.elements[element].type;
|
|
218
176
|
}
|
|
219
|
-
else if (identRegex.
|
|
177
|
+
else if (identRegex.test(element)) {
|
|
220
178
|
token.type = 'identifier';
|
|
221
179
|
}
|
|
222
180
|
else {
|
|
@@ -224,86 +182,26 @@ class Lexer {
|
|
|
224
182
|
}
|
|
225
183
|
return token;
|
|
226
184
|
}
|
|
227
|
-
/**
|
|
228
|
-
*
|
|
229
|
-
* regular expression. A word such as `in` also stops matching inside a
|
|
230
|
-
* longer name.
|
|
231
|
-
* @param {string} str The string to be escaped
|
|
232
|
-
* @returns {string} the RegExp-escaped string.
|
|
233
|
-
* @see https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions
|
|
234
|
-
* @private
|
|
235
|
-
*/
|
|
185
|
+
/** A grammar element's text as a regex. A word such as `in` also stops
|
|
186
|
+
* matching inside a longer name. */
|
|
236
187
|
_escapeRegExp(str) {
|
|
237
188
|
const escaped = str.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
|
|
238
|
-
return identRegex.
|
|
189
|
+
return identRegex.test(str) ? wholeWord(escaped) : escaped;
|
|
239
190
|
}
|
|
240
|
-
/**
|
|
241
|
-
* Gets a RegEx object appropriate for splitting a Jexl string into its core
|
|
242
|
-
* elements.
|
|
243
|
-
* @returns {RegExp} An element-splitting RegExp object
|
|
244
|
-
* @private
|
|
245
|
-
*/
|
|
246
191
|
_getSplitRegex() {
|
|
247
192
|
if (!this._splitRegex) {
|
|
248
|
-
//
|
|
249
|
-
const
|
|
250
|
-
.sort((a, b) =>
|
|
251
|
-
|
|
252
|
-
})
|
|
253
|
-
.map((elem) => {
|
|
254
|
-
return this._escapeRegExp(elem);
|
|
255
|
-
});
|
|
256
|
-
this._splitRegex = new RegExp('(' +
|
|
257
|
-
[
|
|
258
|
-
preOpRegexElems.join('|'),
|
|
259
|
-
elemArray.join('|'),
|
|
260
|
-
postOpRegexElems.join('|')
|
|
261
|
-
].join('|') +
|
|
262
|
-
')');
|
|
193
|
+
// longest first, so that `==` wins over `=`
|
|
194
|
+
const elements = Object.keys(this._grammar.elements)
|
|
195
|
+
.sort((a, b) => b.length - a.length)
|
|
196
|
+
.map((element) => this._escapeRegExp(element));
|
|
197
|
+
this._splitRegex = new RegExp(`(${[...preOpRegexElems, ...elements, ...postOpRegexElems].join('|')})`);
|
|
263
198
|
}
|
|
264
199
|
return this._splitRegex;
|
|
265
200
|
}
|
|
266
|
-
/**
|
|
267
|
-
* Determines whether the addition of a '-' token should be interpreted as a
|
|
268
|
-
* negative symbol for an upcoming number, given an array of tokens already
|
|
269
|
-
* processed.
|
|
270
|
-
* @param {Array<Object>} tokens An array of tokens already processed
|
|
271
|
-
* @returns {boolean} true if adding a '-' should be considered a negative
|
|
272
|
-
* symbol; false otherwise
|
|
273
|
-
* @private
|
|
274
|
-
*/
|
|
275
|
-
_isNegative(tokens) {
|
|
276
|
-
const last = tokens.at(-1);
|
|
277
|
-
return !last || minusNegatesAfter.has(last.type);
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* A utility function to determine if a string consists of only space
|
|
281
|
-
* characters.
|
|
282
|
-
* @param {string} str A string to be tested
|
|
283
|
-
* @returns {boolean} true if the string is empty or consists of only spaces;
|
|
284
|
-
* false otherwise.
|
|
285
|
-
* @private
|
|
286
|
-
*/
|
|
287
|
-
_isWhitespace(str) {
|
|
288
|
-
return !!whitespaceRegex.exec(str);
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Removes the beginning and trailing quotes from a string, unescapes any
|
|
292
|
-
* escaped quotes on its interior, and unescapes any escaped escape
|
|
293
|
-
* characters. Note that this function is not defensive; it assumes that the
|
|
294
|
-
* provided string is not empty, and that its first and last characters are
|
|
295
|
-
* actually quotes.
|
|
296
|
-
* @param {string} str A string whose first and last characters are quotes
|
|
297
|
-
* @returns {string} a string with the surrounding quotes stripped and escapes
|
|
298
|
-
* properly processed.
|
|
299
|
-
* @private
|
|
300
|
-
*/
|
|
201
|
+
/** A quoted string literal's text, unquoted and unescaped. */
|
|
301
202
|
_unquote(str) {
|
|
302
203
|
const quote = str.startsWith('"') ? '"' : "'";
|
|
303
|
-
return str
|
|
304
|
-
.slice(1, -1)
|
|
305
|
-
.replaceAll(escQuoteRegex[quote], quote)
|
|
306
|
-
.replaceAll(escEscRegex, '\\');
|
|
204
|
+
return str.slice(1, -1).replaceAll(quoteEscRegex[quote], '$1');
|
|
307
205
|
}
|
|
308
206
|
_parseTemplateString(str, offset = 0) {
|
|
309
207
|
const parts = [];
|
package/esm/Lexer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../src/Lexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAK7C,2EAA2E;AAC3E,2EAA2E;AAC3E,wEAAwE;AACxE,0EAA0E;AAC1E,0DAA0D;AAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAA,uDAAuD,CAAA;AACpF,MAAM,SAAS,GAAG,IAAI,UAAU,MAAM,CAAA;AACtC,MAAM,YAAY,GAAG,IAAI,UAAU,IAAI,SAAS,GAAG,CAAA;AACnD,gFAAgF;AAChF,8EAA8E;AAC9E,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,SAAS,IAAI,IAAI,MAAM,SAAS,GAAG,CAAA;AAC9E,8EAA8E;AAC9E,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA,mDAAmD,CAAA;AAEnF,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AACvD,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"Lexer.js","sourceRoot":"","sources":["../src/Lexer.ts"],"names":[],"mappings":"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"}
|
package/esm/analyze.d.ts
CHANGED
|
@@ -69,6 +69,8 @@ export interface AnalyzeOptions {
|
|
|
69
69
|
*/
|
|
70
70
|
env?: readonly string[];
|
|
71
71
|
}
|
|
72
|
+
/** A literal's value, or a template's with no interpolation. */
|
|
73
|
+
export declare function literalValue(node: AstNode): string | number | boolean | null | undefined;
|
|
72
74
|
/**
|
|
73
75
|
* Lists what an expression reads from its context, without evaluating it or
|
|
74
76
|
* consulting any registered function.
|
package/esm/analyze.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Jexl
|
|
3
3
|
* Copyright 2020 Tom Shawver
|
|
4
4
|
*/
|
|
5
|
+
import { unknownNode } from "./errors.js";
|
|
5
6
|
function literalKey(node) {
|
|
6
7
|
const value = literalValue(node);
|
|
7
8
|
return typeof value === 'boolean' ? String(value) : (value ?? undefined);
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
/** A literal's value, or a template's with no interpolation. */
|
|
11
|
+
export function literalValue(node) {
|
|
11
12
|
if (node.type === 'Literal') {
|
|
12
13
|
return node.value;
|
|
13
14
|
}
|
|
@@ -26,8 +27,7 @@ function extend(read, keys, dynamic = false) {
|
|
|
26
27
|
? { root: read.root, path, dynamic }
|
|
27
28
|
: { root: read.root, path };
|
|
28
29
|
}
|
|
29
|
-
function isBarePath(
|
|
30
|
-
const node = ast;
|
|
30
|
+
function isBarePath(node) {
|
|
31
31
|
if (node.type === 'Identifier') {
|
|
32
32
|
return !node.from || isBarePath(node.from);
|
|
33
33
|
}
|
|
@@ -131,8 +131,7 @@ export function analyze(ast, { accessors = {}, row, env } = {}) {
|
|
|
131
131
|
}
|
|
132
132
|
return subject.map((read) => extend(read, keys, dynamic));
|
|
133
133
|
}
|
|
134
|
-
function walk(
|
|
135
|
-
const node = ast;
|
|
134
|
+
function walk(node, scope) {
|
|
136
135
|
switch (node.type) {
|
|
137
136
|
case 'Literal': {
|
|
138
137
|
return [];
|
|
@@ -227,7 +226,7 @@ export function analyze(ast, { accessors = {}, row, env } = {}) {
|
|
|
227
226
|
return [];
|
|
228
227
|
}
|
|
229
228
|
default: {
|
|
230
|
-
|
|
229
|
+
return unknownNode(node);
|
|
231
230
|
}
|
|
232
231
|
}
|
|
233
232
|
}
|
package/esm/analyze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"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"}
|
package/esm/check.js
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
* Jexl
|
|
3
3
|
* Copyright 2020 Tom Shawver
|
|
4
4
|
*/
|
|
5
|
+
import { literalValue } from "./analyze.js";
|
|
6
|
+
import { unknownNode } from "./errors.js";
|
|
7
|
+
import { toRegExp } from "./operators.js";
|
|
5
8
|
import { isName, key, print, quote } from "./print.js";
|
|
6
9
|
export const UNKNOWN = { kind: 'unknown' };
|
|
7
10
|
const UNDEFINED = { kind: 'undefined' };
|
|
@@ -129,7 +132,7 @@ function isBoxed(type) {
|
|
|
129
132
|
}
|
|
130
133
|
function isPattern(pattern) {
|
|
131
134
|
try {
|
|
132
|
-
|
|
135
|
+
toRegExp(pattern);
|
|
133
136
|
return true;
|
|
134
137
|
}
|
|
135
138
|
catch {
|
|
@@ -386,9 +389,8 @@ function negate(type) {
|
|
|
386
389
|
}
|
|
387
390
|
}
|
|
388
391
|
function paramName(subject, context) {
|
|
389
|
-
const
|
|
390
|
-
|
|
391
|
-
? node.value.toLowerCase().replaceAll(/\W/g, '')
|
|
392
|
+
const base = subject.type === 'Identifier'
|
|
393
|
+
? subject.value.toLowerCase().replaceAll(/\W/g, '')
|
|
392
394
|
: '';
|
|
393
395
|
const name = isName(base) ? base : 'x';
|
|
394
396
|
const text = print(context);
|
|
@@ -398,9 +400,6 @@ function paramName(subject, context) {
|
|
|
398
400
|
}
|
|
399
401
|
return candidate;
|
|
400
402
|
}
|
|
401
|
-
function literalValue(node) {
|
|
402
|
-
return node.type === 'Literal' ? node.value : undefined;
|
|
403
|
-
}
|
|
404
403
|
function describe(type) {
|
|
405
404
|
switch (type.kind) {
|
|
406
405
|
case 'list': {
|
|
@@ -575,23 +574,17 @@ export function check(ast, { schema, functions, accessors = {}, row, env } = {})
|
|
|
575
574
|
}
|
|
576
575
|
}
|
|
577
576
|
}
|
|
578
|
-
function
|
|
577
|
+
function dottedKey(node) {
|
|
579
578
|
const names = [node.value];
|
|
580
579
|
let base = node;
|
|
581
|
-
while (base.
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
names.unshift(base.value);
|
|
580
|
+
while (base.from) {
|
|
581
|
+
if (base.from.type !== 'Identifier') {
|
|
582
|
+
return undefined;
|
|
585
583
|
}
|
|
584
|
+
base = base.from;
|
|
585
|
+
names.unshift(base.value);
|
|
586
586
|
}
|
|
587
|
-
|
|
588
|
-
}
|
|
589
|
-
function dottedKey(node) {
|
|
590
|
-
if (!node.from) {
|
|
591
|
-
return undefined;
|
|
592
|
-
}
|
|
593
|
-
const { base, names } = chain(node);
|
|
594
|
-
if (base.from) {
|
|
587
|
+
if (base === node) {
|
|
595
588
|
return undefined;
|
|
596
589
|
}
|
|
597
590
|
let type = variable(base, false);
|
|
@@ -665,23 +658,31 @@ export function check(ast, { schema, functions, accessors = {}, row, env } = {})
|
|
|
665
658
|
if (node.type !== 'BinaryExpression' ||
|
|
666
659
|
node.operator !== '-' ||
|
|
667
660
|
node.left.type !== 'Identifier' ||
|
|
668
|
-
node.right
|
|
661
|
+
node.right.type !== 'Identifier' ||
|
|
669
662
|
node.right.from) {
|
|
670
663
|
return undefined;
|
|
671
664
|
}
|
|
672
665
|
const left = node.left;
|
|
666
|
+
const name = left.value;
|
|
667
|
+
if (!left.from &&
|
|
668
|
+
(scope.has(name) || name === row || (env && Object.hasOwn(env, name)))) {
|
|
669
|
+
return undefined;
|
|
670
|
+
}
|
|
673
671
|
const reported = diagnostics.length;
|
|
674
672
|
const subject = left.from ? infer(left.from) : root;
|
|
675
673
|
diagnostics.length = reported;
|
|
676
|
-
if (subject.kind !== 'record' || subject.fields.has(
|
|
674
|
+
if (subject.kind !== 'record' || subject.fields.has(name)) {
|
|
677
675
|
return undefined;
|
|
678
676
|
}
|
|
679
|
-
const whole = `${
|
|
677
|
+
const whole = `${name}-${node.right.value}`;
|
|
680
678
|
const found = subject.fields.get(whole);
|
|
681
679
|
if (!found) {
|
|
682
680
|
return undefined;
|
|
683
681
|
}
|
|
684
|
-
|
|
682
|
+
// a bare name can't hold a hyphen, so only a row variable can spell it
|
|
683
|
+
const holder = left.from ??
|
|
684
|
+
(row === undefined ? undefined : { type: 'Identifier', value: row });
|
|
685
|
+
report('unknown-field', 'warning', node, `${print(node)} subtracts; ${whole} is one field`, holder ? [text(holder, whole)] : []);
|
|
685
686
|
return found;
|
|
686
687
|
}
|
|
687
688
|
function memberFor(element, value, valueNode, listNode, node) {
|
|
@@ -790,7 +791,7 @@ export function check(ast, { schema, functions, accessors = {}, row, env } = {})
|
|
|
790
791
|
if (EQUALITY.has(operator)) {
|
|
791
792
|
const leftLiteral = literalOf(leftItem);
|
|
792
793
|
const rightLiteral = literalOf(rightItem);
|
|
793
|
-
if (rightLiteral !== undefined && node.right
|
|
794
|
+
if (rightLiteral !== undefined && node.right.type === 'Literal') {
|
|
794
795
|
compareLiteral(leftItem, rightLiteral, node);
|
|
795
796
|
}
|
|
796
797
|
else if (leftLiteral !== undefined && node.left.type === 'Literal') {
|
|
@@ -951,8 +952,7 @@ export function check(ast, { schema, functions, accessors = {}, row, env } = {})
|
|
|
951
952
|
}
|
|
952
953
|
return returns ?? UNKNOWN;
|
|
953
954
|
}
|
|
954
|
-
function infer(
|
|
955
|
-
const node = ast;
|
|
955
|
+
function infer(node) {
|
|
956
956
|
switch (node.type) {
|
|
957
957
|
case 'Literal': {
|
|
958
958
|
const { value } = node;
|
|
@@ -1073,7 +1073,7 @@ export function check(ast, { schema, functions, accessors = {}, row, env } = {})
|
|
|
1073
1073
|
return lambda(node);
|
|
1074
1074
|
}
|
|
1075
1075
|
default: {
|
|
1076
|
-
|
|
1076
|
+
return unknownNode(node);
|
|
1077
1077
|
}
|
|
1078
1078
|
}
|
|
1079
1079
|
}
|