@speclynx/apidom-reference 5.2.2 → 5.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +30 -11
  3. package/dist/apidom-reference.browser.js +1121 -516
  4. package/dist/apidom-reference.browser.min.js +1 -1
  5. package/package.json +28 -28
  6. package/src/bundle/strategies/arazzo-1/visitor.cjs +105 -22
  7. package/src/bundle/strategies/arazzo-1/visitor.mjs +107 -24
  8. package/src/bundle/strategies/openapi-3-1/visitor.cjs +197 -47
  9. package/src/bundle/strategies/openapi-3-1/visitor.mjs +200 -50
  10. package/src/bundle/util.cjs +57 -2
  11. package/src/bundle/util.mjs +52 -0
  12. package/src/dereference/strategies/arazzo-1/index.cjs +9 -7
  13. package/src/dereference/strategies/arazzo-1/index.mjs +3 -1
  14. package/src/dereference/strategies/arazzo-1/selectors/$anchor.cjs +6 -0
  15. package/src/dereference/strategies/arazzo-1/selectors/$anchor.mjs +1 -1
  16. package/src/dereference/strategies/arazzo-1/selectors/uri.cjs +6 -0
  17. package/src/dereference/strategies/arazzo-1/selectors/uri.mjs +1 -1
  18. package/src/dereference/strategies/arazzo-1/util.cjs +6 -0
  19. package/src/dereference/strategies/arazzo-1/util.mjs +1 -1
  20. package/src/dereference/strategies/arazzo-1/visitor.cjs +67 -9
  21. package/src/dereference/strategies/arazzo-1/visitor.mjs +71 -13
  22. package/src/dereference/strategies/openapi-3-1/index.cjs +2 -1
  23. package/src/dereference/strategies/openapi-3-1/index.mjs +3 -1
  24. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +16 -4
  25. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.mjs +14 -3
  26. package/src/dereference/strategies/openapi-3-1/selectors/json-pointer.cjs +29 -0
  27. package/src/dereference/strategies/openapi-3-1/selectors/json-pointer.mjs +22 -0
  28. package/src/dereference/strategies/openapi-3-1/selectors/uri.cjs +54 -27
  29. package/src/dereference/strategies/openapi-3-1/selectors/uri.mjs +51 -27
  30. package/src/dereference/strategies/openapi-3-1/util.cjs +75 -14
  31. package/src/dereference/strategies/openapi-3-1/util.mjs +68 -14
  32. package/src/dereference/strategies/openapi-3-1/visitor.cjs +85 -9
  33. package/src/dereference/strategies/openapi-3-1/visitor.mjs +89 -13
  34. package/src/util/url.cjs +35 -2
  35. package/src/util/url.mjs +32 -0
  36. package/types/apidom-reference.d.ts +12 -0
  37. package/types/bundle/strategies/arazzo-1/index.d.ts +1 -1
  38. package/types/bundle/strategies/arazzo-1/visitor.d.ts +51 -6
  39. package/types/bundle/strategies/openapi-3-1/index.d.ts +1 -1
  40. package/types/bundle/strategies/openapi-3-1/visitor.d.ts +59 -3
  41. package/types/bundle/util.d.ts +39 -0
  42. package/types/dereference/strategies/arazzo-1/selectors/$anchor.d.ts +1 -1
  43. package/types/dereference/strategies/arazzo-1/selectors/uri.d.ts +1 -1
  44. package/types/dereference/strategies/arazzo-1/util.d.ts +1 -1
  45. package/types/dereference/strategies/arazzo-1/visitor.d.ts +17 -1
  46. package/types/dereference/strategies/openapi-3-1/selectors/$anchor.d.ts +8 -0
  47. package/types/dereference/strategies/openapi-3-1/selectors/json-pointer.d.ts +9 -0
  48. package/types/dereference/strategies/openapi-3-1/selectors/uri.d.ts +37 -4
  49. package/types/dereference/strategies/openapi-3-1/util.d.ts +53 -2
  50. package/types/dereference/strategies/openapi-3-1/visitor.d.ts +17 -1
  51. package/types/util/url.d.ts +10 -0
@@ -456,6 +456,12 @@ const cf = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__.fixedFields)(_s
456
456
  indexed: true
457
457
  });
458
458
 
459
+ /**
460
+ * A bundled JSON Schema resource awaiting placement into the entry document's
461
+ * `components.inputs`.
462
+ * @public
463
+ */
464
+
459
465
  /**
460
466
  * @public
461
467
  */
@@ -503,17 +509,47 @@ class Arazzo1BundleVisitor {
503
509
  * components that are still being bundled.
504
510
  */
505
511
  reservedNames;
512
+
513
+ /**
514
+ * Embedded resources waiting to be placed into the entry document's
515
+ * `components.inputs`, shared across the entry document and every external
516
+ * document visitor. Placement is deferred until the entry document traversal
517
+ * completes: the traversal walks live content, so placing a resource mid-way
518
+ * would make it descend into the resource and re-bundle its `$ref`s against
519
+ * the entry document's base URI instead of the resource's own.
520
+ */
521
+ placements;
522
+
523
+ /**
524
+ * Index of `$id`-bearing schemas per document, shared across the entry document
525
+ * and every external document visitor of a single bundle run so it never
526
+ * outlives mutations of the documents (e.g. the final placement of inputs).
527
+ */
528
+ schema$idIndex;
506
529
  constructor({
507
530
  reference,
508
531
  options,
509
532
  assignments = new Map(),
510
- reservedNames = new Map()
533
+ reservedNames = new Map(),
534
+ placements = [],
535
+ schema$idIndex = new WeakMap()
511
536
  }) {
512
537
  this.reference = reference;
513
538
  this.baseURI = (0,_dereference_strategies_arazzo_1_util_ts__WEBPACK_IMPORTED_MODULE_23__.resolveArazzo$selfField)(reference.uri, reference.value?.result);
514
539
  this.options = options;
515
540
  this.assignments = assignments;
516
541
  this.reservedNames = reservedNames;
542
+ this.placements = placements;
543
+ this.schema$idIndex = schema$idIndex;
544
+ }
545
+
546
+ /**
547
+ * Base URI of the entry document — its `$self` when present, otherwise its
548
+ * retrieval URI. It is the base against which a relative `$id` written into
549
+ * `components.inputs` resolves.
550
+ */
551
+ get entryBaseURI() {
552
+ return (0,_dereference_strategies_arazzo_1_util_ts__WEBPACK_IMPORTED_MODULE_23__.resolveArazzo$selfField)(_util_url_ts__WEBPACK_IMPORTED_MODULE_17__.stripHash(this.reference.refSet.rootRef.uri), this.entryResult);
517
553
  }
518
554
  toBaseURI(uri) {
519
555
  return _util_url_ts__WEBPACK_IMPORTED_MODULE_17__.resolve(this.baseURI, _util_url_ts__WEBPACK_IMPORTED_MODULE_17__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_17__.stripHash(uri)));
@@ -665,14 +701,17 @@ class Arazzo1BundleVisitor {
665
701
 
666
702
  /**
667
703
  * Computes a collision-free component name within `components.inputs`. A name
668
- * is taken if it's already placed in inputs or reserved by a component that is
669
- * still being bundled (reserved before recursion).
704
+ * is taken if it's already present in the entry document's inputs or reserved
705
+ * by a component that is still being bundled (reserved before recursion).
670
706
  */
671
707
  uniqueName(candidate) {
672
708
  const field = cf.inputs.name;
673
- const inputs = this.ensureInputsField();
709
+ const {
710
+ components
711
+ } = this.entryResult;
712
+ const inputs = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isObjectElement)(components) ? components.get(field) : undefined;
674
713
  const reserved = this.reservedNames.get(field) ?? new Set();
675
- return (0,_util_ts__WEBPACK_IMPORTED_MODULE_25__.uniqueName)(candidate, name => inputs.hasKey(name) || reserved.has(name));
714
+ return (0,_util_ts__WEBPACK_IMPORTED_MODULE_25__.uniqueName)(candidate, name => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isObjectElement)(inputs) && inputs.hasKey(name) || reserved.has(name));
676
715
  }
677
716
 
678
717
  /**
@@ -697,14 +736,36 @@ class Arazzo1BundleVisitor {
697
736
  this.entryParseResult.content.push(annotation);
698
737
  }
699
738
 
739
+ /**
740
+ * The entry document traversal is rooted at its Parse Result (nested
741
+ * traversals are rooted at schema resources), so leaving it marks the moment
742
+ * the whole entry document has been visited and the collected resources can
743
+ * be placed into `components.inputs` without the traversal descending into them.
744
+ * Guarded on the node so that a traversal rooted at any other Parse Result
745
+ * never flushes the shared placements early.
746
+ */
747
+ ParseResultElement = {
748
+ leave: path => {
749
+ if (path.node !== this.entryParseResult) return;
750
+ for (const {
751
+ name,
752
+ element
753
+ } of this.placements) {
754
+ this.ensureInputsField().set(name, element);
755
+ }
756
+ this.placements.length = 0;
757
+ }
758
+ };
759
+
700
760
  /**
701
761
  * JSON Schema Objects in Arazzo (used by Input Objects and inline schemas) are
702
762
  * a JSON Schema 2020-12 dialect — the only external reference type Arazzo
703
763
  * defines. They are bundled per the JSON Schema Compound Document rules: the
704
764
  * external schema RESOURCE is embedded verbatim into `components.inputs`
705
- * (carrying its `$id`), and the referencing `$ref` is left UNCHANGED — it
706
- * keeps resolving against the embedded resource's `$id`. This mirrors the
707
- * openapi-3-1 strategy's Schema Object handling.
765
+ * (carrying its `$id`), and the referencing `$ref` is rebased onto that `$id`
766
+ * when it resolves to a different URI (a location-based `$ref` to a
767
+ * self-identifying resource); otherwise it is left unchanged. This mirrors
768
+ * the openapi-3-1 strategy's Schema Object handling.
708
769
  */
709
770
  async JSONSchemaElement(path) {
710
771
  const referencingElement = path.node;
@@ -719,7 +780,8 @@ class Arazzo1BundleVisitor {
719
780
  // current document's base URI is derived directly (not via toReference)
720
781
  // so an internal $ref needs no resolution and never trips the
721
782
  // resolve.maxDepth guard.
722
- const $refBaseURI = (0,_dereference_strategies_arazzo_1_util_ts__WEBPACK_IMPORTED_MODULE_24__.resolveSchema$refField)(this.baseURI, referencingElement);
783
+ const schemaBaseURI = (0,_dereference_strategies_arazzo_1_util_ts__WEBPACK_IMPORTED_MODULE_24__.resolveSchemaBaseURI)(this.baseURI, path);
784
+ const $refBaseURI = (0,_dereference_strategies_arazzo_1_util_ts__WEBPACK_IMPORTED_MODULE_24__.resolveSchema$refField)(schemaBaseURI, referencingElement);
723
785
  const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_17__.stripHash($refBaseURI);
724
786
  const file = new _File_ts__WEBPACK_IMPORTED_MODULE_20__["default"]({
725
787
  uri: $refBaseURIStrippedHash
@@ -757,7 +819,10 @@ class Arazzo1BundleVisitor {
757
819
  let schemaReference = this.reference;
758
820
  try {
759
821
  const referenceAsSchema = (0,_dereference_strategies_arazzo_1_util_ts__WEBPACK_IMPORTED_MODULE_23__.maybeRefractToJSONSchemaElement)(schemaReference.value.result);
760
- (0,_dereference_strategies_arazzo_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_22__.evaluate)($refBaseURI, referenceAsSchema);
822
+ (0,_dereference_strategies_arazzo_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_22__.evaluate)($refBaseURI, referenceAsSchema, {
823
+ baseURI: this.baseURI,
824
+ index: this.schema$idIndex
825
+ });
761
826
  } catch (error) {
762
827
  if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_16__["default"]) {
763
828
  if ((0,_dereference_strategies_arazzo_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_21__.isAnchor)((0,_dereference_strategies_arazzo_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_21__.uriToAnchor)($refBaseURI))) {
@@ -796,20 +861,23 @@ class Arazzo1BundleVisitor {
796
861
  const field = cf.inputs.name;
797
862
  const canonicalKey = `${field}\t${resourceBaseURI}`;
798
863
 
799
- // resource already embedded (or being embedded) — leave the referencing
800
- // $ref untouched and stop. This also terminates circular external schema
864
+ // a location-based $ref to a self-identifying resource is rebased onto the
865
+ // resource's $id (keeping its fragment) — once embedded, the resource is
866
+ // reachable only by its $id. A $ref already resolving to that $id is left
867
+ // as written. See rebaseSchema$ref for the spec trade-off.
868
+ const rebased$ref = (0,_util_ts__WEBPACK_IMPORTED_MODULE_25__.rebaseSchema$ref)($refBaseURI, resourceBaseURI);
869
+
870
+ // resource already embedded (or being embedded) — point the referencing
871
+ // $ref at it and stop. This also terminates circular external schema
801
872
  // references, since the assignment is reserved BEFORE recursion.
802
873
  if (this.assignments.has(canonicalKey)) {
874
+ if (rebased$ref !== undefined) referencingElement.set('$ref', rebased$ref);
803
875
  path.skip();
804
876
  return;
805
877
  }
806
878
 
807
- // own a copy of the resource and ensure it carries a $id so the unchanged
808
- // $ref still resolves against it once embedded
879
+ // own a copy of the resource
809
880
  const embeddedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.cloneDeep)(resourceRoot);
810
- if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(embeddedElement.$id)) {
811
- embeddedElement.set('$id', resourceBaseURI);
812
- }
813
881
 
814
882
  // the embedded thing is the WHOLE resource (keyed by its $id), so its name
815
883
  // is derived from the resource URI
@@ -829,22 +897,37 @@ class Arazzo1BundleVisitor {
829
897
  reference: schemaReference,
830
898
  options: this.options,
831
899
  assignments: this.assignments,
832
- reservedNames: this.reservedNames
900
+ reservedNames: this.reservedNames,
901
+ placements: this.placements,
902
+ schema$idIndex: this.schema$idIndex
833
903
  });
834
904
  const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_7__.traverseAsync)(embeddedElement, visitor, {
835
905
  mutable: true
836
906
  });
837
907
 
908
+ // a resource without its own $id is identified by its retrieval URI; write
909
+ // it relative to the entry document (the base of components.inputs) so the
910
+ // bundle carries no absolute filesystem path and stays relocatable. Assigned
911
+ // after the nested traversal so a reader deriving a schema's base from live
912
+ // $ids (see #540) never resolves the resource's own $refs against the entry
913
+ // document.
914
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(bundledElement.$id)) {
915
+ bundledElement.set('$id', _util_url_ts__WEBPACK_IMPORTED_MODULE_17__.relative(this.entryBaseURI, resourceBaseURI));
916
+ }
917
+
838
918
  // annotate the embedded resource with info about its origin
839
919
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isElement)(bundledElement)) {
840
920
  bundledElement.meta.set('ref-origin', schemaReference.uri);
841
921
  }
842
922
 
843
- // place the embedded resource into the entry document's components.inputs
844
- this.ensureInputsField().set(componentName, bundledElement);
923
+ // queue the embedded resource for placement into the entry document's components.inputs
924
+ this.placements.push({
925
+ name: componentName,
926
+ element: bundledElement
927
+ });
845
928
 
846
- // the referencing $ref is left UNCHANGED — it resolves against the
847
- // embedded resource's $id
929
+ // point the referencing $ref at the embedded resource's $id
930
+ if (rebased$ref !== undefined) referencingElement.set('$ref', rebased$ref);
848
931
  path.skip();
849
932
  } catch (error) {
850
933
  this.handleError(`Error while bundling JSON Schema Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -3164,43 +3247,44 @@ __webpack_require__.r(__webpack_exports__);
3164
3247
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(87009);
3165
3248
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6352);
3166
3249
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25162);
3167
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12111);
3168
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(97071);
3169
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(84660);
3170
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(37205);
3171
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(44673);
3172
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(16280);
3173
- /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(44641);
3174
- /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(80796);
3175
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(12020);
3176
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(61198);
3177
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(21314);
3178
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(24329);
3179
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(29881);
3180
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(76332);
3181
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(23806);
3182
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(52645);
3183
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(23031);
3184
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(63842);
3185
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(87455);
3186
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(16363);
3187
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(55122);
3188
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(71117);
3189
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(72257);
3190
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(69511);
3191
- /* harmony import */ var _errors_BundleError_ts__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(81002);
3192
- /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(8853);
3193
- /* harmony import */ var _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(16843);
3194
- /* harmony import */ var _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(51325);
3195
- /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(44477);
3196
- /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(30658);
3197
- /* harmony import */ var _parse_index_ts__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(35014);
3198
- /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(98979);
3199
- /* harmony import */ var _File_ts__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(10682);
3200
- /* harmony import */ var _dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(32054);
3201
- /* harmony import */ var _dereference_strategies_openapi_3_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(56481);
3202
- /* harmony import */ var _dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(60888);
3203
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(25939);
3250
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(96911);
3251
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12111);
3252
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(97071);
3253
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(84660);
3254
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(37205);
3255
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(44673);
3256
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(16280);
3257
+ /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(44641);
3258
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(80796);
3259
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(12020);
3260
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(61198);
3261
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(21314);
3262
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(24329);
3263
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(29881);
3264
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(76332);
3265
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(23806);
3266
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(52645);
3267
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(23031);
3268
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(63842);
3269
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(87455);
3270
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(16363);
3271
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(55122);
3272
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(71117);
3273
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(72257);
3274
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(69511);
3275
+ /* harmony import */ var _errors_BundleError_ts__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(81002);
3276
+ /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(8853);
3277
+ /* harmony import */ var _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(16843);
3278
+ /* harmony import */ var _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(51325);
3279
+ /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(44477);
3280
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(30658);
3281
+ /* harmony import */ var _parse_index_ts__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(35014);
3282
+ /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(98979);
3283
+ /* harmony import */ var _File_ts__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(10682);
3284
+ /* harmony import */ var _dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(32054);
3285
+ /* harmony import */ var _dereference_strategies_openapi_3_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(56481);
3286
+ /* harmony import */ var _dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(60888);
3287
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(25939);
3204
3288
 
3205
3289
 
3206
3290
 
@@ -3227,7 +3311,7 @@ __webpack_require__.r(__webpack_exports__);
3227
3311
  * Field names are sourced from the Components Object fixed fields so they
3228
3312
  * cannot drift from the namespace definition.
3229
3313
  */
3230
- const cf = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__.fixedFields)(_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.ComponentsElement, {
3314
+ const cf = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__.fixedFields)(_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__.ComponentsElement, {
3231
3315
  indexed: true
3232
3316
  });
3233
3317
  const componentFieldByReferencedElement = {
@@ -3250,18 +3334,24 @@ const componentFieldByReferencedElement = {
3250
3334
  * object.
3251
3335
  */
3252
3336
  const componentFieldElementByField = {
3253
- [cf.schemas.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_25__["default"],
3254
- [cf.responses.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_24__["default"],
3255
- [cf.parameters.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_21__["default"],
3256
- [cf.examples.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__["default"],
3257
- [cf.requestBodies.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__["default"],
3258
- [cf.headers.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__["default"],
3259
- [cf.securitySchemes.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_26__["default"],
3260
- [cf.links.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__["default"],
3261
- [cf.callbacks.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__["default"],
3262
- [cf.pathItems.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_22__["default"]
3337
+ [cf.schemas.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_26__["default"],
3338
+ [cf.responses.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_25__["default"],
3339
+ [cf.parameters.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_22__["default"],
3340
+ [cf.examples.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__["default"],
3341
+ [cf.requestBodies.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_24__["default"],
3342
+ [cf.headers.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__["default"],
3343
+ [cf.securitySchemes.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_27__["default"],
3344
+ [cf.links.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_21__["default"],
3345
+ [cf.callbacks.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__["default"],
3346
+ [cf.pathItems.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__["default"]
3263
3347
  };
3264
3348
 
3349
+ /**
3350
+ * A bundled element awaiting placement into the entry document's Components
3351
+ * Object field.
3352
+ * @public
3353
+ */
3354
+
3265
3355
  /**
3266
3356
  * @public
3267
3357
  */
@@ -3279,7 +3369,7 @@ class OpenAPI3_1BundleVisitor {
3279
3369
  * Derived from the shared refSet's root reference.
3280
3370
  */
3281
3371
  get entryURI() {
3282
- return _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.refSet?.rootRef?.uri ?? '');
3372
+ return _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash(this.reference.refSet?.rootRef?.uri ?? '');
3283
3373
  }
3284
3374
 
3285
3375
  /**
@@ -3319,18 +3409,50 @@ class OpenAPI3_1BundleVisitor {
3319
3409
  * generic object referenced once as a Parameter and once as a Response).
3320
3410
  */
3321
3411
  refractCache;
3412
+
3413
+ /**
3414
+ * Index of `$id`-bearing schemas per document, shared across the entry document
3415
+ * and every external document visitor of a single bundle run so it never
3416
+ * outlives mutations of the documents (e.g. the final placement of components).
3417
+ */
3418
+ schema$idIndex;
3419
+
3420
+ /**
3421
+ * Bundled fragments waiting to be placed into the entry document's
3422
+ * Components Object, shared across the entry document and every external
3423
+ * document visitor. Placement is deferred until the entry document traversal
3424
+ * completes: the traversal walks live content, so placing a fragment mid-way
3425
+ * would make it descend into the fragment and re-bundle its `$ref`s against
3426
+ * the entry document's base URI instead of the fragment's own.
3427
+ */
3428
+ placements;
3429
+
3430
+ /**
3431
+ * The base URI the traversed content will have once placed into the entry
3432
+ * document, when placement changes it: content hoisted out of a non-schema
3433
+ * document (a Response, Parameter, Path Item, ...) trades that document's
3434
+ * base URI for the entry document's. Unset for the entry document itself and
3435
+ * for embedded schema resources, whose `$id` carries their base along.
3436
+ */
3437
+ relocationBaseURI;
3322
3438
  constructor({
3323
3439
  reference,
3324
3440
  options,
3325
3441
  assignments = new Map(),
3326
3442
  reservedNames = new Map(),
3327
- refractCache = new WeakMap()
3443
+ refractCache = new WeakMap(),
3444
+ schema$idIndex = new WeakMap(),
3445
+ placements = [],
3446
+ relocationBaseURI
3328
3447
  }) {
3329
3448
  this.reference = reference;
3330
3449
  this.options = options;
3331
3450
  this.assignments = assignments;
3332
3451
  this.reservedNames = reservedNames;
3333
3452
  this.refractCache = refractCache;
3453
+ this.schema$idIndex = schema$idIndex;
3454
+ this.placements = placements;
3455
+ this.relocationBaseURI = relocationBaseURI;
3334
3456
  }
3335
3457
  getRefracted(source, type) {
3336
3458
  return this.refractCache.get(source)?.get(type);
@@ -3344,12 +3466,12 @@ class OpenAPI3_1BundleVisitor {
3344
3466
  byType.set(type, refracted);
3345
3467
  }
3346
3468
  toBaseURI(uri) {
3347
- return _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.resolve(this.reference.uri, _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(uri)));
3469
+ return _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.resolve(this.reference.uri, _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash(uri)));
3348
3470
  }
3349
3471
  async toReference(uri) {
3350
3472
  // detect maximum depth of resolution
3351
3473
  if (this.reference.depth >= this.options.resolve.maxDepth) {
3352
- throw new _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_30__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
3474
+ throw new _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_31__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
3353
3475
  maxDepth: this.options.resolve.maxDepth,
3354
3476
  uri: this.reference.uri
3355
3477
  });
@@ -3363,14 +3485,14 @@ class OpenAPI3_1BundleVisitor {
3363
3485
  if (refSet.has(baseURI)) {
3364
3486
  return refSet.find((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(baseURI, 'uri'));
3365
3487
  }
3366
- const parseResult = await (0,_parse_index_ts__WEBPACK_IMPORTED_MODULE_33__["default"])(_util_url_ts__WEBPACK_IMPORTED_MODULE_32__.unsanitize(baseURI), {
3488
+ const parseResult = await (0,_parse_index_ts__WEBPACK_IMPORTED_MODULE_34__["default"])(_util_url_ts__WEBPACK_IMPORTED_MODULE_33__.unsanitize(baseURI), {
3367
3489
  ...this.options,
3368
3490
  parse: {
3369
3491
  ...this.options.parse,
3370
3492
  mediaType: 'text/plain'
3371
3493
  }
3372
3494
  });
3373
- const reference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_34__["default"]({
3495
+ const reference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_35__["default"]({
3374
3496
  uri: baseURI,
3375
3497
  value: parseResult,
3376
3498
  depth: this.reference.depth + 1
@@ -3385,7 +3507,23 @@ class OpenAPI3_1BundleVisitor {
3385
3507
  * transferable. Bare fragments are returned unchanged.
3386
3508
  */
3387
3509
  normalizeSelfReference(ref) {
3388
- return ref.startsWith('#') ? ref : _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.getHash(ref);
3510
+ return ref.startsWith('#') ? ref : _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.getHash(ref);
3511
+ }
3512
+
3513
+ /**
3514
+ * The base URI the given Schema Object's `$ref` will be resolved against once
3515
+ * the content is placed into the entry document, or `undefined` when the
3516
+ * `$ref` as written resolves to `$refBaseURI` from there as well: the content
3517
+ * isn't relocated, an absolute `$id` on the schema's ancestor chain pins its
3518
+ * base, or the hoisted document sits next to the entry document.
3519
+ */
3520
+ relocatedSchemaBaseURI(path, $refBaseURI) {
3521
+ if (this.relocationBaseURI === undefined) return undefined;
3522
+ const relocatedBaseURI = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.resolveSchemaBaseURI)(this.relocationBaseURI, path);
3523
+ if ((0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.resolveSchema$refField)(relocatedBaseURI, path.node) === $refBaseURI) {
3524
+ return undefined;
3525
+ }
3526
+ return relocatedBaseURI;
3389
3527
  }
3390
3528
 
3391
3529
  /**
@@ -3404,16 +3542,16 @@ class OpenAPI3_1BundleVisitor {
3404
3542
  // breach (MaximumBundleDepthError, which also extends BundleError) is a
3405
3543
  // resolution failure and flows through below — wrapped and subject to
3406
3544
  // continueOnError, like dereferencing.
3407
- if (error instanceof _errors_BundleError_ts__WEBPACK_IMPORTED_MODULE_27__["default"] && !(error instanceof _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_29__["default"])) {
3545
+ if (error instanceof _errors_BundleError_ts__WEBPACK_IMPORTED_MODULE_28__["default"] && !(error instanceof _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_30__["default"])) {
3408
3546
  throw error;
3409
3547
  }
3410
3548
  const {
3411
3549
  continueOnError
3412
3550
  } = this.options.bundle;
3413
- const isEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
3551
+ const isEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
3414
3552
  const uri = this.reference.uri;
3415
3553
  const type = referencingElement.element;
3416
- const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement);
3554
+ const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_9__["default"])(referencingElement);
3417
3555
  const location = visitorPath.formatPath();
3418
3556
  const hop = {
3419
3557
  uri,
@@ -3424,12 +3562,12 @@ class OpenAPI3_1BundleVisitor {
3424
3562
  codeFrame
3425
3563
  };
3426
3564
  let unresolvedError;
3427
- if (error instanceof _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_28__["default"]) {
3565
+ if (error instanceof _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_29__["default"]) {
3428
3566
  // @ts-ignore
3429
3567
  error.trace = [hop, ...error.trace];
3430
3568
  unresolvedError = error;
3431
3569
  } else {
3432
- unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_28__["default"](message, {
3570
+ unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_29__["default"](message, {
3433
3571
  cause: error,
3434
3572
  type,
3435
3573
  uri,
@@ -3452,12 +3590,12 @@ class OpenAPI3_1BundleVisitor {
3452
3590
  const entryResult = this.entryResult;
3453
3591
  let components = entryResult.components;
3454
3592
  if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(components)) {
3455
- components = new _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.ComponentsElement();
3593
+ components = new _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__.ComponentsElement();
3456
3594
  entryResult.components = components;
3457
3595
  }
3458
3596
  let fieldElement = components.get(field);
3459
3597
  if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(fieldElement)) {
3460
- const FieldElement = componentFieldElementByField[field] ?? _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__["default"];
3598
+ const FieldElement = componentFieldElementByField[field] ?? _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"];
3461
3599
  fieldElement = new FieldElement();
3462
3600
  components.set(field, fieldElement);
3463
3601
  }
@@ -3469,9 +3607,9 @@ class OpenAPI3_1BundleVisitor {
3469
3607
  * falling back to the referenced file's basename.
3470
3608
  */
3471
3609
  basenameOf(jsonPointer, baseURI) {
3472
- const tokens = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.parse)(jsonPointer).tree;
3610
+ const tokens = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.parse)(jsonPointer).tree;
3473
3611
  const lastToken = tokens.length > 0 ? tokens[tokens.length - 1] : '';
3474
- return lastToken || _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.getBasename(baseURI) || 'Schema';
3612
+ return lastToken || _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.getBasename(baseURI) || 'Schema';
3475
3613
  }
3476
3614
 
3477
3615
  /**
@@ -3494,9 +3632,9 @@ class OpenAPI3_1BundleVisitor {
3494
3632
  return this.basenameOf(jsonPointer, baseURI);
3495
3633
  }
3496
3634
  if (componentNamesStrategy === 'title') {
3497
- const title = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(element) ? (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(element.get('title')) : undefined;
3635
+ const title = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(element) ? (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(element.get('title')) : undefined;
3498
3636
  if (typeof title === 'string' && title.trim() !== '') {
3499
- const name = (0,_util_ts__WEBPACK_IMPORTED_MODULE_39__.sanitizeComponentName)((0,_util_ts__WEBPACK_IMPORTED_MODULE_39__.toPascalCase)(title));
3637
+ const name = (0,_util_ts__WEBPACK_IMPORTED_MODULE_40__.sanitizeComponentName)((0,_util_ts__WEBPACK_IMPORTED_MODULE_40__.toPascalCase)(title));
3500
3638
  if (name !== '') return name;
3501
3639
  }
3502
3640
  // fall back to basename when no usable title is present
@@ -3506,13 +3644,16 @@ class OpenAPI3_1BundleVisitor {
3506
3644
 
3507
3645
  /**
3508
3646
  * Computes a collision-free component name within the target field. A name is
3509
- * taken if it's already placed in components or reserved by a component that
3510
- * is still being bundled (reserved before recursion).
3647
+ * taken if it's already present in the entry document's components or reserved
3648
+ * by a component that is still being bundled (reserved before recursion).
3511
3649
  */
3512
3650
  uniqueName(candidate, field) {
3513
- const fieldElement = this.ensureComponentsField(field);
3651
+ const {
3652
+ components
3653
+ } = this.entryResult;
3654
+ const fieldElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(components) ? components.get(field) : undefined;
3514
3655
  const reserved = this.reservedNames.get(field) ?? new Set();
3515
- return (0,_util_ts__WEBPACK_IMPORTED_MODULE_39__.uniqueName)(candidate, name => fieldElement.hasKey(name) || reserved.has(name));
3656
+ return (0,_util_ts__WEBPACK_IMPORTED_MODULE_40__.uniqueName)(candidate, name => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(fieldElement) && fieldElement.hasKey(name) || reserved.has(name));
3516
3657
  }
3517
3658
 
3518
3659
  /**
@@ -3528,17 +3669,39 @@ class OpenAPI3_1BundleVisitor {
3528
3669
  }
3529
3670
  const message = `Component "${preferredName}" in components/${field} is referenced with the same name but different content. Renamed to "${componentName}".`;
3530
3671
  if (onComponentNameCollision === 'error') {
3531
- throw new _errors_BundleError_ts__WEBPACK_IMPORTED_MODULE_27__["default"](message);
3672
+ throw new _errors_BundleError_ts__WEBPACK_IMPORTED_MODULE_28__["default"](message);
3532
3673
  }
3533
- const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
3674
+ const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"](message);
3534
3675
  annotation.classes.push('warning');
3535
3676
  annotation.code = 'bundle-component-name-collision';
3536
3677
  // append (never prepend) so the result element stays ahead of annotations
3537
3678
  this.entryParseResult.content.push(annotation);
3538
3679
  }
3680
+
3681
+ /**
3682
+ * The entry document traversal is rooted at its Parse Result (nested
3683
+ * traversals are rooted at fragments), so leaving it marks the moment the
3684
+ * whole entry document has been visited and the collected fragments can be
3685
+ * placed into its Components Object without the traversal descending into them.
3686
+ * Guarded on the node so that a traversal rooted at any other Parse Result
3687
+ * never flushes the shared placements early.
3688
+ */
3689
+ ParseResultElement = {
3690
+ leave: path => {
3691
+ if (path.node !== this.entryParseResult) return;
3692
+ for (const {
3693
+ field,
3694
+ name,
3695
+ element
3696
+ } of this.placements) {
3697
+ this.ensureComponentsField(field).set(name, element);
3698
+ }
3699
+ this.placements.length = 0;
3700
+ }
3701
+ };
3539
3702
  async ReferenceElement(path) {
3540
3703
  const referencingElement = path.node;
3541
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
3704
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref);
3542
3705
  const retrievalURI = this.toBaseURI($ref);
3543
3706
  const isInternalReference = this.entryURI === retrievalURI;
3544
3707
  const isExternalReference = !isInternalReference;
@@ -3555,8 +3718,8 @@ class OpenAPI3_1BundleVisitor {
3555
3718
  path.skip();
3556
3719
  return;
3557
3720
  }
3558
- const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.resolve(retrievalURI, $ref);
3559
- const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
3721
+ const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.resolve(retrievalURI, $ref);
3722
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
3560
3723
 
3561
3724
  // the target bucket depends on the referencing context, so it's part of the
3562
3725
  // identity: the same external target referenced as e.g. both a parameter and
@@ -3584,7 +3747,7 @@ class OpenAPI3_1BundleVisitor {
3584
3747
  try {
3585
3748
  // detect maximum depth of bundling
3586
3749
  if (this.reference.depth >= this.options.bundle.maxDepth) {
3587
- throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_29__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3750
+ throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_30__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3588
3751
  maxDepth: this.options.bundle.maxDepth,
3589
3752
  uri: this.reference.uri
3590
3753
  });
@@ -3592,21 +3755,21 @@ class OpenAPI3_1BundleVisitor {
3592
3755
  const reference = await this.toReference($ref);
3593
3756
 
3594
3757
  // possibly non-semantic fragment
3595
- let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
3758
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.evaluate)(reference.value.result, jsonPointer);
3596
3759
 
3597
3760
  // apply semantics to the fragment so nested references become Reference Objects
3598
- if (referencedElement.element !== referencedElementType && !(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement)) {
3761
+ if (referencedElement.element !== referencedElementType && !(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isReferenceElement)(referencedElement)) {
3599
3762
  const cached = this.getRefracted(referencedElement, referencedElementType);
3600
3763
  if (cached !== undefined) {
3601
3764
  referencedElement = cached;
3602
- } else if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__.isReferenceLikeElement)(referencedElement)) {
3765
+ } else if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.isReferenceLikeElement)(referencedElement)) {
3603
3766
  const sourceElement = referencedElement;
3604
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.refractReference)(referencedElement);
3767
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.refractReference)(referencedElement);
3605
3768
  referencedElement.meta.set('referenced-element', referencedElementType);
3606
3769
  this.setRefracted(sourceElement, referencedElementType, referencedElement);
3607
3770
  } else {
3608
3771
  const sourceElement = referencedElement;
3609
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__["default"])(referencedElement, {
3772
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__["default"])(referencedElement, {
3610
3773
  element: referencedElementType
3611
3774
  });
3612
3775
  this.setRefracted(sourceElement, referencedElementType, referencedElement);
@@ -3614,7 +3777,7 @@ class OpenAPI3_1BundleVisitor {
3614
3777
  }
3615
3778
  const preferredName = this.baseName(referencedElement, field, jsonPointer, retrievalURI);
3616
3779
  const componentName = this.uniqueName(preferredName, field);
3617
- const internalPointer = `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.escape)(componentName)}`;
3780
+ const internalPointer = `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.escape)(componentName)}`;
3618
3781
  this.reportNameCollision(preferredName, componentName, field);
3619
3782
 
3620
3783
  // reserve the assignment and component name before recursing so cyclic
@@ -3623,16 +3786,21 @@ class OpenAPI3_1BundleVisitor {
3623
3786
  if (!this.reservedNames.has(field)) this.reservedNames.set(field, new Set());
3624
3787
  this.reservedNames.get(field).add(componentName);
3625
3788
 
3626
- // own a copy of the fragment and bundle its own external references
3627
- const hoistedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(referencedElement);
3789
+ // own a copy of the fragment and bundle its own external references; the
3790
+ // fragment ends up in the entry document, so that is where its content
3791
+ // resolves relative references from
3792
+ const hoistedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(referencedElement);
3628
3793
  const visitor = new OpenAPI3_1BundleVisitor({
3629
3794
  reference,
3630
3795
  options: this.options,
3631
3796
  assignments: this.assignments,
3632
3797
  reservedNames: this.reservedNames,
3633
- refractCache: this.refractCache
3798
+ refractCache: this.refractCache,
3799
+ schema$idIndex: this.schema$idIndex,
3800
+ placements: this.placements,
3801
+ relocationBaseURI: this.entryURI
3634
3802
  });
3635
- const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(hoistedElement, visitor, {
3803
+ const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverseAsync)(hoistedElement, visitor, {
3636
3804
  mutable: true
3637
3805
  });
3638
3806
 
@@ -3641,8 +3809,12 @@ class OpenAPI3_1BundleVisitor {
3641
3809
  bundledElement.meta.set('ref-origin', reference.uri);
3642
3810
  }
3643
3811
 
3644
- // place the bundled fragment into the entry document's components
3645
- this.ensureComponentsField(field).set(componentName, bundledElement);
3812
+ // queue the bundled fragment for placement into the entry document's components
3813
+ this.placements.push({
3814
+ field,
3815
+ name: componentName,
3816
+ element: bundledElement
3817
+ });
3646
3818
 
3647
3819
  // rewrite the referencing element to point at the hoisted fragment
3648
3820
  referencingElement.set('$ref', internalPointer);
@@ -3668,7 +3840,7 @@ class OpenAPI3_1BundleVisitor {
3668
3840
  if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(pathItemElement.$ref)) {
3669
3841
  return;
3670
3842
  }
3671
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(pathItemElement.$ref);
3843
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(pathItemElement.$ref);
3672
3844
  const retrievalURI = this.toBaseURI($ref);
3673
3845
  const isInternalReference = this.entryURI === retrievalURI;
3674
3846
  const isExternalReference = !isInternalReference;
@@ -3685,8 +3857,8 @@ class OpenAPI3_1BundleVisitor {
3685
3857
  path.skip();
3686
3858
  return;
3687
3859
  }
3688
- const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.resolve(retrievalURI, $ref);
3689
- const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
3860
+ const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.resolve(retrievalURI, $ref);
3861
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
3690
3862
  const field = cf.pathItems.name;
3691
3863
  const canonicalKey = `${field}\t${retrievalURI}#${jsonPointer}`;
3692
3864
 
@@ -3701,28 +3873,28 @@ class OpenAPI3_1BundleVisitor {
3701
3873
  try {
3702
3874
  // detect maximum depth of bundling
3703
3875
  if (this.reference.depth >= this.options.bundle.maxDepth) {
3704
- throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_29__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3876
+ throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_30__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3705
3877
  maxDepth: this.options.bundle.maxDepth,
3706
3878
  uri: this.reference.uri
3707
3879
  });
3708
3880
  }
3709
3881
  const reference = await this.toReference($ref);
3710
- let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
3882
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.evaluate)(reference.value.result, jsonPointer);
3711
3883
 
3712
3884
  // apply Path Item semantics to the referenced fragment
3713
- if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement)) {
3885
+ if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isPathItemElement)(referencedElement)) {
3714
3886
  const cached = this.getRefracted(referencedElement, 'pathItem');
3715
3887
  if (cached !== undefined) {
3716
3888
  referencedElement = cached;
3717
3889
  } else {
3718
3890
  const sourceElement = referencedElement;
3719
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.refractPathItem)(referencedElement);
3891
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.refractPathItem)(referencedElement);
3720
3892
  this.setRefracted(sourceElement, 'pathItem', referencedElement);
3721
3893
  }
3722
3894
  }
3723
3895
  const preferredName = this.baseName(referencedElement, field, jsonPointer, retrievalURI);
3724
3896
  const componentName = this.uniqueName(preferredName, field);
3725
- const internalPointer = `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.escape)(componentName)}`;
3897
+ const internalPointer = `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.escape)(componentName)}`;
3726
3898
  this.reportNameCollision(preferredName, componentName, field);
3727
3899
 
3728
3900
  // reserve the assignment and component name before recursing so cyclic
@@ -3731,16 +3903,21 @@ class OpenAPI3_1BundleVisitor {
3731
3903
  if (!this.reservedNames.has(field)) this.reservedNames.set(field, new Set());
3732
3904
  this.reservedNames.get(field).add(componentName);
3733
3905
 
3734
- // own a copy of the fragment and bundle its own external references
3735
- const hoistedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(referencedElement);
3906
+ // own a copy of the fragment and bundle its own external references; the
3907
+ // Path Item ends up in the entry document, so that is where its content
3908
+ // resolves relative references from
3909
+ const hoistedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(referencedElement);
3736
3910
  const visitor = new OpenAPI3_1BundleVisitor({
3737
3911
  reference,
3738
3912
  options: this.options,
3739
3913
  assignments: this.assignments,
3740
3914
  reservedNames: this.reservedNames,
3741
- refractCache: this.refractCache
3915
+ refractCache: this.refractCache,
3916
+ schema$idIndex: this.schema$idIndex,
3917
+ placements: this.placements,
3918
+ relocationBaseURI: this.entryURI
3742
3919
  });
3743
- const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(hoistedElement, visitor, {
3920
+ const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverseAsync)(hoistedElement, visitor, {
3744
3921
  mutable: true
3745
3922
  });
3746
3923
 
@@ -3749,8 +3926,12 @@ class OpenAPI3_1BundleVisitor {
3749
3926
  // internal `#/components/pathItems/...` pointer by the child traversal
3750
3927
  bundledElement.meta.set('ref-origin', reference.uri);
3751
3928
 
3752
- // place the bundled Path Item into the entry document's components
3753
- this.ensureComponentsField(field).set(componentName, bundledElement);
3929
+ // queue the bundled Path Item for placement into the entry document's components
3930
+ this.placements.push({
3931
+ field,
3932
+ name: componentName,
3933
+ element: bundledElement
3934
+ });
3754
3935
 
3755
3936
  // rewrite the referencing Path Item to point at the hoisted one, keeping
3756
3937
  // any sibling fields (e.g. summary, description) next to the $ref
@@ -3778,21 +3959,22 @@ class OpenAPI3_1BundleVisitor {
3778
3959
  if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencingElement.$ref)) {
3779
3960
  return;
3780
3961
  }
3781
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
3962
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref);
3782
3963
  try {
3783
3964
  // compute baseURI using rules around $id and $ref keywords. The current
3784
3965
  // document's URI is the retrieval URI — derive it directly (not via
3785
3966
  // toReference) so an internal $ref needs no resolution and never trips the
3786
3967
  // resolve.maxDepth guard, matching how ReferenceElement returns early.
3787
3968
  const retrievalURI = this.reference.uri;
3788
- const $refBaseURI = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__.resolveSchema$refField)(retrievalURI, referencingElement);
3789
- const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash($refBaseURI);
3790
- const file = new _File_ts__WEBPACK_IMPORTED_MODULE_35__["default"]({
3969
+ const schemaBaseURI = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.resolveSchemaBaseURI)(retrievalURI, path);
3970
+ const $refBaseURI = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.resolveSchema$refField)(schemaBaseURI, referencingElement);
3971
+ const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash($refBaseURI);
3972
+ const file = new _File_ts__WEBPACK_IMPORTED_MODULE_36__["default"]({
3791
3973
  uri: $refBaseURIStrippedHash
3792
3974
  });
3793
3975
  const isUnknownURI = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(r => r.canRead(file), this.options.resolve.resolvers);
3794
3976
  const isURL = !isUnknownURI;
3795
- const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.uri) === $refBaseURIStrippedHash;
3977
+ const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash(this.reference.uri) === $refBaseURIStrippedHash;
3796
3978
  const isExternalReference = !isInternalReference;
3797
3979
 
3798
3980
  // internal Schema Object $refs resolve against the in-document $id graph;
@@ -3810,7 +3992,7 @@ class OpenAPI3_1BundleVisitor {
3810
3992
  // detect maximum depth of bundling before fetching the external resource,
3811
3993
  // matching ReferenceElement/PathItemElement (which check before toReference)
3812
3994
  if (this.reference.depth >= this.options.bundle.maxDepth) {
3813
- throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_29__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3995
+ throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_30__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3814
3996
  maxDepth: this.options.bundle.maxDepth,
3815
3997
  uri: this.reference.uri
3816
3998
  });
@@ -3821,59 +4003,95 @@ class OpenAPI3_1BundleVisitor {
3821
4003
  // as a canonical URI / URL against the current document's $id graph; if
3822
4004
  // that fails, fall back to fetching the external document and resolving
3823
4005
  // the fragment there as a $anchor or JSON Pointer.
4006
+ //
4007
+ // the fragment being traversed is searched before the whole document:
4008
+ // content hoisted out of an external document (a Response, Parameter, Path
4009
+ // Item, ...) is refracted with its own semantics, so the Schema Objects it
4010
+ // contains are indexed, whereas the external document as a whole is parsed
4011
+ // generically and refracted as a bare JSON Schema, which leaves those Schema
4012
+ // Objects (under `content`, `schema`, ...) unrecognized and their `$id`s out
4013
+ // of the index
4014
+ const documentElement = this.reference.value.result;
4015
+ const rootNode = path.getAncestorNodes().at(-1) ?? path.node;
4016
+ const fragmentElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isParseResultElement)(rootNode) ? rootNode.result : rootNode;
4017
+ const uriEvaluateOptions = {
4018
+ baseURI: retrievalURI,
4019
+ index: this.schema$idIndex
4020
+ };
3824
4021
  let schemaReference = this.reference;
4022
+ let resourceRoot;
4023
+ let resourceBaseURI;
3825
4024
  try {
3826
- const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
3827
- (0,_dereference_strategies_openapi_3_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_37__.evaluate)($refBaseURI, referenceAsSchema);
4025
+ try {
4026
+ (0,_dereference_strategies_openapi_3_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_38__.evaluate)($refBaseURI, (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.maybeRefractToSchemaElement)(fragmentElement), uriEvaluateOptions);
4027
+ // a $ref that resolves (by $id/$anchor/pointer) within the traversed
4028
+ // content is internal even when its URI form (e.g. a URN or absolute
4029
+ // $id) is not a bare fragment: the $id resource travels with the content
4030
+ // wherever it is placed. Leave it untouched — it resolves against the
4031
+ // in-content $id graph, and embedding the content into itself would be
4032
+ // wrong.
4033
+ return;
4034
+ } catch (error) {
4035
+ if (!(error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_32__["default"]) || fragmentElement === documentElement) {
4036
+ throw error;
4037
+ }
4038
+ const documentAsSchema = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.maybeRefractToSchemaElement)(documentElement);
4039
+ (0,_dereference_strategies_openapi_3_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_38__.evaluate)($refBaseURI, documentAsSchema, uriEvaluateOptions);
4040
+ // the $id resource sits in the current document but outside the
4041
+ // traversed fragment, so it stays behind once the fragment is placed
4042
+ // into the entry document. The resource to embed is that $id-bearing
4043
+ // schema, addressed by its canonical URI (the $ref without fragment).
4044
+ resourceRoot = (0,_dereference_strategies_openapi_3_1_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_38__.evaluate)($refBaseURIStrippedHash, documentAsSchema, uriEvaluateOptions);
4045
+ resourceBaseURI = $refBaseURIStrippedHash;
4046
+ }
3828
4047
  } catch (error) {
3829
- if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_31__["default"]) {
3830
- if ((0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_36__.isAnchor)((0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_36__.uriToAnchor)($refBaseURI))) {
3831
- schemaReference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_32__.unsanitize($refBaseURI));
3832
- const selector = (0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_36__.uriToAnchor)($refBaseURI);
3833
- const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
3834
- (0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_36__.evaluate)(selector, referenceAsSchema);
4048
+ if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_32__["default"]) {
4049
+ schemaReference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_33__.unsanitize($refBaseURI));
4050
+ const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.maybeRefractToSchemaElement)(schemaReference.value.result);
4051
+ if ((0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_37__.isAnchor)((0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_37__.uriToAnchor)($refBaseURI))) {
4052
+ const selector = (0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_37__.uriToAnchor)($refBaseURI);
4053
+ (0,_dereference_strategies_openapi_3_1_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_37__.evaluate)(selector, referenceAsSchema);
3835
4054
  } else {
3836
- schemaReference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_32__.unsanitize($refBaseURI));
3837
- const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
3838
- const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
3839
- (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(referenceAsSchema, selector);
4055
+ const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
4056
+ (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.evaluate)(referenceAsSchema, selector);
3840
4057
  }
4058
+
4059
+ // the resource to embed is the WHOLE external document (its root
4060
+ // schema), identified by its $id. A $ref into a fragment of the
4061
+ // document embeds the entire document resource once; the fragment
4062
+ // keeps resolving against the embedded $id.
4063
+ resourceRoot = referenceAsSchema;
4064
+ resourceBaseURI = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_39__.resolveSchema$idField)(_util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash(schemaReference.uri), resourceRoot) ?? _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.stripHash(schemaReference.uri);
3841
4065
  } else {
3842
4066
  throw error;
3843
4067
  }
3844
4068
  }
3845
-
3846
- // a $ref that resolves (by $id/$anchor/pointer) within the current document
3847
- // is internal even when its URI form (e.g. a URN or absolute $id) is not a
3848
- // bare fragment. Leave it untouched — it resolves against the in-document
3849
- // $id graph, and embedding the current document into itself would be wrong.
3850
- if (_util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(schemaReference.uri) === _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.uri)) {
3851
- return;
3852
- }
3853
-
3854
- // the resource to embed is the WHOLE external document (its root schema),
3855
- // identified by its $id. A $ref into a fragment of the document embeds the
3856
- // entire document resource once; the fragment keeps resolving against the
3857
- // embedded $id.
3858
- const resourceRoot = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
3859
- const resourceBaseURI = (0,_dereference_strategies_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_38__.resolveSchema$idField)(_util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(schemaReference.uri), resourceRoot) ?? _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.stripHash(schemaReference.uri);
3860
4069
  const field = cf.schemas.name;
3861
4070
  const canonicalKey = `${field}\t${resourceBaseURI}`;
3862
4071
 
3863
- // resource already embedded (or being embedded) — leave the referencing
3864
- // $ref untouched and stop. This also terminates circular external schema
4072
+ // a location-based $ref to a self-identifying resource is rebased onto the
4073
+ // resource's $id (keeping its fragment) — once embedded, the resource is
4074
+ // reachable only by its $id. A $ref already resolving to that $id is left
4075
+ // as written. See rebaseSchema$ref for the spec trade-off.
4076
+ //
4077
+ // a $ref whose base URI changes on relocation into the entry document
4078
+ // (inside a hoisted Response, Parameter, Path Item, ...) is instead
4079
+ // rewritten to address the embedded resource from the base it will have
4080
+ // there, otherwise it dangles once placed. See relocateSchema$ref.
4081
+ const relocatedBaseURI = this.relocatedSchemaBaseURI(path, $refBaseURI);
4082
+ const rebased$ref = relocatedBaseURI === undefined ? (0,_util_ts__WEBPACK_IMPORTED_MODULE_40__.rebaseSchema$ref)($refBaseURI, resourceBaseURI) : (0,_util_ts__WEBPACK_IMPORTED_MODULE_40__.relocateSchema$ref)($refBaseURI, resourceBaseURI, relocatedBaseURI, (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(resourceRoot.$id));
4083
+
4084
+ // resource already embedded (or being embedded) — point the referencing
4085
+ // $ref at it and stop. This also terminates circular external schema
3865
4086
  // references, since the assignment is reserved BEFORE recursion.
3866
4087
  if (this.assignments.has(canonicalKey)) {
4088
+ if (rebased$ref !== undefined) referencingElement.set('$ref', rebased$ref);
3867
4089
  path.skip();
3868
4090
  return;
3869
4091
  }
3870
4092
 
3871
- // own a copy of the resource and ensure it carries a $id so the unchanged
3872
- // $ref still resolves against it once embedded
3873
- const embeddedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(resourceRoot);
3874
- if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(embeddedElement.$id)) {
3875
- embeddedElement.set('$id', resourceBaseURI);
3876
- }
4093
+ // own a copy of the resource
4094
+ const embeddedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(resourceRoot);
3877
4095
 
3878
4096
  // the embedded thing is the WHOLE resource (keyed by its $id), so its name
3879
4097
  // is derived from the resource URI, not the $ref fragment — passing a root
@@ -3884,7 +4102,7 @@ class OpenAPI3_1BundleVisitor {
3884
4102
 
3885
4103
  // reserve the assignment and component name before recursing so circular
3886
4104
  // external schema references terminate
3887
- this.assignments.set(canonicalKey, `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.escape)(componentName)}`);
4105
+ this.assignments.set(canonicalKey, `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.escape)(componentName)}`);
3888
4106
  if (!this.reservedNames.has(field)) this.reservedNames.set(field, new Set());
3889
4107
  this.reservedNames.get(field).add(componentName);
3890
4108
 
@@ -3895,20 +4113,36 @@ class OpenAPI3_1BundleVisitor {
3895
4113
  options: this.options,
3896
4114
  assignments: this.assignments,
3897
4115
  reservedNames: this.reservedNames,
3898
- refractCache: this.refractCache
4116
+ refractCache: this.refractCache,
4117
+ schema$idIndex: this.schema$idIndex,
4118
+ placements: this.placements
3899
4119
  });
3900
- const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(embeddedElement, visitor, {
4120
+ const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverseAsync)(embeddedElement, visitor, {
3901
4121
  mutable: true
3902
4122
  });
3903
4123
 
4124
+ // a resource without its own $id is identified by its retrieval URI; write
4125
+ // it relative to the entry document (the base of components.schemas) so the
4126
+ // bundle carries no absolute filesystem path and stays relocatable. Assigned
4127
+ // after the nested traversal so a reader deriving a schema's base from live
4128
+ // $ids (see #540) never resolves the resource's own $refs against the entry
4129
+ // document.
4130
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(bundledElement.$id)) {
4131
+ bundledElement.set('$id', _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.relative(this.entryURI, resourceBaseURI));
4132
+ }
4133
+
3904
4134
  // annotate the embedded resource with info about its origin
3905
4135
  bundledElement.meta.set('ref-origin', schemaReference.uri);
3906
4136
 
3907
- // place the embedded resource into the entry document's components
3908
- this.ensureComponentsField(field).set(componentName, bundledElement);
4137
+ // queue the embedded resource for placement into the entry document's components
4138
+ this.placements.push({
4139
+ field,
4140
+ name: componentName,
4141
+ element: bundledElement
4142
+ });
3909
4143
 
3910
- // the referencing $ref is left UNCHANGED — it resolves against the
3911
- // embedded resource's $id
4144
+ // point the referencing $ref at the embedded resource's $id
4145
+ if (rebased$ref !== undefined) referencingElement.set('$ref', rebased$ref);
3912
4146
  path.skip();
3913
4147
  } catch (error) {
3914
4148
  this.handleError(`Error while bundling Schema Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
@@ -3931,12 +4165,12 @@ class OpenAPI3_1BundleVisitor {
3931
4165
 
3932
4166
  // value and externalValue fields are mutually exclusive
3933
4167
  if (exampleElement.hasKey('value') && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(exampleElement.externalValue)) {
3934
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('ExampleElement value and externalValue fields are mutually exclusive', {
3935
- value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.value),
3936
- externalValue: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue)
4168
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('ExampleElement value and externalValue fields are mutually exclusive', {
4169
+ value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.value),
4170
+ externalValue: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.externalValue)
3937
4171
  });
3938
4172
  }
3939
- const externalValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue);
4173
+ const externalValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.externalValue);
3940
4174
  const retrievalURI = this.toBaseURI(externalValue);
3941
4175
  const isInternalReference = this.entryURI === retrievalURI;
3942
4176
  const isExternalReference = !isInternalReference;
@@ -3947,9 +4181,9 @@ class OpenAPI3_1BundleVisitor {
3947
4181
  }
3948
4182
  try {
3949
4183
  const reference = await this.toReference(externalValue);
3950
- const valueElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneShallow)(reference.value.result);
4184
+ const valueElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(reference.value.result);
3951
4185
  valueElement.meta.set('ref-origin', reference.uri);
3952
- const exampleElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneShallow)(exampleElement);
4186
+ const exampleElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(exampleElement);
3953
4187
  exampleElementCopy.value = valueElement;
3954
4188
  exampleElementCopy.remove('externalValue');
3955
4189
  path.replaceWith(exampleElementCopy);
@@ -3970,9 +4204,9 @@ class OpenAPI3_1BundleVisitor {
3970
4204
 
3971
4205
  // operationRef and operationId fields are mutually exclusive
3972
4206
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(linkElement.operationRef) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(linkElement.operationId)) {
3973
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('LinkElement operationRef and operationId fields are mutually exclusive', {
3974
- operationRef: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef),
3975
- operationId: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationId)
4207
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('LinkElement operationRef and operationId fields are mutually exclusive', {
4208
+ operationRef: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef),
4209
+ operationId: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationId)
3976
4210
  });
3977
4211
  }
3978
4212
 
@@ -3980,7 +4214,7 @@ class OpenAPI3_1BundleVisitor {
3980
4214
  if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(linkElement.operationRef)) {
3981
4215
  return;
3982
4216
  }
3983
- const operationRef = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef);
4217
+ const operationRef = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef);
3984
4218
  const retrievalURI = this.toBaseURI(operationRef);
3985
4219
  const isInternalReference = this.entryURI === retrievalURI;
3986
4220
  if (isInternalReference) {
@@ -3997,7 +4231,7 @@ class OpenAPI3_1BundleVisitor {
3997
4231
 
3998
4232
  // rewrite to an absolute URI so the link keeps resolving once the document
3999
4233
  // is treated as self-contained
4000
- const absoluteURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_32__.resolve(this.reference.uri, operationRef);
4234
+ const absoluteURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_33__.resolve(this.reference.uri, operationRef);
4001
4235
  if (absoluteURI !== operationRef) {
4002
4236
  linkElement.set('operationRef', absoluteURI);
4003
4237
  }
@@ -4016,6 +4250,9 @@ class OpenAPI3_1BundleVisitor {
4016
4250
 
4017
4251
  "use strict";
4018
4252
  __webpack_require__.r(__webpack_exports__);
4253
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(30658);
4254
+
4255
+
4019
4256
  /**
4020
4257
  * Upper-cases the first letter of each whitespace-separated word and joins
4021
4258
  * them, e.g. `pet model` -> `PetModel`.
@@ -4049,7 +4286,60 @@ const uniqueName = (candidate, isTaken) => {
4049
4286
  }
4050
4287
  return `${candidate}-${counter}`;
4051
4288
  };
4289
+
4290
+ /**
4291
+ * Computes the `$ref` value addressing an embedded JSON Schema resource by its
4292
+ * canonical `$id`. `$refURI` is the `$ref` resolved against the referencing
4293
+ * document's base URI; `resourceURI` is the embedded resource's canonical URI
4294
+ * (its `$id`, or the retrieval URI when it has none).
4295
+ *
4296
+ * When the two differ — a location-based `$ref` (e.g. `./ex.json#/$defs/Pet`)
4297
+ * to a resource that identifies itself differently (`$id: https://example.com/pets`)
4298
+ * — the `$ref` is rebased onto the resource URI, keeping its `$anchor` or JSON
4299
+ * Pointer fragment. Once embedded, the resource is reachable only by its `$id`,
4300
+ * so an unchanged `$ref` would dangle. When they already agree, `undefined` is
4301
+ * returned and the `$ref` is to be left as written.
4302
+ *
4303
+ * This knowingly departs from the letter of JSON Schema 2020-12 §9.3.1
4304
+ * ("references ... MUST NOT be changed"), which presumes `$ref`s are written
4305
+ * against `$id`s. The target schema — and thus evaluation output — is unchanged;
4306
+ * only the alias the loader knew the resource by is normalized to its canonical URI.
4307
+ *
4308
+ * @public
4309
+ */
4310
+ const rebaseSchema$ref = ($refURI, resourceURI) => {
4311
+ if (_util_url_ts__WEBPACK_IMPORTED_MODULE_0__.stripHash($refURI) === resourceURI) {
4312
+ return undefined;
4313
+ }
4314
+ const fragment = _util_url_ts__WEBPACK_IMPORTED_MODULE_0__.getHash($refURI);
4315
+ return fragment === '#' ? resourceURI : `${resourceURI}${fragment}`;
4316
+ };
4317
+
4318
+ /**
4319
+ * Computes the `$ref` value addressing an embedded JSON Schema resource from a
4320
+ * Schema Object whose base URI changes when it is relocated into the entry
4321
+ * document — one carried inside a hoisted Response, Parameter, Path Item, etc.
4322
+ * `$refURI` and `resourceURI` are as in `rebaseSchema$ref`; `baseURI` is the
4323
+ * base the `$ref` resolves against after relocation.
4324
+ *
4325
+ * A resource that identifies itself (`isResourceIdentified`, i.e. it declares a
4326
+ * `$id`) is addressed by that `$id`, exactly as `rebaseSchema$ref` does. A
4327
+ * resource identified only by its retrieval URI is addressed by a URI reference
4328
+ * relative to `baseURI`: it then resolves to the `$id` assigned from that
4329
+ * retrieval URI wherever the bundle is placed, and no absolute retrieval
4330
+ * location leaks into the `$ref`. The `$anchor` or JSON Pointer fragment is
4331
+ * kept in both cases.
4332
+ *
4333
+ * @public
4334
+ */
4335
+ const relocateSchema$ref = ($refURI, resourceURI, baseURI, isResourceIdentified) => {
4336
+ const target = isResourceIdentified ? resourceURI : _util_url_ts__WEBPACK_IMPORTED_MODULE_0__.relative(baseURI, resourceURI);
4337
+ const fragment = _util_url_ts__WEBPACK_IMPORTED_MODULE_0__.getHash($refURI);
4338
+ return fragment === '#' ? target : `${target}${fragment}`;
4339
+ };
4052
4340
  /* harmony export */ __webpack_require__.d(__webpack_exports__, [
4341
+ /* harmony export */ "rebaseSchema$ref", 0, /* binding */ rebaseSchema$ref,
4342
+ /* harmony export */ "relocateSchema$ref", 0, /* binding */ relocateSchema$ref,
4053
4343
  /* harmony export */ "sanitizeComponentName", 0, /* binding */ sanitizeComponentName,
4054
4344
  /* harmony export */ "toPascalCase", 0, /* binding */ toPascalCase,
4055
4345
  /* harmony export */ "uniqueName", 0, /* binding */ uniqueName
@@ -4670,7 +4960,9 @@ __webpack_require__.r(__webpack_exports__);
4670
4960
  /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(98979);
4671
4961
  /* harmony import */ var _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(24131);
4672
4962
  /* harmony import */ var _visitor_ts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(31843);
4673
- /* harmony import */ var _source_descriptions_ts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(12586);
4963
+ /* harmony import */ var _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(60888);
4964
+ /* harmony import */ var _source_descriptions_ts__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(12586);
4965
+
4674
4966
 
4675
4967
 
4676
4968
 
@@ -4734,7 +5026,8 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORT
4734
5026
  const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
4735
5027
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_9__["default"]({
4736
5028
  reference,
4737
- options
5029
+ options,
5030
+ ancestorSchema$ids: (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_11__.detachedRootSchema$ids)(refSet.rootRef.value.result)
4738
5031
  });
4739
5032
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
4740
5033
  mutable: true,
@@ -4753,7 +5046,7 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORT
4753
5046
  // drop any existing parse-phase source description results before pushing
4754
5047
  const cleaned = parseResult.reject(item => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isParseResultElement)(item) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.includesClasses)(item, ['source-description']));
4755
5048
  parseResult.content = cleaned.content;
4756
- const sourceDescriptions = await (0,_source_descriptions_ts__WEBPACK_IMPORTED_MODULE_11__.dereferenceSourceDescriptions)(parseResult, reference.uri, options, this.name);
5049
+ const sourceDescriptions = await (0,_source_descriptions_ts__WEBPACK_IMPORTED_MODULE_12__.dereferenceSourceDescriptions)(parseResult, reference.uri, options, this.name);
4757
5050
  parseResult.push(...sourceDescriptions);
4758
5051
  }
4759
5052
 
@@ -5062,7 +5355,8 @@ async function dereferenceSourceDescriptions(parseResult, parseResultRetrievalUR
5062
5355
  __webpack_require__.r(__webpack_exports__);
5063
5356
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5064
5357
  /* harmony export */ resolveSchema$idField: () => (/* reexport safe */ _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_9__.resolveSchema$idField),
5065
- /* harmony export */ resolveSchema$refField: () => (/* reexport safe */ _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_9__.resolveSchema$refField)
5358
+ /* harmony export */ resolveSchema$refField: () => (/* reexport safe */ _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_9__.resolveSchema$refField),
5359
+ /* harmony export */ resolveSchemaBaseURI: () => (/* reexport safe */ _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_9__.resolveSchemaBaseURI)
5066
5360
  /* harmony export */ });
5067
5361
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25162);
5068
5362
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(84660);
@@ -5203,31 +5497,34 @@ __webpack_require__.r(__webpack_exports__);
5203
5497
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(87009);
5204
5498
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6352);
5205
5499
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25162);
5206
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12111);
5207
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(78894);
5208
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(44673);
5209
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(16280);
5210
- /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(44641);
5211
- /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(80796);
5212
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(12020);
5213
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(61198);
5214
- /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(7557);
5215
- /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(96681);
5216
- /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(28839);
5217
- /* harmony import */ var _swaggerexpert_arazzo_runtime_expression__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(26847);
5218
- /* harmony import */ var _selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(32054);
5219
- /* harmony import */ var _selectors_uri_ts__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(56481);
5220
- /* harmony import */ var _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(60888);
5221
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(91005);
5222
- /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(8853);
5223
- /* harmony import */ var _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(37757);
5224
- /* harmony import */ var _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(51325);
5225
- /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(30658);
5226
- /* harmony import */ var _parse_index_ts__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(35014);
5227
- /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(98979);
5228
- /* harmony import */ var _File_ts__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(10682);
5229
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(53429);
5230
- /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(44477);
5500
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(96911);
5501
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12111);
5502
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(78894);
5503
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(44673);
5504
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(16280);
5505
+ /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(44641);
5506
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(80796);
5507
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(12020);
5508
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(61198);
5509
+ /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(7557);
5510
+ /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(96681);
5511
+ /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(28839);
5512
+ /* harmony import */ var _swaggerexpert_arazzo_runtime_expression__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(26847);
5513
+ /* harmony import */ var _selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(32054);
5514
+ /* harmony import */ var _selectors_uri_ts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(56481);
5515
+ /* harmony import */ var _openapi_3_1_selectors_json_pointer_ts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(37517);
5516
+ /* harmony import */ var _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(60888);
5517
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(91005);
5518
+ /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(8853);
5519
+ /* harmony import */ var _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(37757);
5520
+ /* harmony import */ var _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(51325);
5521
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(30658);
5522
+ /* harmony import */ var _parse_index_ts__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(35014);
5523
+ /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(98979);
5524
+ /* harmony import */ var _File_ts__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(10682);
5525
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(53429);
5526
+ /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(44477);
5527
+
5231
5528
 
5232
5529
 
5233
5530
 
@@ -5268,8 +5565,23 @@ class Arazzo1DereferenceVisitor {
5268
5565
  */
5269
5566
  baseURI;
5270
5567
  options;
5568
+
5569
+ /**
5570
+ * Index of `$id`-bearing schemas per document, shared across nested visitors
5571
+ * of a single dereference run so it never outlives mutations of the documents.
5572
+ */
5573
+ schema$idIndex;
5271
5574
  visited;
5272
5575
 
5576
+ /**
5577
+ * `$id`s of the JSON Schema elements enclosing the traversal root within its
5578
+ * document (outermost first). Empty when the root is the document itself; a
5579
+ * nested visitor traversing a fragment is seeded with the `$id`s of the
5580
+ * schemas the fragment sits under, so the `$ref`s and `$id`s within resolve
5581
+ * against the same base as they would from the document root.
5582
+ */
5583
+ ancestorSchema$ids;
5584
+
5273
5585
  /**
5274
5586
  * Tracks element ancestors across dive-deep traversal boundaries.
5275
5587
  * Used for cycle detection: if a referenced element is found in
@@ -5280,29 +5592,33 @@ class Arazzo1DereferenceVisitor {
5280
5592
  reference,
5281
5593
  options,
5282
5594
  indirections = [],
5283
- ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(),
5284
- visited = new WeakSet()
5595
+ schema$idIndex = new WeakMap(),
5596
+ ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(),
5597
+ visited = new WeakSet(),
5598
+ ancestorSchema$ids = []
5285
5599
  }) {
5286
5600
  this.indirections = indirections;
5287
5601
  this.reference = reference;
5288
- this.baseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.resolveArazzo$selfField)(reference.uri, reference.value?.result);
5602
+ this.baseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.resolveArazzo$selfField)(reference.uri, reference.value?.result);
5289
5603
  this.options = options;
5290
- this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(...ancestors);
5604
+ this.schema$idIndex = schema$idIndex;
5605
+ this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...ancestors);
5291
5606
  this.visited = visited;
5607
+ this.ancestorSchema$ids = ancestorSchema$ids;
5292
5608
  }
5293
5609
  toAncestorLineage(path) {
5294
5610
  const ancestorNodes = path.getAncestorNodes();
5295
5611
  const directAncestors = new Set(ancestorNodes.filter(_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isElement));
5296
- const ancestorsLineage = new _util_ts__WEBPACK_IMPORTED_MODULE_26__.AncestorLineage(...this.ancestors, directAncestors);
5612
+ const ancestorsLineage = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...this.ancestors, directAncestors);
5297
5613
  return [ancestorsLineage, directAncestors];
5298
5614
  }
5299
5615
  toBaseURI(uri) {
5300
- return _util_url_ts__WEBPACK_IMPORTED_MODULE_22__.resolve(this.baseURI, _util_url_ts__WEBPACK_IMPORTED_MODULE_22__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_22__.stripHash(uri)));
5616
+ return _util_url_ts__WEBPACK_IMPORTED_MODULE_24__.resolve(this.baseURI, _util_url_ts__WEBPACK_IMPORTED_MODULE_24__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_24__.stripHash(uri)));
5301
5617
  }
5302
5618
  async toReference(uri) {
5303
5619
  // detect maximum depth of resolution
5304
5620
  if (this.reference.depth >= this.options.resolve.maxDepth) {
5305
- throw new _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_21__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
5621
+ throw new _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_23__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
5306
5622
  maxDepth: this.options.resolve.maxDepth,
5307
5623
  uri: this.reference.uri
5308
5624
  });
@@ -5318,11 +5634,11 @@ class Arazzo1DereferenceVisitor {
5318
5634
  }
5319
5635
 
5320
5636
  // identity-based referencing: URI matches `$self` of an already processed Arazzo document
5321
- const referenceBy$self = refSet.find((0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.identifiedBy$self)(baseURI));
5637
+ const referenceBy$self = refSet.find((0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.identifiedBy$self)(baseURI));
5322
5638
  if (referenceBy$self !== undefined) {
5323
5639
  return referenceBy$self;
5324
5640
  }
5325
- const parseResult = await (0,_parse_index_ts__WEBPACK_IMPORTED_MODULE_23__["default"])(_util_url_ts__WEBPACK_IMPORTED_MODULE_22__.unsanitize(baseURI), {
5641
+ const parseResult = await (0,_parse_index_ts__WEBPACK_IMPORTED_MODULE_25__["default"])(_util_url_ts__WEBPACK_IMPORTED_MODULE_24__.unsanitize(baseURI), {
5326
5642
  ...this.options,
5327
5643
  parse: {
5328
5644
  ...this.options.parse,
@@ -5345,15 +5661,15 @@ class Arazzo1DereferenceVisitor {
5345
5661
  // context always sees raw, unresolved elements and processes them with its own
5346
5662
  // ancestors/indirections. The trade-off is that elements referenced by multiple
5347
5663
  // documents would be resolved once per context instead of being reused.
5348
- const mutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_24__["default"]({
5664
+ const mutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_26__["default"]({
5349
5665
  uri: baseURI,
5350
- value: this.options.dereference.immutable ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(parseResult) : parseResult,
5666
+ value: this.options.dereference.immutable ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(parseResult) : parseResult,
5351
5667
  depth: this.reference.depth + 1
5352
5668
  });
5353
5669
  refSet.add(mutableReference);
5354
5670
  if (this.options.dereference.immutable) {
5355
5671
  // register new immutable reference with a refSet
5356
- const immutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_24__["default"]({
5672
+ const immutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_26__["default"]({
5357
5673
  uri: `immutable://${baseURI}`,
5358
5674
  value: parseResult,
5359
5675
  depth: this.reference.depth + 1
@@ -5377,10 +5693,10 @@ class Arazzo1DereferenceVisitor {
5377
5693
  const {
5378
5694
  continueOnError
5379
5695
  } = this.options.dereference;
5380
- const isEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_22__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
5696
+ const isEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_24__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
5381
5697
  const uri = this.reference.uri;
5382
5698
  const type = referencingElement.element;
5383
- const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement);
5699
+ const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement);
5384
5700
 
5385
5701
  // find element location by identity in the document tree.
5386
5702
  // guarded: this.reference.value may not be a ParseResultElement or may lack a result.
@@ -5389,7 +5705,7 @@ class Arazzo1DereferenceVisitor {
5389
5705
  let location;
5390
5706
  const root = this.reference.value.result;
5391
5707
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isElement)(root)) {
5392
- (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverse)(root, {
5708
+ (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__.traverse)(root, {
5393
5709
  enter(p) {
5394
5710
  if (p.node === referencingElement) {
5395
5711
  location = p.formatPath();
@@ -5410,10 +5726,10 @@ class Arazzo1DereferenceVisitor {
5410
5726
 
5411
5727
  // enrich existing error from nested visitor or create new one
5412
5728
  let unresolvedError;
5413
- if (error instanceof _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_19__["default"]) {
5729
+ if (error instanceof _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_21__["default"]) {
5414
5730
  // prefix relative locations for entries belonging to the referenced document
5415
5731
  const refBaseURI = this.toBaseURI(refFieldValue);
5416
- const fragment = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.URIFragmentIdentifier.fromURIReference(refFieldValue);
5732
+ const fragment = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.URIFragmentIdentifier.fromURIReference(refFieldValue);
5417
5733
  if (fragment) {
5418
5734
  if (refBaseURI === error.uri && error.location) {
5419
5735
  error.location = fragment + error.location;
@@ -5426,7 +5742,7 @@ class Arazzo1DereferenceVisitor {
5426
5742
  error.trace = [hop, ...error.trace];
5427
5743
  unresolvedError = error;
5428
5744
  } else {
5429
- unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_19__["default"](message, {
5745
+ unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_21__["default"](message, {
5430
5746
  cause: error,
5431
5747
  type,
5432
5748
  uri,
@@ -5454,33 +5770,33 @@ class Arazzo1DereferenceVisitor {
5454
5770
  path.skip();
5455
5771
  return;
5456
5772
  }
5457
- const runtimeExpression = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.reference);
5773
+ const runtimeExpression = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.reference);
5458
5774
 
5459
5775
  // parse the runtime expression
5460
5776
  const {
5461
5777
  result,
5462
5778
  tree
5463
- } = (0,_swaggerexpert_arazzo_runtime_expression__WEBPACK_IMPORTED_MODULE_14__.parse)(runtimeExpression);
5779
+ } = (0,_swaggerexpert_arazzo_runtime_expression__WEBPACK_IMPORTED_MODULE_15__.parse)(runtimeExpression);
5464
5780
  if (!result.success) {
5465
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_7__["default"](`Invalid Reusable Object reference format: "${runtimeExpression}"`, {
5781
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Invalid Reusable Object reference format: "${runtimeExpression}"`, {
5466
5782
  runtimeExpression
5467
5783
  });
5468
5784
  }
5469
5785
 
5470
5786
  // ReusableElement can only reference components
5471
5787
  if (tree.type !== 'ComponentsExpression') {
5472
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_7__["default"](`Reusable Object reference "${runtimeExpression}" must be a components expression`, {
5788
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Reusable Object reference "${runtimeExpression}" must be a components expression`, {
5473
5789
  runtimeExpression
5474
5790
  });
5475
5791
  }
5476
5792
 
5477
5793
  // evaluate runtime expression as JSON Pointer to get the referenced element
5478
- const jsonPointer = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.compile)(['components', tree.componentType, tree.componentName]);
5794
+ const jsonPointer = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.compile)(['components', tree.componentType, tree.componentName]);
5479
5795
  let referencedElement;
5480
5796
  try {
5481
- referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__.evaluate)(this.reference.value.result, jsonPointer);
5797
+ referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.evaluate)(this.reference.value.result, jsonPointer);
5482
5798
  } catch {
5483
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_7__["default"](`Reusable Object reference "${runtimeExpression}" cannot be resolved`, {
5799
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Reusable Object reference "${runtimeExpression}" cannot be resolved`, {
5484
5800
  runtimeExpression
5485
5801
  });
5486
5802
  }
@@ -5488,18 +5804,18 @@ class Arazzo1DereferenceVisitor {
5488
5804
  /**
5489
5805
  * Create a shallow clone of the referenced element to avoid modifying the original.
5490
5806
  */
5491
- const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneShallow)(referencedElement);
5807
+ const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(referencedElement);
5492
5808
  // annotate with info about original referencing element
5493
5809
  mergedElement.meta.set('ref-fields', {
5494
5810
  reference: runtimeExpression,
5495
- value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.value)
5811
+ value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.value)
5496
5812
  });
5497
5813
  // annotate with info about origin
5498
5814
  mergedElement.meta.set('ref-origin', this.reference.uri);
5499
5815
  mergedElement.meta.set('ref-type', referencingElement.element);
5500
5816
 
5501
5817
  // override value field if present for Parameter Objects
5502
- if ((0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_13__.isParameterElement)(mergedElement) && referencingElement.hasKey('value')) {
5818
+ if ((0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_14__.isParameterElement)(mergedElement) && referencingElement.hasKey('value')) {
5503
5819
  mergedElement.remove('value');
5504
5820
  mergedElement.set('value', referencingElement.get('value'));
5505
5821
  }
@@ -5526,13 +5842,17 @@ class Arazzo1DereferenceVisitor {
5526
5842
  const indirectionsSize = this.indirections.length;
5527
5843
  try {
5528
5844
  // compute baseURI using rules around $self, $id and $ref keywords
5529
- let reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_22__.unsanitize(this.reference.uri));
5845
+ let reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_24__.unsanitize(this.reference.uri));
5530
5846
  let {
5531
5847
  uri: retrievalURI
5532
5848
  } = reference;
5533
- const $refBaseURI = (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_17__.resolveSchema$refField)(this.baseURI, referencingElement);
5534
- const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_22__.stripHash($refBaseURI);
5535
- const file = new _File_ts__WEBPACK_IMPORTED_MODULE_25__["default"]({
5849
+ // base URI in effect at the traversal root: the document base refined by
5850
+ // the $ids of the schemas enclosing the root when the root is a fragment
5851
+ const rootBaseURI = (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__.resolveSchema$ids)(this.baseURI, this.ancestorSchema$ids);
5852
+ const schemaBaseURI = (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__.resolveSchemaBaseURI)(rootBaseURI, path);
5853
+ const $refBaseURI = (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__.resolveSchema$refField)(schemaBaseURI, referencingElement);
5854
+ const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_24__.stripHash($refBaseURI);
5855
+ const file = new _File_ts__WEBPACK_IMPORTED_MODULE_27__["default"]({
5536
5856
  uri: $refBaseURIStrippedHash
5537
5857
  });
5538
5858
  const isUnknownURI = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(r => r.canRead(file), this.options.resolve.resolvers);
@@ -5542,14 +5862,33 @@ class Arazzo1DereferenceVisitor {
5542
5862
 
5543
5863
  // determining reference, proper evaluation and selection mechanism
5544
5864
  let referencedElement;
5865
+ // $ids of the schemas enclosing the referenced element within its document
5866
+ let ancestorSchema$ids;
5545
5867
  try {
5546
5868
  if (isUnknownURI || isURL) {
5547
5869
  // we're dealing with canonical URI or URL with possible fragment
5548
5870
  retrievalURI = this.toBaseURI($refBaseURI);
5549
5871
  const selector = $refBaseURI;
5550
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(reference.value.result);
5551
- referencedElement = (0,_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_16__.evaluate)(selector, referenceAsSchema);
5552
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(referencedElement);
5872
+ const documentElement = reference.value.result;
5873
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(documentElement);
5874
+ // a document that is itself a fragment detached from its source carries
5875
+ // the $ids enclosing it only as `ancestorSchema$ids`: its $ids are then
5876
+ // indexed against the base that chain leaves in effect, and the chain
5877
+ // prefixes the one of the located schema. A nested visitor rooted at a
5878
+ // fragment of a whole document indexes that document against its own base.
5879
+ const rootNode = path.getAncestorNodes().at(-1) ?? path.node;
5880
+ const isDocumentRoot = ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isParseResultElement)(rootNode) ? rootNode.result : rootNode) === documentElement;
5881
+ ({
5882
+ element: referencedElement,
5883
+ ancestorSchema$ids
5884
+ } = (0,_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_17__.locate)(selector, referenceAsSchema, {
5885
+ baseURI: isDocumentRoot ? rootBaseURI : this.baseURI,
5886
+ index: this.schema$idIndex
5887
+ }));
5888
+ if (isDocumentRoot) {
5889
+ ancestorSchema$ids = [...this.ancestorSchema$ids, ...ancestorSchema$ids];
5890
+ }
5891
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(referencedElement);
5553
5892
 
5554
5893
  // ignore resolving internal Schema Objects
5555
5894
  if (!this.options.resolve.internal && isInternalReference) {
@@ -5577,19 +5916,22 @@ class Arazzo1DereferenceVisitor {
5577
5916
  // skip traversing this schema element but traverse all its child elements
5578
5917
  return;
5579
5918
  }
5580
- reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_22__.unsanitize($refBaseURI));
5581
- const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.URIFragmentIdentifier.fromURIReference($refBaseURI);
5582
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(reference.value.result);
5583
- referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__.evaluate)(referenceAsSchema, selector);
5584
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(referencedElement);
5919
+ reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_24__.unsanitize($refBaseURI));
5920
+ const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.URIFragmentIdentifier.fromURIReference($refBaseURI);
5921
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(reference.value.result);
5922
+ ({
5923
+ element: referencedElement,
5924
+ ancestorSchema$ids
5925
+ } = (0,_openapi_3_1_selectors_json_pointer_ts__WEBPACK_IMPORTED_MODULE_18__.locate)(referenceAsSchema, selector));
5926
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(referencedElement);
5585
5927
  }
5586
5928
  } catch (error) {
5587
5929
  /**
5588
5930
  * JSONSchemaElement($id=URL) was not found, so we're going to try to resolve
5589
5931
  * the URL and assume the returned response is a JSON Schema.
5590
5932
  */
5591
- if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_27__["default"]) {
5592
- if ((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_15__.isAnchor)((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_15__.uriToAnchor)($refBaseURI))) {
5933
+ if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_29__["default"]) {
5934
+ if ((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_16__.isAnchor)((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_16__.uriToAnchor)($refBaseURI))) {
5593
5935
  // we're dealing with JSON Schema $anchor here
5594
5936
  isInternalReference = this.baseURI === retrievalURI;
5595
5937
  isExternalReference = !isInternalReference;
@@ -5604,11 +5946,14 @@ class Arazzo1DereferenceVisitor {
5604
5946
  // skip traversing this schema element but traverse all its child elements
5605
5947
  return;
5606
5948
  }
5607
- reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_22__.unsanitize($refBaseURI));
5608
- const selector = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_15__.uriToAnchor)($refBaseURI);
5609
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(reference.value.result);
5610
- referencedElement = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_15__.evaluate)(selector, referenceAsSchema);
5611
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(referencedElement);
5949
+ reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_24__.unsanitize($refBaseURI));
5950
+ const selector = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_16__.uriToAnchor)($refBaseURI);
5951
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(reference.value.result);
5952
+ ({
5953
+ element: referencedElement,
5954
+ ancestorSchema$ids
5955
+ } = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_16__.locate)(selector, referenceAsSchema));
5956
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(referencedElement);
5612
5957
  } else {
5613
5958
  // we're assuming here that we're dealing with JSON Pointer here
5614
5959
  retrievalURI = this.toBaseURI($refBaseURI);
@@ -5625,11 +5970,14 @@ class Arazzo1DereferenceVisitor {
5625
5970
  // skip traversing this schema element but traverse all its child elements
5626
5971
  return;
5627
5972
  }
5628
- reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_22__.unsanitize($refBaseURI));
5629
- const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.URIFragmentIdentifier.fromURIReference($refBaseURI);
5630
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(reference.value.result);
5631
- referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_9__.evaluate)(referenceAsSchema, selector);
5632
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_18__.maybeRefractToJSONSchemaElement)(referencedElement);
5973
+ reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_24__.unsanitize($refBaseURI));
5974
+ const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.URIFragmentIdentifier.fromURIReference($refBaseURI);
5975
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(reference.value.result);
5976
+ ({
5977
+ element: referencedElement,
5978
+ ancestorSchema$ids
5979
+ } = (0,_openapi_3_1_selectors_json_pointer_ts__WEBPACK_IMPORTED_MODULE_18__.locate)(referenceAsSchema, selector));
5980
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.maybeRefractToJSONSchemaElement)(referencedElement);
5633
5981
  }
5634
5982
  } else {
5635
5983
  throw error;
@@ -5639,14 +5987,14 @@ class Arazzo1DereferenceVisitor {
5639
5987
 
5640
5988
  // detect direct or indirect reference
5641
5989
  if (referencingElement === referencedElement) {
5642
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_7__["default"]('Recursive JSON Schema reference detected', {
5643
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
5990
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"]('Recursive JSON Schema reference detected', {
5991
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref)
5644
5992
  });
5645
5993
  }
5646
5994
 
5647
5995
  // detect maximum depth of dereferencing
5648
5996
  if (this.indirections.length > this.options.dereference.maxDepth) {
5649
- throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_20__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
5997
+ throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_22__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
5650
5998
  maxDepth: this.options.dereference.maxDepth,
5651
5999
  uri: this.reference.uri
5652
6000
  });
@@ -5657,14 +6005,14 @@ class Arazzo1DereferenceVisitor {
5657
6005
  if (ancestorsLineage.includes(referencedElement)) {
5658
6006
  reference.refSet.circular = true;
5659
6007
  if (this.options.dereference.circular === 'error') {
5660
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_7__["default"]('Circular reference detected', {
5661
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
6008
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"]('Circular reference detected', {
6009
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref)
5662
6010
  });
5663
6011
  } else if (this.options.dereference.circular === 'replace') {
5664
- const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__["default"]($refBaseURI, {
6012
+ const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"]($refBaseURI, {
5665
6013
  type: referencingElement.element,
5666
6014
  uri: reference.uri,
5667
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
6015
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref)
5668
6016
  });
5669
6017
  const replacer = this.options.dereference.strategyOpts['arazzo-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
5670
6018
  const replacement = replacer(refElement);
@@ -5683,9 +6031,13 @@ class Arazzo1DereferenceVisitor {
5683
6031
  * 3. Fragment is a JSON Schema with $ref field. We need to follow it to get the eventual value
5684
6032
  * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
5685
6033
  */
5686
- const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_22__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
6034
+ const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_24__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
5687
6035
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
5688
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_11__.isJSONSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
6036
+ // content transplanted into the referencing site is traversed under that
6037
+ // site's $id chain; a fragment enclosed by a different chain has its own
6038
+ // $refs resolved in place first, by a nested visitor seeded with that chain
6039
+ const hasDifferentEnclosingBase = (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__.resolveSchema$ids)((0,_util_ts__WEBPACK_IMPORTED_MODULE_20__.resolveArazzo$selfField)(reference.uri, reference.value.result), ancestorSchema$ids) !== (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__.resolveSchema$ids)(rootBaseURI, (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_19__.schema$idsOf)(path.getAncestorNodes().reverse()));
6040
+ if ((isExternalReference || isNonEntryDocument || hasDifferentEnclosingBase || (0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_12__.isJSONSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
5689
6041
  if (shouldDetectCircular) {
5690
6042
  this.visited.add(referencedElement);
5691
6043
  }
@@ -5696,10 +6048,12 @@ class Arazzo1DereferenceVisitor {
5696
6048
  reference,
5697
6049
  indirections: [...this.indirections],
5698
6050
  options: this.options,
6051
+ schema$idIndex: this.schema$idIndex,
5699
6052
  visited: this.visited,
5700
- ancestors: ancestorsLineage
6053
+ ancestors: ancestorsLineage,
6054
+ ancestorSchema$ids
5701
6055
  });
5702
- referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.traverseAsync)(referencedElement, visitor, {
6056
+ referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__.traverseAsync)(referencedElement, visitor, {
5703
6057
  mutable: true,
5704
6058
  skipVisited: 'skip'
5705
6059
  });
@@ -5709,11 +6063,11 @@ class Arazzo1DereferenceVisitor {
5709
6063
  }
5710
6064
 
5711
6065
  // Boolean JSON Schemas
5712
- if ((0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_12__.isBooleanJSONSchemaElement)(referencedElement)) {
5713
- const booleanJsonSchemaElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(referencedElement);
6066
+ if ((0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_13__.isBooleanJSONSchemaElement)(referencedElement)) {
6067
+ const booleanJsonSchemaElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(referencedElement);
5714
6068
  // annotate referenced element with info about original referencing element
5715
6069
  booleanJsonSchemaElement.meta.set('ref-fields', {
5716
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
6070
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref)
5717
6071
  });
5718
6072
  // annotate referenced element with info about origin
5719
6073
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
@@ -5726,17 +6080,17 @@ class Arazzo1DereferenceVisitor {
5726
6080
  /**
5727
6081
  * Creating a new version of JSON Schema by merging fields from referenced Schema with referencing one.
5728
6082
  */
5729
- if ((0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_11__.isJSONSchemaElement)(referencedElement)) {
5730
- const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneShallow)(referencedElement);
6083
+ if ((0,_speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_12__.isJSONSchemaElement)(referencedElement)) {
6084
+ const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(referencedElement);
5731
6085
  // existing keywords from referencing schema overrides ones from referenced schema
5732
6086
  referencingElement.forEach((value, keyElement, item) => {
5733
- mergedElement.remove((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(keyElement));
6087
+ mergedElement.remove((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(keyElement));
5734
6088
  mergedElement.content.push(item);
5735
6089
  });
5736
6090
  mergedElement.remove('$ref');
5737
6091
  // annotate referenced element with info about original referencing element
5738
6092
  mergedElement.meta.set('ref-fields', {
5739
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref)
6093
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref)
5740
6094
  });
5741
6095
  // annotate fragment with info about origin
5742
6096
  mergedElement.meta.set('ref-origin', reference.uri);
@@ -5748,7 +6102,7 @@ class Arazzo1DereferenceVisitor {
5748
6102
  */
5749
6103
  path.replaceWith(referencedElement);
5750
6104
  } catch (error) {
5751
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement.$ref);
6105
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref);
5752
6106
  this.handleError(`Error while dereferencing Schema Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
5753
6107
  } finally {
5754
6108
  if (this.indirections.length > indirectionsSize) this.indirections.pop();
@@ -8030,6 +8384,8 @@ __webpack_require__.r(__webpack_exports__);
8030
8384
  /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(98979);
8031
8385
  /* harmony import */ var _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(24131);
8032
8386
  /* harmony import */ var _visitor_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(4224);
8387
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(60888);
8388
+
8033
8389
 
8034
8390
 
8035
8391
 
@@ -8093,7 +8449,8 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMP
8093
8449
  const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
8094
8450
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_8__["default"]({
8095
8451
  reference: reference,
8096
- options
8452
+ options,
8453
+ ancestorSchema$ids: (0,_util_ts__WEBPACK_IMPORTED_MODULE_10__.detachedRootSchema$ids)(refSet.rootRef.value.result)
8097
8454
  });
8098
8455
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverseAsync)(refSet.rootRef.value, visitor, {
8099
8456
  mutable: true,
@@ -8139,9 +8496,9 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMP
8139
8496
  "use strict";
8140
8497
  __webpack_require__.r(__webpack_exports__);
8141
8498
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8142
- /* harmony export */ EvaluationJsonSchema$anchorError: () => (/* reexport safe */ _errors_EvaluationJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_6__["default"]),
8143
- /* harmony export */ InvalidJsonSchema$anchorError: () => (/* reexport safe */ _errors_InvalidJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_7__["default"]),
8144
- /* harmony export */ JsonSchema$anchorError: () => (/* reexport safe */ _errors_JsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_8__["default"])
8499
+ /* harmony export */ EvaluationJsonSchema$anchorError: () => (/* reexport safe */ _errors_EvaluationJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_7__["default"]),
8500
+ /* harmony export */ InvalidJsonSchema$anchorError: () => (/* reexport safe */ _errors_InvalidJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_8__["default"]),
8501
+ /* harmony export */ JsonSchema$anchorError: () => (/* reexport safe */ _errors_JsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_9__["default"])
8145
8502
  /* harmony export */ });
8146
8503
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33031);
8147
8504
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64988);
@@ -8149,9 +8506,11 @@ __webpack_require__.r(__webpack_exports__);
8149
8506
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(80796);
8150
8507
  /* harmony import */ var _speclynx_apidom_ns_json_schema_2020_12__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7557);
8151
8508
  /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(30658);
8152
- /* harmony import */ var _errors_EvaluationJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(21376);
8153
- /* harmony import */ var _errors_InvalidJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(56335);
8154
- /* harmony import */ var _errors_JsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(75578);
8509
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(60888);
8510
+ /* harmony import */ var _errors_EvaluationJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(21376);
8511
+ /* harmony import */ var _errors_InvalidJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(56335);
8512
+ /* harmony import */ var _errors_JsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(75578);
8513
+
8155
8514
 
8156
8515
 
8157
8516
 
@@ -8186,35 +8545,83 @@ const uriToAnchor = uri => {
8186
8545
  */
8187
8546
  const parse = anchor => {
8188
8547
  if (!isAnchor(anchor)) {
8189
- throw new _errors_InvalidJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_7__["default"](anchor);
8548
+ throw new _errors_InvalidJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_8__["default"](anchor);
8190
8549
  }
8191
8550
  return anchor;
8192
8551
  };
8193
8552
 
8194
8553
  /**
8195
- * Evaluates JSON Schema $anchor against ApiDOM fragment.
8554
+ * Locates the schema identified by JSON Schema $anchor within ApiDOM fragment,
8555
+ * along with the `$id`s of the schemas enclosing it, the search root included.
8196
8556
  * @public
8197
8557
  */
8198
- const evaluate = (anchor, element) => {
8558
+ const locate = (anchor, element) => {
8199
8559
  const token = parse(anchor);
8200
8560
  const resultPath = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.find)(element,
8201
8561
  // @ts-ignore
8202
8562
  path => (0,_speclynx_apidom_ns_json_schema_2020_12__WEBPACK_IMPORTED_MODULE_4__.isJSONSchemaElement)(path.node) && (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_2__["default"])(path.node.$anchor) === token);
8203
8563
  if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_0__["default"])(resultPath)) {
8204
- throw new _errors_EvaluationJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_6__["default"](`Evaluation failed on token: "${token}"`);
8564
+ throw new _errors_EvaluationJsonSchema$anchorError_ts__WEBPACK_IMPORTED_MODULE_7__["default"](`Evaluation failed on token: "${token}"`);
8205
8565
  }
8206
- return resultPath.node;
8566
+ return {
8567
+ element: resultPath.node,
8568
+ ancestorSchema$ids: (0,_util_ts__WEBPACK_IMPORTED_MODULE_6__.schema$idsOf)(resultPath.getAncestorNodes().reverse())
8569
+ };
8207
8570
  };
8208
8571
 
8572
+ /**
8573
+ * Evaluates JSON Schema $anchor against ApiDOM fragment.
8574
+ * @public
8575
+ */
8576
+ const evaluate = (anchor, element) => locate(anchor, element).element;
8577
+
8209
8578
 
8210
8579
  /* harmony export */ __webpack_require__.d(__webpack_exports__, [
8211
8580
  /* harmony export */ "evaluate", 0, /* binding */ evaluate,
8212
8581
  /* harmony export */ "isAnchor", 0, /* binding */ isAnchor,
8582
+ /* harmony export */ "locate", 0, /* binding */ locate,
8213
8583
  /* harmony export */ "parse", 0, /* binding */ parse,
8214
8584
  /* harmony export */ "uriToAnchor", 0, /* binding */ uriToAnchor
8215
8585
  /* harmony export */ ]);
8216
8586
 
8217
8587
 
8588
+ /***/ },
8589
+
8590
+ /***/ 37517
8591
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
8592
+
8593
+ "use strict";
8594
+ __webpack_require__.r(__webpack_exports__);
8595
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12020);
8596
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(60888);
8597
+
8598
+
8599
+
8600
+ /**
8601
+ * Locates the element addressed by JSON Pointer within ApiDOM fragment, along
8602
+ * with the `$id`s of the schemas enclosing it: the elements the pointer walks
8603
+ * through on its way to the target, the search root included.
8604
+ */
8605
+ const locate = (element, jsonPointer) => {
8606
+ const trace = {
8607
+ steps: []
8608
+ };
8609
+ const result = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_0__.evaluate)(element, jsonPointer, {
8610
+ trace
8611
+ });
8612
+
8613
+ // each step's input is the node the token was applied to, so the inputs are
8614
+ // exactly the walked nodes minus the target
8615
+ return {
8616
+ element: result,
8617
+ ancestorSchema$ids: (0,_util_ts__WEBPACK_IMPORTED_MODULE_1__.schema$idsOf)(trace.steps.map(step => step.input))
8618
+ };
8619
+ };
8620
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, [
8621
+ /* harmony export */ "locate", 0, /* binding */ locate
8622
+ /* harmony export */ ]);
8623
+
8624
+
8218
8625
  /***/ },
8219
8626
 
8220
8627
  /***/ 56481
@@ -8223,19 +8630,18 @@ const evaluate = (anchor, element) => {
8223
8630
  "use strict";
8224
8631
  __webpack_require__.r(__webpack_exports__);
8225
8632
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8226
- /* harmony export */ EvaluationJsonSchemaUriError: () => (/* reexport safe */ _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_6__["default"]),
8227
- /* harmony export */ JsonSchemaUriError: () => (/* reexport safe */ _errors_JsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_9__["default"])
8633
+ /* harmony export */ EvaluationJsonSchemaUriError: () => (/* reexport safe */ _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_4__["default"]),
8634
+ /* harmony export */ JsonSchemaUriError: () => (/* reexport safe */ _errors_JsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_8__["default"])
8228
8635
  /* harmony export */ });
8229
8636
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33031);
8230
8637
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
8231
- /* harmony import */ var _speclynx_apidom_ns_json_schema_2020_12__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7557);
8232
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12020);
8233
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(61198);
8234
- /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(30658);
8235
- /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(44477);
8236
- /* harmony import */ var _$anchor_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(32054);
8237
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(60888);
8238
- /* harmony import */ var _errors_JsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(51651);
8638
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(61198);
8639
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(30658);
8640
+ /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(44477);
8641
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(60888);
8642
+ /* harmony import */ var _$anchor_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(32054);
8643
+ /* harmony import */ var _json_pointer_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(37517);
8644
+ /* harmony import */ var _errors_JsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(51651);
8239
8645
 
8240
8646
 
8241
8647
 
@@ -8246,41 +8652,68 @@ __webpack_require__.r(__webpack_exports__);
8246
8652
 
8247
8653
 
8248
8654
  /**
8249
- * Evaluates JSON Schema $ref containing unknown URI against ApiDOM fragment.
8655
+ * Index of `$id`-bearing schemas per indexed element (a document root, or the
8656
+ * fragment a visitor traverses). Each entry pairs a schema with the `$id`s of its
8657
+ * enclosing schema resources (outermost first, including its own). The index is
8658
+ * populated once per element and never refreshed, so callers scope it
8659
+ * to a single dereference/bundle run instead of sharing it globally. Within a run the
8660
+ * `$id` graph of an indexed document is stable: the bundle strategies mutate deep
8661
+ * clones and place components only after the entry traversal ends, and the
8662
+ * dereference strategies only replace `$ref`-bearing schemas.
8250
8663
  * @public
8251
8664
  */
8252
- const evaluate = (uri, element) => {
8253
- const {
8254
- cache
8255
- } = evaluate;
8256
- const uriStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_5__.stripHash(uri);
8257
- const isJSONSchemaElementWith$id = path => (0,_speclynx_apidom_ns_json_schema_2020_12__WEBPACK_IMPORTED_MODULE_2__.isJSONSchemaElement)(path.node) && typeof path.node.$id !== 'undefined';
8258
8665
 
8259
- // warm the cache
8260
- if (!cache.has(element)) {
8261
- const schemaObjectPaths = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.filter)(element, isJSONSchemaElementWith$id);
8262
- cache.set(element, schemaObjectPaths.map(path => path.node));
8263
- }
8666
+ /**
8667
+ * @public
8668
+ */
8264
8669
 
8265
- // search for the matching schema
8266
- const result = cache.get(element).find(e => {
8267
- const $idBaseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_8__.resolveSchema$idField)(uriStrippedHash, e);
8268
- return $idBaseURI === uriStrippedHash;
8269
- });
8270
- if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_0__["default"])(result)) {
8271
- throw new _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_6__["default"](`Evaluation failed on URI: "${uri}"`);
8670
+ const indexSchema$ids = element => (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.filter)(element, path => (0,_util_ts__WEBPACK_IMPORTED_MODULE_5__.isJSONSchemaElementWith$id)(path.node)).map(path => ({
8671
+ schema: path.node,
8672
+ $ids: (0,_util_ts__WEBPACK_IMPORTED_MODULE_5__.collectSchema$ids)(path)
8673
+ }));
8674
+
8675
+ /**
8676
+ * Locates the schema addressed by JSON Schema $ref containing unknown URI within
8677
+ * ApiDOM fragment, along with the `$id`s of the schemas enclosing it.
8678
+ * @public
8679
+ */
8680
+ const locate = (uri, element, options = {}) => {
8681
+ const uriStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_3__.stripHash(uri);
8682
+ const {
8683
+ baseURI = uriStrippedHash,
8684
+ index = new WeakMap()
8685
+ } = options;
8686
+ if (!index.has(element)) {
8687
+ index.set(element, indexSchema$ids(element));
8272
8688
  }
8273
- if ((0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_7__.isAnchor)((0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_7__.uriToAnchor)(uri))) {
8274
- // we're dealing with JSON Schema $anchor here
8275
- return (0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_7__.evaluate)((0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_7__.uriToAnchor)(uri), result);
8689
+
8690
+ // search for the schema whose canonical URI matches
8691
+ const entry = index.get(element).find(({
8692
+ $ids
8693
+ }) => (0,_util_ts__WEBPACK_IMPORTED_MODULE_5__.resolveSchema$ids)(baseURI, $ids) === uriStrippedHash);
8694
+ if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_0__["default"])(entry)) {
8695
+ throw new _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_4__["default"](`Evaluation failed on URI: "${uri}"`);
8276
8696
  }
8277
- return (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_3__.evaluate)(result, _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_4__.URIFragmentIdentifier.fromURIReference(uri));
8697
+
8698
+ // the fragment is resolved within the matched schema, whose own $id is the
8699
+ // last of its chain; the fragment walk contributes it again when descending
8700
+ const fragmentLocation = (0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_6__.isAnchor)((0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_6__.uriToAnchor)(uri)) ? (0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_6__.locate)((0,_$anchor_ts__WEBPACK_IMPORTED_MODULE_6__.uriToAnchor)(uri), entry.schema) : (0,_json_pointer_ts__WEBPACK_IMPORTED_MODULE_7__.locate)(entry.schema, _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_2__.URIFragmentIdentifier.fromURIReference(uri));
8701
+ return {
8702
+ element: fragmentLocation.element,
8703
+ ancestorSchema$ids: [...entry.$ids.slice(0, -1), ...fragmentLocation.ancestorSchema$ids]
8704
+ };
8278
8705
  };
8279
- evaluate.cache = new WeakMap();
8706
+
8707
+ /**
8708
+ * Evaluates JSON Schema $ref containing unknown URI against ApiDOM fragment.
8709
+ * @public
8710
+ */
8711
+ const evaluate = (uri, element, options = {}) => locate(uri, element, options).element;
8280
8712
 
8281
8713
 
8282
8714
  /* harmony export */ __webpack_require__.d(__webpack_exports__, [
8283
- /* harmony export */ "evaluate", 0, /* binding */ evaluate
8715
+ /* harmony export */ "evaluate", 0, /* binding */ evaluate,
8716
+ /* harmony export */ "locate", 0, /* binding */ locate
8284
8717
  /* harmony export */ ]);
8285
8718
 
8286
8719
 
@@ -8292,10 +8725,14 @@ evaluate.cache = new WeakMap();
8292
8725
  "use strict";
8293
8726
  __webpack_require__.r(__webpack_exports__);
8294
8727
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(97797);
8295
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25162);
8296
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(44673);
8297
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24329);
8298
- /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(30658);
8728
+ /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85102);
8729
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25162);
8730
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44673);
8731
+ /* harmony import */ var _speclynx_apidom_ns_json_schema_2020_12__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7557);
8732
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(24329);
8733
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(30658);
8734
+
8735
+
8299
8736
 
8300
8737
 
8301
8738
 
@@ -8303,31 +8740,84 @@ __webpack_require__.r(__webpack_exports__);
8303
8740
 
8304
8741
 
8305
8742
  /**
8743
+ * A schema located within a document, together with the `$id`s of the JSON Schema
8744
+ * elements enclosing it (outermost first; the located schema's own `$id` excluded).
8306
8745
  * @public
8307
8746
  */
8308
- const resolveSchema$refField = (retrievalURI, schemaElement) => {
8309
- if (typeof schemaElement.$ref === 'undefined') {
8747
+
8748
+ /**
8749
+ * Whether the element is a JSON Schema element declaring a `$id`.
8750
+ */
8751
+ const isJSONSchemaElementWith$id = element => (0,_speclynx_apidom_ns_json_schema_2020_12__WEBPACK_IMPORTED_MODULE_4__.isJSONSchemaElement)(element) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(element.$id);
8752
+
8753
+ /**
8754
+ * `$id`s declared by the JSON Schema elements among `nodes`, in order.
8755
+ */
8756
+ const schema$idsOf = nodes => nodes.filter(isJSONSchemaElementWith$id).map(node => (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(node.$id));
8757
+
8758
+ /**
8759
+ * `$id`s of the JSON Schema elements on `path` (outermost first, the node itself
8760
+ * included). The `$id`s are read from the elements themselves rather than from
8761
+ * refraction-time metadata, so a `$id` assigned after refraction (e.g. by the
8762
+ * bundler) is honored.
8763
+ */
8764
+ const collectSchema$ids = path => schema$idsOf([...path.getAncestorNodes().reverse(), path.node]);
8765
+
8766
+ /**
8767
+ * `$id`s of the schemas enclosing a traversal root that is a fragment detached
8768
+ * from its document, read from the `ancestorsSchemaIdentifiers` meta the JSON
8769
+ * Schema refractors record. The meta also carries the root's own `$id`, which
8770
+ * the ancestor walk contributes itself, so it is dropped. A detached fragment
8771
+ * has no live ancestors, so the meta is the only carrier of its lexical
8772
+ * context; this is the one reader of it the refractors must keep serving.
8773
+ */
8774
+ const detachedRootSchema$ids = root => {
8775
+ const meta = root?.meta.get('ancestorsSchemaIdentifiers');
8776
+ const $ids = Array.isArray(meta) ? meta.filter(ramda_adjunct__WEBPACK_IMPORTED_MODULE_1__["default"]) : [];
8777
+ const own$id = isJSONSchemaElementWith$id(root) ? (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(root.$id) : undefined;
8778
+ return $ids.length > 0 && $ids.at(-1) === own$id ? $ids.slice(0, -1) : $ids;
8779
+ };
8780
+
8781
+ /**
8782
+ * Resolves a chain of `$id`s (outermost first) against `baseURI`, each `$id`
8783
+ * refining the base the next one resolves against.
8784
+ */
8785
+ const resolveSchema$ids = (baseURI, $ids) => (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((acc, $id) => _util_url_ts__WEBPACK_IMPORTED_MODULE_6__.resolve(acc, _util_url_ts__WEBPACK_IMPORTED_MODULE_6__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_6__.stripHash($id))), baseURI, $ids);
8786
+
8787
+ /**
8788
+ * Resolves the base URI of the schema at `path`: `baseURI` (the base URI in
8789
+ * effect at the traversal root) refined by each `$id` on the schema's ancestor
8790
+ * chain in turn, the schema's own `$id` included.
8791
+ */
8792
+ const resolveSchemaBaseURI = (baseURI, path) => resolveSchema$ids(baseURI, collectSchema$ids(path));
8793
+
8794
+ /**
8795
+ * Resolves the `$ref` of the schema against its base URI (see
8796
+ * `resolveSchemaBaseURI`), or returns `undefined` when the schema has no string `$ref`.
8797
+ *
8798
+ * @public
8799
+ */
8800
+ const resolveSchema$refField = (schemaBaseURI, schemaElement) => {
8801
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(schemaElement.$ref)) {
8310
8802
  return undefined;
8311
8803
  }
8312
- const hash = _util_url_ts__WEBPACK_IMPORTED_MODULE_4__.getHash((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_2__["default"])(schemaElement.$ref));
8313
- const ancestorsSchemaIdentifiers = schemaElement.meta.get('ancestorsSchemaIdentifiers');
8314
- const $refBaseURI = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((acc, uri) => {
8315
- return _util_url_ts__WEBPACK_IMPORTED_MODULE_4__.resolve(acc, _util_url_ts__WEBPACK_IMPORTED_MODULE_4__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_4__.stripHash(uri)));
8316
- }, retrievalURI, [...ancestorsSchemaIdentifiers, (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_2__["default"])(schemaElement.$ref)]);
8804
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(schemaElement.$ref);
8805
+ const hash = _util_url_ts__WEBPACK_IMPORTED_MODULE_6__.getHash($ref);
8806
+ const $refBaseURI = resolveSchema$ids(schemaBaseURI, [$ref]);
8317
8807
  return `${$refBaseURI}${hash === '#' ? '' : hash}`;
8318
8808
  };
8319
8809
 
8320
8810
  /**
8811
+ * Resolves the `$id` of the schema against `baseURI`, the base URI in effect
8812
+ * where the schema sits, or returns `undefined` when the schema declares no string `$id`.
8813
+ *
8321
8814
  * @public
8322
8815
  */
8323
- const resolveSchema$idField = (retrievalURI, schemaElement) => {
8324
- if (typeof schemaElement.$id === 'undefined') {
8816
+ const resolveSchema$idField = (baseURI, schemaElement) => {
8817
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(schemaElement.$id)) {
8325
8818
  return undefined;
8326
8819
  }
8327
- const ancestorsSchemaIdentifiers = schemaElement.meta.get('ancestorsSchemaIdentifiers');
8328
- return (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])((acc, $id) => {
8329
- return _util_url_ts__WEBPACK_IMPORTED_MODULE_4__.resolve(acc, _util_url_ts__WEBPACK_IMPORTED_MODULE_4__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_4__.stripHash($id)));
8330
- }, retrievalURI, ancestorsSchemaIdentifiers);
8820
+ return resolveSchema$ids(baseURI, [(0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(schemaElement.$id)]);
8331
8821
  };
8332
8822
 
8333
8823
  /**
@@ -8337,7 +8827,7 @@ const refractToSchemaElement = element => {
8337
8827
  if (refractToSchemaElement.cache.has(element)) {
8338
8828
  return refractToSchemaElement.cache.get(element);
8339
8829
  }
8340
- const refracted = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__.refractSchema)(element);
8830
+ const refracted = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_5__.refractSchema)(element);
8341
8831
  refractToSchemaElement.cache.set(element, refracted);
8342
8832
  return refracted;
8343
8833
  };
@@ -8351,16 +8841,22 @@ const maybeRefractToSchemaElement = element => {
8351
8841
  * Conditional version of refractToSchemaElement, that acts as an identity
8352
8842
  * function for all non-primitive Element instances.
8353
8843
  */
8354
- if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isPrimitiveElement)(element)) {
8844
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isPrimitiveElement)(element)) {
8355
8845
  return refractToSchemaElement(element);
8356
8846
  }
8357
8847
  return element;
8358
8848
  };
8359
8849
  /* harmony export */ __webpack_require__.d(__webpack_exports__, [
8850
+ /* harmony export */ "collectSchema$ids", 0, /* binding */ collectSchema$ids,
8851
+ /* harmony export */ "detachedRootSchema$ids", 0, /* binding */ detachedRootSchema$ids,
8852
+ /* harmony export */ "isJSONSchemaElementWith$id", 0, /* binding */ isJSONSchemaElementWith$id,
8360
8853
  /* harmony export */ "maybeRefractToSchemaElement", 0, /* binding */ maybeRefractToSchemaElement,
8361
8854
  /* harmony export */ "refractToSchemaElement", 0, /* binding */ refractToSchemaElement,
8362
8855
  /* harmony export */ "resolveSchema$idField", 0, /* binding */ resolveSchema$idField,
8363
- /* harmony export */ "resolveSchema$refField", 0, /* binding */ resolveSchema$refField
8856
+ /* harmony export */ "resolveSchema$ids", 0, /* binding */ resolveSchema$ids,
8857
+ /* harmony export */ "resolveSchema$refField", 0, /* binding */ resolveSchema$refField,
8858
+ /* harmony export */ "resolveSchemaBaseURI", 0, /* binding */ resolveSchemaBaseURI,
8859
+ /* harmony export */ "schema$idsOf", 0, /* binding */ schema$idsOf
8364
8860
  /* harmony export */ ]);
8365
8861
 
8366
8862
 
@@ -8375,31 +8871,34 @@ __webpack_require__.r(__webpack_exports__);
8375
8871
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6352);
8376
8872
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(33031);
8377
8873
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25162);
8378
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12111);
8379
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(78894);
8380
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(37205);
8381
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(44673);
8382
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(16280);
8383
- /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(44641);
8384
- /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(80796);
8385
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(12020);
8386
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(61198);
8387
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(96681);
8388
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(21314);
8389
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(24329);
8390
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(76332);
8391
- /* harmony import */ var _selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(32054);
8392
- /* harmony import */ var _selectors_uri_ts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(56481);
8393
- /* harmony import */ var _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(37757);
8394
- /* harmony import */ var _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(51325);
8395
- /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(8853);
8396
- /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(44477);
8397
- /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(30658);
8398
- /* harmony import */ var _parse_index_ts__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(35014);
8399
- /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(98979);
8400
- /* harmony import */ var _File_ts__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(10682);
8401
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(60888);
8402
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(53429);
8874
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(96911);
8875
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(12111);
8876
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(78894);
8877
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(37205);
8878
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(44673);
8879
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(16280);
8880
+ /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(44641);
8881
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(80796);
8882
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(12020);
8883
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(61198);
8884
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(96681);
8885
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(21314);
8886
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(24329);
8887
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(76332);
8888
+ /* harmony import */ var _selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(32054);
8889
+ /* harmony import */ var _selectors_uri_ts__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(56481);
8890
+ /* harmony import */ var _selectors_json_pointer_ts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(37517);
8891
+ /* harmony import */ var _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(37757);
8892
+ /* harmony import */ var _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(51325);
8893
+ /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(8853);
8894
+ /* harmony import */ var _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(44477);
8895
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(30658);
8896
+ /* harmony import */ var _parse_index_ts__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(35014);
8897
+ /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(98979);
8898
+ /* harmony import */ var _File_ts__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(10682);
8899
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(60888);
8900
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(53429);
8901
+
8403
8902
 
8404
8903
 
8405
8904
 
@@ -8433,8 +8932,23 @@ class OpenAPI3_1DereferenceVisitor {
8433
8932
  reference;
8434
8933
  options;
8435
8934
  refractCache;
8935
+
8936
+ /**
8937
+ * Index of `$id`-bearing schemas per document, shared across nested visitors
8938
+ * of a single dereference run so it never outlives mutations of the documents.
8939
+ */
8940
+ schema$idIndex;
8436
8941
  visited;
8437
8942
 
8943
+ /**
8944
+ * `$id`s of the JSON Schema elements enclosing the traversal root within its
8945
+ * document (outermost first). Empty when the root is the document itself; a
8946
+ * nested visitor traversing a fragment is seeded with the `$id`s of the
8947
+ * schemas the fragment sits under, so the `$ref`s and `$id`s within resolve
8948
+ * against the same base as they would from the document root.
8949
+ */
8950
+ ancestorSchema$ids;
8951
+
8438
8952
  /**
8439
8953
  * Tracks element ancestors across dive-deep traversal boundaries.
8440
8954
  * Used for cycle detection: if a referenced element is found in
@@ -8446,29 +8960,33 @@ class OpenAPI3_1DereferenceVisitor {
8446
8960
  options,
8447
8961
  indirections = [],
8448
8962
  refractCache = new WeakMap(),
8449
- ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(),
8450
- visited = new WeakSet()
8963
+ schema$idIndex = new WeakMap(),
8964
+ ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_30__.AncestorLineage(),
8965
+ visited = new WeakSet(),
8966
+ ancestorSchema$ids = []
8451
8967
  }) {
8452
8968
  this.indirections = indirections;
8453
8969
  this.reference = reference;
8454
8970
  this.options = options;
8455
8971
  this.refractCache = refractCache;
8456
- this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...ancestors);
8972
+ this.schema$idIndex = schema$idIndex;
8973
+ this.ancestors = new _util_ts__WEBPACK_IMPORTED_MODULE_30__.AncestorLineage(...ancestors);
8457
8974
  this.visited = visited;
8975
+ this.ancestorSchema$ids = ancestorSchema$ids;
8458
8976
  }
8459
8977
  toAncestorLineage(path) {
8460
8978
  const ancestorNodes = path.getAncestorNodes();
8461
8979
  const directAncestors = new Set(ancestorNodes.filter(_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isElement));
8462
- const ancestorsLineage = new _util_ts__WEBPACK_IMPORTED_MODULE_28__.AncestorLineage(...this.ancestors, directAncestors);
8980
+ const ancestorsLineage = new _util_ts__WEBPACK_IMPORTED_MODULE_30__.AncestorLineage(...this.ancestors, directAncestors);
8463
8981
  return [ancestorsLineage, directAncestors];
8464
8982
  }
8465
8983
  toBaseURI(uri) {
8466
- return _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.resolve(this.reference.uri, _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(uri)));
8984
+ return _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.resolve(this.reference.uri, _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.sanitize(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(uri)));
8467
8985
  }
8468
8986
  async toReference(uri) {
8469
8987
  // detect maximum depth of resolution
8470
8988
  if (this.reference.depth >= this.options.resolve.maxDepth) {
8471
- throw new _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_20__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
8989
+ throw new _errors_MaximumResolveDepthError_ts__WEBPACK_IMPORTED_MODULE_22__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
8472
8990
  maxDepth: this.options.resolve.maxDepth,
8473
8991
  uri: this.reference.uri
8474
8992
  });
@@ -8482,7 +9000,7 @@ class OpenAPI3_1DereferenceVisitor {
8482
9000
  if (refSet.has(baseURI)) {
8483
9001
  return refSet.find((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(baseURI, 'uri'));
8484
9002
  }
8485
- const parseResult = await (0,_parse_index_ts__WEBPACK_IMPORTED_MODULE_24__["default"])(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.unsanitize(baseURI), {
9003
+ const parseResult = await (0,_parse_index_ts__WEBPACK_IMPORTED_MODULE_26__["default"])(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.unsanitize(baseURI), {
8486
9004
  ...this.options,
8487
9005
  parse: {
8488
9006
  ...this.options.parse,
@@ -8505,15 +9023,15 @@ class OpenAPI3_1DereferenceVisitor {
8505
9023
  // context always sees raw, unresolved elements and processes them with its own
8506
9024
  // ancestors/indirections. The trade-off is that elements referenced by multiple
8507
9025
  // documents would be resolved once per context instead of being reused.
8508
- const mutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_25__["default"]({
9026
+ const mutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_27__["default"]({
8509
9027
  uri: baseURI,
8510
- value: this.options.dereference.immutable ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(parseResult) : parseResult,
9028
+ value: this.options.dereference.immutable ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneDeep)(parseResult) : parseResult,
8511
9029
  depth: this.reference.depth + 1
8512
9030
  });
8513
9031
  refSet.add(mutableReference);
8514
9032
  if (this.options.dereference.immutable) {
8515
9033
  // register new immutable reference with original parseResult
8516
- const immutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_25__["default"]({
9034
+ const immutableReference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_27__["default"]({
8517
9035
  uri: `immutable://${baseURI}`,
8518
9036
  value: parseResult,
8519
9037
  depth: this.reference.depth + 1
@@ -8537,10 +9055,10 @@ class OpenAPI3_1DereferenceVisitor {
8537
9055
  const {
8538
9056
  continueOnError
8539
9057
  } = this.options.dereference;
8540
- const isEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
9058
+ const isEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
8541
9059
  const uri = this.reference.uri;
8542
9060
  const type = referencingElement.element;
8543
- const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement);
9061
+ const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_9__["default"])(referencingElement);
8544
9062
 
8545
9063
  // find element location by identity in the document tree.
8546
9064
  // guarded: this.reference.value may not be a ParseResultElement or may lack a result.
@@ -8549,7 +9067,7 @@ class OpenAPI3_1DereferenceVisitor {
8549
9067
  let location;
8550
9068
  const root = this.reference.value.result;
8551
9069
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isElement)(root)) {
8552
- (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverse)(root, {
9070
+ (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverse)(root, {
8553
9071
  enter: p => {
8554
9072
  if (p.node === referencingElement || this.refractCache.get(p.node) === referencingElement) {
8555
9073
  location = p.formatPath();
@@ -8570,10 +9088,10 @@ class OpenAPI3_1DereferenceVisitor {
8570
9088
 
8571
9089
  // enrich existing error from nested visitor or create new one
8572
9090
  let unresolvedError;
8573
- if (error instanceof _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_21__["default"]) {
9091
+ if (error instanceof _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_23__["default"]) {
8574
9092
  // prefix relative locations for entries belonging to the referenced document
8575
9093
  const refBaseURI = this.toBaseURI(refFieldValue);
8576
- const fragment = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference(refFieldValue);
9094
+ const fragment = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference(refFieldValue);
8577
9095
  if (fragment) {
8578
9096
  if (refBaseURI === error.uri && error.location) {
8579
9097
  error.location = fragment + error.location;
@@ -8586,7 +9104,7 @@ class OpenAPI3_1DereferenceVisitor {
8586
9104
  error.trace = [hop, ...error.trace];
8587
9105
  unresolvedError = error;
8588
9106
  } else {
8589
- unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_21__["default"](message, {
9107
+ unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_23__["default"](message, {
8590
9108
  cause: error,
8591
9109
  type,
8592
9110
  uri,
@@ -8608,8 +9126,8 @@ class OpenAPI3_1DereferenceVisitor {
8608
9126
  path.skip();
8609
9127
  return;
8610
9128
  }
8611
- const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref));
8612
- const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9129
+ const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref));
9130
+ const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
8613
9131
  const isExternalReference = !isInternalReference;
8614
9132
 
8615
9133
  // ignore resolving internal Reference Objects
@@ -8624,31 +9142,31 @@ class OpenAPI3_1DereferenceVisitor {
8624
9142
  path.skip();
8625
9143
  return;
8626
9144
  }
8627
- const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.resolve(retrievalURI, (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref));
9145
+ const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.resolve(retrievalURI, (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref));
8628
9146
  const indirectionsSize = this.indirections.length;
8629
9147
  try {
8630
- const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref));
9148
+ const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref));
8631
9149
  this.indirections.push(referencingElement);
8632
- const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
9150
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
8633
9151
 
8634
9152
  // possibly non-semantic fragment
8635
- let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
9153
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.evaluate)(reference.value.result, jsonPointer);
8636
9154
 
8637
9155
  // applying semantics to a fragment
8638
9156
  const referencedElementType = referencingElement.meta.get('referenced-element');
8639
- if (referencedElement.element !== referencedElementType && !(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement)) {
9157
+ if (referencedElement.element !== referencedElementType && !(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isReferenceElement)(referencedElement)) {
8640
9158
  if (this.refractCache.has(referencedElement)) {
8641
9159
  referencedElement = this.refractCache.get(referencedElement);
8642
- } else if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.isReferenceLikeElement)(referencedElement)) {
9160
+ } else if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.isReferenceLikeElement)(referencedElement)) {
8643
9161
  // handling generic indirect references
8644
9162
  const sourceElement = referencedElement;
8645
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.refractReference)(referencedElement);
9163
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.refractReference)(referencedElement);
8646
9164
  referencedElement.meta.set('referenced-element', referencedElementType);
8647
9165
  this.refractCache.set(sourceElement, referencedElement);
8648
9166
  } else {
8649
9167
  // handling direct references
8650
9168
  const sourceElement = referencedElement;
8651
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__["default"])(referencedElement, {
9169
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__["default"])(referencedElement, {
8652
9170
  element: referencedElementType
8653
9171
  });
8654
9172
  this.refractCache.set(sourceElement, referencedElement);
@@ -8657,14 +9175,14 @@ class OpenAPI3_1DereferenceVisitor {
8657
9175
 
8658
9176
  // detect direct or indirect reference
8659
9177
  if (referencingElement === referencedElement) {
8660
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('Recursive Reference Object detected', {
8661
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9178
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('Recursive Reference Object detected', {
9179
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8662
9180
  });
8663
9181
  }
8664
9182
 
8665
9183
  // detect maximum depth of dereferencing
8666
9184
  if (this.indirections.length > this.options.dereference.maxDepth) {
8667
- throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_19__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
9185
+ throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_21__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
8668
9186
  maxDepth: this.options.dereference.maxDepth,
8669
9187
  uri: this.reference.uri
8670
9188
  });
@@ -8675,14 +9193,14 @@ class OpenAPI3_1DereferenceVisitor {
8675
9193
  if (ancestorsLineage.includes(referencedElement)) {
8676
9194
  reference.refSet.circular = true;
8677
9195
  if (this.options.dereference.circular === 'error') {
8678
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('Circular reference detected', {
8679
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9196
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('Circular reference detected', {
9197
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8680
9198
  });
8681
9199
  } else if (this.options.dereference.circular === 'replace') {
8682
- const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"]($refBaseURI, {
9200
+ const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"]($refBaseURI, {
8683
9201
  type: referencingElement.element,
8684
9202
  uri: reference.uri,
8685
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9203
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8686
9204
  });
8687
9205
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
8688
9206
  const replacement = replacer(refElement);
@@ -8701,9 +9219,9 @@ class OpenAPI3_1DereferenceVisitor {
8701
9219
  * 3. Fragment is a Reference Object. We need to follow it to get the eventual value
8702
9220
  * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
8703
9221
  */
8704
- const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
9222
+ const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
8705
9223
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
8706
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
9224
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isReferenceElement)(referencedElement) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
8707
9225
  if (shouldDetectCircular) {
8708
9226
  this.visited.add(referencedElement);
8709
9227
  }
@@ -8713,10 +9231,11 @@ class OpenAPI3_1DereferenceVisitor {
8713
9231
  indirections: [...this.indirections],
8714
9232
  options: this.options,
8715
9233
  refractCache: this.refractCache,
9234
+ schema$idIndex: this.schema$idIndex,
8716
9235
  visited: this.visited,
8717
9236
  ancestors: ancestorsLineage
8718
9237
  });
8719
- referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
9238
+ referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverseAsync)(referencedElement, visitor, {
8720
9239
  mutable: true,
8721
9240
  skipVisited: 'skip'
8722
9241
  });
@@ -8726,14 +9245,14 @@ class OpenAPI3_1DereferenceVisitor {
8726
9245
  /**
8727
9246
  * Creating a new version of referenced element to avoid modifying the original one.
8728
9247
  */
8729
- const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(referencedElement);
9248
+ const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(referencedElement);
8730
9249
  // annotate fragment with info about original Reference element
8731
9250
  mergedElement.meta.set('ref-fields', {
8732
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref),
9251
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref),
8733
9252
  // @ts-ignore
8734
- description: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.description),
9253
+ description: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.description),
8735
9254
  // @ts-ignore
8736
- summary: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.summary)
9255
+ summary: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.summary)
8737
9256
  });
8738
9257
  // annotate fragment with info about origin and type
8739
9258
  mergedElement.meta.set('ref-origin', reference.uri);
@@ -8741,7 +9260,7 @@ class OpenAPI3_1DereferenceVisitor {
8741
9260
 
8742
9261
  // override description and summary (outer has higher priority then inner)
8743
9262
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isObjectElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isObjectElement)(mergedElement)) {
8744
- const fields = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__.fixedFields)(referencedElement, {
9263
+ const fields = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__.fixedFields)(referencedElement, {
8745
9264
  indexed: true
8746
9265
  });
8747
9266
  if (referencingElement.hasKey('description') && Object.hasOwn(fields, 'description')) {
@@ -8759,7 +9278,7 @@ class OpenAPI3_1DereferenceVisitor {
8759
9278
  */
8760
9279
  path.replaceWith(mergedElement);
8761
9280
  } catch (error) {
8762
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
9281
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref);
8763
9282
  this.handleError(`Error while dereferencing Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
8764
9283
  } finally {
8765
9284
  if (this.indirections.length > indirectionsSize) this.indirections.pop();
@@ -8778,8 +9297,8 @@ class OpenAPI3_1DereferenceVisitor {
8778
9297
  path.skip();
8779
9298
  return;
8780
9299
  }
8781
- const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref));
8782
- const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9300
+ const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref));
9301
+ const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
8783
9302
  const isExternalReference = !isInternalReference;
8784
9303
 
8785
9304
  // ignore resolving internal Path Item Objects
@@ -8792,37 +9311,37 @@ class OpenAPI3_1DereferenceVisitor {
8792
9311
  // skip traversing this Path Item element but traverse all it's child elements
8793
9312
  return;
8794
9313
  }
8795
- const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.resolve(retrievalURI, (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref));
9314
+ const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.resolve(retrievalURI, (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref));
8796
9315
  const indirectionsSize = this.indirections.length;
8797
9316
  try {
8798
- const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref));
9317
+ const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref));
8799
9318
  this.indirections.push(referencingElement);
8800
- const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
9319
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
8801
9320
 
8802
9321
  // possibly non-semantic referenced element
8803
- let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
9322
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.evaluate)(reference.value.result, jsonPointer);
8804
9323
 
8805
9324
  // applying semantics to a referenced element
8806
- if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement)) {
9325
+ if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isPathItemElement)(referencedElement)) {
8807
9326
  if (this.refractCache.has(referencedElement)) {
8808
9327
  referencedElement = this.refractCache.get(referencedElement);
8809
9328
  } else {
8810
9329
  const sourceElement = referencedElement;
8811
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.refractPathItem)(referencedElement);
9330
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.refractPathItem)(referencedElement);
8812
9331
  this.refractCache.set(sourceElement, referencedElement);
8813
9332
  }
8814
9333
  }
8815
9334
 
8816
9335
  // detect direct or indirect reference
8817
9336
  if (referencingElement === referencedElement) {
8818
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('Recursive Path Item Object reference detected', {
8819
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9337
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('Recursive Path Item Object reference detected', {
9338
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8820
9339
  });
8821
9340
  }
8822
9341
 
8823
9342
  // detect maximum depth of dereferencing
8824
9343
  if (this.indirections.length > this.options.dereference.maxDepth) {
8825
- throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_19__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
9344
+ throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_21__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
8826
9345
  maxDepth: this.options.dereference.maxDepth,
8827
9346
  uri: this.reference.uri
8828
9347
  });
@@ -8833,14 +9352,14 @@ class OpenAPI3_1DereferenceVisitor {
8833
9352
  if (ancestorsLineage.includes(referencedElement)) {
8834
9353
  reference.refSet.circular = true;
8835
9354
  if (this.options.dereference.circular === 'error') {
8836
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('Circular reference detected', {
8837
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9355
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('Circular reference detected', {
9356
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8838
9357
  });
8839
9358
  } else if (this.options.dereference.circular === 'replace') {
8840
- const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"]($refBaseURI, {
9359
+ const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"]($refBaseURI, {
8841
9360
  type: referencingElement.element,
8842
9361
  uri: reference.uri,
8843
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9362
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8844
9363
  });
8845
9364
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
8846
9365
  const replacement = replacer(refElement);
@@ -8859,9 +9378,9 @@ class OpenAPI3_1DereferenceVisitor {
8859
9378
  * 3. Fragment is a Path Item Object with $ref field. We need to follow it to get the eventual value
8860
9379
  * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
8861
9380
  */
8862
- const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
9381
+ const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
8863
9382
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
8864
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
9383
+ if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isPathItemElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
8865
9384
  if (shouldDetectCircular) {
8866
9385
  this.visited.add(referencedElement);
8867
9386
  }
@@ -8871,10 +9390,11 @@ class OpenAPI3_1DereferenceVisitor {
8871
9390
  indirections: [...this.indirections],
8872
9391
  options: this.options,
8873
9392
  refractCache: this.refractCache,
9393
+ schema$idIndex: this.schema$idIndex,
8874
9394
  visited: this.visited,
8875
9395
  ancestors: ancestorsLineage
8876
9396
  });
8877
- referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
9397
+ referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverseAsync)(referencedElement, visitor, {
8878
9398
  mutable: true,
8879
9399
  skipVisited: 'skip'
8880
9400
  });
@@ -8884,18 +9404,18 @@ class OpenAPI3_1DereferenceVisitor {
8884
9404
  /**
8885
9405
  * Creating a new version of Path Item by merging fields from referenced Path Item with referencing one.
8886
9406
  */
8887
- if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement)) {
8888
- const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(referencedElement);
9407
+ if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isPathItemElement)(referencedElement)) {
9408
+ const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(referencedElement);
8889
9409
  // existing keywords from referencing PathItemElement overrides ones from referenced element
8890
9410
  referencingElement.forEach((value, keyElement, item) => {
8891
- mergedElement.remove((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(keyElement));
9411
+ mergedElement.remove((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(keyElement));
8892
9412
  mergedElement.content.push(item);
8893
9413
  });
8894
9414
  mergedElement.remove('$ref');
8895
9415
 
8896
9416
  // annotate referenced element with info about original referencing element
8897
9417
  mergedElement.meta.set('ref-fields', {
8898
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9418
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
8899
9419
  });
8900
9420
  // annotate referenced element with info about origin and type
8901
9421
  mergedElement.meta.set('ref-origin', reference.uri);
@@ -8908,7 +9428,7 @@ class OpenAPI3_1DereferenceVisitor {
8908
9428
  */
8909
9429
  path.replaceWith(referencedElement);
8910
9430
  } catch (error) {
8911
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
9431
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref);
8912
9432
  this.handleError(`Error while dereferencing Path Item Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
8913
9433
  } finally {
8914
9434
  if (this.indirections.length > indirectionsSize) this.indirections.pop();
@@ -8924,18 +9444,18 @@ class OpenAPI3_1DereferenceVisitor {
8924
9444
 
8925
9445
  // operationRef and operationId fields are mutually exclusive
8926
9446
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationRef) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationId)) {
8927
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('LinkElement operationRef and operationId fields are mutually exclusive', {
8928
- operationRef: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef),
8929
- operationId: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationId)
9447
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('LinkElement operationRef and operationId fields are mutually exclusive', {
9448
+ operationRef: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef),
9449
+ operationId: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationId)
8930
9450
  });
8931
9451
  }
8932
9452
  try {
8933
9453
  let operationElement;
8934
9454
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationRef)) {
8935
9455
  // possibly non-semantic referenced element
8936
- const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef));
8937
- const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef));
8938
- const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9456
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef));
9457
+ const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef));
9458
+ const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
8939
9459
  const isExternalReference = !isInternalReference;
8940
9460
 
8941
9461
  // ignore resolving internal Operation Object reference
@@ -8948,24 +9468,24 @@ class OpenAPI3_1DereferenceVisitor {
8948
9468
  // skip traversing this Link element but traverse all it's child elements
8949
9469
  return;
8950
9470
  }
8951
- const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef));
8952
- operationElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
9471
+ const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef));
9472
+ operationElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.evaluate)(reference.value.result, jsonPointer);
8953
9473
  // applying semantics to a referenced element
8954
- if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isOperationElement)(operationElement)) {
9474
+ if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isOperationElement)(operationElement)) {
8955
9475
  if (this.refractCache.has(operationElement)) {
8956
9476
  operationElement = this.refractCache.get(operationElement);
8957
9477
  } else {
8958
9478
  const sourceElement = operationElement;
8959
- operationElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__.refractOperation)(operationElement);
9479
+ operationElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.refractOperation)(operationElement);
8960
9480
  this.refractCache.set(sourceElement, operationElement);
8961
9481
  }
8962
9482
  }
8963
9483
  // create shallow clone to be able to annotate with metadata
8964
- operationElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(operationElement);
9484
+ operationElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(operationElement);
8965
9485
  // annotate operation element with info about origin and type
8966
9486
  operationElement.meta.set('ref-origin', reference.uri);
8967
9487
  operationElement.meta.set('ref-type', linkElement.element);
8968
- const linkElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(linkElement);
9488
+ const linkElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(linkElement);
8969
9489
  linkElementCopy.operationRef?.meta.set('operation', operationElement);
8970
9490
 
8971
9491
  /**
@@ -8975,17 +9495,17 @@ class OpenAPI3_1DereferenceVisitor {
8975
9495
  return;
8976
9496
  }
8977
9497
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationId)) {
8978
- const operationId = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationId);
8979
- const reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.unsanitize(this.reference.uri));
8980
- const operationPath = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.find)(reference.value.result, path => (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isOperationElement)(path.node) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isElement)(path.node.operationId) && path.node.operationId.equals(operationId));
9498
+ const operationId = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationId);
9499
+ const reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.unsanitize(this.reference.uri));
9500
+ const operationPath = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.find)(reference.value.result, path => (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isOperationElement)(path.node) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isElement)(path.node.operationId) && path.node.operationId.equals(operationId));
8981
9501
  operationElement = operationPath?.node;
8982
9502
  // OperationElement not found by its operationId
8983
9503
  if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_2__["default"])(operationElement)) {
8984
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"](`OperationElement(operationId=${operationId}) not found`, {
9504
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"](`OperationElement(operationId=${operationId}) not found`, {
8985
9505
  operationId
8986
9506
  });
8987
9507
  }
8988
- const linkElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(linkElement);
9508
+ const linkElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(linkElement);
8989
9509
  linkElementCopy.operationId?.meta.set('operation', operationElement);
8990
9510
 
8991
9511
  /**
@@ -8995,7 +9515,7 @@ class OpenAPI3_1DereferenceVisitor {
8995
9515
  }
8996
9516
  } catch (error) {
8997
9517
  const refFieldName = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationRef) ? 'operationRef' : 'operationId';
8998
- const refFieldValue = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationRef) ? (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef) : (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationId);
9518
+ const refFieldValue = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(linkElement.operationRef) ? (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationRef) : (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(linkElement.operationId);
8999
9519
  this.handleError(`Error while dereferencing Link Object. Cannot resolve ${refFieldName} "${refFieldValue}": ${error.message}`, error, linkElement, refFieldName, refFieldValue, path);
9000
9520
  }
9001
9521
  }
@@ -9009,13 +9529,13 @@ class OpenAPI3_1DereferenceVisitor {
9009
9529
 
9010
9530
  // value and externalValue fields are mutually exclusive
9011
9531
  if (exampleElement.hasKey('value') && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(exampleElement.externalValue)) {
9012
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('ExampleElement value and externalValue fields are mutually exclusive', {
9013
- value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.value),
9014
- externalValue: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue)
9532
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('ExampleElement value and externalValue fields are mutually exclusive', {
9533
+ value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.value),
9534
+ externalValue: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.externalValue)
9015
9535
  });
9016
9536
  }
9017
- const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue));
9018
- const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9537
+ const retrievalURI = this.toBaseURI((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.externalValue));
9538
+ const isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
9019
9539
  const isExternalReference = !isInternalReference;
9020
9540
 
9021
9541
  // ignore resolving internal Example Objects
@@ -9029,14 +9549,14 @@ class OpenAPI3_1DereferenceVisitor {
9029
9549
  return;
9030
9550
  }
9031
9551
  try {
9032
- const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue));
9552
+ const reference = await this.toReference((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.externalValue));
9033
9553
 
9034
9554
  // shallow clone of the referenced element
9035
- const valueElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(reference.value.result);
9555
+ const valueElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(reference.value.result);
9036
9556
  // annotate element with info about origin and type
9037
9557
  valueElement.meta.set('ref-origin', reference.uri);
9038
9558
  valueElement.meta.set('ref-type', exampleElement.element);
9039
- const exampleElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(exampleElement);
9559
+ const exampleElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(exampleElement);
9040
9560
  exampleElementCopy.value = valueElement;
9041
9561
 
9042
9562
  /**
@@ -9044,7 +9564,7 @@ class OpenAPI3_1DereferenceVisitor {
9044
9564
  */
9045
9565
  path.replaceWith(exampleElementCopy);
9046
9566
  } catch (error) {
9047
- const externalValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue);
9567
+ const externalValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(exampleElement.externalValue);
9048
9568
  this.handleError(`Error while dereferencing Example Object. Cannot resolve externalValue "${externalValue}": ${error.message}`, error, exampleElement, 'externalValue', externalValue, path);
9049
9569
  }
9050
9570
  }
@@ -9064,30 +9584,69 @@ class OpenAPI3_1DereferenceVisitor {
9064
9584
  const indirectionsSize = this.indirections.length;
9065
9585
  try {
9066
9586
  // compute baseURI using rules around $id and $ref keywords
9067
- let reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.unsanitize(this.reference.uri));
9587
+ let reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.unsanitize(this.reference.uri));
9068
9588
  let {
9069
9589
  uri: retrievalURI
9070
9590
  } = reference;
9071
- const $refBaseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.resolveSchema$refField)(retrievalURI, referencingElement);
9072
- const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash($refBaseURI);
9073
- const file = new _File_ts__WEBPACK_IMPORTED_MODULE_26__["default"]({
9591
+ // base URI in effect at the traversal root: the document base refined by
9592
+ // the $ids of the schemas enclosing the root when the root is a fragment
9593
+ const rootBaseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.resolveSchema$ids)(retrievalURI, this.ancestorSchema$ids);
9594
+ const schemaBaseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.resolveSchemaBaseURI)(rootBaseURI, path);
9595
+ const $refBaseURI = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.resolveSchema$refField)(schemaBaseURI, referencingElement);
9596
+ const $refBaseURIStrippedHash = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash($refBaseURI);
9597
+ const file = new _File_ts__WEBPACK_IMPORTED_MODULE_28__["default"]({
9074
9598
  uri: $refBaseURIStrippedHash
9075
9599
  });
9076
9600
  const isUnknownURI = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(r => r.canRead(file), this.options.resolve.resolvers);
9077
9601
  const isURL = !isUnknownURI;
9078
- let isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === $refBaseURI;
9602
+ let isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === $refBaseURI;
9079
9603
  let isExternalReference = !isInternalReference;
9080
9604
 
9081
9605
  // determining reference, proper evaluation and selection mechanism
9082
9606
  let referencedElement;
9607
+ // $ids of the schemas enclosing the referenced element within its document
9608
+ let ancestorSchema$ids;
9083
9609
  try {
9084
9610
  if (isUnknownURI || isURL) {
9085
9611
  // we're dealing with canonical URI or URL with possible fragment
9086
9612
  retrievalURI = this.toBaseURI($refBaseURI);
9087
9613
  const selector = $refBaseURI;
9088
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(reference.value.result);
9089
- referencedElement = (0,_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_18__.evaluate)(selector, referenceAsSchema);
9090
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(referencedElement);
9614
+ // the fragment being traversed is searched before the whole document: a
9615
+ // fragment referenced from another document (a Response, Parameter, Path
9616
+ // Item, ...) is refracted with its own semantics, so the Schema Objects it
9617
+ // contains are indexed, whereas the referenced document as a whole is
9618
+ // parsed generically and refracted as a bare JSON Schema, which leaves
9619
+ // those Schema Objects (under `content`, `schema`, ...) unrecognized and
9620
+ // their `$id`s out of the index
9621
+ const documentElement = reference.value.result;
9622
+ const rootNode = path.getAncestorNodes().at(-1) ?? path.node;
9623
+ const fragmentElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isParseResultElement)(rootNode) ? rootNode.result : rootNode;
9624
+ try {
9625
+ // the fragment's $ids resolve against the base its enclosing chain
9626
+ // leaves in effect, which then also prefixes the located schema's chain
9627
+ ({
9628
+ element: referencedElement,
9629
+ ancestorSchema$ids
9630
+ } = (0,_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_19__.locate)(selector, (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(fragmentElement), {
9631
+ baseURI: rootBaseURI,
9632
+ index: this.schema$idIndex
9633
+ }));
9634
+ ancestorSchema$ids = [...this.ancestorSchema$ids, ...ancestorSchema$ids];
9635
+ } catch (error) {
9636
+ if (!(error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_24__["default"]) || fragmentElement === documentElement) {
9637
+ throw error;
9638
+ }
9639
+ // the document index is rooted at the document, so the located chain
9640
+ // is already document-relative and takes no prefix
9641
+ ({
9642
+ element: referencedElement,
9643
+ ancestorSchema$ids
9644
+ } = (0,_selectors_uri_ts__WEBPACK_IMPORTED_MODULE_19__.locate)(selector, (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(documentElement), {
9645
+ baseURI: reference.uri,
9646
+ index: this.schema$idIndex
9647
+ }));
9648
+ }
9649
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(referencedElement);
9091
9650
 
9092
9651
  // ignore resolving internal Schema Objects
9093
9652
  if (!this.options.resolve.internal && isInternalReference) {
@@ -9102,7 +9661,7 @@ class OpenAPI3_1DereferenceVisitor {
9102
9661
  } else {
9103
9662
  // we're assuming here that we're dealing with JSON Pointer here
9104
9663
  retrievalURI = this.toBaseURI($refBaseURI);
9105
- isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9664
+ isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
9106
9665
  isExternalReference = !isInternalReference;
9107
9666
 
9108
9667
  // ignore resolving internal Schema Objects
@@ -9115,21 +9674,24 @@ class OpenAPI3_1DereferenceVisitor {
9115
9674
  // skip traversing this schema element but traverse all it's child elements
9116
9675
  return;
9117
9676
  }
9118
- reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.unsanitize($refBaseURI));
9119
- const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
9120
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(reference.value.result);
9121
- referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(referenceAsSchema, selector);
9122
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(referencedElement);
9677
+ reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.unsanitize($refBaseURI));
9678
+ const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
9679
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(reference.value.result);
9680
+ ({
9681
+ element: referencedElement,
9682
+ ancestorSchema$ids
9683
+ } = (0,_selectors_json_pointer_ts__WEBPACK_IMPORTED_MODULE_20__.locate)(referenceAsSchema, selector));
9684
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(referencedElement);
9123
9685
  }
9124
9686
  } catch (error) {
9125
9687
  /**
9126
9688
  * SchemaElement($id=URL) was not found, so we're going to try to resolve
9127
9689
  * the URL and assume the returned response is a JSON Schema.
9128
9690
  */
9129
- if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_22__["default"]) {
9130
- if ((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_17__.isAnchor)((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_17__.uriToAnchor)($refBaseURI))) {
9691
+ if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_ts__WEBPACK_IMPORTED_MODULE_24__["default"]) {
9692
+ if ((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_18__.isAnchor)((0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_18__.uriToAnchor)($refBaseURI))) {
9131
9693
  // we're dealing with JSON Schema $anchor here
9132
- isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9694
+ isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
9133
9695
  isExternalReference = !isInternalReference;
9134
9696
 
9135
9697
  // ignore resolving internal Schema Objects
@@ -9142,15 +9704,18 @@ class OpenAPI3_1DereferenceVisitor {
9142
9704
  // skip traversing this schema element but traverse all it's child elements
9143
9705
  return;
9144
9706
  }
9145
- reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.unsanitize($refBaseURI));
9146
- const selector = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_17__.uriToAnchor)($refBaseURI);
9147
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(reference.value.result);
9148
- referencedElement = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_17__.evaluate)(selector, referenceAsSchema);
9149
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(referencedElement);
9707
+ reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.unsanitize($refBaseURI));
9708
+ const selector = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_18__.uriToAnchor)($refBaseURI);
9709
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(reference.value.result);
9710
+ ({
9711
+ element: referencedElement,
9712
+ ancestorSchema$ids
9713
+ } = (0,_selectors_$anchor_ts__WEBPACK_IMPORTED_MODULE_18__.locate)(selector, referenceAsSchema));
9714
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(referencedElement);
9150
9715
  } else {
9151
9716
  // we're assuming here that we're dealing with JSON Pointer here
9152
9717
  retrievalURI = this.toBaseURI($refBaseURI);
9153
- isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(this.reference.uri) === retrievalURI;
9718
+ isInternalReference = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(this.reference.uri) === retrievalURI;
9154
9719
  isExternalReference = !isInternalReference;
9155
9720
 
9156
9721
  // ignore resolving internal Schema Objects
@@ -9163,11 +9728,14 @@ class OpenAPI3_1DereferenceVisitor {
9163
9728
  // skip traversing this schema element but traverse all it's child elements
9164
9729
  return;
9165
9730
  }
9166
- reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_23__.unsanitize($refBaseURI));
9167
- const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
9168
- const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(reference.value.result);
9169
- referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(referenceAsSchema, selector);
9170
- referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_27__.maybeRefractToSchemaElement)(referencedElement);
9731
+ reference = await this.toReference(_util_url_ts__WEBPACK_IMPORTED_MODULE_25__.unsanitize($refBaseURI));
9732
+ const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_13__.URIFragmentIdentifier.fromURIReference($refBaseURI);
9733
+ const referenceAsSchema = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(reference.value.result);
9734
+ ({
9735
+ element: referencedElement,
9736
+ ancestorSchema$ids
9737
+ } = (0,_selectors_json_pointer_ts__WEBPACK_IMPORTED_MODULE_20__.locate)(referenceAsSchema, selector));
9738
+ referencedElement = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.maybeRefractToSchemaElement)(referencedElement);
9171
9739
  }
9172
9740
  } else {
9173
9741
  throw error;
@@ -9177,14 +9745,14 @@ class OpenAPI3_1DereferenceVisitor {
9177
9745
 
9178
9746
  // detect direct or indirect reference
9179
9747
  if (referencingElement === referencedElement) {
9180
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('Recursive Schema Object reference detected', {
9181
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9748
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('Recursive Schema Object reference detected', {
9749
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
9182
9750
  });
9183
9751
  }
9184
9752
 
9185
9753
  // detect maximum depth of dereferencing
9186
9754
  if (this.indirections.length > this.options.dereference.maxDepth) {
9187
- throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_19__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
9755
+ throw new _errors_MaximumDereferenceDepthError_ts__WEBPACK_IMPORTED_MODULE_21__["default"](`Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
9188
9756
  maxDepth: this.options.dereference.maxDepth,
9189
9757
  uri: this.reference.uri
9190
9758
  });
@@ -9195,14 +9763,14 @@ class OpenAPI3_1DereferenceVisitor {
9195
9763
  if (ancestorsLineage.includes(referencedElement)) {
9196
9764
  reference.refSet.circular = true;
9197
9765
  if (this.options.dereference.circular === 'error') {
9198
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('Circular reference detected', {
9199
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9766
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_10__["default"]('Circular reference detected', {
9767
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
9200
9768
  });
9201
9769
  } else if (this.options.dereference.circular === 'replace') {
9202
- const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"]($refBaseURI, {
9770
+ const refElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"]($refBaseURI, {
9203
9771
  type: referencingElement.element,
9204
9772
  uri: reference.uri,
9205
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9773
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
9206
9774
  });
9207
9775
  const replacer = this.options.dereference.strategyOpts['openapi-3-1']?.circularReplacer ?? this.options.dereference.circularReplacer;
9208
9776
  const replacement = replacer(refElement);
@@ -9221,9 +9789,13 @@ class OpenAPI3_1DereferenceVisitor {
9221
9789
  * 3. Fragment is a Schema Object with $ref field. We need to follow it to get the eventual value
9222
9790
  * 4. We are dereferencing the fragment lazily/eagerly depending on circular mode
9223
9791
  */
9224
- const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_23__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
9792
+ const isNonEntryDocument = _util_url_ts__WEBPACK_IMPORTED_MODULE_25__.stripHash(reference.refSet.rootRef.uri) !== reference.uri;
9225
9793
  const shouldDetectCircular = ['error', 'replace'].includes(this.options.dereference.circular);
9226
- if ((isExternalReference || isNonEntryDocument || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
9794
+ // content transplanted into the referencing site is traversed under that
9795
+ // site's $id chain; a fragment enclosed by a different chain has its own
9796
+ // $refs resolved in place first, by a nested visitor seeded with that chain
9797
+ const hasDifferentEnclosingBase = (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.resolveSchema$ids)(reference.uri, ancestorSchema$ids) !== (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.resolveSchema$ids)(rootBaseURI, (0,_util_ts__WEBPACK_IMPORTED_MODULE_29__.schema$idsOf)(path.getAncestorNodes().reverse()));
9798
+ if ((isExternalReference || isNonEntryDocument || hasDifferentEnclosingBase || (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isSchemaElement)(referencedElement) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencedElement.$ref) || shouldDetectCircular && !this.visited.has(referencedElement)) && !ancestorsLineage.includesCycle(referencedElement)) {
9227
9799
  if (shouldDetectCircular) {
9228
9800
  this.visited.add(referencedElement);
9229
9801
  }
@@ -9233,10 +9805,12 @@ class OpenAPI3_1DereferenceVisitor {
9233
9805
  indirections: [...this.indirections],
9234
9806
  options: this.options,
9235
9807
  refractCache: this.refractCache,
9808
+ schema$idIndex: this.schema$idIndex,
9236
9809
  visited: this.visited,
9237
- ancestors: ancestorsLineage
9810
+ ancestors: ancestorsLineage,
9811
+ ancestorSchema$ids
9238
9812
  });
9239
- referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(referencedElement, visitor, {
9813
+ referencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_11__.traverseAsync)(referencedElement, visitor, {
9240
9814
  mutable: true,
9241
9815
  skipVisited: 'skip'
9242
9816
  });
@@ -9244,11 +9818,11 @@ class OpenAPI3_1DereferenceVisitor {
9244
9818
  }
9245
9819
 
9246
9820
  // Boolean JSON Schemas
9247
- if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__.isBooleanJSONSchemaElement)(referencedElement)) {
9248
- const booleanJsonSchemaElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(referencedElement);
9821
+ if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.isBooleanJSONSchemaElement)(referencedElement)) {
9822
+ const booleanJsonSchemaElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneDeep)(referencedElement);
9249
9823
  // annotate referenced element with info about original referencing element
9250
9824
  booleanJsonSchemaElement.meta.set('ref-fields', {
9251
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9825
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
9252
9826
  });
9253
9827
  // annotate referenced element with info about origin and type
9254
9828
  booleanJsonSchemaElement.meta.set('ref-origin', reference.uri);
@@ -9261,17 +9835,17 @@ class OpenAPI3_1DereferenceVisitor {
9261
9835
  /**
9262
9836
  * Creating a new version of Schema Object by merging fields from referenced Schema Object with referencing one.
9263
9837
  */
9264
- if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isSchemaElement)(referencedElement)) {
9265
- const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneShallow)(referencedElement);
9838
+ if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__.isSchemaElement)(referencedElement)) {
9839
+ const mergedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneShallow)(referencedElement);
9266
9840
  // existing keywords from referencing schema overrides ones from referenced schema
9267
9841
  referencingElement.forEach((value, keyElement, item) => {
9268
- mergedElement.remove((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(keyElement));
9842
+ mergedElement.remove((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(keyElement));
9269
9843
  mergedElement.content.push(item);
9270
9844
  });
9271
9845
  mergedElement.remove('$ref');
9272
9846
  // annotate referenced element with info about original referencing element
9273
9847
  mergedElement.meta.set('ref-fields', {
9274
- $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref)
9848
+ $ref: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref)
9275
9849
  });
9276
9850
  // annotate fragment with info about origin and type
9277
9851
  mergedElement.meta.set('ref-origin', reference.uri);
@@ -9283,7 +9857,7 @@ class OpenAPI3_1DereferenceVisitor {
9283
9857
  */
9284
9858
  path.replaceWith(referencedElement);
9285
9859
  } catch (error) {
9286
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
9860
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref);
9287
9861
  this.handleError(`Error while dereferencing Schema Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
9288
9862
  } finally {
9289
9863
  if (this.indirections.length > indirectionsSize) this.indirections.pop();
@@ -13355,6 +13929,38 @@ const resolve = (from, to) => {
13355
13929
  return resolvedUrl.toString();
13356
13930
  };
13357
13931
 
13932
+ /**
13933
+ * Computes the URI reference that resolves to `to` against `from` — the inverse
13934
+ * of `resolve`: `resolve(from, relative(from, to)) === to`. The reference is
13935
+ * relative to the directory of `from` (its last path segment is the document,
13936
+ * not a directory). When the two URIs differ in scheme or authority, or either
13937
+ * has no hierarchical path (e.g. a URN), no relative form exists and `to` is
13938
+ * returned unchanged.
13939
+ * @public
13940
+ */
13941
+ const relative = (from, to) => {
13942
+ const fromURL = new URL(from, 'resolve://');
13943
+ const toURL = new URL(to, 'resolve://');
13944
+
13945
+ // the authority is host plus userinfo; a relative reference keeps both from `from`
13946
+ if (fromURL.protocol !== toURL.protocol || fromURL.host !== toURL.host || fromURL.username !== toURL.username || fromURL.password !== toURL.password || !fromURL.pathname.startsWith('/') || !toURL.pathname.startsWith('/')) {
13947
+ return to;
13948
+ }
13949
+ const fromSegments = fromURL.pathname.split('/').slice(0, -1);
13950
+ const toSegments = toURL.pathname.split('/');
13951
+ let common = 0;
13952
+ while (common < fromSegments.length && common < toSegments.length - 1 && fromSegments[common] === toSegments[common]) {
13953
+ common += 1;
13954
+ }
13955
+ const segments = [...fromSegments.slice(common).map(() => '..'), ...toSegments.slice(common)];
13956
+ // a leading segment with a colon would be parsed as a scheme, and an empty
13957
+ // reference (`to` is the directory of `from`) would resolve back to `from`
13958
+ if (segments[0].includes(':') || segments.join('/') === '') {
13959
+ segments.unshift('.');
13960
+ }
13961
+ return segments.join('/') + toURL.search + toURL.hash;
13962
+ };
13963
+
13358
13964
  /**
13359
13965
  * Sanitizes/Encodes URI to it's url encoded form.
13360
13966
  *
@@ -13400,6 +14006,7 @@ const unsanitize = uri => {
13400
14006
  /* harmony export */ "isFileSystemPath", 0, /* binding */ isFileSystemPath,
13401
14007
  /* harmony export */ "isHttpUrl", 0, /* binding */ isHttpUrl,
13402
14008
  /* harmony export */ "isURI", 0, /* binding */ isURI,
14009
+ /* harmony export */ "relative", 0, /* binding */ relative,
13403
14010
  /* harmony export */ "resolve", 0, /* binding */ resolve,
13404
14011
  /* harmony export */ "sanitize", 0, /* binding */ sanitize,
13405
14012
  /* harmony export */ "stripHash", 0, /* binding */ stripHash,
@@ -20035,7 +20642,6 @@ class JSONEvaluationRealm extends _EvaluationRealm_mjs__WEBPACK_IMPORTED_MODULE_
20035
20642
  if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(left) && (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(right)) return left < right;
20036
20643
  return false;
20037
20644
  case '<=':
20038
- if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNothing)(left) || (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNothing)(right)) return false;
20039
20645
  if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNumber)(left) && (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNumber)(right)) return left <= right;
20040
20646
  if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(left) && (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(right)) return left <= right;
20041
20647
  return this.#deepEqual(left, right);
@@ -20045,7 +20651,6 @@ class JSONEvaluationRealm extends _EvaluationRealm_mjs__WEBPACK_IMPORTED_MODULE_
20045
20651
  if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(left) && (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(right)) return left > right;
20046
20652
  return false;
20047
20653
  case '>=':
20048
- if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNothing)(left) || (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNothing)(right)) return false;
20049
20654
  if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNumber)(left) && (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isNumber)(right)) return left >= right;
20050
20655
  if ((0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(left) && (0,_utils_guards_mjs__WEBPACK_IMPORTED_MODULE_1__.isString)(right)) return left >= right;
20051
20656
  return this.#deepEqual(left, right);