@speclynx/apidom-ns-openapi-3-1 4.0.2 → 4.0.3
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 +6 -0
- package/package.json +9 -10
- package/src/elements/Callback.cjs +10 -0
- package/src/elements/Callback.mjs +7 -0
- package/src/elements/Callback.ts +8 -0
- package/src/elements/Components.cjs +17 -0
- package/src/elements/Components.mjs +14 -0
- package/src/elements/Components.ts +17 -0
- package/src/elements/Contact.cjs +10 -0
- package/src/elements/Contact.mjs +7 -0
- package/src/elements/Contact.ts +8 -0
- package/src/elements/Discriminator.cjs +10 -0
- package/src/elements/Discriminator.mjs +7 -0
- package/src/elements/Discriminator.ts +8 -0
- package/src/elements/Encoding.cjs +10 -0
- package/src/elements/Encoding.mjs +7 -0
- package/src/elements/Encoding.ts +8 -0
- package/src/elements/Example.cjs +10 -0
- package/src/elements/Example.mjs +7 -0
- package/src/elements/Example.ts +8 -0
- package/src/elements/ExternalDocumentation.cjs +10 -0
- package/src/elements/ExternalDocumentation.mjs +7 -0
- package/src/elements/ExternalDocumentation.ts +8 -0
- package/src/elements/Header.cjs +17 -0
- package/src/elements/Header.mjs +13 -0
- package/src/elements/Header.ts +18 -0
- package/src/elements/Info.cjs +23 -0
- package/src/elements/Info.mjs +19 -0
- package/src/elements/Info.ts +27 -0
- package/src/elements/JsonSchemaDialect.cjs +16 -0
- package/src/elements/JsonSchemaDialect.mjs +13 -0
- package/src/elements/JsonSchemaDialect.ts +15 -0
- package/src/elements/License.cjs +17 -0
- package/src/elements/License.mjs +14 -0
- package/src/elements/License.ts +17 -0
- package/src/elements/Link.cjs +10 -0
- package/src/elements/Link.mjs +7 -0
- package/src/elements/Link.ts +8 -0
- package/src/elements/MediaType.cjs +17 -0
- package/src/elements/MediaType.mjs +13 -0
- package/src/elements/MediaType.ts +18 -0
- package/src/elements/OAuthFlow.cjs +10 -0
- package/src/elements/OAuthFlow.mjs +7 -0
- package/src/elements/OAuthFlow.ts +8 -0
- package/src/elements/OAuthFlows.cjs +10 -0
- package/src/elements/OAuthFlows.mjs +7 -0
- package/src/elements/OAuthFlows.ts +8 -0
- package/src/elements/OpenApi3-1.cjs +77 -0
- package/src/elements/OpenApi3-1.mjs +73 -0
- package/src/elements/OpenApi3-1.ts +107 -0
- package/src/elements/Openapi.cjs +10 -0
- package/src/elements/Openapi.mjs +7 -0
- package/src/elements/Openapi.ts +8 -0
- package/src/elements/Operation.cjs +17 -0
- package/src/elements/Operation.mjs +13 -0
- package/src/elements/Operation.ts +19 -0
- package/src/elements/Parameter.cjs +17 -0
- package/src/elements/Parameter.mjs +13 -0
- package/src/elements/Parameter.ts +18 -0
- package/src/elements/PathItem.cjs +59 -0
- package/src/elements/PathItem.mjs +55 -0
- package/src/elements/PathItem.ts +74 -0
- package/src/elements/Paths.cjs +10 -0
- package/src/elements/Paths.mjs +7 -0
- package/src/elements/Paths.ts +8 -0
- package/src/elements/Reference.cjs +28 -0
- package/src/elements/Reference.mjs +25 -0
- package/src/elements/Reference.ts +29 -0
- package/src/elements/RequestBody.cjs +10 -0
- package/src/elements/RequestBody.mjs +7 -0
- package/src/elements/RequestBody.ts +8 -0
- package/src/elements/Response.cjs +10 -0
- package/src/elements/Response.mjs +7 -0
- package/src/elements/Response.ts +8 -0
- package/src/elements/Responses.cjs +10 -0
- package/src/elements/Responses.mjs +7 -0
- package/src/elements/Responses.ts +8 -0
- package/src/elements/Schema.cjs +50 -0
- package/src/elements/Schema.mjs +46 -0
- package/src/elements/Schema.ts +59 -0
- package/src/elements/SecurityRequirement.cjs +10 -0
- package/src/elements/SecurityRequirement.mjs +7 -0
- package/src/elements/SecurityRequirement.ts +8 -0
- package/src/elements/SecurityScheme.cjs +10 -0
- package/src/elements/SecurityScheme.mjs +7 -0
- package/src/elements/SecurityScheme.ts +8 -0
- package/src/elements/Server.cjs +10 -0
- package/src/elements/Server.mjs +7 -0
- package/src/elements/Server.ts +8 -0
- package/src/elements/ServerVariable.cjs +10 -0
- package/src/elements/ServerVariable.mjs +7 -0
- package/src/elements/ServerVariable.ts +8 -0
- package/src/elements/Tag.cjs +10 -0
- package/src/elements/Tag.mjs +7 -0
- package/src/elements/Tag.ts +8 -0
- package/src/elements/Xml.cjs +10 -0
- package/src/elements/Xml.mjs +7 -0
- package/src/elements/Xml.ts +8 -0
- package/src/elements/nces/ComponentsPathItems.cjs +16 -0
- package/src/elements/nces/ComponentsPathItems.mjs +13 -0
- package/src/elements/nces/ComponentsPathItems.ts +15 -0
- package/src/elements/nces/Webhooks.cjs +16 -0
- package/src/elements/nces/Webhooks.mjs +13 -0
- package/src/elements/nces/Webhooks.ts +15 -0
- package/src/index.cjs +182 -0
- package/src/index.mjs +31 -0
- package/src/index.ts +592 -0
- package/src/media-types.cjs +34 -0
- package/src/media-types.mjs +30 -0
- package/src/media-types.ts +46 -0
- package/src/namespace.cjs +81 -0
- package/src/namespace.mjs +76 -0
- package/src/namespace.ts +80 -0
- package/src/predicates.cjs +228 -0
- package/src/predicates.mjs +195 -0
- package/src/predicates.ts +229 -0
- package/src/refractor/index.cjs +368 -0
- package/src/refractor/index.mjs +330 -0
- package/src/refractor/index.ts +380 -0
- package/src/refractor/inspect.cjs +207 -0
- package/src/refractor/inspect.mjs +171 -0
- package/src/refractor/inspect.ts +241 -0
- package/src/refractor/plugins/normalize-header-examples/NormalizeStorage.cjs +38 -0
- package/src/refractor/plugins/normalize-header-examples/NormalizeStorage.mjs +34 -0
- package/src/refractor/plugins/normalize-header-examples/NormalizeStorage.ts +53 -0
- package/src/refractor/plugins/normalize-header-examples/index.cjs +109 -0
- package/src/refractor/plugins/normalize-header-examples/index.mjs +103 -0
- package/src/refractor/plugins/normalize-header-examples/index.ts +125 -0
- package/src/refractor/plugins/normalize-operation-ids.cjs +166 -0
- package/src/refractor/plugins/normalize-operation-ids.mjs +161 -0
- package/src/refractor/plugins/normalize-operation-ids.ts +198 -0
- package/src/refractor/plugins/normalize-parameter-examples.cjs +109 -0
- package/src/refractor/plugins/normalize-parameter-examples.mjs +103 -0
- package/src/refractor/plugins/normalize-parameter-examples.ts +128 -0
- package/src/refractor/plugins/normalize-parameters.cjs +109 -0
- package/src/refractor/plugins/normalize-parameters.mjs +103 -0
- package/src/refractor/plugins/normalize-parameters.ts +136 -0
- package/src/refractor/plugins/normalize-security-requirements.cjs +75 -0
- package/src/refractor/plugins/normalize-security-requirements.mjs +69 -0
- package/src/refractor/plugins/normalize-security-requirements.ts +87 -0
- package/src/refractor/plugins/normalize-servers.cjs +124 -0
- package/src/refractor/plugins/normalize-servers.mjs +118 -0
- package/src/refractor/plugins/normalize-servers.ts +144 -0
- package/src/refractor/plugins/replace-empty-element.cjs +669 -0
- package/src/refractor/plugins/replace-empty-element.mjs +661 -0
- package/src/refractor/plugins/replace-empty-element.ts +726 -0
- package/src/refractor/predicates.cjs +36 -0
- package/src/refractor/predicates.mjs +31 -0
- package/src/refractor/predicates.ts +39 -0
- package/src/refractor/specification.cjs +531 -0
- package/src/refractor/specification.mjs +526 -0
- package/src/refractor/specification.ts +594 -0
- package/src/refractor/toolbox.cjs +61 -0
- package/src/refractor/toolbox.mjs +53 -0
- package/src/refractor/toolbox.ts +70 -0
- package/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.cjs +25 -0
- package/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.mjs +19 -0
- package/src/refractor/visitors/open-api-3-1/JsonSchemaDialectVisitor.ts +32 -0
- package/src/refractor/visitors/open-api-3-1/OpenapiVisitor.cjs +25 -0
- package/src/refractor/visitors/open-api-3-1/OpenapiVisitor.mjs +19 -0
- package/src/refractor/visitors/open-api-3-1/OpenapiVisitor.ts +30 -0
- package/src/refractor/visitors/open-api-3-1/WebhooksVisitor.cjs +43 -0
- package/src/refractor/visitors/open-api-3-1/WebhooksVisitor.mjs +37 -0
- package/src/refractor/visitors/open-api-3-1/WebhooksVisitor.ts +57 -0
- package/src/refractor/visitors/open-api-3-1/bases.cjs +46 -0
- package/src/refractor/visitors/open-api-3-1/bases.mjs +43 -0
- package/src/refractor/visitors/open-api-3-1/bases.ts +66 -0
- package/src/refractor/visitors/open-api-3-1/callback/index.cjs +36 -0
- package/src/refractor/visitors/open-api-3-1/callback/index.mjs +31 -0
- package/src/refractor/visitors/open-api-3-1/callback/index.ts +56 -0
- package/src/refractor/visitors/open-api-3-1/components/PathItemsVisitor.cjs +33 -0
- package/src/refractor/visitors/open-api-3-1/components/PathItemsVisitor.mjs +27 -0
- package/src/refractor/visitors/open-api-3-1/components/PathItemsVisitor.ts +45 -0
- package/src/refractor/visitors/open-api-3-1/components/SchemasVisitor.cjs +22 -0
- package/src/refractor/visitors/open-api-3-1/components/SchemasVisitor.mjs +17 -0
- package/src/refractor/visitors/open-api-3-1/components/SchemasVisitor.ts +26 -0
- package/src/refractor/visitors/open-api-3-1/components/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/components/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/components/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/contact/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/contact/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/contact/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/distriminator/index.cjs +22 -0
- package/src/refractor/visitors/open-api-3-1/distriminator/index.mjs +17 -0
- package/src/refractor/visitors/open-api-3-1/distriminator/index.ts +32 -0
- package/src/refractor/visitors/open-api-3-1/encoding/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/encoding/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/encoding/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/example/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/example/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/example/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/external-documentation/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/external-documentation/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/external-documentation/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/header/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/header/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/header/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/index.cjs +41 -0
- package/src/refractor/visitors/open-api-3-1/index.mjs +35 -0
- package/src/refractor/visitors/open-api-3-1/index.ts +52 -0
- package/src/refractor/visitors/open-api-3-1/info/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/info/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/info/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/license/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/license/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/license/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/link/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/link/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/link/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/media-type/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/media-type/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/media-type/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/oauth-flow/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/oauth-flow/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/oauth-flow/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/oauth-flows/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/oauth-flows/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/oauth-flows/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/operation/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/operation/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/operation/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/parameter/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/parameter/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/parameter/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/path-item/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/path-item/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/path-item/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/paths/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/paths/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/paths/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/reference/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/reference/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/reference/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/request-body/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/request-body/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/request-body/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/response/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/response/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/response/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/responses/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/responses/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/responses/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/schema/$defsVisitor.cjs +19 -0
- package/src/refractor/visitors/open-api-3-1/schema/$defsVisitor.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/schema/$defsVisitor.ts +21 -0
- package/src/refractor/visitors/open-api-3-1/schema/AllOfVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/AllOfVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/AllOfVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/AnyOfVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/DependentSchemasVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/OneOfVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/OneOfVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/OneOfVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/PatternPropertiesVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/PatternPropertiesVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/PatternPropertiesVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/PrefixItemsVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.cjs +15 -0
- package/src/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.mjs +11 -0
- package/src/refractor/visitors/open-api-3-1/schema/PropertiesVisitor.ts +18 -0
- package/src/refractor/visitors/open-api-3-1/schema/index.cjs +76 -0
- package/src/refractor/visitors/open-api-3-1/schema/index.mjs +70 -0
- package/src/refractor/visitors/open-api-3-1/schema/index.ts +88 -0
- package/src/refractor/visitors/open-api-3-1/security-requirement/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/security-requirement/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/security-requirement/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/security-scheme/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/security-scheme/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/security-scheme/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/server/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/server/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/server/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/server-variable/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/server-variable/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/server-variable/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/tag/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/tag/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/tag/index.ts +29 -0
- package/src/refractor/visitors/open-api-3-1/xml/index.cjs +21 -0
- package/src/refractor/visitors/open-api-3-1/xml/index.mjs +16 -0
- package/src/refractor/visitors/open-api-3-1/xml/index.ts +29 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { PathItemServersElement, OperationServersElement, ServersElement } from '@speclynx/apidom-ns-openapi-3-0';
|
|
2
|
+
import NormalizeStorage from "./normalize-header-examples/NormalizeStorage.mjs";
|
|
3
|
+
import { refractServer } from "../index.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Override of Server Objects.
|
|
6
|
+
*
|
|
7
|
+
* List of Server Objects can be defined in OpenAPI 3.1 on multiple levels:
|
|
8
|
+
*
|
|
9
|
+
* - OpenAPI.servers
|
|
10
|
+
* - PathItem.servers
|
|
11
|
+
* - Operation.servers
|
|
12
|
+
*
|
|
13
|
+
* If a servers array is specified at the OpenAPI Object level, it will be overridden by `PathItem`.servers.
|
|
14
|
+
* If a servers array is specified at the Path Item Object or OpenAPI Object level, it will be overridden by Operation.servers.
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
const plugin = ({
|
|
21
|
+
storageField = 'x-normalized'
|
|
22
|
+
} = {}) => toolbox => {
|
|
23
|
+
const {
|
|
24
|
+
ancestorLineageToJSONPointer,
|
|
25
|
+
predicates
|
|
26
|
+
} = toolbox;
|
|
27
|
+
let storage;
|
|
28
|
+
return {
|
|
29
|
+
visitor: {
|
|
30
|
+
OpenApi3_1Element: {
|
|
31
|
+
enter(path) {
|
|
32
|
+
const openapiElement = path.node;
|
|
33
|
+
const isServersUndefined = typeof openapiElement.servers === 'undefined';
|
|
34
|
+
const isServersArrayElement = predicates.isArrayElement(openapiElement.servers);
|
|
35
|
+
const isServersEmpty = isServersArrayElement && openapiElement.servers.length === 0;
|
|
36
|
+
const defaultServer = refractServer({
|
|
37
|
+
url: '/'
|
|
38
|
+
});
|
|
39
|
+
if (isServersUndefined || !isServersArrayElement) {
|
|
40
|
+
openapiElement.servers = new ServersElement([defaultServer]);
|
|
41
|
+
} else if (isServersArrayElement && isServersEmpty) {
|
|
42
|
+
openapiElement.servers.push(defaultServer);
|
|
43
|
+
}
|
|
44
|
+
storage = new NormalizeStorage(openapiElement, storageField, 'servers');
|
|
45
|
+
},
|
|
46
|
+
leave() {
|
|
47
|
+
storage = undefined;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
PathItemElement(path) {
|
|
51
|
+
const pathItemElement = path.node;
|
|
52
|
+
const ancestors = path.getAncestorNodes().reverse(); // root to parent order
|
|
53
|
+
|
|
54
|
+
// skip visiting this Path Item
|
|
55
|
+
if (ancestors.some(predicates.isComponentsElement)) return;
|
|
56
|
+
if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
|
|
57
|
+
const pathItemJSONPointer = ancestorLineageToJSONPointer([...ancestors, pathItemElement]);
|
|
58
|
+
|
|
59
|
+
// skip visiting this Path Item Object if it's already normalized
|
|
60
|
+
if (storage.includes(pathItemJSONPointer)) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const parentOpenapiElement = ancestors.find(predicates.isOpenApi3_1Element);
|
|
64
|
+
const isServersUndefined = typeof pathItemElement.servers === 'undefined';
|
|
65
|
+
const isServersArrayElement = predicates.isArrayElement(pathItemElement.servers);
|
|
66
|
+
const isServersEmpty = isServersArrayElement && pathItemElement.servers.length === 0;
|
|
67
|
+
|
|
68
|
+
// duplicate OpenAPI.servers into this Path Item object
|
|
69
|
+
if (predicates.isOpenApi3_1Element(parentOpenapiElement)) {
|
|
70
|
+
const openapiServersContent = parentOpenapiElement.servers?.content;
|
|
71
|
+
const openapiServers = openapiServersContent ?? [];
|
|
72
|
+
if (isServersUndefined || !isServersArrayElement) {
|
|
73
|
+
pathItemElement.servers = new PathItemServersElement(openapiServers);
|
|
74
|
+
} else if (isServersArrayElement && isServersEmpty) {
|
|
75
|
+
openapiServers.forEach(server => {
|
|
76
|
+
pathItemElement.servers.push(server);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
storage.append(pathItemJSONPointer);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
OperationElement(path) {
|
|
83
|
+
const operationElement = path.node;
|
|
84
|
+
const ancestors = path.getAncestorNodes().reverse(); // root to parent order
|
|
85
|
+
|
|
86
|
+
// skip visiting this Operation
|
|
87
|
+
if (ancestors.some(predicates.isComponentsElement)) return;
|
|
88
|
+
if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
|
|
89
|
+
const operationJSONPointer = ancestorLineageToJSONPointer([...ancestors, operationElement]);
|
|
90
|
+
|
|
91
|
+
// skip visiting this Operation Object if it's already normalized
|
|
92
|
+
if (storage.includes(operationJSONPointer)) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// @TODO(vladimir.gorej@gmail.com): can be replaced by Array.prototype.findLast in future
|
|
97
|
+
const parentPathItemElement = ancestors.findLast(predicates.isPathItemElement);
|
|
98
|
+
const isServersUndefined = typeof operationElement.servers === 'undefined';
|
|
99
|
+
const isServersArrayElement = predicates.isArrayElement(operationElement.servers);
|
|
100
|
+
const isServersEmpty = isServersArrayElement && operationElement.servers.length === 0;
|
|
101
|
+
if (predicates.isPathItemElement(parentPathItemElement)) {
|
|
102
|
+
const pathItemServersContent = parentPathItemElement.servers?.content;
|
|
103
|
+
const pathItemServers = pathItemServersContent ?? [];
|
|
104
|
+
if (isServersUndefined || !isServersArrayElement) {
|
|
105
|
+
// duplicate parent PathItem.servers into this Operation object
|
|
106
|
+
operationElement.servers = new OperationServersElement(pathItemServers);
|
|
107
|
+
} else if (isServersArrayElement && isServersEmpty) {
|
|
108
|
+
pathItemServers.forEach(server => {
|
|
109
|
+
operationElement.servers.push(server);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
storage.append(operationJSONPointer);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export default plugin;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Path } from '@speclynx/apidom-traverse';
|
|
2
|
+
import {
|
|
3
|
+
PathItemServersElement,
|
|
4
|
+
OperationServersElement,
|
|
5
|
+
ServersElement,
|
|
6
|
+
} from '@speclynx/apidom-ns-openapi-3-0';
|
|
7
|
+
|
|
8
|
+
import type OpenApi3_1Element from '../../elements/OpenApi3-1.ts';
|
|
9
|
+
import type PathItemElement from '../../elements/PathItem.ts';
|
|
10
|
+
import type ServerElement from '../../elements/Server.ts';
|
|
11
|
+
import type OperationElement from '../../elements/Operation.ts';
|
|
12
|
+
import type { Toolbox } from '../toolbox.ts';
|
|
13
|
+
import NormalizeStorage from './normalize-header-examples/NormalizeStorage.ts';
|
|
14
|
+
import { refractServer } from '../index.ts';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Override of Server Objects.
|
|
18
|
+
*
|
|
19
|
+
* List of Server Objects can be defined in OpenAPI 3.1 on multiple levels:
|
|
20
|
+
*
|
|
21
|
+
* - OpenAPI.servers
|
|
22
|
+
* - PathItem.servers
|
|
23
|
+
* - Operation.servers
|
|
24
|
+
*
|
|
25
|
+
* If a servers array is specified at the OpenAPI Object level, it will be overridden by `PathItem`.servers.
|
|
26
|
+
* If a servers array is specified at the Path Item Object or OpenAPI Object level, it will be overridden by Operation.servers.
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export interface PluginOptions {
|
|
31
|
+
storageField?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @public
|
|
36
|
+
*/
|
|
37
|
+
const plugin =
|
|
38
|
+
({ storageField = 'x-normalized' }: PluginOptions = {}) =>
|
|
39
|
+
(toolbox: Toolbox) => {
|
|
40
|
+
const { ancestorLineageToJSONPointer, predicates } = toolbox;
|
|
41
|
+
let storage: NormalizeStorage | undefined;
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
visitor: {
|
|
45
|
+
OpenApi3_1Element: {
|
|
46
|
+
enter(path: Path<OpenApi3_1Element>) {
|
|
47
|
+
const openapiElement = path.node;
|
|
48
|
+
const isServersUndefined = typeof openapiElement.servers === 'undefined';
|
|
49
|
+
const isServersArrayElement = predicates.isArrayElement(openapiElement.servers);
|
|
50
|
+
const isServersEmpty = isServersArrayElement && openapiElement.servers!.length === 0;
|
|
51
|
+
const defaultServer = refractServer({ url: '/' });
|
|
52
|
+
|
|
53
|
+
if (isServersUndefined || !isServersArrayElement) {
|
|
54
|
+
openapiElement.servers = new ServersElement([defaultServer]);
|
|
55
|
+
} else if (isServersArrayElement && isServersEmpty) {
|
|
56
|
+
openapiElement.servers!.push(defaultServer);
|
|
57
|
+
}
|
|
58
|
+
storage = new NormalizeStorage(openapiElement, storageField, 'servers');
|
|
59
|
+
},
|
|
60
|
+
leave() {
|
|
61
|
+
storage = undefined;
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
PathItemElement(path: Path<PathItemElement>) {
|
|
65
|
+
const pathItemElement = path.node;
|
|
66
|
+
const ancestors = path.getAncestorNodes().reverse(); // root to parent order
|
|
67
|
+
|
|
68
|
+
// skip visiting this Path Item
|
|
69
|
+
if (ancestors.some(predicates.isComponentsElement)) return;
|
|
70
|
+
if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
|
|
71
|
+
|
|
72
|
+
const pathItemJSONPointer = ancestorLineageToJSONPointer([...ancestors, pathItemElement]);
|
|
73
|
+
|
|
74
|
+
// skip visiting this Path Item Object if it's already normalized
|
|
75
|
+
if (storage!.includes(pathItemJSONPointer)) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const parentOpenapiElement = ancestors.find(predicates.isOpenApi3_1Element);
|
|
80
|
+
const isServersUndefined = typeof pathItemElement.servers === 'undefined';
|
|
81
|
+
const isServersArrayElement = predicates.isArrayElement(pathItemElement.servers);
|
|
82
|
+
const isServersEmpty = isServersArrayElement && pathItemElement.servers!.length === 0;
|
|
83
|
+
|
|
84
|
+
// duplicate OpenAPI.servers into this Path Item object
|
|
85
|
+
if (predicates.isOpenApi3_1Element(parentOpenapiElement)) {
|
|
86
|
+
const openapiServersContent = (parentOpenapiElement as unknown as OpenApi3_1Element)
|
|
87
|
+
.servers?.content;
|
|
88
|
+
const openapiServers = (openapiServersContent ?? []) as ServerElement[];
|
|
89
|
+
|
|
90
|
+
if (isServersUndefined || !isServersArrayElement) {
|
|
91
|
+
pathItemElement.servers = new PathItemServersElement(openapiServers);
|
|
92
|
+
} else if (isServersArrayElement && isServersEmpty) {
|
|
93
|
+
openapiServers.forEach((server) => {
|
|
94
|
+
pathItemElement.servers!.push(server);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
storage!.append(pathItemJSONPointer);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
OperationElement(path: Path<OperationElement>) {
|
|
101
|
+
const operationElement = path.node;
|
|
102
|
+
const ancestors = path.getAncestorNodes().reverse(); // root to parent order
|
|
103
|
+
|
|
104
|
+
// skip visiting this Operation
|
|
105
|
+
if (ancestors.some(predicates.isComponentsElement)) return;
|
|
106
|
+
if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
|
|
107
|
+
|
|
108
|
+
const operationJSONPointer = ancestorLineageToJSONPointer([
|
|
109
|
+
...ancestors,
|
|
110
|
+
operationElement,
|
|
111
|
+
]);
|
|
112
|
+
|
|
113
|
+
// skip visiting this Operation Object if it's already normalized
|
|
114
|
+
if (storage!.includes(operationJSONPointer)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// @TODO(vladimir.gorej@gmail.com): can be replaced by Array.prototype.findLast in future
|
|
119
|
+
const parentPathItemElement = ancestors.findLast(predicates.isPathItemElement);
|
|
120
|
+
const isServersUndefined = typeof operationElement.servers === 'undefined';
|
|
121
|
+
const isServersArrayElement = predicates.isArrayElement(operationElement.servers);
|
|
122
|
+
const isServersEmpty = isServersArrayElement && operationElement.servers!.length === 0;
|
|
123
|
+
|
|
124
|
+
if (predicates.isPathItemElement(parentPathItemElement)) {
|
|
125
|
+
const pathItemServersContent = (parentPathItemElement as unknown as PathItemElement)
|
|
126
|
+
.servers?.content;
|
|
127
|
+
const pathItemServers = (pathItemServersContent ?? []) as ServerElement[];
|
|
128
|
+
|
|
129
|
+
if (isServersUndefined || !isServersArrayElement) {
|
|
130
|
+
// duplicate parent PathItem.servers into this Operation object
|
|
131
|
+
operationElement.servers = new OperationServersElement(pathItemServers);
|
|
132
|
+
} else if (isServersArrayElement && isServersEmpty) {
|
|
133
|
+
pathItemServers.forEach((server) => {
|
|
134
|
+
operationElement.servers!.push(server);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
storage!.append(operationJSONPointer);
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export default plugin;
|