import type { AppConfig } from "@/config/type"; import { Logger } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; import { NestFactory } from "@nestjs/core"; import type { NestExpressApplication } from "@nestjs/platform-express"; import { SwaggerModule, DocumentBuilder } from "@nestjs/swagger"; import "dotenv/config"; import * as fs from "fs"; import { Server } from "http"; import { WinstonModule } from "nest-winston"; import { bootstrap } from "./app"; import { AppModule } from "./app.module"; import { loggerConfig } from "./lib/logger"; const run = async () => { const app = await NestFactory.create(AppModule, { logger: WinstonModule.createLogger(loggerConfig()), bodyParser: false, }); const logger = new Logger("App"); try { bootstrap(app); const port = app.get(ConfigService).get("api.port", { infer: true }); void generateSwagger(app); await app.listen(port); logger.log(`Application started on port: ${port}`); } catch (error) { console.error(error); logger.error("Application crashed", { error, }); } }; async function generateSwagger(app: NestExpressApplication) { const logger = new Logger("App"); logger.log(`Generating Swagger documentation...\n`); const config = new DocumentBuilder().setTitle("BLS cal v2 API").build(); const document = SwaggerModule.createDocument(app, config); const outputFile = "./swagger/documentation.json"; if (fs.existsSync(outputFile)) { fs.unlinkSync(outputFile); } fs.writeFileSync(outputFile, JSON.stringify(document, null, 2), { encoding: "utf8" }); SwaggerModule.setup("docs", app, document, { customCss: ".swagger-ui .topbar { display: none }", }); logger.log(`Swagger documentation available in the "/docs" endpoint\n`); } run().catch((error: Error) => { console.error("Failed to start Cal Platform API", { error: error.stack }); process.exit(1); });