@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.
- package/README.md +60 -268
- package/dist/condition-expression-evaluator.d.ts +4 -0
- package/dist/condition-expression-evaluator.d.ts.map +1 -0
- package/dist/condition-expression-evaluator.js +63 -0
- package/dist/condition-expression-evaluator.js.map +1 -0
- package/dist/condition-expression-parser.d.ts +26 -0
- package/dist/condition-expression-parser.d.ts.map +1 -0
- package/dist/condition-expression-parser.js +191 -0
- package/dist/condition-expression-parser.js.map +1 -0
- package/dist/condition-expression-tokenizer.d.ts +3 -0
- package/dist/condition-expression-tokenizer.d.ts.map +1 -0
- package/dist/condition-expression-tokenizer.js +103 -0
- package/dist/condition-expression-tokenizer.js.map +1 -0
- package/dist/condition-expression-types.d.ts +29 -0
- package/dist/condition-expression-types.d.ts.map +1 -0
- package/dist/condition-expression-types.js +3 -0
- package/dist/condition-expression-types.js.map +1 -0
- package/dist/condition-expression.d.ts +9 -0
- package/dist/condition-expression.d.ts.map +1 -0
- package/dist/condition-expression.js +16 -0
- package/dist/condition-expression.js.map +1 -0
- package/dist/core-utils.d.ts +11 -0
- package/dist/core-utils.d.ts.map +1 -0
- package/dist/core-utils.js +126 -0
- package/dist/core-utils.js.map +1 -0
- package/dist/index.d.ts +5 -99
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -729
- package/dist/index.js.map +1 -1
- package/dist/mapping-engine.d.ts +3 -0
- package/dist/mapping-engine.d.ts.map +1 -0
- package/dist/mapping-engine.js +18 -0
- package/dist/mapping-engine.js.map +1 -0
- package/dist/payload-converter.d.ts +7 -0
- package/dist/payload-converter.d.ts.map +1 -0
- package/dist/payload-converter.js +37 -0
- package/dist/payload-converter.js.map +1 -0
- package/dist/query-payload.d.ts +3 -0
- package/dist/query-payload.d.ts.map +1 -0
- package/dist/query-payload.js +183 -0
- package/dist/query-payload.js.map +1 -0
- package/dist/rule-executor.d.ts +3 -0
- package/dist/rule-executor.d.ts.map +1 -0
- package/dist/rule-executor.js +108 -0
- package/dist/rule-executor.js.map +1 -0
- package/dist/rules-normalizer.d.ts +3 -0
- package/dist/rules-normalizer.d.ts.map +1 -0
- package/dist/rules-normalizer.js +158 -0
- package/dist/rules-normalizer.js.map +1 -0
- package/dist/source-resolver.d.ts +4 -0
- package/dist/source-resolver.d.ts.map +1 -0
- package/dist/source-resolver.js +155 -0
- package/dist/source-resolver.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/dist/xml-payload.d.ts +3 -0
- package/dist/xml-payload.d.ts.map +1 -0
- package/dist/xml-payload.js +61 -0
- package/dist/xml-payload.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,294 +1,86 @@
|
|
|
1
1
|
# @apiconvert/core
|
|
2
2
|
|
|
3
|
-
TypeScript
|
|
3
|
+
Shared TypeScript conversion runtime for Apiconvert.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Rules Model
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
12
|
+
Supported field source types:
|
|
13
|
+
- `path`
|
|
14
|
+
- `constant`
|
|
15
|
+
- `transform`
|
|
16
|
+
- `merge`
|
|
17
|
+
- `condition`
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
} from "@apiconvert/core";
|
|
19
|
+
Supported transforms:
|
|
20
|
+
- `toLowerCase`
|
|
21
|
+
- `toUpperCase`
|
|
22
|
+
- `number`
|
|
23
|
+
- `boolean`
|
|
24
|
+
- `concat`
|
|
25
|
+
- `split`
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
fieldMappings: [
|
|
45
|
+
inputFormat: "json",
|
|
46
|
+
outputFormat: "json",
|
|
47
|
+
rules: [
|
|
161
48
|
{
|
|
162
|
-
|
|
163
|
-
|
|
49
|
+
kind: "field",
|
|
50
|
+
outputPaths: ["meta.name"],
|
|
51
|
+
source: { type: "path", path: "name" }
|
|
164
52
|
},
|
|
165
53
|
{
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
193
|
-
{
|
|
194
|
-
"
|
|
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
|
-
|
|
289
|
-
{ "firstName": "Jonas", "lastName": " Aasberg" }
|
|
79
|
+
console.log(result.output);
|
|
290
80
|
```
|
|
291
81
|
|
|
292
|
-
##
|
|
82
|
+
## Parse and Format Helpers
|
|
293
83
|
|
|
294
|
-
|
|
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 @@
|
|
|
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"}
|