tree-house
Version:
NodeJS utilities and handy helpers extending ExpressJS functionalities
70 lines (69 loc) • 3.24 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.setSwagger = void 0;
const swaggerUi = require("swagger-ui-express");
const yaml = require("js-yaml");
const fs = require("fs");
const path = require("path");
const SwaggerParser = require("@apidevtools/swagger-parser");
function setSwagger(app, route, filePath, options = {}) {
return __awaiter(this, void 0, void 0, function* () {
try {
const stats = fs.lstatSync(filePath);
let swaggerDocument;
if (options.concatenate) {
if (stats.isFile()) {
throw new Error('Boolean concatenate cannot be true when you specify a file. When you want to concatenate, specify a folder');
}
if (stats.isDirectory()) {
const swaggerContent = buildSwaggerDocumentFromFiles(filePath);
swaggerDocument = yaml.load(swaggerContent);
}
}
else {
if (stats.isFile()) {
swaggerDocument = yaml.load(fs.readFileSync(filePath, 'utf8'));
}
if (stats.isDirectory()) {
throw new Error('To concatenate a folder of swagger YAML files, you need to explicitly set the boolean concatenate to true in the swaggerOptions');
}
}
yield SwaggerParser.validate(swaggerDocument);
const useSchema = (schema, options) => (...args) => swaggerUi.setup(schema, options)(...args);
app.use(route, swaggerUi.serve, useSchema(swaggerDocument, options));
}
catch (e) {
throw new Error(`Failed to load swagger documentation: ${e}`);
}
});
}
exports.setSwagger = setSwagger;
function buildSwaggerDocumentFromFiles(filePath) {
let swaggerDocument = '';
try {
swaggerDocument += fs.readFileSync(path.join(filePath, 'index.yml'), 'utf8');
swaggerDocument += 'paths: \n';
}
catch (error) {
throw new Error(`Could not read index.yml make sure the file is named: index.yml and in the correct folder ${error}`);
}
try {
const routeFiles = fs.readdirSync(path.join(filePath, 'routes'));
routeFiles.forEach((file) => {
swaggerDocument += fs.readFileSync(path.join(filePath, 'routes', file), 'utf8');
});
}
catch (error) {
throw new Error(`Error while reading routes folder. Make sure there is one! , ${error}`);
}
return swaggerDocument;
}