@speclynx/apidom-overlay 4.13.0 → 4.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -77700,6 +77700,254 @@ const refractJsonSchemaDialect = (value, options = {}) => refract(value, {
77700
77700
  });
77701
77701
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (refract);
77702
77702
 
77703
+ /***/ },
77704
+
77705
+ /***/ 52645
77706
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
77707
+
77708
+ "use strict";
77709
+ __webpack_require__.r(__webpack_exports__);
77710
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
77711
+ /* harmony export */ CallbackElement: () => (/* reexport safe */ _elements_Callback_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]),
77712
+ /* harmony export */ ComponentsElement: () => (/* reexport safe */ _elements_Components_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]),
77713
+ /* harmony export */ ContactElement: () => (/* reexport safe */ _elements_Contact_mjs__WEBPACK_IMPORTED_MODULE_4__["default"]),
77714
+ /* harmony export */ DiscriminatorElement: () => (/* reexport safe */ _elements_Discriminator_mjs__WEBPACK_IMPORTED_MODULE_5__["default"]),
77715
+ /* harmony export */ EncodingElement: () => (/* reexport safe */ _elements_Encoding_mjs__WEBPACK_IMPORTED_MODULE_6__["default"]),
77716
+ /* harmony export */ ExampleElement: () => (/* reexport safe */ _elements_Example_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]),
77717
+ /* harmony export */ ExternalDocumentationElement: () => (/* reexport safe */ _elements_ExternalDocumentation_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]),
77718
+ /* harmony export */ HeaderElement: () => (/* reexport safe */ _elements_Header_mjs__WEBPACK_IMPORTED_MODULE_9__["default"]),
77719
+ /* harmony export */ InfoElement: () => (/* reexport safe */ _elements_Info_mjs__WEBPACK_IMPORTED_MODULE_10__["default"]),
77720
+ /* harmony export */ JsonSchemaDialectElement: () => (/* reexport safe */ _elements_JsonSchemaDialect_mjs__WEBPACK_IMPORTED_MODULE_11__["default"]),
77721
+ /* harmony export */ LicenseElement: () => (/* reexport safe */ _elements_License_mjs__WEBPACK_IMPORTED_MODULE_12__["default"]),
77722
+ /* harmony export */ LinkElement: () => (/* reexport safe */ _elements_Link_mjs__WEBPACK_IMPORTED_MODULE_13__["default"]),
77723
+ /* harmony export */ MediaTypeElement: () => (/* reexport safe */ _elements_MediaType_mjs__WEBPACK_IMPORTED_MODULE_14__["default"]),
77724
+ /* harmony export */ OAuthFlowElement: () => (/* reexport safe */ _elements_OAuthFlow_mjs__WEBPACK_IMPORTED_MODULE_15__["default"]),
77725
+ /* harmony export */ OAuthFlowsElement: () => (/* reexport safe */ _elements_OAuthFlows_mjs__WEBPACK_IMPORTED_MODULE_16__["default"]),
77726
+ /* harmony export */ OpenApi3_1Element: () => (/* reexport safe */ _elements_OpenApi3_1_mjs__WEBPACK_IMPORTED_MODULE_18__["default"]),
77727
+ /* harmony export */ OpenapiElement: () => (/* reexport safe */ _elements_Openapi_mjs__WEBPACK_IMPORTED_MODULE_17__["default"]),
77728
+ /* harmony export */ OperationElement: () => (/* reexport safe */ _elements_Operation_mjs__WEBPACK_IMPORTED_MODULE_19__["default"]),
77729
+ /* harmony export */ ParameterElement: () => (/* reexport safe */ _elements_Parameter_mjs__WEBPACK_IMPORTED_MODULE_20__["default"]),
77730
+ /* harmony export */ PathItemElement: () => (/* reexport safe */ _elements_PathItem_mjs__WEBPACK_IMPORTED_MODULE_21__["default"]),
77731
+ /* harmony export */ PathsElement: () => (/* reexport safe */ _elements_Paths_mjs__WEBPACK_IMPORTED_MODULE_22__["default"]),
77732
+ /* harmony export */ ReferenceElement: () => (/* reexport safe */ _elements_Reference_mjs__WEBPACK_IMPORTED_MODULE_23__["default"]),
77733
+ /* harmony export */ RequestBodyElement: () => (/* reexport safe */ _elements_RequestBody_mjs__WEBPACK_IMPORTED_MODULE_24__["default"]),
77734
+ /* harmony export */ ResponseElement: () => (/* reexport safe */ _elements_Response_mjs__WEBPACK_IMPORTED_MODULE_25__["default"]),
77735
+ /* harmony export */ ResponsesElement: () => (/* reexport safe */ _elements_Responses_mjs__WEBPACK_IMPORTED_MODULE_26__["default"]),
77736
+ /* harmony export */ SchemaElement: () => (/* reexport safe */ _elements_Schema_mjs__WEBPACK_IMPORTED_MODULE_27__["default"]),
77737
+ /* harmony export */ SecurityRequirementElement: () => (/* reexport safe */ _elements_SecurityRequirement_mjs__WEBPACK_IMPORTED_MODULE_28__["default"]),
77738
+ /* harmony export */ SecuritySchemeElement: () => (/* reexport safe */ _elements_SecurityScheme_mjs__WEBPACK_IMPORTED_MODULE_29__["default"]),
77739
+ /* harmony export */ ServerElement: () => (/* reexport safe */ _elements_Server_mjs__WEBPACK_IMPORTED_MODULE_30__["default"]),
77740
+ /* harmony export */ ServerVariableElement: () => (/* reexport safe */ _elements_ServerVariable_mjs__WEBPACK_IMPORTED_MODULE_31__["default"]),
77741
+ /* harmony export */ TagElement: () => (/* reexport safe */ _elements_Tag_mjs__WEBPACK_IMPORTED_MODULE_32__["default"]),
77742
+ /* harmony export */ XmlElement: () => (/* reexport safe */ _elements_Xml_mjs__WEBPACK_IMPORTED_MODULE_33__["default"])
77743
+ /* harmony export */ });
77744
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(60572);
77745
+ /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(34606);
77746
+ /* harmony import */ var _elements_Callback_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(30422);
77747
+ /* harmony import */ var _elements_Components_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(68772);
77748
+ /* harmony import */ var _elements_Contact_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16368);
77749
+ /* harmony import */ var _elements_Discriminator_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(13456);
77750
+ /* harmony import */ var _elements_Encoding_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(67071);
77751
+ /* harmony import */ var _elements_Example_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(91210);
77752
+ /* harmony import */ var _elements_ExternalDocumentation_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(82753);
77753
+ /* harmony import */ var _elements_Header_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(10391);
77754
+ /* harmony import */ var _elements_Info_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(80064);
77755
+ /* harmony import */ var _elements_JsonSchemaDialect_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(66035);
77756
+ /* harmony import */ var _elements_License_mjs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(10673);
77757
+ /* harmony import */ var _elements_Link_mjs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(64720);
77758
+ /* harmony import */ var _elements_MediaType_mjs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(91784);
77759
+ /* harmony import */ var _elements_OAuthFlow_mjs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(73645);
77760
+ /* harmony import */ var _elements_OAuthFlows_mjs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(28308);
77761
+ /* harmony import */ var _elements_Openapi_mjs__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(14540);
77762
+ /* harmony import */ var _elements_OpenApi3_1_mjs__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(81793);
77763
+ /* harmony import */ var _elements_Operation_mjs__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(54427);
77764
+ /* harmony import */ var _elements_Parameter_mjs__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(5849);
77765
+ /* harmony import */ var _elements_PathItem_mjs__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(43360);
77766
+ /* harmony import */ var _elements_Paths_mjs__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(85652);
77767
+ /* harmony import */ var _elements_Reference_mjs__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(36539);
77768
+ /* harmony import */ var _elements_RequestBody_mjs__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(71387);
77769
+ /* harmony import */ var _elements_Response_mjs__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(51193);
77770
+ /* harmony import */ var _elements_Responses_mjs__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(77080);
77771
+ /* harmony import */ var _elements_Schema_mjs__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(26385);
77772
+ /* harmony import */ var _elements_SecurityRequirement_mjs__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(87051);
77773
+ /* harmony import */ var _elements_SecurityScheme_mjs__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(3719);
77774
+ /* harmony import */ var _elements_Server_mjs__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(93497);
77775
+ /* harmony import */ var _elements_ServerVariable_mjs__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(7929);
77776
+ /* harmony import */ var _elements_Tag_mjs__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(24224);
77777
+ /* harmony import */ var _elements_Xml_mjs__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(10931);
77778
+ /* harmony import */ var _specification_mjs__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(56110);
77779
+
77780
+
77781
+
77782
+ /**
77783
+ * OpenAPI 3.1 specification elements.
77784
+ */
77785
+
77786
+
77787
+
77788
+
77789
+
77790
+
77791
+
77792
+
77793
+
77794
+
77795
+
77796
+
77797
+
77798
+
77799
+
77800
+
77801
+
77802
+
77803
+
77804
+
77805
+
77806
+
77807
+
77808
+
77809
+
77810
+
77811
+
77812
+
77813
+
77814
+
77815
+
77816
+
77817
+
77818
+ /**
77819
+ * @public
77820
+ */
77821
+ // Resolve specification to dereference $ref pointers
77822
+ const resolvedSpec = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__.resolveSpecification)(_specification_mjs__WEBPACK_IMPORTED_MODULE_34__["default"]);
77823
+
77824
+ // Extract fixed fields as list of { name, alias?, $visitor }
77825
+ const getFixedFields = fixedFieldsSpec => {
77826
+ return Object.entries(fixedFieldsSpec).map(([name, fieldSpec]) => {
77827
+ if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_1__["default"])(fieldSpec)) {
77828
+ return {
77829
+ name,
77830
+ ...fieldSpec
77831
+ };
77832
+ }
77833
+ return {
77834
+ name,
77835
+ $visitor: fieldSpec
77836
+ };
77837
+ });
77838
+ };
77839
+
77840
+ // OpenAPI 3.1 specification elements
77841
+ Object.defineProperty(_elements_OpenApi3_1_mjs__WEBPACK_IMPORTED_MODULE_18__["default"], 'fixedFields', {
77842
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.OpenApi.fixedFields),
77843
+ enumerable: true
77844
+ });
77845
+ Object.defineProperty(_elements_Info_mjs__WEBPACK_IMPORTED_MODULE_10__["default"], 'fixedFields', {
77846
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Info.fixedFields),
77847
+ enumerable: true
77848
+ });
77849
+ Object.defineProperty(_elements_Contact_mjs__WEBPACK_IMPORTED_MODULE_4__["default"], 'fixedFields', {
77850
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Contact.fixedFields),
77851
+ enumerable: true
77852
+ });
77853
+ Object.defineProperty(_elements_License_mjs__WEBPACK_IMPORTED_MODULE_12__["default"], 'fixedFields', {
77854
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.License.fixedFields),
77855
+ enumerable: true
77856
+ });
77857
+ Object.defineProperty(_elements_Server_mjs__WEBPACK_IMPORTED_MODULE_30__["default"], 'fixedFields', {
77858
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Server.fixedFields),
77859
+ enumerable: true
77860
+ });
77861
+ Object.defineProperty(_elements_ServerVariable_mjs__WEBPACK_IMPORTED_MODULE_31__["default"], 'fixedFields', {
77862
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.ServerVariable.fixedFields),
77863
+ enumerable: true
77864
+ });
77865
+ Object.defineProperty(_elements_Components_mjs__WEBPACK_IMPORTED_MODULE_3__["default"], 'fixedFields', {
77866
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Components.fixedFields),
77867
+ enumerable: true
77868
+ });
77869
+ Object.defineProperty(_elements_PathItem_mjs__WEBPACK_IMPORTED_MODULE_21__["default"], 'fixedFields', {
77870
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.PathItem.fixedFields),
77871
+ enumerable: true
77872
+ });
77873
+ Object.defineProperty(_elements_Operation_mjs__WEBPACK_IMPORTED_MODULE_19__["default"], 'fixedFields', {
77874
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Operation.fixedFields),
77875
+ enumerable: true
77876
+ });
77877
+ Object.defineProperty(_elements_ExternalDocumentation_mjs__WEBPACK_IMPORTED_MODULE_8__["default"], 'fixedFields', {
77878
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.ExternalDocumentation.fixedFields),
77879
+ enumerable: true
77880
+ });
77881
+ Object.defineProperty(_elements_Parameter_mjs__WEBPACK_IMPORTED_MODULE_20__["default"], 'fixedFields', {
77882
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Parameter.fixedFields),
77883
+ enumerable: true
77884
+ });
77885
+ Object.defineProperty(_elements_RequestBody_mjs__WEBPACK_IMPORTED_MODULE_24__["default"], 'fixedFields', {
77886
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.RequestBody.fixedFields),
77887
+ enumerable: true
77888
+ });
77889
+ Object.defineProperty(_elements_MediaType_mjs__WEBPACK_IMPORTED_MODULE_14__["default"], 'fixedFields', {
77890
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.MediaType.fixedFields),
77891
+ enumerable: true
77892
+ });
77893
+ Object.defineProperty(_elements_Encoding_mjs__WEBPACK_IMPORTED_MODULE_6__["default"], 'fixedFields', {
77894
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Encoding.fixedFields),
77895
+ enumerable: true
77896
+ });
77897
+ Object.defineProperty(_elements_Responses_mjs__WEBPACK_IMPORTED_MODULE_26__["default"], 'fixedFields', {
77898
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Responses.fixedFields),
77899
+ enumerable: true
77900
+ });
77901
+ Object.defineProperty(_elements_Response_mjs__WEBPACK_IMPORTED_MODULE_25__["default"], 'fixedFields', {
77902
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Response.fixedFields),
77903
+ enumerable: true
77904
+ });
77905
+ Object.defineProperty(_elements_Example_mjs__WEBPACK_IMPORTED_MODULE_7__["default"], 'fixedFields', {
77906
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Example.fixedFields),
77907
+ enumerable: true
77908
+ });
77909
+ Object.defineProperty(_elements_Link_mjs__WEBPACK_IMPORTED_MODULE_13__["default"], 'fixedFields', {
77910
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Link.fixedFields),
77911
+ enumerable: true
77912
+ });
77913
+ Object.defineProperty(_elements_Header_mjs__WEBPACK_IMPORTED_MODULE_9__["default"], 'fixedFields', {
77914
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Header.fixedFields),
77915
+ enumerable: true
77916
+ });
77917
+ Object.defineProperty(_elements_Tag_mjs__WEBPACK_IMPORTED_MODULE_32__["default"], 'fixedFields', {
77918
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Tag.fixedFields),
77919
+ enumerable: true
77920
+ });
77921
+ Object.defineProperty(_elements_Reference_mjs__WEBPACK_IMPORTED_MODULE_23__["default"], 'fixedFields', {
77922
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Reference.fixedFields),
77923
+ enumerable: true
77924
+ });
77925
+ Object.defineProperty(_elements_Schema_mjs__WEBPACK_IMPORTED_MODULE_27__["default"], 'fixedFields', {
77926
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Schema.fixedFields),
77927
+ enumerable: true
77928
+ });
77929
+ Object.defineProperty(_elements_Discriminator_mjs__WEBPACK_IMPORTED_MODULE_5__["default"], 'fixedFields', {
77930
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.Discriminator.fixedFields),
77931
+ enumerable: true
77932
+ });
77933
+ Object.defineProperty(_elements_Xml_mjs__WEBPACK_IMPORTED_MODULE_33__["default"], 'fixedFields', {
77934
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.XML.fixedFields),
77935
+ enumerable: true
77936
+ });
77937
+ Object.defineProperty(_elements_SecurityScheme_mjs__WEBPACK_IMPORTED_MODULE_29__["default"], 'fixedFields', {
77938
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.SecurityScheme.fixedFields),
77939
+ enumerable: true
77940
+ });
77941
+ Object.defineProperty(_elements_OAuthFlows_mjs__WEBPACK_IMPORTED_MODULE_16__["default"], 'fixedFields', {
77942
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.OAuthFlows.fixedFields),
77943
+ enumerable: true
77944
+ });
77945
+ Object.defineProperty(_elements_OAuthFlow_mjs__WEBPACK_IMPORTED_MODULE_15__["default"], 'fixedFields', {
77946
+ get: () => getFixedFields(resolvedSpec.visitors.document.objects.OAuthFlow.fixedFields),
77947
+ enumerable: true
77948
+ });
77949
+
77950
+
77703
77951
  /***/ },
77704
77952
 
77705
77953
  /***/ 68201
@@ -92169,11 +92417,11 @@ class OpenAPI2BundleVisitor {
92169
92417
  }
92170
92418
 
92171
92419
  /**
92172
- * Normalizes a self-file reference (e.g. `./root.json#/definitions/Pet`)
92420
+ * Normalizes a self-reference (e.g. `./root.json#/definitions/Pet`)
92173
92421
  * to a bare fragment (`#/definitions/Pet`) so the bundled document stays
92174
92422
  * transferable. Bare fragments are returned unchanged.
92175
92423
  */
92176
- normalizeSelfFileRef(ref) {
92424
+ normalizeSelfReference(ref) {
92177
92425
  return ref.startsWith('#') ? ref : _util_url_mjs__WEBPACK_IMPORTED_MODULE_22__.getHash(ref);
92178
92426
  }
92179
92427
 
@@ -92254,16 +92502,8 @@ class OpenAPI2BundleVisitor {
92254
92502
  */
92255
92503
  basenameOf(jsonPointer, baseURI) {
92256
92504
  const tokens = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.parse)(jsonPointer).tree;
92257
- let candidate = tokens.length > 0 ? tokens[tokens.length - 1] : '';
92258
- if (candidate === '') {
92259
- const lastSlash = baseURI.lastIndexOf('/');
92260
- const lastDot = baseURI.lastIndexOf('.');
92261
- const fileName = baseURI.slice(lastSlash + 1);
92262
- // strip the extension only when the last dot belongs to the file name
92263
- candidate = lastDot > lastSlash ? baseURI.slice(lastSlash + 1, lastDot) : fileName;
92264
- }
92265
- if (candidate === '') candidate = 'Schema';
92266
- return candidate;
92505
+ const lastToken = tokens.length > 0 ? tokens[tokens.length - 1] : '';
92506
+ return lastToken || _util_url_mjs__WEBPACK_IMPORTED_MODULE_22__.getBasename(baseURI) || 'Schema';
92267
92507
  }
92268
92508
 
92269
92509
  /**
@@ -92318,9 +92558,9 @@ class OpenAPI2BundleVisitor {
92318
92558
  const isInternalReference = this.entryURI === retrievalURI;
92319
92559
  const isExternalReference = !isInternalReference;
92320
92560
  if (isInternalReference) {
92321
- // normalize self-file references to a bare fragment so the bundled
92561
+ // normalize self-references to a bare fragment so the bundled
92322
92562
  // document stays transferable; bare fragments are left untouched
92323
- referencingElement.set('$ref', this.normalizeSelfFileRef($ref));
92563
+ referencingElement.set('$ref', this.normalizeSelfReference($ref));
92324
92564
  path.skip();
92325
92565
  return;
92326
92566
  }
@@ -92477,9 +92717,9 @@ class OpenAPI2BundleVisitor {
92477
92717
  const isInternalReference = this.entryURI === retrievalURI;
92478
92718
  const isExternalReference = !isInternalReference;
92479
92719
  if (isInternalReference) {
92480
- // normalize self-file references to a bare fragment so the bundled
92720
+ // normalize self-references to a bare fragment so the bundled
92481
92721
  // document stays transferable; bare fragments are left untouched
92482
- pathItemElement.set('$ref', this.normalizeSelfFileRef($ref));
92722
+ pathItemElement.set('$ref', this.normalizeSelfReference($ref));
92483
92723
  return;
92484
92724
  }
92485
92725
 
@@ -92884,11 +93124,11 @@ class OpenAPI3_0BundleVisitor {
92884
93124
  }
92885
93125
 
92886
93126
  /**
92887
- * Normalizes a self-file reference (e.g. `./root.json#/components/schemas/Pet`)
93127
+ * Normalizes a self-reference (e.g. `./root.json#/components/schemas/Pet`)
92888
93128
  * to a bare fragment (`#/components/schemas/Pet`) so the bundled document stays
92889
93129
  * transferable. Bare fragments are returned unchanged.
92890
93130
  */
92891
- normalizeSelfFileRef(ref) {
93131
+ normalizeSelfReference(ref) {
92892
93132
  return ref.startsWith('#') ? ref : _util_url_mjs__WEBPACK_IMPORTED_MODULE_29__.getHash(ref);
92893
93133
  }
92894
93134
 
@@ -92974,16 +93214,8 @@ class OpenAPI3_0BundleVisitor {
92974
93214
  */
92975
93215
  basenameOf(jsonPointer, baseURI) {
92976
93216
  const tokens = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.parse)(jsonPointer).tree;
92977
- let candidate = tokens.length > 0 ? tokens[tokens.length - 1] : '';
92978
- if (candidate === '') {
92979
- const lastSlash = baseURI.lastIndexOf('/');
92980
- const lastDot = baseURI.lastIndexOf('.');
92981
- const fileName = baseURI.slice(lastSlash + 1);
92982
- // strip the extension only when the last dot belongs to the file name
92983
- candidate = lastDot > lastSlash ? baseURI.slice(lastSlash + 1, lastDot) : fileName;
92984
- }
92985
- if (candidate === '') candidate = 'Schema';
92986
- return candidate;
93217
+ const lastToken = tokens.length > 0 ? tokens[tokens.length - 1] : '';
93218
+ return lastToken || _util_url_mjs__WEBPACK_IMPORTED_MODULE_29__.getBasename(baseURI) || 'Schema';
92987
93219
  }
92988
93220
 
92989
93221
  /**
@@ -93033,9 +93265,9 @@ class OpenAPI3_0BundleVisitor {
93033
93265
  const isInternalReference = this.entryURI === retrievalURI;
93034
93266
  const isExternalReference = !isInternalReference;
93035
93267
  if (isInternalReference) {
93036
- // normalize self-file references to a bare fragment so the bundled
93268
+ // normalize self-references to a bare fragment so the bundled
93037
93269
  // document stays transferable; bare fragments are left untouched
93038
- referencingElement.set('$ref', this.normalizeSelfFileRef($ref));
93270
+ referencingElement.set('$ref', this.normalizeSelfReference($ref));
93039
93271
  path.skip();
93040
93272
  return;
93041
93273
  }
@@ -93177,9 +93409,9 @@ class OpenAPI3_0BundleVisitor {
93177
93409
  const isInternalReference = this.entryURI === retrievalURI;
93178
93410
  const isExternalReference = !isInternalReference;
93179
93411
  if (isInternalReference) {
93180
- // normalize self-file references to a bare fragment so the bundled
93412
+ // normalize self-references to a bare fragment so the bundled
93181
93413
  // document stays transferable; bare fragments are left untouched
93182
- pathItemElement.set('$ref', this.normalizeSelfFileRef($ref));
93414
+ pathItemElement.set('$ref', this.normalizeSelfReference($ref));
93183
93415
  return;
93184
93416
  }
93185
93417
 
@@ -93324,9 +93556,9 @@ class OpenAPI3_0BundleVisitor {
93324
93556
  const retrievalURI = this.toBaseURI(operationRef);
93325
93557
  const isInternalReference = this.entryURI === retrievalURI;
93326
93558
  if (isInternalReference) {
93327
- // normalize self-file operationRef to a bare fragment so the bundled
93559
+ // normalize a self-reference operationRef to a bare fragment so the bundled
93328
93560
  // document stays transferable; bare fragments are left untouched
93329
- linkElement.set('operationRef', this.normalizeSelfFileRef(operationRef));
93561
+ linkElement.set('operationRef', this.normalizeSelfReference(operationRef));
93330
93562
  return;
93331
93563
  }
93332
93564
 
@@ -93353,11 +93585,22 @@ class OpenAPI3_0BundleVisitor {
93353
93585
  "use strict";
93354
93586
  __webpack_require__.r(__webpack_exports__);
93355
93587
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
93588
+ /* harmony export */ OpenAPI3_1BundleVisitor: () => (/* reexport safe */ _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]),
93356
93589
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
93357
93590
  /* harmony export */ });
93358
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7822);
93359
- /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(76332);
93360
- /* harmony import */ var _BundleStrategy_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(73723);
93591
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
93592
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
93593
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7822);
93594
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(76332);
93595
+ /* harmony import */ var _Reference_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(82302);
93596
+ /* harmony import */ var _ReferenceSet_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(88526);
93597
+ /* harmony import */ var _BundleStrategy_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(73723);
93598
+ /* harmony import */ var _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(34081);
93599
+
93600
+
93601
+
93602
+
93603
+
93361
93604
 
93362
93605
 
93363
93606
  /**
@@ -93366,7 +93609,7 @@ __webpack_require__.r(__webpack_exports__);
93366
93609
  /**
93367
93610
  * @public
93368
93611
  */
93369
- class OpenAPI3_1BundleStrategy extends _BundleStrategy_mjs__WEBPACK_IMPORTED_MODULE_2__["default"] {
93612
+ class OpenAPI3_1BundleStrategy extends _BundleStrategy_mjs__WEBPACK_IMPORTED_MODULE_6__["default"] {
93370
93613
  constructor(options) {
93371
93614
  super({
93372
93615
  ...(options ?? {}),
@@ -93376,70 +93619,971 @@ class OpenAPI3_1BundleStrategy extends _BundleStrategy_mjs__WEBPACK_IMPORTED_MOD
93376
93619
  canBundle(file) {
93377
93620
  // assert by media type
93378
93621
  if (file.mediaType !== 'text/plain') {
93379
- return _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_0__["default"].includes(file.mediaType);
93622
+ return _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_2__["default"].includes(file.mediaType);
93380
93623
  }
93381
93624
 
93382
93625
  // assert by inspecting ApiDOM
93383
- return (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_1__.isOpenApi3_1Element)(file.parseResult?.result);
93626
+ return (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_3__.isOpenApi3_1Element)(file.parseResult?.result);
93384
93627
  }
93385
- async bundle(file) {
93386
- return file.parseResult;
93628
+ async bundle(file, options) {
93629
+ const immutableRefSet = options.bundle.refSet ?? new _ReferenceSet_mjs__WEBPACK_IMPORTED_MODULE_5__["default"]();
93630
+ const mutableRefSet = new _ReferenceSet_mjs__WEBPACK_IMPORTED_MODULE_5__["default"]();
93631
+ let refSet = immutableRefSet;
93632
+ let reference;
93633
+
93634
+ // determine the initial reference
93635
+ if (!immutableRefSet.has(file.uri)) {
93636
+ reference = new _Reference_mjs__WEBPACK_IMPORTED_MODULE_4__["default"]({
93637
+ uri: file.uri,
93638
+ value: file.parseResult
93639
+ });
93640
+ immutableRefSet.add(reference);
93641
+ } else {
93642
+ // pre-computed refSet was provided as configuration option
93643
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
93644
+ }
93645
+
93646
+ /**
93647
+ * Clone refSet due the bundling process being mutable.
93648
+ * We don't want to mutate the original refSet and the references.
93649
+ */
93650
+ if (options.bundle.immutable) {
93651
+ immutableRefSet.refs.map(ref => new _Reference_mjs__WEBPACK_IMPORTED_MODULE_4__["default"]({
93652
+ ...ref,
93653
+ value: (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(ref.value)
93654
+ })).forEach(ref => mutableRefSet.add(ref));
93655
+ reference = mutableRefSet.find(ref => ref.uri === file.uri);
93656
+ refSet = mutableRefSet;
93657
+ }
93658
+ const visitor = new _visitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
93659
+ reference: reference,
93660
+ options
93661
+ });
93662
+ await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__.traverseAsync)(refSet.rootRef.value, visitor, {
93663
+ mutable: true
93664
+ });
93665
+ const parseResult = reference.value;
93666
+
93667
+ /**
93668
+ * Release all memory if this refSet was not provided as a configuration option.
93669
+ * If provided as configuration option, then provider is responsible for cleanup.
93670
+ */
93671
+ if (options.bundle.refSet === null) {
93672
+ immutableRefSet.clean();
93673
+ }
93674
+ mutableRefSet.clean();
93675
+ return parseResult;
93387
93676
  }
93388
93677
  }
93678
+
93389
93679
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OpenAPI3_1BundleStrategy);
93390
93680
 
93391
93681
  /***/ },
93392
93682
 
93393
- /***/ 78814
93683
+ /***/ 34081
93394
93684
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
93395
93685
 
93396
93686
  "use strict";
93397
93687
  __webpack_require__.r(__webpack_exports__);
93398
93688
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
93399
- /* harmony export */ sanitizeComponentName: () => (/* binding */ sanitizeComponentName),
93400
- /* harmony export */ toPascalCase: () => (/* binding */ toPascalCase),
93401
- /* harmony export */ uniqueName: () => (/* binding */ uniqueName)
93689
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
93402
93690
  /* harmony export */ });
93403
- /**
93404
- * Upper-cases the first letter of each whitespace-separated word and joins
93405
- * them, e.g. `pet model` -> `PetModel`.
93406
- *
93407
- * @public
93408
- */
93409
- const toPascalCase = value => value.trim().split(/\s+/).map(word => word.replace(/^[a-z]/, char => char.toUpperCase())).join('');
93691
+ /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(87009);
93692
+ /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6352);
93693
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25162);
93694
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12111);
93695
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(97071);
93696
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(84660);
93697
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(37205);
93698
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(44673);
93699
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(16280);
93700
+ /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(44641);
93701
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(80796);
93702
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(12020);
93703
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(61198);
93704
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(21314);
93705
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(24329);
93706
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(29881);
93707
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(76332);
93708
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(23806);
93709
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(52645);
93710
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(23031);
93711
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(63842);
93712
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(87455);
93713
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(16363);
93714
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(55122);
93715
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(71117);
93716
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(72257);
93717
+ /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(69511);
93718
+ /* harmony import */ var _errors_BundleError_mjs__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(89693);
93719
+ /* harmony import */ var _errors_UnresolvableReferenceError_mjs__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(34968);
93720
+ /* harmony import */ var _errors_MaximumBundleDepthError_mjs__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(55086);
93721
+ /* harmony import */ var _errors_MaximumResolveDepthError_mjs__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(10476);
93722
+ /* harmony import */ var _errors_EvaluationJsonSchemaUriError_mjs__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(22820);
93723
+ /* harmony import */ var _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(18917);
93724
+ /* harmony import */ var _parse_index_mjs__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(85533);
93725
+ /* harmony import */ var _Reference_mjs__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(82302);
93726
+ /* harmony import */ var _File_mjs__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(29217);
93727
+ /* harmony import */ var _dereference_strategies_openapi_3_1_selectors_$anchor_mjs__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(10533);
93728
+ /* harmony import */ var _dereference_strategies_openapi_3_1_selectors_uri_mjs__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(92500);
93729
+ /* harmony import */ var _dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(29587);
93730
+ /* harmony import */ var _util_mjs__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(78814);
93410
93731
 
93411
- /**
93412
- * Replaces characters that are invalid in a Components Object name with `-`,
93413
- * then collapses repeated separators and trims leading/trailing ones.
93414
- *
93415
- * @public
93416
- */
93417
- const sanitizeComponentName = value => value.replace(/[^a-zA-Z0-9.\-_]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
93418
93732
 
93419
- /**
93420
- * Returns a collision-free name by suffixing `-2`, `-3`, ... onto `candidate`
93421
- * until `isTaken` reports it free. `isTaken` decides what counts as taken
93422
- * (e.g. names already placed in or reserved for a Components Object field).
93423
- *
93424
- * @public
93425
- */
93426
- const uniqueName = (candidate, isTaken) => {
93427
- if (!isTaken(candidate)) {
93428
- return candidate;
93429
- }
93430
- let counter = 2;
93431
- while (isTaken(`${candidate}-${counter}`)) {
93432
- counter += 1;
93433
- }
93434
- return `${candidate}-${counter}`;
93435
- };
93436
93733
 
93437
- /***/ },
93438
93734
 
93439
- /***/ 29807
93440
- (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
93441
93735
 
93442
- "use strict";
93736
+
93737
+
93738
+
93739
+
93740
+
93741
+
93742
+
93743
+
93744
+
93745
+
93746
+
93747
+
93748
+
93749
+
93750
+
93751
+ /**
93752
+ * Maps the `referenced-element` meta value (set during refraction) to the
93753
+ * Components Object field where the referenced element should be hoisted.
93754
+ * Field names are sourced from the Components Object fixed fields so they
93755
+ * cannot drift from the namespace definition.
93756
+ */
93757
+ const cf = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__.fixedFields)(_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.ComponentsElement, {
93758
+ indexed: true
93759
+ });
93760
+ const componentFieldByReferencedElement = {
93761
+ schema: cf.schemas.name,
93762
+ response: cf.responses.name,
93763
+ parameter: cf.parameters.name,
93764
+ example: cf.examples.name,
93765
+ requestBody: cf.requestBodies.name,
93766
+ header: cf.headers.name,
93767
+ securityScheme: cf.securitySchemes.name,
93768
+ link: cf.links.name,
93769
+ callback: cf.callbacks.name,
93770
+ pathItem: cf.pathItems.name
93771
+ };
93772
+
93773
+ /**
93774
+ * Maps a Components Object field to the named-content element the namespace
93775
+ * uses for it, so a bundle-created field matches a parsed/refracted one
93776
+ * (e.g. carries the `components-schemas` class) rather than being a generic
93777
+ * object.
93778
+ */
93779
+ const componentFieldElementByField = {
93780
+ [cf.schemas.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_25__["default"],
93781
+ [cf.responses.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_24__["default"],
93782
+ [cf.parameters.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_21__["default"],
93783
+ [cf.examples.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_17__["default"],
93784
+ [cf.requestBodies.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_23__["default"],
93785
+ [cf.headers.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_19__["default"],
93786
+ [cf.securitySchemes.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_26__["default"],
93787
+ [cf.links.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_20__["default"],
93788
+ [cf.callbacks.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_15__["default"],
93789
+ [cf.pathItems.name]: _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_22__["default"]
93790
+ };
93791
+
93792
+ /**
93793
+ * @public
93794
+ */
93795
+
93796
+ /**
93797
+ * @public
93798
+ */
93799
+ class OpenAPI3_1BundleVisitor {
93800
+ reference;
93801
+ options;
93802
+
93803
+ /**
93804
+ * The base URI (without hash) of the entry document. A reference is
93805
+ * considered internal when it resolves to this URI and external otherwise.
93806
+ * Derived from the shared refSet's root reference.
93807
+ */
93808
+ get entryURI() {
93809
+ return _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.refSet?.rootRef?.uri ?? '');
93810
+ }
93811
+
93812
+ /**
93813
+ * The entry parse result. Derived from the shared refSet's root reference.
93814
+ */
93815
+ get entryParseResult() {
93816
+ return this.reference.refSet.rootRef.value;
93817
+ }
93818
+
93819
+ /**
93820
+ * The entry document element. Hoisted external fragments are placed into its
93821
+ * `components` object. The `canBundle` guard guarantees it is an
93822
+ * OpenApi3_1Element.
93823
+ */
93824
+ get entryResult() {
93825
+ return this.entryParseResult.result;
93826
+ }
93827
+
93828
+ /**
93829
+ * Shared across the entry document and every external document visitor.
93830
+ * Guarantees each external fragment is hoisted exactly once and gives us a
93831
+ * stable internal pointer to rewrite every referencing element to.
93832
+ */
93833
+ assignments;
93834
+
93835
+ /**
93836
+ * Component names already reserved per Components Object field. Reserved
93837
+ * before recursion so collision suffixing (`Pet`, `Pet-2`, ...) accounts for
93838
+ * components that are still being bundled.
93839
+ */
93840
+ reservedNames;
93841
+
93842
+ /**
93843
+ * Caches refracted fragments keyed by source element and target element type.
93844
+ * The type is part of the key because the same source can be refracted into
93845
+ * different semantic elements depending on the referencing context (e.g. a
93846
+ * generic object referenced once as a Parameter and once as a Response).
93847
+ */
93848
+ refractCache;
93849
+ constructor({
93850
+ reference,
93851
+ options,
93852
+ assignments = new Map(),
93853
+ reservedNames = new Map(),
93854
+ refractCache = new WeakMap()
93855
+ }) {
93856
+ this.reference = reference;
93857
+ this.options = options;
93858
+ this.assignments = assignments;
93859
+ this.reservedNames = reservedNames;
93860
+ this.refractCache = refractCache;
93861
+ }
93862
+ getRefracted(source, type) {
93863
+ return this.refractCache.get(source)?.get(type);
93864
+ }
93865
+ setRefracted(source, type, refracted) {
93866
+ let byType = this.refractCache.get(source);
93867
+ if (byType === undefined) {
93868
+ byType = new Map();
93869
+ this.refractCache.set(source, byType);
93870
+ }
93871
+ byType.set(type, refracted);
93872
+ }
93873
+ toBaseURI(uri) {
93874
+ return _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.resolve(this.reference.uri, _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.sanitize(_util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(uri)));
93875
+ }
93876
+ async toReference(uri) {
93877
+ // detect maximum depth of resolution
93878
+ if (this.reference.depth >= this.options.resolve.maxDepth) {
93879
+ throw new _errors_MaximumResolveDepthError_mjs__WEBPACK_IMPORTED_MODULE_30__["default"](`Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"`, {
93880
+ maxDepth: this.options.resolve.maxDepth,
93881
+ uri: this.reference.uri
93882
+ });
93883
+ }
93884
+ const baseURI = this.toBaseURI(uri);
93885
+ const {
93886
+ refSet
93887
+ } = this.reference;
93888
+
93889
+ // we've already processed this Reference in past
93890
+ if (refSet.has(baseURI)) {
93891
+ return refSet.find((0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(baseURI, 'uri'));
93892
+ }
93893
+ const parseResult = await (0,_parse_index_mjs__WEBPACK_IMPORTED_MODULE_33__["default"])(_util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.unsanitize(baseURI), {
93894
+ ...this.options,
93895
+ parse: {
93896
+ ...this.options.parse,
93897
+ mediaType: 'text/plain'
93898
+ }
93899
+ });
93900
+ const reference = new _Reference_mjs__WEBPACK_IMPORTED_MODULE_34__["default"]({
93901
+ uri: baseURI,
93902
+ value: parseResult,
93903
+ depth: this.reference.depth + 1
93904
+ });
93905
+ refSet.add(reference);
93906
+ return reference;
93907
+ }
93908
+
93909
+ /**
93910
+ * Normalizes a self-reference (e.g. `./root.json#/components/schemas/Pet`)
93911
+ * to a bare fragment (`#/components/schemas/Pet`) so the bundled document stays
93912
+ * transferable. Bare fragments are returned unchanged.
93913
+ */
93914
+ normalizeSelfReference(ref) {
93915
+ return ref.startsWith('#') ? ref : _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.getHash(ref);
93916
+ }
93917
+
93918
+ /**
93919
+ * Handles an error according to the `bundle.continueOnError` option.
93920
+ *
93921
+ * For new errors: wraps in UnresolvableReferenceError with structured
93922
+ * context. For errors already wrapped by a nested visitor: prepends the
93923
+ * current hop to the trace.
93924
+ *
93925
+ * Inner/intermediate visitors always throw to let the trace accumulate. Only
93926
+ * the entry document visitor respects continueOnError (callback/swallow/throw).
93927
+ */
93928
+ handleError(message, error, referencingElement, refFieldName, refFieldValue, visitorPath) {
93929
+ // a collision reported as `error` is a deliberate hard stop with no
93930
+ // resolution-failure analog, so pass it through unchanged. A maxDepth
93931
+ // breach (MaximumBundleDepthError, which also extends BundleError) is a
93932
+ // resolution failure and flows through below — wrapped and subject to
93933
+ // continueOnError, like dereferencing.
93934
+ if (error instanceof _errors_BundleError_mjs__WEBPACK_IMPORTED_MODULE_27__["default"] && !(error instanceof _errors_MaximumBundleDepthError_mjs__WEBPACK_IMPORTED_MODULE_29__["default"])) {
93935
+ throw error;
93936
+ }
93937
+ const {
93938
+ continueOnError
93939
+ } = this.options.bundle;
93940
+ const isEntryDocument = _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.refSet?.rootRef?.uri ?? '') === this.reference.uri;
93941
+ const uri = this.reference.uri;
93942
+ const type = referencingElement.element;
93943
+ const codeFrame = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement);
93944
+ const location = visitorPath.formatPath();
93945
+ const hop = {
93946
+ uri,
93947
+ type,
93948
+ refFieldName,
93949
+ refFieldValue,
93950
+ location,
93951
+ codeFrame
93952
+ };
93953
+ let unresolvedError;
93954
+ if (error instanceof _errors_UnresolvableReferenceError_mjs__WEBPACK_IMPORTED_MODULE_28__["default"]) {
93955
+ // @ts-ignore
93956
+ error.trace = [hop, ...error.trace];
93957
+ unresolvedError = error;
93958
+ } else {
93959
+ unresolvedError = new _errors_UnresolvableReferenceError_mjs__WEBPACK_IMPORTED_MODULE_28__["default"](message, {
93960
+ cause: error,
93961
+ type,
93962
+ uri,
93963
+ location,
93964
+ codeFrame,
93965
+ refFieldName,
93966
+ refFieldValue,
93967
+ trace: []
93968
+ });
93969
+ }
93970
+ if (!isEntryDocument || continueOnError === false) throw unresolvedError;
93971
+ if (typeof continueOnError === 'function') continueOnError(unresolvedError);
93972
+ }
93973
+
93974
+ /**
93975
+ * Lazily creates the Components Object (and the requested field within it)
93976
+ * on the entry document, returning the field where a fragment is hoisted.
93977
+ */
93978
+ ensureComponentsField(field) {
93979
+ const entryResult = this.entryResult;
93980
+ let components = entryResult.components;
93981
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(components)) {
93982
+ components = new _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_18__.ComponentsElement();
93983
+ entryResult.components = components;
93984
+ }
93985
+ let fieldElement = components.get(field);
93986
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isObjectElement)(fieldElement)) {
93987
+ const FieldElement = componentFieldElementByField[field] ?? _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__["default"];
93988
+ fieldElement = new FieldElement();
93989
+ components.set(field, fieldElement);
93990
+ }
93991
+ return fieldElement;
93992
+ }
93993
+
93994
+ /**
93995
+ * Derives a component name from the referenced JSON Pointer's last token,
93996
+ * falling back to the referenced file's basename.
93997
+ */
93998
+ basenameOf(jsonPointer, baseURI) {
93999
+ const tokens = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.parse)(jsonPointer).tree;
94000
+ const lastToken = tokens.length > 0 ? tokens[tokens.length - 1] : '';
94001
+ return lastToken || _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.getBasename(baseURI) || 'Schema';
94002
+ }
94003
+
94004
+ /**
94005
+ * Computes the base component name (before collision suffixing) according to
94006
+ * the configured naming strategy.
94007
+ */
94008
+ baseName(element, field, jsonPointer, baseURI) {
94009
+ // strategy specific options take precedence over the top-level bundle options
94010
+ const componentNamesStrategy = this.options.bundle.strategyOpts['openapi-3-1']?.componentNamesStrategy ?? this.options.bundle.componentNamesStrategy;
94011
+ if (typeof componentNamesStrategy === 'function') {
94012
+ const resolved = componentNamesStrategy({
94013
+ element,
94014
+ field,
94015
+ jsonPointer,
94016
+ baseURI
94017
+ });
94018
+ if (typeof resolved === 'string' && resolved !== '') {
94019
+ return resolved;
94020
+ }
94021
+ return this.basenameOf(jsonPointer, baseURI);
94022
+ }
94023
+ if (componentNamesStrategy === 'title') {
94024
+ 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;
94025
+ if (typeof title === 'string' && title.trim() !== '') {
94026
+ const name = (0,_util_mjs__WEBPACK_IMPORTED_MODULE_39__.sanitizeComponentName)((0,_util_mjs__WEBPACK_IMPORTED_MODULE_39__.toPascalCase)(title));
94027
+ if (name !== '') return name;
94028
+ }
94029
+ // fall back to basename when no usable title is present
94030
+ }
94031
+ return this.basenameOf(jsonPointer, baseURI);
94032
+ }
94033
+
94034
+ /**
94035
+ * Computes a collision-free component name within the target field. A name is
94036
+ * taken if it's already placed in components or reserved by a component that
94037
+ * is still being bundled (reserved before recursion).
94038
+ */
94039
+ uniqueName(candidate, field) {
94040
+ const fieldElement = this.ensureComponentsField(field);
94041
+ const reserved = this.reservedNames.get(field) ?? new Set();
94042
+ return (0,_util_mjs__WEBPACK_IMPORTED_MODULE_39__.uniqueName)(candidate, name => fieldElement.hasKey(name) || reserved.has(name));
94043
+ }
94044
+
94045
+ /**
94046
+ * Reports a collision-forced rename according to the configured severity.
94047
+ * A rename means two distinct targets resolved to the same name; each keeps
94048
+ * its own component (and origin), so report the rename per severity.
94049
+ */
94050
+ reportNameCollision(preferredName, componentName, field) {
94051
+ // strategy specific options take precedence over the top-level bundle options
94052
+ const onComponentNameCollision = this.options.bundle.strategyOpts['openapi-3-1']?.onComponentNameCollision ?? this.options.bundle.onComponentNameCollision;
94053
+ if (componentName === preferredName || onComponentNameCollision === 'off') {
94054
+ return;
94055
+ }
94056
+ const message = `Component "${preferredName}" in components/${field} is referenced with the same name but different content. Renamed to "${componentName}".`;
94057
+ if (onComponentNameCollision === 'error') {
94058
+ throw new _errors_BundleError_mjs__WEBPACK_IMPORTED_MODULE_27__["default"](message);
94059
+ }
94060
+ const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
94061
+ annotation.classes.push('warning');
94062
+ annotation.code = 'bundle-component-name-collision';
94063
+ // append (never prepend) so the result element stays ahead of annotations
94064
+ this.entryParseResult.content.push(annotation);
94065
+ }
94066
+ async ReferenceElement(path) {
94067
+ const referencingElement = path.node;
94068
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
94069
+ const retrievalURI = this.toBaseURI($ref);
94070
+ const isInternalReference = this.entryURI === retrievalURI;
94071
+ const isExternalReference = !isInternalReference;
94072
+ if (isInternalReference) {
94073
+ // normalize self-references to a bare fragment so the bundled
94074
+ // document stays transferable; bare fragments are left untouched
94075
+ referencingElement.set('$ref', this.normalizeSelfReference($ref));
94076
+ path.skip();
94077
+ return;
94078
+ }
94079
+
94080
+ // honor the resolve.external switch
94081
+ if (!this.options.resolve.external && isExternalReference) {
94082
+ path.skip();
94083
+ return;
94084
+ }
94085
+ const $refBaseURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.resolve(retrievalURI, $ref);
94086
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
94087
+
94088
+ // the target bucket depends on the referencing context, so it's part of the
94089
+ // identity: the same external target referenced as e.g. both a parameter and
94090
+ // a response must be hoisted into both components fields. The refractor sets
94091
+ // `referenced-element` for every Reference Object position; the `schemas`
94092
+ // fallback is a defensive default for the (unexpected) untagged case.
94093
+ const referencedElementType = referencingElement.meta.get('referenced-element');
94094
+ const field = componentFieldByReferencedElement[referencedElementType] ?? componentFieldByReferencedElement.schema;
94095
+ const canonicalKey = `${field}\t${retrievalURI}#${jsonPointer}`;
94096
+
94097
+ // already hoisted (or being hoisted) — just rewrite the pointer.
94098
+ //
94099
+ // this is also how circular references terminate: the assignment is
94100
+ // reserved BEFORE recursing into the fragment (see below), so a reference
94101
+ // that cycles back (directly or indirectly) finds its pointer already
94102
+ // reserved here and is rewritten without recursing. Cycles are deliberately
94103
+ // preserved as internal `$ref`s pointing at each other — that is valid,
94104
+ // serializable output; resolving the cycle (if desired) is dereferencing's
94105
+ // job, not bundling's.
94106
+ if (this.assignments.has(canonicalKey)) {
94107
+ referencingElement.set('$ref', this.assignments.get(canonicalKey));
94108
+ path.skip();
94109
+ return;
94110
+ }
94111
+ try {
94112
+ // detect maximum depth of bundling
94113
+ if (this.reference.depth >= this.options.bundle.maxDepth) {
94114
+ throw new _errors_MaximumBundleDepthError_mjs__WEBPACK_IMPORTED_MODULE_29__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
94115
+ maxDepth: this.options.bundle.maxDepth,
94116
+ uri: this.reference.uri
94117
+ });
94118
+ }
94119
+ const reference = await this.toReference($ref);
94120
+
94121
+ // possibly non-semantic fragment
94122
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
94123
+
94124
+ // apply semantics to the fragment so nested references become Reference Objects
94125
+ if (referencedElement.element !== referencedElementType && !(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isReferenceElement)(referencedElement)) {
94126
+ const cached = this.getRefracted(referencedElement, referencedElementType);
94127
+ if (cached !== undefined) {
94128
+ referencedElement = cached;
94129
+ } else if ((0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_13__.isReferenceLikeElement)(referencedElement)) {
94130
+ const sourceElement = referencedElement;
94131
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.refractReference)(referencedElement);
94132
+ referencedElement.meta.set('referenced-element', referencedElementType);
94133
+ this.setRefracted(sourceElement, referencedElementType, referencedElement);
94134
+ } else {
94135
+ const sourceElement = referencedElement;
94136
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__["default"])(referencedElement, {
94137
+ element: referencedElementType
94138
+ });
94139
+ this.setRefracted(sourceElement, referencedElementType, referencedElement);
94140
+ }
94141
+ }
94142
+ const preferredName = this.baseName(referencedElement, field, jsonPointer, retrievalURI);
94143
+ const componentName = this.uniqueName(preferredName, field);
94144
+ const internalPointer = `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.escape)(componentName)}`;
94145
+ this.reportNameCollision(preferredName, componentName, field);
94146
+
94147
+ // reserve the assignment and component name before recursing so cyclic
94148
+ // references terminate
94149
+ this.assignments.set(canonicalKey, internalPointer);
94150
+ if (!this.reservedNames.has(field)) this.reservedNames.set(field, new Set());
94151
+ this.reservedNames.get(field).add(componentName);
94152
+
94153
+ // own a copy of the fragment and bundle its own external references
94154
+ const hoistedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(referencedElement);
94155
+ const visitor = new OpenAPI3_1BundleVisitor({
94156
+ reference,
94157
+ options: this.options,
94158
+ assignments: this.assignments,
94159
+ reservedNames: this.reservedNames,
94160
+ refractCache: this.refractCache
94161
+ });
94162
+ const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(hoistedElement, visitor, {
94163
+ mutable: true
94164
+ });
94165
+
94166
+ // annotate the hoisted fragment with info about its origin
94167
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isElement)(bundledElement)) {
94168
+ bundledElement.meta.set('ref-origin', reference.uri);
94169
+ }
94170
+
94171
+ // place the bundled fragment into the entry document's components
94172
+ this.ensureComponentsField(field).set(componentName, bundledElement);
94173
+
94174
+ // rewrite the referencing element to point at the hoisted fragment
94175
+ referencingElement.set('$ref', internalPointer);
94176
+ path.skip();
94177
+ } catch (error) {
94178
+ this.handleError(`Error while bundling Reference Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
94179
+ path.skip();
94180
+ }
94181
+ }
94182
+
94183
+ /**
94184
+ * Unlike OpenAPI 3.0 (which has no `components.pathItems` field and therefore
94185
+ * inlines external Path Items in place), OpenAPI 3.1 hoists an external Path
94186
+ * Item Object into `components.pathItems` and rewrites the referencing `$ref`
94187
+ * to an internal pointer — mirroring how Reference Objects are bundled.
94188
+ * Sibling fields next to the `$ref` (e.g. `summary`, `description`) are kept
94189
+ * on the referencing element.
94190
+ */
94191
+ async PathItemElement(path) {
94192
+ const pathItemElement = path.node;
94193
+
94194
+ // ignore Path Item Objects without a $ref field
94195
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(pathItemElement.$ref)) {
94196
+ return;
94197
+ }
94198
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(pathItemElement.$ref);
94199
+ const retrievalURI = this.toBaseURI($ref);
94200
+ const isInternalReference = this.entryURI === retrievalURI;
94201
+ const isExternalReference = !isInternalReference;
94202
+ if (isInternalReference) {
94203
+ // normalize self-references to a bare fragment so the bundled
94204
+ // document stays transferable; bare fragments are left untouched
94205
+ pathItemElement.set('$ref', this.normalizeSelfReference($ref));
94206
+ path.skip();
94207
+ return;
94208
+ }
94209
+
94210
+ // honor the resolve.external switch
94211
+ if (!this.options.resolve.external && isExternalReference) {
94212
+ path.skip();
94213
+ return;
94214
+ }
94215
+ const $refBaseURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.resolve(retrievalURI, $ref);
94216
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
94217
+ const field = cf.pathItems.name;
94218
+ const canonicalKey = `${field}\t${retrievalURI}#${jsonPointer}`;
94219
+
94220
+ // already hoisted (or being hoisted) — just rewrite the pointer. The
94221
+ // assignment is reserved BEFORE recursing, so a circular Path Item chain
94222
+ // terminates here with an internal pointer instead of recursing forever.
94223
+ if (this.assignments.has(canonicalKey)) {
94224
+ pathItemElement.set('$ref', this.assignments.get(canonicalKey));
94225
+ path.skip();
94226
+ return;
94227
+ }
94228
+ try {
94229
+ // detect maximum depth of bundling
94230
+ if (this.reference.depth >= this.options.bundle.maxDepth) {
94231
+ throw new _errors_MaximumBundleDepthError_mjs__WEBPACK_IMPORTED_MODULE_29__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
94232
+ maxDepth: this.options.bundle.maxDepth,
94233
+ uri: this.reference.uri
94234
+ });
94235
+ }
94236
+ const reference = await this.toReference($ref);
94237
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(reference.value.result, jsonPointer);
94238
+
94239
+ // apply Path Item semantics to the referenced fragment
94240
+ if (!(0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_16__.isPathItemElement)(referencedElement)) {
94241
+ const cached = this.getRefracted(referencedElement, 'pathItem');
94242
+ if (cached !== undefined) {
94243
+ referencedElement = cached;
94244
+ } else {
94245
+ const sourceElement = referencedElement;
94246
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_14__.refractPathItem)(referencedElement);
94247
+ this.setRefracted(sourceElement, 'pathItem', referencedElement);
94248
+ }
94249
+ }
94250
+ const preferredName = this.baseName(referencedElement, field, jsonPointer, retrievalURI);
94251
+ const componentName = this.uniqueName(preferredName, field);
94252
+ const internalPointer = `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.escape)(componentName)}`;
94253
+ this.reportNameCollision(preferredName, componentName, field);
94254
+
94255
+ // reserve the assignment and component name before recursing so cyclic
94256
+ // references terminate
94257
+ this.assignments.set(canonicalKey, internalPointer);
94258
+ if (!this.reservedNames.has(field)) this.reservedNames.set(field, new Set());
94259
+ this.reservedNames.get(field).add(componentName);
94260
+
94261
+ // own a copy of the fragment and bundle its own external references
94262
+ const hoistedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(referencedElement);
94263
+ const visitor = new OpenAPI3_1BundleVisitor({
94264
+ reference,
94265
+ options: this.options,
94266
+ assignments: this.assignments,
94267
+ reservedNames: this.reservedNames,
94268
+ refractCache: this.refractCache
94269
+ });
94270
+ const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(hoistedElement, visitor, {
94271
+ mutable: true
94272
+ });
94273
+
94274
+ // a `$ref` surviving on the hoisted Path Item means it pointed at another
94275
+ // Path Item (a chain or cycle); it has already been rewritten to an
94276
+ // internal `#/components/pathItems/...` pointer by the child traversal
94277
+ bundledElement.meta.set('ref-origin', reference.uri);
94278
+
94279
+ // place the bundled Path Item into the entry document's components
94280
+ this.ensureComponentsField(field).set(componentName, bundledElement);
94281
+
94282
+ // rewrite the referencing Path Item to point at the hoisted one, keeping
94283
+ // any sibling fields (e.g. summary, description) next to the $ref
94284
+ pathItemElement.set('$ref', internalPointer);
94285
+ path.skip();
94286
+ } catch (error) {
94287
+ this.handleError(`Error while bundling Path Item Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, pathItemElement, '$ref', $ref, path);
94288
+ path.skip();
94289
+ }
94290
+ }
94291
+
94292
+ /**
94293
+ * Schema Objects in OpenAPI 3.1 are a JSON Schema 2020-12 dialect, so they are
94294
+ * bundled per the JSON Schema Compound Document rules: the external schema
94295
+ * RESOURCE is embedded verbatim into `components.schemas` (carrying its `$id`),
94296
+ * and the referencing `$ref` is left UNCHANGED — it keeps resolving against the
94297
+ * embedded resource's `$id`. This mirrors the canonical hyperjump
94298
+ * `json-schema-bundle` behavior (the whole resource is embedded once, keyed by
94299
+ * its `$id`; references are not rewritten).
94300
+ */
94301
+ async SchemaElement(path) {
94302
+ const referencingElement = path.node;
94303
+
94304
+ // skip current referencing schema as $ref keyword was not defined
94305
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencingElement.$ref)) {
94306
+ return;
94307
+ }
94308
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(referencingElement.$ref);
94309
+ try {
94310
+ // compute baseURI using rules around $id and $ref keywords. The current
94311
+ // document's URI is the retrieval URI — derive it directly (not via
94312
+ // toReference) so an internal $ref needs no resolution and never trips the
94313
+ // resolve.maxDepth guard, matching how ReferenceElement returns early.
94314
+ const retrievalURI = this.reference.uri;
94315
+ const $refBaseURI = (0,_dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__.resolveSchema$refField)(retrievalURI, referencingElement);
94316
+ const $refBaseURIStrippedHash = _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash($refBaseURI);
94317
+ const file = new _File_mjs__WEBPACK_IMPORTED_MODULE_35__["default"]({
94318
+ uri: $refBaseURIStrippedHash
94319
+ });
94320
+ const isUnknownURI = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(r => r.canRead(file), this.options.resolve.resolvers);
94321
+ const isURL = !isUnknownURI;
94322
+ const isInternalReference = _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.uri) === $refBaseURIStrippedHash;
94323
+ const isExternalReference = !isInternalReference;
94324
+
94325
+ // internal Schema Object $refs resolve against the in-document $id graph;
94326
+ // leaving them untouched keeps that resolution valid. Unlike Reference
94327
+ // Objects, a JSON Schema $ref is NOT normalized to a bare fragment.
94328
+ if (isInternalReference) {
94329
+ return;
94330
+ }
94331
+
94332
+ // honor the resolve.external switch
94333
+ if (!this.options.resolve.external && isExternalReference) {
94334
+ return;
94335
+ }
94336
+
94337
+ // detect maximum depth of bundling before fetching the external resource,
94338
+ // matching ReferenceElement/PathItemElement (which check before toReference)
94339
+ if (this.reference.depth >= this.options.bundle.maxDepth) {
94340
+ throw new _errors_MaximumBundleDepthError_mjs__WEBPACK_IMPORTED_MODULE_29__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
94341
+ maxDepth: this.options.bundle.maxDepth,
94342
+ uri: this.reference.uri
94343
+ });
94344
+ }
94345
+
94346
+ // locate the external schema resource the $ref targets, reusing the
94347
+ // dereference strategy's classification. First try to resolve the target
94348
+ // as a canonical URI / URL against the current document's $id graph; if
94349
+ // that fails, fall back to fetching the external document and resolving
94350
+ // the fragment there as a $anchor or JSON Pointer.
94351
+ let schemaReference = this.reference;
94352
+ try {
94353
+ const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
94354
+ (0,_dereference_strategies_openapi_3_1_selectors_uri_mjs__WEBPACK_IMPORTED_MODULE_37__.evaluate)($refBaseURI, referenceAsSchema);
94355
+ } catch (error) {
94356
+ if (isURL && error instanceof _errors_EvaluationJsonSchemaUriError_mjs__WEBPACK_IMPORTED_MODULE_31__["default"]) {
94357
+ if ((0,_dereference_strategies_openapi_3_1_selectors_$anchor_mjs__WEBPACK_IMPORTED_MODULE_36__.isAnchor)((0,_dereference_strategies_openapi_3_1_selectors_$anchor_mjs__WEBPACK_IMPORTED_MODULE_36__.uriToAnchor)($refBaseURI))) {
94358
+ schemaReference = await this.toReference(_util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.unsanitize($refBaseURI));
94359
+ const selector = (0,_dereference_strategies_openapi_3_1_selectors_$anchor_mjs__WEBPACK_IMPORTED_MODULE_36__.uriToAnchor)($refBaseURI);
94360
+ const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
94361
+ (0,_dereference_strategies_openapi_3_1_selectors_$anchor_mjs__WEBPACK_IMPORTED_MODULE_36__.evaluate)(selector, referenceAsSchema);
94362
+ } else {
94363
+ schemaReference = await this.toReference(_util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.unsanitize($refBaseURI));
94364
+ const selector = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.URIFragmentIdentifier.fromURIReference($refBaseURI);
94365
+ const referenceAsSchema = (0,_dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
94366
+ (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.evaluate)(referenceAsSchema, selector);
94367
+ }
94368
+ } else {
94369
+ throw error;
94370
+ }
94371
+ }
94372
+
94373
+ // a $ref that resolves (by $id/$anchor/pointer) within the current document
94374
+ // is internal even when its URI form (e.g. a URN or absolute $id) is not a
94375
+ // bare fragment. Leave it untouched — it resolves against the in-document
94376
+ // $id graph, and embedding the current document into itself would be wrong.
94377
+ if (_util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(schemaReference.uri) === _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(this.reference.uri)) {
94378
+ return;
94379
+ }
94380
+
94381
+ // the resource to embed is the WHOLE external document (its root schema),
94382
+ // identified by its $id. A $ref into a fragment of the document embeds the
94383
+ // entire document resource once; the fragment keeps resolving against the
94384
+ // embedded $id.
94385
+ const resourceRoot = (0,_dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__.maybeRefractToSchemaElement)(schemaReference.value.result);
94386
+ const resourceBaseURI = (0,_dereference_strategies_openapi_3_1_util_mjs__WEBPACK_IMPORTED_MODULE_38__.resolveSchema$idField)(_util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(schemaReference.uri), resourceRoot) ?? _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.stripHash(schemaReference.uri);
94387
+ const field = cf.schemas.name;
94388
+ const canonicalKey = `${field}\t${resourceBaseURI}`;
94389
+
94390
+ // resource already embedded (or being embedded) — leave the referencing
94391
+ // $ref untouched and stop. This also terminates circular external schema
94392
+ // references, since the assignment is reserved BEFORE recursion.
94393
+ if (this.assignments.has(canonicalKey)) {
94394
+ path.skip();
94395
+ return;
94396
+ }
94397
+
94398
+ // own a copy of the resource and ensure it carries a $id so the unchanged
94399
+ // $ref still resolves against it once embedded
94400
+ const embeddedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneDeep)(resourceRoot);
94401
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(embeddedElement.$id)) {
94402
+ embeddedElement.set('$id', resourceBaseURI);
94403
+ }
94404
+
94405
+ // the embedded thing is the WHOLE resource (keyed by its $id), so its name
94406
+ // is derived from the resource URI, not the $ref fragment — passing a root
94407
+ // pointer makes baseName fall back to the resource basename
94408
+ const preferredName = this.baseName(embeddedElement, field, '', resourceBaseURI);
94409
+ const componentName = this.uniqueName(preferredName, field);
94410
+ this.reportNameCollision(preferredName, componentName, field);
94411
+
94412
+ // reserve the assignment and component name before recursing so circular
94413
+ // external schema references terminate
94414
+ this.assignments.set(canonicalKey, `#/components/${field}/${(0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_12__.escape)(componentName)}`);
94415
+ if (!this.reservedNames.has(field)) this.reservedNames.set(field, new Set());
94416
+ this.reservedNames.get(field).add(componentName);
94417
+
94418
+ // bundle external references contained within the embedded resource;
94419
+ // nested external resources land flat in the same components.schemas
94420
+ const visitor = new OpenAPI3_1BundleVisitor({
94421
+ reference: schemaReference,
94422
+ options: this.options,
94423
+ assignments: this.assignments,
94424
+ reservedNames: this.reservedNames,
94425
+ refractCache: this.refractCache
94426
+ });
94427
+ const bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_10__.traverseAsync)(embeddedElement, visitor, {
94428
+ mutable: true
94429
+ });
94430
+
94431
+ // annotate the embedded resource with info about its origin
94432
+ bundledElement.meta.set('ref-origin', schemaReference.uri);
94433
+
94434
+ // place the embedded resource into the entry document's components
94435
+ this.ensureComponentsField(field).set(componentName, bundledElement);
94436
+
94437
+ // the referencing $ref is left UNCHANGED — it resolves against the
94438
+ // embedded resource's $id
94439
+ path.skip();
94440
+ } catch (error) {
94441
+ this.handleError(`Error while bundling Schema Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, referencingElement, '$ref', $ref, path);
94442
+ path.skip();
94443
+ }
94444
+ }
94445
+
94446
+ /**
94447
+ * Example Object `externalValue` points at arbitrary external content that
94448
+ * has no place in the Components Object. The referenced value is inlined into
94449
+ * the Example's `value` field.
94450
+ */
94451
+ async ExampleElement(path) {
94452
+ const exampleElement = path.node;
94453
+
94454
+ // ignore Example Objects without an externalValue field
94455
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(exampleElement.externalValue)) {
94456
+ return;
94457
+ }
94458
+
94459
+ // value and externalValue fields are mutually exclusive
94460
+ if (exampleElement.hasKey('value') && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(exampleElement.externalValue)) {
94461
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('ExampleElement value and externalValue fields are mutually exclusive', {
94462
+ value: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.value),
94463
+ externalValue: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue)
94464
+ });
94465
+ }
94466
+ const externalValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(exampleElement.externalValue);
94467
+ const retrievalURI = this.toBaseURI(externalValue);
94468
+ const isInternalReference = this.entryURI === retrievalURI;
94469
+ const isExternalReference = !isInternalReference;
94470
+
94471
+ // honor the resolve.external switch
94472
+ if (!this.options.resolve.external && isExternalReference) {
94473
+ return;
94474
+ }
94475
+ try {
94476
+ const reference = await this.toReference(externalValue);
94477
+ const valueElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneShallow)(reference.value.result);
94478
+ valueElement.meta.set('ref-origin', reference.uri);
94479
+ const exampleElementCopy = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.cloneShallow)(exampleElement);
94480
+ exampleElementCopy.value = valueElement;
94481
+ exampleElementCopy.remove('externalValue');
94482
+ path.replaceWith(exampleElementCopy);
94483
+ } catch (error) {
94484
+ this.handleError(`Error while bundling Example Object. Cannot resolve externalValue "${externalValue}": ${error.message}`, error, exampleElement, 'externalValue', externalValue, path);
94485
+ }
94486
+ }
94487
+
94488
+ /**
94489
+ * Link Object `operationRef` points at an Operation Object, which has no
94490
+ * Components Object field in OpenAPI 3.1 and therefore cannot be hoisted or
94491
+ * inlined. To keep the link resolvable from the bundled document, an external
94492
+ * `operationRef` is rewritten to its absolute URI. Internal `operationRef`
94493
+ * values and `operationId` links are left untouched.
94494
+ */
94495
+ async LinkElement(path) {
94496
+ const linkElement = path.node;
94497
+
94498
+ // operationRef and operationId fields are mutually exclusive
94499
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(linkElement.operationRef) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(linkElement.operationId)) {
94500
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_9__["default"]('LinkElement operationRef and operationId fields are mutually exclusive', {
94501
+ operationRef: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef),
94502
+ operationId: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationId)
94503
+ });
94504
+ }
94505
+
94506
+ // only external operationRef links need adjusting
94507
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(linkElement.operationRef)) {
94508
+ return;
94509
+ }
94510
+ const operationRef = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(linkElement.operationRef);
94511
+ const retrievalURI = this.toBaseURI(operationRef);
94512
+ const isInternalReference = this.entryURI === retrievalURI;
94513
+ if (isInternalReference) {
94514
+ // normalize a self-reference operationRef to a bare fragment so the bundled
94515
+ // document stays transferable; bare fragments are left untouched
94516
+ linkElement.set('operationRef', this.normalizeSelfReference(operationRef));
94517
+ return;
94518
+ }
94519
+
94520
+ // honor the resolve.external switch
94521
+ if (!this.options.resolve.external) {
94522
+ return;
94523
+ }
94524
+
94525
+ // rewrite to an absolute URI so the link keeps resolving once the document
94526
+ // is treated as self-contained
94527
+ const absoluteURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_32__.resolve(this.reference.uri, operationRef);
94528
+ if (absoluteURI !== operationRef) {
94529
+ linkElement.set('operationRef', absoluteURI);
94530
+ }
94531
+ }
94532
+ }
94533
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OpenAPI3_1BundleVisitor);
94534
+
94535
+ /***/ },
94536
+
94537
+ /***/ 78814
94538
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
94539
+
94540
+ "use strict";
94541
+ __webpack_require__.r(__webpack_exports__);
94542
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
94543
+ /* harmony export */ sanitizeComponentName: () => (/* binding */ sanitizeComponentName),
94544
+ /* harmony export */ toPascalCase: () => (/* binding */ toPascalCase),
94545
+ /* harmony export */ uniqueName: () => (/* binding */ uniqueName)
94546
+ /* harmony export */ });
94547
+ /**
94548
+ * Upper-cases the first letter of each whitespace-separated word and joins
94549
+ * them, e.g. `pet model` -> `PetModel`.
94550
+ *
94551
+ * @public
94552
+ */
94553
+ const toPascalCase = value => value.trim().split(/\s+/).map(word => word.replace(/^[a-z]/, char => char.toUpperCase())).join('');
94554
+
94555
+ /**
94556
+ * Replaces characters that are invalid in a Components Object name with `-`,
94557
+ * then collapses repeated separators and trims leading/trailing ones.
94558
+ *
94559
+ * @public
94560
+ */
94561
+ const sanitizeComponentName = value => value.replace(/[^a-zA-Z0-9.\-_]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');
94562
+
94563
+ /**
94564
+ * Returns a collision-free name by suffixing `-2`, `-3`, ... onto `candidate`
94565
+ * until `isTaken` reports it free. `isTaken` decides what counts as taken
94566
+ * (e.g. names already placed in or reserved for a Components Object field).
94567
+ *
94568
+ * @public
94569
+ */
94570
+ const uniqueName = (candidate, isTaken) => {
94571
+ if (!isTaken(candidate)) {
94572
+ return candidate;
94573
+ }
94574
+ let counter = 2;
94575
+ while (isTaken(`${candidate}-${counter}`)) {
94576
+ counter += 1;
94577
+ }
94578
+ return `${candidate}-${counter}`;
94579
+ };
94580
+
94581
+ /***/ },
94582
+
94583
+ /***/ 29807
94584
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
94585
+
94586
+ "use strict";
93443
94587
  __webpack_require__.r(__webpack_exports__);
93444
94588
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
93445
94589
  /* harmony export */ BundleError: () => (/* reexport safe */ _index_mjs__WEBPACK_IMPORTED_MODULE_36__.BundleError),
@@ -102355,6 +103499,7 @@ __webpack_require__.r(__webpack_exports__);
102355
103499
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
102356
103500
  /* harmony export */ cwd: () => (/* binding */ cwd),
102357
103501
  /* harmony export */ fromFileSystemPath: () => (/* binding */ fromFileSystemPath),
103502
+ /* harmony export */ getBasename: () => (/* binding */ getBasename),
102358
103503
  /* harmony export */ getExtension: () => (/* binding */ getExtension),
102359
103504
  /* harmony export */ getHash: () => (/* binding */ getHash),
102360
103505
  /* harmony export */ getProtocol: () => (/* binding */ getProtocol),
@@ -102413,19 +103558,40 @@ const getProtocol = url => {
102413
103558
  */
102414
103559
  const hasProtocol = (0,ramda__WEBPACK_IMPORTED_MODULE_3__["default"])(getProtocol, ramda_adjunct__WEBPACK_IMPORTED_MODULE_6__["default"]);
102415
103560
 
103561
+ /**
103562
+ * Returns the final path segment of the given URI (the part after the last
103563
+ * `/`). Inputs are URIs, whose path separator is `/` — filesystem paths are
103564
+ * forward-slashed by `sanitize` before reaching here.
103565
+ */
103566
+ const getFilename = uri => uri.slice(uri.lastIndexOf('/') + 1);
103567
+
102416
103568
  /**
102417
103569
  * Returns the lower-cased file extension of the given URL,
102418
103570
  * or an empty string if it has no extension.
102419
103571
  * @public
102420
103572
  */
102421
103573
  const getExtension = url => {
102422
- const lastDotPosition = url.lastIndexOf('.');
103574
+ const fileName = getFilename(url);
103575
+ const lastDotPosition = fileName.lastIndexOf('.');
102423
103576
  if (lastDotPosition >= 0) {
102424
- return url.substring(lastDotPosition).toLowerCase();
103577
+ return fileName.substring(lastDotPosition).toLowerCase();
102425
103578
  }
102426
103579
  return '';
102427
103580
  };
102428
103581
 
103582
+ /**
103583
+ * Returns the final path segment of the given URI with its file extension
103584
+ * removed (e.g. `./schemas/Pet.json` -> `Pet`). Returns the whole segment when
103585
+ * there is no extension, and the whole URI when there is no path segment
103586
+ * (e.g. a URN).
103587
+ * @public
103588
+ */
103589
+ const getBasename = uri => {
103590
+ const fileName = getFilename(uri);
103591
+ const extension = getExtension(uri);
103592
+ return extension === '' ? fileName : fileName.slice(0, -extension.length);
103593
+ };
103594
+
102429
103595
  /**
102430
103596
  * Determines whether the given path is a filesystem path.
102431
103597
  * This includes "file://" URLs.