@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.
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 +24594 -23365
  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
@@ -1,32 +1,19 @@
1
1
  import { propEq } from 'ramda';
2
- import { RefElement, isPrimitiveElement, isStringElement, isMemberElement, isElement, IdentityManager, visit, cloneShallow, cloneDeep, toValue } from '@speclynx/apidom-core';
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 { getNodeType, isReferenceElement, isJSONReferenceElement, isPathItemElement, isReferenceLikeElement, isJSONReferenceLikeElement, keyMap, ReferenceElement, PathItemElement } from '@speclynx/apidom-ns-openapi-2';
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(ancestors) {
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 directAncestors = new Set(ancestors.filter(isElement));
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(referencingElement, key, parent, path, ancestors, link) {
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
- return false;
104
+ path.skip();
105
+ return;
115
106
  }
116
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
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
- return false;
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
- return false;
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 = ReferenceElement.refract(referencedElement);
151
- referencedElement.setMetaProperty('referenced-element', referencedElementType);
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
- const ElementClass = this.namespace.getElementClass(referencedElementType);
156
- referencedElement = ElementClass.refract(referencedElement);
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
- link.replaceWith(replacement, mutationReplacer);
185
- return !parent ? replacement : false;
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 visitAsync(referencedElement, visitor, {
212
- keyMap,
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.setMetaProperty('id', identityManager.generateId());
220
+ mergedElement.meta.set('id', identityManager.generateId());
227
221
  // annotate referenced element with info about original referencing element
228
- mergedElement.setMetaProperty('ref-fields', {
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.setMetaProperty('ref-origin', reference.uri);
227
+ mergedElement.meta.set('ref-origin', reference.uri);
234
228
  // annotate fragment with info about referencing element
235
- mergedElement.setMetaProperty('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
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
- link.replaceWith(mergedElement, mutationReplacer);
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(referencingElement, key, parent, path, ancestors, link) {
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 undefined;
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
- return false;
247
+ path.skip();
248
+ return;
256
249
  }
257
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
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 undefined;
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 undefined;
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 = PathItemElement.refract(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
- link.replaceWith(replacement, mutationReplacer);
318
- return !parent ? replacement : false;
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 visitAsync(referencedElement, visitor, {
345
- keyMap,
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 = new PathItemElement([...referencedElement.content], cloneDeep(referencedElement.meta), cloneDeep(referencedElement.attributes));
349
+ const mergedElement = cloneShallow(referencedElement);
357
350
  // assign unique id to merged element
358
- mergedElement.setMetaProperty('id', identityManager.generateId());
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.setMetaProperty('ref-fields', {
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.setMetaProperty('ref-origin', reference.uri);
364
+ mergedElement.meta.set('ref-origin', reference.uri);
372
365
  // annotate fragment with info about referencing element
373
- mergedElement.setMetaProperty('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
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
- link.replaceWith(referencedElement, mutationReplacer);
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(referencingElement, key, parent, path, ancestors, link) {
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
- return false;
381
+ path.skip();
382
+ return;
391
383
  }
392
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
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
- return false;
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
- return false;
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 = ReferenceElement.refract(referencedElement);
427
- referencedElement.setMetaProperty('referenced-element', referencedElementType);
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
- const ElementClass = this.namespace.getElementClass(referencedElementType);
432
- referencedElement = ElementClass.refract(referencedElement);
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
- link.replaceWith(replacement, mutationReplacer);
461
- return !parent ? replacement : false;
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 visitAsync(referencedElement, visitor, {
488
- keyMap,
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.setMetaProperty('id', identityManager.generateId());
497
+ mergedElement.meta.set('id', identityManager.generateId());
503
498
  // annotate referenced element with info about original referencing element
504
- mergedElement.setMetaProperty('ref-fields', {
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.setMetaProperty('ref-origin', reference.uri);
504
+ mergedElement.meta.set('ref-origin', reference.uri);
510
505
  // annotate fragment with info about referencing element
511
- mergedElement.setMetaProperty('ref-referencing-element-id', cloneDeep(identityManager.identify(referencingElement)));
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
- link.replaceWith(mergedElement, mutationReplacer);
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 _apidomCore = require("@speclynx/apidom-core");
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 = (0, _apidomCore.createNamespace)(_apidomNsOpenapi.default);
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, _apidomCore.cloneDeep)(ref.value)
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 visitAsync(refSet.rootRef.value, visitor, {
77
- keyMap: _apidomNsOpenapi.keyMap,
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 { createNamespace, visit, cloneDeep } from '@speclynx/apidom-core';
2
- import openApi3_0Namespace, { getNodeType, isOpenApi3_0Element, keyMap, mediaTypes } from '@speclynx/apidom-ns-openapi-3-0';
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 = createNamespace(openApi3_0Namespace);
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 visitAsync(refSet.rootRef.value, visitor, {
70
- keyMap,
71
- nodeTypeGetter: getNodeType
66
+ const dereferencedElement = await traverseAsync(refSet.rootRef.value, visitor, {
67
+ mutable: true
72
68
  });
73
69
 
74
70
  /**