UNPKG

swagger-auto-generate

Version:

Automatically generate Swagger JSDoc documentation for Express applications

164 lines • 6.13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExpressIntegration = void 0; const SwaggerAuto_1 = require("./SwaggerAuto"); // @ts-ignore const swagger_jsdoc_1 = __importDefault(require("swagger-jsdoc")); // @ts-ignore const swagger_ui_express_1 = __importDefault(require("swagger-ui-express")); class ExpressIntegration { constructor(config) { this.config = config; this.swaggerAuto = new SwaggerAuto_1.SwaggerAuto(config.swaggerConfig); } /** * Setup Swagger documentation with Express */ async setup() { const { app, swaggerConfig, autoSetup = true } = this.config; // Generate initial documentation await this.swaggerAuto.generate(); // Setup swagger-jsdoc const swaggerOptions = { definition: { openapi: '3.0.0', info: { title: swaggerConfig.swaggerInfo.title, version: swaggerConfig.swaggerInfo.version, description: swaggerConfig.swaggerInfo.description, host: swaggerConfig.swaggerInfo.host, basePath: swaggerConfig.swaggerInfo.basePath, schemes: swaggerConfig.swaggerInfo.schemes, }, servers: swaggerConfig.swaggerInfo.host ? [ { url: `${swaggerConfig.swaggerInfo.schemes?.[0] || 'http'}://${swaggerConfig.swaggerInfo.host}${swaggerConfig.swaggerInfo.basePath || ''}`, description: 'Development server', }, ] : undefined, }, apis: swaggerConfig.inputFolders.map(folder => `${folder}/**/*.{js,ts}`), }; const swaggerSpec = (0, swagger_jsdoc_1.default)(swaggerOptions); // Setup swagger-ui-express const uiOptions = { explorer: true, customSiteTitle: swaggerConfig.swaggerInfo.title, swaggerOptions: { docExpansion: 'list', filter: true, showRequestHeaders: true, tryItOutEnabled: true, }, ...swaggerConfig.swaggerUi?.options, }; // Add Swagger UI route const swaggerRoute = swaggerConfig.swaggerUi?.route || '/api-docs'; app.use(swaggerRoute, swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swaggerSpec, uiOptions)); // Add JSON endpoint app.get(`${swaggerRoute}/json`, (req, res) => { res.json(swaggerSpec); }); // Add YAML endpoint app.get(`${swaggerRoute}/yaml`, (req, res) => { res.setHeader('Content-Type', 'text/yaml'); res.send(this.convertToYaml(swaggerSpec)); }); console.log(`āœ… Swagger UI available at: ${swaggerRoute}`); console.log(`šŸ“„ Swagger JSON available at: ${swaggerRoute}/json`); console.log(`šŸ“„ Swagger YAML available at: ${swaggerRoute}/yaml`); // Setup auto-generation if enabled if (autoSetup && swaggerConfig.watchMode) { await this.setupAutoGeneration(); } } /** * Setup auto-generation on file changes */ async setupAutoGeneration() { const { swaggerConfig } = this.config; console.log('šŸ‘€ Setting up auto-generation on file changes...'); const chokidar = require('chokidar'); const watcher = chokidar.watch(swaggerConfig.inputFolders, { ignored: [ '**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**', '**/coverage/**', '**/__mocks__/**', '**/*.test.js', '**/*.test.ts', '**/*.spec.js', '**/*.spec.ts', ], persistent: true, }); let debounceTimer; const regenerate = () => { clearTimeout(debounceTimer); debounceTimer = setTimeout(async () => { console.log('šŸ”„ File change detected, regenerating documentation...'); try { await this.swaggerAuto.generate(); console.log('āœ… Documentation regenerated successfully!'); } catch (error) { console.error('āŒ Error during regeneration:', error); } }, 1000); // Debounce for 1 second }; watcher .on('add', (path) => { console.log(`šŸ“„ File added: ${path}`); regenerate(); }) .on('change', (path) => { console.log(`šŸ“„ File changed: ${path}`); regenerate(); }) .on('unlink', (path) => { console.log(`šŸ“„ File removed: ${path}`); regenerate(); }) .on('error', (error) => { console.error('āŒ Watcher error:', error); }); // Keep the process running process.on('SIGINT', () => { console.log('\nšŸ‘‹ Stopping file watcher...'); watcher.close(); process.exit(0); }); } /** * Convert JSON to YAML */ convertToYaml(obj) { try { const yaml = require('js-yaml'); return yaml.dump(obj); } catch (error) { console.warn('āš ļø js-yaml not available, returning JSON instead'); return JSON.stringify(obj, null, 2); } } /** * Generate JSDoc comments in source files */ async generateJSDocComments() { await this.swaggerAuto.generateJSDocComments(); } /** * Manual regeneration of documentation */ async regenerate() { await this.swaggerAuto.generate(); } } exports.ExpressIntegration = ExpressIntegration; //# sourceMappingURL=ExpressIntegration.js.map