1 | "use strict";
|
---|
2 |
|
---|
3 | exports.__esModule = true;
|
---|
4 | exports.default = void 0;
|
---|
5 | var _apidomNsOpenapi = require("@swagger-api/apidom-ns-openapi-3-0");
|
---|
6 | /**
|
---|
7 | * Override of Server Objects.
|
---|
8 | *
|
---|
9 | * List of Server Objects can be defined in OpenAPI 3.1 on multiple levels:
|
---|
10 | *
|
---|
11 | * - OpenAPI.servers
|
---|
12 | * - PathItem.servers
|
---|
13 | * - Operation.servers
|
---|
14 | *
|
---|
15 | * If an alternative server object is specified at the Path Item Object level, it will override OpenAPI.servers.
|
---|
16 | * If an alternative server object is specified at the Operation Object level, it will override PathItem.servers and OpenAPI.servers respectively.
|
---|
17 | */
|
---|
18 |
|
---|
19 | /* eslint-disable no-param-reassign */
|
---|
20 | const plugin = () => ({
|
---|
21 | predicates,
|
---|
22 | namespace
|
---|
23 | }) => {
|
---|
24 | return {
|
---|
25 | visitor: {
|
---|
26 | OpenApi3_1Element(openapiElement) {
|
---|
27 | const isServersUndefined = typeof openapiElement.servers === 'undefined';
|
---|
28 | const isServersArrayElement = predicates.isArrayElement(openapiElement.servers);
|
---|
29 | const isServersEmpty = isServersArrayElement && openapiElement.servers.length === 0;
|
---|
30 | // @ts-ignore
|
---|
31 | const defaultServer = namespace.elements.Server.refract({
|
---|
32 | url: '/'
|
---|
33 | });
|
---|
34 | if (isServersUndefined || !isServersArrayElement) {
|
---|
35 | openapiElement.servers = new _apidomNsOpenapi.ServersElement([defaultServer]);
|
---|
36 | } else if (isServersArrayElement && isServersEmpty) {
|
---|
37 | openapiElement.servers.push(defaultServer);
|
---|
38 | }
|
---|
39 | },
|
---|
40 | PathItemElement(pathItemElement, key, parent, path, ancestors) {
|
---|
41 | // skip visiting this Path Item
|
---|
42 | if (ancestors.some(predicates.isComponentsElement)) return;
|
---|
43 | if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
|
---|
44 | const parentOpenapiElement = ancestors.find(predicates.isOpenApi3_1Element);
|
---|
45 | const isServersUndefined = typeof pathItemElement.servers === 'undefined';
|
---|
46 | const isServersArrayElement = predicates.isArrayElement(pathItemElement.servers);
|
---|
47 | const isServersEmpty = isServersArrayElement && pathItemElement.servers.length === 0;
|
---|
48 |
|
---|
49 | // duplicate OpenAPI.servers into this Path Item object
|
---|
50 | if (predicates.isOpenApi3_1Element(parentOpenapiElement)) {
|
---|
51 | var _parentOpenapiElement;
|
---|
52 | const openapiServersContent = (_parentOpenapiElement = parentOpenapiElement.servers) == null ? void 0 : _parentOpenapiElement.content;
|
---|
53 | const openapiServers = openapiServersContent != null ? openapiServersContent : [];
|
---|
54 | if (isServersUndefined || !isServersArrayElement) {
|
---|
55 | pathItemElement.servers = new _apidomNsOpenapi.PathItemServersElement(openapiServers);
|
---|
56 | } else if (isServersArrayElement && isServersEmpty) {
|
---|
57 | openapiServers.forEach(server => {
|
---|
58 | pathItemElement.servers.push(server);
|
---|
59 | });
|
---|
60 | }
|
---|
61 | }
|
---|
62 | },
|
---|
63 | OperationElement(operationElement, key, parent, path, ancestors) {
|
---|
64 | // skip visiting this Operation
|
---|
65 | if (ancestors.some(predicates.isComponentsElement)) return;
|
---|
66 | if (!ancestors.some(predicates.isOpenApi3_1Element)) return;
|
---|
67 |
|
---|
68 | // @TODO(vladimir.gorej@gmail.com): can be replaced by Array.prototype.findLast in future
|
---|
69 | const parentPathItemElement = [...ancestors].reverse().find(predicates.isPathItemElement);
|
---|
70 | const isServersUndefined = typeof operationElement.servers === 'undefined';
|
---|
71 | const isServersArrayElement = predicates.isArrayElement(operationElement.servers);
|
---|
72 | const isServersEmpty = isServersArrayElement && operationElement.servers.length === 0;
|
---|
73 | if (predicates.isPathItemElement(parentPathItemElement)) {
|
---|
74 | var _parentPathItemElemen;
|
---|
75 | const pathItemServersContent = (_parentPathItemElemen = parentPathItemElement.servers) == null ? void 0 : _parentPathItemElemen.content;
|
---|
76 | const pathItemServers = pathItemServersContent != null ? pathItemServersContent : [];
|
---|
77 | if (isServersUndefined || !isServersArrayElement) {
|
---|
78 | // duplicate parent PathItem.servers into this Operation object
|
---|
79 | operationElement.servers = new _apidomNsOpenapi.OperationServersElement(pathItemServers);
|
---|
80 | } else if (isServersArrayElement && isServersEmpty) {
|
---|
81 | pathItemServers.forEach(server => {
|
---|
82 | operationElement.servers.push(server);
|
---|
83 | });
|
---|
84 | }
|
---|
85 | }
|
---|
86 | }
|
---|
87 | }
|
---|
88 | };
|
---|
89 | };
|
---|
90 | /* eslint-enable */
|
---|
91 | var _default = exports.default = plugin; |
---|