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