@speclynx/apidom-reference 1.12.2 → 2.1.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 +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 +29265 -23972
- 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
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
|
|
4
4
|
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
5
5
|
exports.__esModule = true;
|
|
6
|
-
exports.
|
|
6
|
+
exports.default = void 0;
|
|
7
7
|
var _ramda = require("ramda");
|
|
8
|
+
var _apidomDatamodel = require("@speclynx/apidom-datamodel");
|
|
8
9
|
var _apidomCore = require("@speclynx/apidom-core");
|
|
9
10
|
var _apidomError = require("@speclynx/apidom-error");
|
|
11
|
+
var _apidomTraverse = require("@speclynx/apidom-traverse");
|
|
10
12
|
var _apidomJsonPointer = require("@speclynx/apidom-json-pointer");
|
|
11
13
|
var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-2");
|
|
12
14
|
var _MaximumDereferenceDepthError = _interopRequireDefault(require("../../../errors/MaximumDereferenceDepthError.cjs"));
|
|
@@ -15,28 +17,13 @@ var _util = require("../../util.cjs");
|
|
|
15
17
|
var url = _interopRequireWildcard(require("../../../util/url.cjs"));
|
|
16
18
|
var _index = _interopRequireDefault(require("../../../parse/index.cjs"));
|
|
17
19
|
var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
|
|
18
|
-
// @ts-ignore
|
|
19
|
-
const visitAsync = _apidomCore.visit[Symbol.for('nodejs.util.promisify.custom')];
|
|
20
|
-
|
|
21
20
|
// initialize element identity manager
|
|
22
21
|
const identityManager = new _apidomCore.IdentityManager();
|
|
23
22
|
|
|
24
23
|
/**
|
|
25
|
-
* Custom mutation replacer.
|
|
26
24
|
* @public
|
|
27
25
|
*/
|
|
28
|
-
const mutationReplacer = (newElement, oldElement, key, parent) => {
|
|
29
|
-
if ((0, _apidomCore.isMemberElement)(parent)) {
|
|
30
|
-
parent.value = newElement;
|
|
31
|
-
} else if (Array.isArray(parent)) {
|
|
32
|
-
parent[key] = newElement;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
26
|
|
|
36
|
-
/**
|
|
37
|
-
* @public
|
|
38
|
-
*/
|
|
39
|
-
exports.mutationReplacer = mutationReplacer;
|
|
40
27
|
/**
|
|
41
28
|
* @public
|
|
42
29
|
*/
|
|
@@ -90,7 +77,7 @@ class OpenAPI2DereferenceVisitor {
|
|
|
90
77
|
// register new mutable reference with a refSet
|
|
91
78
|
const mutableReference = new _Reference.default({
|
|
92
79
|
uri: baseURI,
|
|
93
|
-
value: (0,
|
|
80
|
+
value: (0, _apidomDatamodel.cloneDeep)(parseResult),
|
|
94
81
|
depth: this.reference.depth + 1
|
|
95
82
|
});
|
|
96
83
|
refSet.add(mutableReference);
|
|
@@ -105,21 +92,25 @@ class OpenAPI2DereferenceVisitor {
|
|
|
105
92
|
}
|
|
106
93
|
return mutableReference;
|
|
107
94
|
}
|
|
108
|
-
toAncestorLineage(
|
|
95
|
+
toAncestorLineage(path) {
|
|
109
96
|
/**
|
|
110
97
|
* Compute full ancestors lineage.
|
|
111
98
|
* Ancestors are flatten to unwrap all Element instances.
|
|
112
99
|
*/
|
|
113
|
-
const
|
|
100
|
+
const ancestorNodes = path.getAncestorNodes();
|
|
101
|
+
const directAncestors = new Set(ancestorNodes.filter(_apidomDatamodel.isElement));
|
|
114
102
|
const ancestorsLineage = new _util.AncestorLineage(...this.ancestors, directAncestors);
|
|
115
103
|
return [ancestorsLineage, directAncestors];
|
|
116
104
|
}
|
|
117
|
-
async ReferenceElement(
|
|
105
|
+
async ReferenceElement(path) {
|
|
106
|
+
const referencingElement = path.node;
|
|
107
|
+
|
|
118
108
|
// skip current referencing element as it's already been access
|
|
119
109
|
if (this.indirections.includes(referencingElement)) {
|
|
120
|
-
|
|
110
|
+
path.skip();
|
|
111
|
+
return;
|
|
121
112
|
}
|
|
122
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
113
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
123
114
|
const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
|
|
124
115
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
125
116
|
const isExternalReference = !isInternalReference;
|
|
@@ -127,12 +118,14 @@ class OpenAPI2DereferenceVisitor {
|
|
|
127
118
|
// ignore resolving internal Reference Objects
|
|
128
119
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
129
120
|
// skip traversing this reference element and all it's child elements
|
|
130
|
-
|
|
121
|
+
path.skip();
|
|
122
|
+
return;
|
|
131
123
|
}
|
|
132
124
|
// ignore resolving external Reference Objects
|
|
133
125
|
if (!this.options.resolve.external && isExternalReference) {
|
|
134
126
|
// skip traversing this reference element and all it's child elements
|
|
135
|
-
|
|
127
|
+
path.skip();
|
|
128
|
+
return;
|
|
136
129
|
}
|
|
137
130
|
const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
|
|
138
131
|
const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
|
|
@@ -146,20 +139,21 @@ class OpenAPI2DereferenceVisitor {
|
|
|
146
139
|
/**
|
|
147
140
|
* Applying semantics to a referenced element if semantics are missing.
|
|
148
141
|
*/
|
|
149
|
-
if ((0,
|
|
142
|
+
if ((0, _apidomDatamodel.isPrimitiveElement)(referencedElement)) {
|
|
150
143
|
const referencedElementType = (0, _apidomCore.toValue)(referencingElement.meta.get('referenced-element'));
|
|
151
144
|
const cacheKey = `${referencedElementType}-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
|
|
152
145
|
if (this.refractCache.has(cacheKey)) {
|
|
153
146
|
referencedElement = this.refractCache.get(cacheKey);
|
|
154
147
|
} else if ((0, _apidomNsOpenapi.isReferenceLikeElement)(referencedElement)) {
|
|
155
148
|
// handling indirect references
|
|
156
|
-
referencedElement = _apidomNsOpenapi.
|
|
157
|
-
referencedElement.
|
|
149
|
+
referencedElement = (0, _apidomNsOpenapi.refractReference)(referencedElement);
|
|
150
|
+
referencedElement.meta.set('referenced-element', referencedElementType);
|
|
158
151
|
this.refractCache.set(cacheKey, referencedElement);
|
|
159
152
|
} else {
|
|
160
153
|
// handling direct references
|
|
161
|
-
|
|
162
|
-
|
|
154
|
+
referencedElement = (0, _apidomNsOpenapi.refract)(referencedElement, {
|
|
155
|
+
element: referencedElementType
|
|
156
|
+
});
|
|
163
157
|
this.refractCache.set(cacheKey, referencedElement);
|
|
164
158
|
}
|
|
165
159
|
}
|
|
@@ -180,15 +174,16 @@ class OpenAPI2DereferenceVisitor {
|
|
|
180
174
|
if (this.options.dereference.circular === 'error') {
|
|
181
175
|
throw new _apidomError.ApiDOMError('Circular reference detected');
|
|
182
176
|
} else if (this.options.dereference.circular === 'replace') {
|
|
183
|
-
const refElement = new
|
|
177
|
+
const refElement = new _apidomDatamodel.RefElement(referencedElement.id, {
|
|
184
178
|
type: 'reference',
|
|
185
179
|
uri: reference.uri,
|
|
186
180
|
$ref: (0, _apidomCore.toValue)(referencingElement.$ref)
|
|
187
181
|
});
|
|
188
182
|
const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
189
183
|
const replacement = replacer(refElement);
|
|
190
|
-
|
|
191
|
-
|
|
184
|
+
this.indirections.pop();
|
|
185
|
+
path.replaceWith(replacement);
|
|
186
|
+
return;
|
|
192
187
|
}
|
|
193
188
|
}
|
|
194
189
|
|
|
@@ -214,9 +209,8 @@ class OpenAPI2DereferenceVisitor {
|
|
|
214
209
|
refractCache: this.refractCache,
|
|
215
210
|
ancestors: ancestorsLineage
|
|
216
211
|
});
|
|
217
|
-
referencedElement = await
|
|
218
|
-
|
|
219
|
-
nodeTypeGetter: _apidomNsOpenapi.getNodeType
|
|
212
|
+
referencedElement = await (0, _apidomTraverse.traverseAsync)(referencedElement, visitor, {
|
|
213
|
+
mutable: true
|
|
220
214
|
});
|
|
221
215
|
|
|
222
216
|
// remove referencing reference from ancestors lineage
|
|
@@ -227,40 +221,39 @@ class OpenAPI2DereferenceVisitor {
|
|
|
227
221
|
/**
|
|
228
222
|
* Creating a new version of referenced element to avoid modifying the original one.
|
|
229
223
|
*/
|
|
230
|
-
const mergedElement = (0,
|
|
224
|
+
const mergedElement = (0, _apidomDatamodel.cloneShallow)(referencedElement);
|
|
231
225
|
// assign unique id to merged element
|
|
232
|
-
mergedElement.
|
|
226
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
233
227
|
// annotate referenced element with info about original referencing element
|
|
234
|
-
mergedElement.
|
|
228
|
+
mergedElement.meta.set('ref-fields', {
|
|
235
229
|
// @ts-ignore
|
|
236
230
|
$ref: (0, _apidomCore.toValue)(referencingElement.$ref)
|
|
237
231
|
});
|
|
238
232
|
// annotate fragment with info about origin
|
|
239
|
-
mergedElement.
|
|
233
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
240
234
|
// annotate fragment with info about referencing element
|
|
241
|
-
mergedElement.
|
|
235
|
+
mergedElement.meta.set('ref-referencing-element-id', (0, _apidomDatamodel.cloneDeep)(identityManager.identify(referencingElement)));
|
|
242
236
|
|
|
243
237
|
/**
|
|
244
238
|
* Transclude referencing element with merged referenced element.
|
|
245
239
|
*/
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
250
|
-
*/
|
|
251
|
-
return !parent ? mergedElement : false;
|
|
240
|
+
path.replaceWith(mergedElement);
|
|
241
|
+
return;
|
|
252
242
|
}
|
|
253
|
-
async PathItemElement(
|
|
243
|
+
async PathItemElement(path) {
|
|
244
|
+
const referencingElement = path.node;
|
|
245
|
+
|
|
254
246
|
// ignore PathItemElement without $ref field
|
|
255
|
-
if (!(0,
|
|
256
|
-
return
|
|
247
|
+
if (!(0, _apidomDatamodel.isStringElement)(referencingElement.$ref)) {
|
|
248
|
+
return;
|
|
257
249
|
}
|
|
258
250
|
|
|
259
251
|
// skip current referencing element as it's already been access
|
|
260
252
|
if (this.indirections.includes(referencingElement)) {
|
|
261
|
-
|
|
253
|
+
path.skip();
|
|
254
|
+
return;
|
|
262
255
|
}
|
|
263
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
256
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
264
257
|
const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
|
|
265
258
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
266
259
|
const isExternalReference = !isInternalReference;
|
|
@@ -268,12 +261,12 @@ class OpenAPI2DereferenceVisitor {
|
|
|
268
261
|
// ignore resolving internal Path Item Objects
|
|
269
262
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
270
263
|
// skip traversing this Path Item element but traverse all it's child elements
|
|
271
|
-
return
|
|
264
|
+
return;
|
|
272
265
|
}
|
|
273
266
|
// ignore resolving external Path Item Objects
|
|
274
267
|
if (!this.options.resolve.external && isExternalReference) {
|
|
275
268
|
// skip traversing this Path Item element but traverse all it's child elements
|
|
276
|
-
return
|
|
269
|
+
return;
|
|
277
270
|
}
|
|
278
271
|
const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
|
|
279
272
|
const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
|
|
@@ -287,12 +280,12 @@ class OpenAPI2DereferenceVisitor {
|
|
|
287
280
|
/**
|
|
288
281
|
* Applying semantics to a referenced element if semantics are missing.
|
|
289
282
|
*/
|
|
290
|
-
if ((0,
|
|
283
|
+
if ((0, _apidomDatamodel.isPrimitiveElement)(referencedElement)) {
|
|
291
284
|
const cacheKey = `pathItem-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
|
|
292
285
|
if (this.refractCache.has(cacheKey)) {
|
|
293
286
|
referencedElement = this.refractCache.get(cacheKey);
|
|
294
287
|
} else {
|
|
295
|
-
referencedElement = _apidomNsOpenapi.
|
|
288
|
+
referencedElement = (0, _apidomNsOpenapi.refractPathItem)(referencedElement);
|
|
296
289
|
this.refractCache.set(cacheKey, referencedElement);
|
|
297
290
|
}
|
|
298
291
|
}
|
|
@@ -313,15 +306,16 @@ class OpenAPI2DereferenceVisitor {
|
|
|
313
306
|
if (this.options.dereference.circular === 'error') {
|
|
314
307
|
throw new _apidomError.ApiDOMError('Circular reference detected');
|
|
315
308
|
} else if (this.options.dereference.circular === 'replace') {
|
|
316
|
-
const refElement = new
|
|
309
|
+
const refElement = new _apidomDatamodel.RefElement(referencedElement.id, {
|
|
317
310
|
type: 'path-item',
|
|
318
311
|
uri: reference.uri,
|
|
319
312
|
$ref: (0, _apidomCore.toValue)(referencingElement.$ref)
|
|
320
313
|
});
|
|
321
314
|
const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
322
315
|
const replacement = replacer(refElement);
|
|
323
|
-
|
|
324
|
-
|
|
316
|
+
this.indirections.pop();
|
|
317
|
+
path.replaceWith(replacement);
|
|
318
|
+
return;
|
|
325
319
|
}
|
|
326
320
|
}
|
|
327
321
|
|
|
@@ -336,7 +330,7 @@ class OpenAPI2DereferenceVisitor {
|
|
|
336
330
|
*/
|
|
337
331
|
const isNonEntryDocument = url.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
|
|
338
332
|
const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
|
|
339
|
-
if ((isExternalReference || isNonEntryDocument || (0, _apidomNsOpenapi.isPathItemElement)(referencedElement) && (0,
|
|
333
|
+
if ((isExternalReference || isNonEntryDocument || (0, _apidomNsOpenapi.isPathItemElement)(referencedElement) && (0, _apidomDatamodel.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
|
|
340
334
|
// append referencing reference to ancestors lineage
|
|
341
335
|
directAncestors.add(referencingElement);
|
|
342
336
|
const visitor = new OpenAPI2DereferenceVisitor({
|
|
@@ -347,9 +341,8 @@ class OpenAPI2DereferenceVisitor {
|
|
|
347
341
|
refractCache: this.refractCache,
|
|
348
342
|
ancestors: ancestorsLineage
|
|
349
343
|
});
|
|
350
|
-
referencedElement = await
|
|
351
|
-
|
|
352
|
-
nodeTypeGetter: _apidomNsOpenapi.getNodeType
|
|
344
|
+
referencedElement = await (0, _apidomTraverse.traverseAsync)(referencedElement, visitor, {
|
|
345
|
+
mutable: true
|
|
353
346
|
});
|
|
354
347
|
|
|
355
348
|
// remove referencing reference from ancestors lineage
|
|
@@ -359,9 +352,9 @@ class OpenAPI2DereferenceVisitor {
|
|
|
359
352
|
|
|
360
353
|
// merge fields from referenced Path Item with referencing one
|
|
361
354
|
if ((0, _apidomNsOpenapi.isPathItemElement)(referencedElement)) {
|
|
362
|
-
const mergedElement =
|
|
355
|
+
const mergedElement = (0, _apidomDatamodel.cloneShallow)(referencedElement);
|
|
363
356
|
// assign unique id to merged element
|
|
364
|
-
mergedElement.
|
|
357
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
365
358
|
// existing keywords from referencing PathItemElement overrides ones from referenced element
|
|
366
359
|
referencingElement.forEach((value, keyElement, item) => {
|
|
367
360
|
mergedElement.remove((0, _apidomCore.toValue)(keyElement));
|
|
@@ -370,32 +363,31 @@ class OpenAPI2DereferenceVisitor {
|
|
|
370
363
|
mergedElement.remove('$ref');
|
|
371
364
|
|
|
372
365
|
// annotate referenced element with info about original referencing element
|
|
373
|
-
mergedElement.
|
|
366
|
+
mergedElement.meta.set('ref-fields', {
|
|
374
367
|
$ref: (0, _apidomCore.toValue)(referencingElement.$ref)
|
|
375
368
|
});
|
|
376
369
|
// annotate referenced element with info about origin
|
|
377
|
-
mergedElement.
|
|
370
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
378
371
|
// annotate fragment with info about referencing element
|
|
379
|
-
mergedElement.
|
|
372
|
+
mergedElement.meta.set('ref-referencing-element-id', (0, _apidomDatamodel.cloneDeep)(identityManager.identify(referencingElement)));
|
|
380
373
|
referencedElement = mergedElement;
|
|
381
374
|
}
|
|
382
375
|
|
|
383
376
|
/**
|
|
384
377
|
* Transclude referencing element with merged referenced element.
|
|
385
378
|
*/
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
/**
|
|
389
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
390
|
-
*/
|
|
391
|
-
return !parent ? referencedElement : undefined;
|
|
379
|
+
path.replaceWith(referencedElement);
|
|
380
|
+
return;
|
|
392
381
|
}
|
|
393
|
-
async JSONReferenceElement(
|
|
382
|
+
async JSONReferenceElement(path) {
|
|
383
|
+
const referencingElement = path.node;
|
|
384
|
+
|
|
394
385
|
// skip current referencing element as it's already been access
|
|
395
386
|
if (this.indirections.includes(referencingElement)) {
|
|
396
|
-
|
|
387
|
+
path.skip();
|
|
388
|
+
return;
|
|
397
389
|
}
|
|
398
|
-
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(
|
|
390
|
+
const [ancestorsLineage, directAncestors] = this.toAncestorLineage(path);
|
|
399
391
|
const retrievalURI = this.toBaseURI((0, _apidomCore.toValue)(referencingElement.$ref));
|
|
400
392
|
const isInternalReference = url.stripHash(this.reference.uri) === retrievalURI;
|
|
401
393
|
const isExternalReference = !isInternalReference;
|
|
@@ -403,12 +395,14 @@ class OpenAPI2DereferenceVisitor {
|
|
|
403
395
|
// ignore resolving internal JSONReference Objects
|
|
404
396
|
if (!this.options.resolve.internal && isInternalReference) {
|
|
405
397
|
// skip traversing this JSONReference element and all it's child elements
|
|
406
|
-
|
|
398
|
+
path.skip();
|
|
399
|
+
return;
|
|
407
400
|
}
|
|
408
401
|
// ignore resolving external JSONReference Objects
|
|
409
402
|
if (!this.options.resolve.external && isExternalReference) {
|
|
410
403
|
// skip traversing this JSONReference element and all it's child elements
|
|
411
|
-
|
|
404
|
+
path.skip();
|
|
405
|
+
return;
|
|
412
406
|
}
|
|
413
407
|
const reference = await this.toReference((0, _apidomCore.toValue)(referencingElement.$ref));
|
|
414
408
|
const $refBaseURI = url.resolve(retrievalURI, (0, _apidomCore.toValue)(referencingElement.$ref));
|
|
@@ -422,20 +416,21 @@ class OpenAPI2DereferenceVisitor {
|
|
|
422
416
|
/**
|
|
423
417
|
* Applying semantics to a referenced element if semantics are missing.
|
|
424
418
|
*/
|
|
425
|
-
if ((0,
|
|
419
|
+
if ((0, _apidomDatamodel.isPrimitiveElement)(referencedElement)) {
|
|
426
420
|
const referencedElementType = (0, _apidomCore.toValue)(referencingElement.meta.get('referenced-element'));
|
|
427
421
|
const cacheKey = `path-item-${(0, _apidomCore.toValue)(identityManager.identify(referencedElement))}`;
|
|
428
422
|
if (this.refractCache.has(cacheKey)) {
|
|
429
423
|
referencedElement = this.refractCache.get(cacheKey);
|
|
430
424
|
} else if ((0, _apidomNsOpenapi.isJSONReferenceLikeElement)(referencedElement)) {
|
|
431
425
|
// handling indirect references
|
|
432
|
-
referencedElement = _apidomNsOpenapi.
|
|
433
|
-
referencedElement.
|
|
426
|
+
referencedElement = (0, _apidomNsOpenapi.refractReference)((0, _apidomCore.toValue)(referencedElement));
|
|
427
|
+
referencedElement.meta.set('referenced-element', referencedElementType);
|
|
434
428
|
this.refractCache.set(cacheKey, referencedElement);
|
|
435
429
|
} else {
|
|
436
430
|
// handling direct references
|
|
437
|
-
|
|
438
|
-
|
|
431
|
+
referencedElement = (0, _apidomNsOpenapi.refract)((0, _apidomCore.toValue)(referencedElement), {
|
|
432
|
+
element: referencedElementType
|
|
433
|
+
});
|
|
439
434
|
this.refractCache.set(cacheKey, referencedElement);
|
|
440
435
|
}
|
|
441
436
|
}
|
|
@@ -456,15 +451,16 @@ class OpenAPI2DereferenceVisitor {
|
|
|
456
451
|
if (this.options.dereference.circular === 'error') {
|
|
457
452
|
throw new _apidomError.ApiDOMError('Circular reference detected');
|
|
458
453
|
} else if (this.options.dereference.circular === 'replace') {
|
|
459
|
-
const refElement = new
|
|
454
|
+
const refElement = new _apidomDatamodel.RefElement(referencedElement.id, {
|
|
460
455
|
type: 'json-reference',
|
|
461
456
|
uri: reference.uri,
|
|
462
457
|
$ref: (0, _apidomCore.toValue)(referencingElement.$ref)
|
|
463
458
|
});
|
|
464
459
|
const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
|
|
465
460
|
const replacement = replacer(refElement);
|
|
466
|
-
|
|
467
|
-
|
|
461
|
+
this.indirections.pop();
|
|
462
|
+
path.replaceWith(replacement);
|
|
463
|
+
return;
|
|
468
464
|
}
|
|
469
465
|
}
|
|
470
466
|
|
|
@@ -490,9 +486,8 @@ class OpenAPI2DereferenceVisitor {
|
|
|
490
486
|
refractCache: this.refractCache,
|
|
491
487
|
ancestors: ancestorsLineage
|
|
492
488
|
});
|
|
493
|
-
referencedElement = await
|
|
494
|
-
|
|
495
|
-
nodeTypeGetter: _apidomNsOpenapi.getNodeType
|
|
489
|
+
referencedElement = await (0, _apidomTraverse.traverseAsync)(referencedElement, visitor, {
|
|
490
|
+
mutable: true
|
|
496
491
|
});
|
|
497
492
|
|
|
498
493
|
// remove referencing reference from ancestors lineage
|
|
@@ -503,28 +498,24 @@ class OpenAPI2DereferenceVisitor {
|
|
|
503
498
|
/**
|
|
504
499
|
* Creating a new version of referenced element to avoid modifying the original one.
|
|
505
500
|
*/
|
|
506
|
-
const mergedElement = (0,
|
|
501
|
+
const mergedElement = (0, _apidomDatamodel.cloneShallow)(referencedElement);
|
|
507
502
|
// assign unique id to merged element
|
|
508
|
-
mergedElement.
|
|
503
|
+
mergedElement.meta.set('id', identityManager.generateId());
|
|
509
504
|
// annotate referenced element with info about original referencing element
|
|
510
|
-
mergedElement.
|
|
505
|
+
mergedElement.meta.set('ref-fields', {
|
|
511
506
|
// @ts-ignore
|
|
512
507
|
$ref: (0, _apidomCore.toValue)(referencingElement.$ref)
|
|
513
508
|
});
|
|
514
509
|
// annotate fragment with info about origin
|
|
515
|
-
mergedElement.
|
|
510
|
+
mergedElement.meta.set('ref-origin', reference.uri);
|
|
516
511
|
// annotate fragment with info about referencing element
|
|
517
|
-
mergedElement.
|
|
512
|
+
mergedElement.meta.set('ref-referencing-element-id', (0, _apidomDatamodel.cloneDeep)(identityManager.identify(referencingElement)));
|
|
518
513
|
|
|
519
514
|
/**
|
|
520
515
|
* Transclude referencing element with merged referenced element.
|
|
521
516
|
*/
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
/**
|
|
525
|
-
* We're at the root of the tree, so we're just replacing the entire tree.
|
|
526
|
-
*/
|
|
527
|
-
return !parent ? mergedElement : false;
|
|
517
|
+
path.replaceWith(mergedElement);
|
|
518
|
+
return;
|
|
528
519
|
}
|
|
529
520
|
}
|
|
530
521
|
var _default = exports.default = OpenAPI2DereferenceVisitor;
|