pacc 4.22.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pacc",
3
- "version": "4.22.0",
3
+ "version": "4.23.1",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -9,19 +9,19 @@ export const types = {
9
9
  number: {
10
10
  name: "number",
11
11
  extends: "base",
12
- convertValue: (value, attribute) =>
12
+ prepareValue: (value, attribute) =>
13
13
  typeof value === "string" ? parseFloat(value) : value
14
14
  },
15
15
  boolean: {
16
16
  name: "boolean",
17
17
  extends: "base",
18
- convertValue: (value, attribute) => (!value || value === "0" ? false : true)
18
+ prepareValue: (value, attribute) => (!value || value === "0" ? false : true)
19
19
  },
20
20
 
21
21
  integer: {
22
22
  name: "integer",
23
23
  extends: "base",
24
- convertValue: (value, attribute) =>
24
+ prepareValue: (value, attribute) =>
25
25
  typeof value === "string" ? parseInt(value) : value
26
26
  },
27
27
  "unsigned-integer": { name: "unsigned-integer", extends: "integer" },
@@ -91,9 +91,9 @@ export function* attributeIterator(definition, path = []) {
91
91
  }
92
92
  }
93
93
 
94
- export function convertValue(value, attribute) {
95
- if (attribute?.type?.convertValue) {
96
- return attribute.type.convertValue(value, attribute);
94
+ export function prepareValue(value, attribute) {
95
+ if (attribute?.type?.prepareValue) {
96
+ return attribute.type.prepareValue(value, attribute);
97
97
  }
98
98
  return value;
99
99
  }
@@ -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 { value, done } = context.tokens.next();
99
- token = done ? EOF : value;
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 === 'function') {
262
+ if (typeof result === "function") {
250
263
  return [...result()];
251
264
  }
252
265
  }
@@ -1,6 +1,6 @@
1
1
  import { attributeIterator } from "./attributes.mjs";
2
2
  import { getAttribute, setAttribute } from "./settergetter.mjs";
3
- import { convertValue } from "./attributes.mjs";
3
+ import { prepareValue } from "./attributes.mjs";
4
4
 
5
5
  export function definePropertiesFromAttributes(
6
6
  object,
@@ -22,7 +22,7 @@ export function definePropertiesFromAttributes(
22
22
  name
23
23
  );
24
24
 
25
- value = convertValue(value, attribute);
25
+ value = prepareValue(value, attribute);
26
26
 
27
27
  const property = properties[name];
28
28
 
@@ -13,10 +13,11 @@ 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
- import { convertValue } from "./attributes.mjs";
20
+ import { prepareValue } from "./attributes.mjs";
20
21
 
21
22
  /**
22
23
  * Set object attribute.
@@ -48,7 +49,7 @@ export function setAttribute(object, expression, value, definition) {
48
49
  }
49
50
 
50
51
  if (anchor) {
51
- anchor[anchorKey] = convertValue(value, definition);
52
+ anchor[anchorKey] = prepareValue(value, definition);
52
53
  }
53
54
  }
54
55
 
@@ -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
- break;
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;
@@ -11,7 +11,7 @@ export function prepareAttributesDefinitions(newDefinitions: any, presentDefinit
11
11
  * @param {string[]} path
12
12
  */
13
13
  export function attributeIterator(definition: any, path?: string[]): any;
14
- export function convertValue(value: any, attribute: any): any;
14
+ export function prepareValue(value: any, attribute: any): any;
15
15
  export const baseTypes: Set<string>;
16
16
  export const types: {
17
17
  base: {
@@ -24,17 +24,17 @@ export const types: {
24
24
  number: {
25
25
  name: string;
26
26
  extends: string;
27
- convertValue: (value: any, attribute: any) => any;
27
+ prepareValue: (value: any, attribute: any) => any;
28
28
  };
29
29
  boolean: {
30
30
  name: string;
31
31
  extends: string;
32
- convertValue: (value: any, attribute: any) => boolean;
32
+ prepareValue: (value: any, attribute: any) => boolean;
33
33
  };
34
34
  integer: {
35
35
  name: string;
36
36
  extends: string;
37
- convertValue: (value: any, attribute: any) => any;
37
+ prepareValue: (value: any, attribute: any) => any;
38
38
  };
39
39
  "unsigned-integer": {
40
40
  name: string;
@@ -33,6 +33,7 @@ export namespace AMPERSAND { }
33
33
  export namespace DOUBLE_AMPERSAND { }
34
34
  export namespace BAR { }
35
35
  export namespace DOUBLE_BAR { }
36
+ export namespace IDENTIFIER { }
36
37
  export namespace EOF { }
37
38
  export type Token = {
38
39
  str: string;