pacc 4.23.0 → 4.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/expression.mjs +18 -5
- package/src/settergetter.mjs +26 -8
- package/src/tokens.mjs +42 -26
- package/types/tokens.d.mts +1 -0
package/package.json
CHANGED
package/src/expression.mjs
CHANGED
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
DIVIDE,
|
|
17
17
|
PLUS,
|
|
18
18
|
MINUS,
|
|
19
|
+
IDENTIFIER,
|
|
19
20
|
EOF
|
|
20
21
|
} from "./tokens.mjs";
|
|
21
22
|
|
|
@@ -51,7 +52,7 @@ export function binop(op, left, right, fallback) {
|
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
export function parse(context) {
|
|
54
|
-
let node, token;
|
|
55
|
+
let node, token, value;
|
|
55
56
|
|
|
56
57
|
function error(message) {
|
|
57
58
|
const error = new Error(message);
|
|
@@ -95,8 +96,15 @@ export function parse(context) {
|
|
|
95
96
|
};
|
|
96
97
|
|
|
97
98
|
const advance = () => {
|
|
98
|
-
const
|
|
99
|
-
|
|
99
|
+
const next = context.tokens.next();
|
|
100
|
+
if (next.done) {
|
|
101
|
+
token = EOF;
|
|
102
|
+
} else {
|
|
103
|
+
token = next.value[0];
|
|
104
|
+
if (next.value.length > 1) {
|
|
105
|
+
value = next.value[1];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
100
108
|
};
|
|
101
109
|
|
|
102
110
|
const expect = expected => {
|
|
@@ -119,6 +127,7 @@ export function parse(context) {
|
|
|
119
127
|
const node = expression(0);
|
|
120
128
|
expect(CLOSE_BRACKET);
|
|
121
129
|
switch (typeof node) {
|
|
130
|
+
case "string":
|
|
122
131
|
case "number":
|
|
123
132
|
return { eval: pathEval, path: [node] };
|
|
124
133
|
}
|
|
@@ -133,13 +142,16 @@ export function parse(context) {
|
|
|
133
142
|
|
|
134
143
|
switch (typeof token) {
|
|
135
144
|
case "string":
|
|
136
|
-
return { eval: pathEval, path: [token] };
|
|
137
145
|
case "number":
|
|
138
146
|
case "bigint":
|
|
139
147
|
case "boolean":
|
|
140
148
|
return token;
|
|
141
149
|
}
|
|
142
150
|
|
|
151
|
+
if (token === IDENTIFIER) {
|
|
152
|
+
return { eval: pathEval, path: [value] };
|
|
153
|
+
}
|
|
154
|
+
|
|
143
155
|
return { token };
|
|
144
156
|
};
|
|
145
157
|
|
|
@@ -156,6 +168,7 @@ export function parse(context) {
|
|
|
156
168
|
return binop(token, left, right, binopError);
|
|
157
169
|
}
|
|
158
170
|
}
|
|
171
|
+
|
|
159
172
|
return {
|
|
160
173
|
eval: (node, current) =>
|
|
161
174
|
binop(
|
|
@@ -246,7 +259,7 @@ export function parse(context) {
|
|
|
246
259
|
if (context.exec !== false && result?.eval) {
|
|
247
260
|
result = result.eval(result, context.root);
|
|
248
261
|
|
|
249
|
-
if(typeof result ===
|
|
262
|
+
if (typeof result === "function") {
|
|
250
263
|
return [...result()];
|
|
251
264
|
}
|
|
252
265
|
}
|
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";
|
|
@@ -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/tokens.d.mts
CHANGED