swagger-auto-generate
Version:
Automatically generate Swagger JSDoc documentation for Express applications
164 lines ⢠6.13 kB
JavaScript
;
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