UNPKG

alapa

Version:

A cutting-edge web development framework designed to revolutionize the way developers build modern web applications.

173 lines (172 loc) 8.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateOpenAPIFile = generateOpenAPIFile; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const globals_1 = require("../shared/globals"); const entry_1 = require("./decorators/entry"); const utils_1 = require("../utils"); function buildResponse(response) { const responseData = {}; Object.keys(response).forEach((code) => { const data = response[code]; if (typeof data === "string") { responseData[code] = (0, utils_1.loadYaml)(`data/open-api/schemas/${data}.yaml`); } else { responseData[code] = {}; if (data["description"]) { responseData[code]["description"] = data["description"]; } if (data["content"]) { responseData[code]["content"] = {}; if (typeof data["content"] === "string") { responseData[code]["content"] = (0, utils_1.loadYaml)(`data/open-api/schemas/${data["content"]}.yaml`); } else { const content = data["content"]; Object.keys(data["content"]).forEach((key) => { responseData[code]["content"][key] = {}; if (content[key]["schema"]) { responseData[code]["content"][key]["schema"] = {}; if (typeof content[key]["schema"] == "string") { responseData[code]["content"][key]["schema"] = (0, utils_1.loadYaml)(`data/open-api/schemas/${content[key]["schema"]}.yaml`); } else { if (content[key]["schema"]["items"]) { responseData[code]["content"][key]["schema"]["items"] = {}; responseData[code]["content"][key]["schema"]["items"]["type"] = content[key]["schema"]["items"]["type"]; if (typeof content[key]["schema"]["items"] === "string") { responseData[code]["content"][key]["schema"]["items"] = (0, utils_1.loadYaml)(`data/open-api/schemas/${content[key]["schema"]["items"]}.yaml`); } else { if (typeof content[key]["schema"]["items"]["properties"] === "string") { responseData[code]["content"][key]["schema"]["items"]["properties"] = (0, utils_1.loadYaml)(`data/open-api/schemas/${content[key]["schema"]["items"]["properties"]}.yaml`); } } } } if (content[key]["schema"]["properties"]) { if (typeof content[key]["schema"]["properties"] === "string") { responseData[code]["content"][key]["schema"]["properties"] = (0, utils_1.loadYaml)(`data/open-api/schemas/${content[key]["schema"]["properties"]}.yaml`); } else { responseData[code]["content"][key]["schema"]["properties"] = content[key]["schema"]["properties"]; } } if (content[key]["schema"]["type"]) { responseData[code]["content"][key]["schema"]["type"] = content[key]["schema"]["type"]; } } }); } } } }); return responseData; } function buildParameter(parameters) { if (typeof parameters === "string") { return (0, utils_1.loadYaml)(`data/open-api/schemas/${parameters}.yaml`); } return parameters; } function buildRequestBody(requestBody) { if (typeof requestBody === "string") { return (0, utils_1.loadYaml)(`data/open-api/schemas/${requestBody}.yaml`); } return requestBody; } function buildPaths() { const collections = entry_1.temporalCollections["routes"]; let generalTags = entry_1.temporalCollections["generalTags"]; Object.keys(collections).forEach((key) => { const route = collections[key]; entry_1.openApiDefinitionsPaths[key] = {}; Object.keys(route).forEach((method) => { entry_1.openApiDefinitionsPaths[key][method] = {}; const data = route[method]; entry_1.openApiDefinitionsPaths[key][method]["operationId"] = (0, utils_1.randomNumber)(); if (data["summary"]) { entry_1.openApiDefinitionsPaths[key][method]["summary"] = data["summary"]; } if (data["description"]) { entry_1.openApiDefinitionsPaths[key][method]["description"] = data["description"]; } if (data["tags"] && Array.isArray(data["tags"])) { entry_1.openApiDefinitionsPaths[key][method]["tags"] = data["tags"]; } if (data["security"]) { entry_1.openApiDefinitionsPaths[key][method]["security"] = data["security"]; } if (data["responses"]) { entry_1.openApiDefinitionsPaths[key][method]["responses"] = buildResponse(data["responses"]); } if (data["parameters"]) { entry_1.openApiDefinitionsPaths[key][method]["parameters"] = buildParameter(data["parameters"]); } if (data["requestBody"]) { entry_1.openApiDefinitionsPaths[key][method]["requestBody"] = buildRequestBody(data["requestBody"]); } let tags = data["tags"] || []; if (typeof tags === "string") { tags = tags.split(","); } console.log(generalTags); generalTags = generalTags[key] || []; if (typeof generalTags === "string") { generalTags = generalTags.split(","); } console.log(generalTags); entry_1.openApiDefinitionsPaths[key][method]["tags"] = [...generalTags, ...tags]; }); }); } function generateOpenAPIFile() { buildPaths(); let filePath = globals_1.GlobalConfig.api.openapiDefinitionFile; if (!filePath) filePath = "openapi.json"; const dir = path_1.default.dirname(filePath); if (!fs_1.default.existsSync(dir)) { fs_1.default.mkdirSync(dir, { recursive: true }); } let openApiDefinitions = globals_1.GlobalConfig.api.openApiDefinitions; if (!openApiDefinitions) { openApiDefinitions = { openapi: "3.0.0", version: "1.0.0", servers: [ { url: "http://localhost:3000/api", description: "Development Server server", }, ], info: { title: "API Documentation", version: "1.0.0", description: "API documentation for the application", }, paths: entry_1.openApiDefinitionsPaths, }; } else if (!openApiDefinitions.paths) { openApiDefinitions.paths = entry_1.openApiDefinitionsPaths; } // Append the message to the file try { fs_1.default.writeFileSync(filePath, JSON.stringify(openApiDefinitions)); } catch (e) { utils_1.Logger.error(`Error writing ${filePath} to ${openApiDefinitions}`, e); } }