@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 { RefElement, isPrimitiveElement, isStringElement,
|
|
2
|
+
import { RefElement, isPrimitiveElement, isStringElement, isElement, cloneShallow, cloneDeep } 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 { isReferenceElement, isJSONReferenceElement, isPathItemElement, isReferenceLikeElement, isJSONReferenceLikeElement, refract, refractReference, refractPathItem } from '@speclynx/apidom-ns-openapi-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 OpenAPI2DereferenceVisitor {
|
|
|
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 OpenAPI2DereferenceVisitor {
|
|
|
121
112
|
// ignore resolving internal Reference Objects
|
|
122
113
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
123
114
|
// skip traversing this reference element 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 element 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 OpenAPI2DereferenceVisitor {
|
|
|
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 OpenAPI2DereferenceVisitor {
|
|
|
181
175
|
});
|
|
182
176
|
const replacer = this.options.dereference.strategyOpts['openapi-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 OpenAPI2DereferenceVisitor {
|
|
|
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
|
|
@@ -223,38 +217,37 @@ class OpenAPI2DereferenceVisitor {
|
|
|
223
217
|
*/
|
|
224
218
|
const mergedElement = cloneShallow(referencedElement);
|
|
225
219
|
// assign unique id to merged element
|
|
226
|
-
mergedElement.
|
|
220
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
227
221
|
// annotate referenced element with info about original referencing element
|
|
228
|
-
mergedElement.
|
|
222
|
+
mergedElement.meta.set('ref-fields', {
|
|
229
223
|
// @ts-ignore
|
|
230
224
|
$ref: toValue(referencingElement.$ref)
|
|
231
225
|
});
|
|
232
226
|
// annotate fragment with info about origin
|
|
233
|
-
mergedElement.
|
|
227
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
234
228
|
// annotate fragment with info about referencing element
|
|
235
|
-
mergedElement.
|
|
229
|
+
mergedElement.meta.set('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
|
|
236
230
|
|
|
237
231
|
/**
|
|
238
232
|
* Transclude referencing element with merged referenced element.
|
|
239
233
|
*/
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
244
|
-
*/
|
|
245
|
-
return !parent ? mergedElement : false;
|
|
234
|
+
path.replaceWith(mergedElement);
|
|
235
|
+
return;
|
|
246
236
|
}
|
|
247
|
-
async PathItemElement(
|
|
237
|
+
async PathItemElement(path) {
|
|
238
|
+
const referencingElement = path.node;
|
|
239
|
+
|
|
248
240
|
// ignore PathItemElement without $ref field
|
|
249
241
|
if (!isStringElement(referencingElement.$ref)) {
|
|
250
|
-
return
|
|
242
|
+
return;
|
|
251
243
|
}
|
|
252
244
|
|
|
253
245
|
// skip current referencing element as it's already been access
|
|
254
246
|
if (this.indirections.includes(referencingElement)) {
|
|
255
|
-
|
|
247
|
+
path.skip();
|
|
248
|
+
return;
|
|
256
249
|
}
|
|
257
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
250
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
258
251
|
const retrievalURI = this.toBaseURI(toValue(referencingElement.$ref));
|
|
259
252
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
260
253
|
const isExternalReference = !isInternalReference;
|
|
@@ -262,12 +255,12 @@ class OpenAPI2DereferenceVisitor {
|
|
|
262
255
|
// ignore resolving internal Path Item Objects
|
|
263
256
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
264
257
|
// skip traversing this Path Item element but traverse all it's child elements
|
|
265
|
-
return
|
|
258
|
+
return;
|
|
266
259
|
}
|
|
267
260
|
// ignore resolving external Path Item Objects
|
|
268
261
|
if (!this.options.resolve.external && isExternalReference) {
|
|
269
262
|
// skip traversing this Path Item element but traverse all it's child elements
|
|
270
|
-
return
|
|
263
|
+
return;
|
|
271
264
|
}
|
|
272
265
|
const reference = await this.toReference(toValue(referencingElement.$ref));
|
|
273
266
|
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));
|
|
@@ -286,7 +279,7 @@ class OpenAPI2DereferenceVisitor {
|
|
|
286
279
|
if (this.refractCache.has(cacheKey)) {
|
|
287
280
|
referencedElement = this.refractCache.get(cacheKey);
|
|
288
281
|
} else {
|
|
289
|
-
referencedElement =
|
|
282
|
+
referencedElement = refractPathItem(referencedElement);
|
|
290
283
|
this.refractCache.set(cacheKey, referencedElement);
|
|
291
284
|
}
|
|
292
285
|
}
|
|
@@ -314,8 +307,9 @@ class OpenAPI2DereferenceVisitor {
|
|
|
314
307
|
});
|
|
315
308
|
const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
316
309
|
const replacement = replacer(refElement);
|
|
317
|
-
|
|
318
|
-
|
|
310
|
+
this.indirections.pop();
|
|
311
|
+
path.replaceWith(replacement);
|
|
312
|
+
return;
|
|
319
313
|
}
|
|
320
314
|
}
|
|
321
315
|
|
|
@@ -341,9 +335,8 @@ class OpenAPI2DereferenceVisitor {
|
|
|
341
335
|
refractCache: this.refractCache,
|
|
342
336
|
ancestors: ancestorsLineage
|
|
343
337
|
});
|
|
344
|
-
referencedElement = await
|
|
345
|
-
|
|
346
|
-
nodeTypeGetter: getNodeType
|
|
338
|
+
referencedElement = await traverseAsync(referencedElement, visitor, {
|
|
339
|
+
mutable: true
|
|
347
340
|
});
|
|
348
341
|
|
|
349
342
|
// remove referencing reference from ancestors lineage
|
|
@@ -353,9 +346,9 @@ class OpenAPI2DereferenceVisitor {
|
|
|
353
346
|
|
|
354
347
|
// merge fields from referenced Path Item with referencing one
|
|
355
348
|
if (isPathItemElement(referencedElement)) {
|
|
356
|
-
const mergedElement =
|
|
349
|
+
const mergedElement = cloneShallow(referencedElement);
|
|
357
350
|
// assign unique id to merged element
|
|
358
|
-
mergedElement.
|
|
351
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
359
352
|
// existing keywords from referencing PathItemElement overrides ones from referenced element
|
|
360
353
|
referencingElement.forEach((value, keyElement, item) => {
|
|
361
354
|
mergedElement.remove(toValue(keyElement));
|
|
@@ -364,32 +357,31 @@ class OpenAPI2DereferenceVisitor {
|
|
|
364
357
|
mergedElement.remove('$ref');
|
|
365
358
|
|
|
366
359
|
// annotate referenced element with info about original referencing element
|
|
367
|
-
mergedElement.
|
|
360
|
+
mergedElement.meta.set('ref-fields', {
|
|
368
361
|
$ref: toValue(referencingElement.$ref)
|
|
369
362
|
});
|
|
370
363
|
// annotate referenced element with info about origin
|
|
371
|
-
mergedElement.
|
|
364
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
372
365
|
// annotate fragment with info about referencing element
|
|
373
|
-
mergedElement.
|
|
366
|
+
mergedElement.meta.set('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
|
|
374
367
|
referencedElement = mergedElement;
|
|
375
368
|
}
|
|
376
369
|
|
|
377
370
|
/**
|
|
378
371
|
* Transclude referencing element with merged referenced element.
|
|
379
372
|
*/
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
384
|
-
*/
|
|
385
|
-
return !parent ? referencedElement : undefined;
|
|
373
|
+
path.replaceWith(referencedElement);
|
|
374
|
+
return;
|
|
386
375
|
}
|
|
387
|
-
async JSONReferenceElement(
|
|
376
|
+
async JSONReferenceElement(path) {
|
|
377
|
+
const referencingElement = path.node;
|
|
378
|
+
|
|
388
379
|
// skip current referencing element as it's already been access
|
|
389
380
|
if (this.indirections.includes(referencingElement)) {
|
|
390
|
-
|
|
381
|
+
path.skip();
|
|
382
|
+
return;
|
|
391
383
|
}
|
|
392
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
384
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
393
385
|
const retrievalURI = this.toBaseURI(toValue(referencingElement.$ref));
|
|
394
386
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
395
387
|
const isExternalReference = !isInternalReference;
|
|
@@ -397,12 +389,14 @@ class OpenAPI2DereferenceVisitor {
|
|
|
397
389
|
// ignore resolving internal JSONReference Objects
|
|
398
390
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
399
391
|
// skip traversing this JSONReference element and all it's child elements
|
|
400
|
-
|
|
392
|
+
path.skip();
|
|
393
|
+
return;
|
|
401
394
|
}
|
|
402
395
|
// ignore resolving external JSONReference Objects
|
|
403
396
|
if (!this.options.resolve.external && isExternalReference) {
|
|
404
397
|
// skip traversing this JSONReference element and all it's child elements
|
|
405
|
-
|
|
398
|
+
path.skip();
|
|
399
|
+
return;
|
|
406
400
|
}
|
|
407
401
|
const reference = await this.toReference(toValue(referencingElement.$ref));
|
|
408
402
|
const $refBaseURI = url.resolve(retrievalURI, toValue(referencingElement.$ref));
|
|
@@ -423,13 +417,14 @@ class OpenAPI2DereferenceVisitor {
|
|
|
423
417
|
referencedElement = this.refractCache.get(cacheKey);
|
|
424
418
|
} else if (isJSONReferenceLikeElement(referencedElement)) {
|
|
425
419
|
// handling indirect references
|
|
426
|
-
referencedElement =
|
|
427
|
-
referencedElement.
|
|
420
|
+
referencedElement = refractReference(toValue(referencedElement));
|
|
421
|
+
referencedElement.meta.set('referenced-element', referencedElementType);
|
|
428
422
|
this.refractCache.set(cacheKey, referencedElement);
|
|
429
423
|
} else {
|
|
430
424
|
// handling direct references
|
|
431
|
-
|
|
432
|
-
|
|
425
|
+
referencedElement = refract(toValue(referencedElement), {
|
|
426
|
+
element: referencedElementType
|
|
427
|
+
});
|
|
433
428
|
this.refractCache.set(cacheKey, referencedElement);
|
|
434
429
|
}
|
|
435
430
|
}
|
|
@@ -457,8 +452,9 @@ class OpenAPI2DereferenceVisitor {
|
|
|
457
452
|
});
|
|
458
453
|
const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
459
454
|
const replacement = replacer(refElement);
|
|
460
|
-
|
|
461
|
-
|
|
455
|
+
this.indirections.pop();
|
|
456
|
+
path.replaceWith(replacement);
|
|
457
|
+
return;
|
|
462
458
|
}
|
|
463
459
|
}
|
|
464
460
|
|
|
@@ -484,9 +480,8 @@ class OpenAPI2DereferenceVisitor {
|
|
|
484
480
|
refractCache: this.refractCache,
|
|
485
481
|
ancestors: ancestorsLineage
|
|
486
482
|
});
|
|
487
|
-
referencedElement = await
|
|
488
|
-
|
|
489
|
-
nodeTypeGetter: getNodeType
|
|
483
|
+
referencedElement = await traverseAsync(referencedElement, visitor, {
|
|
484
|
+
mutable: true
|
|
490
485
|
});
|
|
491
486
|
|
|
492
487
|
// remove referencing reference from ancestors lineage
|
|
@@ -499,26 +494,22 @@ class OpenAPI2DereferenceVisitor {
|
|
|
499
494
|
*/
|
|
500
495
|
const mergedElement = cloneShallow(referencedElement);
|
|
501
496
|
// assign unique id to merged element
|
|
502
|
-
mergedElement.
|
|
497
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
503
498
|
// annotate referenced element with info about original referencing element
|
|
504
|
-
mergedElement.
|
|
499
|
+
mergedElement.meta.set('ref-fields', {
|
|
505
500
|
// @ts-ignore
|
|
506
501
|
$ref: toValue(referencingElement.$ref)
|
|
507
502
|
});
|
|
508
503
|
// annotate fragment with info about origin
|
|
509
|
-
mergedElement.
|
|
504
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
510
505
|
// annotate fragment with info about referencing element
|
|
511
|
-
mergedElement.
|
|
506
|
+
mergedElement.meta.set('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
|
|
512
507
|
|
|
513
508
|
/**
|
|
514
509
|
* Transclude referencing element with merged referenced element.
|
|
515
510
|
*/
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
520
|
-
*/
|
|
521
|
-
return !parent ? mergedElement : false;
|
|
511
|
+
path.replaceWith(mergedElement);
|
|
512
|
+
return;
|
|
522
513
|
}
|
|
523
514
|
}
|
|
524
515
|
export default OpenAPI2DereferenceVisitor;
|
|
@@ -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
|
+
var _apidomTraverse = require("@speclynx/apidom-traverse");
|
|
8
9
|
var _apidomNsOpenapi = _interopRequireWildcard(require("@speclynx/apidom-ns-openapi-3-0"));
|
|
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.OpenAPI3_0DereferenceVisitor = _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 OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy.default {
|
|
|
38
36
|
return (0, _apidomNsOpenapi.isOpenApi3_0Element)(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;
|
|
@@ -63,7 +61,7 @@ class OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy.default {
|
|
|
63
61
|
if (options.dereference.immutable) {
|
|
64
62
|
immutableRefSet.refs.map(ref => new _Reference.default({
|
|
65
63
|
...ref,
|
|
66
|
-
value: (0,
|
|
64
|
+
value: (0, _apidomDatamodel.cloneDeep)(ref.value)
|
|
67
65
|
})).forEach(ref => mutableRefSet.add(ref));
|
|
68
66
|
reference = mutableRefSet.find(ref => ref.uri === file.uri);
|
|
69
67
|
refSet = mutableRefSet;
|
|
@@ -73,9 +71,8 @@ class OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy.default {
|
|
|
73
71
|
namespace,
|
|
74
72
|
options
|
|
75
73
|
});
|
|
76
|
-
const dereferencedElement = await
|
|
77
|
-
|
|
78
|
-
nodeTypeGetter: _apidomNsOpenapi.getNodeType
|
|
74
|
+
const dereferencedElement = await (0, _apidomTraverse.traverseAsync)(refSet.rootRef.value, visitor, {
|
|
75
|
+
mutable: true
|
|
79
76
|
});
|
|
80
77
|
|
|
81
78
|
/**
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import { Namespace, cloneDeep } from '@speclynx/apidom-datamodel';
|
|
2
|
+
import { traverseAsync } from '@speclynx/apidom-traverse';
|
|
3
|
+
import openApi3_0Namespace, { isOpenApi3_0Element, mediaTypes } from '@speclynx/apidom-ns-openapi-3-0';
|
|
3
4
|
import DereferenceStrategy from "../DereferenceStrategy.mjs";
|
|
4
5
|
import Reference from "../../../Reference.mjs";
|
|
5
6
|
import ReferenceSet from "../../../ReferenceSet.mjs";
|
|
6
7
|
import OpenAPI3_0DereferenceVisitor 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 OpenAPI3_0DereferenceStrategy extends DereferenceStrategy {
|
|
|
31
28
|
return isOpenApi3_0Element(file.parseResult?.api);
|
|
32
29
|
}
|
|
33
30
|
async dereference(file, options) {
|
|
34
|
-
const namespace =
|
|
31
|
+
const namespace = new Namespace().use(openApi3_0Namespace);
|
|
35
32
|
const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
|
|
36
33
|
const mutableRefSet = new ReferenceSet();
|
|
37
34
|
let refSet = immutableRefSet;
|
|
@@ -66,9 +63,8 @@ class OpenAPI3_0DereferenceStrategy extends DereferenceStrategy {
|
|
|
66
63
|
namespace,
|
|
67
64
|
options
|
|
68
65
|
});
|
|
69
|
-
const dereferencedElement = await
|
|
70
|
-
|
|
71
|
-
nodeTypeGetter: getNodeType
|
|
66
|
+
const dereferencedElement = await traverseAsync(refSet.rootRef.value, visitor, {
|
|
67
|
+
mutable: true
|
|
72
68
|
});
|
|
73
69
|
|
|
74
70
|
/**
|