@speclynx/apidom-reference 6.1.0 → 6.1.2

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 (30) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/apidom-reference.browser.js +428 -318
  3. package/dist/apidom-reference.browser.min.js +1 -1
  4. package/package.json +29 -29
  5. package/src/bundle/strategies/asyncapi-2/visitor.cjs +5 -0
  6. package/src/bundle/strategies/asyncapi-2/visitor.mjs +5 -0
  7. package/src/bundle/strategies/openapi-2/visitor.cjs +4 -0
  8. package/src/bundle/strategies/openapi-2/visitor.mjs +4 -0
  9. package/src/bundle/strategies/openapi-3-0/visitor.cjs +97 -82
  10. package/src/bundle/strategies/openapi-3-0/visitor.mjs +97 -82
  11. package/src/bundle/strategies/openapi-3-1/visitor.cjs +5 -0
  12. package/src/bundle/strategies/openapi-3-1/visitor.mjs +5 -0
  13. package/src/dereference/strategies/asyncapi-2/visitor.cjs +5 -0
  14. package/src/dereference/strategies/asyncapi-2/visitor.mjs +5 -0
  15. package/src/dereference/strategies/openapi-2/visitor.cjs +10 -0
  16. package/src/dereference/strategies/openapi-2/visitor.mjs +10 -0
  17. package/src/dereference/strategies/openapi-3-0/visitor.cjs +5 -0
  18. package/src/dereference/strategies/openapi-3-0/visitor.mjs +5 -0
  19. package/src/dereference/strategies/openapi-3-1/visitor.cjs +5 -0
  20. package/src/dereference/strategies/openapi-3-1/visitor.mjs +5 -0
  21. package/src/dereference/strategies/overlay-1/extends.cjs +52 -28
  22. package/src/dereference/strategies/overlay-1/extends.mjs +52 -28
  23. package/src/dereference/strategies/overlay-1/index.cjs +22 -10
  24. package/src/dereference/strategies/overlay-1/index.mjs +23 -11
  25. package/src/dereference/strategies/overlay-1/visitor.cjs +27 -2
  26. package/src/dereference/strategies/overlay-1/visitor.mjs +27 -3
  27. package/src/parse/parsers/overlay-json-1/extends.cjs +33 -13
  28. package/src/parse/parsers/overlay-json-1/extends.mjs +33 -14
  29. package/types/bundle/strategies/openapi-3-0/visitor.d.ts +8 -3
  30. package/types/dereference/strategies/overlay-1/visitor.d.ts +1 -1
@@ -298,7 +298,6 @@ class BundleStrategy {
298
298
 
299
299
  "use strict";
300
300
  __webpack_require__.r(__webpack_exports__);
301
- /* empty/unused harmony star reexport */
302
301
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
303
302
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
304
303
  /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(53787);
@@ -948,7 +947,6 @@ class Arazzo1BundleVisitor {
948
947
 
949
948
  "use strict";
950
949
  __webpack_require__.r(__webpack_exports__);
951
- /* empty/unused harmony star reexport */
952
950
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
953
951
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
954
952
  /* harmony import */ var _speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46417);
@@ -1428,6 +1426,11 @@ class AsyncAPI2BundleVisitor {
1428
1426
  }
1429
1427
  async ReferenceElement(path) {
1430
1428
  const referencingElement = path.node;
1429
+
1430
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
1431
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencingElement.$ref)) {
1432
+ return;
1433
+ }
1431
1434
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref);
1432
1435
  const retrievalURI = this.toBaseURI($ref);
1433
1436
  const isInternalReference = this.entryURI === retrievalURI;
@@ -1664,7 +1667,6 @@ class AsyncAPI2BundleVisitor {
1664
1667
 
1665
1668
  "use strict";
1666
1669
  __webpack_require__.r(__webpack_exports__);
1667
- /* empty/unused harmony star reexport */
1668
1670
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
1669
1671
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
1670
1672
  /* harmony import */ var _speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3677);
@@ -2101,6 +2103,10 @@ class OpenAPI2BundleVisitor {
2101
2103
  * and refraction helpers, so the shared logic is parameterized here.
2102
2104
  */
2103
2105
  async bundleReference(path, referencingElement, isSemanticReference, isReferenceLike, refractReferenceFn, label) {
2106
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
2107
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencingElement.$ref)) {
2108
+ return;
2109
+ }
2104
2110
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref);
2105
2111
  const retrievalURI = this.toBaseURI($ref);
2106
2112
  const isInternalReference = this.entryURI === retrievalURI;
@@ -2357,7 +2363,6 @@ class OpenAPI2BundleVisitor {
2357
2363
 
2358
2364
  "use strict";
2359
2365
  __webpack_require__.r(__webpack_exports__);
2360
- /* empty/unused harmony star reexport */
2361
2366
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
2362
2367
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
2363
2368
  /* harmony import */ var _speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(43151);
@@ -2812,6 +2817,11 @@ class OpenAPI3_0BundleVisitor {
2812
2817
  }
2813
2818
  async ReferenceElement(path) {
2814
2819
  const referencingElement = path.node;
2820
+
2821
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
2822
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencingElement.$ref)) {
2823
+ return;
2824
+ }
2815
2825
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.$ref);
2816
2826
  const retrievalURI = this.toBaseURI($ref);
2817
2827
  const isInternalReference = this.entryURI === retrievalURI;
@@ -2947,98 +2957,108 @@ class OpenAPI3_0BundleVisitor {
2947
2957
  * Path Item Object is not a Components Object field in OpenAPI 3.0
2948
2958
  * (unlike 3.1 which has `components.pathItems`). An external Path Item
2949
2959
  * reference therefore cannot be hoisted; it is inlined in place instead,
2950
- * after bundling its own external references.
2960
+ * after bundling its own external references. It is inlined on leave, once
2961
+ * the sibling fields of the referencing Path Item have been bundled, so the
2962
+ * traversal doesn't descend into the inlined copy and inline the `$ref` left
2963
+ * in it to break a cycle again.
2951
2964
  */
2952
- async PathItemElement(path) {
2953
- const pathItemElement = path.node;
2954
-
2955
- // ignore Path Item Objects without a $ref field
2956
- if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(pathItemElement.$ref)) {
2957
- return;
2958
- }
2959
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(pathItemElement.$ref);
2960
- const retrievalURI = this.toBaseURI($ref);
2961
- const isInternalReference = this.entryURI === retrievalURI;
2962
- const isExternalReference = !isInternalReference;
2963
- if (isInternalReference) {
2964
- // normalize self-references to a bare fragment so the bundled
2965
- // document stays transferable; bare fragments are left untouched
2966
- pathItemElement.set('$ref', this.normalizeSelfReference($ref));
2967
- return;
2968
- }
2969
-
2970
- // honor the resolve.external switch
2971
- if (!this.options.resolve.external && isExternalReference) {
2972
- return;
2973
- }
2974
- const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_29__.resolve(retrievalURI, $ref);
2975
- const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.URIFragmentIdentifier.fromURIReference($refBaseURI);
2976
- const canonicalKey = `${retrievalURI}#${jsonPointer}`;
2965
+ PathItemElement = {
2966
+ leave: async path => {
2967
+ const pathItemElement = path.node;
2977
2968
 
2978
- // a circular external Path Item reference cannot be inlined without
2979
- // recursing forever; leave the $ref in place to break the cycle
2980
- if (this.inlineStack.has(canonicalKey)) {
2981
- return;
2982
- }
2983
- try {
2984
- // detect maximum depth of bundling
2985
- if (this.reference.depth >= this.options.bundle.maxDepth) {
2986
- throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_27__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
2987
- maxDepth: this.options.bundle.maxDepth,
2988
- uri: this.reference.uri
2989
- });
2969
+ // ignore Path Item Objects without a $ref field
2970
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(pathItemElement.$ref)) {
2971
+ return;
2972
+ }
2973
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(pathItemElement.$ref);
2974
+ const retrievalURI = this.toBaseURI($ref);
2975
+ const isInternalReference = this.entryURI === retrievalURI;
2976
+ const isExternalReference = !isInternalReference;
2977
+ if (isInternalReference) {
2978
+ // normalize self-references to a bare fragment so the bundled
2979
+ // document stays transferable; bare fragments are left untouched
2980
+ pathItemElement.set('$ref', this.normalizeSelfReference($ref));
2981
+ return;
2990
2982
  }
2991
- const reference = await this.toReference($ref);
2992
- let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.evaluate)(reference.value.result, jsonPointer);
2993
2983
 
2994
- // apply Path Item semantics to the referenced fragment
2995
- if (!(0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_13__.isPathItemElement)(referencedElement)) {
2996
- const cached = this.getRefracted(referencedElement, 'pathItem');
2997
- if (cached !== undefined) {
2998
- referencedElement = cached;
2999
- } else {
3000
- const sourceElement = referencedElement;
3001
- referencedElement = (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.refractPathItem)(referencedElement);
3002
- this.setRefracted(sourceElement, 'pathItem', referencedElement);
2984
+ // honor the resolve.external switch
2985
+ if (!this.options.resolve.external && isExternalReference) {
2986
+ return;
2987
+ }
2988
+ const $refBaseURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_29__.resolve(retrievalURI, $ref);
2989
+ const jsonPointer = _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.URIFragmentIdentifier.fromURIReference($refBaseURI);
2990
+ const canonicalKey = `${retrievalURI}#${jsonPointer}`;
2991
+
2992
+ // a circular external Path Item reference cannot be inlined without
2993
+ // recursing forever; leave the $ref in place to break the cycle. It ends
2994
+ // up in the entry document, so it has to resolve from there
2995
+ if (this.inlineStack.has(canonicalKey)) {
2996
+ const targetURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_29__.resolve(this.reference.uri, $ref);
2997
+ if (_util_url_ts__WEBPACK_IMPORTED_MODULE_29__.resolve(this.entryURI, $ref) !== targetURI) {
2998
+ pathItemElement.set('$ref', _util_url_ts__WEBPACK_IMPORTED_MODULE_29__.relative(this.entryURI, targetURI));
3003
2999
  }
3000
+ return;
3004
3001
  }
3005
-
3006
- // own a copy and bundle the external references it contains
3007
- const inlinedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.cloneDeep)(referencedElement);
3008
- this.inlineStack.add(canonicalKey);
3009
- const visitor = new OpenAPI3_0BundleVisitor({
3010
- reference,
3011
- options: this.options,
3012
- assignments: this.assignments,
3013
- reservedNames: this.reservedNames,
3014
- refractCache: this.refractCache,
3015
- inlineStack: this.inlineStack
3016
- });
3017
- let bundledElement;
3018
3002
  try {
3019
- bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__.traverseAsync)(inlinedElement, visitor, {
3020
- mutable: true
3003
+ // detect maximum depth of bundling
3004
+ if (this.reference.depth >= this.options.bundle.maxDepth) {
3005
+ throw new _errors_MaximumBundleDepthError_ts__WEBPACK_IMPORTED_MODULE_27__["default"](`Maximum bundle depth of "${this.options.bundle.maxDepth}" has been exceeded in file "${this.reference.uri}"`, {
3006
+ maxDepth: this.options.bundle.maxDepth,
3007
+ uri: this.reference.uri
3008
+ });
3009
+ }
3010
+ const reference = await this.toReference($ref);
3011
+ let referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.evaluate)(reference.value.result, jsonPointer);
3012
+
3013
+ // apply Path Item semantics to the referenced fragment
3014
+ if (!(0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_13__.isPathItemElement)(referencedElement)) {
3015
+ const cached = this.getRefracted(referencedElement, 'pathItem');
3016
+ if (cached !== undefined) {
3017
+ referencedElement = cached;
3018
+ } else {
3019
+ const sourceElement = referencedElement;
3020
+ referencedElement = (0,_speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_12__.refractPathItem)(referencedElement);
3021
+ this.setRefracted(sourceElement, 'pathItem', referencedElement);
3022
+ }
3023
+ }
3024
+
3025
+ // own a copy and bundle the external references it contains
3026
+ const inlinedElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.cloneDeep)(referencedElement);
3027
+ this.inlineStack.add(canonicalKey);
3028
+ const visitor = new OpenAPI3_0BundleVisitor({
3029
+ reference,
3030
+ options: this.options,
3031
+ assignments: this.assignments,
3032
+ reservedNames: this.reservedNames,
3033
+ refractCache: this.refractCache,
3034
+ inlineStack: this.inlineStack
3021
3035
  });
3022
- } finally {
3023
- this.inlineStack.delete(canonicalKey);
3024
- }
3036
+ let bundledElement;
3037
+ try {
3038
+ bundledElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__.traverseAsync)(inlinedElement, visitor, {
3039
+ mutable: true
3040
+ });
3041
+ } finally {
3042
+ this.inlineStack.delete(canonicalKey);
3043
+ }
3025
3044
 
3026
- // merge sibling fields from the referencing Path Item over the referenced
3027
- // one. The referencing `$ref` is being resolved away and is skipped; the
3028
- // referenced element keeps its own `$ref` if one survived (i.e. it was
3029
- // left in place to break a circular external Path Item chain).
3030
- pathItemElement.forEach((_value, keyElement, item) => {
3031
- const key = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(keyElement);
3032
- if (key === '$ref') return;
3033
- bundledElement.remove(key);
3034
- bundledElement.content.push(item);
3035
- });
3036
- bundledElement.meta.set('ref-origin', reference.uri);
3037
- path.replaceWith(bundledElement);
3038
- } catch (error) {
3039
- this.handleError(`Error while bundling Path Item Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, pathItemElement, '$ref', $ref, path);
3045
+ // merge sibling fields from the referencing Path Item over the referenced
3046
+ // one. The referencing `$ref` is being resolved away and is skipped; the
3047
+ // referenced element keeps its own `$ref` if one survived (i.e. it was
3048
+ // left in place to break a circular external Path Item chain).
3049
+ pathItemElement.forEach((_value, keyElement, item) => {
3050
+ const key = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(keyElement);
3051
+ if (key === '$ref') return;
3052
+ bundledElement.remove(key);
3053
+ bundledElement.content.push(item);
3054
+ });
3055
+ bundledElement.meta.set('ref-origin', reference.uri);
3056
+ path.replaceWith(bundledElement);
3057
+ } catch (error) {
3058
+ this.handleError(`Error while bundling Path Item Object. Cannot resolve $ref "${$ref}": ${error.message}`, error, pathItemElement, '$ref', $ref, path);
3059
+ }
3040
3060
  }
3041
- }
3061
+ };
3042
3062
 
3043
3063
  /**
3044
3064
  * Example Object `externalValue` points at arbitrary external content that
@@ -3140,7 +3160,6 @@ class OpenAPI3_0BundleVisitor {
3140
3160
 
3141
3161
  "use strict";
3142
3162
  __webpack_require__.r(__webpack_exports__);
3143
- /* empty/unused harmony star reexport */
3144
3163
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
3145
3164
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
3146
3165
  /* harmony import */ var _speclynx_apidom_ns_openapi_3_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7822);
@@ -3701,6 +3720,11 @@ class OpenAPI3_1BundleVisitor {
3701
3720
  };
3702
3721
  async ReferenceElement(path) {
3703
3722
  const referencingElement = path.node;
3723
+
3724
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
3725
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencingElement.$ref)) {
3726
+ return;
3727
+ }
3704
3728
  const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_8__["default"])(referencingElement.$ref);
3705
3729
  const retrievalURI = this.toBaseURI($ref);
3706
3730
  const isInternalReference = this.entryURI === retrievalURI;
@@ -4490,7 +4514,6 @@ class DereferenceStrategy {
4490
4514
 
4491
4515
  "use strict";
4492
4516
  __webpack_require__.r(__webpack_exports__);
4493
- /* empty/unused harmony star reexport */
4494
4517
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25162);
4495
4518
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12111);
4496
4519
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(80796);
@@ -4595,7 +4618,6 @@ class ApiDOMDereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORTE
4595
4618
 
4596
4619
  "use strict";
4597
4620
  __webpack_require__.r(__webpack_exports__);
4598
- /* empty/unused harmony star reexport */
4599
4621
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33031);
4600
4622
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25162);
4601
4623
  /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(44673);
@@ -4943,13 +4965,6 @@ class ApiDOMDereferenceVisitor {
4943
4965
 
4944
4966
  "use strict";
4945
4967
  __webpack_require__.r(__webpack_exports__);
4946
- /* empty/unused harmony star reexport */
4947
- /* empty/unused harmony star reexport */
4948
- /* empty/unused harmony star reexport */
4949
- /* empty/unused harmony star reexport */
4950
- /* empty/unused harmony star reexport */
4951
- /* empty/unused harmony star reexport */
4952
- /* empty/unused harmony star reexport */
4953
4968
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(96911);
4954
4969
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12111);
4955
4970
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18252);
@@ -4960,8 +4975,8 @@ __webpack_require__.r(__webpack_exports__);
4960
4975
  /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(98979);
4961
4976
  /* harmony import */ var _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(24131);
4962
4977
  /* harmony import */ var _visitor_ts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(31843);
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);
4978
+ /* harmony import */ var _openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(60888);
4979
+ /* harmony import */ var _source_descriptions_ts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(12586);
4965
4980
 
4966
4981
 
4967
4982
 
@@ -5027,7 +5042,7 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORT
5027
5042
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_9__["default"]({
5028
5043
  reference,
5029
5044
  options,
5030
- ancestorSchema$ids: (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_11__.detachedRootSchema$ids)(refSet.rootRef.value.result)
5045
+ ancestorSchema$ids: (0,_openapi_3_1_util_ts__WEBPACK_IMPORTED_MODULE_10__.detachedRootSchema$ids)(refSet.rootRef.value.result)
5031
5046
  });
5032
5047
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(refSet.rootRef.value, visitor, {
5033
5048
  mutable: true,
@@ -5057,7 +5072,7 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORT
5057
5072
  // drop any existing parse-phase source description results before pushing
5058
5073
  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']));
5059
5074
  parseResult.content = cleaned.content;
5060
- const sourceDescriptions = await (0,_source_descriptions_ts__WEBPACK_IMPORTED_MODULE_12__.dereferenceSourceDescriptions)(parseResult, reference.uri, options, this.name);
5075
+ const sourceDescriptions = await (0,_source_descriptions_ts__WEBPACK_IMPORTED_MODULE_11__.dereferenceSourceDescriptions)(parseResult, reference.uri, options, this.name);
5061
5076
  parseResult.push(...sourceDescriptions);
5062
5077
  }
5063
5078
 
@@ -6153,7 +6168,6 @@ class Arazzo1DereferenceVisitor {
6153
6168
 
6154
6169
  "use strict";
6155
6170
  __webpack_require__.r(__webpack_exports__);
6156
- /* empty/unused harmony star reexport */
6157
6171
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
6158
6172
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
6159
6173
  /* harmony import */ var _speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46417);
@@ -6486,6 +6500,11 @@ class AsyncAPI2DereferenceVisitor {
6486
6500
  async ReferenceElement(path) {
6487
6501
  const referencingElement = path.node;
6488
6502
 
6503
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
6504
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencingElement.$ref)) {
6505
+ return;
6506
+ }
6507
+
6489
6508
  // skip current referencing element as it's already been access
6490
6509
  if (this.indirections.includes(referencingElement)) {
6491
6510
  path.skip();
@@ -6815,7 +6834,6 @@ class AsyncAPI2DereferenceVisitor {
6815
6834
 
6816
6835
  "use strict";
6817
6836
  __webpack_require__.r(__webpack_exports__);
6818
- /* empty/unused harmony star reexport */
6819
6837
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
6820
6838
  /* harmony import */ var _speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3677);
6821
6839
  /* harmony import */ var _speclynx_apidom_ns_openapi_2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26365);
@@ -7152,6 +7170,11 @@ class OpenAPI2DereferenceVisitor {
7152
7170
  async ReferenceElement(path) {
7153
7171
  const referencingElement = path.node;
7154
7172
 
7173
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
7174
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencingElement.$ref)) {
7175
+ return;
7176
+ }
7177
+
7155
7178
  // skip current referencing element as it's already been access
7156
7179
  if (this.indirections.includes(referencingElement)) {
7157
7180
  path.skip();
@@ -7455,6 +7478,11 @@ class OpenAPI2DereferenceVisitor {
7455
7478
  async JSONReferenceElement(path) {
7456
7479
  const referencingElement = path.node;
7457
7480
 
7481
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
7482
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isStringElement)(referencingElement.$ref)) {
7483
+ return;
7484
+ }
7485
+
7458
7486
  // skip current referencing element as it's already been access
7459
7487
  if (this.indirections.includes(referencingElement)) {
7460
7488
  path.skip();
@@ -7617,7 +7645,6 @@ class OpenAPI2DereferenceVisitor {
7617
7645
 
7618
7646
  "use strict";
7619
7647
  __webpack_require__.r(__webpack_exports__);
7620
- /* empty/unused harmony star reexport */
7621
7648
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
7622
7649
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80796);
7623
7650
  /* harmony import */ var _speclynx_apidom_ns_openapi_3_0__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(43151);
@@ -7953,6 +7980,11 @@ class OpenAPI3_0DereferenceVisitor {
7953
7980
  async ReferenceElement(path) {
7954
7981
  const referencingElement = path.node;
7955
7982
 
7983
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
7984
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.isStringElement)(referencingElement.$ref)) {
7985
+ return;
7986
+ }
7987
+
7956
7988
  // skip current referencing element as it's already been access
7957
7989
  if (this.indirections.includes(referencingElement)) {
7958
7990
  path.skip();
@@ -8402,10 +8434,6 @@ class OpenAPI3_0DereferenceVisitor {
8402
8434
 
8403
8435
  "use strict";
8404
8436
  __webpack_require__.r(__webpack_exports__);
8405
- /* empty/unused harmony star reexport */
8406
- /* empty/unused harmony star reexport */
8407
- /* empty/unused harmony star reexport */
8408
- /* empty/unused harmony star reexport */
8409
8437
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6352);
8410
8438
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12111);
8411
8439
  /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(80796);
@@ -8415,7 +8443,7 @@ __webpack_require__.r(__webpack_exports__);
8415
8443
  /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(98979);
8416
8444
  /* harmony import */ var _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(24131);
8417
8445
  /* harmony import */ var _visitor_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(4224);
8418
- /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(60888);
8446
+ /* harmony import */ var _util_ts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(60888);
8419
8447
 
8420
8448
 
8421
8449
 
@@ -8481,7 +8509,7 @@ class OpenAPI3_1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMP
8481
8509
  const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_8__["default"]({
8482
8510
  reference: reference,
8483
8511
  options,
8484
- ancestorSchema$ids: (0,_util_ts__WEBPACK_IMPORTED_MODULE_10__.detachedRootSchema$ids)(refSet.rootRef.value.result)
8512
+ ancestorSchema$ids: (0,_util_ts__WEBPACK_IMPORTED_MODULE_9__.detachedRootSchema$ids)(refSet.rootRef.value.result)
8485
8513
  });
8486
8514
  const dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverseAsync)(refSet.rootRef.value, visitor, {
8487
8515
  mutable: true,
@@ -9152,6 +9180,11 @@ class OpenAPI3_1DereferenceVisitor {
9152
9180
  async ReferenceElement(path) {
9153
9181
  const referencingElement = path.node;
9154
9182
 
9183
+ // ignore Reference Object without a string $ref, e.g. an empty YAML value
9184
+ if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.isStringElement)(referencingElement.$ref)) {
9185
+ return;
9186
+ }
9187
+
9155
9188
  // skip current referencing element as it's already been accessed
9156
9189
  if (this.indirections.includes(referencingElement)) {
9157
9190
  path.skip();
@@ -9929,6 +9962,7 @@ __webpack_require__.r(__webpack_exports__);
9929
9962
 
9930
9963
 
9931
9964
 
9965
+ const STRATEGY_NAME = 'overlay-1';
9932
9966
 
9933
9967
  /**
9934
9968
  * Dereferences the `extends` target document from an Overlay document's ParseResult.
@@ -9971,39 +10005,61 @@ async function dereferenceExtends(parseResult, parseResultRetrievalURI, options)
9971
10005
  const extendsDereferenceResult = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__["default"]();
9972
10006
  extendsDereferenceResult.classes.push('extends');
9973
10007
  extendsDereferenceResult.setMetaProperty('retrievalURI', retrievalURI);
9974
- try {
9975
- let extendsDereferenced;
9976
10008
 
9977
- // check if extends was already parsed (e.g., during parse phase with extends: true)
9978
- const existingParseResult = extendsElement.meta.get('parseResult');
9979
- if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isParseResultElement)(existingParseResult)) {
9980
- // use existing parsed result - just dereference it (no re-fetch/re-parse)
9981
- extendsDereferenced = await (0,_index_ts__WEBPACK_IMPORTED_MODULE_10__.dereferenceApiDOM)(existingParseResult, (0,_options_util_ts__WEBPACK_IMPORTED_MODULE_9__.merge)(options, {
9982
- parse: {
9983
- mediaType: 'text/plain' // allow dereference strategy detection via ApiDOM inspection
9984
- },
9985
- resolve: {
9986
- baseURI: retrievalURI
9987
- }
9988
- }));
9989
- } else {
9990
- // no existing parse result - fetch, parse, and dereference
9991
- extendsDereferenced = await (0,_index_ts__WEBPACK_IMPORTED_MODULE_10__["default"])(retrievalURI, (0,_options_util_ts__WEBPACK_IMPORTED_MODULE_9__.merge)(options, {
9992
- parse: {
9993
- mediaType: 'text/plain' // allow parser plugin detection
10009
+ // URIs of the Overlays currently being dereferenced, from the root down to the current one
10010
+ const ancestors = [...(options?.dereference?.strategyOpts?.[STRATEGY_NAME]?.extendsAncestors ?? []), file.uri];
10011
+ const nestedOptions = {
10012
+ dereference: {
10013
+ strategyOpts: {
10014
+ [STRATEGY_NAME]: {
10015
+ extendsAncestors: ancestors
9994
10016
  }
9995
- }));
10017
+ }
9996
10018
  }
10019
+ };
9997
10020
 
9998
- // merge dereferenced result into our wrapper
9999
- for (const item of extendsDereferenced) {
10000
- extendsDereferenceResult.push(item);
10001
- }
10002
- } catch (error) {
10003
- const message = error instanceof Error ? error.message : String(error);
10004
- const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"](`Error dereferencing extends target "${retrievalURI}": ${message}`);
10005
- annotation.classes.push('error');
10021
+ // skip if the target is still being dereferenced higher up the chain (cycle detection)
10022
+ if (ancestors.includes(retrievalURI)) {
10023
+ const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"](`Extends target "${retrievalURI}" has already been visited. Skipping to prevent cycle`);
10024
+ annotation.classes.push('warning');
10006
10025
  extendsDereferenceResult.push(annotation);
10026
+ } else {
10027
+ try {
10028
+ let extendsDereferenced;
10029
+
10030
+ // check if extends was already parsed (e.g., during parse phase with extends: true)
10031
+ const existingParseResult = extendsElement.meta.get('parseResult');
10032
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isParseResultElement)(existingParseResult)) {
10033
+ // use existing parsed result - just dereference it (no re-fetch/re-parse)
10034
+ extendsDereferenced = await (0,_index_ts__WEBPACK_IMPORTED_MODULE_10__.dereferenceApiDOM)(existingParseResult, (0,_options_util_ts__WEBPACK_IMPORTED_MODULE_9__.merge)(options, {
10035
+ ...nestedOptions,
10036
+ parse: {
10037
+ mediaType: 'text/plain' // allow dereference strategy detection via ApiDOM inspection
10038
+ },
10039
+ resolve: {
10040
+ baseURI: retrievalURI
10041
+ }
10042
+ }));
10043
+ } else {
10044
+ // no existing parse result - fetch, parse, and dereference
10045
+ extendsDereferenced = await (0,_index_ts__WEBPACK_IMPORTED_MODULE_10__["default"])(retrievalURI, (0,_options_util_ts__WEBPACK_IMPORTED_MODULE_9__.merge)(options, {
10046
+ ...nestedOptions,
10047
+ parse: {
10048
+ mediaType: 'text/plain' // allow parser plugin detection
10049
+ }
10050
+ }));
10051
+ }
10052
+
10053
+ // merge dereferenced result into our wrapper
10054
+ for (const item of extendsDereferenced) {
10055
+ extendsDereferenceResult.push(item);
10056
+ }
10057
+ } catch (error) {
10058
+ const message = error instanceof Error ? error.message : String(error);
10059
+ const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"](`Error dereferencing extends target "${retrievalURI}": ${message}`);
10060
+ annotation.classes.push('error');
10061
+ extendsDereferenceResult.push(annotation);
10062
+ }
10007
10063
  }
10008
10064
 
10009
10065
  // always attach result to extends element meta (even on failure - contains annotations)
@@ -10022,17 +10078,16 @@ async function dereferenceExtends(parseResult, parseResultRetrievalURI, options)
10022
10078
 
10023
10079
  "use strict";
10024
10080
  __webpack_require__.r(__webpack_exports__);
10025
- /* empty/unused harmony star reexport */
10026
- /* empty/unused harmony star reexport */
10027
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
10028
- /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(13786);
10029
- /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26432);
10030
- /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(80796);
10031
- /* harmony import */ var _DereferenceStrategy_ts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(40978);
10032
- /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(98979);
10033
- /* harmony import */ var _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(24131);
10034
- /* harmony import */ var _extends_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(66571);
10035
- /* harmony import */ var _visitor_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(47724);
10081
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(96911);
10082
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12111);
10083
+ /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(13786);
10084
+ /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(26432);
10085
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(80796);
10086
+ /* harmony import */ var _DereferenceStrategy_ts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(40978);
10087
+ /* harmony import */ var _Reference_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(98979);
10088
+ /* harmony import */ var _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(24131);
10089
+ /* harmony import */ var _extends_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(66571);
10090
+ /* harmony import */ var _visitor_ts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(47724);
10036
10091
 
10037
10092
 
10038
10093
 
@@ -10049,7 +10104,7 @@ __webpack_require__.r(__webpack_exports__);
10049
10104
  /**
10050
10105
  * @public
10051
10106
  */
10052
- class Overlay1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORTED_MODULE_4__["default"] {
10107
+ class Overlay1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPORTED_MODULE_5__["default"] {
10053
10108
  constructor(options) {
10054
10109
  super({
10055
10110
  ...(options ?? {}),
@@ -10059,18 +10114,18 @@ class Overlay1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPOR
10059
10114
  canDereference(file) {
10060
10115
  // assert by media type
10061
10116
  if (file.mediaType !== 'text/plain') {
10062
- return _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_1__["default"].includes(file.mediaType);
10117
+ return _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__["default"].includes(file.mediaType);
10063
10118
  }
10064
10119
 
10065
10120
  // assert by inspecting ApiDOM
10066
- return (0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_2__.isOverlay1Element)(file.parseResult?.result);
10121
+ return (0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_3__.isOverlay1Element)(file.parseResult?.result);
10067
10122
  }
10068
10123
  async dereference(file, options) {
10069
- const immutableRefSet = options.dereference.refSet ?? new _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_6__["default"]();
10070
- const mutableRefSet = new _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_6__["default"]();
10124
+ const immutableRefSet = options.dereference.refSet ?? new _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_7__["default"]();
10125
+ const mutableRefSet = new _ReferenceSet_ts__WEBPACK_IMPORTED_MODULE_7__["default"]();
10071
10126
  let reference;
10072
10127
  if (!immutableRefSet.has(file.uri)) {
10073
- reference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_5__["default"]({
10128
+ reference = new _Reference_ts__WEBPACK_IMPORTED_MODULE_6__["default"]({
10074
10129
  uri: file.uri,
10075
10130
  value: file.parseResult
10076
10131
  });
@@ -10085,39 +10140,51 @@ class Overlay1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPOR
10085
10140
  * We don't want to mutate the original refSet and the references.
10086
10141
  */
10087
10142
  if (options.dereference.immutable) {
10088
- immutableRefSet.refs.map(ref => new _Reference_ts__WEBPACK_IMPORTED_MODULE_5__["default"]({
10143
+ immutableRefSet.refs.map(ref => new _Reference_ts__WEBPACK_IMPORTED_MODULE_6__["default"]({
10089
10144
  ...ref,
10090
- value: (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(ref.value)
10145
+ value: (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(ref.value)
10091
10146
  })).forEach(ref => mutableRefSet.add(ref));
10092
10147
  reference = mutableRefSet.find(ref => ref.uri === file.uri);
10093
10148
  }
10094
- const dereferencedElement = reference.value;
10095
-
10096
- /**
10097
- * Reusable Action References only occur within `actions`, so the root element is never
10098
- * replaced and traversing it keeps reported locations relative to the document.
10099
- */
10100
- const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_8__["default"]({
10149
+ const visitor = new _visitor_ts__WEBPACK_IMPORTED_MODULE_9__["default"]({
10101
10150
  reference,
10102
10151
  options
10103
10152
  });
10104
- await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_3__.traverseAsync)(dereferencedElement.result, visitor, {
10105
- mutable: true
10106
- });
10153
+ /**
10154
+ * The reference for the dereferenced file is traversed rather than the refSet's root
10155
+ * reference: dereferencing the extends target shares the refSet, whose root is then
10156
+ * the extending Overlay. The reference may hold a lone element.
10157
+ */
10158
+ let dereferencedElement = reference.value;
10159
+
10160
+ /**
10161
+ * A ParseResult may also carry the extends target parsed in the parse phase, whose
10162
+ * references belong to that document, so only its result is traversed. Reusable Action
10163
+ * References only occur within `actions`, so the result itself is never replaced.
10164
+ */
10165
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isParseResultElement)(dereferencedElement)) {
10166
+ await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_4__.traverseAsync)(dereferencedElement.result, visitor, {
10167
+ mutable: true
10168
+ });
10169
+ } else {
10170
+ dereferencedElement = await (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_4__.traverseAsync)(dereferencedElement, visitor, {
10171
+ mutable: true
10172
+ });
10173
+ }
10107
10174
 
10108
10175
  /**
10109
10176
  * Dereference extends target if option is enabled.
10110
10177
  */
10111
10178
  const shouldDereferenceExtends = options?.dereference?.strategyOpts?.[this.name]?.extends ?? options?.dereference?.strategyOpts?.extends;
10112
- if (shouldDereferenceExtends) {
10113
- await (0,_extends_ts__WEBPACK_IMPORTED_MODULE_7__.dereferenceExtends)(dereferencedElement, reference.uri, options);
10179
+ if (shouldDereferenceExtends && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isParseResultElement)(dereferencedElement)) {
10180
+ await (0,_extends_ts__WEBPACK_IMPORTED_MODULE_8__.dereferenceExtends)(dereferencedElement, reference.uri, options);
10114
10181
  }
10115
10182
 
10116
10183
  /**
10117
10184
  * If immutable option is set, replay refs from the refSet.
10118
10185
  */
10119
10186
  if (options.dereference.immutable) {
10120
- mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new _Reference_ts__WEBPACK_IMPORTED_MODULE_5__["default"]({
10187
+ mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new _Reference_ts__WEBPACK_IMPORTED_MODULE_6__["default"]({
10121
10188
  ...ref,
10122
10189
  uri: ref.uri.replace(/^immutable:\/\//, '')
10123
10190
  })).forEach(ref => immutableRefSet.add(ref));
@@ -10149,17 +10216,22 @@ class Overlay1DereferenceStrategy extends _DereferenceStrategy_ts__WEBPACK_IMPOR
10149
10216
 
10150
10217
  "use strict";
10151
10218
  __webpack_require__.r(__webpack_exports__);
10152
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12111);
10153
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(18252);
10154
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(25810);
10155
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44673);
10156
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16280);
10157
- /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(44641);
10158
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(12020);
10159
- /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(61198);
10160
- /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(26432);
10161
- /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(35937);
10162
- /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(8853);
10219
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25162);
10220
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12111);
10221
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18252);
10222
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25810);
10223
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(44673);
10224
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(16280);
10225
+ /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(44641);
10226
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(12020);
10227
+ /* harmony import */ var _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(61198);
10228
+ /* harmony import */ var _speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(80796);
10229
+ /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(26432);
10230
+ /* harmony import */ var _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(35937);
10231
+ /* harmony import */ var _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(8853);
10232
+ /* harmony import */ var _util_url_ts__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(30658);
10233
+
10234
+
10163
10235
 
10164
10236
 
10165
10237
 
@@ -10192,25 +10264,32 @@ class Overlay1DereferenceVisitor {
10192
10264
  path.skip();
10193
10265
  return;
10194
10266
  }
10195
- const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(referencingElement.$ref);
10196
- const overlayElement = this.reference.value.result;
10197
- const actionElement = new _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_9__.ActionElement();
10267
+ const $ref = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.$ref);
10268
+ // the reference may hold a lone element; same-document references resolve against the
10269
+ // document registered in the refSet under the reference's URI without fragment
10270
+ const {
10271
+ refSet
10272
+ } = this.reference;
10273
+ const documentURI = _util_url_ts__WEBPACK_IMPORTED_MODULE_13__.stripHash(this.reference.uri);
10274
+ const documentReference = refSet.find(ref => ref.uri === documentURI) ?? this.reference;
10275
+ const overlayElement = documentReference.value.result;
10276
+ const actionElement = new _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_11__.ActionElement();
10198
10277
  try {
10199
10278
  if (typeof $ref !== 'string') {
10200
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__["default"]('Reusable Action Reference "$ref" field must be a string');
10279
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__["default"]('Reusable Action Reference "$ref" field must be a string');
10201
10280
  }
10202
10281
 
10203
10282
  // only `target`, `description` and extensions may accompany `$ref`
10204
10283
  const disallowedField = ['update', 'copy', 'remove'].find(field => referencingElement.hasKey(field));
10205
10284
  if (disallowedField !== undefined) {
10206
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__["default"](`Reusable Action Reference "${$ref}" must not define "${disallowedField}"`, {
10285
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__["default"](`Reusable Action Reference "${$ref}" must not define "${disallowedField}"`, {
10207
10286
  $ref
10208
10287
  });
10209
10288
  }
10210
10289
 
10211
10290
  // same-document reference only; external references are not supported
10212
10291
  if (!$ref.startsWith('#')) {
10213
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__["default"](`Reusable Action Reference "${$ref}" must be a same-document reference`, {
10292
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__["default"](`Reusable Action Reference "${$ref}" must be a same-document reference`, {
10214
10293
  $ref
10215
10294
  });
10216
10295
  }
@@ -10221,25 +10300,25 @@ class Overlay1DereferenceVisitor {
10221
10300
  */
10222
10301
  let reusableAction;
10223
10302
  try {
10224
- reusableAction = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_6__.evaluate)(overlayElement, _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.URIFragmentIdentifier.from($ref));
10303
+ reusableAction = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_7__.evaluate)(overlayElement, _speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_8__.URIFragmentIdentifier.from($ref));
10225
10304
  } catch {
10226
10305
  reusableAction = undefined;
10227
10306
  }
10228
- if (!(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_8__.isReusableActionElement)(reusableAction)) {
10229
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__["default"](`Reusable Action Reference "${$ref}" cannot be resolved`, {
10307
+ if (!(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_10__.isReusableActionElement)(reusableAction)) {
10308
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__["default"](`Reusable Action Reference "${$ref}" cannot be resolved`, {
10230
10309
  $ref
10231
10310
  });
10232
10311
  }
10233
10312
  const {
10234
10313
  fields
10235
10314
  } = reusableAction;
10236
- if (fields !== undefined && !(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_8__.isActionElement)(fields)) {
10237
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__["default"](`Reusable Action "${$ref}" must define "fields" as an object`, {
10315
+ if (fields !== undefined && !(0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_10__.isActionElement)(fields)) {
10316
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__["default"](`Reusable Action "${$ref}" must define "fields" as an object`, {
10238
10317
  $ref
10239
10318
  });
10240
10319
  }
10241
- if ((0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_8__.isActionElement)(fields) && fields.hasKey('target')) {
10242
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_5__["default"](`Reusable Action "${$ref}" must not define "target" in its "fields"`, {
10320
+ if ((0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_10__.isActionElement)(fields) && fields.hasKey('target')) {
10321
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_6__["default"](`Reusable Action "${$ref}" must not define "target" in its "fields"`, {
10243
10322
  $ref
10244
10323
  });
10245
10324
  }
@@ -10250,26 +10329,41 @@ class Overlay1DereferenceVisitor {
10250
10329
  description
10251
10330
  } = referencingElement;
10252
10331
  if (target !== undefined) {
10253
- actionElement.set('target', (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(target));
10332
+ actionElement.set('target', (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(target));
10254
10333
  }
10255
- if ((0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_8__.isActionElement)(fields)) {
10334
+ if ((0,_speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODULE_10__.isActionElement)(fields)) {
10256
10335
  fields.forEach((value, keyElement) => {
10257
- actionElement.set((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(keyElement), (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(value));
10336
+ actionElement.set((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(keyElement), (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(value));
10258
10337
  });
10259
10338
  }
10260
10339
  if (description !== undefined) {
10261
- actionElement.set('description', (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(description));
10340
+ actionElement.set('description', (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(description));
10262
10341
  }
10263
10342
  } catch (error) {
10264
10343
  const {
10265
10344
  continueOnError
10266
10345
  } = this.options.dereference;
10267
- const unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_10__["default"](`Error while dereferencing Reusable Action Reference "${$ref}": ${error.message}`, {
10346
+
10347
+ // find element location by identity in the document tree;
10348
+ // falls back to the visitor path when the document doesn't contain the element
10349
+ let location;
10350
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isElement)(overlayElement)) {
10351
+ (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_9__.traverse)(overlayElement, {
10352
+ enter: p => {
10353
+ if (p.node === referencingElement) {
10354
+ location = p.formatPath();
10355
+ p.stop();
10356
+ }
10357
+ }
10358
+ });
10359
+ }
10360
+ location ??= path.formatPath();
10361
+ const unresolvedError = new _errors_UnresolvableReferenceError_ts__WEBPACK_IMPORTED_MODULE_12__["default"](`Error while dereferencing Reusable Action Reference "${$ref}": ${error.message}`, {
10268
10362
  cause: error,
10269
10363
  type: referencingElement.element,
10270
10364
  uri: this.reference.uri,
10271
- location: path.formatPath(),
10272
- codeFrame: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement),
10365
+ location,
10366
+ codeFrame: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(referencingElement),
10273
10367
  refFieldName: '$ref',
10274
10368
  refFieldValue: $ref,
10275
10369
  trace: []
@@ -10281,14 +10375,14 @@ class Overlay1DereferenceVisitor {
10281
10375
  }
10282
10376
 
10283
10377
  // the action takes the place of the reference in `actions`, so it inherits its source position
10284
- if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.hasElementSourceMap)(referencingElement)) {
10285
- _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"].transfer(referencingElement, actionElement);
10378
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.hasElementSourceMap)(referencingElement)) {
10379
+ _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"].transfer(referencingElement, actionElement);
10286
10380
  }
10287
10381
 
10288
10382
  // annotate with info about original referencing element
10289
10383
  actionElement.meta.set('ref-fields', {
10290
10384
  $ref,
10291
- description: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(referencingElement.description)
10385
+ description: (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_4__["default"])(referencingElement.description)
10292
10386
  });
10293
10387
  // annotate with info about origin
10294
10388
  actionElement.meta.set('ref-origin', this.reference.uri);
@@ -11551,7 +11645,6 @@ class ApiDOMJSONParser extends _Parser_ts__WEBPACK_IMPORTED_MODULE_4__["default"
11551
11645
 
11552
11646
  "use strict";
11553
11647
  __webpack_require__.r(__webpack_exports__);
11554
- /* empty/unused harmony star reexport */
11555
11648
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14494);
11556
11649
  /* harmony import */ var _speclynx_apidom_parser_adapter_arazzo_json_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6017);
11557
11650
  /* harmony import */ var _speclynx_apidom_parser_adapter_arazzo_json_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29028);
@@ -11866,7 +11959,6 @@ async function parseSourceDescriptions(parseResult, parseResultRetrievalURI, opt
11866
11959
 
11867
11960
  "use strict";
11868
11961
  __webpack_require__.r(__webpack_exports__);
11869
- /* empty/unused harmony star reexport */
11870
11962
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14494);
11871
11963
  /* harmony import */ var _speclynx_apidom_parser_adapter_arazzo_yaml_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16206);
11872
11964
  /* harmony import */ var _speclynx_apidom_parser_adapter_arazzo_yaml_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(43195);
@@ -12653,6 +12745,9 @@ __webpack_require__.r(__webpack_exports__);
12653
12745
 
12654
12746
 
12655
12747
 
12748
+ // shared key for recursion state (works across JSON/YAML parsers)
12749
+ const OVERLAY_RECURSION_KEY = 'overlay-1';
12750
+
12656
12751
  /**
12657
12752
  * Parses the `extends` target document from an Overlay document's ParseResult.
12658
12753
  *
@@ -12689,21 +12784,38 @@ async function parseExtends(parseResult, parseResultRetrievalURI, options) {
12689
12784
  const extendsParseResult = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]();
12690
12785
  extendsParseResult.classes.push('extends');
12691
12786
  extendsParseResult.setMetaProperty('retrievalURI', retrievalURI);
12692
- try {
12693
- const targetParseResult = await (0,_index_ts__WEBPACK_IMPORTED_MODULE_8__["default"])(retrievalURI, (0,_options_util_ts__WEBPACK_IMPORTED_MODULE_7__.merge)(options, {
12694
- parse: {
12695
- mediaType: 'text/plain' // force auto-detection
12787
+
12788
+ // URIs of the Overlays currently being parsed, from the root down to the current one
12789
+ const ancestors = [...(options?.parse?.parserOpts?.[OVERLAY_RECURSION_KEY]?.extendsAncestors ?? []), file.uri];
12790
+
12791
+ // skip if the target is still being parsed higher up the chain (cycle detection)
12792
+ if (ancestors.includes(retrievalURI)) {
12793
+ const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"](`Extends target "${retrievalURI}" has already been visited. Skipping to prevent cycle`);
12794
+ annotation.classes.push('warning');
12795
+ extendsParseResult.push(annotation);
12796
+ } else {
12797
+ try {
12798
+ const targetParseResult = await (0,_index_ts__WEBPACK_IMPORTED_MODULE_8__["default"])(retrievalURI, (0,_options_util_ts__WEBPACK_IMPORTED_MODULE_7__.merge)(options, {
12799
+ parse: {
12800
+ mediaType: 'text/plain',
12801
+ // force auto-detection
12802
+ parserOpts: {
12803
+ [OVERLAY_RECURSION_KEY]: {
12804
+ extendsAncestors: ancestors
12805
+ }
12806
+ }
12807
+ }
12808
+ }));
12809
+ // merge parsed result into our wrapper
12810
+ for (const item of targetParseResult) {
12811
+ extendsParseResult.push(item);
12696
12812
  }
12697
- }));
12698
- // merge parsed result into our wrapper
12699
- for (const item of targetParseResult) {
12700
- extendsParseResult.push(item);
12813
+ } catch (error) {
12814
+ const message = error instanceof Error ? error.message : String(error);
12815
+ const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"](`Error parsing extends target "${retrievalURI}": ${message}`);
12816
+ annotation.classes.push('error');
12817
+ extendsParseResult.push(annotation);
12701
12818
  }
12702
- } catch (error) {
12703
- const message = error instanceof Error ? error.message : String(error);
12704
- const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"](`Error parsing extends target "${retrievalURI}": ${message}`);
12705
- annotation.classes.push('error');
12706
- extendsParseResult.push(annotation);
12707
12819
  }
12708
12820
 
12709
12821
  // always attach result to extends element meta (even on failure - contains annotations)
@@ -12718,7 +12830,6 @@ async function parseExtends(parseResult, parseResultRetrievalURI, options) {
12718
12830
 
12719
12831
  "use strict";
12720
12832
  __webpack_require__.r(__webpack_exports__);
12721
- /* empty/unused harmony star reexport */
12722
12833
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14494);
12723
12834
  /* harmony import */ var _speclynx_apidom_parser_adapter_overlay_json_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(85086);
12724
12835
  /* harmony import */ var _speclynx_apidom_parser_adapter_overlay_json_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(54827);
@@ -12802,7 +12913,6 @@ class OverlayJSON1Parser extends _Parser_ts__WEBPACK_IMPORTED_MODULE_4__["defaul
12802
12913
 
12803
12914
  "use strict";
12804
12915
  __webpack_require__.r(__webpack_exports__);
12805
- /* empty/unused harmony star reexport */
12806
12916
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(14494);
12807
12917
  /* harmony import */ var _speclynx_apidom_parser_adapter_overlay_yaml_1__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(98585);
12808
12918
  /* harmony import */ var _speclynx_apidom_parser_adapter_overlay_yaml_1__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(83004);
@@ -55925,11 +56035,8 @@ const serializer = (element, replacer, space, options) => {
55925
56035
  __webpack_require__.r(__webpack_exports__);
55926
56036
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25162);
55927
56037
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(96911);
55928
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18252);
55929
- /* harmony import */ var _util_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10977);
56038
+ /* harmony import */ var _util_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(10977);
55930
56039
 
55931
- // an empty YAML node (YAML 1.2 §7.2) is a null parsed as an empty string with the yaml-e-node class
55932
- const isEmptyNode = element => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isStringElement)(element) && element.toValue() === '' && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__.includesClasses)(element, ['yaml-e-node']);
55933
56040
 
55934
56041
  /**
55935
56042
  * Transforms the ApiDOM into JavaScript POJO.
@@ -55939,7 +56046,6 @@ const isEmptyNode = element => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_M
55939
56046
  */
55940
56047
  const serializer = element => {
55941
56048
  if (!(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isElement)(element)) return element;
55942
- if (isEmptyNode(element)) return null;
55943
56049
 
55944
56050
  // Shortcut optimization for primitive element types
55945
56051
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isStringElement)(element) || (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isNumberElement)(element) || (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isBooleanElement)(element) || (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isNullElement)(element)) {
@@ -55957,8 +56063,8 @@ const serializer = element => {
55957
56063
  node.forEach((value, key) => {
55958
56064
  const k = serialize(key);
55959
56065
  const v = serialize(value);
55960
- const name = (0,_util_mjs__WEBPACK_IMPORTED_MODULE_3__.toPropertyName)(k);
55961
- if (name !== undefined) (0,_util_mjs__WEBPACK_IMPORTED_MODULE_3__["default"])(obj, name, v);
56066
+ const name = (0,_util_mjs__WEBPACK_IMPORTED_MODULE_2__.toPropertyName)(k);
56067
+ if (name !== undefined) (0,_util_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(obj, name, v);
55962
56068
  });
55963
56069
  return obj;
55964
56070
  }
@@ -55973,7 +56079,6 @@ const serializer = element => {
55973
56079
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isLinkElement)(node)) {
55974
56080
  return (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isStringElement)(node.href) ? node.href.toValue() : '';
55975
56081
  }
55976
- if (isEmptyNode(node)) return null;
55977
56082
  return node.toValue();
55978
56083
  };
55979
56084
  return serialize(element);
@@ -56341,9 +56446,10 @@ const toYAMLNode = (element, context) => {
56341
56446
  // scalar element (string, number, boolean, null)
56342
56447
  const scalarType = style.scalarStyle ? scalarStyleMap[style.scalarStyle] : undefined;
56343
56448
  const scalar = new yaml__WEBPACK_IMPORTED_MODULE_0__.Scalar((0,_value_mjs__WEBPACK_IMPORTED_MODULE_5__["default"])(element));
56344
- // an empty node (YAML 1.2 §7.2) is serialized to null; while it's still empty, write it back as
56345
- // it was written: with no content, after its anchor and tag if it had them
56346
- const isEmptyNode = scalar.value === null && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.includesClasses)(element, ['yaml-e-node']);
56449
+ // an empty node (YAML 1.2 §7.2) is serialized to null, or to the empty string as a key; while it's
56450
+ // still empty, write it back as it was written: with no content, after its anchor and tag if it
56451
+ // had them
56452
+ const isEmptyNode = (scalar.value === null || scalar.value === '' && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.includesClasses)(element, ['yaml-e-key'])) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.includesClasses)(element, ['yaml-e-node']);
56347
56453
  if (isEmptyNode) {
56348
56454
  const anchor = claimAnchor(style, context);
56349
56455
  const properties = [anchor && `&${anchor}`, style.tag].filter(Boolean).join(' ');
@@ -56382,7 +56488,10 @@ const toYAMLNode = (element, context) => {
56382
56488
  }
56383
56489
  }
56384
56490
  if ((style.scalarStyle === 'Literal' || style.scalarStyle === 'Folded') && typeof style.rawContent === 'string' && typeof scalar.value === 'string') {
56385
- const text = style.rawContent.replace(/\r\n/g, '\n').replace(/\n$/, '');
56491
+ const raw = style.rawContent.replace(/\r\n/g, '\n');
56492
+ // the empty lines after a clip or strip block aren't part of its value, but separate it from
56493
+ // what follows in its source, so they're dropped; a keep block's are part of its value
56494
+ const text = raw.replace(/^[|>][1-9]?\+/.test(raw) ? /\n$/ : /\n+$/, '');
56386
56495
  scalar.value = new RawBlockScalar(scalar.value, text);
56387
56496
  }
56388
56497
  if (style.styleGroup === 'Flow' && typeof style.rawContent === 'string' && typeof scalar.value === 'string' && scalar.value !== '') {
@@ -58497,11 +58606,10 @@ class CollectionElement extends _Element_mjs__WEBPACK_IMPORTED_MODULE_0__["defau
58497
58606
 
58498
58607
  "use strict";
58499
58608
  __webpack_require__.r(__webpack_exports__);
58500
- /* empty/unused harmony star reexport */
58501
58609
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(53654);
58502
58610
  /* harmony import */ var _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(51844);
58503
- /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(36663);
58504
- /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(38504);
58611
+ /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36663);
58612
+ /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(38504);
58505
58613
 
58506
58614
 
58507
58615
 
@@ -58671,13 +58779,13 @@ class Element {
58671
58779
  }
58672
58780
 
58673
58781
  // KeyValuePair
58674
- if (value instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]) {
58782
+ if (value instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
58675
58783
  this._content = value;
58676
58784
  return;
58677
58785
  }
58678
58786
 
58679
58787
  // ObjectSlice - extract elements array
58680
- if (value instanceof _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_4__["default"]) {
58788
+ if (value instanceof _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]) {
58681
58789
  this._content = value.elements;
58682
58790
  return;
58683
58791
  }
@@ -58796,7 +58904,7 @@ class Element {
58796
58904
  if (Array.isArray(content)) {
58797
58905
  return content;
58798
58906
  }
58799
- if (content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]) {
58907
+ if (content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
58800
58908
  const children = [];
58801
58909
  if (content.key) children.push(content.key);
58802
58910
  if (content.value) children.push(content.value);
@@ -58860,7 +58968,7 @@ class Element {
58860
58968
  if (_content instanceof Element) {
58861
58969
  return _content.toValue();
58862
58970
  }
58863
- if (_content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]) {
58971
+ if (_content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
58864
58972
  return _content.toValue();
58865
58973
  }
58866
58974
  if (Array.isArray(_content)) {
@@ -59963,14 +60071,13 @@ __webpack_require__.r(__webpack_exports__);
59963
60071
  /* harmony export */ testReferenceToken: () => (/* reexport safe */ _swaggerexpert_json_pointer__WEBPACK_IMPORTED_MODULE_0__.testReferenceToken),
59964
60072
  /* harmony export */ unescape: () => (/* reexport safe */ _swaggerexpert_json_pointer__WEBPACK_IMPORTED_MODULE_0__.unescape)
59965
60073
  /* harmony export */ });
59966
- /* empty/unused harmony star reexport */
59967
60074
  /* harmony import */ var _swaggerexpert_json_pointer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(61198);
59968
- /* harmony import */ var _realm_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(60545);
60075
+ /* harmony import */ var _realm_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(60545);
59969
60076
 
59970
60077
 
59971
60078
 
59972
60079
 
59973
- const realm = new _realm_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]();
60080
+ const realm = new _realm_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]();
59974
60081
 
59975
60082
  /**
59976
60083
  * @public
@@ -90907,25 +91014,24 @@ class AllOfVisitor extends JSONSchemaAllOfVisitor {
90907
91014
 
90908
91015
  "use strict";
90909
91016
  __webpack_require__.r(__webpack_exports__);
90910
- /* empty/unused harmony star reexport */
90911
- /* harmony import */ var _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(86059);
90912
- /* harmony import */ var _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26207);
91017
+ /* harmony import */ var _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86059);
91018
+ /* harmony import */ var _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26207);
90913
91019
 
90914
91020
 
90915
91021
 
90916
91022
  /**
90917
91023
  * @public
90918
91024
  */
90919
- class ItemsVisitor extends _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_2__["default"] {
91025
+ class ItemsVisitor extends _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__["default"] {
90920
91026
  ObjectElement(path) {
90921
- _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_2__["default"].prototype.ObjectElement.call(this, path);
90922
- if ((0,_speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__.isJSONReferenceElement)(this.element)) {
91027
+ _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__["default"].prototype.ObjectElement.call(this, path);
91028
+ if ((0,_speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_0__.isJSONReferenceElement)(this.element)) {
90923
91029
  this.element.meta.set('referenced-element', 'schema');
90924
91030
  }
90925
91031
  }
90926
91032
  ArrayElement(path) {
90927
- _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_2__["default"].prototype.ArrayElement.call(this, path);
90928
- this.element.filter(_speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__.isJSONReferenceElement)
91033
+ _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__["default"].prototype.ArrayElement.call(this, path);
91034
+ this.element.filter(_speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_0__.isJSONReferenceElement)
90929
91035
  // @ts-ignore
90930
91036
  .forEach(referenceElement => {
90931
91037
  referenceElement.meta.set('referenced-element', 'schema');
@@ -99189,9 +99295,8 @@ class AnyOfVisitor extends JSONSchemaAnyOfVisitor {
99189
99295
 
99190
99296
  "use strict";
99191
99297
  __webpack_require__.r(__webpack_exports__);
99192
- /* empty/unused harmony star reexport */
99193
- /* harmony import */ var _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26207);
99194
- /* harmony import */ var _predicates_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(32131);
99298
+ /* harmony import */ var _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26207);
99299
+ /* harmony import */ var _predicates_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(32131);
99195
99300
 
99196
99301
 
99197
99302
 
@@ -99199,10 +99304,10 @@ __webpack_require__.r(__webpack_exports__);
99199
99304
  /**
99200
99305
  * @public
99201
99306
  */
99202
- class ItemsVisitor extends _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__["default"] {
99307
+ class ItemsVisitor extends _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_0__["default"] {
99203
99308
  ObjectElement(path) {
99204
- _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_1__["default"].prototype.ObjectElement.call(this, path);
99205
- if ((0,_predicates_mjs__WEBPACK_IMPORTED_MODULE_2__.isReferenceElement)(this.element)) {
99309
+ _speclynx_apidom_ns_json_schema_draft_4__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.ObjectElement.call(this, path);
99310
+ if ((0,_predicates_mjs__WEBPACK_IMPORTED_MODULE_1__.isReferenceElement)(this.element)) {
99206
99311
  this.element.meta.set('referenced-element', 'schema');
99207
99312
  }
99208
99313
  }
@@ -105906,15 +106011,13 @@ const yamlMediaTypes = new _speclynx_apidom_ns_asyncapi_2__WEBPACK_IMPORTED_MODU
105906
106011
  "use strict";
105907
106012
  __webpack_require__.r(__webpack_exports__);
105908
106013
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
105909
- /* harmony export */ mediaTypes: () => (/* reexport safe */ _media_types_mjs__WEBPACK_IMPORTED_MODULE_5__["default"])
106014
+ /* harmony export */ mediaTypes: () => (/* reexport safe */ _media_types_mjs__WEBPACK_IMPORTED_MODULE_4__["default"])
105910
106015
  /* harmony export */ });
105911
- /* empty/unused harmony star reexport */
105912
- /* empty/unused harmony star reexport */
105913
106016
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55156);
105914
106017
  /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20746);
105915
106018
  /* harmony import */ var _native_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(38600);
105916
106019
  /* harmony import */ var _tree_sitter_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34885);
105917
- /* harmony import */ var _media_types_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(49968);
106020
+ /* harmony import */ var _media_types_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(49968);
105918
106021
 
105919
106022
 
105920
106023
 
@@ -106070,10 +106173,8 @@ const parse = async source => {
106070
106173
 
106071
106174
  "use strict";
106072
106175
  __webpack_require__.r(__webpack_exports__);
106073
- /* empty/unused harmony star reexport */
106074
- /* empty/unused harmony star reexport */
106075
- /* harmony import */ var _lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(19305);
106076
- /* harmony import */ var _syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(13615);
106176
+ /* harmony import */ var _lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(19305);
106177
+ /* harmony import */ var _syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(13615);
106077
106178
 
106078
106179
 
106079
106180
 
@@ -106094,7 +106195,7 @@ const detect = async source => {
106094
106195
  }
106095
106196
  let cst = null;
106096
106197
  try {
106097
- cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(source);
106198
+ cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(source);
106098
106199
  return cst.rootNode.type !== 'ERROR';
106099
106200
  } catch {
106100
106201
  return false;
@@ -106114,9 +106215,9 @@ const parse = async (source, {
106114
106215
  sourceMap = false,
106115
106216
  style = false
106116
106217
  } = {}) => {
106117
- const cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(source);
106218
+ const cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(source);
106118
106219
  try {
106119
- return (0,_syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(cst, {
106220
+ return (0,_syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(cst, {
106120
106221
  sourceMap,
106121
106222
  style
106122
106223
  });
@@ -107215,15 +107316,13 @@ const yamlMediaTypes = new _speclynx_apidom_ns_overlay_1__WEBPACK_IMPORTED_MODUL
107215
107316
  "use strict";
107216
107317
  __webpack_require__.r(__webpack_exports__);
107217
107318
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
107218
- /* harmony export */ mediaTypes: () => (/* reexport safe */ _media_types_mjs__WEBPACK_IMPORTED_MODULE_5__["default"])
107319
+ /* harmony export */ mediaTypes: () => (/* reexport safe */ _media_types_mjs__WEBPACK_IMPORTED_MODULE_4__["default"])
107219
107320
  /* harmony export */ });
107220
- /* empty/unused harmony star reexport */
107221
- /* empty/unused harmony star reexport */
107222
107321
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55156);
107223
107322
  /* harmony import */ var _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20746);
107224
107323
  /* harmony import */ var _yaml_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69124);
107225
107324
  /* harmony import */ var _tree_sitter_index_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10405);
107226
- /* harmony import */ var _media_types_mjs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(16688);
107325
+ /* harmony import */ var _media_types_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(16688);
107227
107326
 
107228
107327
 
107229
107328
 
@@ -107326,10 +107425,8 @@ const mediaTypes = new YamlMediaTypes('text/yaml', 'application/yaml');
107326
107425
 
107327
107426
  "use strict";
107328
107427
  __webpack_require__.r(__webpack_exports__);
107329
- /* empty/unused harmony star reexport */
107330
- /* empty/unused harmony star reexport */
107331
- /* harmony import */ var _lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(47657);
107332
- /* harmony import */ var _syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(67919);
107428
+ /* harmony import */ var _lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(47657);
107429
+ /* harmony import */ var _syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(67919);
107333
107430
 
107334
107431
 
107335
107432
 
@@ -107340,7 +107437,7 @@ __webpack_require__.r(__webpack_exports__);
107340
107437
  const detect = async source => {
107341
107438
  let cst = null;
107342
107439
  try {
107343
- cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(source);
107440
+ cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(source);
107344
107441
  return !cst.rootNode.isError;
107345
107442
  } catch {
107346
107443
  return false;
@@ -107360,9 +107457,9 @@ const parse = async (source, {
107360
107457
  sourceMap = false,
107361
107458
  style = false
107362
107459
  } = {}) => {
107363
- const cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(source);
107460
+ const cst = await (0,_lexical_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_0__["default"])(source);
107364
107461
  try {
107365
- return (0,_syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_2__["default"])(cst, {
107462
+ return (0,_syntactic_analysis_index_mjs__WEBPACK_IMPORTED_MODULE_1__["default"])(cst, {
107366
107463
  sourceMap,
107367
107464
  style
107368
107465
  });
@@ -108268,15 +108365,19 @@ const transformCstToYamlAst = (cursor, ctx) => {
108268
108365
  __webpack_require__.r(__webpack_exports__);
108269
108366
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55156);
108270
108367
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25162);
108271
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(97601);
108272
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(31770);
108273
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(97071);
108274
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(84660);
108275
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(40094);
108276
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(4823);
108277
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(25810);
108278
- /* harmony import */ var _ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(90594);
108279
- /* harmony import */ var _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(21544);
108368
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55297);
108369
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28121);
108370
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18252);
108371
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(97601);
108372
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(31770);
108373
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(97071);
108374
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(84660);
108375
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(40094);
108376
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4823);
108377
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(25810);
108378
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(49686);
108379
+ /* harmony import */ var _ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(90594);
108380
+ /* harmony import */ var _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(21544);
108280
108381
 
108281
108382
 
108282
108383
  // Transform context passed through transformation
@@ -108286,7 +108387,7 @@ const maybeAddSourceMap = (node, element, ctx) => {
108286
108387
  if (!ctx.sourceMap) {
108287
108388
  return;
108288
108389
  }
108289
- _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__["default"].transfer(node, element);
108390
+ _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_11__["default"].transfer(node, element);
108290
108391
  };
108291
108392
 
108292
108393
  // find the first descendant matching a type path through the AST
@@ -108304,7 +108405,7 @@ const findFirst = (node, path) => {
108304
108405
  // detect indent from first nested block mapping (stream > document > mapping > keyValuePair > mapping)
108305
108406
  const detectIndent = node => {
108306
108407
  const nested = findFirst(node, ['document', 'mapping', 'keyValuePair', 'mapping']);
108307
- if (nested?.styleGroup === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__.YamlStyleGroup.Block && typeof nested.startCharacter === 'number' && nested.startCharacter > 0) {
108408
+ if (nested?.styleGroup === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__.YamlStyleGroup.Block && typeof nested.startCharacter === 'number' && nested.startCharacter > 0) {
108308
108409
  return nested.startCharacter;
108309
108410
  }
108310
108411
  return 2;
@@ -108436,7 +108537,7 @@ const buildYamlStyle = (node, ctx, extras) => {
108436
108537
  // an untagged node has the non-specific tag '?' when it's a plain scalar and '!' otherwise
108437
108538
  // (YAML 1.2 §6.9.1); an explicit '!' on any other node means the same as no tag
108438
108539
  const tag = node.tag?.explicitName;
108439
- if (tag !== undefined && tag !== (node.style === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__.YamlStyle.Plain ? '?' : '!')) {
108540
+ if (tag !== undefined && tag !== (node.style === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__.YamlStyle.Plain ? '?' : '!')) {
108440
108541
  yamlStyle.tag = tag;
108441
108542
  }
108442
108543
  // the anchor's name, without the & indicator
@@ -108550,17 +108651,17 @@ const collectStreamComments = node => {
108550
108651
  if (!root) comments.before.push(text);else if (comment.startLine === root.endLine) comments.inline.push(text);else comments.after.push(text);
108551
108652
  };
108552
108653
  for (const child of node.children) {
108553
- if ((0,_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isDocument)(child)) {
108654
+ if ((0,_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_13__.isDocument)(child)) {
108554
108655
  if (root) break;
108555
108656
  // comments after an explicit document start (---) or before an explicit document end (...)
108556
108657
  // are the document's own children, around its root node
108557
108658
  const children = child.children || [];
108558
- const rootIndex = children.findIndex(c => !(0,_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isComment)(c));
108659
+ const rootIndex = children.findIndex(c => !(0,_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_13__.isComment)(c));
108559
108660
  if (rootIndex === -1) break;
108560
- children.slice(0, rootIndex).filter(_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isComment).forEach(collect);
108661
+ children.slice(0, rootIndex).filter(_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_13__.isComment).forEach(collect);
108561
108662
  root = children[rootIndex];
108562
- children.slice(rootIndex + 1).filter(_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isComment).forEach(collect);
108563
- } else if ((0,_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isComment)(child)) {
108663
+ children.slice(rootIndex + 1).filter(_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_13__.isComment).forEach(collect);
108664
+ } else if ((0,_ast_nodes_predicates_mjs__WEBPACK_IMPORTED_MODULE_13__.isComment)(child)) {
108564
108665
  collect(child);
108565
108666
  }
108566
108667
  }
@@ -108573,7 +108674,7 @@ const transformStream = (node, ctx) => {
108573
108674
  if (ctx.style) {
108574
108675
  ctx.indent = detectIndent(node);
108575
108676
  }
108576
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__["default"]();
108677
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_10__["default"]();
108577
108678
 
108578
108679
  // Transform all children
108579
108680
  const children = transformChildren(node.children || [], ctx);
@@ -108633,7 +108734,7 @@ const transformDocument = (node, ctx) => {
108633
108734
  const shouldSkipVisitingMoreDocuments = ctx.processedDocumentCount >= 1;
108634
108735
  if (shouldWarnAboutMoreDocuments) {
108635
108736
  const message = 'Only first document within YAML stream will be used. Rest will be discarded.';
108636
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
108737
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__["default"](message);
108637
108738
  element.classes.push('warning');
108638
108739
  maybeAddSourceMap(node, element, ctx);
108639
108740
  ctx.annotations.push(element);
@@ -108652,7 +108753,7 @@ const transformCollection = (element, node, ctx) => {
108652
108753
  const typedNode = node;
108653
108754
  const children = node.children || [];
108654
108755
  if (ctx.style) {
108655
- if (ctx.flowCollectionPadding === null && node.styleGroup === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__.YamlStyleGroup.Flow) {
108756
+ if (ctx.flowCollectionPadding === null && node.styleGroup === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__.YamlStyleGroup.Flow) {
108656
108757
  ctx.flowCollectionPadding = detectFlowPadding(typedNode);
108657
108758
  }
108658
108759
  const comments = collectComments(children, typedNode.startCharacter);
@@ -108663,7 +108764,7 @@ const transformCollection = (element, node, ctx) => {
108663
108764
  element.style = buildYamlStyle(node, ctx, {
108664
108765
  comment: comments.trailing,
108665
108766
  // a single pair written directly in a flow sequence (e.g. [a: 1])
108666
- singlePair: node.style === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__.YamlStyle.SinglePair || undefined
108767
+ singlePair: node.style === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__.YamlStyle.SinglePair || undefined
108667
108768
  });
108668
108769
  if (comments.outOfScope.length > 0) {
108669
108770
  ctx.promotedComments.push(...comments.outOfScope);
@@ -108676,14 +108777,14 @@ const transformCollection = (element, node, ctx) => {
108676
108777
 
108677
108778
  // Mapping: Transforms to ObjectElement
108678
108779
  const transformMapping = (node, ctx) => {
108679
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__["default"]();
108780
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__["default"]();
108680
108781
  transformCollection(element, node, ctx);
108681
108782
  return element;
108682
108783
  };
108683
108784
 
108684
108785
  // KeyValuePair: Transforms to MemberElement
108685
108786
  const transformKeyValuePair = (node, ctx) => {
108686
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"]();
108787
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"]();
108687
108788
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
108688
108789
  const {
108689
108790
  key,
@@ -108694,15 +108795,25 @@ const transformKeyValuePair = (node, ctx) => {
108694
108795
  styleGroup,
108695
108796
  startCharacter
108696
108797
  } = value;
108697
- if (styleGroup === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__.YamlStyleGroup.Block) {
108798
+ if (styleGroup === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__.YamlStyleGroup.Block) {
108698
108799
  ctx.indentSeq = startCharacter > node.startCharacter;
108699
108800
  }
108700
108801
  }
108701
108802
 
108702
108803
  // Transform key and value (these are dynamically defined properties)
108703
- const keyResult = transform(key, ctx);
108804
+ let keyResult = transform(key, ctx);
108704
108805
  const valueResult = transform(value, ctx);
108705
108806
 
108807
+ // an empty key is a null in YAML, but a JavaScript property name can't be null, so it's the empty
108808
+ // string it's named by, marked as an empty key
108809
+ if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isNullElement)(keyResult) && (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.includesClasses)(keyResult, ['yaml-e-node'])) {
108810
+ const emptyKey = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"]('', keyResult.meta, keyResult.attributes);
108811
+ emptyKey.classes.push('yaml-e-key');
108812
+ _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_11__["default"].transfer(keyResult, emptyKey);
108813
+ _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_12__["default"].transfer(keyResult, emptyKey);
108814
+ keyResult = emptyKey;
108815
+ }
108816
+
108706
108817
  // @ts-ignore
108707
108818
  element.content.key = keyResult;
108708
108819
  // @ts-ignore
@@ -108722,19 +108833,18 @@ const transformKeyValuePair = (node, ctx) => {
108722
108833
 
108723
108834
  // Sequence: Transforms to ArrayElement
108724
108835
  const transformSequence = (node, ctx) => {
108725
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]();
108836
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"]();
108726
108837
  transformCollection(element, node, ctx);
108727
108838
  return element;
108728
108839
  };
108729
108840
 
108730
108841
  // Scalar: Converts to Element via namespace
108731
108842
  const transformScalar = (node, ctx) => {
108732
- const element = ctx.namespace.toElement(node.content);
108733
-
108734
- // Translate style information about empty nodes; an empty node (YAML 1.2 §7.2) is a null unless
108735
- // a tag other than the null tag makes it something else (e.g. !!str makes it an empty string)
108843
+ // an empty node (YAML 1.2 §7.2) is a null unless a tag other than the null tag makes it
108844
+ // something else (e.g. !!str makes it an empty string); its classes tell it from an explicit null
108736
108845
  const tag = node.tag?.explicitName;
108737
- const isEmptyNode = node.content === '' && node.style === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_10__.YamlStyle.Plain && [undefined, '?', '!!null', '!<tag:yaml.org,2002:null>'].includes(tag);
108846
+ const isEmptyNode = node.content === '' && node.style === _ast_nodes_YamlStyle_mjs__WEBPACK_IMPORTED_MODULE_14__.YamlStyle.Plain && [undefined, '?', '!!null', '!<tag:yaml.org,2002:null>'].includes(tag);
108847
+ const element = isEmptyNode ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]() : ctx.namespace.toElement(node.content);
108738
108848
  if (isEmptyNode) {
108739
108849
  element.classes.push('yaml-e-node');
108740
108850
  element.classes.push('yaml-e-scalar');
@@ -108762,7 +108872,7 @@ const transformComment = (node, ctx) => {
108762
108872
  // Only interested in stream comments before the first document
108763
108873
  if (isStreamComment) {
108764
108874
  // @ts-ignore
108765
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"](node.content);
108875
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_9__["default"](node.content);
108766
108876
  maybeAddSourceMap(node, element, ctx);
108767
108877
  return element;
108768
108878
  }
@@ -108773,7 +108883,7 @@ const transformComment = (node, ctx) => {
108773
108883
  const transformLiteral = (node, ctx) => {
108774
108884
  if (node.isMissing) {
108775
108885
  const message = `(Missing ${node.value})`;
108776
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
108886
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__["default"](message);
108777
108887
  element.classes.push('warning');
108778
108888
  maybeAddSourceMap(node, element, ctx);
108779
108889
  ctx.annotations.push(element);
@@ -108784,7 +108894,7 @@ const transformLiteral = (node, ctx) => {
108784
108894
  // Error as annotation (used by keyValuePair)
108785
108895
  const transformErrorAsAnnotation = (node, ctx) => {
108786
108896
  const message = node.isUnexpected ? '(Unexpected YAML syntax error)' : '(Error YAML syntax error)';
108787
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
108897
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__["default"](message);
108788
108898
  element.classes.push('error');
108789
108899
  maybeAddSourceMap(node, element, ctx);
108790
108900
  ctx.annotations.push(element);
@@ -108793,7 +108903,7 @@ const transformErrorAsAnnotation = (node, ctx) => {
108793
108903
  // Error: Creates error annotation (adds to annotations array)
108794
108904
  const transformError = (node, ctx) => {
108795
108905
  const message = node.isUnexpected ? '(Unexpected YAML syntax error)' : '(Error YAML syntax error)';
108796
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
108906
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__["default"](message);
108797
108907
  element.classes.push('error');
108798
108908
  maybeAddSourceMap(node, element, ctx);
108799
108909
  ctx.annotations.push(element);
@@ -108803,10 +108913,10 @@ const transformError = (node, ctx) => {
108803
108913
  // Error at root level: Creates ParseResultElement with error annotation
108804
108914
  const transformRootError = (node, ctx) => {
108805
108915
  const message = node.isUnexpected ? '(Unexpected YAML syntax error)' : '(Error YAML syntax error)';
108806
- const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"](message);
108916
+ const element = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_8__["default"](message);
108807
108917
  element.classes.push('error');
108808
108918
  maybeAddSourceMap(node, element, ctx);
108809
- const parseResultElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__["default"]();
108919
+ const parseResultElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_10__["default"]();
108810
108920
  parseResultElement.push(element);
108811
108921
  return parseResultElement;
108812
108922
  };
@@ -108833,7 +108943,7 @@ const transformYamlAstToApiDOM = (yamlAst, {
108833
108943
 
108834
108944
  // Handle empty parse result
108835
108945
  if (!rootNode) {
108836
- return new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__["default"]();
108946
+ return new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_10__["default"]();
108837
108947
  }
108838
108948
 
108839
108949
  // Handle root-level error (no valid stream, just an error node)
@@ -108843,12 +108953,12 @@ const transformYamlAstToApiDOM = (yamlAst, {
108843
108953
  const result = transform(rootNode, ctx);
108844
108954
 
108845
108955
  // Result should be a ParseResultElement from transformStream
108846
- if (result instanceof _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__["default"]) {
108956
+ if (result instanceof _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_10__["default"]) {
108847
108957
  return result;
108848
108958
  }
108849
108959
 
108850
108960
  // Fallback: wrap in ParseResultElement
108851
- const parseResult = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_7__["default"]();
108961
+ const parseResult = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_10__["default"]();
108852
108962
  if (result !== null) {
108853
108963
  if (Array.isArray(result)) {
108854
108964
  result.forEach(el => parseResult.push(el));