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
JavaScript
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);
}
}
;