@speclynx/apidom-overlay 4.7.1 → 4.9.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,14 @@
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.9.0](https://github.com/speclynx/apidom/compare/v4.8.0...v4.9.0) (2026-04-17)
7
+
8
+ **Note:** Version bump only for package @speclynx/apidom-overlay
9
+
10
+ # [4.8.0](https://github.com/speclynx/apidom/compare/v4.7.1...v4.8.0) (2026-04-17)
11
+
12
+ **Note:** Version bump only for package @speclynx/apidom-overlay
13
+
6
14
  ## [4.7.1](https://github.com/speclynx/apidom/compare/v4.7.0...v4.7.1) (2026-04-16)
7
15
 
8
16
  **Note:** Version bump only for package @speclynx/apidom-overlay
@@ -39759,13 +39759,14 @@ const dispatchPluginsSync = (element, plugins, options = {}) => {
39759
39759
  const mergedOptions = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(defaultDispatchPluginsOptions, options);
39760
39760
  const {
39761
39761
  toolboxCreator,
39762
- visitorOptions
39762
+ visitorOptions,
39763
+ traverseOptions
39763
39764
  } = mergedOptions;
39764
39765
  const toolbox = toolboxCreator();
39765
39766
  const pluginsSpecs = plugins.map(plugin => plugin(toolbox));
39766
39767
  const mergedPluginsVisitor = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_0__.mergeVisitors)(pluginsSpecs.map((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])({}, 'visitor')), visitorOptions);
39767
39768
  pluginsSpecs.forEach((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__["default"])(['pre'], []));
39768
- const newElement = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_0__.traverse)(element, mergedPluginsVisitor);
39769
+ const newElement = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_0__.traverse)(element, mergedPluginsVisitor, traverseOptions);
39769
39770
  pluginsSpecs.forEach((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__["default"])(['post'], []));
39770
39771
  return newElement;
39771
39772
  };
@@ -39774,13 +39775,14 @@ const dispatchPluginsAsync = async (element, plugins, options = {}) => {
39774
39775
  const mergedOptions = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(defaultDispatchPluginsOptions, options);
39775
39776
  const {
39776
39777
  toolboxCreator,
39777
- visitorOptions
39778
+ visitorOptions,
39779
+ traverseOptions
39778
39780
  } = mergedOptions;
39779
39781
  const toolbox = toolboxCreator();
39780
39782
  const pluginsSpecs = plugins.map(plugin => plugin(toolbox));
39781
39783
  const mergedPluginsVisitor = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_0__.mergeVisitorsAsync)(pluginsSpecs.map((0,ramda__WEBPACK_IMPORTED_MODULE_2__["default"])({}, 'visitor')), visitorOptions);
39782
39784
  await Promise.allSettled(pluginsSpecs.map((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__["default"])(['pre'], [])));
39783
- const newElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_0__.traverseAsync)(element, mergedPluginsVisitor);
39785
+ const newElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_0__.traverseAsync)(element, mergedPluginsVisitor, traverseOptions);
39784
39786
  await Promise.allSettled(pluginsSpecs.map((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__["default"])(['post'], [])));
39785
39787
  return newElement;
39786
39788
  };
@@ -91289,12 +91291,16 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPOR
91289
91291
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
91290
91292
  refSet = mutableRefSet;
91291
91293
  }
91294
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
91292
91295
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_9__["default"]({
91293
91296
  reference,
91294
91297
  options
91295
91298
  });
91296
91299
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
91297
- mutable: true
91300
+ mutable: true,
91301
+ ...(shouldDetectCircular && {
91302
+ skipVisited: true
91303
+ })
91298
91304
  });
91299
91305
 
91300
91306
  /**
@@ -91718,6 +91724,7 @@ class Arazzo1DereferenceVisitor {
91718
91724
  indirections;
91719
91725
  reference;
91720
91726
  options;
91727
+ visited;
91721
91728
 
91722
91729
  /**
91723
91730
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -91729,12 +91736,14 @@ class Arazzo1DereferenceVisitor {
91729
91736
  reference,
91730
91737
  options,
91731
91738
  indirections = [],
91732
- ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage()
91739
+ ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(),
91740
+ visited = new WeakSet()
91733
91741
  }) {
91734
91742
  this.indirections = indirections;
91735
91743
  this.reference = reference;
91736
91744
  this.options = options;
91737
91745
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(...ancestors);
91746
+ this.visited = visited;
91738
91747
  }
91739
91748
  toAncestorLineage(path) {
91740
91749
  const ancestorNodes = path.getAncestorNodes();
@@ -92125,17 +92134,23 @@ class Arazzo1DereferenceVisitor {
92125
92134
  */
92126
92135
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_22__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92127
92136
  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)) {
92137
+ 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)) {
92138
+ if (shouldDetectCircular) {
92139
+ this.visited.add(referencedElement);
92140
+ }
92141
+
92129
92142
  // append referencing reference to ancestors lineage
92130
92143
  directAncestors.add(referencingElement);
92131
92144
  const visitor = new Arazzo1DereferenceVisitor({
92132
92145
  reference,
92133
92146
  indirections: [...this.indirections],
92134
92147
  options: this.options,
92148
+ visited: this.visited,
92135
92149
  ancestors: ancestorsLineage
92136
92150
  });
92137
92151
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
92138
- mutable: true
92152
+ mutable: true,
92153
+ skipVisited: true
92139
92154
  });
92140
92155
 
92141
92156
  // remove referencing reference from ancestors lineage
@@ -92267,12 +92282,16 @@ class AsyncAPI2DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMP
92267
92282
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
92268
92283
  refSet = mutableRefSet;
92269
92284
  }
92285
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
92270
92286
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
92271
92287
  reference,
92272
92288
  options
92273
92289
  });
92274
92290
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
92275
- mutable: true
92291
+ mutable: true,
92292
+ ...(shouldDetectCircular && {
92293
+ skipVisited: true
92294
+ })
92276
92295
  });
92277
92296
 
92278
92297
  /**
@@ -92355,6 +92374,7 @@ class AsyncAPI2DereferenceVisitor {
92355
92374
  reference;
92356
92375
  options;
92357
92376
  refractCache;
92377
+ visited;
92358
92378
 
92359
92379
  /**
92360
92380
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -92367,13 +92387,15 @@ class AsyncAPI2DereferenceVisitor {
92367
92387
  options,
92368
92388
  indirections = [],
92369
92389
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(),
92370
- refractCache = new WeakMap()
92390
+ refractCache = new WeakMap(),
92391
+ visited = new WeakSet()
92371
92392
  }) {
92372
92393
  this.indirections = indirections;
92373
92394
  this.reference = reference;
92374
92395
  this.options = options;
92375
92396
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(...ancestors);
92376
92397
  this.refractCache = refractCache;
92398
+ this.visited = visited;
92377
92399
  }
92378
92400
  toAncestorLineage(path) {
92379
92401
  const ancestorNodes = path.getAncestorNodes();
@@ -92622,7 +92644,11 @@ class AsyncAPI2DereferenceVisitor {
92622
92644
  */
92623
92645
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92624
92646
  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)) {
92647
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
92648
+ if (shouldDetectCircular) {
92649
+ this.visited.add(referencedElement);
92650
+ }
92651
+
92626
92652
  // append referencing reference to ancestors lineage
92627
92653
  directAncestors.add(referencingElement);
92628
92654
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -92630,10 +92656,12 @@ class AsyncAPI2DereferenceVisitor {
92630
92656
  indirections: [...this.indirections],
92631
92657
  options: this.options,
92632
92658
  refractCache: this.refractCache,
92659
+ visited: this.visited,
92633
92660
  ancestors: ancestorsLineage
92634
92661
  });
92635
92662
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
92636
- mutable: true
92663
+ mutable: true,
92664
+ skipVisited: true
92637
92665
  });
92638
92666
 
92639
92667
  // remove referencing reference from ancestors lineage
@@ -92774,7 +92802,11 @@ class AsyncAPI2DereferenceVisitor {
92774
92802
  */
92775
92803
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
92776
92804
  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)) {
92805
+ 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)) {
92806
+ if (shouldDetectCircular) {
92807
+ this.visited.add(referencedElement);
92808
+ }
92809
+
92778
92810
  // append referencing reference to ancestors lineage
92779
92811
  directAncestors.add(referencingElement);
92780
92812
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -92782,10 +92814,12 @@ class AsyncAPI2DereferenceVisitor {
92782
92814
  indirections: [...this.indirections],
92783
92815
  options: this.options,
92784
92816
  refractCache: this.refractCache,
92817
+ visited: this.visited,
92785
92818
  ancestors: ancestorsLineage
92786
92819
  });
92787
92820
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
92788
- mutable: true
92821
+ mutable: true,
92822
+ skipVisited: true
92789
92823
  });
92790
92824
 
92791
92825
  // remove referencing reference from ancestors lineage
@@ -92904,12 +92938,16 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPO
92904
92938
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
92905
92939
  refSet = mutableRefSet;
92906
92940
  }
92941
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
92907
92942
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
92908
92943
  reference: reference,
92909
92944
  options
92910
92945
  });
92911
92946
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
92912
- mutable: true
92947
+ mutable: true,
92948
+ ...(shouldDetectCircular && {
92949
+ skipVisited: true
92950
+ })
92913
92951
  });
92914
92952
 
92915
92953
  /**
@@ -92996,6 +93034,7 @@ class OpenAPI2DereferenceVisitor {
92996
93034
  reference;
92997
93035
  options;
92998
93036
  refractCache;
93037
+ visited;
92999
93038
 
93000
93039
  /**
93001
93040
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -93008,13 +93047,15 @@ class OpenAPI2DereferenceVisitor {
93008
93047
  options,
93009
93048
  indirections = [],
93010
93049
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(),
93011
- refractCache = new WeakMap()
93050
+ refractCache = new WeakMap(),
93051
+ visited = new WeakSet()
93012
93052
  }) {
93013
93053
  this.indirections = indirections;
93014
93054
  this.reference = reference;
93015
93055
  this.options = options;
93016
93056
  this.refractCache = refractCache;
93017
93057
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(...ancestors);
93058
+ this.visited = visited;
93018
93059
  }
93019
93060
  toAncestorLineage(path) {
93020
93061
  const ancestorNodes = path.getAncestorNodes();
@@ -93263,7 +93304,11 @@ class OpenAPI2DereferenceVisitor {
93263
93304
  */
93264
93305
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93265
93306
  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)) {
93307
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
93308
+ if (shouldDetectCircular) {
93309
+ this.visited.add(referencedElement);
93310
+ }
93311
+
93267
93312
  // append referencing reference to ancestors lineage
93268
93313
  directAncestors.add(referencingElement);
93269
93314
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93271,10 +93316,12 @@ class OpenAPI2DereferenceVisitor {
93271
93316
  indirections: [...this.indirections],
93272
93317
  options: this.options,
93273
93318
  refractCache: this.refractCache,
93319
+ visited: this.visited,
93274
93320
  ancestors: ancestorsLineage
93275
93321
  });
93276
93322
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93277
- mutable: true
93323
+ mutable: true,
93324
+ skipVisited: true
93278
93325
  });
93279
93326
  directAncestors.delete(referencingElement);
93280
93327
  }
@@ -93399,7 +93446,11 @@ class OpenAPI2DereferenceVisitor {
93399
93446
  */
93400
93447
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93401
93448
  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)) {
93449
+ 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)) {
93450
+ if (shouldDetectCircular) {
93451
+ this.visited.add(referencedElement);
93452
+ }
93453
+
93403
93454
  // append referencing reference to ancestors lineage
93404
93455
  directAncestors.add(referencingElement);
93405
93456
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93407,10 +93458,12 @@ class OpenAPI2DereferenceVisitor {
93407
93458
  indirections: [...this.indirections],
93408
93459
  options: this.options,
93409
93460
  refractCache: this.refractCache,
93461
+ visited: this.visited,
93410
93462
  ancestors: ancestorsLineage
93411
93463
  });
93412
93464
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93413
- mutable: true
93465
+ mutable: true,
93466
+ skipVisited: true
93414
93467
  });
93415
93468
 
93416
93469
  // remove referencing reference from ancestors lineage
@@ -93554,7 +93607,11 @@ class OpenAPI2DereferenceVisitor {
93554
93607
  */
93555
93608
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
93556
93609
  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)) {
93610
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_11__.isJSONReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
93611
+ if (shouldDetectCircular) {
93612
+ this.visited.add(referencedElement);
93613
+ }
93614
+
93558
93615
  // append referencing reference to ancestors lineage
93559
93616
  directAncestors.add(referencingElement);
93560
93617
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -93562,10 +93619,12 @@ class OpenAPI2DereferenceVisitor {
93562
93619
  indirections: [...this.indirections],
93563
93620
  options: this.options,
93564
93621
  refractCache: this.refractCache,
93622
+ visited: this.visited,
93565
93623
  ancestors: ancestorsLineage
93566
93624
  });
93567
93625
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
93568
- mutable: true
93626
+ mutable: true,
93627
+ skipVisited: true
93569
93628
  });
93570
93629
 
93571
93630
  // remove referencing reference from ancestors lineage
@@ -93677,12 +93736,16 @@ class OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IM
93677
93736
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
93678
93737
  refSet = mutableRefSet;
93679
93738
  }
93739
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
93680
93740
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
93681
93741
  reference: reference,
93682
93742
  options
93683
93743
  });
93684
93744
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
93685
- mutable: true
93745
+ mutable: true,
93746
+ ...(shouldDetectCircular && {
93747
+ skipVisited: true
93748
+ })
93686
93749
  });
93687
93750
 
93688
93751
  /**
@@ -93766,6 +93829,7 @@ class OpenAPI3_0DereferenceVisitor {
93766
93829
  reference;
93767
93830
  options;
93768
93831
  refractCache;
93832
+ visited;
93769
93833
 
93770
93834
  /**
93771
93835
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -93778,13 +93842,15 @@ class OpenAPI3_0DereferenceVisitor {
93778
93842
  options,
93779
93843
  indirections = [],
93780
93844
  ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(),
93781
- refractCache = new WeakMap()
93845
+ refractCache = new WeakMap(),
93846
+ visited = new WeakSet()
93782
93847
  }) {
93783
93848
  this.indirections = indirections;
93784
93849
  this.reference = reference;
93785
93850
  this.options = options;
93786
93851
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(...ancestors);
93787
93852
  this.refractCache = refractCache;
93853
+ this.visited = visited;
93788
93854
  }
93789
93855
  toAncestorLineage(path) {
93790
93856
  const ancestorNodes = path.getAncestorNodes();
@@ -94033,7 +94099,11 @@ class OpenAPI3_0DereferenceVisitor {
94033
94099
  */
94034
94100
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
94035
94101
  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)) {
94102
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
94103
+ if (shouldDetectCircular) {
94104
+ this.visited.add(referencedElement);
94105
+ }
94106
+
94037
94107
  // append referencing reference to ancestors lineage
94038
94108
  directAncestors.add(referencingElement);
94039
94109
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -94041,10 +94111,12 @@ class OpenAPI3_0DereferenceVisitor {
94041
94111
  indirections: [...this.indirections],
94042
94112
  options: this.options,
94043
94113
  refractCache: this.refractCache,
94114
+ visited: this.visited,
94044
94115
  ancestors: ancestorsLineage
94045
94116
  });
94046
94117
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
94047
- mutable: true
94118
+ mutable: true,
94119
+ skipVisited: true
94048
94120
  });
94049
94121
 
94050
94122
  // remove referencing reference from ancestors lineage
@@ -94171,7 +94243,11 @@ class OpenAPI3_0DereferenceVisitor {
94171
94243
  */
94172
94244
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
94173
94245
  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)) {
94246
+ 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)) {
94247
+ if (shouldDetectCircular) {
94248
+ this.visited.add(referencedElement);
94249
+ }
94250
+
94175
94251
  // append referencing reference to ancestors lineage
94176
94252
  directAncestors.add(referencingElement);
94177
94253
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -94179,10 +94255,12 @@ class OpenAPI3_0DereferenceVisitor {
94179
94255
  indirections: [...this.indirections],
94180
94256
  options: this.options,
94181
94257
  refractCache: this.refractCache,
94258
+ visited: this.visited,
94182
94259
  ancestors: ancestorsLineage
94183
94260
  });
94184
94261
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
94185
- mutable: true
94262
+ mutable: true,
94263
+ skipVisited: true
94186
94264
  });
94187
94265
 
94188
94266
  // remove referencing reference from ancestors lineage
@@ -94441,12 +94519,16 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IM
94441
94519
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
94442
94520
  refSet = mutableRefSet;
94443
94521
  }
94522
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
94444
94523
  const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]({
94445
94524
  reference: reference,
94446
94525
  options
94447
94526
  });
94448
94527
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverseAsync)(refSet.rootRef.value, visitor, {
94449
- mutable: true
94528
+ mutable: true,
94529
+ ...(shouldDetectCircular && {
94530
+ skipVisited: true
94531
+ })
94450
94532
  });
94451
94533
 
94452
94534
  /**
@@ -94767,6 +94849,7 @@ class OpenAPI3_1DereferenceVisitor {
94767
94849
  reference;
94768
94850
  options;
94769
94851
  refractCache;
94852
+ visited;
94770
94853
 
94771
94854
  /**
94772
94855
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -94779,13 +94862,15 @@ class OpenAPI3_1DereferenceVisitor {
94779
94862
  options,
94780
94863
  indirections = [],
94781
94864
  refractCache = new WeakMap(),
94782
- ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage()
94865
+ ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(),
94866
+ visited = new WeakSet()
94783
94867
  }) {
94784
94868
  this.indirections = indirections;
94785
94869
  this.reference = reference;
94786
94870
  this.options = options;
94787
94871
  this.refractCache = refractCache;
94788
94872
  this.ancestors = new _util_mjs__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...ancestors);
94873
+ this.visited = visited;
94789
94874
  }
94790
94875
  toAncestorLineage(path) {
94791
94876
  const ancestorNodes = path.getAncestorNodes();
@@ -95034,17 +95119,22 @@ class OpenAPI3_1DereferenceVisitor {
95034
95119
  */
95035
95120
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95036
95121
  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)) {
95122
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
95123
+ if (shouldDetectCircular) {
95124
+ this.visited.add(referencedElement);
95125
+ }
95038
95126
  directAncestors.add(referencingElement);
95039
95127
  const visitor = new OpenAPI3_1DereferenceVisitor({
95040
95128
  reference,
95041
95129
  indirections: [...this.indirections],
95042
95130
  options: this.options,
95043
95131
  refractCache: this.refractCache,
95132
+ visited: this.visited,
95044
95133
  ancestors: ancestorsLineage
95045
95134
  });
95046
95135
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95047
- mutable: true
95136
+ mutable: true,
95137
+ skipVisited: true
95048
95138
  });
95049
95139
  directAncestors.delete(referencingElement);
95050
95140
  }
@@ -95187,17 +95277,22 @@ class OpenAPI3_1DereferenceVisitor {
95187
95277
  */
95188
95278
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95189
95279
  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)) {
95280
+ 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)) {
95281
+ if (shouldDetectCircular) {
95282
+ this.visited.add(referencedElement);
95283
+ }
95191
95284
  directAncestors.add(referencingElement);
95192
95285
  const visitor = new OpenAPI3_1DereferenceVisitor({
95193
95286
  reference,
95194
95287
  indirections: [...this.indirections],
95195
95288
  options: this.options,
95196
95289
  refractCache: this.refractCache,
95290
+ visited: this.visited,
95197
95291
  ancestors: ancestorsLineage
95198
95292
  });
95199
95293
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95200
- mutable: true
95294
+ mutable: true,
95295
+ skipVisited: true
95201
95296
  });
95202
95297
  directAncestors.delete(referencingElement);
95203
95298
  }
@@ -95544,17 +95639,22 @@ class OpenAPI3_1DereferenceVisitor {
95544
95639
  */
95545
95640
  const isNonEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
95546
95641
  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)) {
95642
+ 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)) {
95643
+ if (shouldDetectCircular) {
95644
+ this.visited.add(referencedElement);
95645
+ }
95548
95646
  directAncestors.add(referencingElement);
95549
95647
  const visitor = new OpenAPI3_1DereferenceVisitor({
95550
95648
  reference,
95551
95649
  indirections: [...this.indirections],
95552
95650
  options: this.options,
95553
95651
  refractCache: this.refractCache,
95652
+ visited: this.visited,
95554
95653
  ancestors: ancestorsLineage
95555
95654
  });
95556
95655
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
95557
- mutable: true
95656
+ mutable: true,
95657
+ skipVisited: true
95558
95658
  });
95559
95659
  directAncestors.delete(referencingElement);
95560
95660
  }
@@ -100170,10 +100270,12 @@ function* traverseGenerator(root, visitor, options) {
100170
100270
  nodePredicate,
100171
100271
  nodeCloneFn,
100172
100272
  detectCycles,
100273
+ skipVisited,
100173
100274
  mutable,
100174
100275
  mutationFn
100175
100276
  } = options;
100176
100277
  const keyMapIsFunction = typeof keyMap === 'function';
100278
+ const visitedNodes = skipVisited ? new WeakSet() : null;
100177
100279
  let stack;
100178
100280
  let inArray = Array.isArray(root);
100179
100281
  let keys = [root];
@@ -100259,6 +100361,14 @@ function* traverseGenerator(root, visitor, options) {
100259
100361
  continue;
100260
100362
  }
100261
100363
 
100364
+ // Skip already-visited nodes (handles DAG structures from cloneShallow)
100365
+ if (skipVisited && !isLeaving) {
100366
+ if (visitedNodes.has(node)) {
100367
+ continue;
100368
+ }
100369
+ visitedNodes.add(node);
100370
+ }
100371
+
100262
100372
  // Always create Path for the current node (needed for parentPath chain)
100263
100373
  currentPath = new _Path_mjs__WEBPACK_IMPORTED_MODULE_2__.Path(node, parent, parentPath, key, inArray);
100264
100374
  const visitFn = (0,_visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.getVisitFn)(visitor, nodeTypeGetter(node), isLeaving);
@@ -100402,6 +100512,7 @@ const traverse = (root, visitor, options = {}) => {
100402
100512
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
100403
100513
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
100404
100514
  detectCycles: options.detectCycles ?? true,
100515
+ skipVisited: options.skipVisited ?? false,
100405
100516
  mutable: options.mutable ?? false,
100406
100517
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
100407
100518
  };
@@ -100433,6 +100544,7 @@ const traverseAsync = async (root, visitor, options = {}) => {
100433
100544
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
100434
100545
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
100435
100546
  detectCycles: options.detectCycles ?? true,
100547
+ skipVisited: options.skipVisited ?? false,
100436
100548
  mutable: options.mutable ?? false,
100437
100549
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
100438
100550
  };