@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.
- package/README.md +8 -3
- package/dist/Expression.d.ts +0 -12
- package/dist/Expression.js +0 -16
- package/dist/Expression.js.map +1 -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.d.ts +0 -5
- package/dist/check.js +62 -240
- 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 +28 -50
- 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/index.d.ts +2 -1
- package/dist/index.js +3 -2
- package/dist/index.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 +9 -0
- package/dist/print.js +183 -0
- package/dist/print.js.map +1 -0
- package/dist/types.d.ts +18 -21
- package/esm/Expression.d.ts +0 -12
- package/esm/Expression.js +0 -16
- package/esm/Expression.js.map +1 -1
- 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.d.ts +0 -5
- package/esm/check.js +29 -206
- 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 +27 -49
- 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/index.d.ts +2 -1
- package/esm/index.js +2 -1
- package/esm/index.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 +9 -0
- package/esm/print.js +177 -0
- package/esm/print.js.map +1 -0
- package/esm/types.d.ts +18 -21
- package/package.json +2 -1
- package/src/Expression.ts +0 -20
- package/src/Jexl.ts +13 -20
- package/src/Lexer.ts +42 -144
- package/src/analyze.ts +10 -10
- package/src/check.ts +48 -250
- package/src/collections.ts +11 -1
- package/src/conditions.ts +39 -62
- package/src/errors.ts +10 -0
- package/src/evaluator/compile.ts +49 -36
- package/src/grammar.ts +3 -9
- package/src/index.ts +2 -1
- package/src/operators.ts +10 -6
- package/src/parser/Parser.ts +13 -19
- package/src/print.ts +203 -0
- package/src/types.ts +19 -23
package/dist/analyze.js
CHANGED
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
* Copyright 2020 Tom Shawver
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.literalValue = literalValue;
|
|
7
8
|
exports.analyze = analyze;
|
|
9
|
+
const errors_ts_1 = require("./errors.js");
|
|
8
10
|
function literalKey(node) {
|
|
9
11
|
const value = literalValue(node);
|
|
10
12
|
return typeof value === 'boolean' ? String(value) : (value ?? undefined);
|
|
11
13
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
/** A literal's value, or a template's with no interpolation. */
|
|
15
|
+
function literalValue(node) {
|
|
14
16
|
if (node.type === 'Literal') {
|
|
15
17
|
return node.value;
|
|
16
18
|
}
|
|
@@ -29,8 +31,7 @@ function extend(read, keys, dynamic = false) {
|
|
|
29
31
|
? { root: read.root, path, dynamic }
|
|
30
32
|
: { root: read.root, path };
|
|
31
33
|
}
|
|
32
|
-
function isBarePath(
|
|
33
|
-
const node = ast;
|
|
34
|
+
function isBarePath(node) {
|
|
34
35
|
if (node.type === 'Identifier') {
|
|
35
36
|
return !node.from || isBarePath(node.from);
|
|
36
37
|
}
|
|
@@ -134,8 +135,7 @@ function analyze(ast, { accessors = {}, row, env } = {}) {
|
|
|
134
135
|
}
|
|
135
136
|
return subject.map((read) => extend(read, keys, dynamic));
|
|
136
137
|
}
|
|
137
|
-
function walk(
|
|
138
|
-
const node = ast;
|
|
138
|
+
function walk(node, scope) {
|
|
139
139
|
switch (node.type) {
|
|
140
140
|
case 'Literal': {
|
|
141
141
|
return [];
|
|
@@ -230,7 +230,7 @@ function analyze(ast, { accessors = {}, row, env } = {}) {
|
|
|
230
230
|
return [];
|
|
231
231
|
}
|
|
232
232
|
default: {
|
|
233
|
-
|
|
233
|
+
return (0, errors_ts_1.unknownNode)(node);
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
}
|
package/dist/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/dist/check.d.ts
CHANGED
|
@@ -93,11 +93,6 @@ export interface CheckResult {
|
|
|
93
93
|
type: Type;
|
|
94
94
|
}
|
|
95
95
|
export declare const UNKNOWN: Type;
|
|
96
|
-
/**
|
|
97
|
-
* Renders a tree back to expression text, for messages and suggestions. The
|
|
98
|
-
* text parses back to the same tree.
|
|
99
|
-
*/
|
|
100
|
-
export declare function print(ast: AstNode): string;
|
|
101
96
|
/** The type of a row whose fields `schema` declares. */
|
|
102
97
|
export declare function recordOf(schema: readonly FieldSchema[]): Type;
|
|
103
98
|
export declare function union(a: Type, b: Type): Type;
|
package/dist/check.js
CHANGED
|
@@ -5,10 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.UNKNOWN = void 0;
|
|
8
|
-
exports.print = print;
|
|
9
8
|
exports.recordOf = recordOf;
|
|
10
9
|
exports.union = union;
|
|
11
10
|
exports.check = check;
|
|
11
|
+
const analyze_ts_1 = require("./analyze.js");
|
|
12
|
+
const errors_ts_1 = require("./errors.js");
|
|
13
|
+
const operators_ts_1 = require("./operators.js");
|
|
14
|
+
const print_ts_1 = require("./print.js");
|
|
12
15
|
exports.UNKNOWN = { kind: 'unknown' };
|
|
13
16
|
const UNDEFINED = { kind: 'undefined' };
|
|
14
17
|
const BOOLEAN = { kind: 'boolean' };
|
|
@@ -18,184 +21,6 @@ const MAX_VALUES = 64;
|
|
|
18
21
|
const ARITHMETIC = new Set(['-', '*', '/', '//', '%', '^']);
|
|
19
22
|
const ORDER = new Set(['<', '<=', '>', '>=']);
|
|
20
23
|
const EQUALITY = new Set(['==', '!=']);
|
|
21
|
-
const PRECEDENCE = {
|
|
22
|
-
'=': 2,
|
|
23
|
-
'||': 10,
|
|
24
|
-
'??': 10,
|
|
25
|
-
'&&': 11,
|
|
26
|
-
'==': 20,
|
|
27
|
-
'!=': 20,
|
|
28
|
-
'~': 20,
|
|
29
|
-
'!~': 20,
|
|
30
|
-
'<': 20,
|
|
31
|
-
'<=': 20,
|
|
32
|
-
'>': 20,
|
|
33
|
-
'>=': 20,
|
|
34
|
-
in: 20,
|
|
35
|
-
'+': 30,
|
|
36
|
-
'-': 30,
|
|
37
|
-
'*': 40,
|
|
38
|
-
'/': 40,
|
|
39
|
-
'//': 40,
|
|
40
|
-
'%': 50,
|
|
41
|
-
'^': 50
|
|
42
|
-
};
|
|
43
|
-
const RIGHT_ASSOCIATIVE = new Set(['^']);
|
|
44
|
-
const LOGICAL = new Set(['||', '&&']);
|
|
45
|
-
// how tightly each form binds, mirroring the Parser's levels: `;`, then `=`
|
|
46
|
-
// and lambdas, then `?:`, then binary operators, then prefix operators
|
|
47
|
-
const SEQUENCE = 0;
|
|
48
|
-
const ASSIGNMENT = 1;
|
|
49
|
-
const CONDITIONAL = 2;
|
|
50
|
-
const CUSTOM_BINARY = 3;
|
|
51
|
-
const UNARY = 100;
|
|
52
|
-
const letter = String.raw `a-zA-Zа-яА-Я_À-ÖØ-öø-ÿ$`;
|
|
53
|
-
const IDENTIFIER = new RegExp(`^[${letter}][${letter}0-9]*$`);
|
|
54
|
-
const WORDS = new Set(['in', 'true', 'false', 'null']);
|
|
55
|
-
function isName(text) {
|
|
56
|
-
return IDENTIFIER.test(text) && !WORDS.has(text);
|
|
57
|
-
}
|
|
58
|
-
function key(name) {
|
|
59
|
-
return isName(name) ? `.${name}` : `[${quote(name)}]`;
|
|
60
|
-
}
|
|
61
|
-
function quote(text) {
|
|
62
|
-
return `'${text.replaceAll('\\', '\\\\').replaceAll("'", String.raw `\'`)}'`;
|
|
63
|
-
}
|
|
64
|
-
function precedenceOf(node) {
|
|
65
|
-
switch (node.type) {
|
|
66
|
-
case 'SequenceExpression': {
|
|
67
|
-
return SEQUENCE;
|
|
68
|
-
}
|
|
69
|
-
case 'AssignmentExpression':
|
|
70
|
-
case 'Lambda': {
|
|
71
|
-
return ASSIGNMENT;
|
|
72
|
-
}
|
|
73
|
-
case 'ConditionalExpression': {
|
|
74
|
-
// with no alternate, it ends only before `)`, `]`, `}`, `,`, `;` or the end
|
|
75
|
-
return node.alternate ? CONDITIONAL : SEQUENCE;
|
|
76
|
-
}
|
|
77
|
-
case 'BinaryExpression': {
|
|
78
|
-
return PRECEDENCE[node.operator] ?? CUSTOM_BINARY;
|
|
79
|
-
}
|
|
80
|
-
case 'UnaryExpression': {
|
|
81
|
-
return UNARY;
|
|
82
|
-
}
|
|
83
|
-
default: {
|
|
84
|
-
return Infinity;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
function within(ast, least) {
|
|
89
|
-
const text = print(ast);
|
|
90
|
-
return precedenceOf(ast) < least ? `(${text})` : text;
|
|
91
|
-
}
|
|
92
|
-
function binaryOperand(parent, ast, left) {
|
|
93
|
-
const own = PRECEDENCE[parent.operator];
|
|
94
|
-
if (own === undefined) {
|
|
95
|
-
return within(ast, UNARY);
|
|
96
|
-
}
|
|
97
|
-
const child = ast;
|
|
98
|
-
const theirs = precedenceOf(child);
|
|
99
|
-
const chained = child.type === 'BinaryExpression' &&
|
|
100
|
-
RIGHT_ASSOCIATIVE.has(parent.operator) &&
|
|
101
|
-
RIGHT_ASSOCIATIVE.has(child.operator);
|
|
102
|
-
const mixesNullish = child.type === 'BinaryExpression' &&
|
|
103
|
-
((parent.operator === '??' && LOGICAL.has(child.operator)) ||
|
|
104
|
-
(child.operator === '??' && LOGICAL.has(parent.operator)));
|
|
105
|
-
const text = print(ast);
|
|
106
|
-
return theirs < own || (theirs === own && left === chained) || mixesNullish
|
|
107
|
-
? `(${text})`
|
|
108
|
-
: text;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Renders a tree back to expression text, for messages and suggestions. The
|
|
112
|
-
* text parses back to the same tree.
|
|
113
|
-
*/
|
|
114
|
-
function print(ast) {
|
|
115
|
-
const node = ast;
|
|
116
|
-
switch (node.type) {
|
|
117
|
-
case 'Literal': {
|
|
118
|
-
const { value } = node;
|
|
119
|
-
return typeof value === 'string'
|
|
120
|
-
? quote(value)
|
|
121
|
-
: Object.is(value, -0)
|
|
122
|
-
? '-0'
|
|
123
|
-
: String(value);
|
|
124
|
-
}
|
|
125
|
-
case 'Identifier': {
|
|
126
|
-
return node.from
|
|
127
|
-
? within(node.from, Infinity) + key(node.value)
|
|
128
|
-
: node.value;
|
|
129
|
-
}
|
|
130
|
-
case 'FilterExpression': {
|
|
131
|
-
return `${within(node.subject, Infinity)}[${within(node.expr, ASSIGNMENT)}]`;
|
|
132
|
-
}
|
|
133
|
-
case 'BinaryExpression': {
|
|
134
|
-
return `${binaryOperand(node, node.left, true)} ${node.operator} ${binaryOperand(node, node.right, false)}`;
|
|
135
|
-
}
|
|
136
|
-
case 'UnaryExpression': {
|
|
137
|
-
const { operator } = node;
|
|
138
|
-
const right = within(node.right, UNARY);
|
|
139
|
-
// the Lexer folds a minus before a digit into the number
|
|
140
|
-
if (operator === '-' && /^\d/.test(right)) {
|
|
141
|
-
return `-(${right})`;
|
|
142
|
-
}
|
|
143
|
-
return IDENTIFIER.test(operator)
|
|
144
|
-
? `${operator} ${right}`
|
|
145
|
-
: operator + right;
|
|
146
|
-
}
|
|
147
|
-
case 'ConditionalExpression': {
|
|
148
|
-
const test = within(node.test, CUSTOM_BINARY);
|
|
149
|
-
const consequent = node.consequent
|
|
150
|
-
? ` ${within(node.consequent, ASSIGNMENT)} `
|
|
151
|
-
: '';
|
|
152
|
-
const alternate = node.alternate
|
|
153
|
-
? ` ${within(node.alternate, ASSIGNMENT)}`
|
|
154
|
-
: '';
|
|
155
|
-
return `${test} ?${consequent}:${alternate}`;
|
|
156
|
-
}
|
|
157
|
-
case 'FunctionCall': {
|
|
158
|
-
const args = node.args.map((arg) => within(arg, ASSIGNMENT));
|
|
159
|
-
return `${node.name}(${args.join(', ')})`;
|
|
160
|
-
}
|
|
161
|
-
case 'ArrayLiteral': {
|
|
162
|
-
const items = node.value.map((item) => within(item, ASSIGNMENT));
|
|
163
|
-
return `[${items.join(', ')}]`;
|
|
164
|
-
}
|
|
165
|
-
case 'ObjectLiteral': {
|
|
166
|
-
const entries = Object.entries(node.value).map(([name, value]) => `${isName(name) ? name : quote(name)}: ${within(value, ASSIGNMENT)}`);
|
|
167
|
-
return `{${entries.join(', ')}}`;
|
|
168
|
-
}
|
|
169
|
-
case 'TemplateLiteral': {
|
|
170
|
-
const parts = node.parts.map((part) => part.type === 'static'
|
|
171
|
-
? part.value
|
|
172
|
-
.replaceAll('\\', '\\\\')
|
|
173
|
-
.replaceAll('`', '\\`')
|
|
174
|
-
.replaceAll('${', '\\${')
|
|
175
|
-
: `\${${print(part.value)}}`);
|
|
176
|
-
return `\`${parts.join('')}\``;
|
|
177
|
-
}
|
|
178
|
-
case 'SequenceExpression': {
|
|
179
|
-
const { expressions } = node;
|
|
180
|
-
const text = expressions
|
|
181
|
-
.map((expr) => within(expr, ASSIGNMENT))
|
|
182
|
-
.join('; ');
|
|
183
|
-
return expressions.length === 1 ? `${text};` : text;
|
|
184
|
-
}
|
|
185
|
-
case 'AssignmentExpression': {
|
|
186
|
-
return `${node.left.value} = ${within(node.right, ASSIGNMENT)}`;
|
|
187
|
-
}
|
|
188
|
-
case 'Lambda': {
|
|
189
|
-
const params = node.params.length === 1
|
|
190
|
-
? node.params[0]
|
|
191
|
-
: `(${node.params.join(', ')})`;
|
|
192
|
-
return `${params} => ${within(node.body, ASSIGNMENT)}`;
|
|
193
|
-
}
|
|
194
|
-
default: {
|
|
195
|
-
return '?';
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
24
|
function distance(a, b) {
|
|
200
25
|
let before = [];
|
|
201
26
|
let previous = Array.from({ length: b.length + 1 }, (_, i) => i);
|
|
@@ -313,7 +138,7 @@ function isBoxed(type) {
|
|
|
313
138
|
}
|
|
314
139
|
function isPattern(pattern) {
|
|
315
140
|
try {
|
|
316
|
-
|
|
141
|
+
(0, operators_ts_1.toRegExp)(pattern);
|
|
317
142
|
return true;
|
|
318
143
|
}
|
|
319
144
|
catch {
|
|
@@ -570,21 +395,17 @@ function negate(type) {
|
|
|
570
395
|
}
|
|
571
396
|
}
|
|
572
397
|
function paramName(subject, context) {
|
|
573
|
-
const
|
|
574
|
-
|
|
575
|
-
? node.value.toLowerCase().replaceAll(/\W/g, '')
|
|
398
|
+
const base = subject.type === 'Identifier'
|
|
399
|
+
? subject.value.toLowerCase().replaceAll(/\W/g, '')
|
|
576
400
|
: '';
|
|
577
|
-
const name = isName(base) ? base : 'x';
|
|
578
|
-
const text = print(context);
|
|
401
|
+
const name = (0, print_ts_1.isName)(base) ? base : 'x';
|
|
402
|
+
const text = (0, print_ts_1.print)(context);
|
|
579
403
|
let candidate = name;
|
|
580
404
|
for (let i = 2; new RegExp(String.raw `\b${candidate}\b`).test(text); i++) {
|
|
581
405
|
candidate = `${name}${i}`;
|
|
582
406
|
}
|
|
583
407
|
return candidate;
|
|
584
408
|
}
|
|
585
|
-
function literalValue(node) {
|
|
586
|
-
return node.type === 'Literal' ? node.value : undefined;
|
|
587
|
-
}
|
|
588
409
|
function describe(type) {
|
|
589
410
|
switch (type.kind) {
|
|
590
411
|
case 'list': {
|
|
@@ -597,7 +418,7 @@ function describe(type) {
|
|
|
597
418
|
return type.values?.length === 1 ? String(type.values[0]) : 'a number';
|
|
598
419
|
}
|
|
599
420
|
case 'string': {
|
|
600
|
-
return type.values?.length === 1 ? quote(type.values[0]) : 'text';
|
|
421
|
+
return type.values?.length === 1 ? (0, print_ts_1.quote)(type.values[0]) : 'text';
|
|
601
422
|
}
|
|
602
423
|
case 'boolean': {
|
|
603
424
|
return type.field?.type === 'flag' ? 'a flag' : 'a boolean';
|
|
@@ -671,10 +492,10 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
671
492
|
});
|
|
672
493
|
}
|
|
673
494
|
function text(node, name) {
|
|
674
|
-
return node ? print(node) + key(name) : name;
|
|
495
|
+
return node ? (0, print_ts_1.print)(node) + (0, print_ts_1.key)(name) : name;
|
|
675
496
|
}
|
|
676
497
|
function field(subject, name, node, subjectNode, spell = (candidate) => text(subjectNode, candidate)) {
|
|
677
|
-
const where = subjectNode ? print(subjectNode) : 'the row';
|
|
498
|
+
const where = subjectNode ? (0, print_ts_1.print)(subjectNode) : 'the row';
|
|
678
499
|
switch (subject.kind) {
|
|
679
500
|
case 'record': {
|
|
680
501
|
const found = subject.fields.get(name) ?? subject.each;
|
|
@@ -698,16 +519,16 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
698
519
|
(item.open || !!item.each || item.fields.has(name)));
|
|
699
520
|
const suggestions = [];
|
|
700
521
|
if (entriesHave && subjectNode && node.type === 'Identifier') {
|
|
701
|
-
const list = print(subjectNode);
|
|
522
|
+
const list = (0, print_ts_1.print)(subjectNode);
|
|
702
523
|
const param = paramName(subjectNode, node);
|
|
703
|
-
suggestions.push(`${list}[0]${key(name)}`);
|
|
524
|
+
suggestions.push(`${list}[0]${(0, print_ts_1.key)(name)}`);
|
|
704
525
|
if (functions?.map) {
|
|
705
|
-
suggestions.push(`map(${list}, ${param} => ${param}${key(name)})`);
|
|
526
|
+
suggestions.push(`map(${list}, ${param} => ${param}${(0, print_ts_1.key)(name)})`);
|
|
706
527
|
}
|
|
707
528
|
}
|
|
708
|
-
report('dot-through-list', 'warning', node, `${where} is a list, so ${key(name)} is undefined` +
|
|
529
|
+
report('dot-through-list', 'warning', node, `${where} is a list, so ${(0, print_ts_1.key)(name)} is undefined` +
|
|
709
530
|
(entriesHave
|
|
710
|
-
? `; [0]${key(name)} reads the first entry's` +
|
|
531
|
+
? `; [0]${(0, print_ts_1.key)(name)} reads the first entry's` +
|
|
711
532
|
(functions?.any ? ', and any() tests each' : '')
|
|
712
533
|
: ''), suggestions);
|
|
713
534
|
return UNDEFINED;
|
|
@@ -730,7 +551,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
730
551
|
return exports.UNKNOWN;
|
|
731
552
|
}
|
|
732
553
|
function index(subject, at, node, subjectNode) {
|
|
733
|
-
const where = print(subjectNode);
|
|
554
|
+
const where = (0, print_ts_1.print)(subjectNode);
|
|
734
555
|
switch (subject.kind) {
|
|
735
556
|
case 'list': {
|
|
736
557
|
const absent = firstAbsentIndex(subject.cardinality);
|
|
@@ -759,23 +580,17 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
759
580
|
}
|
|
760
581
|
}
|
|
761
582
|
}
|
|
762
|
-
function
|
|
583
|
+
function dottedKey(node) {
|
|
763
584
|
const names = [node.value];
|
|
764
585
|
let base = node;
|
|
765
|
-
while (base.
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
names.unshift(base.value);
|
|
586
|
+
while (base.from) {
|
|
587
|
+
if (base.from.type !== 'Identifier') {
|
|
588
|
+
return undefined;
|
|
769
589
|
}
|
|
590
|
+
base = base.from;
|
|
591
|
+
names.unshift(base.value);
|
|
770
592
|
}
|
|
771
|
-
|
|
772
|
-
}
|
|
773
|
-
function dottedKey(node) {
|
|
774
|
-
if (!node.from) {
|
|
775
|
-
return undefined;
|
|
776
|
-
}
|
|
777
|
-
const { base, names } = chain(node);
|
|
778
|
-
if (base.from) {
|
|
593
|
+
if (base === node) {
|
|
779
594
|
return undefined;
|
|
780
595
|
}
|
|
781
596
|
let type = variable(base, false);
|
|
@@ -791,8 +606,8 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
791
606
|
const stepReaches = step?.kind === 'record' &&
|
|
792
607
|
(step.fields.has(names[i + 1]) || !!step.each);
|
|
793
608
|
if (record.fields.has(whole) && !stepReaches) {
|
|
794
|
-
const fixed = print(subjectNode) + key(whole);
|
|
795
|
-
report('dotted-key', 'warning', node, `${whole} is one field of ${print(subjectNode)}; jexl reads ${names.slice(i, j).join(' then ')}`, [[fixed, ...names.slice(j).map((name) => key(name))].join('')]);
|
|
609
|
+
const fixed = (0, print_ts_1.print)(subjectNode) + (0, print_ts_1.key)(whole);
|
|
610
|
+
report('dotted-key', 'warning', node, `${whole} is one field of ${(0, print_ts_1.print)(subjectNode)}; jexl reads ${names.slice(i, j).join(' then ')}`, [[fixed, ...names.slice(j).map((name) => (0, print_ts_1.key)(name))].join('')]);
|
|
796
611
|
let resolved = record.fields.get(whole);
|
|
797
612
|
for (const name of names.slice(j)) {
|
|
798
613
|
resolved = field(resolved, name, node, undefined);
|
|
@@ -849,23 +664,31 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
849
664
|
if (node.type !== 'BinaryExpression' ||
|
|
850
665
|
node.operator !== '-' ||
|
|
851
666
|
node.left.type !== 'Identifier' ||
|
|
852
|
-
node.right
|
|
667
|
+
node.right.type !== 'Identifier' ||
|
|
853
668
|
node.right.from) {
|
|
854
669
|
return undefined;
|
|
855
670
|
}
|
|
856
671
|
const left = node.left;
|
|
672
|
+
const name = left.value;
|
|
673
|
+
if (!left.from &&
|
|
674
|
+
(scope.has(name) || name === row || (env && Object.hasOwn(env, name)))) {
|
|
675
|
+
return undefined;
|
|
676
|
+
}
|
|
857
677
|
const reported = diagnostics.length;
|
|
858
678
|
const subject = left.from ? infer(left.from) : root;
|
|
859
679
|
diagnostics.length = reported;
|
|
860
|
-
if (subject.kind !== 'record' || subject.fields.has(
|
|
680
|
+
if (subject.kind !== 'record' || subject.fields.has(name)) {
|
|
861
681
|
return undefined;
|
|
862
682
|
}
|
|
863
|
-
const whole = `${
|
|
683
|
+
const whole = `${name}-${node.right.value}`;
|
|
864
684
|
const found = subject.fields.get(whole);
|
|
865
685
|
if (!found) {
|
|
866
686
|
return undefined;
|
|
867
687
|
}
|
|
868
|
-
|
|
688
|
+
// a bare name can't hold a hyphen, so only a row variable can spell it
|
|
689
|
+
const holder = left.from ??
|
|
690
|
+
(row === undefined ? undefined : { type: 'Identifier', value: row });
|
|
691
|
+
report('unknown-field', 'warning', node, `${(0, print_ts_1.print)(node)} subtracts; ${whole} is one field`, holder ? [text(holder, whole)] : []);
|
|
869
692
|
return found;
|
|
870
693
|
}
|
|
871
694
|
function memberFor(element, value, valueNode, listNode, node) {
|
|
@@ -878,10 +701,10 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
878
701
|
const scalar = type.kind === 'list' ? type.of : type;
|
|
879
702
|
return scalar.kind === 'string' && scalar.values?.includes(literal);
|
|
880
703
|
});
|
|
881
|
-
report('never-equal', 'warning', node, `${print(listNode)} holds records, so no entry equals ${quote(literal)}` +
|
|
704
|
+
report('never-equal', 'warning', node, `${(0, print_ts_1.print)(listNode)} holds records, so no entry equals ${(0, print_ts_1.quote)(literal)}` +
|
|
882
705
|
(holder ? `; it is a value of their ${holder[0]} field` : ''), holder && functions?.any
|
|
883
706
|
? [
|
|
884
|
-
`any(${print(listNode)}, ${paramName(listNode, node)} => ${print(valueNode)} in ${paramName(listNode, node)}${key(holder[0])})`
|
|
707
|
+
`any(${(0, print_ts_1.print)(listNode)}, ${paramName(listNode, node)} => ${(0, print_ts_1.print)(valueNode)} in ${paramName(listNode, node)}${(0, print_ts_1.key)(holder[0])})`
|
|
885
708
|
]
|
|
886
709
|
: []);
|
|
887
710
|
return;
|
|
@@ -892,21 +715,21 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
892
715
|
if (type.kind === 'number' &&
|
|
893
716
|
typeof literal === 'string' &&
|
|
894
717
|
Number.isNaN(Number(literal))) {
|
|
895
|
-
report('never-equal', 'warning', node, `${quote(literal)} is not a number, so it never equals ${describe(type)}`);
|
|
718
|
+
report('never-equal', 'warning', node, `${(0, print_ts_1.quote)(literal)} is not a number, so it never equals ${describe(type)}`);
|
|
896
719
|
}
|
|
897
720
|
else if (type.kind === 'boolean' && typeof literal === 'string') {
|
|
898
|
-
report('never-equal', 'warning', node, `${describe(type)} never equals the text ${quote(literal)}`, literal === 'true' || literal === 'false' ? [literal] : []);
|
|
721
|
+
report('never-equal', 'warning', node, `${describe(type)} never equals the text ${(0, print_ts_1.quote)(literal)}`, literal === 'true' || literal === 'false' ? [literal] : []);
|
|
899
722
|
}
|
|
900
723
|
else if (type.kind === 'string' &&
|
|
901
724
|
type.field?.categories &&
|
|
902
725
|
typeof literal === 'string' &&
|
|
903
726
|
!type.field.categories.includes(literal)) {
|
|
904
727
|
const near = nearest(literal, type.field.categories);
|
|
905
|
-
report('unknown-category', 'warning', node, `${quote(literal)} is not one of the values the header declares for ${type.field.path.join('.')}` +
|
|
906
|
-
(near.length ? `; did you mean ${near.map(quote).join(', ')}?` : ''), near.map(quote));
|
|
728
|
+
report('unknown-category', 'warning', node, `${(0, print_ts_1.quote)(literal)} is not one of the values the header declares for ${type.field.path.join('.')}` +
|
|
729
|
+
(near.length ? `; did you mean ${near.map(print_ts_1.quote).join(', ')}?` : ''), near.map(print_ts_1.quote));
|
|
907
730
|
}
|
|
908
731
|
else if (type.kind === 'record') {
|
|
909
|
-
report('never-equal', 'warning', node, `a record never equals ${quote(String(literal))}`);
|
|
732
|
+
report('never-equal', 'warning', node, `a record never equals ${(0, print_ts_1.quote)(String(literal))}`);
|
|
910
733
|
}
|
|
911
734
|
}
|
|
912
735
|
function binary(node) {
|
|
@@ -929,7 +752,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
929
752
|
if (operator === '~' || operator === '!~') {
|
|
930
753
|
const pattern = literalOf(right);
|
|
931
754
|
if (typeof pattern === 'string' && !isPattern(pattern)) {
|
|
932
|
-
report('invalid-pattern', 'error', node, `${quote(pattern)} is not a valid regular expression`);
|
|
755
|
+
report('invalid-pattern', 'error', node, `${(0, print_ts_1.quote)(pattern)} is not a valid regular expression`);
|
|
933
756
|
}
|
|
934
757
|
return BOOLEAN;
|
|
935
758
|
}
|
|
@@ -945,7 +768,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
945
768
|
second &&
|
|
946
769
|
(ARITHMETIC.has(operator) || operator === '+') &&
|
|
947
770
|
!pairs(first.cardinality, second.cardinality)) {
|
|
948
|
-
report('list-lengths', 'warning', node, `${print(node.left)} ${holding(first)} and ${print(rightNode)} ${holding(second)}, so ${operator} pairs them only where both hold one value`);
|
|
771
|
+
report('list-lengths', 'warning', node, `${(0, print_ts_1.print)(node.left)} ${holding(first)} and ${(0, print_ts_1.print)(rightNode)} ${holding(second)}, so ${operator} pairs them only where both hold one value`);
|
|
949
772
|
}
|
|
950
773
|
const eachOf = (item) => first ? { kind: 'list', of: item, cardinality: first.cardinality } : item;
|
|
951
774
|
if (operator === '+') {
|
|
@@ -960,9 +783,9 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
960
783
|
]) {
|
|
961
784
|
const numericOther = ARITHMETIC.has(operator) || isNumberish(other);
|
|
962
785
|
if (type.kind === 'string' && type.field && numericOther) {
|
|
963
|
-
report('string-numeric', 'warning', node, `${print(typeNode)} is text, so ${operator} converts it to a number, ${ORDER.has(operator) ? 'answering false' : 'giving NaN'} wherever it is not one`, functions?.parseFloat
|
|
786
|
+
report('string-numeric', 'warning', node, `${(0, print_ts_1.print)(typeNode)} is text, so ${operator} converts it to a number, ${ORDER.has(operator) ? 'answering false' : 'giving NaN'} wherever it is not one`, functions?.parseFloat
|
|
964
787
|
? [
|
|
965
|
-
print(node).replace(print(typeNode), `parseFloat(${print(typeNode)})`)
|
|
788
|
+
(0, print_ts_1.print)(node).replace((0, print_ts_1.print)(typeNode), `parseFloat(${(0, print_ts_1.print)(typeNode)})`)
|
|
966
789
|
]
|
|
967
790
|
: []);
|
|
968
791
|
}
|
|
@@ -974,7 +797,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
974
797
|
if (EQUALITY.has(operator)) {
|
|
975
798
|
const leftLiteral = literalOf(leftItem);
|
|
976
799
|
const rightLiteral = literalOf(rightItem);
|
|
977
|
-
if (rightLiteral !== undefined && node.right
|
|
800
|
+
if (rightLiteral !== undefined && node.right.type === 'Literal') {
|
|
978
801
|
compareLiteral(leftItem, rightLiteral, node);
|
|
979
802
|
}
|
|
980
803
|
else if (leftLiteral !== undefined && node.left.type === 'Literal') {
|
|
@@ -987,7 +810,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
987
810
|
memberFor(right.of, leftItem, node.left, rightNode, node);
|
|
988
811
|
}
|
|
989
812
|
else if (right.kind === 'number' || right.kind === 'boolean') {
|
|
990
|
-
report('never-equal', 'warning', node, `in tests a list, text, a Set, a Map or an object's keys, and ${print(rightNode)} is ${describe(right)}`);
|
|
813
|
+
report('never-equal', 'warning', node, `in tests a list, text, a Set, a Map or an object's keys, and ${(0, print_ts_1.print)(rightNode)} is ${describe(right)}`);
|
|
991
814
|
}
|
|
992
815
|
return BOOLEAN;
|
|
993
816
|
}
|
|
@@ -1061,12 +884,12 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1061
884
|
step(String(name), node);
|
|
1062
885
|
}
|
|
1063
886
|
for (const arg of keyArgs) {
|
|
1064
|
-
const name = literalValue(arg);
|
|
887
|
+
const name = (0, analyze_ts_1.literalValue)(arg);
|
|
1065
888
|
if (typeof name !== 'string' && typeof name !== 'number') {
|
|
1066
889
|
keyArgs.forEach(infer);
|
|
1067
890
|
return exports.UNKNOWN;
|
|
1068
891
|
}
|
|
1069
|
-
step(String(name), arg, quote);
|
|
892
|
+
step(String(name), arg, print_ts_1.quote);
|
|
1070
893
|
}
|
|
1071
894
|
return type;
|
|
1072
895
|
}
|
|
@@ -1076,7 +899,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1076
899
|
if (functions) {
|
|
1077
900
|
const near = nearest(name, Object.keys(functions));
|
|
1078
901
|
report('unknown-function', 'error', node, `no function ${name}` +
|
|
1079
|
-
(near.length ? `; did you mean ${near.join(', ')}?` : ''), near.map((candidate) => print({ ...node, name: candidate })));
|
|
902
|
+
(near.length ? `; did you mean ${near.join(', ')}?` : ''), near.map((candidate) => (0, print_ts_1.print)({ ...node, name: candidate })));
|
|
1080
903
|
}
|
|
1081
904
|
return exports.UNKNOWN;
|
|
1082
905
|
}
|
|
@@ -1104,7 +927,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1104
927
|
const type = infer(arg);
|
|
1105
928
|
types.push(type);
|
|
1106
929
|
if (accepted.includes('lambda')) {
|
|
1107
|
-
report('argument-type', 'error', arg, `${name} expects a function such as x => …, not ${print(arg)}`);
|
|
930
|
+
report('argument-type', 'error', arg, `${name} expects a function such as x => …, not ${(0, print_ts_1.print)(arg)}`);
|
|
1108
931
|
continue;
|
|
1109
932
|
}
|
|
1110
933
|
if (accepted.includes('member') && lastCollection && lastCollectionNode) {
|
|
@@ -1119,7 +942,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1119
942
|
? 'list-operand'
|
|
1120
943
|
: type.kind === 'string'
|
|
1121
944
|
? 'string-numeric'
|
|
1122
|
-
: 'argument-type', 'warning', arg, `${name} expects ${accepted.join(' or ')} as argument ${i + 1}, but ${print(arg)} ${problems[0]}`);
|
|
945
|
+
: 'argument-type', 'warning', arg, `${name} expects ${accepted.join(' or ')} as argument ${i + 1}, but ${(0, print_ts_1.print)(arg)} ${problems[0]}`);
|
|
1123
946
|
}
|
|
1124
947
|
if (accepted.includes('list')) {
|
|
1125
948
|
lastCollection = type;
|
|
@@ -1135,8 +958,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1135
958
|
}
|
|
1136
959
|
return returns ?? exports.UNKNOWN;
|
|
1137
960
|
}
|
|
1138
|
-
function infer(
|
|
1139
|
-
const node = ast;
|
|
961
|
+
function infer(node) {
|
|
1140
962
|
switch (node.type) {
|
|
1141
963
|
case 'Literal': {
|
|
1142
964
|
const { value } = node;
|
|
@@ -1160,20 +982,20 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1160
982
|
}
|
|
1161
983
|
case 'FilterExpression': {
|
|
1162
984
|
const subject = infer(node.subject);
|
|
1163
|
-
const at = literalValue(node.expr);
|
|
985
|
+
const at = (0, analyze_ts_1.literalValue)(node.expr);
|
|
1164
986
|
if (typeof at === 'number') {
|
|
1165
987
|
return index(subject, at, node, node.subject);
|
|
1166
988
|
}
|
|
1167
989
|
if (typeof at === 'string') {
|
|
1168
990
|
if (subject.kind === 'list' && at !== 'length') {
|
|
1169
|
-
report('unknown-field', 'warning', node, `${print(node.subject)} is ${describe(subject)}, so [${quote(at)}] reads nothing`);
|
|
991
|
+
report('unknown-field', 'warning', node, `${(0, print_ts_1.print)(node.subject)} is ${describe(subject)}, so [${(0, print_ts_1.quote)(at)}] reads nothing`);
|
|
1170
992
|
return UNDEFINED;
|
|
1171
993
|
}
|
|
1172
994
|
return field(subject, at, node, node.subject);
|
|
1173
995
|
}
|
|
1174
996
|
const by = infer(node.expr);
|
|
1175
997
|
if (isMulti(by)) {
|
|
1176
|
-
report('list-operand', 'warning', node, `${print(node.expr)} ${holding(by)}, so indexing by it finds an entry only when there is exactly one`);
|
|
998
|
+
report('list-operand', 'warning', node, `${(0, print_ts_1.print)(node.expr)} ${holding(by)}, so indexing by it finds an entry only when there is exactly one`);
|
|
1177
999
|
}
|
|
1178
1000
|
if (subject.kind === 'record') {
|
|
1179
1001
|
return unionAll([
|
|
@@ -1257,7 +1079,7 @@ function check(ast, { schema, functions, accessors = {}, row, env } = {}) {
|
|
|
1257
1079
|
return lambda(node);
|
|
1258
1080
|
}
|
|
1259
1081
|
default: {
|
|
1260
|
-
|
|
1082
|
+
return (0, errors_ts_1.unknownNode)(node);
|
|
1261
1083
|
}
|
|
1262
1084
|
}
|
|
1263
1085
|
}
|