@speclynx/apidom-reference 1.12.1 → 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/CHANGELOG.md +25 -0
- package/NOTICE +16 -7
- package/README.md +0 -33
- package/dist/167.apidom-reference.browser.min.js +1 -1
- package/dist/451.apidom-reference.browser.min.js +1 -1
- package/dist/apidom-reference.browser.js +24594 -23365
- package/dist/apidom-reference.browser.min.js +1 -1
- package/package.json +24 -57
- package/src/configuration/saturated.cjs +34 -42
- package/src/configuration/saturated.mjs +0 -8
- package/src/dereference/index.cjs +4 -4
- package/src/dereference/index.mjs +1 -1
- package/src/dereference/strategies/apidom/index.cjs +7 -7
- package/src/dereference/strategies/apidom/index.mjs +5 -6
- package/src/dereference/strategies/apidom/selectors/element-id.cjs +4 -2
- package/src/dereference/strategies/apidom/selectors/element-id.mjs +5 -3
- package/src/dereference/strategies/apidom/visitor.cjs +31 -17
- package/src/dereference/strategies/apidom/visitor.mjs +25 -12
- package/src/dereference/strategies/asyncapi-2/index.cjs +6 -9
- package/src/dereference/strategies/asyncapi-2/index.mjs +6 -10
- package/src/dereference/strategies/asyncapi-2/visitor.cjs +67 -80
- package/src/dereference/strategies/asyncapi-2/visitor.mjs +59 -72
- package/src/dereference/strategies/openapi-2/index.cjs +6 -9
- package/src/dereference/strategies/openapi-2/index.mjs +6 -10
- package/src/dereference/strategies/openapi-2/visitor.cjs +91 -100
- package/src/dereference/strategies/openapi-2/visitor.mjs +81 -90
- package/src/dereference/strategies/openapi-3-0/index.cjs +6 -9
- package/src/dereference/strategies/openapi-3-0/index.mjs +6 -10
- package/src/dereference/strategies/openapi-3-0/visitor.cjs +92 -115
- package/src/dereference/strategies/openapi-3-0/visitor.mjs +74 -97
- package/src/dereference/strategies/openapi-3-1/index.cjs +6 -9
- package/src/dereference/strategies/openapi-3-1/index.mjs +6 -10
- package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +2 -1
- package/src/dereference/strategies/openapi-3-1/selectors/$anchor.mjs +3 -2
- package/src/dereference/strategies/openapi-3-1/selectors/uri.cjs +2 -2
- package/src/dereference/strategies/openapi-3-1/selectors/uri.mjs +2 -2
- package/src/dereference/strategies/openapi-3-1/util.cjs +3 -2
- package/src/dereference/strategies/openapi-3-1/util.mjs +4 -3
- package/src/dereference/strategies/openapi-3-1/visitor.cjs +130 -156
- package/src/dereference/strategies/openapi-3-1/visitor.mjs +106 -132
- package/src/dereference/util.cjs +2 -2
- package/src/dereference/util.mjs +1 -1
- package/src/parse/parsers/apidom-json/index.cjs +5 -5
- package/src/parse/parsers/apidom-json/index.mjs +2 -2
- package/src/parse/parsers/arazzo-json-1/index.cjs +1 -2
- package/src/parse/parsers/arazzo-json-1/index.mjs +1 -2
- package/src/parse/parsers/asyncapi-json-2/index.cjs +1 -2
- package/src/parse/parsers/asyncapi-json-2/index.mjs +1 -2
- package/src/parse/parsers/binary/index-browser.cjs +3 -3
- package/src/parse/parsers/binary/index-browser.mjs +1 -1
- package/src/parse/parsers/binary/index-node.cjs +3 -3
- package/src/parse/parsers/binary/index-node.mjs +1 -1
- package/src/parse/parsers/json/index.cjs +1 -2
- package/src/parse/parsers/json/index.mjs +1 -2
- package/src/parse/parsers/openapi-json-2/index.cjs +1 -2
- package/src/parse/parsers/openapi-json-2/index.mjs +1 -2
- package/src/parse/parsers/openapi-json-3-0/index.cjs +1 -2
- package/src/parse/parsers/openapi-json-3-0/index.mjs +1 -2
- package/src/parse/parsers/openapi-json-3-1/index.cjs +1 -2
- package/src/parse/parsers/openapi-json-3-1/index.mjs +1 -2
- package/src/resolve/index.cjs +4 -4
- package/src/resolve/index.mjs +1 -1
- package/types/File.d.ts +1 -1
- package/types/Reference.d.ts +1 -1
- package/types/ReferenceSet.d.ts +1 -1
- package/types/apidom-reference.d.ts +8 -9
- package/types/bundle/index.d.ts +1 -1
- package/types/bundle/strategies/BundleStrategy.d.ts +1 -1
- package/types/bundle/strategies/openapi-3-1/index.d.ts +1 -1
- package/types/dereference/index.d.ts +1 -1
- package/types/dereference/strategies/DereferenceStrategy.d.ts +1 -1
- package/types/dereference/strategies/apidom/index.d.ts +1 -1
- package/types/dereference/strategies/apidom/selectors/element-id.d.ts +1 -1
- package/types/dereference/strategies/apidom/visitor.d.ts +3 -2
- package/types/dereference/strategies/asyncapi-2/index.d.ts +2 -2
- package/types/dereference/strategies/asyncapi-2/visitor.d.ts +5 -14
- package/types/dereference/strategies/openapi-2/index.d.ts +2 -2
- package/types/dereference/strategies/openapi-2/visitor.d.ts +6 -17
- package/types/dereference/strategies/openapi-3-0/index.d.ts +2 -2
- package/types/dereference/strategies/openapi-3-0/visitor.d.ts +7 -20
- package/types/dereference/strategies/openapi-3-1/index.d.ts +2 -2
- package/types/dereference/strategies/openapi-3-1/selectors/$anchor.d.ts +1 -1
- package/types/dereference/strategies/openapi-3-1/selectors/uri.d.ts +1 -1
- package/types/dereference/strategies/openapi-3-1/util.d.ts +1 -1
- package/types/dereference/strategies/openapi-3-1/visitor.d.ts +8 -23
- package/types/dereference/util.d.ts +1 -1
- package/types/index.d.ts +1 -1
- package/types/options/index.d.ts +1 -1
- package/types/parse/index.d.ts +1 -1
- package/types/parse/parsers/Parser.d.ts +1 -1
- package/types/parse/parsers/apidom-json/index.d.ts +1 -1
- package/types/parse/parsers/arazzo-json-1/index.d.ts +1 -2
- package/types/parse/parsers/arazzo-yaml-1/index.d.ts +1 -1
- package/types/parse/parsers/asyncapi-json-2/index.d.ts +1 -2
- package/types/parse/parsers/asyncapi-yaml-2/index.d.ts +1 -1
- package/types/parse/parsers/binary/index-browser.d.ts +1 -1
- package/types/parse/parsers/binary/index-node.d.ts +1 -1
- package/types/parse/parsers/json/index.d.ts +1 -2
- package/types/parse/parsers/openapi-json-2/index.d.ts +1 -2
- package/types/parse/parsers/openapi-json-3-0/index.d.ts +1 -2
- package/types/parse/parsers/openapi-json-3-1/index.d.ts +1 -2
- package/types/parse/parsers/openapi-yaml-2/index.d.ts +1 -1
- package/types/parse/parsers/openapi-yaml-3-0/index.d.ts +1 -1
- package/types/parse/parsers/openapi-yaml-3-1/index.d.ts +1 -1
- package/types/parse/parsers/yaml-1-2/index.d.ts +1 -1
- package/types/resolve/index.d.ts +1 -1
- package/src/parse/parsers/api-design-systems-json/index.cjs +0 -55
- package/src/parse/parsers/api-design-systems-json/index.mjs +0 -49
- package/src/parse/parsers/api-design-systems-yaml/index.cjs +0 -54
- package/src/parse/parsers/api-design-systems-yaml/index.mjs +0 -48
- package/types/parse/parsers/api-design-systems-json/index.d.ts +0 -21
- package/types/parse/parsers/api-design-systems-yaml/index.d.ts +0 -20
|
@@ -1,32 +1,19 @@
|
|
|
1
1
|
import { propEq } from 'ramda';
|
|
2
|
-
import { isElement,
|
|
2
|
+
import { isElement, isPrimitiveElement, isStringElement, RefElement, cloneDeep, cloneShallow } from '@speclynx/apidom-datamodel';
|
|
3
|
+
import { IdentityManager, toValue } from '@speclynx/apidom-core';
|
|
3
4
|
import { ApiDOMError } from '@speclynx/apidom-error';
|
|
5
|
+
import { traverseAsync } from '@speclynx/apidom-traverse';
|
|
4
6
|
import { evaluate, URIFragmentIdentifier } from '@speclynx/apidom-json-pointer';
|
|
5
|
-
import {
|
|
7
|
+
import { isReferenceLikeElement, isBooleanJsonSchemaElement, isChannelItemElement, isReferenceElement, refract, refractReference, refractChannelItem } from '@speclynx/apidom-ns-asyncapi-2';
|
|
6
8
|
import MaximumDereferenceDepthError from "../../../errors/MaximumDereferenceDepthError.mjs";
|
|
7
9
|
import MaximumResolveDepthError from "../../../errors/MaximumResolveDepthError.mjs";
|
|
8
10
|
import { AncestorLineage } from "../../util.mjs";
|
|
9
11
|
import * as url from "../../../util/url.mjs";
|
|
10
12
|
import parse from "../../../parse/index.mjs";
|
|
11
13
|
import Reference from "../../../Reference.mjs";
|
|
12
|
-
// @ts-ignore
|
|
13
|
-
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
|
|
14
|
-
|
|
15
14
|
// initialize element identity manager
|
|
16
15
|
const identityManager = new IdentityManager();
|
|
17
16
|
|
|
18
|
-
/**
|
|
19
|
-
* Custom mutation replacer.
|
|
20
|
-
* @public
|
|
21
|
-
*/
|
|
22
|
-
export const mutationReplacer = (newElement, oldElement, key, parent) => {
|
|
23
|
-
if (isMemberElement(parent)) {
|
|
24
|
-
parent.value = newElement;
|
|
25
|
-
} else if (Array.isArray(parent)) {
|
|
26
|
-
parent[key] = newElement;
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
17
|
/**
|
|
31
18
|
* @public
|
|
32
19
|
*/
|
|
@@ -99,21 +86,25 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
99
86
|
}
|
|
100
87
|
return mutableReference;
|
|
101
88
|
}
|
|
102
|
-
toAncestorLineage(
|
|
89
|
+
toAncestorLineage(path) {
|
|
103
90
|
/**
|
|
104
91
|
* Compute full ancestors lineage.
|
|
105
92
|
* Ancestors are flatten to unwrap all Element instances.
|
|
106
93
|
*/
|
|
107
|
-
const
|
|
94
|
+
const ancestorNodes = path.getAncestorNodes();
|
|
95
|
+
const directAncestors = new Set(ancestorNodes.filter(isElement));
|
|
108
96
|
const ancestorsLineage = new AncestorLineage(...this.ancestors, directAncestors);
|
|
109
97
|
return [ancestorsLineage, directAncestors];
|
|
110
98
|
}
|
|
111
|
-
async ReferenceElement(
|
|
99
|
+
async ReferenceElement(path) {
|
|
100
|
+
const referencingElement = path.node;
|
|
101
|
+
|
|
112
102
|
// skip current referencing element as it's already been access
|
|
113
103
|
if (this.indirections.includes(referencingElement)) {
|
|
114
|
-
|
|
104
|
+
path.skip();
|
|
105
|
+
return;
|
|
115
106
|
}
|
|
116
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
107
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
117
108
|
const retrievalURI = this.toBaseURI(toValue(referencingElement.$ref));
|
|
118
109
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
119
110
|
const isExternalReference = !isInternalReference;
|
|
@@ -121,12 +112,14 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
121
112
|
// ignore resolving internal Reference Objects
|
|
122
113
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
123
114
|
// skip traversing this reference and all it's child elements
|
|
124
|
-
|
|
115
|
+
path.skip();
|
|
116
|
+
return;
|
|
125
117
|
}
|
|
126
118
|
// ignore resolving external Reference Objects
|
|
127
119
|
if (!this.options.resolve.external && isExternalReference) {
|
|
128
120
|
// skip traversing this reference and all it's child elements
|
|
129
|
-
|
|
121
|
+
path.skip();
|
|
122
|
+
return;
|
|
130
123
|
}
|
|
131
124
|
const reference = await this.toReference(toValue(referencingElement.$ref));
|
|
132
125
|
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));
|
|
@@ -147,13 +140,14 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
147
140
|
referencedElement = this.refractCache.get(cacheKey);
|
|
148
141
|
} else if (isReferenceLikeElement(referencedElement)) {
|
|
149
142
|
// handling indirect references
|
|
150
|
-
referencedElement =
|
|
151
|
-
referencedElement.
|
|
143
|
+
referencedElement = refractReference(referencedElement);
|
|
144
|
+
referencedElement.meta.set('referenced-element', referencedElementType);
|
|
152
145
|
this.refractCache.set(cacheKey, referencedElement);
|
|
153
146
|
} else {
|
|
154
147
|
// handling direct references
|
|
155
|
-
|
|
156
|
-
|
|
148
|
+
referencedElement = refract(referencedElement, {
|
|
149
|
+
element: referencedElementType
|
|
150
|
+
});
|
|
157
151
|
this.refractCache.set(cacheKey, referencedElement);
|
|
158
152
|
}
|
|
159
153
|
}
|
|
@@ -181,8 +175,9 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
181
175
|
});
|
|
182
176
|
const replacer = this.options.dereference.strategyOpts['asyncapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
183
177
|
const replacement = replacer(refElement);
|
|
184
|
-
|
|
185
|
-
|
|
178
|
+
this.indirections.pop();
|
|
179
|
+
path.replaceWith(replacement);
|
|
180
|
+
return;
|
|
186
181
|
}
|
|
187
182
|
}
|
|
188
183
|
|
|
@@ -208,9 +203,8 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
208
203
|
refractCache: this.refractCache,
|
|
209
204
|
ancestors: ancestorsLineage
|
|
210
205
|
});
|
|
211
|
-
referencedElement = await
|
|
212
|
-
|
|
213
|
-
nodeTypeGetter: getNodeType
|
|
206
|
+
referencedElement = await traverseAsync(referencedElement, visitor, {
|
|
207
|
+
mutable: true
|
|
214
208
|
});
|
|
215
209
|
|
|
216
210
|
// remove referencing reference from ancestors lineage
|
|
@@ -222,17 +216,17 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
222
216
|
if (isBooleanJsonSchemaElement(referencedElement)) {
|
|
223
217
|
const booleanJsonSchemaElement = cloneDeep(referencedElement);
|
|
224
218
|
// assign unique id to merged element
|
|
225
|
-
booleanJsonSchemaElement.
|
|
219
|
+
booleanJsonSchemaElement.meta.set('id', identityManager.generateId());
|
|
226
220
|
// annotate referenced element with info about original referencing element
|
|
227
|
-
booleanJsonSchemaElement.
|
|
221
|
+
booleanJsonSchemaElement.meta.set('ref-fields', {
|
|
228
222
|
$ref: toValue(referencingElement.$ref)
|
|
229
223
|
});
|
|
230
224
|
// annotate referenced element with info about origin
|
|
231
|
-
booleanJsonSchemaElement.
|
|
225
|
+
booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
|
|
232
226
|
// annotate fragment with info about referencing element
|
|
233
|
-
booleanJsonSchemaElement.
|
|
234
|
-
|
|
235
|
-
return
|
|
227
|
+
booleanJsonSchemaElement.meta.set('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
|
|
228
|
+
path.replaceWith(booleanJsonSchemaElement);
|
|
229
|
+
return;
|
|
236
230
|
}
|
|
237
231
|
|
|
238
232
|
/**
|
|
@@ -240,37 +234,35 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
240
234
|
*/
|
|
241
235
|
const mergedElement = cloneShallow(referencedElement);
|
|
242
236
|
// assign unique id to merged element
|
|
243
|
-
mergedElement.
|
|
237
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
244
238
|
// annotate referenced element with info about original referencing element
|
|
245
|
-
mergedElement.
|
|
239
|
+
mergedElement.meta.set('ref-fields', {
|
|
246
240
|
$ref: toValue(referencingElement.$ref)
|
|
247
241
|
});
|
|
248
242
|
// annotate fragment with info about origin
|
|
249
|
-
mergedElement.
|
|
243
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
250
244
|
// annotate fragment with info about referencing element
|
|
251
|
-
mergedElement.
|
|
245
|
+
mergedElement.meta.set('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
|
|
252
246
|
|
|
253
247
|
/**
|
|
254
248
|
* Transclude referencing element with merged referenced element.
|
|
255
249
|
*/
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
260
|
-
*/
|
|
261
|
-
return !parent ? mergedElement : false;
|
|
250
|
+
path.replaceWith(mergedElement);
|
|
262
251
|
}
|
|
263
|
-
async ChannelItemElement(
|
|
252
|
+
async ChannelItemElement(path) {
|
|
253
|
+
const referencingElement = path.node;
|
|
254
|
+
|
|
264
255
|
// ignore ChannelItemElement without $ref field
|
|
265
256
|
if (!isStringElement(referencingElement.$ref)) {
|
|
266
|
-
return
|
|
257
|
+
return;
|
|
267
258
|
}
|
|
268
259
|
|
|
269
260
|
// skip current referencing element as it's already been access
|
|
270
261
|
if (this.indirections.includes(referencingElement)) {
|
|
271
|
-
|
|
262
|
+
path.skip();
|
|
263
|
+
return;
|
|
272
264
|
}
|
|
273
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
265
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
274
266
|
const retrievalURI = this.toBaseURI(toValue(referencingElement.$ref));
|
|
275
267
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
276
268
|
const isExternalReference = !isInternalReference;
|
|
@@ -278,12 +270,12 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
278
270
|
// ignore resolving internal Channel Item Objects
|
|
279
271
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
280
272
|
// skip traversing this channel item but traverse all it's child elements
|
|
281
|
-
return
|
|
273
|
+
return;
|
|
282
274
|
}
|
|
283
275
|
// ignore resolving external Channel Item Objects
|
|
284
276
|
if (!this.options.resolve.external && isExternalReference) {
|
|
285
277
|
// skip traversing this channel item but traverse all it's child elements
|
|
286
|
-
return
|
|
278
|
+
return;
|
|
287
279
|
}
|
|
288
280
|
const reference = await this.toReference(toValue(referencingElement.$ref));
|
|
289
281
|
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));
|
|
@@ -302,7 +294,7 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
302
294
|
if (this.refractCache.has(cacheKey)) {
|
|
303
295
|
referencedElement = this.refractCache.get(cacheKey);
|
|
304
296
|
} else {
|
|
305
|
-
referencedElement =
|
|
297
|
+
referencedElement = refractChannelItem(referencedElement);
|
|
306
298
|
this.refractCache.set(cacheKey, referencedElement);
|
|
307
299
|
}
|
|
308
300
|
}
|
|
@@ -330,8 +322,9 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
330
322
|
});
|
|
331
323
|
const replacer = this.options.dereference.strategyOpts['asyncapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
332
324
|
const replacement = replacer(refElement);
|
|
333
|
-
|
|
334
|
-
|
|
325
|
+
this.indirections.pop();
|
|
326
|
+
path.replaceWith(replacement);
|
|
327
|
+
return;
|
|
335
328
|
}
|
|
336
329
|
}
|
|
337
330
|
|
|
@@ -357,9 +350,8 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
357
350
|
refractCache: this.refractCache,
|
|
358
351
|
ancestors: ancestorsLineage
|
|
359
352
|
});
|
|
360
|
-
referencedElement = await
|
|
361
|
-
|
|
362
|
-
nodeTypeGetter: getNodeType
|
|
353
|
+
referencedElement = await traverseAsync(referencedElement, visitor, {
|
|
354
|
+
mutable: true
|
|
363
355
|
});
|
|
364
356
|
|
|
365
357
|
// remove referencing reference from ancestors lineage
|
|
@@ -371,9 +363,9 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
371
363
|
* Creating a new version of Channel Item by merging fields from referenced Channel Item with referencing one.
|
|
372
364
|
*/
|
|
373
365
|
if (isChannelItemElement(referencedElement)) {
|
|
374
|
-
const mergedElement =
|
|
366
|
+
const mergedElement = cloneShallow(referencedElement);
|
|
375
367
|
// assign unique id to merged element
|
|
376
|
-
mergedElement.
|
|
368
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
377
369
|
// existing keywords from referencing ChannelItemElement overrides ones from referenced ChannelItemElement
|
|
378
370
|
referencingElement.forEach((value, keyElement, item) => {
|
|
379
371
|
mergedElement.remove(toValue(keyElement));
|
|
@@ -382,25 +374,20 @@ class AsyncAPI2DereferenceVisitor {
|
|
|
382
374
|
mergedElement.remove('$ref');
|
|
383
375
|
|
|
384
376
|
// annotate referenced element with info about original referencing element
|
|
385
|
-
mergedElement.
|
|
377
|
+
mergedElement.meta.set('ref-fields', {
|
|
386
378
|
$ref: toValue(referencingElement.$ref)
|
|
387
379
|
});
|
|
388
380
|
// annotate referenced with info about origin
|
|
389
|
-
mergedElement.
|
|
381
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
390
382
|
// annotate fragment with info about referencing element
|
|
391
|
-
mergedElement.
|
|
383
|
+
mergedElement.meta.set('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
|
|
392
384
|
referencedElement = mergedElement;
|
|
393
385
|
}
|
|
394
386
|
|
|
395
387
|
/**
|
|
396
388
|
* Transclude referencing element with merged referenced element.
|
|
397
389
|
*/
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
402
|
-
*/
|
|
403
|
-
return !parent ? referencedElement : undefined;
|
|
390
|
+
path.replaceWith(referencedElement);
|
|
404
391
|
}
|
|
405
392
|
}
|
|
406
393
|
export default AsyncAPI2DereferenceVisitor;
|
|
@@ -4,16 +4,14 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
|
|
|
4
4
|
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
|
|
5
5
|
exports.__esModule = true;
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
var
|
|
7
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
8
8
|
var _apidomNsOpenapi = _interopRequireWildcard(require("@speclynx/apidom-ns-openapi-2"));
|
|
9
|
+
var _apidomTraverse = require("@speclynx/apidom-traverse");
|
|
9
10
|
var _DereferenceStrategy = _interopRequireDefault(require("../DereferenceStrategy.cjs"));
|
|
10
11
|
var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
|
|
11
12
|
var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
|
|
12
13
|
var _visitor = _interopRequireDefault(require("./visitor.cjs"));
|
|
13
14
|
exports.OpenAPI2DereferenceVisitor = _visitor.default;
|
|
14
|
-
// @ts-ignore
|
|
15
|
-
const visitAsync = _apidomCore.visit[Symbol.for('nodejs.util.promisify.custom')];
|
|
16
|
-
|
|
17
15
|
/**
|
|
18
16
|
* @public
|
|
19
17
|
*/
|
|
@@ -38,7 +36,7 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy.default {
|
|
|
38
36
|
return (0, _apidomNsOpenapi.isSwaggerElement)(file.parseResult?.api);
|
|
39
37
|
}
|
|
40
38
|
async dereference(file, options) {
|
|
41
|
-
const namespace =
|
|
39
|
+
const namespace = new _apidomDatamodel.Namespace().use(_apidomNsOpenapi.default);
|
|
42
40
|
const immutableRefSet = options.dereference.refSet ?? new _ReferenceSet.default();
|
|
43
41
|
const mutableRefSet = new _ReferenceSet.default();
|
|
44
42
|
let refSet = immutableRefSet;
|
|
@@ -61,7 +59,7 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy.default {
|
|
|
61
59
|
if (options.dereference.immutable) {
|
|
62
60
|
immutableRefSet.refs.map(ref => new _Reference.default({
|
|
63
61
|
...ref,
|
|
64
|
-
value: (0,
|
|
62
|
+
value: (0, _apidomDatamodel.cloneDeep)(ref.value)
|
|
65
63
|
})).forEach(ref => mutableRefSet.add(ref));
|
|
66
64
|
reference = mutableRefSet.find(ref => ref.uri === file.uri);
|
|
67
65
|
refSet = mutableRefSet;
|
|
@@ -71,9 +69,8 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy.default {
|
|
|
71
69
|
namespace,
|
|
72
70
|
options
|
|
73
71
|
});
|
|
74
|
-
const dereferencedElement = await
|
|
75
|
-
|
|
76
|
-
nodeTypeGetter: _apidomNsOpenapi.getNodeType
|
|
72
|
+
const dereferencedElement = await (0, _apidomTraverse.traverseAsync)(refSet.rootRef.value, visitor, {
|
|
73
|
+
mutable: true
|
|
77
74
|
});
|
|
78
75
|
|
|
79
76
|
/**
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import openApi2Namespace, {
|
|
1
|
+
import { Namespace, cloneDeep } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import openApi2Namespace, { isSwaggerElement, mediaTypes } from '@speclynx/apidom-ns-openapi-2';
|
|
3
|
+
import { traverseAsync } from '@speclynx/apidom-traverse';
|
|
3
4
|
import DereferenceStrategy from "../DereferenceStrategy.mjs";
|
|
4
5
|
import Reference from "../../../Reference.mjs";
|
|
5
6
|
import ReferenceSet from "../../../ReferenceSet.mjs";
|
|
6
7
|
import OpenAPI2DereferenceVisitor from "./visitor.mjs";
|
|
7
|
-
// @ts-ignore
|
|
8
|
-
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
|
|
9
|
-
|
|
10
8
|
/**
|
|
11
9
|
* @public
|
|
12
10
|
*/
|
|
13
|
-
|
|
14
11
|
/**
|
|
15
12
|
* @public
|
|
16
13
|
*/
|
|
@@ -31,7 +28,7 @@ class OpenAPI2DereferenceStrategy extends DereferenceStrategy {
|
|
|
31
28
|
return isSwaggerElement(file.parseResult?.api);
|
|
32
29
|
}
|
|
33
30
|
async dereference(file, options) {
|
|
34
|
-
const namespace =
|
|
31
|
+
const namespace = new Namespace().use(openApi2Namespace);
|
|
35
32
|
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
|
|
36
33
|
const mutableRefSet = new ReferenceSet();
|
|
37
34
|
let refSet = immutableRefSet;
|
|
@@ -64,9 +61,8 @@ class OpenAPI2DereferenceStrategy extends DereferenceStrategy {
|
|
|
64
61
|
namespace,
|
|
65
62
|
options
|
|
66
63
|
});
|
|
67
|
-
const dereferencedElement = await
|
|
68
|
-
|
|
69
|
-
nodeTypeGetter: getNodeType
|
|
64
|
+
const dereferencedElement = await traverseAsync(refSet.rootRef.value, visitor, {
|
|
65
|
+
mutable: true
|
|
70
66
|
});
|
|
71
67
|
|
|
72
68
|
/**
|