@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/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
|
|
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
|
|
19
|
+
export interface Identifier {
|
|
24
20
|
type: 'Identifier';
|
|
25
21
|
value: string;
|
|
26
22
|
from?: AstNode;
|
|
27
23
|
}
|
|
28
|
-
export interface BinaryExpression
|
|
24
|
+
export interface BinaryExpression {
|
|
29
25
|
type: 'BinaryExpression';
|
|
30
26
|
operator: string;
|
|
31
27
|
left: AstNode;
|
|
32
|
-
right
|
|
28
|
+
right: AstNode;
|
|
33
29
|
}
|
|
34
|
-
export interface UnaryExpression
|
|
30
|
+
export interface UnaryExpression {
|
|
35
31
|
type: 'UnaryExpression';
|
|
36
32
|
operator: string;
|
|
37
|
-
right
|
|
33
|
+
right: AstNode;
|
|
38
34
|
}
|
|
39
|
-
export interface ArrayLiteral
|
|
35
|
+
export interface ArrayLiteral {
|
|
40
36
|
type: 'ArrayLiteral';
|
|
41
37
|
value: AstNode[];
|
|
42
38
|
}
|
|
43
|
-
export interface ObjectLiteral
|
|
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
|
|
50
|
+
export interface TemplateLiteral {
|
|
55
51
|
type: 'TemplateLiteral';
|
|
56
52
|
parts: TemplateLiteralPart[];
|
|
57
53
|
}
|
|
58
|
-
export interface FunctionCall
|
|
54
|
+
export interface FunctionCall {
|
|
59
55
|
type: 'FunctionCall';
|
|
60
56
|
name: string;
|
|
61
57
|
args: AstNode[];
|
|
62
58
|
}
|
|
63
|
-
export interface FilterExpression
|
|
59
|
+
export interface FilterExpression {
|
|
64
60
|
type: 'FilterExpression';
|
|
65
61
|
expr: AstNode;
|
|
66
62
|
subject: AstNode;
|
|
67
63
|
}
|
|
68
|
-
export interface ConditionalExpression
|
|
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
|
|
70
|
+
export interface SequenceExpression {
|
|
75
71
|
type: 'SequenceExpression';
|
|
76
72
|
expressions: AstNode[];
|
|
77
73
|
}
|
|
78
|
-
export interface AssignmentExpression
|
|
74
|
+
export interface AssignmentExpression {
|
|
79
75
|
type: 'AssignmentExpression';
|
|
80
76
|
operator: '=';
|
|
81
77
|
left: Identifier;
|
|
78
|
+
right: AstNode;
|
|
82
79
|
}
|
|
83
|
-
export interface Lambda
|
|
80
|
+
export interface Lambda {
|
|
84
81
|
type: 'Lambda';
|
|
85
82
|
params: string[];
|
|
86
83
|
body: AstNode;
|
|
87
84
|
}
|
|
88
|
-
export type
|
|
89
|
-
export type NodeByType<T extends
|
|
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
|
}>;
|
package/esm/Expression.d.ts
CHANGED
|
@@ -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
|
package/esm/Expression.js.map
CHANGED
|
@@ -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,
|
|
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
|
-
//
|
|
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
|
|
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,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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":"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,
|
|
1
|
+
{"version":3,"file":"Jexl.js","sourceRoot":"","sources":["../src/Jexl.ts"],"names":[],"mappings":"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"}
|
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
|
-
*
|
|
34
|
-
*
|
|
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
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
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
|
-
*
|
|
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;
|