pacc 4.25.1 → 4.26.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 CHANGED
@@ -79,26 +79,28 @@ const result = getAttribute({ a: [0,{ b: 4 }]}, "a[1].b");
79
79
  * [priority\_attribute](#priority_attribute)
80
80
  * [timeout\_attribute](#timeout_attribute)
81
81
  * [language\_attribute](#language_attribute)
82
- * [filter](#filter)
82
+ * [expand](#expand)
83
83
  * [Parameters](#parameters-3)
84
- * [setAttributes](#setattributes)
84
+ * [filter](#filter)
85
85
  * [Parameters](#parameters-4)
86
- * [getAttributes](#getattributes)
86
+ * [setAttributes](#setattributes)
87
87
  * [Parameters](#parameters-5)
88
+ * [getAttributes](#getattributes)
89
+ * [Parameters](#parameters-6)
88
90
  * [tokens](#tokens)
89
91
  * [tokens](#tokens-1)
90
- * [Parameters](#parameters-6)
91
- * [setAttribute](#setattribute)
92
92
  * [Parameters](#parameters-7)
93
- * [getAttribute](#getattribute)
93
+ * [setAttribute](#setattribute)
94
94
  * [Parameters](#parameters-8)
95
- * [getAttributeAndOperator](#getattributeandoperator)
95
+ * [getAttribute](#getattribute)
96
96
  * [Parameters](#parameters-9)
97
+ * [getAttributeAndOperator](#getattributeandoperator)
98
+ * [Parameters](#parameters-10)
97
99
  * [lookup](#lookup)
98
100
  * [Token](#token)
99
101
  * [Properties](#properties-1)
100
102
  * [createToken](#createtoken)
101
- * [Parameters](#parameters-10)
103
+ * [Parameters](#parameters-11)
102
104
  * [PLUS](#plus)
103
105
  * [MINUS](#minus)
104
106
  * [STAR](#star)
@@ -135,7 +137,7 @@ Create attributes from its definition.
135
137
  ### Parameters
136
138
 
137
139
  * `newDefinitions` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
138
- * `presentDefinitions` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)?** optional merg in attributes
140
+ * `presentDefinitions` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)?** optional merge in attributes
139
141
 
140
142
  Returns **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** attributes
141
143
 
@@ -367,6 +369,22 @@ Type: [AttributeDefinition](#attributedefinition)
367
369
 
368
370
  Type: [AttributeDefinition](#attributedefinition)
369
371
 
372
+ ## expand
373
+
374
+ Expand expressions inside of object graphs.
375
+
376
+ ### Parameters
377
+
378
+ * `object` **any** 
379
+ * `context` **[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object)** (optional, default `{}`)
380
+
381
+ * `context.root` **any** 
382
+ * `context.stopClass` **[function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)?** 
383
+ * `context.leadIn` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
384
+ * `context.leadOut` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** 
385
+
386
+ Returns **any** 
387
+
370
388
  ## filter
371
389
 
372
390
  Generate filter function.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pacc",
3
- "version": "4.25.1",
3
+ "version": "4.26.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
package/src/expand.mjs CHANGED
@@ -3,11 +3,13 @@ import { parse } from "./expression.mjs";
3
3
  const maxNestingLevel = 5;
4
4
 
5
5
  /**
6
- *
6
+ * Expand expressions inside of object graphs.
7
7
  * @param {any} object
8
8
  * @param {Object} context
9
9
  * @param {any} context.root
10
- * @param {function} context.stopClass
10
+ * @param {function} [context.stopClass]
11
+ * @param {string} [context.leadIn]
12
+ * @param {string} [context.leadOut]
11
13
  * @returns {any}
12
14
  */
13
15
  export function expand(object, context = {}) {
@@ -18,6 +18,7 @@ import {
18
18
  PLUS,
19
19
  MINUS,
20
20
  IDENTIFIER,
21
+ COMMA,
21
22
  EOF
22
23
  } from "./tokens.mjs";
23
24
 
@@ -121,10 +122,10 @@ export function parse(input, context = {}) {
121
122
  advance();
122
123
  };
123
124
 
124
- const nud = (token, left) => {
125
- switch (token.type) {
125
+ const nud = (last, left) => {
126
+ switch (last.type) {
126
127
  case "prefix":
127
- switch (token) {
128
+ switch (last) {
128
129
  case OPEN_ROUND: {
129
130
  const node = expression(0);
130
131
  expect(CLOSE_ROUND);
@@ -142,66 +143,66 @@ export function parse(input, context = {}) {
142
143
  return node;
143
144
  }
144
145
  }
145
- return { token, left, right: expression(token.precedence) };
146
+ return { token: last, left, right: expression(last.precedence) };
146
147
  case "eof":
147
148
  error("unexpected EOF");
148
149
  }
149
150
 
150
- switch (typeof token) {
151
+ switch (typeof last) {
151
152
  case "string":
152
153
  case "number":
153
154
  case "bigint":
154
155
  case "boolean":
155
- return token;
156
+ return last;
156
157
  }
157
158
 
158
- if (token === IDENTIFIER) {
159
+ if (last === IDENTIFIER) {
159
160
  return { eval: pathEval, path: [value] };
160
161
  }
161
162
 
162
- return { token };
163
+ return { token: last };
163
164
  };
164
165
 
165
- const led = (token, left) => {
166
- switch (token.type) {
166
+ const led = (last, left) => {
167
+ switch (last.type) {
167
168
  case "infixr": {
168
- const right = expression(token.precedence - 1);
169
+ const right = expression(last.precedence - 1);
169
170
  if (typeof left === typeof right) {
170
171
  switch (typeof left) {
171
172
  case "string":
172
173
  case "number":
173
174
  case "bigint":
174
175
  case "boolean":
175
- return binop(token, left, right, binopError);
176
+ return binop(last, left, right, binopError);
176
177
  }
177
178
  }
178
179
 
179
180
  return {
180
181
  eval: (node, current) =>
181
182
  binop(
182
- token,
183
+ last,
183
184
  left.eval ? left.eval(left, current) : left,
184
185
  right.eval ? right.eval(right, current) : right,
185
186
  binopError
186
187
  ),
187
- token,
188
+ last,
188
189
  left,
189
190
  right
190
191
  };
191
192
  }
192
193
 
193
194
  case "infix": {
194
- let right = expression(token.precedence);
195
+ let right = expression(last.precedence);
195
196
 
196
197
  if (typeof left === typeof right) {
197
198
  switch (typeof left) {
198
199
  case "string":
199
200
  case "number":
200
201
  case "bigint":
201
- return binop(token, left, right, binopError);
202
+ return binop(last, left, right, binopError);
202
203
  }
203
204
  }
204
- if (token === DOT) {
205
+ if (last === DOT) {
205
206
  if (left.path) {
206
207
  left.path.push(...right.path);
207
208
  return left;
@@ -221,18 +222,33 @@ export function parse(input, context = {}) {
221
222
  return {
222
223
  eval: (node, current) =>
223
224
  binop(
224
- token,
225
+ last,
225
226
  left.eval ? left.eval(left, current) : left,
226
227
  right.eval ? right.eval(right, current) : right,
227
228
  binopError
228
229
  ),
229
- token,
230
+ token: last,
230
231
  left,
231
232
  right
232
233
  };
233
234
  }
234
235
  case "prefix":
235
- switch (token) {
236
+ switch (last) {
237
+ case OPEN_ROUND:
238
+ {
239
+ const args = [];
240
+ while (token !== CLOSE_ROUND) {
241
+ args.push(expression(0));
242
+ if (token === COMMA) {
243
+ advance();
244
+ }
245
+ }
246
+ left.path.push(args);
247
+ left.eval = node =>
248
+ context.globals[node.path[0]](...node.path[1]);
249
+ return left;
250
+ }
251
+ break;
236
252
  case OPEN_BRACKET: {
237
253
  const predicate = expression(0);
238
254
  expect(CLOSE_BRACKET);
package/src/tokens.mjs CHANGED
@@ -34,7 +34,7 @@ export /** @type {Token} */ const GREATER_EQUAL = createToken(
34
34
  );
35
35
  export /** @type {Token} */ const LESS = createToken("<", 40, "infixr");
36
36
  export /** @type {Token} */ const LESS_EQUAL = createToken("<=", 40, "infixr");
37
- export /** @type {Token} */ const OPEN_ROUND = createToken("(", 0, "prefix");
37
+ export /** @type {Token} */ const OPEN_ROUND = createToken("(", 40, "prefix");
38
38
  export /** @type {Token} */ const CLOSE_ROUND = createToken(")", 0, "infix");
39
39
  export /** @type {Token} */ const OPEN_BRACKET = createToken("[", 10, "prefix");
40
40
  export /** @type {Token} */ const CLOSE_BRACKET = createToken("]", 0, "infix");
@@ -1,12 +1,16 @@
1
1
  /**
2
- *
2
+ * Expand expressions inside of object graphs.
3
3
  * @param {any} object
4
4
  * @param {Object} context
5
5
  * @param {any} context.root
6
- * @param {function} context.stopClass
6
+ * @param {function} [context.stopClass]
7
+ * @param {string} [context.leadIn]
8
+ * @param {string} [context.leadOut]
7
9
  * @returns {any}
8
10
  */
9
11
  export function expand(object: any, context?: {
10
12
  root: any;
11
- stopClass: Function;
13
+ stopClass?: Function;
14
+ leadIn?: string;
15
+ leadOut?: string;
12
16
  }): any;