@swagger-api/apidom-ast 0.68.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/CHANGELOG.md +352 -0
- package/LICENSES/Apache-2.0.txt +202 -0
- package/LICENSES/MIT.txt +9 -0
- package/NOTICE +57 -0
- package/README.md +98 -0
- package/cjs/Error.cjs +25 -0
- package/cjs/Literal.cjs +22 -0
- package/cjs/Node.cjs +46 -0
- package/cjs/ParseResult.cjs +22 -0
- package/cjs/Position.cjs +46 -0
- package/cjs/index.cjs +113 -0
- package/cjs/json/nodes/JsonArray.cjs +21 -0
- package/cjs/json/nodes/JsonDocument.cjs +22 -0
- package/cjs/json/nodes/JsonEscapeSequence.cjs +14 -0
- package/cjs/json/nodes/JsonFalse.cjs +14 -0
- package/cjs/json/nodes/JsonKey.cjs +14 -0
- package/cjs/json/nodes/JsonNode.cjs +10 -0
- package/cjs/json/nodes/JsonNull.cjs +14 -0
- package/cjs/json/nodes/JsonNumber.cjs +14 -0
- package/cjs/json/nodes/JsonObject.cjs +21 -0
- package/cjs/json/nodes/JsonProperty.cjs +27 -0
- package/cjs/json/nodes/JsonString.cjs +27 -0
- package/cjs/json/nodes/JsonStringContent.cjs +14 -0
- package/cjs/json/nodes/JsonTrue.cjs +14 -0
- package/cjs/json/nodes/JsonValue.cjs +22 -0
- package/cjs/json/nodes/predicates.cjs +29 -0
- package/cjs/predicates.cjs +14 -0
- package/cjs/traversal/visitor.cjs +493 -0
- package/cjs/yaml/nodes/YamlAlias.cjs +22 -0
- package/cjs/yaml/nodes/YamlAnchor.cjs +22 -0
- package/cjs/yaml/nodes/YamlCollection.cjs +10 -0
- package/cjs/yaml/nodes/YamlComment.cjs +22 -0
- package/cjs/yaml/nodes/YamlDirective.cjs +30 -0
- package/cjs/yaml/nodes/YamlDocument.cjs +14 -0
- package/cjs/yaml/nodes/YamlKeyValuePair.cjs +40 -0
- package/cjs/yaml/nodes/YamlMapping.cjs +24 -0
- package/cjs/yaml/nodes/YamlNode.cjs +28 -0
- package/cjs/yaml/nodes/YamlScalar.cjs +22 -0
- package/cjs/yaml/nodes/YamlSequence.cjs +27 -0
- package/cjs/yaml/nodes/YamlStream.cjs +26 -0
- package/cjs/yaml/nodes/YamlStyle.cjs +33 -0
- package/cjs/yaml/nodes/YamlTag.cjs +32 -0
- package/cjs/yaml/nodes/predicates.cjs +25 -0
- package/cjs/yaml/schemas/ScalarTag.cjs +43 -0
- package/cjs/yaml/schemas/Tag.cjs +14 -0
- package/cjs/yaml/schemas/canonical-format.cjs +129 -0
- package/cjs/yaml/schemas/failsafe/GenericMapping.cjs +29 -0
- package/cjs/yaml/schemas/failsafe/GenericSequence.cjs +29 -0
- package/cjs/yaml/schemas/failsafe/GenericString.cjs +24 -0
- package/cjs/yaml/schemas/failsafe/index.cjs +96 -0
- package/cjs/yaml/schemas/json/Boolean.cjs +30 -0
- package/cjs/yaml/schemas/json/FloatingPoint.cjs +30 -0
- package/cjs/yaml/schemas/json/Integer.cjs +30 -0
- package/cjs/yaml/schemas/json/Null.cjs +29 -0
- package/cjs/yaml/schemas/json/index.cjs +47 -0
- package/dist/apidom-ast.browser.js +21212 -0
- package/dist/apidom-ast.browser.min.js +2 -0
- package/dist/apidom-ast.browser.min.js.LICENSE.txt +6 -0
- package/es/Error.js +19 -0
- package/es/Literal.js +16 -0
- package/es/Node.js +40 -0
- package/es/ParseResult.js +16 -0
- package/es/Position.js +39 -0
- package/es/index.js +39 -0
- package/es/json/nodes/JsonArray.js +15 -0
- package/es/json/nodes/JsonDocument.js +16 -0
- package/es/json/nodes/JsonEscapeSequence.js +8 -0
- package/es/json/nodes/JsonFalse.js +8 -0
- package/es/json/nodes/JsonKey.js +8 -0
- package/es/json/nodes/JsonNode.js +4 -0
- package/es/json/nodes/JsonNull.js +8 -0
- package/es/json/nodes/JsonNumber.js +8 -0
- package/es/json/nodes/JsonObject.js +15 -0
- package/es/json/nodes/JsonProperty.js +21 -0
- package/es/json/nodes/JsonString.js +21 -0
- package/es/json/nodes/JsonStringContent.js +8 -0
- package/es/json/nodes/JsonTrue.js +8 -0
- package/es/json/nodes/JsonValue.js +16 -0
- package/es/json/nodes/predicates.js +13 -0
- package/es/predicates.js +5 -0
- package/es/traversal/visitor.js +483 -0
- package/es/yaml/nodes/YamlAlias.js +16 -0
- package/es/yaml/nodes/YamlAnchor.js +16 -0
- package/es/yaml/nodes/YamlCollection.js +4 -0
- package/es/yaml/nodes/YamlComment.js +16 -0
- package/es/yaml/nodes/YamlDirective.js +24 -0
- package/es/yaml/nodes/YamlDocument.js +8 -0
- package/es/yaml/nodes/YamlKeyValuePair.js +34 -0
- package/es/yaml/nodes/YamlMapping.js +18 -0
- package/es/yaml/nodes/YamlNode.js +22 -0
- package/es/yaml/nodes/YamlScalar.js +16 -0
- package/es/yaml/nodes/YamlSequence.js +21 -0
- package/es/yaml/nodes/YamlStream.js +20 -0
- package/es/yaml/nodes/YamlStyle.js +25 -0
- package/es/yaml/nodes/YamlTag.js +25 -0
- package/es/yaml/nodes/predicates.js +11 -0
- package/es/yaml/schemas/ScalarTag.js +37 -0
- package/es/yaml/schemas/Tag.js +8 -0
- package/es/yaml/schemas/canonical-format.js +122 -0
- package/es/yaml/schemas/failsafe/GenericMapping.js +23 -0
- package/es/yaml/schemas/failsafe/GenericSequence.js +23 -0
- package/es/yaml/schemas/failsafe/GenericString.js +18 -0
- package/es/yaml/schemas/failsafe/index.js +90 -0
- package/es/yaml/schemas/json/Boolean.js +24 -0
- package/es/yaml/schemas/json/FloatingPoint.js +24 -0
- package/es/yaml/schemas/json/Integer.js +24 -0
- package/es/yaml/schemas/json/Null.js +23 -0
- package/es/yaml/schemas/json/index.js +41 -0
- package/package.json +62 -0
- package/types/dist.d.ts +362 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
exports.isTrue = exports.isStringContent = exports.isString = exports.isProperty = exports.isObject = exports.isNumber = exports.isNull = exports.isKey = exports.isFalse = exports.isEscapeSequence = exports.isDocument = exports.isArray = void 0;
|
5
|
+
var _predicates = require("../../predicates.cjs");
|
6
|
+
const isDocument = _predicates.isNodeType.bind(undefined, 'document');
|
7
|
+
exports.isDocument = isDocument;
|
8
|
+
const isString = _predicates.isNodeType.bind(undefined, 'string');
|
9
|
+
exports.isString = isString;
|
10
|
+
const isFalse = _predicates.isNodeType.bind(undefined, 'false');
|
11
|
+
exports.isFalse = isFalse;
|
12
|
+
const isTrue = _predicates.isNodeType.bind(undefined, 'true');
|
13
|
+
exports.isTrue = isTrue;
|
14
|
+
const isNull = _predicates.isNodeType.bind(undefined, 'null');
|
15
|
+
exports.isNull = isNull;
|
16
|
+
const isNumber = _predicates.isNodeType.bind(undefined, 'number');
|
17
|
+
exports.isNumber = isNumber;
|
18
|
+
const isArray = _predicates.isNodeType.bind(undefined, 'array');
|
19
|
+
exports.isArray = isArray;
|
20
|
+
const isObject = _predicates.isNodeType.bind(undefined, 'object');
|
21
|
+
exports.isObject = isObject;
|
22
|
+
const isStringContent = _predicates.isNodeType.bind(undefined, 'stringContent');
|
23
|
+
exports.isStringContent = isStringContent;
|
24
|
+
const isEscapeSequence = _predicates.isNodeType.bind(undefined, 'escapeSequence');
|
25
|
+
exports.isEscapeSequence = isEscapeSequence;
|
26
|
+
const isProperty = _predicates.isNodeType.bind(undefined, 'property');
|
27
|
+
exports.isProperty = isProperty;
|
28
|
+
const isKey = _predicates.isNodeType.bind(undefined, 'key');
|
29
|
+
exports.isKey = isKey;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
exports.isPosition = exports.isPoint = exports.isParseResult = exports.isNodeType = exports.isLiteral = void 0;
|
5
|
+
const isNodeType = (type, node) => (node === null || node === void 0 ? void 0 : node.type) === type;
|
6
|
+
exports.isNodeType = isNodeType;
|
7
|
+
const isLiteral = isNodeType.bind(undefined, 'literal');
|
8
|
+
exports.isLiteral = isLiteral;
|
9
|
+
const isPosition = isNodeType.bind(undefined, 'position');
|
10
|
+
exports.isPosition = isPosition;
|
11
|
+
const isPoint = isNodeType.bind(undefined, 'point');
|
12
|
+
exports.isPoint = isPoint;
|
13
|
+
const isParseResult = isNodeType.bind(undefined, 'parseResult');
|
14
|
+
exports.isParseResult = isParseResult;
|
@@ -0,0 +1,493 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
exports.visit = exports.mergeAll = exports.isNode = exports.getVisitFn = exports.getNodeType = exports.BREAK = void 0;
|
5
|
+
/**
|
6
|
+
* SPDX-FileCopyrightText: Copyright (c) GraphQL Contributors
|
7
|
+
*
|
8
|
+
* SPDX-License-Identifier: MIT
|
9
|
+
*/
|
10
|
+
|
11
|
+
// getVisitFn :: (Visitor, String, Boolean) -> Function
|
12
|
+
const getVisitFn = (visitor, type, isLeaving) => {
|
13
|
+
const typeVisitor = visitor[type];
|
14
|
+
if (typeVisitor != null) {
|
15
|
+
if (!isLeaving && typeof typeVisitor === 'function') {
|
16
|
+
// { Type() {} }
|
17
|
+
return typeVisitor;
|
18
|
+
}
|
19
|
+
const typeSpecificVisitor = isLeaving ? typeVisitor.leave : typeVisitor.enter;
|
20
|
+
if (typeof typeSpecificVisitor === 'function') {
|
21
|
+
// { Type: { enter() {}, leave() {} } }
|
22
|
+
return typeSpecificVisitor;
|
23
|
+
}
|
24
|
+
} else {
|
25
|
+
const specificVisitor = isLeaving ? visitor.leave : visitor.enter;
|
26
|
+
if (specificVisitor != null) {
|
27
|
+
if (typeof specificVisitor === 'function') {
|
28
|
+
// { enter() {}, leave() {} }
|
29
|
+
return specificVisitor;
|
30
|
+
}
|
31
|
+
const specificTypeVisitor = specificVisitor[type];
|
32
|
+
if (typeof specificTypeVisitor === 'function') {
|
33
|
+
// { enter: { Type() {} }, leave: { Type() {} } }
|
34
|
+
return specificTypeVisitor;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
return null;
|
39
|
+
};
|
40
|
+
exports.getVisitFn = getVisitFn;
|
41
|
+
const BREAK = {};
|
42
|
+
|
43
|
+
// getNodeType :: Node -> String
|
44
|
+
exports.BREAK = BREAK;
|
45
|
+
const getNodeType = node => node === null || node === void 0 ? void 0 : node.type;
|
46
|
+
|
47
|
+
// isNode :: Node -> Boolean
|
48
|
+
exports.getNodeType = getNodeType;
|
49
|
+
const isNode = node => typeof getNodeType(node) === 'string';
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Creates a new visitor instance which delegates to many visitors to run in
|
53
|
+
* parallel. Each visitor will be visited for each node before moving on.
|
54
|
+
*
|
55
|
+
* If a prior visitor edits a node, no following visitors will see that node.
|
56
|
+
*/
|
57
|
+
exports.isNode = isNode;
|
58
|
+
const mergeAll = (visitors, {
|
59
|
+
visitFnGetter = getVisitFn,
|
60
|
+
nodeTypeGetter = getNodeType
|
61
|
+
} = {}) => {
|
62
|
+
const skipping = new Array(visitors.length);
|
63
|
+
return {
|
64
|
+
enter(node, ...rest) {
|
65
|
+
for (let i = 0; i < visitors.length; i += 1) {
|
66
|
+
if (skipping[i] == null) {
|
67
|
+
const fn = visitFnGetter(visitors[i], nodeTypeGetter(node), /* isLeaving */false);
|
68
|
+
if (typeof fn === 'function') {
|
69
|
+
const result = fn.call(visitors[i], node, ...rest);
|
70
|
+
if (result === false) {
|
71
|
+
skipping[i] = node;
|
72
|
+
} else if (result === BREAK) {
|
73
|
+
skipping[i] = BREAK;
|
74
|
+
} else if (result !== undefined) {
|
75
|
+
return result;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
return undefined;
|
81
|
+
},
|
82
|
+
leave(node, ...rest) {
|
83
|
+
for (let i = 0; i < visitors.length; i += 1) {
|
84
|
+
if (skipping[i] == null) {
|
85
|
+
const fn = visitFnGetter(visitors[i], nodeTypeGetter(node), /* isLeaving */true);
|
86
|
+
if (typeof fn === 'function') {
|
87
|
+
const result = fn.call(visitors[i], node, ...rest);
|
88
|
+
if (result === BREAK) {
|
89
|
+
skipping[i] = BREAK;
|
90
|
+
} else if (result !== undefined && result !== false) {
|
91
|
+
return result;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
} else if (skipping[i] === node) {
|
95
|
+
skipping[i] = null;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
return undefined;
|
99
|
+
}
|
100
|
+
};
|
101
|
+
};
|
102
|
+
|
103
|
+
/* eslint-disable no-continue, no-nested-ternary, no-param-reassign */
|
104
|
+
/**
|
105
|
+
* visit() will walk through an AST using a preorder depth first traversal, calling
|
106
|
+
* the visitor's enter function at each node in the traversal, and calling the
|
107
|
+
* leave function after visiting that node and all of its child nodes.
|
108
|
+
*
|
109
|
+
* By returning different values from the enter and leave functions, the
|
110
|
+
* behavior of the visitor can be altered, including skipping over a sub-tree of
|
111
|
+
* the AST (by returning false), editing the AST by returning a value or null
|
112
|
+
* to remove the value, or to stop the whole traversal by returning BREAK.
|
113
|
+
*
|
114
|
+
* When using visit() to edit an AST, the original AST will not be modified, and
|
115
|
+
* a new version of the AST with the changes applied will be returned from the
|
116
|
+
* visit function.
|
117
|
+
*
|
118
|
+
* const editedAST = visit(ast, {
|
119
|
+
* enter(node, key, parent, path, ancestors) {
|
120
|
+
* // @return
|
121
|
+
* // undefined: no action
|
122
|
+
* // false: skip visiting this node
|
123
|
+
* // BREAK: stop visiting altogether
|
124
|
+
* // null: delete this node
|
125
|
+
* // any value: replace this node with the returned value
|
126
|
+
* },
|
127
|
+
* leave(node, key, parent, path, ancestors) {
|
128
|
+
* // @return
|
129
|
+
* // undefined: no action
|
130
|
+
* // false: no action
|
131
|
+
* // BREAK: stop visiting altogether
|
132
|
+
* // null: delete this node
|
133
|
+
* // any value: replace this node with the returned value
|
134
|
+
* }
|
135
|
+
* });
|
136
|
+
*
|
137
|
+
* Alternatively to providing enter() and leave() functions, a visitor can
|
138
|
+
* instead provide functions named the same as the kinds of AST nodes, or
|
139
|
+
* enter/leave visitors at a named key, leading to four permutations of
|
140
|
+
* visitor API:
|
141
|
+
*
|
142
|
+
* 1) Named visitors triggered when entering a node a specific kind.
|
143
|
+
*
|
144
|
+
* visit(ast, {
|
145
|
+
* Kind(node) {
|
146
|
+
* // enter the "Kind" node
|
147
|
+
* }
|
148
|
+
* })
|
149
|
+
*
|
150
|
+
* 2) Named visitors that trigger upon entering and leaving a node of
|
151
|
+
* a specific kind.
|
152
|
+
*
|
153
|
+
* visit(ast, {
|
154
|
+
* Kind: {
|
155
|
+
* enter(node) {
|
156
|
+
* // enter the "Kind" node
|
157
|
+
* }
|
158
|
+
* leave(node) {
|
159
|
+
* // leave the "Kind" node
|
160
|
+
* }
|
161
|
+
* }
|
162
|
+
* })
|
163
|
+
*
|
164
|
+
* 3) Generic visitors that trigger upon entering and leaving any node.
|
165
|
+
*
|
166
|
+
* visit(ast, {
|
167
|
+
* enter(node) {
|
168
|
+
* // enter any node
|
169
|
+
* },
|
170
|
+
* leave(node) {
|
171
|
+
* // leave any node
|
172
|
+
* }
|
173
|
+
* })
|
174
|
+
*
|
175
|
+
* 4) Parallel visitors for entering and leaving nodes of a specific kind.
|
176
|
+
*
|
177
|
+
* visit(ast, {
|
178
|
+
* enter: {
|
179
|
+
* Kind(node) {
|
180
|
+
* // enter the "Kind" node
|
181
|
+
* }
|
182
|
+
* },
|
183
|
+
* leave: {
|
184
|
+
* Kind(node) {
|
185
|
+
* // leave the "Kind" node
|
186
|
+
* }
|
187
|
+
* }
|
188
|
+
* })
|
189
|
+
*
|
190
|
+
* @sig visit :: (Node, Visitor, Options)
|
191
|
+
* @sig Options = { keyMap: Object, state: Object }
|
192
|
+
*/
|
193
|
+
exports.mergeAll = mergeAll;
|
194
|
+
const visit = (
|
195
|
+
// @ts-ignore
|
196
|
+
root,
|
197
|
+
// @ts-ignore
|
198
|
+
visitor, {
|
199
|
+
keyMap = null,
|
200
|
+
state = {},
|
201
|
+
breakSymbol = BREAK,
|
202
|
+
deleteNodeSymbol = null,
|
203
|
+
skipVisitingNodeSymbol = false,
|
204
|
+
visitFnGetter = getVisitFn,
|
205
|
+
nodeTypeGetter = getNodeType,
|
206
|
+
nodePredicate = isNode,
|
207
|
+
detectCycles = true
|
208
|
+
} = {}) => {
|
209
|
+
const visitorKeys = keyMap || {};
|
210
|
+
let stack;
|
211
|
+
let inArray = Array.isArray(root);
|
212
|
+
let keys = [root];
|
213
|
+
let index = -1;
|
214
|
+
let parent;
|
215
|
+
let edits = [];
|
216
|
+
const path = [];
|
217
|
+
// @ts-ignore
|
218
|
+
const ancestors = [];
|
219
|
+
let newRoot = root;
|
220
|
+
do {
|
221
|
+
index += 1;
|
222
|
+
const isLeaving = index === keys.length;
|
223
|
+
let key;
|
224
|
+
let node;
|
225
|
+
const isEdited = isLeaving && edits.length !== 0;
|
226
|
+
if (isLeaving) {
|
227
|
+
key = ancestors.length === 0 ? undefined : path.pop();
|
228
|
+
node = parent;
|
229
|
+
// @ts-ignore
|
230
|
+
parent = ancestors.pop();
|
231
|
+
if (isEdited) {
|
232
|
+
if (inArray) {
|
233
|
+
// @ts-ignore
|
234
|
+
node = node.slice();
|
235
|
+
} else {
|
236
|
+
// creating clone
|
237
|
+
node = Object.create(Object.getPrototypeOf(node), Object.getOwnPropertyDescriptors(node));
|
238
|
+
}
|
239
|
+
let editOffset = 0;
|
240
|
+
for (let ii = 0; ii < edits.length; ii += 1) {
|
241
|
+
let editKey = edits[ii][0];
|
242
|
+
const editValue = edits[ii][1];
|
243
|
+
if (inArray) {
|
244
|
+
editKey -= editOffset;
|
245
|
+
}
|
246
|
+
if (inArray && editValue === deleteNodeSymbol) {
|
247
|
+
node.splice(editKey, 1);
|
248
|
+
editOffset += 1;
|
249
|
+
} else {
|
250
|
+
node[editKey] = editValue;
|
251
|
+
}
|
252
|
+
}
|
253
|
+
}
|
254
|
+
index = stack.index;
|
255
|
+
keys = stack.keys;
|
256
|
+
// @ts-ignore
|
257
|
+
edits = stack.edits;
|
258
|
+
// @ts-ignore
|
259
|
+
inArray = stack.inArray;
|
260
|
+
// @ts-ignore
|
261
|
+
stack = stack.prev;
|
262
|
+
} else {
|
263
|
+
key = parent ? inArray ? index : keys[index] : undefined;
|
264
|
+
node = parent ? parent[key] : newRoot;
|
265
|
+
if (node === deleteNodeSymbol || node === undefined) {
|
266
|
+
continue;
|
267
|
+
}
|
268
|
+
if (parent) {
|
269
|
+
path.push(key);
|
270
|
+
}
|
271
|
+
}
|
272
|
+
if (ancestors.includes(node)) {
|
273
|
+
continue;
|
274
|
+
}
|
275
|
+
let result;
|
276
|
+
if (!Array.isArray(node)) {
|
277
|
+
if (!nodePredicate(node)) {
|
278
|
+
throw new Error(`Invalid AST Node: ${JSON.stringify(node)}`);
|
279
|
+
}
|
280
|
+
// cycle detected; skipping over a sub-tree to avoid recursion
|
281
|
+
if (detectCycles && ancestors.includes(node)) {
|
282
|
+
path.pop();
|
283
|
+
continue;
|
284
|
+
}
|
285
|
+
// call appropriate visitor function if available
|
286
|
+
const visitFn = visitFnGetter(visitor, nodeTypeGetter(node), isLeaving);
|
287
|
+
if (visitFn) {
|
288
|
+
// assign state
|
289
|
+
for (const [stateKey, stateValue] of Object.entries(state)) {
|
290
|
+
visitor[stateKey] = stateValue;
|
291
|
+
}
|
292
|
+
result = visitFn.call(visitor, node, key, parent, path, ancestors);
|
293
|
+
if (result === breakSymbol) {
|
294
|
+
break;
|
295
|
+
}
|
296
|
+
if (result === skipVisitingNodeSymbol) {
|
297
|
+
if (!isLeaving) {
|
298
|
+
path.pop();
|
299
|
+
continue;
|
300
|
+
}
|
301
|
+
} else if (result !== undefined) {
|
302
|
+
edits.push([key, result]);
|
303
|
+
if (!isLeaving) {
|
304
|
+
if (nodePredicate(result)) {
|
305
|
+
node = result;
|
306
|
+
} else {
|
307
|
+
path.pop();
|
308
|
+
continue;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
}
|
312
|
+
}
|
313
|
+
}
|
314
|
+
if (result === undefined && isEdited) {
|
315
|
+
edits.push([key, node]);
|
316
|
+
}
|
317
|
+
if (!isLeaving) {
|
318
|
+
stack = {
|
319
|
+
inArray,
|
320
|
+
index,
|
321
|
+
keys,
|
322
|
+
edits,
|
323
|
+
prev: stack
|
324
|
+
};
|
325
|
+
inArray = Array.isArray(node);
|
326
|
+
// @ts-ignore
|
327
|
+
keys = inArray ? node : visitorKeys[nodeTypeGetter(node)] || [];
|
328
|
+
index = -1;
|
329
|
+
edits = [];
|
330
|
+
if (parent) {
|
331
|
+
ancestors.push(parent);
|
332
|
+
}
|
333
|
+
parent = node;
|
334
|
+
}
|
335
|
+
} while (stack !== undefined);
|
336
|
+
if (edits.length !== 0) {
|
337
|
+
[, newRoot] = edits[edits.length - 1];
|
338
|
+
}
|
339
|
+
return newRoot;
|
340
|
+
};
|
341
|
+
|
342
|
+
/**
|
343
|
+
* Asynchronous version of visit.
|
344
|
+
*/
|
345
|
+
// @ts-ignore
|
346
|
+
exports.visit = visit;
|
347
|
+
visit[Symbol.for('nodejs.util.promisify.custom')] = async (
|
348
|
+
// @ts-ignore
|
349
|
+
root,
|
350
|
+
// @ts-ignore
|
351
|
+
visitor, {
|
352
|
+
keyMap = null,
|
353
|
+
state = {},
|
354
|
+
breakSymbol = BREAK,
|
355
|
+
deleteNodeSymbol = null,
|
356
|
+
skipVisitingNodeSymbol = false,
|
357
|
+
visitFnGetter = getVisitFn,
|
358
|
+
nodeTypeGetter = getNodeType,
|
359
|
+
nodePredicate = isNode,
|
360
|
+
detectCycles = true
|
361
|
+
} = {}) => {
|
362
|
+
const visitorKeys = keyMap || {};
|
363
|
+
let stack;
|
364
|
+
let inArray = Array.isArray(root);
|
365
|
+
let keys = [root];
|
366
|
+
let index = -1;
|
367
|
+
let parent;
|
368
|
+
let edits = [];
|
369
|
+
const path = [];
|
370
|
+
// @ts-ignore
|
371
|
+
const ancestors = [];
|
372
|
+
let newRoot = root;
|
373
|
+
do {
|
374
|
+
index += 1;
|
375
|
+
const isLeaving = index === keys.length;
|
376
|
+
let key;
|
377
|
+
let node;
|
378
|
+
const isEdited = isLeaving && edits.length !== 0;
|
379
|
+
if (isLeaving) {
|
380
|
+
key = ancestors.length === 0 ? undefined : path.pop();
|
381
|
+
node = parent;
|
382
|
+
// @ts-ignore
|
383
|
+
parent = ancestors.pop();
|
384
|
+
if (isEdited) {
|
385
|
+
if (inArray) {
|
386
|
+
// @ts-ignore
|
387
|
+
node = node.slice();
|
388
|
+
} else {
|
389
|
+
// creating clone
|
390
|
+
node = Object.create(Object.getPrototypeOf(node), Object.getOwnPropertyDescriptors(node));
|
391
|
+
}
|
392
|
+
let editOffset = 0;
|
393
|
+
for (let ii = 0; ii < edits.length; ii += 1) {
|
394
|
+
let editKey = edits[ii][0];
|
395
|
+
const editValue = edits[ii][1];
|
396
|
+
if (inArray) {
|
397
|
+
editKey -= editOffset;
|
398
|
+
}
|
399
|
+
if (inArray && editValue === deleteNodeSymbol) {
|
400
|
+
node.splice(editKey, 1);
|
401
|
+
editOffset += 1;
|
402
|
+
} else {
|
403
|
+
node[editKey] = editValue;
|
404
|
+
}
|
405
|
+
}
|
406
|
+
}
|
407
|
+
index = stack.index;
|
408
|
+
keys = stack.keys;
|
409
|
+
// @ts-ignore
|
410
|
+
edits = stack.edits;
|
411
|
+
// @ts-ignore
|
412
|
+
inArray = stack.inArray;
|
413
|
+
// @ts-ignore
|
414
|
+
stack = stack.prev;
|
415
|
+
} else {
|
416
|
+
key = parent ? inArray ? index : keys[index] : undefined;
|
417
|
+
node = parent ? parent[key] : newRoot;
|
418
|
+
if (node === deleteNodeSymbol || node === undefined) {
|
419
|
+
continue;
|
420
|
+
}
|
421
|
+
if (parent) {
|
422
|
+
path.push(key);
|
423
|
+
}
|
424
|
+
}
|
425
|
+
let result;
|
426
|
+
if (!Array.isArray(node)) {
|
427
|
+
if (!nodePredicate(node)) {
|
428
|
+
throw new Error(`Invalid AST Node: ${JSON.stringify(node)}`);
|
429
|
+
}
|
430
|
+
// cycle detected; skipping over a sub-tree to avoid recursion
|
431
|
+
if (detectCycles && ancestors.includes(node)) {
|
432
|
+
path.pop();
|
433
|
+
continue;
|
434
|
+
}
|
435
|
+
const visitFn = visitFnGetter(visitor, nodeTypeGetter(node), isLeaving);
|
436
|
+
if (visitFn) {
|
437
|
+
// assign state
|
438
|
+
for (const [stateKey, stateValue] of Object.entries(state)) {
|
439
|
+
visitor[stateKey] = stateValue;
|
440
|
+
}
|
441
|
+
|
442
|
+
// eslint-disable-next-line no-await-in-loop
|
443
|
+
result = await visitFn.call(visitor, node, key, parent, path, ancestors);
|
444
|
+
if (result === breakSymbol) {
|
445
|
+
break;
|
446
|
+
}
|
447
|
+
if (result === skipVisitingNodeSymbol) {
|
448
|
+
if (!isLeaving) {
|
449
|
+
path.pop();
|
450
|
+
continue;
|
451
|
+
}
|
452
|
+
} else if (result !== undefined) {
|
453
|
+
edits.push([key, result]);
|
454
|
+
if (!isLeaving) {
|
455
|
+
if (nodePredicate(result)) {
|
456
|
+
node = result;
|
457
|
+
} else {
|
458
|
+
path.pop();
|
459
|
+
continue;
|
460
|
+
}
|
461
|
+
}
|
462
|
+
}
|
463
|
+
}
|
464
|
+
}
|
465
|
+
if (result === undefined && isEdited) {
|
466
|
+
edits.push([key, node]);
|
467
|
+
}
|
468
|
+
if (!isLeaving) {
|
469
|
+
stack = {
|
470
|
+
inArray,
|
471
|
+
index,
|
472
|
+
keys,
|
473
|
+
edits,
|
474
|
+
prev: stack
|
475
|
+
};
|
476
|
+
inArray = Array.isArray(node);
|
477
|
+
// @ts-ignore
|
478
|
+
keys = inArray ? node : visitorKeys[nodeTypeGetter(node)] || [];
|
479
|
+
index = -1;
|
480
|
+
edits = [];
|
481
|
+
if (parent) {
|
482
|
+
ancestors.push(parent);
|
483
|
+
}
|
484
|
+
parent = node;
|
485
|
+
}
|
486
|
+
} while (stack !== undefined);
|
487
|
+
if (edits.length !== 0) {
|
488
|
+
[, newRoot] = edits[edits.length - 1];
|
489
|
+
}
|
490
|
+
return newRoot;
|
491
|
+
};
|
492
|
+
|
493
|
+
/* eslint-enable */
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _Node = _interopRequireDefault(require("../../Node.cjs"));
|
8
|
+
const YamlAlias = (0, _stampit.default)(_Node.default, {
|
9
|
+
statics: {
|
10
|
+
type: 'alias'
|
11
|
+
},
|
12
|
+
props: {
|
13
|
+
content: null
|
14
|
+
},
|
15
|
+
init({
|
16
|
+
content = null
|
17
|
+
} = {}) {
|
18
|
+
this.content = content;
|
19
|
+
}
|
20
|
+
});
|
21
|
+
var _default = YamlAlias;
|
22
|
+
exports.default = _default;
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _Node = _interopRequireDefault(require("../../Node.cjs"));
|
8
|
+
const YamlAnchor = (0, _stampit.default)(_Node.default, {
|
9
|
+
statics: {
|
10
|
+
type: 'anchor'
|
11
|
+
},
|
12
|
+
props: {
|
13
|
+
name: null
|
14
|
+
},
|
15
|
+
init({
|
16
|
+
name = null
|
17
|
+
} = {}) {
|
18
|
+
this.name = name;
|
19
|
+
}
|
20
|
+
});
|
21
|
+
var _default = YamlAnchor;
|
22
|
+
exports.default = _default;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _YamlNode = _interopRequireDefault(require("./YamlNode.cjs"));
|
8
|
+
const YamlCollection = (0, _stampit.default)(_YamlNode.default, {});
|
9
|
+
var _default = YamlCollection;
|
10
|
+
exports.default = _default;
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _Node = _interopRequireDefault(require("../../Node.cjs"));
|
8
|
+
const YamlComment = (0, _stampit.default)(_Node.default, {
|
9
|
+
statics: {
|
10
|
+
type: 'comment'
|
11
|
+
},
|
12
|
+
props: {
|
13
|
+
content: null
|
14
|
+
},
|
15
|
+
init({
|
16
|
+
content = null
|
17
|
+
} = {}) {
|
18
|
+
this.content = content;
|
19
|
+
}
|
20
|
+
});
|
21
|
+
var _default = YamlComment;
|
22
|
+
exports.default = _default;
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _ramda = require("ramda");
|
8
|
+
var _Node = _interopRequireDefault(require("../../Node.cjs"));
|
9
|
+
const YamlDirective = (0, _stampit.default)(_Node.default, {
|
10
|
+
statics: {
|
11
|
+
type: 'directive'
|
12
|
+
},
|
13
|
+
props: {
|
14
|
+
name: null,
|
15
|
+
parameters: null
|
16
|
+
},
|
17
|
+
init({
|
18
|
+
name = null,
|
19
|
+
parameters = {}
|
20
|
+
} = {}) {
|
21
|
+
this.name = name;
|
22
|
+
this.parameters = (0, _ramda.mergeRight)({
|
23
|
+
version: null,
|
24
|
+
handle: null,
|
25
|
+
prefix: null
|
26
|
+
}, parameters);
|
27
|
+
}
|
28
|
+
});
|
29
|
+
var _default = YamlDirective;
|
30
|
+
exports.default = _default;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _Node = _interopRequireDefault(require("../../Node.cjs"));
|
8
|
+
const YamlDocument = (0, _stampit.default)(_Node.default, {
|
9
|
+
statics: {
|
10
|
+
type: 'document'
|
11
|
+
}
|
12
|
+
});
|
13
|
+
var _default = YamlDocument;
|
14
|
+
exports.default = _default;
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
exports.__esModule = true;
|
5
|
+
exports.default = void 0;
|
6
|
+
var _stampit = _interopRequireDefault(require("stampit"));
|
7
|
+
var _Node = _interopRequireDefault(require("../../Node.cjs"));
|
8
|
+
var _YamlStyle = _interopRequireDefault(require("./YamlStyle.cjs"));
|
9
|
+
var _predicates = require("./predicates.cjs");
|
10
|
+
const YamlKeyValuePair = (0, _stampit.default)(_Node.default, _YamlStyle.default, {
|
11
|
+
statics: {
|
12
|
+
type: 'keyValuePair'
|
13
|
+
},
|
14
|
+
propertyDescriptors: {
|
15
|
+
key: {
|
16
|
+
get() {
|
17
|
+
// @ts-ignore
|
18
|
+
return this.children.filter(node => (0, _predicates.isScalar)(node) || (0, _predicates.isMapping)(node) || (0, _predicates.isSequence)(node))[0];
|
19
|
+
},
|
20
|
+
enumerable: true
|
21
|
+
},
|
22
|
+
value: {
|
23
|
+
get() {
|
24
|
+
// @ts-ignore
|
25
|
+
const {
|
26
|
+
key,
|
27
|
+
children
|
28
|
+
} = this;
|
29
|
+
const excludeKeyPredicate = node => node !== key;
|
30
|
+
const valuePredicate = node => (0, _predicates.isScalar)(node) || (0, _predicates.isMapping)(node) || (0, _predicates.isSequence)(node) || (0, _predicates.isAlias)(node);
|
31
|
+
|
32
|
+
// @ts-ignore
|
33
|
+
return children.filter(node => excludeKeyPredicate(node) && valuePredicate(node))[0];
|
34
|
+
},
|
35
|
+
enumerable: true
|
36
|
+
}
|
37
|
+
}
|
38
|
+
});
|
39
|
+
var _default = YamlKeyValuePair;
|
40
|
+
exports.default = _default;
|