@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.
- package/CHANGELOG.md +12 -0
- package/dist/apidom-reference.browser.js +167 -37
- package/dist/apidom-reference.browser.min.js +1 -1
- package/package.json +28 -28
- package/src/dereference/strategies/arazzo-1/index.cjs +5 -1
- package/src/dereference/strategies/arazzo-1/index.mjs +5 -1
- package/src/dereference/strategies/arazzo-1/visitor.cjs +15 -3
- package/src/dereference/strategies/arazzo-1/visitor.mjs +15 -3
- package/src/dereference/strategies/asyncapi-2/index.cjs +5 -1
- package/src/dereference/strategies/asyncapi-2/index.mjs +5 -1
- package/src/dereference/strategies/asyncapi-2/visitor.cjs +23 -5
- package/src/dereference/strategies/asyncapi-2/visitor.mjs +23 -5
- package/src/dereference/strategies/openapi-2/index.cjs +5 -1
- package/src/dereference/strategies/openapi-2/index.mjs +5 -1
- package/src/dereference/strategies/openapi-2/visitor.cjs +33 -7
- package/src/dereference/strategies/openapi-2/visitor.mjs +33 -7
- package/src/dereference/strategies/openapi-3-0/index.cjs +5 -1
- package/src/dereference/strategies/openapi-3-0/index.mjs +5 -1
- package/src/dereference/strategies/openapi-3-0/visitor.cjs +23 -5
- package/src/dereference/strategies/openapi-3-0/visitor.mjs +23 -5
- package/src/dereference/strategies/openapi-3-1/index.cjs +5 -1
- package/src/dereference/strategies/openapi-3-1/index.mjs +5 -1
- package/src/dereference/strategies/openapi-3-1/visitor.cjs +29 -7
- package/src/dereference/strategies/openapi-3-1/visitor.mjs +29 -7
- package/types/dereference/strategies/arazzo-1/visitor.d.ts +3 -1
- package/types/dereference/strategies/asyncapi-2/visitor.d.ts +3 -1
- package/types/dereference/strategies/openapi-2/visitor.d.ts +3 -1
- package/types/dereference/strategies/openapi-3-0/visitor.d.ts +3 -1
- 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
|
};
|