source: node_modules/@swagger-api/apidom-ns-openapi-3-1/es/refractor/plugins/normalize-servers.mjs

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 16 months ago

Initial commit

  • Property mode set to 100644
File size: 4.3 KB
Line 
1import { 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 */
16const 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
88export default plugin;
Note: See TracBrowser for help on using the repository browser.