pacc 4.23.0 → 4.24.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/package.json +1 -1
- package/src/expand.mjs +1 -3
- package/src/expression.mjs +24 -8
- package/src/settergetter.mjs +28 -10
- package/src/tokens.mjs +42 -26
- package/types/expression.d.mts +1 -1
- package/types/tokens.d.mts +1 -0
package/package.json
CHANGED
package/src/expand.mjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { parse } from "./expression.mjs";
|
|
2
|
-
import { tokens } from "./tokens.mjs";
|
|
3
2
|
|
|
4
3
|
const maxNestingLevel = 5;
|
|
5
4
|
|
|
@@ -20,8 +19,7 @@ export function expand(object, context) {
|
|
|
20
19
|
const v = object.replace(
|
|
21
20
|
/\$\{([^\}]*)\}/g,
|
|
22
21
|
(match, expression, offset, string) => {
|
|
23
|
-
|
|
24
|
-
let value = parse(context);
|
|
22
|
+
let value = parse(expression,context);
|
|
25
23
|
|
|
26
24
|
if (typeof value === "string" || value instanceof String) {
|
|
27
25
|
value = _expand(value, path);
|
package/src/expression.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
tokens,
|
|
2
3
|
DOT,
|
|
3
4
|
OPEN_ROUND,
|
|
4
5
|
CLOSE_ROUND,
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
DIVIDE,
|
|
17
18
|
PLUS,
|
|
18
19
|
MINUS,
|
|
20
|
+
IDENTIFIER,
|
|
19
21
|
EOF
|
|
20
22
|
} from "./tokens.mjs";
|
|
21
23
|
|
|
@@ -50,8 +52,10 @@ export function binop(op, left, right, fallback) {
|
|
|
50
52
|
return fallback(op, left, right);
|
|
51
53
|
}
|
|
52
54
|
|
|
53
|
-
export function parse(context) {
|
|
54
|
-
|
|
55
|
+
export function parse(input, context = {}) {
|
|
56
|
+
input = tokens(input);
|
|
57
|
+
|
|
58
|
+
let node, token, value;
|
|
55
59
|
|
|
56
60
|
function error(message) {
|
|
57
61
|
const error = new Error(message);
|
|
@@ -79,9 +83,9 @@ export function parse(context) {
|
|
|
79
83
|
}
|
|
80
84
|
break;
|
|
81
85
|
case "object":
|
|
82
|
-
const
|
|
86
|
+
const r = result;
|
|
83
87
|
function* filter() {
|
|
84
|
-
for (const x of
|
|
88
|
+
for (const x of r) {
|
|
85
89
|
if (p.eval(p, x)) {
|
|
86
90
|
yield x;
|
|
87
91
|
}
|
|
@@ -95,8 +99,15 @@ export function parse(context) {
|
|
|
95
99
|
};
|
|
96
100
|
|
|
97
101
|
const advance = () => {
|
|
98
|
-
const
|
|
99
|
-
|
|
102
|
+
const next = input.next();
|
|
103
|
+
if (next.done) {
|
|
104
|
+
token = EOF;
|
|
105
|
+
} else {
|
|
106
|
+
token = next.value[0];
|
|
107
|
+
if (next.value.length > 1) {
|
|
108
|
+
value = next.value[1];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
100
111
|
};
|
|
101
112
|
|
|
102
113
|
const expect = expected => {
|
|
@@ -119,6 +130,7 @@ export function parse(context) {
|
|
|
119
130
|
const node = expression(0);
|
|
120
131
|
expect(CLOSE_BRACKET);
|
|
121
132
|
switch (typeof node) {
|
|
133
|
+
case "string":
|
|
122
134
|
case "number":
|
|
123
135
|
return { eval: pathEval, path: [node] };
|
|
124
136
|
}
|
|
@@ -133,13 +145,16 @@ export function parse(context) {
|
|
|
133
145
|
|
|
134
146
|
switch (typeof token) {
|
|
135
147
|
case "string":
|
|
136
|
-
return { eval: pathEval, path: [token] };
|
|
137
148
|
case "number":
|
|
138
149
|
case "bigint":
|
|
139
150
|
case "boolean":
|
|
140
151
|
return token;
|
|
141
152
|
}
|
|
142
153
|
|
|
154
|
+
if (token === IDENTIFIER) {
|
|
155
|
+
return { eval: pathEval, path: [value] };
|
|
156
|
+
}
|
|
157
|
+
|
|
143
158
|
return { token };
|
|
144
159
|
};
|
|
145
160
|
|
|
@@ -156,6 +171,7 @@ export function parse(context) {
|
|
|
156
171
|
return binop(token, left, right, binopError);
|
|
157
172
|
}
|
|
158
173
|
}
|
|
174
|
+
|
|
159
175
|
return {
|
|
160
176
|
eval: (node, current) =>
|
|
161
177
|
binop(
|
|
@@ -246,7 +262,7 @@ export function parse(context) {
|
|
|
246
262
|
if (context.exec !== false && result?.eval) {
|
|
247
263
|
result = result.eval(result, context.root);
|
|
248
264
|
|
|
249
|
-
if(typeof result ===
|
|
265
|
+
if (typeof result === "function") {
|
|
250
266
|
return [...result()];
|
|
251
267
|
}
|
|
252
268
|
}
|
package/src/settergetter.mjs
CHANGED
|
@@ -13,7 +13,8 @@ import {
|
|
|
13
13
|
LESS_EQUAL,
|
|
14
14
|
GREATER,
|
|
15
15
|
GREATER_EQUAL,
|
|
16
|
-
STAR
|
|
16
|
+
STAR,
|
|
17
|
+
IDENTIFIER
|
|
17
18
|
} from "./tokens.mjs";
|
|
18
19
|
import { parse } from "./expression.mjs";
|
|
19
20
|
import { prepareValue } from "./attributes.mjs";
|
|
@@ -27,7 +28,7 @@ import { prepareValue } from "./attributes.mjs";
|
|
|
27
28
|
* @param {Object} definition type def
|
|
28
29
|
*/
|
|
29
30
|
export function setAttribute(object, expression, value, definition) {
|
|
30
|
-
const { path } = parse(
|
|
31
|
+
const { path } = parse(expression, { exec: false });
|
|
31
32
|
|
|
32
33
|
let anchor, anchorKey;
|
|
33
34
|
|
|
@@ -60,7 +61,7 @@ export function setAttribute(object, expression, value, definition) {
|
|
|
60
61
|
* @returns {any} value associated with the given property name
|
|
61
62
|
*/
|
|
62
63
|
export function getAttribute(object, expression, definition) {
|
|
63
|
-
const { path } = parse(
|
|
64
|
+
const { path } = parse(expression, { exec: false });
|
|
64
65
|
|
|
65
66
|
for (const key of path) {
|
|
66
67
|
if (object !== undefined) {
|
|
@@ -80,7 +81,7 @@ export function getAttribute(object, expression, definition) {
|
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
|
|
83
|
-
if(object === undefined && definition) {
|
|
84
|
+
if (object === undefined && definition) {
|
|
84
85
|
object = definition.default;
|
|
85
86
|
}
|
|
86
87
|
|
|
@@ -114,14 +115,14 @@ export function getAttributeAndOperator(object, expression) {
|
|
|
114
115
|
const next = tokens(expression);
|
|
115
116
|
|
|
116
117
|
for (const token of next) {
|
|
117
|
-
switch (token) {
|
|
118
|
+
switch (token[0]) {
|
|
118
119
|
case GREATER_EQUAL:
|
|
119
120
|
case LESS_EQUAL:
|
|
120
121
|
case GREATER:
|
|
121
122
|
case LESS:
|
|
122
123
|
case EQUAL:
|
|
123
124
|
case NOT_EQUAL:
|
|
124
|
-
op = token;
|
|
125
|
+
op = token[0];
|
|
125
126
|
break;
|
|
126
127
|
case DOT:
|
|
127
128
|
case OPEN_BRACKET:
|
|
@@ -142,20 +143,37 @@ export function getAttributeAndOperator(object, expression) {
|
|
|
142
143
|
error.expression = expression;
|
|
143
144
|
throw error;
|
|
144
145
|
}
|
|
145
|
-
predicateTokens.push(token);
|
|
146
|
+
predicateTokens.push(token[0]);
|
|
146
147
|
break;
|
|
147
148
|
|
|
149
|
+
case IDENTIFIER:
|
|
150
|
+
if (object !== undefined) {
|
|
151
|
+
switch (typeof object[token[1]]) {
|
|
152
|
+
case "function":
|
|
153
|
+
object = object[token[1]]();
|
|
154
|
+
if (typeof object[Symbol.iterator] === "function") {
|
|
155
|
+
object = [...object];
|
|
156
|
+
}
|
|
157
|
+
break;
|
|
158
|
+
default:
|
|
159
|
+
object = object[token[1]];
|
|
160
|
+
break;
|
|
161
|
+
case "undefined":
|
|
162
|
+
return [undefined, op];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
148
166
|
default:
|
|
149
167
|
if (object !== undefined) {
|
|
150
|
-
switch (typeof object[token]) {
|
|
168
|
+
switch (typeof object[token[0]]) {
|
|
151
169
|
case "function":
|
|
152
|
-
object = object[token]();
|
|
170
|
+
object = object[token[0]]();
|
|
153
171
|
if (typeof object[Symbol.iterator] === "function") {
|
|
154
172
|
object = [...object];
|
|
155
173
|
}
|
|
156
174
|
break;
|
|
157
175
|
default:
|
|
158
|
-
object = object[token];
|
|
176
|
+
object = object[token[0]];
|
|
159
177
|
break;
|
|
160
178
|
case "undefined":
|
|
161
179
|
return [undefined, op];
|
package/src/tokens.mjs
CHANGED
|
@@ -15,7 +15,7 @@ const lookup = {};
|
|
|
15
15
|
*/
|
|
16
16
|
function createToken(str, precedence = 0, type) {
|
|
17
17
|
const token = { str, precedence, type };
|
|
18
|
-
lookup[str] = token;
|
|
18
|
+
lookup[str] = [token];
|
|
19
19
|
return token;
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -53,6 +53,7 @@ export /** @type {Token} */ const DOUBLE_AMPERSAND = createToken(
|
|
|
53
53
|
);
|
|
54
54
|
export /** @type {Token} */ const BAR = createToken("|");
|
|
55
55
|
export /** @type {Token} */ const DOUBLE_BAR = createToken("||", 30, "infixr");
|
|
56
|
+
export /** @type {Token} */ const IDENTIFIER = createToken("IDENTIFIER", 0);
|
|
56
57
|
export /** @type {Token} */ const EOF = createToken("EOF", -1, "eof");
|
|
57
58
|
|
|
58
59
|
/**
|
|
@@ -67,11 +68,11 @@ export function* tokens(string) {
|
|
|
67
68
|
function maybeKeyword() {
|
|
68
69
|
switch (value) {
|
|
69
70
|
case "true":
|
|
70
|
-
return true;
|
|
71
|
+
return [true];
|
|
71
72
|
case "false":
|
|
72
|
-
return false;
|
|
73
|
+
return [false];
|
|
73
74
|
default:
|
|
74
|
-
return value;
|
|
75
|
+
return [IDENTIFIER, value];
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
|
|
@@ -108,13 +109,15 @@ export function* tokens(string) {
|
|
|
108
109
|
case "\t":
|
|
109
110
|
case " ":
|
|
110
111
|
switch (state) {
|
|
112
|
+
case "number":
|
|
113
|
+
case "number-fraction":
|
|
114
|
+
yield [value];
|
|
115
|
+
state = undefined;
|
|
111
116
|
case undefined:
|
|
112
117
|
break;
|
|
113
118
|
case "string":
|
|
114
119
|
value += c;
|
|
115
120
|
break;
|
|
116
|
-
case "number-fraction":
|
|
117
|
-
case "number":
|
|
118
121
|
case "identifier":
|
|
119
122
|
yield maybeKeyword();
|
|
120
123
|
value = undefined;
|
|
@@ -136,12 +139,17 @@ export function* tokens(string) {
|
|
|
136
139
|
case '"':
|
|
137
140
|
case "'":
|
|
138
141
|
switch (state) {
|
|
142
|
+
case "number":
|
|
143
|
+
case "number-fraction":
|
|
144
|
+
yield [value];
|
|
145
|
+
case undefined:
|
|
146
|
+
value = "";
|
|
147
|
+
state = "string";
|
|
148
|
+
break;
|
|
139
149
|
case "string":
|
|
140
|
-
yield value;
|
|
150
|
+
yield [value];
|
|
141
151
|
state = undefined;
|
|
142
152
|
break;
|
|
143
|
-
case "number-fraction":
|
|
144
|
-
case "number":
|
|
145
153
|
case "identifier":
|
|
146
154
|
yield maybeKeyword();
|
|
147
155
|
value = "";
|
|
@@ -149,10 +157,8 @@ export function* tokens(string) {
|
|
|
149
157
|
break;
|
|
150
158
|
default:
|
|
151
159
|
yield lookup[state];
|
|
152
|
-
case undefined:
|
|
153
160
|
value = "";
|
|
154
161
|
state = "string";
|
|
155
|
-
break;
|
|
156
162
|
}
|
|
157
163
|
break;
|
|
158
164
|
case "!":
|
|
@@ -161,6 +167,12 @@ export function* tokens(string) {
|
|
|
161
167
|
case "&":
|
|
162
168
|
case "|":
|
|
163
169
|
switch (state) {
|
|
170
|
+
case "number":
|
|
171
|
+
case "number-fraction":
|
|
172
|
+
yield [value];
|
|
173
|
+
case undefined:
|
|
174
|
+
state = c;
|
|
175
|
+
break;
|
|
164
176
|
case "&":
|
|
165
177
|
case "|":
|
|
166
178
|
if (state === c) {
|
|
@@ -172,15 +184,9 @@ export function* tokens(string) {
|
|
|
172
184
|
state = c;
|
|
173
185
|
}
|
|
174
186
|
break;
|
|
175
|
-
case undefined:
|
|
176
|
-
state = c;
|
|
177
|
-
break;
|
|
178
187
|
case "string":
|
|
179
188
|
value += c;
|
|
180
189
|
break;
|
|
181
|
-
|
|
182
|
-
case "number-fraction":
|
|
183
|
-
case "number":
|
|
184
190
|
case "identifier":
|
|
185
191
|
yield maybeKeyword();
|
|
186
192
|
state = c;
|
|
@@ -193,14 +199,15 @@ export function* tokens(string) {
|
|
|
193
199
|
|
|
194
200
|
case "=":
|
|
195
201
|
switch (state) {
|
|
202
|
+
case "number":
|
|
203
|
+
case "number-fraction":
|
|
204
|
+
yield [value];
|
|
196
205
|
case undefined:
|
|
197
206
|
state = c;
|
|
198
207
|
break;
|
|
199
208
|
case "string":
|
|
200
209
|
value += c;
|
|
201
210
|
break;
|
|
202
|
-
case "number-fraction":
|
|
203
|
-
case "number":
|
|
204
211
|
case "identifier":
|
|
205
212
|
yield maybeKeyword();
|
|
206
213
|
state = c;
|
|
@@ -229,20 +236,22 @@ export function* tokens(string) {
|
|
|
229
236
|
case "{":
|
|
230
237
|
case "}":
|
|
231
238
|
switch (state) {
|
|
239
|
+
case "number":
|
|
240
|
+
case "number-fraction":
|
|
241
|
+
yield [value];
|
|
242
|
+
case undefined:
|
|
243
|
+
state = c;
|
|
244
|
+
break;
|
|
232
245
|
case "string":
|
|
233
246
|
value += c;
|
|
234
247
|
break;
|
|
235
|
-
case "number":
|
|
236
|
-
case "number-fraction":
|
|
237
248
|
case "identifier":
|
|
238
249
|
yield maybeKeyword();
|
|
239
250
|
state = c;
|
|
240
251
|
break;
|
|
241
252
|
default:
|
|
242
253
|
yield lookup[state];
|
|
243
|
-
case undefined:
|
|
244
254
|
state = c;
|
|
245
|
-
break;
|
|
246
255
|
}
|
|
247
256
|
break;
|
|
248
257
|
case "0":
|
|
@@ -283,16 +292,21 @@ export function* tokens(string) {
|
|
|
283
292
|
|
|
284
293
|
default:
|
|
285
294
|
switch (state) {
|
|
295
|
+
case "number":
|
|
296
|
+
case "number-fraction":
|
|
297
|
+
yield [value];
|
|
298
|
+
case undefined:
|
|
299
|
+
state = "identifier";
|
|
300
|
+
value = c;
|
|
301
|
+
break;
|
|
286
302
|
case "string":
|
|
287
303
|
case "identifier":
|
|
288
304
|
value += c;
|
|
289
305
|
break;
|
|
290
306
|
default:
|
|
291
307
|
yield lookup[state];
|
|
292
|
-
case undefined:
|
|
293
|
-
state = "identifier";
|
|
294
308
|
value = c;
|
|
295
|
-
|
|
309
|
+
state = "identifier";
|
|
296
310
|
}
|
|
297
311
|
}
|
|
298
312
|
}
|
|
@@ -307,6 +321,8 @@ export function* tokens(string) {
|
|
|
307
321
|
throw error;
|
|
308
322
|
case "number-fraction":
|
|
309
323
|
case "number":
|
|
324
|
+
yield [value];
|
|
325
|
+
break;
|
|
310
326
|
case "identifier":
|
|
311
327
|
yield maybeKeyword();
|
|
312
328
|
break;
|
package/types/expression.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export function binop(op: any, left: any, right: any, fallback: any): any;
|
|
2
|
-
export function parse(
|
|
2
|
+
export function parse(input: any, context?: {}): any;
|
package/types/tokens.d.mts
CHANGED