@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.
Files changed (57) hide show
  1. package/README.md +164 -80
  2. package/SECURITY.md +2 -1
  3. package/cjs/apg-lite.cjs +28 -28
  4. package/cjs/errors/ArazzoRuntimeExpressionError.cjs +44 -0
  5. package/cjs/errors/ArazzoRuntimeExpressionParseError.cjs +8 -0
  6. package/cjs/extract.cjs +35 -9
  7. package/cjs/{runtime-expression.cjs → grammar.cjs} +773 -227
  8. package/cjs/index.cjs +17 -5
  9. package/cjs/parse/callbacks/cst.cjs +28 -0
  10. package/cjs/parse/index.cjs +31 -32
  11. package/cjs/parse/trace/Expectations.cjs +10 -0
  12. package/cjs/parse/trace/Trace.cjs +35 -0
  13. package/cjs/parse/translators/ASTTranslator/index.cjs +15 -0
  14. package/cjs/parse/translators/ASTTranslator/transformers.cjs +225 -0
  15. package/cjs/parse/translators/CSTTranslator.cjs +55 -0
  16. package/cjs/parse/translators/XMLTranslator.cjs +12 -0
  17. package/cjs/test/index.cjs +18 -0
  18. package/es/errors/ArazzoRuntimeExpressionError.mjs +40 -0
  19. package/es/errors/ArazzoRuntimeExpressionParseError.mjs +3 -0
  20. package/es/extract.mjs +34 -9
  21. package/es/{runtime-expression.mjs → grammar.mjs} +773 -227
  22. package/es/index.mjs +9 -3
  23. package/es/parse/callbacks/cst.mjs +24 -0
  24. package/es/parse/index.mjs +31 -32
  25. package/es/parse/trace/Expectations.mjs +6 -0
  26. package/es/parse/trace/Trace.mjs +30 -0
  27. package/es/parse/translators/ASTTranslator/index.mjs +9 -0
  28. package/es/parse/translators/ASTTranslator/transformers.mjs +219 -0
  29. package/es/parse/translators/CSTTranslator.mjs +50 -0
  30. package/es/parse/translators/XMLTranslator.mjs +7 -0
  31. package/es/test/index.mjs +13 -0
  32. package/package.json +21 -14
  33. package/types/index.d.ts +330 -31
  34. package/cjs/parse/callbacks/body-reference.cjs +0 -14
  35. package/cjs/parse/callbacks/expression.cjs +0 -15
  36. package/cjs/parse/callbacks/header-reference.cjs +0 -14
  37. package/cjs/parse/callbacks/json-pointer.cjs +0 -14
  38. package/cjs/parse/callbacks/name.cjs +0 -14
  39. package/cjs/parse/callbacks/parameter-name.cjs +0 -14
  40. package/cjs/parse/callbacks/path-reference.cjs +0 -14
  41. package/cjs/parse/callbacks/query-reference.cjs +0 -14
  42. package/cjs/parse/callbacks/reference-token.cjs +0 -14
  43. package/cjs/parse/callbacks/source.cjs +0 -14
  44. package/cjs/parse/callbacks/token.cjs +0 -15
  45. package/cjs/test.cjs +0 -15
  46. package/es/parse/callbacks/body-reference.mjs +0 -10
  47. package/es/parse/callbacks/expression.mjs +0 -11
  48. package/es/parse/callbacks/header-reference.mjs +0 -10
  49. package/es/parse/callbacks/json-pointer.mjs +0 -10
  50. package/es/parse/callbacks/name.mjs +0 -10
  51. package/es/parse/callbacks/parameter-name.mjs +0 -10
  52. package/es/parse/callbacks/path-reference.mjs +0 -10
  53. package/es/parse/callbacks/query-reference.mjs +0 -10
  54. package/es/parse/callbacks/reference-token.mjs +0 -10
  55. package/es/parse/callbacks/source.mjs +0 -10
  56. package/es/parse/callbacks/token.mjs +0 -10
  57. package/es/test.mjs +0 -10
package/es/index.mjs CHANGED
@@ -1,4 +1,10 @@
1
- export { default as Grammar } from "./runtime-expression.mjs";
1
+ export { default as Grammar } from "./grammar.mjs";
2
2
  export { default as extract } from "./extract.mjs";
3
- export { default as test } from "./test.mjs";
4
- export { default as parse } from "./parse/index.mjs";
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;
@@ -1,35 +1,34 @@
1
- import { Ast as AST, Parser } from 'apg-lite';
2
- import Grammar from "../runtime-expression.mjs";
3
- import expressionCallback from "./callbacks/expression.mjs";
4
- import parameterNameCallback from "./callbacks/parameter-name.mjs";
5
- import sourceCallback from "./callbacks/source.mjs";
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
- const parser = new Parser();
17
- parser.ast = new AST();
18
- parser.ast.callbacks.expression = expressionCallback;
19
- parser.ast.callbacks['parameter-name'] = parameterNameCallback;
20
- parser.ast.callbacks.source = sourceCallback;
21
- parser.ast.callbacks['header-reference'] = headerReferenceCallback;
22
- parser.ast.callbacks['query-reference'] = queryReferenceCallback;
23
- parser.ast.callbacks['path-reference'] = pathReferenceCallback;
24
- parser.ast.callbacks['body-reference'] = bodyReferenceCallback;
25
- parser.ast.callbacks['json-pointer'] = jsonPointerCallback;
26
- parser.ast.callbacks['reference-token'] = referenceTokenCallback;
27
- parser.ast.callbacks.name = nameCallback;
28
- parser.ast.callbacks.token = tokenCallback;
29
- const result = parser.parse(grammar, 'expression', runtimeExpression);
30
- return {
31
- result,
32
- ast: parser.ast
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,6 @@
1
+ class Expectations extends Array {
2
+ toString() {
3
+ return this.map(c => `"${String(c)}"`).join(', ');
4
+ }
5
+ }
6
+ export default Expectations;
@@ -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,7 @@
1
+ import CSTTranslator from "./CSTTranslator.mjs";
2
+ class XMLTranslator extends CSTTranslator {
3
+ getTree() {
4
+ return this.toXml();
5
+ }
6
+ }
7
+ export default XMLTranslator;
@@ -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": "1.0.0",
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/runtime-expression.bnf --out=./src/runtime-expression.js && cd ./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": ">=12.20.0"
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.4"
65
+ "apg-lite": "^1.0.5"
66
66
  },
67
67
  "devDependencies": {
68
- "@babel/cli": "=7.26.4",
69
- "@babel/core": "=7.26.9",
70
- "@babel/preset-env": "=7.26.9",
71
- "@commitlint/cli": "=19.7.1",
72
- "@commitlint/config-conventional": "=19.7.1",
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": "=5.2.0",
76
- "cross-env": "^7.0.3",
80
+ "chai": "=6.2.2",
81
+ "cross-env": "^10.0.0",
77
82
  "husky": "=9.1.7",
78
- "mocha": "=11.1.0",
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
  }