@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.
Files changed (112) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/NOTICE +16 -7
  3. package/README.md +0 -33
  4. package/dist/167.apidom-reference.browser.min.js +1 -1
  5. package/dist/451.apidom-reference.browser.min.js +1 -1
  6. package/dist/apidom-reference.browser.js +29265 -23972
  7. package/dist/apidom-reference.browser.min.js +1 -1
  8. package/package.json +24 -57
  9. package/src/configuration/saturated.cjs +34 -42
  10. package/src/configuration/saturated.mjs +0 -8
  11. package/src/dereference/index.cjs +4 -4
  12. package/src/dereference/index.mjs +1 -1
  13. package/src/dereference/strategies/apidom/index.cjs +7 -7
  14. package/src/dereference/strategies/apidom/index.mjs +5 -6
  15. package/src/dereference/strategies/apidom/selectors/element-id.cjs +4 -2
  16. package/src/dereference/strategies/apidom/selectors/element-id.mjs +5 -3
  17. package/src/dereference/strategies/apidom/visitor.cjs +31 -17
  18. package/src/dereference/strategies/apidom/visitor.mjs +25 -12
  19. package/src/dereference/strategies/asyncapi-2/index.cjs +6 -9
  20. package/src/dereference/strategies/asyncapi-2/index.mjs +6 -10
  21. package/src/dereference/strategies/asyncapi-2/visitor.cjs +67 -80
  22. package/src/dereference/strategies/asyncapi-2/visitor.mjs +59 -72
  23. package/src/dereference/strategies/openapi-2/index.cjs +6 -9
  24. package/src/dereference/strategies/openapi-2/index.mjs +6 -10
  25. package/src/dereference/strategies/openapi-2/visitor.cjs +91 -100
  26. package/src/dereference/strategies/openapi-2/visitor.mjs +81 -90
  27. package/src/dereference/strategies/openapi-3-0/index.cjs +6 -9
  28. package/src/dereference/strategies/openapi-3-0/index.mjs +6 -10
  29. package/src/dereference/strategies/openapi-3-0/visitor.cjs +92 -115
  30. package/src/dereference/strategies/openapi-3-0/visitor.mjs +74 -97
  31. package/src/dereference/strategies/openapi-3-1/index.cjs +6 -9
  32. package/src/dereference/strategies/openapi-3-1/index.mjs +6 -10
  33. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +2 -1
  34. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.mjs +3 -2
  35. package/src/dereference/strategies/openapi-3-1/selectors/uri.cjs +2 -2
  36. package/src/dereference/strategies/openapi-3-1/selectors/uri.mjs +2 -2
  37. package/src/dereference/strategies/openapi-3-1/util.cjs +3 -2
  38. package/src/dereference/strategies/openapi-3-1/util.mjs +4 -3
  39. package/src/dereference/strategies/openapi-3-1/visitor.cjs +130 -156
  40. package/src/dereference/strategies/openapi-3-1/visitor.mjs +106 -132
  41. package/src/dereference/util.cjs +2 -2
  42. package/src/dereference/util.mjs +1 -1
  43. package/src/parse/parsers/apidom-json/index.cjs +5 -5
  44. package/src/parse/parsers/apidom-json/index.mjs +2 -2
  45. package/src/parse/parsers/arazzo-json-1/index.cjs +1 -2
  46. package/src/parse/parsers/arazzo-json-1/index.mjs +1 -2
  47. package/src/parse/parsers/asyncapi-json-2/index.cjs +1 -2
  48. package/src/parse/parsers/asyncapi-json-2/index.mjs +1 -2
  49. package/src/parse/parsers/binary/index-browser.cjs +3 -3
  50. package/src/parse/parsers/binary/index-browser.mjs +1 -1
  51. package/src/parse/parsers/binary/index-node.cjs +3 -3
  52. package/src/parse/parsers/binary/index-node.mjs +1 -1
  53. package/src/parse/parsers/json/index.cjs +1 -2
  54. package/src/parse/parsers/json/index.mjs +1 -2
  55. package/src/parse/parsers/openapi-json-2/index.cjs +1 -2
  56. package/src/parse/parsers/openapi-json-2/index.mjs +1 -2
  57. package/src/parse/parsers/openapi-json-3-0/index.cjs +1 -2
  58. package/src/parse/parsers/openapi-json-3-0/index.mjs +1 -2
  59. package/src/parse/parsers/openapi-json-3-1/index.cjs +1 -2
  60. package/src/parse/parsers/openapi-json-3-1/index.mjs +1 -2
  61. package/src/resolve/index.cjs +4 -4
  62. package/src/resolve/index.mjs +1 -1
  63. package/types/File.d.ts +1 -1
  64. package/types/Reference.d.ts +1 -1
  65. package/types/ReferenceSet.d.ts +1 -1
  66. package/types/apidom-reference.d.ts +8 -9
  67. package/types/bundle/index.d.ts +1 -1
  68. package/types/bundle/strategies/BundleStrategy.d.ts +1 -1
  69. package/types/bundle/strategies/openapi-3-1/index.d.ts +1 -1
  70. package/types/dereference/index.d.ts +1 -1
  71. package/types/dereference/strategies/DereferenceStrategy.d.ts +1 -1
  72. package/types/dereference/strategies/apidom/index.d.ts +1 -1
  73. package/types/dereference/strategies/apidom/selectors/element-id.d.ts +1 -1
  74. package/types/dereference/strategies/apidom/visitor.d.ts +3 -2
  75. package/types/dereference/strategies/asyncapi-2/index.d.ts +2 -2
  76. package/types/dereference/strategies/asyncapi-2/visitor.d.ts +5 -14
  77. package/types/dereference/strategies/openapi-2/index.d.ts +2 -2
  78. package/types/dereference/strategies/openapi-2/visitor.d.ts +6 -17
  79. package/types/dereference/strategies/openapi-3-0/index.d.ts +2 -2
  80. package/types/dereference/strategies/openapi-3-0/visitor.d.ts +7 -20
  81. package/types/dereference/strategies/openapi-3-1/index.d.ts +2 -2
  82. package/types/dereference/strategies/openapi-3-1/selectors/$anchor.d.ts +1 -1
  83. package/types/dereference/strategies/openapi-3-1/selectors/uri.d.ts +1 -1
  84. package/types/dereference/strategies/openapi-3-1/util.d.ts +1 -1
  85. package/types/dereference/strategies/openapi-3-1/visitor.d.ts +8 -23
  86. package/types/dereference/util.d.ts +1 -1
  87. package/types/index.d.ts +1 -1
  88. package/types/options/index.d.ts +1 -1
  89. package/types/parse/index.d.ts +1 -1
  90. package/types/parse/parsers/Parser.d.ts +1 -1
  91. package/types/parse/parsers/apidom-json/index.d.ts +1 -1
  92. package/types/parse/parsers/arazzo-json-1/index.d.ts +1 -2
  93. package/types/parse/parsers/arazzo-yaml-1/index.d.ts +1 -1
  94. package/types/parse/parsers/asyncapi-json-2/index.d.ts +1 -2
  95. package/types/parse/parsers/asyncapi-yaml-2/index.d.ts +1 -1
  96. package/types/parse/parsers/binary/index-browser.d.ts +1 -1
  97. package/types/parse/parsers/binary/index-node.d.ts +1 -1
  98. package/types/parse/parsers/json/index.d.ts +1 -2
  99. package/types/parse/parsers/openapi-json-2/index.d.ts +1 -2
  100. package/types/parse/parsers/openapi-json-3-0/index.d.ts +1 -2
  101. package/types/parse/parsers/openapi-json-3-1/index.d.ts +1 -2
  102. package/types/parse/parsers/openapi-yaml-2/index.d.ts +1 -1
  103. package/types/parse/parsers/openapi-yaml-3-0/index.d.ts +1 -1
  104. package/types/parse/parsers/openapi-yaml-3-1/index.d.ts +1 -1
  105. package/types/parse/parsers/yaml-1-2/index.d.ts +1 -1
  106. package/types/resolve/index.d.ts +1 -1
  107. package/src/parse/parsers/api-design-systems-json/index.cjs +0 -55
  108. package/src/parse/parsers/api-design-systems-json/index.mjs +0 -49
  109. package/src/parse/parsers/api-design-systems-yaml/index.cjs +0 -54
  110. package/src/parse/parsers/api-design-systems-yaml/index.mjs +0 -48
  111. package/types/parse/parsers/api-design-systems-json/index.d.ts +0 -21
  112. 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.mutationReplacer = exports.default = void 0;
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, _apidomCore.cloneDeep)(parseResult),
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(ancestors) {
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 directAncestors = new Set(ancestors.filter(_apidomCore.isElement));
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(referencingElement, key, parent, path, ancestors, link) {
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
- return false;
110
+ path.skip();
111
+ return;
121
112
  }
122
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
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
- return false;
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
- return false;
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, _apidomCore.isPrimitiveElement)(referencedElement)) {
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.ReferenceElement.refract(referencedElement);
157
- referencedElement.setMetaProperty('referenced-element', referencedElementType);
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
- const ElementClass = this.namespace.getElementClass(referencedElementType);
162
- referencedElement = ElementClass.refract(referencedElement);
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 _apidomCore.RefElement(referencedElement.id, {
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
- link.replaceWith(replacement, mutationReplacer);
191
- return !parent ? replacement : false;
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 visitAsync(referencedElement, visitor, {
218
- keyMap: _apidomNsOpenapi.keyMap,
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, _apidomCore.cloneShallow)(referencedElement);
224
+ const mergedElement = (0, _apidomDatamodel.cloneShallow)(referencedElement);
231
225
  // assign unique id to merged element
232
- mergedElement.setMetaProperty('id', identityManager.generateId());
226
+ mergedElement.meta.set('id', identityManager.generateId());
233
227
  // annotate referenced element with info about original referencing element
234
- mergedElement.setMetaProperty('ref-fields', {
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.setMetaProperty('ref-origin', reference.uri);
233
+ mergedElement.meta.set('ref-origin', reference.uri);
240
234
  // annotate fragment with info about referencing element
241
- mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
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
- link.replaceWith(mergedElement, mutationReplacer);
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(referencingElement, key, parent, path, ancestors, link) {
243
+ async PathItemElement(path) {
244
+ const referencingElement = path.node;
245
+
254
246
  // ignore PathItemElement without $ref field
255
- if (!(0, _apidomCore.isStringElement)(referencingElement.$ref)) {
256
- return undefined;
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
- return false;
253
+ path.skip();
254
+ return;
262
255
  }
263
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
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 undefined;
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 undefined;
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, _apidomCore.isPrimitiveElement)(referencedElement)) {
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.PathItemElement.refract(referencedElement);
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 _apidomCore.RefElement(referencedElement.id, {
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
- link.replaceWith(replacement, mutationReplacer);
324
- return !parent ? replacement : false;
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, _apidomCore.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
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 visitAsync(referencedElement, visitor, {
351
- keyMap: _apidomNsOpenapi.keyMap,
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 = new _apidomNsOpenapi.PathItemElement([...referencedElement.content], (0, _apidomCore.cloneDeep)(referencedElement.meta), (0, _apidomCore.cloneDeep)(referencedElement.attributes));
355
+ const mergedElement = (0, _apidomDatamodel.cloneShallow)(referencedElement);
363
356
  // assign unique id to merged element
364
- mergedElement.setMetaProperty('id', identityManager.generateId());
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.setMetaProperty('ref-fields', {
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.setMetaProperty('ref-origin', reference.uri);
370
+ mergedElement.meta.set('ref-origin', reference.uri);
378
371
  // annotate fragment with info about referencing element
379
- mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
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
- link.replaceWith(referencedElement, mutationReplacer);
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(referencingElement, key, parent, path, ancestors, link) {
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
- return false;
387
+ path.skip();
388
+ return;
397
389
  }
398
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
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
- return false;
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
- return false;
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, _apidomCore.isPrimitiveElement)(referencedElement)) {
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.ReferenceElement.refract(referencedElement);
433
- referencedElement.setMetaProperty('referenced-element', referencedElementType);
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
- const ElementClass = this.namespace.getElementClass(referencedElementType);
438
- referencedElement = ElementClass.refract(referencedElement);
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 _apidomCore.RefElement(referencedElement.id, {
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
- link.replaceWith(replacement, mutationReplacer);
467
- return !parent ? replacement : false;
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 visitAsync(referencedElement, visitor, {
494
- keyMap: _apidomNsOpenapi.keyMap,
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, _apidomCore.cloneShallow)(referencedElement);
501
+ const mergedElement = (0, _apidomDatamodel.cloneShallow)(referencedElement);
507
502
  // assign unique id to merged element
508
- mergedElement.setMetaProperty('id', identityManager.generateId());
503
+ mergedElement.meta.set('id', identityManager.generateId());
509
504
  // annotate referenced element with info about original referencing element
510
- mergedElement.setMetaProperty('ref-fields', {
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.setMetaProperty('ref-origin', reference.uri);
510
+ mergedElement.meta.set('ref-origin', reference.uri);
516
511
  // annotate fragment with info about referencing element
517
- mergedElement.setMetaProperty('ref-referencing-element-id', (0, _apidomCore.cloneDeep)(identityManager.identify(referencingElement)));
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
- link.replaceWith(mergedElement, mutationReplacer);
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;