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