@apiconvert/core 0.2.0 → 1.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.
Files changed (62) hide show
  1. package/README.md +60 -268
  2. package/dist/condition-expression-evaluator.d.ts +4 -0
  3. package/dist/condition-expression-evaluator.d.ts.map +1 -0
  4. package/dist/condition-expression-evaluator.js +63 -0
  5. package/dist/condition-expression-evaluator.js.map +1 -0
  6. package/dist/condition-expression-parser.d.ts +26 -0
  7. package/dist/condition-expression-parser.d.ts.map +1 -0
  8. package/dist/condition-expression-parser.js +191 -0
  9. package/dist/condition-expression-parser.js.map +1 -0
  10. package/dist/condition-expression-tokenizer.d.ts +3 -0
  11. package/dist/condition-expression-tokenizer.d.ts.map +1 -0
  12. package/dist/condition-expression-tokenizer.js +103 -0
  13. package/dist/condition-expression-tokenizer.js.map +1 -0
  14. package/dist/condition-expression-types.d.ts +29 -0
  15. package/dist/condition-expression-types.d.ts.map +1 -0
  16. package/dist/condition-expression-types.js +3 -0
  17. package/dist/condition-expression-types.js.map +1 -0
  18. package/dist/condition-expression.d.ts +9 -0
  19. package/dist/condition-expression.d.ts.map +1 -0
  20. package/dist/condition-expression.js +16 -0
  21. package/dist/condition-expression.js.map +1 -0
  22. package/dist/core-utils.d.ts +11 -0
  23. package/dist/core-utils.d.ts.map +1 -0
  24. package/dist/core-utils.js +126 -0
  25. package/dist/core-utils.js.map +1 -0
  26. package/dist/index.d.ts +5 -99
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +31 -729
  29. package/dist/index.js.map +1 -1
  30. package/dist/mapping-engine.d.ts +3 -0
  31. package/dist/mapping-engine.d.ts.map +1 -0
  32. package/dist/mapping-engine.js +18 -0
  33. package/dist/mapping-engine.js.map +1 -0
  34. package/dist/payload-converter.d.ts +7 -0
  35. package/dist/payload-converter.d.ts.map +1 -0
  36. package/dist/payload-converter.js +37 -0
  37. package/dist/payload-converter.js.map +1 -0
  38. package/dist/query-payload.d.ts +3 -0
  39. package/dist/query-payload.d.ts.map +1 -0
  40. package/dist/query-payload.js +183 -0
  41. package/dist/query-payload.js.map +1 -0
  42. package/dist/rule-executor.d.ts +3 -0
  43. package/dist/rule-executor.d.ts.map +1 -0
  44. package/dist/rule-executor.js +108 -0
  45. package/dist/rule-executor.js.map +1 -0
  46. package/dist/rules-normalizer.d.ts +3 -0
  47. package/dist/rules-normalizer.d.ts.map +1 -0
  48. package/dist/rules-normalizer.js +158 -0
  49. package/dist/rules-normalizer.js.map +1 -0
  50. package/dist/source-resolver.d.ts +4 -0
  51. package/dist/source-resolver.d.ts.map +1 -0
  52. package/dist/source-resolver.js +155 -0
  53. package/dist/source-resolver.js.map +1 -0
  54. package/dist/types.d.ts +97 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +33 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/xml-payload.d.ts +3 -0
  59. package/dist/xml-payload.d.ts.map +1 -0
  60. package/dist/xml-payload.js +61 -0
  61. package/dist/xml-payload.js.map +1 -0
  62. package/package.json +1 -1
package/README.md CHANGED
@@ -1,294 +1,86 @@
1
1
  # @apiconvert/core
2
2
 
3
- TypeScript package for applying Apiconvert conversion rules to JSON, XML, and query payloads.
3
+ Shared TypeScript conversion runtime for Apiconvert.
4
4
 
5
- ## Install
5
+ ## Rules Model
6
6
 
7
- ```bash
8
- npm install @apiconvert/core
9
- ```
7
+ Canonical rules are defined by one ordered `rules` array of recursive nodes:
8
+ - `kind: "field"` with `outputPaths` and `source`
9
+ - `kind: "array"` with `inputPath`, `outputPaths`, and recursive `itemRules`
10
+ - `kind: "branch"` with `expression`, `then`, optional `elseIf`, optional `else`
10
11
 
11
- ## Basic JSON -> JSON
12
+ Supported field source types:
13
+ - `path`
14
+ - `constant`
15
+ - `transform`
16
+ - `merge`
17
+ - `condition`
12
18
 
13
- ```ts
14
- import {
15
- applyConversion,
16
- DataFormat,
17
- formatPayload,
18
- normalizeConversionRules,
19
- parsePayload
20
- } from "@apiconvert/core";
19
+ Supported transforms:
20
+ - `toLowerCase`
21
+ - `toUpperCase`
22
+ - `number`
23
+ - `boolean`
24
+ - `concat`
25
+ - `split`
21
26
 
22
- const rules = normalizeConversionRules({
23
- version: 2,
24
- inputFormat: DataFormat.Json,
25
- outputFormat: DataFormat.Json,
26
- fieldMappings: [
27
- {
28
- outputPath: "profile.name",
29
- source: { type: "path", path: "user.fullName" }
30
- }
31
- ]
32
- });
27
+ Supported merge modes:
28
+ - `concat`
29
+ - `firstNonEmpty`
30
+ - `array`
33
31
 
34
- const input = '{"user": {"fullName": "Ada Lovelace"}}';
35
- const { value, error } = parsePayload(input, rules.inputFormat!);
36
- if (error) throw new Error(error);
32
+ Additional options:
33
+ - field: optional `defaultValue`
34
+ - array: optional `coerceSingle`
35
+ - condition source: optional `trueSource` / `falseSource`, `trueValue` / `falseValue`, `elseIf`, and `conditionOutput` (`branch` or `match`)
37
36
 
38
- const result = applyConversion(value, rules);
39
- if (result.errors.length) throw new Error(result.errors.join("; "));
37
+ Condition expressions support `path(...)`, `exists(...)`, comparison operators, and boolean operators (`&&`, `||`, `!`).
40
38
 
41
- const outputJson = formatPayload(result.output, rules.outputFormat!, true);
42
- ```
43
-
44
- Input:
45
-
46
- ```json
47
- { "user": { "fullName": "Ada Lovelace" } }
48
- ```
49
-
50
- Output:
51
-
52
- ```json
53
- { "profile": { "name": "Ada Lovelace" } }
54
- ```
55
-
56
- ## Load Rules From rules.json
57
-
58
- ```ts
59
- import fs from "node:fs";
60
- import {
61
- applyConversion,
62
- formatPayload,
63
- normalizeConversionRules,
64
- parsePayload
65
- } from "@apiconvert/core";
66
-
67
- const rulesText = fs.readFileSync("rules.json", "utf-8");
68
- const rules = normalizeConversionRules(rulesText);
69
-
70
- const input = fs.readFileSync("input.json", "utf-8");
71
- const { value, error } = parsePayload(input, rules.inputFormat!);
72
- if (error) throw new Error(error);
73
-
74
- const result = applyConversion(value, rules);
75
- if (result.errors.length) throw new Error(result.errors.join("; "));
76
-
77
- const outputJson = formatPayload(result.output, rules.outputFormat!, true);
78
- ```
79
-
80
- ## XML Attributes And Text
81
-
82
- XML attributes are addressed with `@_` and element text with `#text`.
39
+ ## Example
83
40
 
84
41
  ```ts
85
- const rules = normalizeConversionRules({
86
- version: 2,
87
- inputFormat: DataFormat.Xml,
88
- outputFormat: DataFormat.Json,
89
- fieldMappings: [
90
- { outputPath: "orderId", source: { type: "path", path: "order.@_id" } },
91
- { outputPath: "status", source: { type: "path", path: "order.status.#text" } }
92
- ]
93
- });
94
-
95
- const input = '<order id="A1"><status>new</status></order>';
96
- ```
97
-
98
- Input:
99
-
100
- ```xml
101
- <order id="A1">
102
- <status>new</status>
103
- </order>
104
- ```
105
-
106
- Output:
107
-
108
- ```json
109
- { "orderId": "A1", "status": "new" }
110
- ```
111
-
112
- ## Array Mapping
113
-
114
- Array mapping paths support root-prefixed JSONPath-style syntax:
115
- - `inputPath`: `orders` and `$.orders` are equivalent.
116
- - `outputPath`: `orders` and `$.orders` are equivalent.
117
-
118
- `$` resolves from the root input for reads, and `$.<path>` writes at the root output path.
119
-
120
- ```ts
121
- const rules = normalizeConversionRules({
122
- version: 2,
123
- inputFormat: DataFormat.Json,
124
- outputFormat: DataFormat.Json,
125
- arrayMappings: [
126
- {
127
- inputPath: "$.orders",
128
- outputPath: "$.ordersNormalized",
129
- itemMappings: [
130
- { outputPath: "id", source: { type: "path", path: "orderId" } },
131
- { outputPath: "currency", source: { type: "path", path: "$.defaults.currency" } }
132
- ]
133
- }
134
- ]
135
- });
136
- ```
137
-
138
- Input:
139
-
140
- ```json
141
- {
142
- "defaults": { "currency": "USD" },
143
- "orders": [
144
- { "orderId": "A1" },
145
- { "orderId": "A2" }
146
- ]
147
- }
148
- ```
149
-
150
- ## Split And Merge Field Rules
42
+ import { applyConversion, normalizeConversionRules } from "@apiconvert/core";
151
43
 
152
- Use `outputPaths` to split one source value into multiple output fields.
153
- Use `source.type = "merge"` with `paths` to combine multiple inputs into one output.
154
-
155
- ```ts
156
44
  const rules = normalizeConversionRules({
157
- version: 2,
158
- inputFormat: DataFormat.Json,
159
- outputFormat: DataFormat.Json,
160
- fieldMappings: [
45
+ inputFormat: "json",
46
+ outputFormat: "json",
47
+ rules: [
161
48
  {
162
- outputPaths: ["profile.name", "profile.displayName"],
163
- source: { type: "path", path: "user.name" }
49
+ kind: "field",
50
+ outputPaths: ["meta.name"],
51
+ source: { type: "path", path: "name" }
164
52
  },
165
53
  {
166
- outputPath: "profile.fullName",
167
- source: {
168
- type: "merge",
169
- paths: ["user.firstName", "user.lastName"],
170
- mergeMode: "concat",
171
- separator: " "
172
- }
54
+ kind: "branch",
55
+ expression: "path(status) == 'active'",
56
+ then: [
57
+ {
58
+ kind: "field",
59
+ outputPaths: ["meta.enabled"],
60
+ source: { type: "constant", value: "true" }
61
+ }
62
+ ],
63
+ else: [
64
+ {
65
+ kind: "field",
66
+ outputPaths: ["meta.enabled"],
67
+ source: { type: "constant", value: "false" }
68
+ }
69
+ ]
173
70
  }
174
71
  ]
175
72
  });
176
- ```
177
-
178
- Input:
179
-
180
- ```json
181
- {
182
- "user": {
183
- "name": "Ada Lovelace",
184
- "firstName": "Ada",
185
- "lastName": "Lovelace"
186
- }
187
- }
188
- ```
189
-
190
- Output:
191
73
 
192
- ```json
193
- {
194
- "profile": {
195
- "name": "Ada Lovelace",
196
- "displayName": "Ada Lovelace",
197
- "fullName": "Ada Lovelace"
198
- }
74
+ const result = applyConversion({ name: "Ada", status: "active" }, rules);
75
+ if (result.errors.length > 0) {
76
+ throw new Error(result.errors.join("; "));
199
77
  }
200
- ```
201
-
202
- ## Transforms And Conditions
203
-
204
- ```ts
205
- const rules = normalizeConversionRules({
206
- version: 2,
207
- inputFormat: DataFormat.Json,
208
- outputFormat: DataFormat.Json,
209
- fieldMappings: [
210
- {
211
- outputPath: "profile.country",
212
- source: { type: "transform", transform: "toUpperCase", path: "user.country" }
213
- },
214
- {
215
- outputPath: "profile.isAdult",
216
- source: {
217
- type: "condition",
218
- condition: { path: "user.age", operator: "gt", value: "18" },
219
- trueValue: "true",
220
- falseValue: "false"
221
- }
222
- }
223
- ]
224
- });
225
- ```
226
-
227
- For splitting a full name into parts, use `transform: "split"`, `separator`, and `tokenIndex`.
228
- `tokenIndex` supports negative values (`-1` = last token):
229
- `trimAfterSplit` defaults to `true` and can be set to `false` to preserve token whitespace.
230
- `separator: ""` is invalid for split transforms.
231
-
232
- ```ts
233
- const rules = normalizeConversionRules({
234
- version: 2,
235
- inputFormat: DataFormat.Json,
236
- outputFormat: DataFormat.Json,
237
- fieldMappings: [
238
- {
239
- outputPath: "firstName",
240
- source: {
241
- type: "transform",
242
- transform: "split",
243
- path: "name",
244
- separator: " ",
245
- tokenIndex: 0
246
- }
247
- },
248
- {
249
- outputPath: "lastName",
250
- source: {
251
- type: "transform",
252
- transform: "split",
253
- path: "name",
254
- separator: " ",
255
- tokenIndex: -1
256
- }
257
- }
258
- ]
259
- });
260
- ```
261
-
262
- Input:
263
-
264
- ```json
265
- { "name": "Jonas Strand Aasberg" }
266
- ```
267
-
268
- Output:
269
-
270
- ```json
271
- { "firstName": "Jonas", "lastName": "Aasberg" }
272
- ```
273
-
274
- Comma-separated names are supported as well. With default trim (`trimAfterSplit` omitted or `true`):
275
-
276
- ```json
277
- { "name": "Jonas, Aasberg" }
278
- ```
279
-
280
- maps to:
281
-
282
- ```json
283
- { "firstName": "Jonas", "lastName": "Aasberg" }
284
- ```
285
-
286
- With `trimAfterSplit: false`, whitespace is preserved:
287
78
 
288
- ```json
289
- { "firstName": "Jonas", "lastName": " Aasberg" }
79
+ console.log(result.output);
290
80
  ```
291
81
 
292
- ## Formatting
82
+ ## Parse and Format Helpers
293
83
 
294
- Use `formatPayload(value, DataFormat.Xml, true)` for indented XML and `false` for compact output. The same `pretty` flag controls JSON formatting.
84
+ The package also exports:
85
+ - `parsePayload(text, format)` for `json`, `xml`, and `query`
86
+ - `formatPayload(value, format, pretty)`
@@ -0,0 +1,4 @@
1
+ import { type ConditionExpressionNode, type ResolvePath } from "./condition-expression-types";
2
+ export declare function evaluateConditionExpression(node: ConditionExpressionNode, resolvePath: ResolvePath): unknown;
3
+ export declare function toBoolean(value: unknown): boolean;
4
+ //# sourceMappingURL=condition-expression-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-expression-evaluator.d.ts","sourceRoot":"","sources":["../src/condition-expression-evaluator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE9F,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAiB5G;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKjD"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateConditionExpression = evaluateConditionExpression;
4
+ exports.toBoolean = toBoolean;
5
+ const core_utils_1 = require("./core-utils");
6
+ function evaluateConditionExpression(node, resolvePath) {
7
+ switch (node.kind) {
8
+ case "literal":
9
+ return node.value;
10
+ case "path":
11
+ return resolvePath(node.path);
12
+ case "array":
13
+ return node.items.map((entry) => evaluateConditionExpression(entry, resolvePath));
14
+ case "exists":
15
+ return evaluateConditionExpression(node.argument, resolvePath) != null;
16
+ case "unary":
17
+ return !toBoolean(evaluateConditionExpression(node.operand, resolvePath));
18
+ case "binary":
19
+ return evaluateConditionBinary(node, resolvePath);
20
+ default:
21
+ throw new Error("Unsupported condition expression node.");
22
+ }
23
+ }
24
+ function toBoolean(value) {
25
+ if (value == null)
26
+ return false;
27
+ if (typeof value === "boolean")
28
+ return value;
29
+ if (typeof value === "string")
30
+ return value.length > 0;
31
+ return true;
32
+ }
33
+ function evaluateConditionBinary(node, resolvePath) {
34
+ if (node.operator === "&&") {
35
+ return (toBoolean(evaluateConditionExpression(node.left, resolvePath)) &&
36
+ toBoolean(evaluateConditionExpression(node.right, resolvePath)));
37
+ }
38
+ if (node.operator === "||") {
39
+ return (toBoolean(evaluateConditionExpression(node.left, resolvePath)) ||
40
+ toBoolean(evaluateConditionExpression(node.right, resolvePath)));
41
+ }
42
+ const left = evaluateConditionExpression(node.left, resolvePath);
43
+ const right = evaluateConditionExpression(node.right, resolvePath);
44
+ switch (node.operator) {
45
+ case "==":
46
+ return Object.is(left, right);
47
+ case "!=":
48
+ return !Object.is(left, right);
49
+ case ">":
50
+ return (0, core_utils_1.toNumber)(left) > (0, core_utils_1.toNumber)(right);
51
+ case ">=":
52
+ return (0, core_utils_1.toNumber)(left) >= (0, core_utils_1.toNumber)(right);
53
+ case "<":
54
+ return (0, core_utils_1.toNumber)(left) < (0, core_utils_1.toNumber)(right);
55
+ case "<=":
56
+ return (0, core_utils_1.toNumber)(left) <= (0, core_utils_1.toNumber)(right);
57
+ case "in":
58
+ return Array.isArray(right) ? right.some((entry) => Object.is(left, entry)) : false;
59
+ default:
60
+ throw new Error(`Unsupported condition operator '${node.operator}'.`);
61
+ }
62
+ }
63
+ //# sourceMappingURL=condition-expression-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-expression-evaluator.js","sourceRoot":"","sources":["../src/condition-expression-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ConditionExpressionNode } from "./condition-expression-types";
2
+ export declare class ConditionExpressionParser {
3
+ private readonly expression;
4
+ private readonly tokens;
5
+ private index;
6
+ constructor(expression: string);
7
+ parse(): ConditionExpressionNode;
8
+ private parseOr;
9
+ private parseAnd;
10
+ private parseComparison;
11
+ private parseComparisonOperator;
12
+ private matchNotEqAlias;
13
+ private parseUnary;
14
+ private parsePrimary;
15
+ private parsePathCall;
16
+ private parseExistsCall;
17
+ private get current();
18
+ private peek;
19
+ private match;
20
+ private expect;
21
+ private matchOperator;
22
+ private matchIdentifier;
23
+ private peekIdentifier;
24
+ private error;
25
+ }
26
+ //# sourceMappingURL=condition-expression-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-expression-parser.d.ts","sourceRoot":"","sources":["../src/condition-expression-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uBAAuB,EAG7B,MAAM,8BAA8B,CAAC;AAGtC,qBAAa,yBAAyB;IAIxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAHvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,KAAK,CAAK;gBAEW,UAAU,EAAE,MAAM;IAI/C,KAAK,IAAI,uBAAuB;IAMhC,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,uBAAuB;IAyB/B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAmDpB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,eAAe;IAOvB,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConditionExpressionParser = void 0;
4
+ const condition_expression_tokenizer_1 = require("./condition-expression-tokenizer");
5
+ class ConditionExpressionParser {
6
+ constructor(expression) {
7
+ this.expression = expression;
8
+ this.index = 0;
9
+ this.tokens = (0, condition_expression_tokenizer_1.tokenizeConditionExpression)(expression);
10
+ }
11
+ parse() {
12
+ const node = this.parseOr();
13
+ this.expect("end");
14
+ return node;
15
+ }
16
+ parseOr() {
17
+ let left = this.parseAnd();
18
+ while (this.matchOperator("||") || this.matchIdentifier("or")) {
19
+ left = { kind: "binary", operator: "||", left, right: this.parseAnd() };
20
+ }
21
+ return left;
22
+ }
23
+ parseAnd() {
24
+ let left = this.parseComparison();
25
+ while (this.matchOperator("&&") || this.matchIdentifier("and")) {
26
+ left = { kind: "binary", operator: "&&", left, right: this.parseComparison() };
27
+ }
28
+ return left;
29
+ }
30
+ parseComparison() {
31
+ let left = this.parseUnary();
32
+ while (true) {
33
+ const operator = this.parseComparisonOperator();
34
+ if (!operator) {
35
+ return left;
36
+ }
37
+ const right = this.parseUnary();
38
+ if (operator === "in" && right.kind !== "array") {
39
+ throw this.error("Right-hand side of 'in' must be an array literal.");
40
+ }
41
+ left = { kind: "binary", operator, left, right };
42
+ }
43
+ }
44
+ parseComparisonOperator() {
45
+ if (this.matchOperator("=="))
46
+ return "==";
47
+ if (this.matchOperator("!="))
48
+ return "!=";
49
+ if (this.matchOperator(">="))
50
+ return ">=";
51
+ if (this.matchOperator("<="))
52
+ return "<=";
53
+ if (this.matchOperator(">"))
54
+ return ">";
55
+ if (this.matchOperator("<"))
56
+ return "<";
57
+ if (this.matchIdentifier("eq"))
58
+ return "==";
59
+ if (this.matchNotEqAlias())
60
+ return "!=";
61
+ if (this.matchIdentifier("gt"))
62
+ return ">";
63
+ if (this.matchIdentifier("gte"))
64
+ return ">=";
65
+ if (this.matchIdentifier("lt"))
66
+ return "<";
67
+ if (this.matchIdentifier("lte"))
68
+ return "<=";
69
+ if (this.matchIdentifier("in"))
70
+ return "in";
71
+ return null;
72
+ }
73
+ matchNotEqAlias() {
74
+ if (!this.peekIdentifier("not"))
75
+ return false;
76
+ const next = this.peek(1);
77
+ if (next.type !== "identifier" || next.text.toLowerCase() !== "eq") {
78
+ return false;
79
+ }
80
+ this.index += 2;
81
+ return true;
82
+ }
83
+ parseUnary() {
84
+ if (this.matchOperator("!") || this.matchIdentifier("not")) {
85
+ return { kind: "unary", operand: this.parseUnary() };
86
+ }
87
+ return this.parsePrimary();
88
+ }
89
+ parsePrimary() {
90
+ if (this.match("leftParen")) {
91
+ const node = this.parseOr();
92
+ this.expect("rightParen");
93
+ return node;
94
+ }
95
+ if (this.match("leftBracket")) {
96
+ const items = [];
97
+ if (!this.match("rightBracket")) {
98
+ do {
99
+ items.push(this.parseOr());
100
+ } while (this.match("comma"));
101
+ this.expect("rightBracket");
102
+ }
103
+ return { kind: "array", items };
104
+ }
105
+ if (this.current.type === "number") {
106
+ const text = this.current.text;
107
+ this.index += 1;
108
+ const number = Number.parseFloat(text);
109
+ if (Number.isNaN(number) || !isFinite(number)) {
110
+ throw this.error(`Invalid number literal '${text}'.`);
111
+ }
112
+ return { kind: "literal", value: number };
113
+ }
114
+ if (this.current.type === "string") {
115
+ const text = this.current.text;
116
+ this.index += 1;
117
+ return { kind: "literal", value: text };
118
+ }
119
+ if (this.current.type === "identifier") {
120
+ const identifier = this.current.text;
121
+ this.index += 1;
122
+ const lowered = identifier.toLowerCase();
123
+ if (lowered === "true")
124
+ return { kind: "literal", value: true };
125
+ if (lowered === "false")
126
+ return { kind: "literal", value: false };
127
+ if (lowered === "null")
128
+ return { kind: "literal", value: null };
129
+ if (lowered === "path")
130
+ return this.parsePathCall();
131
+ if (lowered === "exists")
132
+ return this.parseExistsCall();
133
+ throw this.error(`Unexpected identifier '${identifier}'. Use path(...) for value references.`);
134
+ }
135
+ throw this.error(`Unexpected token '${this.current.text}'.`);
136
+ }
137
+ parsePathCall() {
138
+ this.expect("leftParen");
139
+ if (this.current.type !== "identifier" && this.current.type !== "string") {
140
+ throw this.error("path(...) requires a path reference.");
141
+ }
142
+ const path = this.current.text;
143
+ this.index += 1;
144
+ this.expect("rightParen");
145
+ return { kind: "path", path };
146
+ }
147
+ parseExistsCall() {
148
+ this.expect("leftParen");
149
+ const argument = this.parseOr();
150
+ this.expect("rightParen");
151
+ return { kind: "exists", argument };
152
+ }
153
+ get current() {
154
+ return this.peek(0);
155
+ }
156
+ peek(offset) {
157
+ const cursor = this.index + offset;
158
+ return cursor >= this.tokens.length ? this.tokens[this.tokens.length - 1] : this.tokens[cursor];
159
+ }
160
+ match(type) {
161
+ if (this.current.type !== type)
162
+ return false;
163
+ this.index += 1;
164
+ return true;
165
+ }
166
+ expect(type) {
167
+ if (!this.match(type)) {
168
+ throw this.error(`Expected ${type} but found '${this.current.text}'.`);
169
+ }
170
+ }
171
+ matchOperator(operator) {
172
+ if (this.current.type !== "operator" || this.current.text !== operator)
173
+ return false;
174
+ this.index += 1;
175
+ return true;
176
+ }
177
+ matchIdentifier(identifier) {
178
+ if (!this.peekIdentifier(identifier))
179
+ return false;
180
+ this.index += 1;
181
+ return true;
182
+ }
183
+ peekIdentifier(identifier) {
184
+ return (this.current.type === "identifier" && this.current.text.toLowerCase() === identifier.toLowerCase());
185
+ }
186
+ error(message) {
187
+ return new Error(`${message} (position ${this.current.position}).`);
188
+ }
189
+ }
190
+ exports.ConditionExpressionParser = ConditionExpressionParser;
191
+ //# sourceMappingURL=condition-expression-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-expression-parser.js","sourceRoot":"","sources":["../src/condition-expression-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type ConditionToken } from "./condition-expression-types";
2
+ export declare function tokenizeConditionExpression(expression: string): ConditionToken[];
3
+ //# sourceMappingURL=condition-expression-tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"condition-expression-tokenizer.d.ts","sourceRoot":"","sources":["../src/condition-expression-tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAsFhF"}