swagger-client 3.26.8 → 3.27.1

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