swagger-client 3.26.8 → 3.27.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.
@@ -2192,11 +2192,12 @@ __webpack_require__.r(__webpack_exports__);
2192
2192
  /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(46571);
2193
2193
  /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(68618);
2194
2194
  /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1667);
2195
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(87024);
2195
2196
  /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(31387);
2196
2197
  /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(12349);
2197
2198
  /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(57016);
2198
2199
  /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(41544);
2199
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(66648);
2200
+ /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(66648);
2200
2201
  /* harmony import */ var _visitors_dereference_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7882);
2201
2202
  /* harmony import */ var _visitors_parameters_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(53628);
2202
2203
  /* harmony import */ var _visitors_properties_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(85001);
@@ -2214,7 +2215,6 @@ const visitAsync = _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__.visit[S
2214
2215
  const mergeAllVisitorsAsync = _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__.mergeAll[Symbol.for('nodejs.util.promisify.custom')];
2215
2216
  const OpenApi3_1SwaggerClientDereferenceStrategy = _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_6__["default"].compose({
2216
2217
  props: {
2217
- useCircularStructures: true,
2218
2218
  allowMetaPatches: false,
2219
2219
  parameterMacro: null,
2220
2220
  modelPropertyMacro: null,
@@ -2222,7 +2222,6 @@ const OpenApi3_1SwaggerClientDereferenceStrategy = _swagger_api_apidom_reference
2222
2222
  ancestors: null
2223
2223
  },
2224
2224
  init({
2225
- useCircularStructures = this.useCircularStructures,
2226
2225
  allowMetaPatches = this.allowMetaPatches,
2227
2226
  parameterMacro = this.parameterMacro,
2228
2227
  modelPropertyMacro = this.modelPropertyMacro,
@@ -2230,7 +2229,6 @@ const OpenApi3_1SwaggerClientDereferenceStrategy = _swagger_api_apidom_reference
2230
2229
  ancestors = []
2231
2230
  } = {}) {
2232
2231
  this.name = 'openapi-3-1-swagger-client';
2233
- this.useCircularStructures = useCircularStructures;
2234
2232
  this.allowMetaPatches = allowMetaPatches;
2235
2233
  this.parameterMacro = parameterMacro;
2236
2234
  this.modelPropertyMacro = modelPropertyMacro;
@@ -2241,17 +2239,32 @@ const OpenApi3_1SwaggerClientDereferenceStrategy = _swagger_api_apidom_reference
2241
2239
  async dereference(file, options) {
2242
2240
  const visitors = [];
2243
2241
  const namespace = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_7__.createNamespace)(_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_8__["default"]);
2244
- const refSet = options.dereference.refSet ?? (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__["default"])();
2242
+ const immutableRefSet = options.dereference.refSet ?? (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__["default"])();
2243
+ const mutableRefsSet = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__["default"])();
2244
+ let refSet = immutableRefSet;
2245
2245
  let reference;
2246
- if (!refSet.has(file.uri)) {
2246
+ if (!immutableRefSet.has(file.uri)) {
2247
2247
  reference = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_10__["default"])({
2248
2248
  uri: file.uri,
2249
2249
  value: file.parseResult
2250
2250
  });
2251
- refSet.add(reference);
2251
+ immutableRefSet.add(reference);
2252
2252
  } else {
2253
2253
  // pre-computed refSet was provided as configuration option
2254
- reference = refSet.find(ref => ref.uri === file.uri);
2254
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
2255
+ }
2256
+
2257
+ /**
2258
+ * Clone refSet due the dereferencing process being mutable.
2259
+ * We don't want to mutate the original refSet and the references.
2260
+ */
2261
+ if (options.dereference.immutable) {
2262
+ immutableRefSet.refs.map(ref => (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_10__["default"])({
2263
+ ...ref,
2264
+ value: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__.cloneDeep)(ref.value)
2265
+ })).forEach(ref => mutableRefsSet.add(ref));
2266
+ reference = mutableRefsSet.find(ref => ref.uri === file.uri);
2267
+ refSet = mutableRefsSet;
2255
2268
  }
2256
2269
 
2257
2270
  // create main dereference visitor
@@ -2259,7 +2272,6 @@ const OpenApi3_1SwaggerClientDereferenceStrategy = _swagger_api_apidom_reference
2259
2272
  reference,
2260
2273
  namespace,
2261
2274
  options,
2262
- useCircularStructures: this.useCircularStructures,
2263
2275
  allowMetaPatches: this.allowMetaPatches,
2264
2276
  ancestors: this.ancestors
2265
2277
  });
@@ -2293,20 +2305,33 @@ const OpenApi3_1SwaggerClientDereferenceStrategy = _swagger_api_apidom_reference
2293
2305
 
2294
2306
  // establish root visitor by visitor merging
2295
2307
  const rootVisitor = mergeAllVisitorsAsync(visitors, {
2296
- nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.getNodeType
2308
+ nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_12__.getNodeType
2297
2309
  });
2298
2310
  const dereferencedElement = await visitAsync(refSet.rootRef.value, rootVisitor, {
2299
- keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.keyMap,
2300
- nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.getNodeType
2311
+ keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_12__.keyMap,
2312
+ nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_12__.getNodeType
2301
2313
  });
2302
2314
 
2303
2315
  /**
2304
- * Release all memory if this refSet was not provided as a configuration option.
2316
+ * If immutable option is set, replay refs from the refSet.
2317
+ */
2318
+ if (options.dereference.immutable) {
2319
+ mutableRefsSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_10__["default"])({
2320
+ ...ref,
2321
+ uri: ref.uri.replace(/^immutable:\/\//, '')
2322
+ })).forEach(ref => immutableRefSet.add(ref));
2323
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
2324
+ refSet = immutableRefSet;
2325
+ }
2326
+
2327
+ /**
2328
+ * Release all memory if this refSet was not provided as an configuration option.
2305
2329
  * If provided as configuration option, then provider is responsible for cleanup.
2306
2330
  */
2307
2331
  if (options.dereference.refSet === null) {
2308
- refSet.clean();
2332
+ immutableRefSet.clean();
2309
2333
  }
2334
+ mutableRefsSet.clean();
2310
2335
  return dereferencedElement;
2311
2336
  }
2312
2337
  }
@@ -2406,11 +2431,8 @@ __webpack_require__.r(__webpack_exports__);
2406
2431
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2407
2432
  /* harmony export */ });
2408
2433
  /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(33501);
2409
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9999);
2410
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(87024);
2411
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(15461);
2412
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3117);
2413
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(70281);
2434
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(15461);
2435
+ /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(70281);
2414
2436
  /* harmony import */ var _utils_compose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79170);
2415
2437
  /* harmony import */ var _utils_to_path_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12201);
2416
2438
 
@@ -2440,48 +2462,57 @@ const AllOfVisitor = (0,_utils_compose_js__WEBPACK_IMPORTED_MODULE_0__["default"
2440
2462
 
2441
2463
  // remove allOf keyword if empty
2442
2464
  if (schemaElement.allOf.isEmpty) {
2443
- return new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__.SchemaElement(schemaElement.content.filter(memberElement => (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(memberElement.key) !== 'allOf'), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__.cloneDeep)(schemaElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__.cloneDeep)(schemaElement.attributes));
2465
+ schemaElement.remove('allOf');
2466
+ return undefined;
2444
2467
  }
2445
2468
 
2446
2469
  // collect errors if allOf keyword contains anything else than Schema Object
2447
- const includesSchemaElementOnly = schemaElement.allOf.content.every(_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_6__.isSchemaElement);
2470
+ const includesSchemaElementOnly = schemaElement.allOf.content.every(_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__.isSchemaElement);
2448
2471
  if (!includesSchemaElementOnly) {
2449
2472
  const error = new TypeError('Elements in allOf must be objects');
2450
2473
  error.fullPath = [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_2__["default"])([...ancestors, parent, schemaElement]), 'allOf'];
2451
2474
  this.options.dereference.dereferenceOpts?.errors?.push?.(error);
2452
2475
  return undefined;
2453
2476
  }
2454
- const mergedSchemaElement = _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"].all([...schemaElement.allOf.content, schemaElement]);
2477
+ while (schemaElement.hasKey('allOf')) {
2478
+ const {
2479
+ allOf
2480
+ } = schemaElement;
2481
+ schemaElement.remove('allOf');
2482
+ const allOfMerged = _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"].all([...allOf.content, schemaElement]);
2455
2483
 
2456
- /**
2457
- * If there was not an original $$ref value, make sure to remove
2458
- * any $$ref value that may exist from the result of `allOf` merges.
2459
- */
2460
- if (!schemaElement.hasKey('$$ref')) {
2461
- mergedSchemaElement.remove('$$ref');
2462
- }
2484
+ /**
2485
+ * If there was not an original $$ref value, make sure to remove
2486
+ * any $$ref value that may exist from the result of `allOf` merges.
2487
+ */
2488
+ if (!schemaElement.hasKey('$$ref')) {
2489
+ allOfMerged.remove('$$ref');
2490
+ }
2463
2491
 
2464
- /**
2465
- * If there was an example keyword in the original definition,
2466
- * keep it instead of merging with example from other schema.
2467
- */
2468
- if (schemaElement.hasKey('example')) {
2469
- const member = mergedSchemaElement.getMember('example');
2470
- member.value = schemaElement.get('example');
2471
- }
2492
+ /**
2493
+ * If there was an example keyword in the original schema,
2494
+ * keep it instead of merging with example from other schema.
2495
+ */
2496
+ if (schemaElement.hasKey('example')) {
2497
+ const member = allOfMerged.getMember('example');
2498
+ if (member) {
2499
+ member.value = schemaElement.get('example');
2500
+ }
2501
+ }
2472
2502
 
2473
- /**
2474
- * If there was an examples keyword in the original definition,
2475
- * keep it instead of merging with examples from other schema.
2476
- */
2477
- if (schemaElement.hasKey('examples')) {
2478
- const member = mergedSchemaElement.getMember('examples');
2479
- member.value = schemaElement.get('examples');
2503
+ /**
2504
+ * If there was an examples keyword in the original schema,
2505
+ * keep it instead of merging with examples from other schema.
2506
+ */
2507
+ if (schemaElement.hasKey('examples')) {
2508
+ const member = allOfMerged.getMember('examples');
2509
+ if (member) {
2510
+ member.value = schemaElement.get('examples');
2511
+ }
2512
+ }
2513
+ schemaElement.content = allOfMerged.content;
2480
2514
  }
2481
-
2482
- // remove allOf keyword after the merge
2483
- mergedSchemaElement.remove('allOf');
2484
- return mergedSchemaElement;
2515
+ return undefined;
2485
2516
  }
2486
2517
  }
2487
2518
  }
@@ -2500,26 +2531,27 @@ __webpack_require__.r(__webpack_exports__);
2500
2531
  /* harmony export */ });
2501
2532
  /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46571);
2502
2533
  /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(42209);
2503
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9999);
2504
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(33501);
2505
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(87024);
2534
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9999);
2535
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(33501);
2536
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(44824);
2537
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(87024);
2506
2538
  /* harmony import */ var _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(98219);
2507
2539
  /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(85013);
2508
2540
  /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(3117);
2509
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(66648);
2510
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(70281);
2511
- /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(85270);
2512
- /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(18316);
2513
- /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(83748);
2541
+ /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(70281);
2542
+ /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(66648);
2543
+ /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(85270);
2544
+ /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(18316);
2545
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(83748);
2514
2546
  /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(60503);
2515
- /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(15767);
2516
- /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(32346);
2517
- /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(51776);
2518
- /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(46432);
2519
- /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(16129);
2520
- /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(78311);
2521
- /* harmony import */ var _utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(12201);
2522
- /* harmony import */ var _utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(17381);
2547
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(15767);
2548
+ /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(32346);
2549
+ /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(51776);
2550
+ /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(46432);
2551
+ /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(16129);
2552
+ /* harmony import */ var _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(78311);
2553
+ /* harmony import */ var _utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(12201);
2554
+ /* harmony import */ var _utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(17381);
2523
2555
  /* harmony import */ var _specmap_lib_refs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7247);
2524
2556
  /* harmony import */ var _errors_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21806);
2525
2557
  /* eslint-disable camelcase */
@@ -2542,13 +2574,7 @@ const visitAsync = _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_2__.visit[S
2542
2574
 
2543
2575
  // initialize element identity manager
2544
2576
  const identityManager = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_3__.IdentityManager)();
2545
-
2546
- /**
2547
- * Predicate for detecting if element was created by merging referencing
2548
- * element with particular element identity with a referenced element.
2549
- */
2550
- const wasReferencedBy = referencingElement => element => element.meta.hasKey('ref-referencing-element-id') && element.meta.get('ref-referencing-element-id').equals((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(identityManager.identify(referencingElement)));
2551
- const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_5__["default"].compose({
2577
+ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_4__["default"].compose({
2552
2578
  props: {
2553
2579
  useCircularStructures: true,
2554
2580
  allowMetaPatches: false,
@@ -2566,19 +2592,13 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2566
2592
  methods: {
2567
2593
  async ReferenceElement(referencingElement, key, parent, path, ancestors) {
2568
2594
  try {
2569
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
2570
-
2571
- // skip already identified cycled Path Item Objects
2572
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.includesClasses)(['cycle'], referencingElement.$ref)) {
2573
- return false;
2574
- }
2575
-
2576
- // detect possible cycle in traversal and avoid it
2577
- if (ancestorsLineage.includesCycle(referencingElement)) {
2595
+ // skip current referencing element as it's already been access
2596
+ if (this.indirections.includes(referencingElement)) {
2578
2597
  return false;
2579
2598
  }
2580
- const retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref));
2581
- const isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.stripHash(this.reference.uri) === retrievalURI;
2599
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
2600
+ const retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref));
2601
+ const isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(this.reference.uri) === retrievalURI;
2582
2602
  const isExternalReference = !isInternalReference;
2583
2603
 
2584
2604
  // ignore resolving internal Reference Objects
@@ -2589,18 +2609,19 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2589
2609
  if (!this.options.resolve.external && isExternalReference) {
2590
2610
  return false;
2591
2611
  }
2592
- const reference = await this.toReference((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref));
2593
- const $refBaseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.resolve(retrievalURI, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref));
2612
+ const reference = await this.toReference((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref));
2613
+ const $refBaseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.resolve(retrievalURI, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref));
2594
2614
  this.indirections.push(referencingElement);
2595
- const jsonPointer = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.uriToPointer)($refBaseURI);
2615
+ const jsonPointer = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.uriToPointer)($refBaseURI);
2596
2616
 
2597
2617
  // possibly non-semantic fragment
2598
- let referencedElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__["default"])(jsonPointer, reference.value.result);
2618
+ let referencedElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__["default"])(jsonPointer, reference.value.result);
2619
+ referencedElement.id = identityManager.identify(referencedElement);
2599
2620
 
2600
2621
  // applying semantics to a fragment
2601
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isPrimitiveElement)(referencedElement)) {
2602
- const referencedElementType = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.meta.get('referenced-element'));
2603
- const cacheKey = `${referencedElementType}-${(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(identityManager.identify(referencedElement))}`;
2622
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isPrimitiveElement)(referencedElement)) {
2623
+ const referencedElementType = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.meta.get('referenced-element'));
2624
+ const cacheKey = `${referencedElementType}-${(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(identityManager.identify(referencedElement))}`;
2604
2625
  if (this.refractCache.has(cacheKey)) {
2605
2626
  referencedElement = this.refractCache.get(cacheKey);
2606
2627
  } else if ((0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_10__.isReferenceLikeElement)(referencedElement)) {
@@ -2617,109 +2638,127 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2617
2638
  }
2618
2639
 
2619
2640
  // detect direct or indirect reference
2620
- if (this.indirections.includes(referencedElement)) {
2621
- throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Recursive JSON Pointer detected');
2641
+ if (referencingElement === referencedElement) {
2642
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Recursive Reference Object detected');
2622
2643
  }
2623
2644
 
2624
2645
  // detect maximum depth of dereferencing
2625
2646
  if (this.indirections.length > this.options.dereference.maxDepth) {
2626
2647
  throw new _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_13__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
2627
2648
  }
2628
- if (!this.useCircularStructures) {
2629
- const hasCycles = ancestorsLineage.includes(referencedElement);
2630
- if (hasCycles) {
2631
- if (_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.isHttpUrl(retrievalURI) || _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.isFileSystemPath(retrievalURI)) {
2632
- // make the referencing URL or file system path absolute
2633
- const cycledReferenceElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.ReferenceElement({
2634
- $ref: $refBaseURI
2635
- }, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(referencingElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(referencingElement.attributes));
2636
- cycledReferenceElement.get('$ref').classes.push('cycle');
2637
- return cycledReferenceElement;
2649
+
2650
+ // detect second deep dive into the same fragment and avoid it
2651
+ if (ancestorsLineage.includes(referencedElement)) {
2652
+ reference.refSet.circular = true;
2653
+ if (this.options.dereference.circular === 'error') {
2654
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Circular reference detected');
2655
+ } else if (this.options.dereference.circular === 'replace') {
2656
+ const refElement = new _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.RefElement(referencedElement.id, {
2657
+ type: 'reference',
2658
+ uri: reference.uri,
2659
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref),
2660
+ baseURI: $refBaseURI,
2661
+ referencingElement
2662
+ });
2663
+ const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
2664
+ const replacement = replacer(refElement);
2665
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
2666
+ parent.value = replacement; // eslint-disable-line no-param-reassign
2667
+ } else if (Array.isArray(parent)) {
2668
+ parent[key] = replacement; // eslint-disable-line no-param-reassign
2638
2669
  }
2639
- // skip processing this reference
2640
- return false;
2670
+ return !parent ? replacement : false;
2641
2671
  }
2642
2672
  }
2643
2673
 
2644
- // append referencing schema to ancestors lineage
2645
- directAncestors.add(referencingElement);
2646
-
2647
- // dive deep into the fragment
2648
- const visitor = OpenApi3_1SwaggerClientDereferenceVisitor({
2649
- reference,
2650
- namespace: this.namespace,
2651
- indirections: [...this.indirections],
2652
- options: this.options,
2653
- ancestors: ancestorsLineage,
2654
- allowMetaPatches: this.allowMetaPatches,
2655
- useCircularStructures: this.useCircularStructures,
2656
- basePath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, referencingElement]), '$ref']
2657
- });
2658
- referencedElement = await visitAsync(referencedElement, visitor, {
2659
- keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.keyMap,
2660
- nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.getNodeType
2661
- });
2674
+ /**
2675
+ * Dive deep into the fragment.
2676
+ *
2677
+ * Cases to consider:
2678
+ * 1. We're crossing document boundary
2679
+ * 2. Fragment is from non-root document
2680
+ * 3. Fragment is a Reference Object. We need to follow it to get the eventual value
2681
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
2682
+ */
2683
+ const isNonRootDocument = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
2684
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
2685
+ if ((isExternalReference || isNonRootDocument || (0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isReferenceElement)(referencedElement) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
2686
+ // append referencing reference to ancestors lineage
2687
+ directAncestors.add(referencingElement);
2688
+ const visitor = OpenApi3_1SwaggerClientDereferenceVisitor({
2689
+ reference,
2690
+ namespace: this.namespace,
2691
+ indirections: [...this.indirections],
2692
+ options: this.options,
2693
+ refractCache: this.refractCache,
2694
+ ancestors: ancestorsLineage,
2695
+ allowMetaPatches: this.allowMetaPatches,
2696
+ useCircularStructures: this.useCircularStructures,
2697
+ basePath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, referencingElement]), '$ref']
2698
+ });
2699
+ referencedElement = await visitAsync(referencedElement, visitor, {
2700
+ keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.keyMap,
2701
+ nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.getNodeType
2702
+ });
2662
2703
 
2663
- // remove referencing schema from ancestors lineage
2664
- directAncestors.delete(referencingElement);
2704
+ // remove referencing reference from ancestors lineage
2705
+ directAncestors.delete(referencingElement);
2706
+ }
2665
2707
  this.indirections.pop();
2666
- const mergeAndAnnotateReferencedElement = refedElement => {
2667
- const copy = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneShallow)(refedElement);
2668
-
2669
- // annotate fragment with info about original Reference element
2670
- copy.setMetaProperty('ref-fields', {
2671
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref),
2672
- description: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.description),
2673
- summary: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.summary)
2674
- });
2675
- // annotate fragment with info about origin
2676
- copy.setMetaProperty('ref-origin', reference.uri);
2677
- // annotate fragment with info about referencing element
2678
- copy.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(identityManager.identify(referencingElement)));
2708
+ const mergedElement = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneShallow)(referencedElement);
2679
2709
 
2680
- // override description and summary (outer has higher priority then inner)
2681
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isObjectElement)(refedElement)) {
2682
- if (referencingElement.hasKey('description') && 'description' in refedElement) {
2683
- copy.remove('description');
2684
- copy.set('description', referencingElement.get('description'));
2685
- }
2686
- if (referencingElement.hasKey('summary') && 'summary' in refedElement) {
2687
- copy.remove('summary');
2688
- copy.set('summary', referencingElement.get('summary'));
2689
- }
2690
- }
2710
+ // annotate fragment with info about original Reference element
2711
+ mergedElement.setMetaProperty('ref-fields', {
2712
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref),
2713
+ description: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.description),
2714
+ summary: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.summary)
2715
+ });
2716
+ // annotate fragment with info about origin
2717
+ mergedElement.setMetaProperty('ref-origin', reference.uri);
2718
+ // annotate fragment with info about referencing element
2719
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(identityManager.identify(referencingElement)));
2691
2720
 
2692
- // apply meta patches
2693
- if (this.allowMetaPatches && (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isObjectElement)(copy)) {
2694
- // apply meta patch only when not already applied
2695
- if (!copy.hasKey('$$ref')) {
2696
- const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.resolve(retrievalURI, $refBaseURI);
2697
- copy.set('$$ref', baseURI);
2698
- }
2721
+ // override description and summary (outer has higher priority then inner)
2722
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isObjectElement)(referencedElement)) {
2723
+ if (referencingElement.hasKey('description') && 'description' in referencedElement) {
2724
+ mergedElement.remove('description');
2725
+ mergedElement.set('description', referencingElement.get('description'));
2699
2726
  }
2700
- return copy;
2701
- };
2727
+ if (referencingElement.hasKey('summary') && 'summary' in referencedElement) {
2728
+ mergedElement.remove('summary');
2729
+ mergedElement.set('summary', referencingElement.get('summary'));
2730
+ }
2731
+ }
2702
2732
 
2703
- // attempting to create cycle
2704
- if (ancestorsLineage.includes(referencingElement) || ancestorsLineage.includes(referencedElement)) {
2705
- const replaceWith = ancestorsLineage.findItem(wasReferencedBy(referencingElement)) ?? mergeAndAnnotateReferencedElement(referencedElement);
2706
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isMemberElement)(parent)) {
2707
- parent.value = replaceWith; // eslint-disable-line no-param-reassign
2708
- } else if (Array.isArray(parent)) {
2709
- parent[key] = replaceWith; // eslint-disable-line no-param-reassign
2733
+ // apply meta patches
2734
+ if (this.allowMetaPatches && (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isObjectElement)(mergedElement)) {
2735
+ // apply meta patch only when not already applied
2736
+ if (!mergedElement.hasKey('$$ref')) {
2737
+ const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.resolve(retrievalURI, $refBaseURI);
2738
+ mergedElement.set('$$ref', baseURI);
2710
2739
  }
2711
- return false;
2712
2740
  }
2713
2741
 
2714
- // transclude the element for a fragment
2715
- return mergeAndAnnotateReferencedElement(referencedElement);
2742
+ /**
2743
+ * Transclude referencing element with merged referenced element.
2744
+ */
2745
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
2746
+ parent.value = mergedElement; // eslint-disable-line no-param-reassign
2747
+ } else if (Array.isArray(parent)) {
2748
+ parent[key] = mergedElement; // eslint-disable-line no-param-reassign
2749
+ }
2750
+
2751
+ /**
2752
+ * We're at the root of the tree, so we're just replacing the entire tree.
2753
+ */
2754
+ return !parent ? mergedElement : false;
2716
2755
  } catch (error) {
2717
- const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_17__["default"])(error);
2756
+ const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_19__["default"])(error);
2718
2757
  const wrappedError = wrapError(rootCause, {
2719
2758
  baseDoc: this.reference.uri,
2720
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref),
2721
- pointer: (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.uriToPointer)((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref)),
2722
- fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, referencingElement]), '$ref']
2759
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref),
2760
+ pointer: (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.uriToPointer)((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)),
2761
+ fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, referencingElement]), '$ref']
2723
2762
  });
2724
2763
  this.options.dereference.dereferenceOpts?.errors?.push?.(wrappedError);
2725
2764
  return undefined;
@@ -2727,24 +2766,23 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2727
2766
  },
2728
2767
  async PathItemElement(pathItemElement, key, parent, path, ancestors) {
2729
2768
  try {
2730
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
2731
-
2732
2769
  // ignore PathItemElement without $ref field
2733
- if (!(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isStringElement)(pathItemElement.$ref)) {
2770
+ if (!(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isStringElement)(pathItemElement.$ref)) {
2734
2771
  return undefined;
2735
2772
  }
2736
2773
 
2737
- // skip already identified cycled Path Item Objects
2738
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.includesClasses)(['cycle'], pathItemElement.$ref)) {
2774
+ // skip current referencing element as it's already been access
2775
+ if (this.indirections.includes(pathItemElement)) {
2739
2776
  return false;
2740
2777
  }
2741
2778
 
2742
- // detect possible cycle in traversal and avoid it
2743
- if (ancestorsLineage.includesCycle(pathItemElement)) {
2779
+ // skip already identified cycled Path Item Objects
2780
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.includesClasses)(['cycle'], pathItemElement.$ref)) {
2744
2781
  return false;
2745
2782
  }
2746
- const retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(pathItemElement.$ref));
2747
- const isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.stripHash(this.reference.uri) === retrievalURI;
2783
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
2784
+ const retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref));
2785
+ const isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(this.reference.uri) === retrievalURI;
2748
2786
  const isExternalReference = !isInternalReference;
2749
2787
 
2750
2788
  // ignore resolving internal Path Item Elements
@@ -2755,17 +2793,18 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2755
2793
  if (!this.options.resolve.external && isExternalReference) {
2756
2794
  return undefined;
2757
2795
  }
2758
- const reference = await this.toReference((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(pathItemElement.$ref));
2759
- const $refBaseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.resolve(retrievalURI, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(pathItemElement.$ref));
2796
+ const reference = await this.toReference((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref));
2797
+ const $refBaseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.resolve(retrievalURI, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref));
2760
2798
  this.indirections.push(pathItemElement);
2761
- const jsonPointer = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.uriToPointer)($refBaseURI);
2799
+ const jsonPointer = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.uriToPointer)($refBaseURI);
2762
2800
 
2763
2801
  // possibly non-semantic referenced element
2764
- let referencedElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__["default"])(jsonPointer, reference.value.result);
2802
+ let referencedElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__["default"])(jsonPointer, reference.value.result);
2803
+ referencedElement.id = identityManager.identify(referencedElement);
2765
2804
 
2766
2805
  // applying semantics to a referenced element
2767
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isPrimitiveElement)(referencedElement)) {
2768
- const cacheKey = `pathItem-${(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(identityManager.identify(referencedElement))}`;
2806
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isPrimitiveElement)(referencedElement)) {
2807
+ const cacheKey = `path-item-${(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(identityManager.identify(referencedElement))}`;
2769
2808
  if (this.refractCache.has(cacheKey)) {
2770
2809
  referencedElement = this.refractCache.get(cacheKey);
2771
2810
  } else {
@@ -2775,102 +2814,127 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2775
2814
  }
2776
2815
 
2777
2816
  // detect direct or indirect reference
2778
- if (this.indirections.includes(referencedElement)) {
2779
- throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Recursive JSON Pointer detected');
2817
+ if (pathItemElement === referencedElement) {
2818
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Recursive Path Item Object reference detected');
2780
2819
  }
2781
2820
 
2782
2821
  // detect maximum depth of dereferencing
2783
2822
  if (this.indirections.length > this.options.dereference.maxDepth) {
2784
2823
  throw new _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_13__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
2785
2824
  }
2786
- if (!this.useCircularStructures) {
2787
- const hasCycles = ancestorsLineage.includes(referencedElement);
2788
- if (hasCycles) {
2789
- if (_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.isHttpUrl(retrievalURI) || _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.isFileSystemPath(retrievalURI)) {
2790
- // make the referencing URL or file system path absolute
2791
- const cycledPathItemElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.PathItemElement({
2792
- $ref: $refBaseURI
2793
- }, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(pathItemElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(pathItemElement.attributes));
2794
- cycledPathItemElement.get('$ref').classes.push('cycle');
2795
- return cycledPathItemElement;
2825
+
2826
+ // detect second deep dive into the same fragment and avoid it
2827
+ if (ancestorsLineage.includes(referencedElement)) {
2828
+ reference.refSet.circular = true;
2829
+ if (this.options.dereference.circular === 'error') {
2830
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Circular reference detected');
2831
+ } else if (this.options.dereference.circular === 'replace') {
2832
+ const refElement = new _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.RefElement(referencedElement.id, {
2833
+ type: 'path-item',
2834
+ uri: reference.uri,
2835
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref),
2836
+ baseURI: $refBaseURI,
2837
+ referencingElement: pathItemElement
2838
+ });
2839
+ const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
2840
+ const replacement = replacer(refElement);
2841
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
2842
+ parent.value = replacement; // eslint-disable-line no-param-reassign
2843
+ } else if (Array.isArray(parent)) {
2844
+ parent[key] = replacement; // eslint-disable-line no-param-reassign
2796
2845
  }
2797
- // skip processing this path item and all it's child elements
2798
- return false;
2846
+ return !parent ? replacement : false;
2799
2847
  }
2800
2848
  }
2801
2849
 
2802
- // append referencing schema to ancestors lineage
2803
- directAncestors.add(pathItemElement);
2804
-
2805
- // dive deep into the referenced element
2806
- const visitor = OpenApi3_1SwaggerClientDereferenceVisitor({
2807
- reference,
2808
- namespace: this.namespace,
2809
- indirections: [...this.indirections],
2810
- options: this.options,
2811
- ancestors: ancestorsLineage,
2812
- allowMetaPatches: this.allowMetaPatches,
2813
- useCircularStructures: this.useCircularStructures,
2814
- basePath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, pathItemElement]), '$ref']
2815
- });
2816
- referencedElement = await visitAsync(referencedElement, visitor, {
2817
- keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.keyMap,
2818
- nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.getNodeType
2819
- });
2850
+ /**
2851
+ * Dive deep into the fragment.
2852
+ *
2853
+ * Cases to consider:
2854
+ * 1. We're crossing document boundary
2855
+ * 2. Fragment is from non-root document
2856
+ * 3. Fragment is a Path Item Object with $ref field. We need to follow it to get the eventual value
2857
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
2858
+ */
2859
+ const isNonRootDocument = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
2860
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
2861
+ if ((isExternalReference || isNonRootDocument || (0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isPathItemElement)(referencedElement) && (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
2862
+ // append referencing schema to ancestors lineage
2863
+ directAncestors.add(pathItemElement);
2864
+
2865
+ // dive deep into the referenced element
2866
+ const visitor = OpenApi3_1SwaggerClientDereferenceVisitor({
2867
+ reference,
2868
+ namespace: this.namespace,
2869
+ indirections: [...this.indirections],
2870
+ options: this.options,
2871
+ ancestors: ancestorsLineage,
2872
+ allowMetaPatches: this.allowMetaPatches,
2873
+ useCircularStructures: this.useCircularStructures,
2874
+ basePath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, pathItemElement]), '$ref']
2875
+ });
2876
+ referencedElement = await visitAsync(referencedElement, visitor, {
2877
+ keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.keyMap,
2878
+ nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.getNodeType
2879
+ });
2820
2880
 
2821
- // remove referencing schema from ancestors lineage
2822
- directAncestors.delete(pathItemElement);
2881
+ // remove referencing schema from ancestors lineage
2882
+ directAncestors.delete(pathItemElement);
2883
+ }
2823
2884
  this.indirections.pop();
2824
- const mergeAndAnnotateReferencedElement = refedElement => {
2825
- // merge fields from referenced Path Item with referencing one
2826
- const mergedElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.PathItemElement([...refedElement.content], (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(refedElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(refedElement.attributes));
2885
+
2886
+ /**
2887
+ * Creating a new version of Path Item by merging fields from referenced Path Item with referencing one.
2888
+ */
2889
+ if ((0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isPathItemElement)(referencedElement)) {
2890
+ const mergedElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.PathItemElement([...referencedElement.content], (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(referencedElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(referencedElement.attributes));
2827
2891
  // existing keywords from referencing PathItemElement overrides ones from referenced element
2828
2892
  pathItemElement.forEach((value, keyElement, item) => {
2829
- mergedElement.remove((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(keyElement));
2893
+ mergedElement.remove((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(keyElement));
2830
2894
  mergedElement.content.push(item);
2831
2895
  });
2832
2896
  mergedElement.remove('$ref');
2833
2897
 
2834
2898
  // annotate referenced element with info about original referencing element
2835
2899
  mergedElement.setMetaProperty('ref-fields', {
2836
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(pathItemElement.$ref)
2900
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref)
2837
2901
  });
2838
2902
  // annotate referenced element with info about origin
2839
2903
  mergedElement.setMetaProperty('ref-origin', reference.uri);
2840
2904
  // annotate fragment with info about referencing element
2841
- mergedElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(identityManager.identify(pathItemElement)));
2905
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(identityManager.identify(pathItemElement)));
2842
2906
 
2843
2907
  // apply meta patches
2844
2908
  if (this.allowMetaPatches) {
2845
2909
  // apply meta patch only when not already applied
2846
2910
  if (typeof mergedElement.get('$$ref') === 'undefined') {
2847
- const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.resolve(retrievalURI, $refBaseURI);
2911
+ const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.resolve(retrievalURI, $refBaseURI);
2848
2912
  mergedElement.set('$$ref', baseURI);
2849
2913
  }
2850
2914
  }
2851
- return mergedElement;
2852
- };
2915
+ referencedElement = mergedElement;
2916
+ }
2853
2917
 
2854
- // attempting to create cycle
2855
- if (ancestorsLineage.includes(pathItemElement) || ancestorsLineage.includes(referencedElement)) {
2856
- const replaceWith = ancestorsLineage.findItem(wasReferencedBy(pathItemElement)) ?? mergeAndAnnotateReferencedElement(referencedElement);
2857
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isMemberElement)(parent)) {
2858
- parent.value = replaceWith; // eslint-disable-line no-param-reassign
2859
- } else if (Array.isArray(parent)) {
2860
- parent[key] = replaceWith; // eslint-disable-line no-param-reassign
2861
- }
2862
- return false;
2918
+ /**
2919
+ * Transclude referencing element with merged referenced element.
2920
+ */
2921
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
2922
+ parent.value = referencedElement; // eslint-disable-line no-param-reassign
2923
+ } else if (Array.isArray(parent)) {
2924
+ parent[key] = referencedElement; // eslint-disable-line no-param-reassign
2863
2925
  }
2864
2926
 
2865
- // transclude referencing element with merged referenced element
2866
- return mergeAndAnnotateReferencedElement(referencedElement);
2927
+ /**
2928
+ * We're at the root of the tree, so we're just replacing the entire tree.
2929
+ */
2930
+ return !parent ? referencedElement : undefined;
2867
2931
  } catch (error) {
2868
- const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_17__["default"])(error);
2932
+ const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_19__["default"])(error);
2869
2933
  const wrappedError = wrapError(rootCause, {
2870
2934
  baseDoc: this.reference.uri,
2871
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(pathItemElement.$ref),
2872
- pointer: (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.uriToPointer)((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(pathItemElement.$ref)),
2873
- fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, pathItemElement]), '$ref']
2935
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref),
2936
+ pointer: (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.uriToPointer)((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(pathItemElement.$ref)),
2937
+ fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, pathItemElement]), '$ref']
2874
2938
  });
2875
2939
  this.options.dereference.dereferenceOpts?.errors?.push?.(wrappedError);
2876
2940
  return undefined;
@@ -2878,38 +2942,32 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2878
2942
  },
2879
2943
  async SchemaElement(referencingElement, key, parent, path, ancestors) {
2880
2944
  try {
2881
- const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
2882
-
2883
2945
  // skip current referencing schema as $ref keyword was not defined
2884
- if (!(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isStringElement)(referencingElement.$ref)) {
2946
+ if (!(0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isStringElement)(referencingElement.$ref)) {
2885
2947
  // skip traversing this schema but traverse all it's child schemas
2886
2948
  return undefined;
2887
2949
  }
2888
2950
 
2889
- // skip already identified cycled Path Item Objects
2890
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.includesClasses)(['cycle'], referencingElement.$ref)) {
2891
- return false;
2892
- }
2893
-
2894
- // detect possible cycle in traversal and avoid it
2895
- if (ancestorsLineage.includesCycle(referencingElement)) {
2951
+ // skip current referencing element as it's already been access
2952
+ if (this.indirections.includes(referencingElement)) {
2896
2953
  return false;
2897
2954
  }
2955
+ const [ancestorsLineage, directAncestors] = this.toAncestorLineage([...ancestors, parent]);
2898
2956
 
2899
2957
  // compute baseURI using rules around $id and $ref keywords
2900
- let reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.unsanitize(this.reference.uri));
2958
+ let reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.unsanitize(this.reference.uri));
2901
2959
  let {
2902
2960
  uri: retrievalURI
2903
2961
  } = reference;
2904
- const $refBaseURI = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.resolveSchema$refField)(retrievalURI, referencingElement);
2905
- const $refBaseURIStrippedHash = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.stripHash($refBaseURI);
2906
- const file = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_19__["default"])({
2962
+ const $refBaseURI = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.resolveSchema$refField)(retrievalURI, referencingElement);
2963
+ const $refBaseURIStrippedHash = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash($refBaseURI);
2964
+ const file = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_21__["default"])({
2907
2965
  uri: $refBaseURIStrippedHash
2908
2966
  });
2909
2967
  const isUnknownURI = !this.options.resolve.resolvers.some(r => r.canRead(file));
2910
2968
  const isURL = !isUnknownURI;
2911
- const isInternalReference = uri => _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.stripHash(this.reference.uri) === uri;
2912
- const isExternalReference = uri => !isInternalReference(uri);
2969
+ let isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(this.reference.uri) === $refBaseURI;
2970
+ let isExternalReference = !isInternalReference;
2913
2971
  this.indirections.push(referencingElement);
2914
2972
 
2915
2973
  // determining reference, proper evaluation and selection mechanism
@@ -2917,66 +2975,95 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2917
2975
  try {
2918
2976
  if (isUnknownURI || isURL) {
2919
2977
  // we're dealing with canonical URI or URL with possible fragment
2978
+ retrievalURI = this.toBaseURI($refBaseURI);
2920
2979
  const selector = $refBaseURI;
2921
- referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_20__.evaluate)(selector, (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToSchemaElement)(reference.value.result));
2980
+ const referenceAsSchema = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(reference.value.result);
2981
+ referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_22__.evaluate)(selector, referenceAsSchema);
2982
+ referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(referencedElement);
2983
+ referencedElement.id = identityManager.identify(referencedElement);
2984
+
2985
+ // ignore resolving internal Schema Objects
2986
+ if (!this.options.resolve.internal && isInternalReference) {
2987
+ // skip traversing this schema element but traverse all it's child elements
2988
+ return undefined;
2989
+ }
2990
+ // ignore resolving external Schema Objects
2991
+ if (!this.options.resolve.external && isExternalReference) {
2992
+ // skip traversing this schema element but traverse all it's child elements
2993
+ return undefined;
2994
+ }
2922
2995
  } else {
2923
2996
  // we're assuming here that we're dealing with JSON Pointer here
2924
- retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])($refBaseURI));
2997
+ retrievalURI = this.toBaseURI($refBaseURI);
2998
+ isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(this.reference.uri) === retrievalURI;
2999
+ isExternalReference = !isInternalReference;
2925
3000
 
2926
3001
  // ignore resolving internal Schema Objects
2927
- if (!this.options.resolve.internal && isInternalReference(retrievalURI)) {
3002
+ if (!this.options.resolve.internal && isInternalReference) {
2928
3003
  // skip traversing this schema element but traverse all it's child elements
2929
3004
  return undefined;
2930
3005
  }
2931
3006
  // ignore resolving external Schema Objects
2932
- if (!this.options.resolve.external && isExternalReference(retrievalURI)) {
3007
+ if (!this.options.resolve.external && isExternalReference) {
2933
3008
  // skip traversing this schema element but traverse all it's child elements
2934
3009
  return undefined;
2935
3010
  }
2936
- reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.unsanitize($refBaseURI));
2937
- const selector = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.uriToPointer)($refBaseURI);
2938
- referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToSchemaElement)((0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__["default"])(selector, reference.value.result));
3011
+ reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.unsanitize($refBaseURI));
3012
+ const selector = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.uriToPointer)($refBaseURI);
3013
+ const referenceAsSchema = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(reference.value.result);
3014
+ referencedElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__["default"])(selector, referenceAsSchema);
3015
+ referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(referencedElement);
3016
+ referencedElement.id = identityManager.identify(referencedElement);
2939
3017
  }
2940
3018
  } catch (error) {
2941
3019
  /**
2942
3020
  * No SchemaElement($id=URL) was not found, so we're going to try to resolve
2943
3021
  * the URL and assume the returned response is a JSON Schema.
2944
3022
  */
2945
- if (isURL && error instanceof _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_21__["default"]) {
2946
- if ((0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_22__.isAnchor)((0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_22__.uriToAnchor)($refBaseURI))) {
3023
+ if (isURL && error instanceof _swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_uri__WEBPACK_IMPORTED_MODULE_23__["default"]) {
3024
+ if ((0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_24__.isAnchor)((0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_24__.uriToAnchor)($refBaseURI))) {
2947
3025
  // we're dealing with JSON Schema $anchor here
2948
- retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])($refBaseURI));
3026
+ isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(this.reference.uri) === retrievalURI;
3027
+ isExternalReference = !isInternalReference;
2949
3028
 
2950
3029
  // ignore resolving internal Schema Objects
2951
- if (!this.options.resolve.internal && isInternalReference(retrievalURI)) {
3030
+ if (!this.options.resolve.internal && isInternalReference) {
2952
3031
  // skip traversing this schema element but traverse all it's child elements
2953
3032
  return undefined;
2954
3033
  }
2955
3034
  // ignore resolving external Schema Objects
2956
- if (!this.options.resolve.external && isExternalReference(retrievalURI)) {
3035
+ if (!this.options.resolve.external && isExternalReference) {
2957
3036
  // skip traversing this schema element but traverse all it's child elements
2958
3037
  return undefined;
2959
3038
  }
2960
- reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.unsanitize($refBaseURI));
2961
- const selector = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_22__.uriToAnchor)($refBaseURI);
2962
- referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_22__.evaluate)(selector, (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToSchemaElement)(reference.value.result));
3039
+ reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.unsanitize($refBaseURI));
3040
+ const selector = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_24__.uriToAnchor)($refBaseURI);
3041
+ const referenceAsSchema = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(reference.value.result);
3042
+ referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1_selectors_$anchor__WEBPACK_IMPORTED_MODULE_24__.evaluate)(selector, referenceAsSchema);
3043
+ referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(referencedElement);
3044
+ referencedElement.id = identityManager.identify(referencedElement);
2963
3045
  } else {
2964
3046
  // we're assuming here that we're dealing with JSON Pointer here
2965
- retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])($refBaseURI));
3047
+ retrievalURI = this.toBaseURI((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])($refBaseURI));
3048
+ isInternalReference = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(this.reference.uri) === retrievalURI;
3049
+ isExternalReference = !isInternalReference;
2966
3050
 
2967
3051
  // ignore resolving internal Schema Objects
2968
- if (!this.options.resolve.internal && isInternalReference(retrievalURI)) {
3052
+ if (!this.options.resolve.internal && isInternalReference) {
2969
3053
  // skip traversing this schema element but traverse all it's child elements
2970
3054
  return undefined;
2971
3055
  }
2972
3056
  // ignore resolving external Schema Objects
2973
- if (!this.options.resolve.external && isExternalReference(retrievalURI)) {
3057
+ if (!this.options.resolve.external && isExternalReference) {
2974
3058
  // skip traversing this schema element but traverse all it's child elements
2975
3059
  return undefined;
2976
3060
  }
2977
- reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.unsanitize($refBaseURI));
2978
- const selector = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.uriToPointer)($refBaseURI);
2979
- referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToSchemaElement)((0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__["default"])(selector, reference.value.result));
3061
+ reference = await this.toReference(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.unsanitize($refBaseURI));
3062
+ const selector = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.uriToPointer)($refBaseURI);
3063
+ const referenceAsSchema = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(reference.value.result);
3064
+ referencedElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__["default"])(selector, referenceAsSchema);
3065
+ referencedElement = (0,_swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToSchemaElement)(referencedElement);
3066
+ referencedElement.id = identityManager.identify(referencedElement);
2980
3067
  }
2981
3068
  } else {
2982
3069
  throw error;
@@ -2984,7 +3071,7 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2984
3071
  }
2985
3072
 
2986
3073
  // detect direct or indirect reference
2987
- if (this.indirections.includes(referencedElement)) {
3074
+ if (referencingElement === referencedElement) {
2988
3075
  throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Recursive Schema Object reference detected');
2989
3076
  }
2990
3077
 
@@ -2993,106 +3080,134 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
2993
3080
  throw new _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_13__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`);
2994
3081
  }
2995
3082
 
2996
- // useCircularStructures option processing
2997
- if (!this.useCircularStructures) {
2998
- const hasCycles = ancestorsLineage.includes(referencedElement);
2999
- if (hasCycles) {
3000
- if (_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.isHttpUrl(retrievalURI) || _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.isFileSystemPath(retrievalURI)) {
3001
- // make the referencing URL or file system path absolute
3002
- const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.resolve(retrievalURI, $refBaseURI);
3003
- const cycledSchemaElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.SchemaElement({
3004
- $ref: baseURI
3005
- }, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(referencingElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(referencingElement.attributes));
3006
- cycledSchemaElement.get('$ref').classes.push('cycle');
3007
- return cycledSchemaElement;
3083
+ // detect second deep dive into the same fragment and avoid it
3084
+ if (ancestorsLineage.includes(referencedElement)) {
3085
+ reference.refSet.circular = true;
3086
+ if (this.options.dereference.circular === 'error') {
3087
+ throw new _swagger_api_apidom_error__WEBPACK_IMPORTED_MODULE_12__["default"]('Circular reference detected');
3088
+ } else if (this.options.dereference.circular === 'replace') {
3089
+ const refElement = new _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.RefElement(referencedElement.id, {
3090
+ type: 'json-schema',
3091
+ uri: reference.uri,
3092
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref),
3093
+ baseURI: _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.resolve(retrievalURI, $refBaseURI),
3094
+ referencingElement
3095
+ });
3096
+ const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
3097
+ const replacement = replacer(refElement);
3098
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
3099
+ parent.value = replacement; // eslint-disable-line no-param-reassign
3100
+ } else if (Array.isArray(parent)) {
3101
+ parent[key] = replacement; // eslint-disable-line no-param-reassign
3008
3102
  }
3009
- // skip processing this schema and all it's child schemas
3010
- return false;
3103
+ return !parent ? replacement : false;
3011
3104
  }
3012
3105
  }
3013
3106
 
3014
- // append referencing schema to ancestors lineage
3015
- directAncestors.add(referencingElement);
3016
-
3017
- // dive deep into the fragment
3018
- const mergeVisitor = OpenApi3_1SwaggerClientDereferenceVisitor({
3019
- reference,
3020
- namespace: this.namespace,
3021
- indirections: [...this.indirections],
3022
- options: this.options,
3023
- useCircularStructures: this.useCircularStructures,
3024
- allowMetaPatches: this.allowMetaPatches,
3025
- ancestors: ancestorsLineage,
3026
- basePath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, referencingElement]), '$ref']
3027
- });
3028
- referencedElement = await visitAsync(referencedElement, mergeVisitor, {
3029
- keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.keyMap,
3030
- nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.getNodeType
3031
- });
3107
+ /**
3108
+ * Dive deep into the fragment.
3109
+ *
3110
+ * Cases to consider:
3111
+ * 1. We're crossing document boundary
3112
+ * 2. Fragment is from non-root document
3113
+ * 3. Fragment is a Schema Object with $ref field. We need to follow it to get the eventual value
3114
+ * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
3115
+ */
3116
+ const isNonRootDocument = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
3117
+ const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
3118
+ if ((isExternalReference || isNonRootDocument || (0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isSchemaElement)(referencedElement) && (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isStringElement)(referencedElement.$ref) || shouldDetectCircular) && !ancestorsLineage.includesCycle(referencedElement)) {
3119
+ // append referencing schema to ancestors lineage
3120
+ directAncestors.add(referencingElement);
3121
+
3122
+ // dive deep into the fragment
3123
+ const mergeVisitor = OpenApi3_1SwaggerClientDereferenceVisitor({
3124
+ reference,
3125
+ namespace: this.namespace,
3126
+ indirections: [...this.indirections],
3127
+ options: this.options,
3128
+ useCircularStructures: this.useCircularStructures,
3129
+ allowMetaPatches: this.allowMetaPatches,
3130
+ ancestors: ancestorsLineage,
3131
+ basePath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, referencingElement]), '$ref']
3132
+ });
3133
+ referencedElement = await visitAsync(referencedElement, mergeVisitor, {
3134
+ keyMap: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.keyMap,
3135
+ nodeTypeGetter: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.getNodeType
3136
+ });
3032
3137
 
3033
- // remove referencing schema from ancestors lineage
3034
- directAncestors.delete(referencingElement);
3138
+ // remove referencing schema from ancestors lineage
3139
+ directAncestors.delete(referencingElement);
3140
+ }
3035
3141
  this.indirections.pop();
3036
- if ((0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__.isBooleanJsonSchemaElement)(referencedElement)) {
3037
- const booleanJsonSchemaElement = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(referencedElement);
3142
+ if ((0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isBooleanJsonSchemaElement)(referencedElement)) {
3143
+ const booleanJsonSchemaElement = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(referencedElement);
3038
3144
  // annotate referenced element with info about original referencing element
3039
3145
  booleanJsonSchemaElement.setMetaProperty('ref-fields', {
3040
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref)
3146
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
3041
3147
  });
3042
3148
  // annotate referenced element with info about origin
3043
3149
  booleanJsonSchemaElement.setMetaProperty('ref-origin', reference.uri);
3044
3150
  // annotate fragment with info about referencing element
3045
- booleanJsonSchemaElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(identityManager.identify(referencingElement)));
3046
- return booleanJsonSchemaElement;
3151
+ booleanJsonSchemaElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(identityManager.identify(referencingElement)));
3152
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
3153
+ parent.value = booleanJsonSchemaElement; // eslint-disable-line no-param-reassign
3154
+ } else if (Array.isArray(parent)) {
3155
+ parent[key] = booleanJsonSchemaElement; // eslint-disable-line no-param-reassign
3156
+ }
3157
+ return !parent ? booleanJsonSchemaElement : false;
3047
3158
  }
3048
- const mergeAndAnnotateReferencedElement = refedElement => {
3159
+
3160
+ /**
3161
+ * Creating a new version of Schema Object by merging fields from referenced Schema Object with referencing one.
3162
+ */
3163
+ if ((0,_swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isSchemaElement)(referencedElement)) {
3049
3164
  // Schema Object - merge keywords from referenced schema with referencing schema
3050
- const mergedElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.SchemaElement([...refedElement.content], (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(refedElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(refedElement.attributes));
3165
+ const mergedElement = new _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_11__.SchemaElement([...referencedElement.content], (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(referencedElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(referencedElement.attributes));
3051
3166
  // existing keywords from referencing schema overrides ones from referenced schema
3052
3167
  referencingElement.forEach((value, keyElement, item) => {
3053
- mergedElement.remove((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(keyElement));
3168
+ mergedElement.remove((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(keyElement));
3054
3169
  mergedElement.content.push(item);
3055
3170
  });
3056
3171
  mergedElement.remove('$ref');
3057
3172
  // annotate referenced element with info about original referencing element
3058
3173
  mergedElement.setMetaProperty('ref-fields', {
3059
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref)
3174
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
3060
3175
  });
3061
3176
  // annotate fragment with info about origin
3062
3177
  mergedElement.setMetaProperty('ref-origin', reference.uri);
3063
3178
  // annotate fragment with info about referencing element
3064
- mergedElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_14__.cloneDeep)(identityManager.identify(referencingElement)));
3179
+ mergedElement.setMetaProperty('ref-referencing-element-id', (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_18__.cloneDeep)(identityManager.identify(referencingElement)));
3065
3180
 
3066
3181
  // allowMetaPatches option processing
3067
3182
  if (this.allowMetaPatches) {
3068
3183
  // apply meta patch only when not already applied
3069
3184
  if (typeof mergedElement.get('$$ref') === 'undefined') {
3070
- const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_7__.resolve(retrievalURI, $refBaseURI);
3185
+ const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_6__.resolve(retrievalURI, $refBaseURI);
3071
3186
  mergedElement.set('$$ref', baseURI);
3072
3187
  }
3073
3188
  }
3074
- return mergedElement;
3075
- };
3189
+ referencedElement = mergedElement;
3190
+ }
3076
3191
 
3077
- // attempting to create cycle
3078
- if (ancestorsLineage.includes(referencingElement) || ancestorsLineage.includes(referencedElement)) {
3079
- const replaceWith = ancestorsLineage.findItem(wasReferencedBy(referencingElement)) ?? mergeAndAnnotateReferencedElement(referencedElement);
3080
- if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_6__.isMemberElement)(parent)) {
3081
- parent.value = replaceWith; // eslint-disable-line no-param-reassign
3082
- } else if (Array.isArray(parent)) {
3083
- parent[key] = replaceWith; // eslint-disable-line no-param-reassign
3084
- }
3085
- return false;
3192
+ /**
3193
+ * Transclude referencing element with merged referenced element.
3194
+ */
3195
+ if ((0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__.isMemberElement)(parent)) {
3196
+ parent.value = referencedElement; // eslint-disable-line no-param-reassign
3197
+ } else if (Array.isArray(parent)) {
3198
+ parent[key] = referencedElement; // eslint-disable-line no-param-reassign
3086
3199
  }
3087
3200
 
3088
- // transclude referencing element with merged referenced element
3089
- return mergeAndAnnotateReferencedElement(referencedElement);
3201
+ /**
3202
+ * We're at the root of the tree, so we're just replacing the entire tree.
3203
+ */
3204
+ return !parent ? referencedElement : undefined;
3090
3205
  } catch (error) {
3091
- const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_17__["default"])(error);
3206
+ const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_19__["default"])(error);
3092
3207
  const wrappedError = new _errors_index_js__WEBPACK_IMPORTED_MODULE_1__.SchemaRefError(`Could not resolve reference: ${rootCause.message}`, {
3093
3208
  baseDoc: this.reference.uri,
3094
- $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref),
3095
- fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, referencingElement]), '$ref']
3209
+ $ref: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref),
3210
+ fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, referencingElement]), '$ref']
3096
3211
  }, rootCause);
3097
3212
  this.options.dereference.dereferenceOpts?.errors?.push?.(wrappedError);
3098
3213
  return undefined;
@@ -3108,13 +3223,13 @@ const OpenApi3_1SwaggerClientDereferenceVisitor = _swagger_api_apidom_reference_
3108
3223
  },
3109
3224
  async ExampleElement(exampleElement, key, parent, path, ancestors) {
3110
3225
  try {
3111
- return await _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_5__["default"].compose.methods.ExampleElement.call(this, exampleElement, key, parent, path, ancestors);
3226
+ return await _swagger_api_apidom_reference_dereference_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_4__["default"].compose.methods.ExampleElement.call(this, exampleElement, key, parent, path, ancestors);
3112
3227
  } catch (error) {
3113
- const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_17__["default"])(error);
3228
+ const rootCause = (0,_utils_get_root_cause_js__WEBPACK_IMPORTED_MODULE_19__["default"])(error);
3114
3229
  const wrappedError = wrapError(rootCause, {
3115
3230
  baseDoc: this.reference.uri,
3116
- externalValue: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(exampleElement.externalValue),
3117
- fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_15__["default"])([...ancestors, parent, exampleElement]), 'externalValue']
3231
+ externalValue: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(exampleElement.externalValue),
3232
+ fullPath: this.basePath ?? [...(0,_utils_to_path_js__WEBPACK_IMPORTED_MODULE_16__["default"])([...ancestors, parent, exampleElement]), 'externalValue']
3118
3233
  });
3119
3234
  this.options.dereference.dereferenceOpts?.errors?.push?.(wrappedError);
3120
3235
  return undefined;
@@ -4090,23 +4205,26 @@ pojoAdapter.cache = new WeakMap();
4090
4205
  "use strict";
4091
4206
  __webpack_require__.r(__webpack_exports__);
4092
4207
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
4208
+ /* harmony export */ circularReplacer: () => (/* binding */ circularReplacer),
4093
4209
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
4094
4210
  /* harmony export */ });
4095
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(44824);
4096
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(65342);
4097
- /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(9999);
4098
- /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(60672);
4099
- /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(18316);
4100
- /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(60489);
4101
- /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(64884);
4102
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(3117);
4103
- /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(94145);
4104
- /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(83748);
4105
- /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(12349);
4106
- /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(31387);
4107
- /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(71614);
4108
- /* harmony import */ var _swagger_api_apidom_reference_parse_parsers_binary__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(16960);
4109
- /* harmony import */ var _swagger_api_apidom_reference_resolve_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(47724);
4211
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9999);
4212
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(44824);
4213
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(87024);
4214
+ /* harmony import */ var _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(65342);
4215
+ /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(60672);
4216
+ /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(18316);
4217
+ /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(60489);
4218
+ /* harmony import */ var _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(64884);
4219
+ /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(3117);
4220
+ /* harmony import */ var _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(94145);
4221
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(83748);
4222
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(12349);
4223
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(31387);
4224
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(71614);
4225
+ /* harmony import */ var _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(48097);
4226
+ /* harmony import */ var _swagger_api_apidom_reference_parse_parsers_binary__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(16960);
4227
+ /* harmony import */ var _swagger_api_apidom_reference_resolve_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(47724);
4110
4228
  /* harmony import */ var _constants_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3832);
4111
4229
  /* harmony import */ var _utils_options_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(40428);
4112
4230
  /* harmony import */ var _normalize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(80947);
@@ -4132,6 +4250,18 @@ __webpack_require__.r(__webpack_exports__);
4132
4250
 
4133
4251
 
4134
4252
 
4253
+ const circularReplacer = refElement => {
4254
+ const $refBaseURI = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__["default"])(refElement.meta.get('baseURI'));
4255
+ const referencingElement = refElement.meta.get('referencingElement');
4256
+
4257
+ /**
4258
+ * Removing semantics from the absolutified referencing element by
4259
+ * using generic ObjectElement to represent the reference.
4260
+ */
4261
+ return new _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_10__.ObjectElement({
4262
+ $ref: $refBaseURI
4263
+ }, (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__.cloneDeep)(referencingElement.meta), (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__.cloneDeep)(referencingElement.attributes));
4264
+ };
4135
4265
  const resolveOpenAPI31Strategy = async options => {
4136
4266
  const {
4137
4267
  spec,
@@ -4153,32 +4283,32 @@ const resolveOpenAPI31Strategy = async options => {
4153
4283
  } = resolveOpenAPI31Strategy;
4154
4284
 
4155
4285
  // determining BaseURI
4156
- const cwd = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__.isHttpUrl(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__.cwd()) ? _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__.cwd() : _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_BASE_URL;
4286
+ const cwd = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_12__.isHttpUrl(_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_12__.cwd()) ? _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_12__.cwd() : _constants_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_BASE_URL;
4157
4287
  const retrievalURI = _utils_options_js__WEBPACK_IMPORTED_MODULE_1__.retrievalURI(options);
4158
- const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_9__.resolve(cwd, retrievalURI);
4288
+ const baseURI = _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_12__.resolve(cwd, retrievalURI);
4159
4289
 
4160
4290
  // prepare spec for dereferencing
4161
4291
  let openApiElement;
4162
4292
  if (cache.has(spec)) {
4163
4293
  openApiElement = cache.get(spec);
4164
4294
  } else {
4165
- openApiElement = _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_10__.OpenApi3_1Element.refract(spec);
4295
+ openApiElement = _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__.OpenApi3_1Element.refract(spec);
4166
4296
  openApiElement.classes.push('result');
4167
4297
  cache.set(spec, openApiElement);
4168
4298
  }
4169
- const openApiParseResultElement = new _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_11__.ParseResultElement([openApiElement]);
4299
+ const openApiParseResultElement = new _swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_10__.ParseResultElement([openApiElement]);
4170
4300
 
4171
4301
  // prepare fragment for dereferencing
4172
- const jsonPointer = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__["default"])(pathDiscriminator);
4302
+ const jsonPointer = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_14__["default"])(pathDiscriminator);
4173
4303
  const jsonPointerURI = jsonPointer === '' ? '' : `#${jsonPointer}`;
4174
- const fragmentElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__["default"])(jsonPointer, openApiElement);
4304
+ const fragmentElement = (0,_swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_15__["default"])(jsonPointer, openApiElement);
4175
4305
 
4176
4306
  // prepare reference set for dereferencing
4177
- const openApiElementReference = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_14__["default"])({
4307
+ const openApiElementReference = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_16__["default"])({
4178
4308
  uri: baseURI,
4179
4309
  value: openApiParseResultElement
4180
4310
  });
4181
- const refSet = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_15__["default"])({
4311
+ const refSet = (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_17__["default"])({
4182
4312
  refs: [openApiElementReference]
4183
4313
  });
4184
4314
  if (jsonPointer !== '') refSet.rootRef = null; // reset root reference as we want fragment to become the root reference
@@ -4186,7 +4316,7 @@ const resolveOpenAPI31Strategy = async options => {
4186
4316
  // prepare ancestors; needed for cases where fragment is not OpenAPI element
4187
4317
  const ancestors = [new Set([fragmentElement])];
4188
4318
  const errors = [];
4189
- const dereferenced = await (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_16__.dereferenceApiDOM)(fragmentElement, {
4319
+ const dereferenced = await (0,_swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_18__.dereferenceApiDOM)(fragmentElement, {
4190
4320
  resolve: {
4191
4321
  /**
4192
4322
  * swagger-client only supports resolving HTTP(S) URLs or spec objects.
@@ -4205,10 +4335,10 @@ const resolveOpenAPI31Strategy = async options => {
4205
4335
  responseInterceptor
4206
4336
  }
4207
4337
  },
4208
- strategies: [(0,_swagger_api_apidom_reference_resolve_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__["default"])()]
4338
+ strategies: [(0,_swagger_api_apidom_reference_resolve_strategies_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__["default"])()]
4209
4339
  },
4210
4340
  parse: {
4211
- mediaType: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__["default"].latest(),
4341
+ mediaType: _swagger_api_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__["default"].latest(),
4212
4342
  parsers: [(0,_apidom_reference_parse_parsers_openapi_json_3_1_index_js__WEBPACK_IMPORTED_MODULE_6__["default"])({
4213
4343
  allowEmpty: false,
4214
4344
  sourceMap: false
@@ -4221,7 +4351,7 @@ const resolveOpenAPI31Strategy = async options => {
4221
4351
  }), (0,_apidom_reference_parse_parsers_yaml_1_2_index_js__WEBPACK_IMPORTED_MODULE_5__["default"])({
4222
4352
  allowEmpty: false,
4223
4353
  sourceMap: false
4224
- }), (0,_swagger_api_apidom_reference_parse_parsers_binary__WEBPACK_IMPORTED_MODULE_19__["default"])({
4354
+ }), (0,_swagger_api_apidom_reference_parse_parsers_binary__WEBPACK_IMPORTED_MODULE_21__["default"])({
4225
4355
  allowEmpty: false,
4226
4356
  sourceMap: false
4227
4357
  })]
@@ -4240,17 +4370,19 @@ const resolveOpenAPI31Strategy = async options => {
4240
4370
  dereferenceOpts: {
4241
4371
  errors
4242
4372
  },
4243
- immutable: false
4373
+ immutable: false,
4374
+ circular: useCircularStructures ? 'ignore' : 'replace',
4375
+ circularReplacer: useCircularStructures ? _swagger_api_apidom_reference_configuration_empty__WEBPACK_IMPORTED_MODULE_22__["default"].dereference.circularReplacer : circularReplacer
4244
4376
  }
4245
4377
  });
4246
- const transcluded = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_20__.transclude)(fragmentElement, dereferenced, openApiElement);
4378
+ const transcluded = (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_23__.transclude)(fragmentElement, dereferenced, openApiElement);
4247
4379
  const normalized = skipNormalization ? transcluded : (0,_normalize_js__WEBPACK_IMPORTED_MODULE_2__["default"])(transcluded);
4248
4380
  return {
4249
- spec: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_21__["default"])(normalized),
4381
+ spec: (0,_swagger_api_apidom_core__WEBPACK_IMPORTED_MODULE_9__["default"])(normalized),
4250
4382
  errors
4251
4383
  };
4252
4384
  } catch (error) {
4253
- if (error instanceof _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_22__["default"] || error instanceof _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_23__["default"]) {
4385
+ if (error instanceof _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_24__["default"] || error instanceof _swagger_api_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_25__["default"]) {
4254
4386
  return {
4255
4387
  spec: null,
4256
4388
  errors: []
@@ -16781,7 +16913,7 @@ var defaults = {
16781
16913
  charset: 'utf-8',
16782
16914
  charsetSentinel: false,
16783
16915
  comma: false,
16784
- decodeDotInKeys: true,
16916
+ decodeDotInKeys: false,
16785
16917
  decoder: utils.decode,
16786
16918
  delimiter: '&',
16787
16919
  depth: 5,
@@ -17544,6 +17676,10 @@ var decode = function (str, decoder, charset) {
17544
17676
  }
17545
17677
  };
17546
17678
 
17679
+ var limit = 1024;
17680
+
17681
+ /* eslint operator-linebreak: [2, "before"] */
17682
+
17547
17683
  var encode = function encode(str, defaultEncoder, charset, kind, format) {
17548
17684
  // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
17549
17685
  // It has been adapted here for stricter adherence to RFC 3986
@@ -17565,45 +17701,54 @@ var encode = function encode(str, defaultEncoder, charset, kind, format) {
17565
17701
  }
17566
17702
 
17567
17703
  var out = '';
17568
- for (var i = 0; i < string.length; ++i) {
17569
- var c = string.charCodeAt(i);
17570
-
17571
- if (
17572
- c === 0x2D // -
17573
- || c === 0x2E // .
17574
- || c === 0x5F // _
17575
- || c === 0x7E // ~
17576
- || (c >= 0x30 && c <= 0x39) // 0-9
17577
- || (c >= 0x41 && c <= 0x5A) // a-z
17578
- || (c >= 0x61 && c <= 0x7A) // A-Z
17579
- || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
17580
- ) {
17581
- out += string.charAt(i);
17582
- continue;
17583
- }
17704
+ for (var j = 0; j < string.length; j += limit) {
17705
+ var segment = string.length >= limit ? string.slice(j, j + limit) : string;
17706
+ var arr = [];
17707
+
17708
+ for (var i = 0; i < segment.length; ++i) {
17709
+ var c = segment.charCodeAt(i);
17710
+ if (
17711
+ c === 0x2D // -
17712
+ || c === 0x2E // .
17713
+ || c === 0x5F // _
17714
+ || c === 0x7E // ~
17715
+ || (c >= 0x30 && c <= 0x39) // 0-9
17716
+ || (c >= 0x41 && c <= 0x5A) // a-z
17717
+ || (c >= 0x61 && c <= 0x7A) // A-Z
17718
+ || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )
17719
+ ) {
17720
+ arr[arr.length] = segment.charAt(i);
17721
+ continue;
17722
+ }
17584
17723
 
17585
- if (c < 0x80) {
17586
- out = out + hexTable[c];
17587
- continue;
17588
- }
17724
+ if (c < 0x80) {
17725
+ arr[arr.length] = hexTable[c];
17726
+ continue;
17727
+ }
17589
17728
 
17590
- if (c < 0x800) {
17591
- out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
17592
- continue;
17593
- }
17729
+ if (c < 0x800) {
17730
+ arr[arr.length] = hexTable[0xC0 | (c >> 6)]
17731
+ + hexTable[0x80 | (c & 0x3F)];
17732
+ continue;
17733
+ }
17594
17734
 
17595
- if (c < 0xD800 || c >= 0xE000) {
17596
- out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
17597
- continue;
17735
+ if (c < 0xD800 || c >= 0xE000) {
17736
+ arr[arr.length] = hexTable[0xE0 | (c >> 12)]
17737
+ + hexTable[0x80 | ((c >> 6) & 0x3F)]
17738
+ + hexTable[0x80 | (c & 0x3F)];
17739
+ continue;
17740
+ }
17741
+
17742
+ i += 1;
17743
+ c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF));
17744
+
17745
+ arr[arr.length] = hexTable[0xF0 | (c >> 18)]
17746
+ + hexTable[0x80 | ((c >> 12) & 0x3F)]
17747
+ + hexTable[0x80 | ((c >> 6) & 0x3F)]
17748
+ + hexTable[0x80 | (c & 0x3F)];
17598
17749
  }
17599
17750
 
17600
- i += 1;
17601
- c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
17602
- /* eslint operator-linebreak: [2, "before"] */
17603
- out += hexTable[0xF0 | (c >> 18)]
17604
- + hexTable[0x80 | ((c >> 12) & 0x3F)]
17605
- + hexTable[0x80 | ((c >> 6) & 0x3F)]
17606
- + hexTable[0x80 | (c & 0x3F)];
17751
+ out += arr.join('');
17607
17752
  }
17608
17753
 
17609
17754
  return out;