@speclynx/apidom-overlay 4.7.1 → 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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [4.8.0](https://github.com/speclynx/apidom/compare/v4.7.1...v4.8.0) (2026-04-17)
7
+
8
+ **Note:** Version bump only for package @speclynx/apidom-overlay
9
+
6
10
  ## [4.7.1](https://github.com/speclynx/apidom/compare/v4.7.0...v4.7.1) (2026-04-16)
7
11
 
8
12
  **Note:** Version bump only for package @speclynx/apidom-overlay
@@ -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();
@@ -92125,17 +92132,23 @@ class Arazzo1DereferenceVisitor {
92125
92132
  */
92126
92133
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_22__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92127
92134
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
92128
- 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
+
92129
92140
  // append referencing reference to ancestors lineage
92130
92141
  directAncestors.add(referencingElement);
92131
92142
  const visitor = new Arazzo1DereferenceVisitor({
92132
92143
  reference,
92133
92144
  indirections: [...this.indirections],
92134
92145
  options: this.options,
92146
+ visited: this.visited,
92135
92147
  ancestors: ancestorsLineage
92136
92148
  });
92137
92149
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
92138
- mutable: true
92150
+ mutable: true,
92151
+ skipVisited: true
92139
92152
  });
92140
92153
 
92141
92154
  // remove referencing reference from ancestors lineage
@@ -92267,12 +92280,16 @@ class AsyncAPI2DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMP
92267
92280
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
92268
92281
  refSet = mutableRefSet;
92269
92282
  }
92283
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
92270
92284
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
92271
92285
  reference,
92272
92286
  options
92273
92287
  });
92274
92288
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
92275
- mutable: true
92289
+ mutable: true,
92290
+ ...(shouldDetectCircular && {
92291
+ skipVisited: true
92292
+ })
92276
92293
  });
92277
92294
 
92278
92295
  /**
@@ -92355,6 +92372,7 @@ class AsyncAPI2DereferenceVisitor {
92355
92372
  reference;
92356
92373
  options;
92357
92374
  refractCache;
92375
+ visited;
92358
92376
 
92359
92377
  /**
92360
92378
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -92367,13 +92385,15 @@ class AsyncAPI2DereferenceVisitor {
92367
92385
  options,
92368
92386
  indirections = [],
92369
92387
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(),
92370
- refractCache = new WeakMap()
92388
+ refractCache = new WeakMap(),
92389
+ visited = new WeakSet()
92371
92390
  }) {
92372
92391
  this.indirections = indirections;
92373
92392
  this.reference = reference;
92374
92393
  this.options = options;
92375
92394
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(...ancestors);
92376
92395
  this.refractCache = refractCache;
92396
+ this.visited = visited;
92377
92397
  }
92378
92398
  toAncestorLineage(path) {
92379
92399
  const ancestorNodes = path.getAncestorNodes();
@@ -92622,7 +92642,11 @@ class AsyncAPI2DereferenceVisitor {
92622
92642
  */
92623
92643
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92624
92644
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
92625
- 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
+
92626
92650
  // append referencing reference to ancestors lineage
92627
92651
  directAncestors.add(referencingElement);
92628
92652
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -92630,10 +92654,12 @@ class AsyncAPI2DereferenceVisitor {
92630
92654
  indirections: [...this.indirections],
92631
92655
  options: this.options,
92632
92656
  refractCache: this.refractCache,
92657
+ visited: this.visited,
92633
92658
  ancestors: ancestorsLineage
92634
92659
  });
92635
92660
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
92636
- mutable: true
92661
+ mutable: true,
92662
+ skipVisited: true
92637
92663
  });
92638
92664
 
92639
92665
  // remove referencing reference from ancestors lineage
@@ -92774,7 +92800,11 @@ class AsyncAPI2DereferenceVisitor {
92774
92800
  */
92775
92801
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92776
92802
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
92777
- 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
+
92778
92808
  // append referencing reference to ancestors lineage
92779
92809
  directAncestors.add(referencingElement);
92780
92810
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -92782,10 +92812,12 @@ class AsyncAPI2DereferenceVisitor {
92782
92812
  indirections: [...this.indirections],
92783
92813
  options: this.options,
92784
92814
  refractCache: this.refractCache,
92815
+ visited: this.visited,
92785
92816
  ancestors: ancestorsLineage
92786
92817
  });
92787
92818
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
92788
- mutable: true
92819
+ mutable: true,
92820
+ skipVisited: true
92789
92821
  });
92790
92822
 
92791
92823
  // remove referencing reference from ancestors lineage
@@ -92904,12 +92936,16 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPO
92904
92936
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
92905
92937
  refSet = mutableRefSet;
92906
92938
  }
92939
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
92907
92940
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
92908
92941
  reference: reference,
92909
92942
  options
92910
92943
  });
92911
92944
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
92912
- mutable: true
92945
+ mutable: true,
92946
+ ...(shouldDetectCircular && {
92947
+ skipVisited: true
92948
+ })
92913
92949
  });
92914
92950
 
92915
92951
  /**
@@ -92996,6 +93032,7 @@ class OpenAPI2DereferenceVisitor {
92996
93032
  reference;
92997
93033
  options;
92998
93034
  refractCache;
93035
+ visited;
92999
93036
 
93000
93037
  /**
93001
93038
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -93008,13 +93045,15 @@ class OpenAPI2DereferenceVisitor {
93008
93045
  options,
93009
93046
  indirections = [],
93010
93047
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(),
93011
- refractCache = new WeakMap()
93048
+ refractCache = new WeakMap(),
93049
+ visited = new WeakSet()
93012
93050
  }) {
93013
93051
  this.indirections = indirections;
93014
93052
  this.reference = reference;
93015
93053
  this.options = options;
93016
93054
  this.refractCache = refractCache;
93017
93055
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(...ancestors);
93056
+ this.visited = visited;
93018
93057
  }
93019
93058
  toAncestorLineage(path) {
93020
93059
  const ancestorNodes = path.getAncestorNodes();
@@ -93263,7 +93302,11 @@ class OpenAPI2DereferenceVisitor {
93263
93302
  */
93264
93303
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93265
93304
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
93266
- 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
+
93267
93310
  // append referencing reference to ancestors lineage
93268
93311
  directAncestors.add(referencingElement);
93269
93312
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93271,10 +93314,12 @@ class OpenAPI2DereferenceVisitor {
93271
93314
  indirections: [...this.indirections],
93272
93315
  options: this.options,
93273
93316
  refractCache: this.refractCache,
93317
+ visited: this.visited,
93274
93318
  ancestors: ancestorsLineage
93275
93319
  });
93276
93320
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93277
- mutable: true
93321
+ mutable: true,
93322
+ skipVisited: true
93278
93323
  });
93279
93324
  directAncestors.delete(referencingElement);
93280
93325
  }
@@ -93399,7 +93444,11 @@ class OpenAPI2DereferenceVisitor {
93399
93444
  */
93400
93445
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93401
93446
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
93402
- 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
+
93403
93452
  // append referencing reference to ancestors lineage
93404
93453
  directAncestors.add(referencingElement);
93405
93454
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93407,10 +93456,12 @@ class OpenAPI2DereferenceVisitor {
93407
93456
  indirections: [...this.indirections],
93408
93457
  options: this.options,
93409
93458
  refractCache: this.refractCache,
93459
+ visited: this.visited,
93410
93460
  ancestors: ancestorsLineage
93411
93461
  });
93412
93462
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93413
- mutable: true
93463
+ mutable: true,
93464
+ skipVisited: true
93414
93465
  });
93415
93466
 
93416
93467
  // remove referencing reference from ancestors lineage
@@ -93554,7 +93605,11 @@ class OpenAPI2DereferenceVisitor {
93554
93605
  */
93555
93606
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93556
93607
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
93557
- 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
+
93558
93613
  // append referencing reference to ancestors lineage
93559
93614
  directAncestors.add(referencingElement);
93560
93615
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93562,10 +93617,12 @@ class OpenAPI2DereferenceVisitor {
93562
93617
  indirections: [...this.indirections],
93563
93618
  options: this.options,
93564
93619
  refractCache: this.refractCache,
93620
+ visited: this.visited,
93565
93621
  ancestors: ancestorsLineage
93566
93622
  });
93567
93623
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93568
- mutable: true
93624
+ mutable: true,
93625
+ skipVisited: true
93569
93626
  });
93570
93627
 
93571
93628
  // remove referencing reference from ancestors lineage
@@ -93677,12 +93734,16 @@ class OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IM
93677
93734
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
93678
93735
  refSet = mutableRefSet;
93679
93736
  }
93737
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
93680
93738
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
93681
93739
  reference: reference,
93682
93740
  options
93683
93741
  });
93684
93742
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
93685
- mutable: true
93743
+ mutable: true,
93744
+ ...(shouldDetectCircular && {
93745
+ skipVisited: true
93746
+ })
93686
93747
  });
93687
93748
 
93688
93749
  /**
@@ -93766,6 +93827,7 @@ class OpenAPI3_0DereferenceVisitor {
93766
93827
  reference;
93767
93828
  options;
93768
93829
  refractCache;
93830
+ visited;
93769
93831
 
93770
93832
  /**
93771
93833
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -93778,13 +93840,15 @@ class OpenAPI3_0DereferenceVisitor {
93778
93840
  options,
93779
93841
  indirections = [],
93780
93842
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(),
93781
- refractCache = new WeakMap()
93843
+ refractCache = new WeakMap(),
93844
+ visited = new WeakSet()
93782
93845
  }) {
93783
93846
  this.indirections = indirections;
93784
93847
  this.reference = reference;
93785
93848
  this.options = options;
93786
93849
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(...ancestors);
93787
93850
  this.refractCache = refractCache;
93851
+ this.visited = visited;
93788
93852
  }
93789
93853
  toAncestorLineage(path) {
93790
93854
  const ancestorNodes = path.getAncestorNodes();
@@ -94033,7 +94097,11 @@ class OpenAPI3_0DereferenceVisitor {
94033
94097
  */
94034
94098
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
94035
94099
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
94036
- 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
+
94037
94105
  // append referencing reference to ancestors lineage
94038
94106
  directAncestors.add(referencingElement);
94039
94107
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -94041,10 +94109,12 @@ class OpenAPI3_0DereferenceVisitor {
94041
94109
  indirections: [...this.indirections],
94042
94110
  options: this.options,
94043
94111
  refractCache: this.refractCache,
94112
+ visited: this.visited,
94044
94113
  ancestors: ancestorsLineage
94045
94114
  });
94046
94115
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
94047
- mutable: true
94116
+ mutable: true,
94117
+ skipVisited: true
94048
94118
  });
94049
94119
 
94050
94120
  // remove referencing reference from ancestors lineage
@@ -94171,7 +94241,11 @@ class OpenAPI3_0DereferenceVisitor {
94171
94241
  */
94172
94242
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
94173
94243
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
94174
- 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
+
94175
94249
  // append referencing reference to ancestors lineage
94176
94250
  directAncestors.add(referencingElement);
94177
94251
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -94179,10 +94253,12 @@ class OpenAPI3_0DereferenceVisitor {
94179
94253
  indirections: [...this.indirections],
94180
94254
  options: this.options,
94181
94255
  refractCache: this.refractCache,
94256
+ visited: this.visited,
94182
94257
  ancestors: ancestorsLineage
94183
94258
  });
94184
94259
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
94185
- mutable: true
94260
+ mutable: true,
94261
+ skipVisited: true
94186
94262
  });
94187
94263
 
94188
94264
  // remove referencing reference from ancestors lineage
@@ -94441,12 +94517,16 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IM
94441
94517
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
94442
94518
  refSet = mutableRefSet;
94443
94519
  }
94520
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
94444
94521
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]({
94445
94522
  reference: reference,
94446
94523
  options
94447
94524
  });
94448
94525
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverseAsync)(refSet.rootRef.value, visitor, {
94449
- mutable: true
94526
+ mutable: true,
94527
+ ...(shouldDetectCircular && {
94528
+ skipVisited: true
94529
+ })
94450
94530
  });
94451
94531
 
94452
94532
  /**
@@ -94767,6 +94847,7 @@ class OpenAPI3_1DereferenceVisitor {
94767
94847
  reference;
94768
94848
  options;
94769
94849
  refractCache;
94850
+ visited;
94770
94851
 
94771
94852
  /**
94772
94853
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -94779,13 +94860,15 @@ class OpenAPI3_1DereferenceVisitor {
94779
94860
  options,
94780
94861
  indirections = [],
94781
94862
  refractCache = new WeakMap(),
94782
- ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage()
94863
+ ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(),
94864
+ visited = new WeakSet()
94783
94865
  }) {
94784
94866
  this.indirections = indirections;
94785
94867
  this.reference = reference;
94786
94868
  this.options = options;
94787
94869
  this.refractCache = refractCache;
94788
94870
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...ancestors);
94871
+ this.visited = visited;
94789
94872
  }
94790
94873
  toAncestorLineage(path) {
94791
94874
  const ancestorNodes = path.getAncestorNodes();
@@ -95034,17 +95117,22 @@ class OpenAPI3_1DereferenceVisitor {
95034
95117
  */
95035
95118
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95036
95119
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
95037
- 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
+ }
95038
95124
  directAncestors.add(referencingElement);
95039
95125
  const visitor = new OpenAPI3_1DereferenceVisitor({
95040
95126
  reference,
95041
95127
  indirections: [...this.indirections],
95042
95128
  options: this.options,
95043
95129
  refractCache: this.refractCache,
95130
+ visited: this.visited,
95044
95131
  ancestors: ancestorsLineage
95045
95132
  });
95046
95133
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95047
- mutable: true
95134
+ mutable: true,
95135
+ skipVisited: true
95048
95136
  });
95049
95137
  directAncestors.delete(referencingElement);
95050
95138
  }
@@ -95187,17 +95275,22 @@ class OpenAPI3_1DereferenceVisitor {
95187
95275
  */
95188
95276
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95189
95277
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
95190
- 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
+ }
95191
95282
  directAncestors.add(referencingElement);
95192
95283
  const visitor = new OpenAPI3_1DereferenceVisitor({
95193
95284
  reference,
95194
95285
  indirections: [...this.indirections],
95195
95286
  options: this.options,
95196
95287
  refractCache: this.refractCache,
95288
+ visited: this.visited,
95197
95289
  ancestors: ancestorsLineage
95198
95290
  });
95199
95291
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95200
- mutable: true
95292
+ mutable: true,
95293
+ skipVisited: true
95201
95294
  });
95202
95295
  directAncestors.delete(referencingElement);
95203
95296
  }
@@ -95544,17 +95637,22 @@ class OpenAPI3_1DereferenceVisitor {
95544
95637
  */
95545
95638
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95546
95639
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
95547
- 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
+ }
95548
95644
  directAncestors.add(referencingElement);
95549
95645
  const visitor = new OpenAPI3_1DereferenceVisitor({
95550
95646
  reference,
95551
95647
  indirections: [...this.indirections],
95552
95648
  options: this.options,
95553
95649
  refractCache: this.refractCache,
95650
+ visited: this.visited,
95554
95651
  ancestors: ancestorsLineage
95555
95652
  });
95556
95653
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95557
- mutable: true
95654
+ mutable: true,
95655
+ skipVisited: true
95558
95656
  });
95559
95657
  directAncestors.delete(referencingElement);
95560
95658
  }
@@ -100170,10 +100268,12 @@ function* traverseGenerator(root, visitor, options) {
100170
100268
  nodePredicate,
100171
100269
  nodeCloneFn,
100172
100270
  detectCycles,
100271
+ skipVisited,
100173
100272
  mutable,
100174
100273
  mutationFn
100175
100274
  } = options;
100176
100275
  const keyMapIsFunction = typeof keyMap === 'function';
100276
+ const visitedNodes = skipVisited ? new WeakSet() : null;
100177
100277
  let stack;
100178
100278
  let inArray = Array.isArray(root);
100179
100279
  let keys = [root];
@@ -100259,6 +100359,14 @@ function* traverseGenerator(root, visitor, options) {
100259
100359
  continue;
100260
100360
  }
100261
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
+
100262
100370
  // Always create Path for the current node (needed for parentPath chain)
100263
100371
  currentPath = new _Path_mjs__WEBPACK_IMPORTED_MODULE_2__.Path(node, parent, parentPath, key, inArray);
100264
100372
  const visitFn = (0,_visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.getVisitFn)(visitor, nodeTypeGetter(node), isLeaving);
@@ -100402,6 +100510,7 @@ const traverse = (root, visitor, options = {}) => {
100402
100510
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
100403
100511
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
100404
100512
  detectCycles: options.detectCycles ?? true,
100513
+ skipVisited: options.skipVisited ?? false,
100405
100514
  mutable: options.mutable ?? false,
100406
100515
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
100407
100516
  };
@@ -100433,6 +100542,7 @@ const traverseAsync = async (root, visitor, options = {}) => {
100433
100542
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
100434
100543
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
100435
100544
  detectCycles: options.detectCycles ?? true,
100545
+ skipVisited: options.skipVisited ?? false,
100436
100546
  mutable: options.mutable ?? false,
100437
100547
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
100438
100548
  };