@speclynx/apidom-overlay 4.7.0 → 4.8.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.
@@ -91289,12 +91289,16 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPOR
91289
91289
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
91290
91290
  refSet = mutableRefSet;
91291
91291
  }
91292
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
91292
91293
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_9__["default"]({
91293
91294
  reference,
91294
91295
  options
91295
91296
  });
91296
91297
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
91297
- mutable: true
91298
+ mutable: true,
91299
+ ...(shouldDetectCircular && {
91300
+ skipVisited: true
91301
+ })
91298
91302
  });
91299
91303
 
91300
91304
  /**
@@ -91718,6 +91722,7 @@ class Arazzo1DereferenceVisitor {
91718
91722
  indirections;
91719
91723
  reference;
91720
91724
  options;
91725
+ visited;
91721
91726
 
91722
91727
  /**
91723
91728
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -91729,12 +91734,14 @@ class Arazzo1DereferenceVisitor {
91729
91734
  reference,
91730
91735
  options,
91731
91736
  indirections = [],
91732
- ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage()
91737
+ ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(),
91738
+ visited = new WeakSet()
91733
91739
  }) {
91734
91740
  this.indirections = indirections;
91735
91741
  this.reference = reference;
91736
91742
  this.options = options;
91737
91743
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(...ancestors);
91744
+ this.visited = visited;
91738
91745
  }
91739
91746
  toAncestorLineage(path) {
91740
91747
  const ancestorNodes = path.getAncestorNodes();
@@ -91948,6 +91955,7 @@ class Arazzo1DereferenceVisitor {
91948
91955
  * Transclude referencing element with merged referenced element.
91949
91956
  */
91950
91957
  path.replaceWith(mergedElement);
91958
+ path.skip();
91951
91959
  }
91952
91960
  async JSONSchemaElement(path) {
91953
91961
  const referencingElement = path.node;
@@ -92108,6 +92116,7 @@ class Arazzo1DereferenceVisitor {
92108
92116
  const replacer = this.options.dereference.strategyOpts['arazzo-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
92109
92117
  const replacement = replacer(refElement);
92110
92118
  path.replaceWith(replacement);
92119
+ path.skip();
92111
92120
  return;
92112
92121
  }
92113
92122
  }
@@ -92123,17 +92132,23 @@ class Arazzo1DereferenceVisitor {
92123
92132
  */
92124
92133
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_22__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92125
92134
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
92126
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_11__.isJSONSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
92135
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_11__.isJSONSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
92136
+ if (shouldDetectCircular) {
92137
+ this.visited.add(referencedElement);
92138
+ }
92139
+
92127
92140
  // append referencing reference to ancestors lineage
92128
92141
  directAncestors.add(referencingElement);
92129
92142
  const visitor = new Arazzo1DereferenceVisitor({
92130
92143
  reference,
92131
92144
  indirections: [...this.indirections],
92132
92145
  options: this.options,
92146
+ visited: this.visited,
92133
92147
  ancestors: ancestorsLineage
92134
92148
  });
92135
92149
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
92136
- mutable: true
92150
+ mutable: true,
92151
+ skipVisited: true
92137
92152
  });
92138
92153
 
92139
92154
  // remove referencing reference from ancestors lineage
@@ -92151,6 +92166,7 @@ class Arazzo1DereferenceVisitor {
92151
92166
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
92152
92167
  booleanJsonSchemaElement.meta.set('ref-type', referencingElement.element);
92153
92168
  path.replaceWith(booleanJsonSchemaElement);
92169
+ path.skip();
92154
92170
  return;
92155
92171
  }
92156
92172
 
@@ -92264,12 +92280,16 @@ class AsyncAPI2DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMP
92264
92280
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
92265
92281
  refSet = mutableRefSet;
92266
92282
  }
92283
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
92267
92284
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
92268
92285
  reference,
92269
92286
  options
92270
92287
  });
92271
92288
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
92272
- mutable: true
92289
+ mutable: true,
92290
+ ...(shouldDetectCircular && {
92291
+ skipVisited: true
92292
+ })
92273
92293
  });
92274
92294
 
92275
92295
  /**
@@ -92352,6 +92372,7 @@ class AsyncAPI2DereferenceVisitor {
92352
92372
  reference;
92353
92373
  options;
92354
92374
  refractCache;
92375
+ visited;
92355
92376
 
92356
92377
  /**
92357
92378
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -92364,13 +92385,15 @@ class AsyncAPI2DereferenceVisitor {
92364
92385
  options,
92365
92386
  indirections = [],
92366
92387
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(),
92367
- refractCache = new WeakMap()
92388
+ refractCache = new WeakMap(),
92389
+ visited = new WeakSet()
92368
92390
  }) {
92369
92391
  this.indirections = indirections;
92370
92392
  this.reference = reference;
92371
92393
  this.options = options;
92372
92394
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(...ancestors);
92373
92395
  this.refractCache = refractCache;
92396
+ this.visited = visited;
92374
92397
  }
92375
92398
  toAncestorLineage(path) {
92376
92399
  const ancestorNodes = path.getAncestorNodes();
@@ -92603,6 +92626,7 @@ class AsyncAPI2DereferenceVisitor {
92603
92626
  const replacer = this.options.dereference.strategyOpts['asyncapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
92604
92627
  const replacement = replacer(refElement);
92605
92628
  path.replaceWith(replacement);
92629
+ path.skip();
92606
92630
  return;
92607
92631
  }
92608
92632
  }
@@ -92618,7 +92642,11 @@ class AsyncAPI2DereferenceVisitor {
92618
92642
  */
92619
92643
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92620
92644
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
92621
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
92645
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
92646
+ if (shouldDetectCircular) {
92647
+ this.visited.add(referencedElement);
92648
+ }
92649
+
92622
92650
  // append referencing reference to ancestors lineage
92623
92651
  directAncestors.add(referencingElement);
92624
92652
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -92626,10 +92654,12 @@ class AsyncAPI2DereferenceVisitor {
92626
92654
  indirections: [...this.indirections],
92627
92655
  options: this.options,
92628
92656
  refractCache: this.refractCache,
92657
+ visited: this.visited,
92629
92658
  ancestors: ancestorsLineage
92630
92659
  });
92631
92660
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
92632
- mutable: true
92661
+ mutable: true,
92662
+ skipVisited: true
92633
92663
  });
92634
92664
 
92635
92665
  // remove referencing reference from ancestors lineage
@@ -92647,6 +92677,7 @@ class AsyncAPI2DereferenceVisitor {
92647
92677
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
92648
92678
  booleanJsonSchemaElement.meta.set('ref-type', referencingElement.element);
92649
92679
  path.replaceWith(booleanJsonSchemaElement);
92680
+ path.skip();
92650
92681
  return;
92651
92682
  }
92652
92683
 
@@ -92666,6 +92697,7 @@ class AsyncAPI2DereferenceVisitor {
92666
92697
  * Transclude referencing element with merged referenced element.
92667
92698
  */
92668
92699
  path.replaceWith(mergedElement);
92700
+ path.skip();
92669
92701
  } catch (error) {
92670
92702
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
92671
92703
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -92768,7 +92800,11 @@ class AsyncAPI2DereferenceVisitor {
92768
92800
  */
92769
92801
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92770
92802
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
92771
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isChannelItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
92803
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isChannelItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
92804
+ if (shouldDetectCircular) {
92805
+ this.visited.add(referencedElement);
92806
+ }
92807
+
92772
92808
  // append referencing reference to ancestors lineage
92773
92809
  directAncestors.add(referencingElement);
92774
92810
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -92776,10 +92812,12 @@ class AsyncAPI2DereferenceVisitor {
92776
92812
  indirections: [...this.indirections],
92777
92813
  options: this.options,
92778
92814
  refractCache: this.refractCache,
92815
+ visited: this.visited,
92779
92816
  ancestors: ancestorsLineage
92780
92817
  });
92781
92818
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
92782
- mutable: true
92819
+ mutable: true,
92820
+ skipVisited: true
92783
92821
  });
92784
92822
 
92785
92823
  // remove referencing reference from ancestors lineage
@@ -92898,12 +92936,16 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPO
92898
92936
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
92899
92937
  refSet = mutableRefSet;
92900
92938
  }
92939
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
92901
92940
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
92902
92941
  reference: reference,
92903
92942
  options
92904
92943
  });
92905
92944
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
92906
- mutable: true
92945
+ mutable: true,
92946
+ ...(shouldDetectCircular && {
92947
+ skipVisited: true
92948
+ })
92907
92949
  });
92908
92950
 
92909
92951
  /**
@@ -92990,6 +93032,7 @@ class OpenAPI2DereferenceVisitor {
92990
93032
  reference;
92991
93033
  options;
92992
93034
  refractCache;
93035
+ visited;
92993
93036
 
92994
93037
  /**
92995
93038
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -93002,13 +93045,15 @@ class OpenAPI2DereferenceVisitor {
93002
93045
  options,
93003
93046
  indirections = [],
93004
93047
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(),
93005
- refractCache = new WeakMap()
93048
+ refractCache = new WeakMap(),
93049
+ visited = new WeakSet()
93006
93050
  }) {
93007
93051
  this.indirections = indirections;
93008
93052
  this.reference = reference;
93009
93053
  this.options = options;
93010
93054
  this.refractCache = refractCache;
93011
93055
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(...ancestors);
93056
+ this.visited = visited;
93012
93057
  }
93013
93058
  toAncestorLineage(path) {
93014
93059
  const ancestorNodes = path.getAncestorNodes();
@@ -93241,6 +93286,7 @@ class OpenAPI2DereferenceVisitor {
93241
93286
  const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
93242
93287
  const replacement = replacer(refElement);
93243
93288
  path.replaceWith(replacement);
93289
+ path.skip();
93244
93290
  return;
93245
93291
  }
93246
93292
  }
@@ -93256,7 +93302,11 @@ class OpenAPI2DereferenceVisitor {
93256
93302
  */
93257
93303
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93258
93304
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
93259
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
93305
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
93306
+ if (shouldDetectCircular) {
93307
+ this.visited.add(referencedElement);
93308
+ }
93309
+
93260
93310
  // append referencing reference to ancestors lineage
93261
93311
  directAncestors.add(referencingElement);
93262
93312
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93264,10 +93314,12 @@ class OpenAPI2DereferenceVisitor {
93264
93314
  indirections: [...this.indirections],
93265
93315
  options: this.options,
93266
93316
  refractCache: this.refractCache,
93317
+ visited: this.visited,
93267
93318
  ancestors: ancestorsLineage
93268
93319
  });
93269
93320
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93270
- mutable: true
93321
+ mutable: true,
93322
+ skipVisited: true
93271
93323
  });
93272
93324
  directAncestors.delete(referencingElement);
93273
93325
  }
@@ -93288,6 +93340,7 @@ class OpenAPI2DereferenceVisitor {
93288
93340
  * Transclude referencing element with merged referenced element.
93289
93341
  */
93290
93342
  path.replaceWith(mergedElement);
93343
+ path.skip();
93291
93344
  } catch (error) {
93292
93345
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
93293
93346
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -93375,6 +93428,7 @@ class OpenAPI2DereferenceVisitor {
93375
93428
  const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
93376
93429
  const replacement = replacer(refElement);
93377
93430
  path.replaceWith(replacement);
93431
+ path.skip();
93378
93432
  return;
93379
93433
  }
93380
93434
  }
@@ -93390,7 +93444,11 @@ class OpenAPI2DereferenceVisitor {
93390
93444
  */
93391
93445
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93392
93446
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
93393
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
93447
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
93448
+ if (shouldDetectCircular) {
93449
+ this.visited.add(referencedElement);
93450
+ }
93451
+
93394
93452
  // append referencing reference to ancestors lineage
93395
93453
  directAncestors.add(referencingElement);
93396
93454
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93398,10 +93456,12 @@ class OpenAPI2DereferenceVisitor {
93398
93456
  indirections: [...this.indirections],
93399
93457
  options: this.options,
93400
93458
  refractCache: this.refractCache,
93459
+ visited: this.visited,
93401
93460
  ancestors: ancestorsLineage
93402
93461
  });
93403
93462
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93404
- mutable: true
93463
+ mutable: true,
93464
+ skipVisited: true
93405
93465
  });
93406
93466
 
93407
93467
  // remove referencing reference from ancestors lineage
@@ -93529,6 +93589,7 @@ class OpenAPI2DereferenceVisitor {
93529
93589
  const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
93530
93590
  const replacement = replacer(refElement);
93531
93591
  path.replaceWith(replacement);
93592
+ path.skip();
93532
93593
  return;
93533
93594
  }
93534
93595
  }
@@ -93544,7 +93605,11 @@ class OpenAPI2DereferenceVisitor {
93544
93605
  */
93545
93606
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93546
93607
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
93547
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_11__.isJSONReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
93608
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_11__.isJSONReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
93609
+ if (shouldDetectCircular) {
93610
+ this.visited.add(referencedElement);
93611
+ }
93612
+
93548
93613
  // append referencing reference to ancestors lineage
93549
93614
  directAncestors.add(referencingElement);
93550
93615
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93552,10 +93617,12 @@ class OpenAPI2DereferenceVisitor {
93552
93617
  indirections: [...this.indirections],
93553
93618
  options: this.options,
93554
93619
  refractCache: this.refractCache,
93620
+ visited: this.visited,
93555
93621
  ancestors: ancestorsLineage
93556
93622
  });
93557
93623
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93558
- mutable: true
93624
+ mutable: true,
93625
+ skipVisited: true
93559
93626
  });
93560
93627
 
93561
93628
  // remove referencing reference from ancestors lineage
@@ -93578,6 +93645,7 @@ class OpenAPI2DereferenceVisitor {
93578
93645
  * Transclude referencing element with merged referenced element.
93579
93646
  */
93580
93647
  path.replaceWith(mergedElement);
93648
+ path.skip();
93581
93649
  } catch (error) {
93582
93650
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
93583
93651
  this.handleError(`Error while dereferencing JSON Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -93666,12 +93734,16 @@ class OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IM
93666
93734
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
93667
93735
  refSet = mutableRefSet;
93668
93736
  }
93737
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
93669
93738
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
93670
93739
  reference: reference,
93671
93740
  options
93672
93741
  });
93673
93742
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
93674
- mutable: true
93743
+ mutable: true,
93744
+ ...(shouldDetectCircular && {
93745
+ skipVisited: true
93746
+ })
93675
93747
  });
93676
93748
 
93677
93749
  /**
@@ -93755,6 +93827,7 @@ class OpenAPI3_0DereferenceVisitor {
93755
93827
  reference;
93756
93828
  options;
93757
93829
  refractCache;
93830
+ visited;
93758
93831
 
93759
93832
  /**
93760
93833
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -93767,13 +93840,15 @@ class OpenAPI3_0DereferenceVisitor {
93767
93840
  options,
93768
93841
  indirections = [],
93769
93842
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(),
93770
- refractCache = new WeakMap()
93843
+ refractCache = new WeakMap(),
93844
+ visited = new WeakSet()
93771
93845
  }) {
93772
93846
  this.indirections = indirections;
93773
93847
  this.reference = reference;
93774
93848
  this.options = options;
93775
93849
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(...ancestors);
93776
93850
  this.refractCache = refractCache;
93851
+ this.visited = visited;
93777
93852
  }
93778
93853
  toAncestorLineage(path) {
93779
93854
  const ancestorNodes = path.getAncestorNodes();
@@ -94006,6 +94081,7 @@ class OpenAPI3_0DereferenceVisitor {
94006
94081
  const replacer = this.options.dereference.strategyOpts['openapi-3-0']?.circularReplacer ?? this.options.dereference.circularReplacer;
94007
94082
  const replacement = replacer(refElement);
94008
94083
  path.replaceWith(replacement);
94084
+ path.skip();
94009
94085
  return;
94010
94086
  }
94011
94087
  }
@@ -94021,7 +94097,11 @@ class OpenAPI3_0DereferenceVisitor {
94021
94097
  */
94022
94098
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
94023
94099
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
94024
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
94100
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
94101
+ if (shouldDetectCircular) {
94102
+ this.visited.add(referencedElement);
94103
+ }
94104
+
94025
94105
  // append referencing reference to ancestors lineage
94026
94106
  directAncestors.add(referencingElement);
94027
94107
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -94029,10 +94109,12 @@ class OpenAPI3_0DereferenceVisitor {
94029
94109
  indirections: [...this.indirections],
94030
94110
  options: this.options,
94031
94111
  refractCache: this.refractCache,
94112
+ visited: this.visited,
94032
94113
  ancestors: ancestorsLineage
94033
94114
  });
94034
94115
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
94035
- mutable: true
94116
+ mutable: true,
94117
+ skipVisited: true
94036
94118
  });
94037
94119
 
94038
94120
  // remove referencing reference from ancestors lineage
@@ -94055,6 +94137,7 @@ class OpenAPI3_0DereferenceVisitor {
94055
94137
  * Transclude referencing element with merged referenced element.
94056
94138
  */
94057
94139
  path.replaceWith(mergedElement);
94140
+ path.skip();
94058
94141
  } catch (error) {
94059
94142
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref);
94060
94143
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -94142,6 +94225,7 @@ class OpenAPI3_0DereferenceVisitor {
94142
94225
  const replacer = this.options.dereference.strategyOpts['openapi-3-0']?.circularReplacer ?? this.options.dereference.circularReplacer;
94143
94226
  const replacement = replacer(refElement);
94144
94227
  path.replaceWith(replacement);
94228
+ path.skip();
94145
94229
  return;
94146
94230
  }
94147
94231
  }
@@ -94157,7 +94241,11 @@ class OpenAPI3_0DereferenceVisitor {
94157
94241
  */
94158
94242
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
94159
94243
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
94160
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
94244
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
94245
+ if (shouldDetectCircular) {
94246
+ this.visited.add(referencedElement);
94247
+ }
94248
+
94161
94249
  // append referencing reference to ancestors lineage
94162
94250
  directAncestors.add(referencingElement);
94163
94251
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -94165,10 +94253,12 @@ class OpenAPI3_0DereferenceVisitor {
94165
94253
  indirections: [...this.indirections],
94166
94254
  options: this.options,
94167
94255
  refractCache: this.refractCache,
94256
+ visited: this.visited,
94168
94257
  ancestors: ancestorsLineage
94169
94258
  });
94170
94259
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
94171
- mutable: true
94260
+ mutable: true,
94261
+ skipVisited: true
94172
94262
  });
94173
94263
 
94174
94264
  // remove referencing reference from ancestors lineage
@@ -94427,12 +94517,16 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IM
94427
94517
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
94428
94518
  refSet = mutableRefSet;
94429
94519
  }
94520
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
94430
94521
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]({
94431
94522
  reference: reference,
94432
94523
  options
94433
94524
  });
94434
94525
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverseAsync)(refSet.rootRef.value, visitor, {
94435
- mutable: true
94526
+ mutable: true,
94527
+ ...(shouldDetectCircular && {
94528
+ skipVisited: true
94529
+ })
94436
94530
  });
94437
94531
 
94438
94532
  /**
@@ -94753,6 +94847,7 @@ class OpenAPI3_1DereferenceVisitor {
94753
94847
  reference;
94754
94848
  options;
94755
94849
  refractCache;
94850
+ visited;
94756
94851
 
94757
94852
  /**
94758
94853
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -94765,13 +94860,15 @@ class OpenAPI3_1DereferenceVisitor {
94765
94860
  options,
94766
94861
  indirections = [],
94767
94862
  refractCache = new WeakMap(),
94768
- ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage()
94863
+ ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(),
94864
+ visited = new WeakSet()
94769
94865
  }) {
94770
94866
  this.indirections = indirections;
94771
94867
  this.reference = reference;
94772
94868
  this.options = options;
94773
94869
  this.refractCache = refractCache;
94774
94870
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...ancestors);
94871
+ this.visited = visited;
94775
94872
  }
94776
94873
  toAncestorLineage(path) {
94777
94874
  const ancestorNodes = path.getAncestorNodes();
@@ -95004,6 +95101,7 @@ class OpenAPI3_1DereferenceVisitor {
95004
95101
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
95005
95102
  const replacement = replacer(refElement);
95006
95103
  path.replaceWith(replacement);
95104
+ path.skip();
95007
95105
  return;
95008
95106
  }
95009
95107
  }
@@ -95019,17 +95117,22 @@ class OpenAPI3_1DereferenceVisitor {
95019
95117
  */
95020
95118
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95021
95119
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
95022
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
95120
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
95121
+ if (shouldDetectCircular) {
95122
+ this.visited.add(referencedElement);
95123
+ }
95023
95124
  directAncestors.add(referencingElement);
95024
95125
  const visitor = new OpenAPI3_1DereferenceVisitor({
95025
95126
  reference,
95026
95127
  indirections: [...this.indirections],
95027
95128
  options: this.options,
95028
95129
  refractCache: this.refractCache,
95130
+ visited: this.visited,
95029
95131
  ancestors: ancestorsLineage
95030
95132
  });
95031
95133
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95032
- mutable: true
95134
+ mutable: true,
95135
+ skipVisited: true
95033
95136
  });
95034
95137
  directAncestors.delete(referencingElement);
95035
95138
  }
@@ -95156,6 +95259,7 @@ class OpenAPI3_1DereferenceVisitor {
95156
95259
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
95157
95260
  const replacement = replacer(refElement);
95158
95261
  path.replaceWith(replacement);
95262
+ path.skip();
95159
95263
  return;
95160
95264
  }
95161
95265
  }
@@ -95171,17 +95275,22 @@ class OpenAPI3_1DereferenceVisitor {
95171
95275
  */
95172
95276
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95173
95277
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
95174
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
95278
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
95279
+ if (shouldDetectCircular) {
95280
+ this.visited.add(referencedElement);
95281
+ }
95175
95282
  directAncestors.add(referencingElement);
95176
95283
  const visitor = new OpenAPI3_1DereferenceVisitor({
95177
95284
  reference,
95178
95285
  indirections: [...this.indirections],
95179
95286
  options: this.options,
95180
95287
  refractCache: this.refractCache,
95288
+ visited: this.visited,
95181
95289
  ancestors: ancestorsLineage
95182
95290
  });
95183
95291
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95184
- mutable: true
95292
+ mutable: true,
95293
+ skipVisited: true
95185
95294
  });
95186
95295
  directAncestors.delete(referencingElement);
95187
95296
  }
@@ -95512,6 +95621,7 @@ class OpenAPI3_1DereferenceVisitor {
95512
95621
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
95513
95622
  const replacement = replacer(refElement);
95514
95623
  path.replaceWith(replacement);
95624
+ path.skip();
95515
95625
  return;
95516
95626
  }
95517
95627
  }
@@ -95527,17 +95637,22 @@ class OpenAPI3_1DereferenceVisitor {
95527
95637
  */
95528
95638
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95529
95639
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
95530
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
95640
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
95641
+ if (shouldDetectCircular) {
95642
+ this.visited.add(referencedElement);
95643
+ }
95531
95644
  directAncestors.add(referencingElement);
95532
95645
  const visitor = new OpenAPI3_1DereferenceVisitor({
95533
95646
  reference,
95534
95647
  indirections: [...this.indirections],
95535
95648
  options: this.options,
95536
95649
  refractCache: this.refractCache,
95650
+ visited: this.visited,
95537
95651
  ancestors: ancestorsLineage
95538
95652
  });
95539
95653
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95540
- mutable: true
95654
+ mutable: true,
95655
+ skipVisited: true
95541
95656
  });
95542
95657
  directAncestors.delete(referencingElement);
95543
95658
  }
@@ -95553,6 +95668,7 @@ class OpenAPI3_1DereferenceVisitor {
95553
95668
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
95554
95669
  booleanJsonSchemaElement.meta.set('ref-type', referencingElement.element);
95555
95670
  path.replaceWith(booleanJsonSchemaElement);
95671
+ path.skip();
95556
95672
  return;
95557
95673
  }
95558
95674
 
@@ -100152,10 +100268,12 @@ function* traverseGenerator(root, visitor, options) {
100152
100268
  nodePredicate,
100153
100269
  nodeCloneFn,
100154
100270
  detectCycles,
100271
+ skipVisited,
100155
100272
  mutable,
100156
100273
  mutationFn
100157
100274
  } = options;
100158
100275
  const keyMapIsFunction = typeof keyMap === 'function';
100276
+ const visitedNodes = skipVisited ? new WeakSet() : null;
100159
100277
  let stack;
100160
100278
  let inArray = Array.isArray(root);
100161
100279
  let keys = [root];
@@ -100241,6 +100359,14 @@ function* traverseGenerator(root, visitor, options) {
100241
100359
  continue;
100242
100360
  }
100243
100361
 
100362
+ // Skip already-visited nodes (handles DAG structures from cloneShallow)
100363
+ if (skipVisited && !isLeaving) {
100364
+ if (visitedNodes.has(node)) {
100365
+ continue;
100366
+ }
100367
+ visitedNodes.add(node);
100368
+ }
100369
+
100244
100370
  // Always create Path for the current node (needed for parentPath chain)
100245
100371
  currentPath = new _Path_mjs__WEBPACK_IMPORTED_MODULE_2__.Path(node, parent, parentPath, key, inArray);
100246
100372
  const visitFn = (0,_visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.getVisitFn)(visitor, nodeTypeGetter(node), isLeaving);
@@ -100261,11 +100387,6 @@ function* traverseGenerator(root, visitor, options) {
100261
100387
  if (currentPath.shouldStop) {
100262
100388
  break;
100263
100389
  }
100264
- if (currentPath.shouldSkip) {
100265
- if (!isLeaving) {
100266
- continue;
100267
- }
100268
- }
100269
100390
  if (currentPath.removed) {
100270
100391
  edits.push([key, null]);
100271
100392
  if (!isLeaving) {
@@ -100275,12 +100396,19 @@ function* traverseGenerator(root, visitor, options) {
100275
100396
  const replacement = currentPath._getReplacementNode();
100276
100397
  edits.push([key, replacement]);
100277
100398
  if (!isLeaving) {
100399
+ if (currentPath.shouldSkip) {
100400
+ continue;
100401
+ }
100278
100402
  if (nodePredicate(replacement)) {
100279
100403
  node = replacement;
100280
100404
  } else {
100281
100405
  continue;
100282
100406
  }
100283
100407
  }
100408
+ } else if (currentPath.shouldSkip) {
100409
+ if (!isLeaving) {
100410
+ continue;
100411
+ }
100284
100412
  } else if (result !== undefined) {
100285
100413
  // Support return value replacement for backwards compatibility
100286
100414
  edits.push([key, result]);
@@ -100382,6 +100510,7 @@ const traverse = (root, visitor, options = {}) => {
100382
100510
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
100383
100511
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
100384
100512
  detectCycles: options.detectCycles ?? true,
100513
+ skipVisited: options.skipVisited ?? false,
100385
100514
  mutable: options.mutable ?? false,
100386
100515
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
100387
100516
  };
@@ -100413,6 +100542,7 @@ const traverseAsync = async (root, visitor, options = {}) => {
100413
100542
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
100414
100543
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
100415
100544
  detectCycles: options.detectCycles ?? true,
100545
+ skipVisited: options.skipVisited ?? false,
100416
100546
  mutable: options.mutable ?? false,
100417
100547
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
100418
100548
  };