@swaggerexpert/arazzo-runtime-expression 1.0.0 → 2.0.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/README.md +164 -80
- package/SECURITY.md +2 -1
- package/cjs/apg-lite.cjs +28 -28
- package/cjs/errors/ArazzoRuntimeExpressionError.cjs +44 -0
- package/cjs/errors/ArazzoRuntimeExpressionParseError.cjs +8 -0
- package/cjs/extract.cjs +35 -9
- package/cjs/{runtime-expression.cjs → grammar.cjs} +773 -227
- package/cjs/index.cjs +17 -5
- package/cjs/parse/callbacks/cst.cjs +28 -0
- package/cjs/parse/index.cjs +31 -32
- package/cjs/parse/trace/Expectations.cjs +10 -0
- package/cjs/parse/trace/Trace.cjs +35 -0
- package/cjs/parse/translators/ASTTranslator/index.cjs +15 -0
- package/cjs/parse/translators/ASTTranslator/transformers.cjs +225 -0
- package/cjs/parse/translators/CSTTranslator.cjs +55 -0
- package/cjs/parse/translators/XMLTranslator.cjs +12 -0
- package/cjs/test/index.cjs +18 -0
- package/es/errors/ArazzoRuntimeExpressionError.mjs +40 -0
- package/es/errors/ArazzoRuntimeExpressionParseError.mjs +3 -0
- package/es/extract.mjs +34 -9
- package/es/{runtime-expression.mjs → grammar.mjs} +773 -227
- package/es/index.mjs +9 -3
- package/es/parse/callbacks/cst.mjs +24 -0
- package/es/parse/index.mjs +31 -32
- package/es/parse/trace/Expectations.mjs +6 -0
- package/es/parse/trace/Trace.mjs +30 -0
- package/es/parse/translators/ASTTranslator/index.mjs +9 -0
- package/es/parse/translators/ASTTranslator/transformers.mjs +219 -0
- package/es/parse/translators/CSTTranslator.mjs +50 -0
- package/es/parse/translators/XMLTranslator.mjs +7 -0
- package/es/test/index.mjs +13 -0
- package/package.json +21 -14
- package/types/index.d.ts +330 -31
- package/cjs/parse/callbacks/body-reference.cjs +0 -14
- package/cjs/parse/callbacks/expression.cjs +0 -15
- package/cjs/parse/callbacks/header-reference.cjs +0 -14
- package/cjs/parse/callbacks/json-pointer.cjs +0 -14
- package/cjs/parse/callbacks/name.cjs +0 -14
- package/cjs/parse/callbacks/parameter-name.cjs +0 -14
- package/cjs/parse/callbacks/path-reference.cjs +0 -14
- package/cjs/parse/callbacks/query-reference.cjs +0 -14
- package/cjs/parse/callbacks/reference-token.cjs +0 -14
- package/cjs/parse/callbacks/source.cjs +0 -14
- package/cjs/parse/callbacks/token.cjs +0 -15
- package/cjs/test.cjs +0 -15
- package/es/parse/callbacks/body-reference.mjs +0 -10
- package/es/parse/callbacks/expression.mjs +0 -11
- package/es/parse/callbacks/header-reference.mjs +0 -10
- package/es/parse/callbacks/json-pointer.mjs +0 -10
- package/es/parse/callbacks/name.mjs +0 -10
- package/es/parse/callbacks/parameter-name.mjs +0 -10
- package/es/parse/callbacks/path-reference.mjs +0 -10
- package/es/parse/callbacks/query-reference.mjs +0 -10
- package/es/parse/callbacks/reference-token.mjs +0 -10
- package/es/parse/callbacks/source.mjs +0 -10
- package/es/parse/callbacks/token.mjs +0 -10
- package/es/test.mjs +0 -10
package/es/index.mjs
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
export { default as Grammar } from "./
|
|
1
|
+
export { default as Grammar } from "./grammar.mjs";
|
|
2
2
|
export { default as extract } from "./extract.mjs";
|
|
3
|
-
export { default as
|
|
4
|
-
export { default as
|
|
3
|
+
export { default as parse } from "./parse/index.mjs";
|
|
4
|
+
export { default as CSTTranslator } from "./parse/translators/CSTTranslator.mjs";
|
|
5
|
+
export { default as XMLTranslator } from "./parse/translators/XMLTranslator.mjs";
|
|
6
|
+
export { default as ASTTranslator } from "./parse/translators/ASTTranslator/index.mjs";
|
|
7
|
+
export { default as Trace } from "./parse/trace/Trace.mjs";
|
|
8
|
+
export { default as test } from "./test/index.mjs";
|
|
9
|
+
export { default as ArazzoRuntimeExpressionError } from "./errors/ArazzoRuntimeExpressionError.mjs";
|
|
10
|
+
export { default as ArazzoRuntimeExpressionParseError } from "./errors/ArazzoRuntimeExpressionParseError.mjs";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { utilities, identifiers } from 'apg-lite';
|
|
2
|
+
const cst = nodeType => {
|
|
3
|
+
return (state, chars, phraseIndex, phraseLength, data) => {
|
|
4
|
+
if (state === identifiers.SEM_PRE) {
|
|
5
|
+
const node = {
|
|
6
|
+
type: nodeType,
|
|
7
|
+
text: utilities.charsToString(chars, phraseIndex, phraseLength),
|
|
8
|
+
start: phraseIndex,
|
|
9
|
+
length: phraseLength,
|
|
10
|
+
children: []
|
|
11
|
+
};
|
|
12
|
+
if (data.stack.length > 0) {
|
|
13
|
+
data.stack[data.stack.length - 1].children.push(node);
|
|
14
|
+
} else {
|
|
15
|
+
data.root = node;
|
|
16
|
+
}
|
|
17
|
+
data.stack.push(node);
|
|
18
|
+
}
|
|
19
|
+
if (state === identifiers.SEM_POST) {
|
|
20
|
+
data.stack.pop();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export default cst;
|
package/es/parse/index.mjs
CHANGED
|
@@ -1,35 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import Grammar from "../
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import headerReferenceCallback from "./callbacks/header-reference.mjs";
|
|
7
|
-
import queryReferenceCallback from "./callbacks/query-reference.mjs";
|
|
8
|
-
import pathReferenceCallback from "./callbacks/path-reference.mjs";
|
|
9
|
-
import bodyReferenceCallback from "./callbacks/body-reference.mjs";
|
|
10
|
-
import jsonPointerCallback from "./callbacks/json-pointer.mjs";
|
|
11
|
-
import referenceTokenCallback from "./callbacks/reference-token.mjs";
|
|
12
|
-
import nameCallback from "./callbacks/name.mjs";
|
|
13
|
-
import tokenCallback from "./callbacks/token.mjs";
|
|
1
|
+
import { Parser, Stats } from 'apg-lite';
|
|
2
|
+
import Grammar from "../grammar.mjs";
|
|
3
|
+
import ASTTranslator from "./translators/ASTTranslator/index.mjs";
|
|
4
|
+
import Trace from "./trace/Trace.mjs";
|
|
5
|
+
import ArazzoRuntimeExpressionParseError from "../errors/ArazzoRuntimeExpressionParseError.mjs";
|
|
14
6
|
const grammar = new Grammar();
|
|
15
|
-
const parse = runtimeExpression
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
7
|
+
const parse = (runtimeExpression, {
|
|
8
|
+
stats = false,
|
|
9
|
+
trace = false,
|
|
10
|
+
translator = new ASTTranslator()
|
|
11
|
+
} = {}) => {
|
|
12
|
+
if (typeof runtimeExpression !== 'string') {
|
|
13
|
+
throw new TypeError('Runtime expression must be a string');
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const parser = new Parser();
|
|
17
|
+
if (translator) parser.ast = translator;
|
|
18
|
+
if (stats) parser.stats = new Stats();
|
|
19
|
+
if (trace) parser.trace = new Trace();
|
|
20
|
+
const result = parser.parse(grammar, 'expression', runtimeExpression);
|
|
21
|
+
return {
|
|
22
|
+
result,
|
|
23
|
+
tree: result.success && translator ? parser.ast.getTree() : undefined,
|
|
24
|
+
stats: parser.stats,
|
|
25
|
+
trace: parser.trace
|
|
26
|
+
};
|
|
27
|
+
} catch (error) {
|
|
28
|
+
throw new ArazzoRuntimeExpressionParseError('Unexpected error during Arazzo Runtime Expression parsing', {
|
|
29
|
+
cause: error,
|
|
30
|
+
runtimeExpression
|
|
31
|
+
});
|
|
32
|
+
}
|
|
34
33
|
};
|
|
35
34
|
export default parse;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Trace as BaseTrace } from 'apg-lite';
|
|
2
|
+
import Expectations from "./Expectations.mjs";
|
|
3
|
+
class Trace extends BaseTrace {
|
|
4
|
+
inferExpectations() {
|
|
5
|
+
const lines = this.displayTrace().split('\n');
|
|
6
|
+
const expectations = new Set();
|
|
7
|
+
let lastMatchedIndex = -1;
|
|
8
|
+
for (let i = 0; i < lines.length; i++) {
|
|
9
|
+
const line = lines[i];
|
|
10
|
+
|
|
11
|
+
// capture the max match line (first one that ends in a single character match)
|
|
12
|
+
if (line.includes('M|')) {
|
|
13
|
+
const textMatch = line.match(/]'(.*)'$/);
|
|
14
|
+
if (textMatch && textMatch[1]) {
|
|
15
|
+
lastMatchedIndex = i;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// collect terminal failures after the deepest successful match
|
|
20
|
+
if (i > lastMatchedIndex) {
|
|
21
|
+
const terminalFailMatch = line.match(/N\|\[TLS\(([^)]+)\)]/);
|
|
22
|
+
if (terminalFailMatch) {
|
|
23
|
+
expectations.add(terminalFailMatch[1]);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return new Expectations(...expectations);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export default Trace;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import CSTTranslator from "../CSTTranslator.mjs";
|
|
2
|
+
import transformers, { transformCSTtoAST } from "./transformers.mjs";
|
|
3
|
+
class ASTTranslator extends CSTTranslator {
|
|
4
|
+
getTree() {
|
|
5
|
+
const cst = super.getTree();
|
|
6
|
+
return transformCSTtoAST(cst, transformers);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export default ASTTranslator;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { Parser } from 'apg-lite';
|
|
2
|
+
import Grammar from "../../../grammar.mjs";
|
|
3
|
+
import CSTTranslator from "../CSTTranslator.mjs";
|
|
4
|
+
const grammar = new Grammar();
|
|
5
|
+
const parseStepsName = stepsName => {
|
|
6
|
+
const parser = new Parser();
|
|
7
|
+
parser.ast = new CSTTranslator();
|
|
8
|
+
const result = parser.parse(grammar, 'steps-name', stepsName);
|
|
9
|
+
if (!result.success) {
|
|
10
|
+
throw new Error(`Invalid steps expression name: ${stepsName}`);
|
|
11
|
+
}
|
|
12
|
+
return parser.ast.getTree();
|
|
13
|
+
};
|
|
14
|
+
const parseWorkflowsName = workflowsName => {
|
|
15
|
+
const parser = new Parser();
|
|
16
|
+
parser.ast = new CSTTranslator();
|
|
17
|
+
const result = parser.parse(grammar, 'workflows-name', workflowsName);
|
|
18
|
+
if (!result.success) {
|
|
19
|
+
throw new Error(`Invalid workflows expression name: ${workflowsName}`);
|
|
20
|
+
}
|
|
21
|
+
return parser.ast.getTree();
|
|
22
|
+
};
|
|
23
|
+
const parseSourceDescriptionsName = sourceDescriptionsName => {
|
|
24
|
+
const parser = new Parser();
|
|
25
|
+
parser.ast = new CSTTranslator();
|
|
26
|
+
const result = parser.parse(grammar, 'source-descriptions-name', sourceDescriptionsName);
|
|
27
|
+
if (!result.success) {
|
|
28
|
+
throw new Error(`Invalid source descriptions expression name: ${sourceDescriptionsName}`);
|
|
29
|
+
}
|
|
30
|
+
return parser.ast.getTree();
|
|
31
|
+
};
|
|
32
|
+
const parseComponentsName = componentsName => {
|
|
33
|
+
const parser = new Parser();
|
|
34
|
+
parser.ast = new CSTTranslator();
|
|
35
|
+
const result = parser.parse(grammar, 'components-name', componentsName);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
throw new Error(`Invalid components expression name: ${componentsName}`);
|
|
38
|
+
}
|
|
39
|
+
return parser.ast.getTree();
|
|
40
|
+
};
|
|
41
|
+
export const transformCSTtoAST = (node, transformerMap) => {
|
|
42
|
+
const transformer = transformerMap[node.type];
|
|
43
|
+
if (!transformer) {
|
|
44
|
+
throw new Error(`No transformer for CST node type: ${node.type}`);
|
|
45
|
+
}
|
|
46
|
+
return transformer(node);
|
|
47
|
+
};
|
|
48
|
+
const transformers = {
|
|
49
|
+
['expression'](node) {
|
|
50
|
+
const text = node.text;
|
|
51
|
+
|
|
52
|
+
// Literal expressions
|
|
53
|
+
if (text === '$url') return {
|
|
54
|
+
type: 'UrlExpression'
|
|
55
|
+
};
|
|
56
|
+
if (text === '$method') return {
|
|
57
|
+
type: 'MethodExpression'
|
|
58
|
+
};
|
|
59
|
+
if (text === '$statusCode') return {
|
|
60
|
+
type: 'StatusCodeExpression'
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Source expressions (request/response)
|
|
64
|
+
if (text.startsWith('$request.')) {
|
|
65
|
+
const sourceNode = node.children.find(c => c.type === 'source');
|
|
66
|
+
return {
|
|
67
|
+
type: 'RequestExpression',
|
|
68
|
+
source: transformCSTtoAST(sourceNode, transformers)
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (text.startsWith('$response.')) {
|
|
72
|
+
const sourceNode = node.children.find(c => c.type === 'source');
|
|
73
|
+
return {
|
|
74
|
+
type: 'ResponseExpression',
|
|
75
|
+
source: transformCSTtoAST(sourceNode, transformers)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Named expressions (raw name)
|
|
80
|
+
const nameNode = node.children.find(c => c.type === 'name');
|
|
81
|
+
if (text.startsWith('$inputs.')) {
|
|
82
|
+
return {
|
|
83
|
+
type: 'InputsExpression',
|
|
84
|
+
name: nameNode.text
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (text.startsWith('$outputs.')) {
|
|
88
|
+
return {
|
|
89
|
+
type: 'OutputsExpression',
|
|
90
|
+
name: nameNode.text
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (text.startsWith('$steps.')) {
|
|
94
|
+
const stepsNameCST = parseStepsName(nameNode.text);
|
|
95
|
+
return transformCSTtoAST(stepsNameCST, transformers);
|
|
96
|
+
}
|
|
97
|
+
if (text.startsWith('$workflows.')) {
|
|
98
|
+
const workflowsNameCST = parseWorkflowsName(nameNode.text);
|
|
99
|
+
return transformCSTtoAST(workflowsNameCST, transformers);
|
|
100
|
+
}
|
|
101
|
+
if (text.startsWith('$sourceDescriptions.')) {
|
|
102
|
+
const sourceDescriptionsNameCST = parseSourceDescriptionsName(nameNode.text);
|
|
103
|
+
return transformCSTtoAST(sourceDescriptionsNameCST, transformers);
|
|
104
|
+
}
|
|
105
|
+
if (text.startsWith('$components.')) {
|
|
106
|
+
const componentsNameCST = parseComponentsName(nameNode.text);
|
|
107
|
+
return transformCSTtoAST(componentsNameCST, transformers);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
['source'](node) {
|
|
111
|
+
const child = node.children[0];
|
|
112
|
+
return {
|
|
113
|
+
type: 'Source',
|
|
114
|
+
reference: transformCSTtoAST(child, transformers)
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
['header-reference'](node) {
|
|
118
|
+
const tokenNode = node.children.find(c => c.type === 'token');
|
|
119
|
+
return {
|
|
120
|
+
type: 'HeaderReference',
|
|
121
|
+
token: tokenNode.text.toLowerCase()
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
['query-reference'](node) {
|
|
125
|
+
const nameNode = node.children.find(c => c.type === 'name');
|
|
126
|
+
return {
|
|
127
|
+
type: 'QueryReference',
|
|
128
|
+
name: nameNode.text
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
['path-reference'](node) {
|
|
132
|
+
const nameNode = node.children.find(c => c.type === 'name');
|
|
133
|
+
return {
|
|
134
|
+
type: 'PathReference',
|
|
135
|
+
name: nameNode.text
|
|
136
|
+
};
|
|
137
|
+
},
|
|
138
|
+
['body-reference'](node) {
|
|
139
|
+
const jsonPointerNode = node.children.find(c => c.type === 'json-pointer');
|
|
140
|
+
if (!jsonPointerNode) {
|
|
141
|
+
return {
|
|
142
|
+
type: 'BodyReference'
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
type: 'BodyReference',
|
|
147
|
+
jsonPointer: transformCSTtoAST(jsonPointerNode, transformers)
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
['json-pointer'](node) {
|
|
151
|
+
const referenceTokens = node.children.filter(c => c.type === 'reference-token').map(c => transformCSTtoAST(c, transformers));
|
|
152
|
+
return {
|
|
153
|
+
type: 'JsonPointer',
|
|
154
|
+
value: node.text,
|
|
155
|
+
referenceTokens
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
['reference-token'](node) {
|
|
159
|
+
return {
|
|
160
|
+
type: 'ReferenceToken',
|
|
161
|
+
value: node.text
|
|
162
|
+
};
|
|
163
|
+
},
|
|
164
|
+
// steps-name secondary grammar transformers
|
|
165
|
+
['steps-name'](node) {
|
|
166
|
+
const stepIdNode = node.children.find(c => c.type === 'steps-id');
|
|
167
|
+
const fieldNode = node.children.find(c => c.type === 'steps-field');
|
|
168
|
+
const subFieldNode = node.children.find(c => c.type === 'steps-sub-field');
|
|
169
|
+
const jsonPointerNode = node.children.find(c => c.type === 'json-pointer');
|
|
170
|
+
const result = {
|
|
171
|
+
type: 'StepsExpression',
|
|
172
|
+
stepId: stepIdNode.text,
|
|
173
|
+
field: fieldNode.text,
|
|
174
|
+
outputName: subFieldNode.text
|
|
175
|
+
};
|
|
176
|
+
if (jsonPointerNode) {
|
|
177
|
+
result.jsonPointer = transformCSTtoAST(jsonPointerNode, transformers);
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
},
|
|
181
|
+
// workflows-name secondary grammar transformers
|
|
182
|
+
['workflows-name'](node) {
|
|
183
|
+
const workflowIdNode = node.children.find(c => c.type === 'workflows-id');
|
|
184
|
+
const fieldNode = node.children.find(c => c.type === 'workflows-field');
|
|
185
|
+
const subFieldNode = node.children.find(c => c.type === 'workflows-sub-field');
|
|
186
|
+
const jsonPointerNode = node.children.find(c => c.type === 'json-pointer');
|
|
187
|
+
const result = {
|
|
188
|
+
type: 'WorkflowsExpression',
|
|
189
|
+
workflowId: workflowIdNode.text,
|
|
190
|
+
field: fieldNode.text,
|
|
191
|
+
subField: subFieldNode.text
|
|
192
|
+
};
|
|
193
|
+
if (jsonPointerNode) {
|
|
194
|
+
result.jsonPointer = transformCSTtoAST(jsonPointerNode, transformers);
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
},
|
|
198
|
+
// source-descriptions-name secondary grammar transformers
|
|
199
|
+
['source-descriptions-name'](node) {
|
|
200
|
+
const sourceNameNode = node.children.find(c => c.type === 'source-descriptions-source-name');
|
|
201
|
+
const referenceNode = node.children.find(c => c.type === 'source-descriptions-reference');
|
|
202
|
+
return {
|
|
203
|
+
type: 'SourceDescriptionsExpression',
|
|
204
|
+
sourceName: sourceNameNode.text,
|
|
205
|
+
reference: referenceNode.text
|
|
206
|
+
};
|
|
207
|
+
},
|
|
208
|
+
// components-name secondary grammar transformers
|
|
209
|
+
['components-name'](node) {
|
|
210
|
+
const fieldNode = node.children.find(c => c.type === 'components-field');
|
|
211
|
+
const subFieldNode = node.children.find(c => c.type === 'components-sub-field');
|
|
212
|
+
return {
|
|
213
|
+
type: 'ComponentsExpression',
|
|
214
|
+
field: fieldNode.text,
|
|
215
|
+
subField: subFieldNode.text
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
export default transformers;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Ast as AST } from 'apg-lite';
|
|
2
|
+
import cstCallback from "../callbacks/cst.mjs";
|
|
3
|
+
class CSTTranslator extends AST {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
|
|
7
|
+
// expression-string grammar rules
|
|
8
|
+
this.callbacks['expression-string'] = cstCallback('expression-string');
|
|
9
|
+
this.callbacks['embedded-expression'] = cstCallback('embedded-expression');
|
|
10
|
+
this.callbacks['literal-char'] = cstCallback('literal-char');
|
|
11
|
+
// main expression grammar rules
|
|
12
|
+
this.callbacks['expression'] = cstCallback('expression');
|
|
13
|
+
this.callbacks['source'] = cstCallback('source');
|
|
14
|
+
this.callbacks['header-reference'] = cstCallback('header-reference');
|
|
15
|
+
this.callbacks['query-reference'] = cstCallback('query-reference');
|
|
16
|
+
this.callbacks['path-reference'] = cstCallback('path-reference');
|
|
17
|
+
this.callbacks['body-reference'] = cstCallback('body-reference');
|
|
18
|
+
this.callbacks['json-pointer'] = cstCallback('json-pointer');
|
|
19
|
+
this.callbacks['reference-token'] = cstCallback('reference-token');
|
|
20
|
+
this.callbacks['name'] = cstCallback('name');
|
|
21
|
+
this.callbacks['token'] = cstCallback('token');
|
|
22
|
+
// steps-name secondary grammar rules
|
|
23
|
+
this.callbacks['steps-name'] = cstCallback('steps-name');
|
|
24
|
+
this.callbacks['steps-id'] = cstCallback('steps-id');
|
|
25
|
+
this.callbacks['steps-field'] = cstCallback('steps-field');
|
|
26
|
+
this.callbacks['steps-sub-field'] = cstCallback('steps-sub-field');
|
|
27
|
+
// workflows-name secondary grammar rules
|
|
28
|
+
this.callbacks['workflows-name'] = cstCallback('workflows-name');
|
|
29
|
+
this.callbacks['workflows-id'] = cstCallback('workflows-id');
|
|
30
|
+
this.callbacks['workflows-field'] = cstCallback('workflows-field');
|
|
31
|
+
this.callbacks['workflows-sub-field'] = cstCallback('workflows-sub-field');
|
|
32
|
+
// source-descriptions-name secondary grammar rules
|
|
33
|
+
this.callbacks['source-descriptions-name'] = cstCallback('source-descriptions-name');
|
|
34
|
+
this.callbacks['source-descriptions-source-name'] = cstCallback('source-descriptions-source-name');
|
|
35
|
+
this.callbacks['source-descriptions-reference'] = cstCallback('source-descriptions-reference');
|
|
36
|
+
// components-name secondary grammar rules
|
|
37
|
+
this.callbacks['components-name'] = cstCallback('components-name');
|
|
38
|
+
this.callbacks['components-field'] = cstCallback('components-field');
|
|
39
|
+
this.callbacks['components-sub-field'] = cstCallback('components-sub-field');
|
|
40
|
+
}
|
|
41
|
+
getTree() {
|
|
42
|
+
const data = {
|
|
43
|
+
stack: [],
|
|
44
|
+
root: null
|
|
45
|
+
};
|
|
46
|
+
this.translate(data);
|
|
47
|
+
return data.root;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export default CSTTranslator;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import parse from "../parse/index.mjs";
|
|
2
|
+
const test = runtimeExpression => {
|
|
3
|
+
if (typeof runtimeExpression !== 'string') return false;
|
|
4
|
+
try {
|
|
5
|
+
const {
|
|
6
|
+
result
|
|
7
|
+
} = parse(runtimeExpression);
|
|
8
|
+
return result.success;
|
|
9
|
+
} catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export default test;
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "
|
|
6
|
+
"version": "2.0.1",
|
|
7
7
|
"description": "Arazzo Runtime expressions parser, validator and extractor.",
|
|
8
8
|
"main": "./cjs/index.cjs",
|
|
9
9
|
"types": "./types/index.d.ts",
|
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
22
|
"prepublishOnly": "npm run build",
|
|
23
|
-
"grammar:compile": "node ./scripts/apg-js.js --lite --in=./src/
|
|
23
|
+
"grammar:compile": "node ./scripts/apg-js.js --lite --in=./src/grammar.bnf --out=./src/grammar.js && cd ./src",
|
|
24
24
|
"build": "npm run grammar:compile && npm run build:es && npm run build:cjs && npm run build:cjs:apg-lite",
|
|
25
25
|
"build:es": "cross-env BABEL_ENV=es babel src --out-dir es --extensions '.js' --out-file-extension '.mjs'",
|
|
26
26
|
"build:cjs": "cross-env BABEL_ENV=cjs babel src --out-dir cjs --extensions '.js' --out-file-extension '.cjs'",
|
|
27
27
|
"build:cjs:apg-lite": "cross-env BABEL_ENV=cjs babel node_modules/apg-lite/lib/parser.js --out-file ./cjs/apg-lite.cjs",
|
|
28
|
-
"test": "mocha",
|
|
28
|
+
"test": "cross-env UPDATE_SNAPSHOT=new mocha",
|
|
29
29
|
"test:watch": "npm-watch test",
|
|
30
30
|
"watch": "npm-watch"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
33
|
+
"node": ">=16.14.0"
|
|
34
34
|
},
|
|
35
35
|
"type": "module",
|
|
36
36
|
"repository": {
|
|
@@ -62,21 +62,28 @@
|
|
|
62
62
|
"SECURITY.md"
|
|
63
63
|
],
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"apg-lite": "^1.0.
|
|
65
|
+
"apg-lite": "^1.0.5"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@babel/cli": "=7.
|
|
69
|
-
"@babel/core": "=7.
|
|
70
|
-
"@babel/preset-env": "=7.
|
|
71
|
-
"@commitlint/cli": "=
|
|
72
|
-
"@commitlint/config-conventional": "=
|
|
68
|
+
"@babel/cli": "=7.28.6",
|
|
69
|
+
"@babel/core": "=7.28.6",
|
|
70
|
+
"@babel/preset-env": "=7.28.6",
|
|
71
|
+
"@commitlint/cli": "=20.3.1",
|
|
72
|
+
"@commitlint/config-conventional": "=20.3.1",
|
|
73
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
74
|
+
"@semantic-release/git": "^10.0.1",
|
|
75
|
+
"@semantic-release/github": "^12.0.2",
|
|
76
|
+
"@semantic-release/npm": "^13.1.3",
|
|
77
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
73
78
|
"apg-js": "^4.4.0",
|
|
74
79
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
75
|
-
"chai": "=
|
|
76
|
-
"cross-env": "^
|
|
80
|
+
"chai": "=6.2.2",
|
|
81
|
+
"cross-env": "^10.0.0",
|
|
77
82
|
"husky": "=9.1.7",
|
|
78
|
-
"mocha": "=11.
|
|
83
|
+
"mocha": "=11.7.5",
|
|
84
|
+
"mocha-expect-snapshot": "^8.0.0",
|
|
79
85
|
"npm-watch": "^0.13.0",
|
|
80
|
-
"prettier": "^3.1.1"
|
|
86
|
+
"prettier": "^3.1.1",
|
|
87
|
+
"semantic-release": "^25.0.2"
|
|
81
88
|
}
|
|
82
89
|
}
|