@speclynx/apidom-reference 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.
Files changed (29) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/apidom-reference.browser.js +167 -37
  3. package/dist/apidom-reference.browser.min.js +1 -1
  4. package/package.json +28 -28
  5. package/src/dereference/strategies/arazzo-1/index.cjs +5 -1
  6. package/src/dereference/strategies/arazzo-1/index.mjs +5 -1
  7. package/src/dereference/strategies/arazzo-1/visitor.cjs +15 -3
  8. package/src/dereference/strategies/arazzo-1/visitor.mjs +15 -3
  9. package/src/dereference/strategies/asyncapi-2/index.cjs +5 -1
  10. package/src/dereference/strategies/asyncapi-2/index.mjs +5 -1
  11. package/src/dereference/strategies/asyncapi-2/visitor.cjs +23 -5
  12. package/src/dereference/strategies/asyncapi-2/visitor.mjs +23 -5
  13. package/src/dereference/strategies/openapi-2/index.cjs +5 -1
  14. package/src/dereference/strategies/openapi-2/index.mjs +5 -1
  15. package/src/dereference/strategies/openapi-2/visitor.cjs +33 -7
  16. package/src/dereference/strategies/openapi-2/visitor.mjs +33 -7
  17. package/src/dereference/strategies/openapi-3-0/index.cjs +5 -1
  18. package/src/dereference/strategies/openapi-3-0/index.mjs +5 -1
  19. package/src/dereference/strategies/openapi-3-0/visitor.cjs +23 -5
  20. package/src/dereference/strategies/openapi-3-0/visitor.mjs +23 -5
  21. package/src/dereference/strategies/openapi-3-1/index.cjs +5 -1
  22. package/src/dereference/strategies/openapi-3-1/index.mjs +5 -1
  23. package/src/dereference/strategies/openapi-3-1/visitor.cjs +29 -7
  24. package/src/dereference/strategies/openapi-3-1/visitor.mjs +29 -7
  25. package/types/dereference/strategies/arazzo-1/visitor.d.ts +3 -1
  26. package/types/dereference/strategies/asyncapi-2/visitor.d.ts +3 -1
  27. package/types/dereference/strategies/openapi-2/visitor.d.ts +3 -1
  28. package/types/dereference/strategies/openapi-3-0/visitor.d.ts +3 -1
  29. package/types/dereference/strategies/openapi-3-1/visitor.d.ts +3 -1
@@ -997,12 +997,16 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORT
997
997
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
998
998
  refSet = mutableRefSet;
999
999
  }
1000
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
1000
1001
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_9__["default"]({
1001
1002
  reference,
1002
1003
  options
1003
1004
  });
1004
1005
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
1005
- mutable: true
1006
+ mutable: true,
1007
+ ...(shouldDetectCircular && {
1008
+ skipVisited: true
1009
+ })
1006
1010
  });
1007
1011
 
1008
1012
  /**
@@ -1429,6 +1433,7 @@ class Arazzo1DereferenceVisitor {
1429
1433
  indirections;
1430
1434
  reference;
1431
1435
  options;
1436
+ visited;
1432
1437
 
1433
1438
  /**
1434
1439
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -1440,12 +1445,14 @@ class Arazzo1DereferenceVisitor {
1440
1445
  reference,
1441
1446
  options,
1442
1447
  indirections = [],
1443
- ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage()
1448
+ ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(),
1449
+ visited = new WeakSet()
1444
1450
  }) {
1445
1451
  this.indirections = indirections;
1446
1452
  this.reference = reference;
1447
1453
  this.options = options;
1448
1454
  this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(...ancestors);
1455
+ this.visited = visited;
1449
1456
  }
1450
1457
  toAncestorLineage(path) {
1451
1458
  const ancestorNodes = path.getAncestorNodes();
@@ -1659,6 +1666,7 @@ class Arazzo1DereferenceVisitor {
1659
1666
  * Transclude referencing element with merged referenced element.
1660
1667
  */
1661
1668
  path.replaceWith(mergedElement);
1669
+ path.skip();
1662
1670
  }
1663
1671
  async JSONSchemaElement(path) {
1664
1672
  const referencingElement = path.node;
@@ -1819,6 +1827,7 @@ class Arazzo1DereferenceVisitor {
1819
1827
  const replacer = this.options.dereference.strategyOpts['arazzo-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
1820
1828
  const replacement = replacer(refElement);
1821
1829
  path.replaceWith(replacement);
1830
+ path.skip();
1822
1831
  return;
1823
1832
  }
1824
1833
  }
@@ -1834,17 +1843,23 @@ class Arazzo1DereferenceVisitor {
1834
1843
  */
1835
1844
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_22__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
1836
1845
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
1837
- 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)) {
1846
+ 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)) {
1847
+ if (shouldDetectCircular) {
1848
+ this.visited.add(referencedElement);
1849
+ }
1850
+
1838
1851
  // append referencing reference to ancestors lineage
1839
1852
  directAncestors.add(referencingElement);
1840
1853
  const visitor = new Arazzo1DereferenceVisitor({
1841
1854
  reference,
1842
1855
  indirections: [...this.indirections],
1843
1856
  options: this.options,
1857
+ visited: this.visited,
1844
1858
  ancestors: ancestorsLineage
1845
1859
  });
1846
1860
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
1847
- mutable: true
1861
+ mutable: true,
1862
+ skipVisited: true
1848
1863
  });
1849
1864
 
1850
1865
  // remove referencing reference from ancestors lineage
@@ -1862,6 +1877,7 @@ class Arazzo1DereferenceVisitor {
1862
1877
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
1863
1878
  booleanJsonSchemaElement.meta.set('ref-type', referencingElement.element);
1864
1879
  path.replaceWith(booleanJsonSchemaElement);
1880
+ path.skip();
1865
1881
  return;
1866
1882
  }
1867
1883
 
@@ -1977,12 +1993,16 @@ class AsyncAPI2DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPO
1977
1993
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
1978
1994
  refSet = mutableRefSet;
1979
1995
  }
1996
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
1980
1997
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_7__["default"]({
1981
1998
  reference,
1982
1999
  options
1983
2000
  });
1984
2001
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
1985
- mutable: true
2002
+ mutable: true,
2003
+ ...(shouldDetectCircular && {
2004
+ skipVisited: true
2005
+ })
1986
2006
  });
1987
2007
 
1988
2008
  /**
@@ -2067,6 +2087,7 @@ class AsyncAPI2DereferenceVisitor {
2067
2087
  reference;
2068
2088
  options;
2069
2089
  refractCache;
2090
+ visited;
2070
2091
 
2071
2092
  /**
2072
2093
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -2079,13 +2100,15 @@ class AsyncAPI2DereferenceVisitor {
2079
2100
  options,
2080
2101
  indirections = [],
2081
2102
  ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(),
2082
- refractCache = new WeakMap()
2103
+ refractCache = new WeakMap(),
2104
+ visited = new WeakSet()
2083
2105
  }) {
2084
2106
  this.indirections = indirections;
2085
2107
  this.reference = reference;
2086
2108
  this.options = options;
2087
2109
  this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_17__.AncestorLineage(...ancestors);
2088
2110
  this.refractCache = refractCache;
2111
+ this.visited = visited;
2089
2112
  }
2090
2113
  toAncestorLineage(path) {
2091
2114
  const ancestorNodes = path.getAncestorNodes();
@@ -2318,6 +2341,7 @@ class AsyncAPI2DereferenceVisitor {
2318
2341
  const replacer = this.options.dereference.strategyOpts['asyncapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
2319
2342
  const replacement = replacer(refElement);
2320
2343
  path.replaceWith(replacement);
2344
+ path.skip();
2321
2345
  return;
2322
2346
  }
2323
2347
  }
@@ -2333,7 +2357,11 @@ class AsyncAPI2DereferenceVisitor {
2333
2357
  */
2334
2358
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
2335
2359
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
2336
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
2360
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_10__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
2361
+ if (shouldDetectCircular) {
2362
+ this.visited.add(referencedElement);
2363
+ }
2364
+
2337
2365
  // append referencing reference to ancestors lineage
2338
2366
  directAncestors.add(referencingElement);
2339
2367
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -2341,10 +2369,12 @@ class AsyncAPI2DereferenceVisitor {
2341
2369
  indirections: [...this.indirections],
2342
2370
  options: this.options,
2343
2371
  refractCache: this.refractCache,
2372
+ visited: this.visited,
2344
2373
  ancestors: ancestorsLineage
2345
2374
  });
2346
2375
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
2347
- mutable: true
2376
+ mutable: true,
2377
+ skipVisited: true
2348
2378
  });
2349
2379
 
2350
2380
  // remove referencing reference from ancestors lineage
@@ -2362,6 +2392,7 @@ class AsyncAPI2DereferenceVisitor {
2362
2392
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
2363
2393
  booleanJsonSchemaElement.meta.set('ref-type', referencingElement.element);
2364
2394
  path.replaceWith(booleanJsonSchemaElement);
2395
+ path.skip();
2365
2396
  return;
2366
2397
  }
2367
2398
 
@@ -2381,6 +2412,7 @@ class AsyncAPI2DereferenceVisitor {
2381
2412
  * Transclude referencing element with merged referenced element.
2382
2413
  */
2383
2414
  path.replaceWith(mergedElement);
2415
+ path.skip();
2384
2416
  } catch (error) {
2385
2417
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
2386
2418
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -2483,7 +2515,11 @@ class AsyncAPI2DereferenceVisitor {
2483
2515
  */
2484
2516
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_18__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
2485
2517
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
2486
- 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)) {
2518
+ 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)) {
2519
+ if (shouldDetectCircular) {
2520
+ this.visited.add(referencedElement);
2521
+ }
2522
+
2487
2523
  // append referencing reference to ancestors lineage
2488
2524
  directAncestors.add(referencingElement);
2489
2525
  const visitor = new AsyncAPI2DereferenceVisitor({
@@ -2491,10 +2527,12 @@ class AsyncAPI2DereferenceVisitor {
2491
2527
  indirections: [...this.indirections],
2492
2528
  options: this.options,
2493
2529
  refractCache: this.refractCache,
2530
+ visited: this.visited,
2494
2531
  ancestors: ancestorsLineage
2495
2532
  });
2496
2533
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
2497
- mutable: true
2534
+ mutable: true,
2535
+ skipVisited: true
2498
2536
  });
2499
2537
 
2500
2538
  // remove referencing reference from ancestors lineage
@@ -2615,12 +2653,16 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPOR
2615
2653
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
2616
2654
  refSet = mutableRefSet;
2617
2655
  }
2656
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
2618
2657
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_7__["default"]({
2619
2658
  reference: reference,
2620
2659
  options
2621
2660
  });
2622
2661
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
2623
- mutable: true
2662
+ mutable: true,
2663
+ ...(shouldDetectCircular && {
2664
+ skipVisited: true
2665
+ })
2624
2666
  });
2625
2667
 
2626
2668
  /**
@@ -2709,6 +2751,7 @@ class OpenAPI2DereferenceVisitor {
2709
2751
  reference;
2710
2752
  options;
2711
2753
  refractCache;
2754
+ visited;
2712
2755
 
2713
2756
  /**
2714
2757
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -2721,13 +2764,15 @@ class OpenAPI2DereferenceVisitor {
2721
2764
  options,
2722
2765
  indirections = [],
2723
2766
  ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(),
2724
- refractCache = new WeakMap()
2767
+ refractCache = new WeakMap(),
2768
+ visited = new WeakSet()
2725
2769
  }) {
2726
2770
  this.indirections = indirections;
2727
2771
  this.reference = reference;
2728
2772
  this.options = options;
2729
2773
  this.refractCache = refractCache;
2730
2774
  this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_19__.AncestorLineage(...ancestors);
2775
+ this.visited = visited;
2731
2776
  }
2732
2777
  toAncestorLineage(path) {
2733
2778
  const ancestorNodes = path.getAncestorNodes();
@@ -2960,6 +3005,7 @@ class OpenAPI2DereferenceVisitor {
2960
3005
  const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
2961
3006
  const replacement = replacer(refElement);
2962
3007
  path.replaceWith(replacement);
3008
+ path.skip();
2963
3009
  return;
2964
3010
  }
2965
3011
  }
@@ -2975,7 +3021,11 @@ class OpenAPI2DereferenceVisitor {
2975
3021
  */
2976
3022
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
2977
3023
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
2978
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
3024
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_14__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
3025
+ if (shouldDetectCircular) {
3026
+ this.visited.add(referencedElement);
3027
+ }
3028
+
2979
3029
  // append referencing reference to ancestors lineage
2980
3030
  directAncestors.add(referencingElement);
2981
3031
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -2983,10 +3033,12 @@ class OpenAPI2DereferenceVisitor {
2983
3033
  indirections: [...this.indirections],
2984
3034
  options: this.options,
2985
3035
  refractCache: this.refractCache,
3036
+ visited: this.visited,
2986
3037
  ancestors: ancestorsLineage
2987
3038
  });
2988
3039
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
2989
- mutable: true
3040
+ mutable: true,
3041
+ skipVisited: true
2990
3042
  });
2991
3043
  directAncestors.delete(referencingElement);
2992
3044
  }
@@ -3007,6 +3059,7 @@ class OpenAPI2DereferenceVisitor {
3007
3059
  * Transclude referencing element with merged referenced element.
3008
3060
  */
3009
3061
  path.replaceWith(mergedElement);
3062
+ path.skip();
3010
3063
  } catch (error) {
3011
3064
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
3012
3065
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -3094,6 +3147,7 @@ class OpenAPI2DereferenceVisitor {
3094
3147
  const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
3095
3148
  const replacement = replacer(refElement);
3096
3149
  path.replaceWith(replacement);
3150
+ path.skip();
3097
3151
  return;
3098
3152
  }
3099
3153
  }
@@ -3109,7 +3163,11 @@ class OpenAPI2DereferenceVisitor {
3109
3163
  */
3110
3164
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
3111
3165
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
3112
- 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)) {
3166
+ 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)) {
3167
+ if (shouldDetectCircular) {
3168
+ this.visited.add(referencedElement);
3169
+ }
3170
+
3113
3171
  // append referencing reference to ancestors lineage
3114
3172
  directAncestors.add(referencingElement);
3115
3173
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -3117,10 +3175,12 @@ class OpenAPI2DereferenceVisitor {
3117
3175
  indirections: [...this.indirections],
3118
3176
  options: this.options,
3119
3177
  refractCache: this.refractCache,
3178
+ visited: this.visited,
3120
3179
  ancestors: ancestorsLineage
3121
3180
  });
3122
3181
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
3123
- mutable: true
3182
+ mutable: true,
3183
+ skipVisited: true
3124
3184
  });
3125
3185
 
3126
3186
  // remove referencing reference from ancestors lineage
@@ -3248,6 +3308,7 @@ class OpenAPI2DereferenceVisitor {
3248
3308
  const replacer = this.options.dereference.strategyOpts['openapi-2']?.circularReplacer ?? this.options.dereference.circularReplacer;
3249
3309
  const replacement = replacer(refElement);
3250
3310
  path.replaceWith(replacement);
3311
+ path.skip();
3251
3312
  return;
3252
3313
  }
3253
3314
  }
@@ -3263,7 +3324,11 @@ class OpenAPI2DereferenceVisitor {
3263
3324
  */
3264
3325
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_20__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
3265
3326
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
3266
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_11__.isJSONReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
3327
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_11__.isJSONReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
3328
+ if (shouldDetectCircular) {
3329
+ this.visited.add(referencedElement);
3330
+ }
3331
+
3267
3332
  // append referencing reference to ancestors lineage
3268
3333
  directAncestors.add(referencingElement);
3269
3334
  const visitor = new OpenAPI2DereferenceVisitor({
@@ -3271,10 +3336,12 @@ class OpenAPI2DereferenceVisitor {
3271
3336
  indirections: [...this.indirections],
3272
3337
  options: this.options,
3273
3338
  refractCache: this.refractCache,
3339
+ visited: this.visited,
3274
3340
  ancestors: ancestorsLineage
3275
3341
  });
3276
3342
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(referencedElement, visitor, {
3277
- mutable: true
3343
+ mutable: true,
3344
+ skipVisited: true
3278
3345
  });
3279
3346
 
3280
3347
  // remove referencing reference from ancestors lineage
@@ -3297,6 +3364,7 @@ class OpenAPI2DereferenceVisitor {
3297
3364
  * Transclude referencing element with merged referenced element.
3298
3365
  */
3299
3366
  path.replaceWith(mergedElement);
3367
+ path.skip();
3300
3368
  } catch (error) {
3301
3369
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
3302
3370
  this.handleError(`Error while dereferencing JSON Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -3387,12 +3455,16 @@ class OpenAPI3_0DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMP
3387
3455
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
3388
3456
  refSet = mutableRefSet;
3389
3457
  }
3458
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
3390
3459
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_7__["default"]({
3391
3460
  reference: reference,
3392
3461
  options
3393
3462
  });
3394
3463
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
3395
- mutable: true
3464
+ mutable: true,
3465
+ ...(shouldDetectCircular && {
3466
+ skipVisited: true
3467
+ })
3396
3468
  });
3397
3469
 
3398
3470
  /**
@@ -3478,6 +3550,7 @@ class OpenAPI3_0DereferenceVisitor {
3478
3550
  reference;
3479
3551
  options;
3480
3552
  refractCache;
3553
+ visited;
3481
3554
 
3482
3555
  /**
3483
3556
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -3490,13 +3563,15 @@ class OpenAPI3_0DereferenceVisitor {
3490
3563
  options,
3491
3564
  indirections = [],
3492
3565
  ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(),
3493
- refractCache = new WeakMap()
3566
+ refractCache = new WeakMap(),
3567
+ visited = new WeakSet()
3494
3568
  }) {
3495
3569
  this.indirections = indirections;
3496
3570
  this.reference = reference;
3497
3571
  this.options = options;
3498
3572
  this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_20__.AncestorLineage(...ancestors);
3499
3573
  this.refractCache = refractCache;
3574
+ this.visited = visited;
3500
3575
  }
3501
3576
  toAncestorLineage(path) {
3502
3577
  const ancestorNodes = path.getAncestorNodes();
@@ -3729,6 +3804,7 @@ class OpenAPI3_0DereferenceVisitor {
3729
3804
  const replacer = this.options.dereference.strategyOpts['openapi-3-0']?.circularReplacer ?? this.options.dereference.circularReplacer;
3730
3805
  const replacement = replacer(refElement);
3731
3806
  path.replaceWith(replacement);
3807
+ path.skip();
3732
3808
  return;
3733
3809
  }
3734
3810
  }
@@ -3744,7 +3820,11 @@ class OpenAPI3_0DereferenceVisitor {
3744
3820
  */
3745
3821
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
3746
3822
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
3747
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
3823
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
3824
+ if (shouldDetectCircular) {
3825
+ this.visited.add(referencedElement);
3826
+ }
3827
+
3748
3828
  // append referencing reference to ancestors lineage
3749
3829
  directAncestors.add(referencingElement);
3750
3830
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -3752,10 +3832,12 @@ class OpenAPI3_0DereferenceVisitor {
3752
3832
  indirections: [...this.indirections],
3753
3833
  options: this.options,
3754
3834
  refractCache: this.refractCache,
3835
+ visited: this.visited,
3755
3836
  ancestors: ancestorsLineage
3756
3837
  });
3757
3838
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
3758
- mutable: true
3839
+ mutable: true,
3840
+ skipVisited: true
3759
3841
  });
3760
3842
 
3761
3843
  // remove referencing reference from ancestors lineage
@@ -3778,6 +3860,7 @@ class OpenAPI3_0DereferenceVisitor {
3778
3860
  * Transclude referencing element with merged referenced element.
3779
3861
  */
3780
3862
  path.replaceWith(mergedElement);
3863
+ path.skip();
3781
3864
  } catch (error) {
3782
3865
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref);
3783
3866
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -3865,6 +3948,7 @@ class OpenAPI3_0DereferenceVisitor {
3865
3948
  const replacer = this.options.dereference.strategyOpts['openapi-3-0']?.circularReplacer ?? this.options.dereference.circularReplacer;
3866
3949
  const replacement = replacer(refElement);
3867
3950
  path.replaceWith(replacement);
3951
+ path.skip();
3868
3952
  return;
3869
3953
  }
3870
3954
  }
@@ -3880,7 +3964,11 @@ class OpenAPI3_0DereferenceVisitor {
3880
3964
  */
3881
3965
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_17__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
3882
3966
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
3883
- 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)) {
3967
+ 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)) {
3968
+ if (shouldDetectCircular) {
3969
+ this.visited.add(referencedElement);
3970
+ }
3971
+
3884
3972
  // append referencing reference to ancestors lineage
3885
3973
  directAncestors.add(referencingElement);
3886
3974
  const visitor = new OpenAPI3_0DereferenceVisitor({
@@ -3888,10 +3976,12 @@ class OpenAPI3_0DereferenceVisitor {
3888
3976
  indirections: [...this.indirections],
3889
3977
  options: this.options,
3890
3978
  refractCache: this.refractCache,
3979
+ visited: this.visited,
3891
3980
  ancestors: ancestorsLineage
3892
3981
  });
3893
3982
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
3894
- mutable: true
3983
+ mutable: true,
3984
+ skipVisited: true
3895
3985
  });
3896
3986
 
3897
3987
  // remove referencing reference from ancestors lineage
@@ -4152,12 +4242,16 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMP
4152
4242
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
4153
4243
  refSet = mutableRefSet;
4154
4244
  }
4245
+ const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
4155
4246
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_8__["default"]({
4156
4247
  reference: reference,
4157
4248
  options
4158
4249
  });
4159
4250
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverseAsync)(refSet.rootRef.value, visitor, {
4160
- mutable: true
4251
+ mutable: true,
4252
+ ...(shouldDetectCircular && {
4253
+ skipVisited: true
4254
+ })
4161
4255
  });
4162
4256
 
4163
4257
  /**
@@ -4483,6 +4577,7 @@ class OpenAPI3_1DereferenceVisitor {
4483
4577
  reference;
4484
4578
  options;
4485
4579
  refractCache;
4580
+ visited;
4486
4581
 
4487
4582
  /**
4488
4583
  * Tracks element ancestors across dive-deep traversal boundaries.
@@ -4495,13 +4590,15 @@ class OpenAPI3_1DereferenceVisitor {
4495
4590
  options,
4496
4591
  indirections = [],
4497
4592
  refractCache = new WeakMap(),
4498
- ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage()
4593
+ ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(),
4594
+ visited = new WeakSet()
4499
4595
  }) {
4500
4596
  this.indirections = indirections;
4501
4597
  this.reference = reference;
4502
4598
  this.options = options;
4503
4599
  this.refractCache = refractCache;
4504
4600
  this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...ancestors);
4601
+ this.visited = visited;
4505
4602
  }
4506
4603
  toAncestorLineage(path) {
4507
4604
  const ancestorNodes = path.getAncestorNodes();
@@ -4734,6 +4831,7 @@ class OpenAPI3_1DereferenceVisitor {
4734
4831
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
4735
4832
  const replacement = replacer(refElement);
4736
4833
  path.replaceWith(replacement);
4834
+ path.skip();
4737
4835
  return;
4738
4836
  }
4739
4837
  }
@@ -4749,17 +4847,22 @@ class OpenAPI3_1DereferenceVisitor {
4749
4847
  */
4750
4848
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
4751
4849
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
4752
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
4850
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
4851
+ if (shouldDetectCircular) {
4852
+ this.visited.add(referencedElement);
4853
+ }
4753
4854
  directAncestors.add(referencingElement);
4754
4855
  const visitor = new OpenAPI3_1DereferenceVisitor({
4755
4856
  reference,
4756
4857
  indirections: [...this.indirections],
4757
4858
  options: this.options,
4758
4859
  refractCache: this.refractCache,
4860
+ visited: this.visited,
4759
4861
  ancestors: ancestorsLineage
4760
4862
  });
4761
4863
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
4762
- mutable: true
4864
+ mutable: true,
4865
+ skipVisited: true
4763
4866
  });
4764
4867
  directAncestors.delete(referencingElement);
4765
4868
  }
@@ -4886,6 +4989,7 @@ class OpenAPI3_1DereferenceVisitor {
4886
4989
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
4887
4990
  const replacement = replacer(refElement);
4888
4991
  path.replaceWith(replacement);
4992
+ path.skip();
4889
4993
  return;
4890
4994
  }
4891
4995
  }
@@ -4901,17 +5005,22 @@ class OpenAPI3_1DereferenceVisitor {
4901
5005
  */
4902
5006
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
4903
5007
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
4904
- 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)) {
5008
+ 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)) {
5009
+ if (shouldDetectCircular) {
5010
+ this.visited.add(referencedElement);
5011
+ }
4905
5012
  directAncestors.add(referencingElement);
4906
5013
  const visitor = new OpenAPI3_1DereferenceVisitor({
4907
5014
  reference,
4908
5015
  indirections: [...this.indirections],
4909
5016
  options: this.options,
4910
5017
  refractCache: this.refractCache,
5018
+ visited: this.visited,
4911
5019
  ancestors: ancestorsLineage
4912
5020
  });
4913
5021
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
4914
- mutable: true
5022
+ mutable: true,
5023
+ skipVisited: true
4915
5024
  });
4916
5025
  directAncestors.delete(referencingElement);
4917
5026
  }
@@ -5242,6 +5351,7 @@ class OpenAPI3_1DereferenceVisitor {
5242
5351
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
5243
5352
  const replacement = replacer(refElement);
5244
5353
  path.replaceWith(replacement);
5354
+ path.skip();
5245
5355
  return;
5246
5356
  }
5247
5357
  }
@@ -5257,17 +5367,22 @@ class OpenAPI3_1DereferenceVisitor {
5257
5367
  */
5258
5368
  const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
5259
5369
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
5260
- 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)) {
5370
+ 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)) {
5371
+ if (shouldDetectCircular) {
5372
+ this.visited.add(referencedElement);
5373
+ }
5261
5374
  directAncestors.add(referencingElement);
5262
5375
  const visitor = new OpenAPI3_1DereferenceVisitor({
5263
5376
  reference,
5264
5377
  indirections: [...this.indirections],
5265
5378
  options: this.options,
5266
5379
  refractCache: this.refractCache,
5380
+ visited: this.visited,
5267
5381
  ancestors: ancestorsLineage
5268
5382
  });
5269
5383
  referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
5270
- mutable: true
5384
+ mutable: true,
5385
+ skipVisited: true
5271
5386
  });
5272
5387
  directAncestors.delete(referencingElement);
5273
5388
  }
@@ -5283,6 +5398,7 @@ class OpenAPI3_1DereferenceVisitor {
5283
5398
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
5284
5399
  booleanJsonSchemaElement.meta.set('ref-type', referencingElement.element);
5285
5400
  path.replaceWith(booleanJsonSchemaElement);
5401
+ path.skip();
5286
5402
  return;
5287
5403
  }
5288
5404
 
@@ -99222,10 +99338,12 @@ function* traverseGenerator(root, visitor, options) {
99222
99338
  nodePredicate,
99223
99339
  nodeCloneFn,
99224
99340
  detectCycles,
99341
+ skipVisited,
99225
99342
  mutable,
99226
99343
  mutationFn
99227
99344
  } = options;
99228
99345
  const keyMapIsFunction = typeof keyMap === 'function';
99346
+ const visitedNodes = skipVisited ? new WeakSet() : null;
99229
99347
  let stack;
99230
99348
  let inArray = Array.isArray(root);
99231
99349
  let keys = [root];
@@ -99311,6 +99429,14 @@ function* traverseGenerator(root, visitor, options) {
99311
99429
  continue;
99312
99430
  }
99313
99431
 
99432
+ // Skip already-visited nodes (handles DAG structures from cloneShallow)
99433
+ if (skipVisited && !isLeaving) {
99434
+ if (visitedNodes.has(node)) {
99435
+ continue;
99436
+ }
99437
+ visitedNodes.add(node);
99438
+ }
99439
+
99314
99440
  // Always create Path for the current node (needed for parentPath chain)
99315
99441
  currentPath = new _Path_mjs__WEBPACK_IMPORTED_MODULE_2__.Path(node, parent, parentPath, key, inArray);
99316
99442
  const visitFn = (0,_visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.getVisitFn)(visitor, nodeTypeGetter(node), isLeaving);
@@ -99331,11 +99457,6 @@ function* traverseGenerator(root, visitor, options) {
99331
99457
  if (currentPath.shouldStop) {
99332
99458
  break;
99333
99459
  }
99334
- if (currentPath.shouldSkip) {
99335
- if (!isLeaving) {
99336
- continue;
99337
- }
99338
- }
99339
99460
  if (currentPath.removed) {
99340
99461
  edits.push([key, null]);
99341
99462
  if (!isLeaving) {
@@ -99345,12 +99466,19 @@ function* traverseGenerator(root, visitor, options) {
99345
99466
  const replacement = currentPath._getReplacementNode();
99346
99467
  edits.push([key, replacement]);
99347
99468
  if (!isLeaving) {
99469
+ if (currentPath.shouldSkip) {
99470
+ continue;
99471
+ }
99348
99472
  if (nodePredicate(replacement)) {
99349
99473
  node = replacement;
99350
99474
  } else {
99351
99475
  continue;
99352
99476
  }
99353
99477
  }
99478
+ } else if (currentPath.shouldSkip) {
99479
+ if (!isLeaving) {
99480
+ continue;
99481
+ }
99354
99482
  } else if (result !== undefined) {
99355
99483
  // Support return value replacement for backwards compatibility
99356
99484
  edits.push([key, result]);
@@ -99452,6 +99580,7 @@ const traverse = (root, visitor, options = {}) => {
99452
99580
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
99453
99581
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
99454
99582
  detectCycles: options.detectCycles ?? true,
99583
+ skipVisited: options.skipVisited ?? false,
99455
99584
  mutable: options.mutable ?? false,
99456
99585
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
99457
99586
  };
@@ -99483,6 +99612,7 @@ const traverseAsync = async (root, visitor, options = {}) => {
99483
99612
  nodePredicate: options.nodePredicate ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.isNode,
99484
99613
  nodeCloneFn: options.nodeCloneFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.cloneNode,
99485
99614
  detectCycles: options.detectCycles ?? true,
99615
+ skipVisited: options.skipVisited ?? false,
99486
99616
  mutable: options.mutable ?? false,
99487
99617
  mutationFn: options.mutationFn ?? _visitors_mjs__WEBPACK_IMPORTED_MODULE_3__.mutateNode
99488
99618
  };