import 'reflect-metadata'; import { Module } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { DocumentBuilder, SwaggerModule, type OpenAPIObject } from '@nestjs/swagger'; import { mkdir, writeFile } from 'node:fs/promises'; import path from 'node:path'; import { format } from 'prettier'; import { HealthController } from '../apps/api/src/health.controller'; import { HealthService, MYSQL_HEALTH_PORT, REDIS_HEALTH_PORT, } from '../apps/api/src/health.service'; import { DisabledHealthClient } from '../libs/infrastructure/src/disabled-health.client'; @Module({ controllers: [HealthController], providers: [ HealthService, { provide: REDIS_HEALTH_PORT, useValue: new DisabledHealthClient('文档生成不连接 Redis') }, { provide: MYSQL_HEALTH_PORT, useValue: new DisabledHealthClient('文档生成不连接 MySQL') }, ], }) class OpenApiModule {} function sortObject(value: unknown): unknown { if (Array.isArray(value)) return value.map(sortObject); if (!value || typeof value !== 'object') return value; return Object.fromEntries( Object.entries(value as Record) .sort(([left], [right]) => left.localeCompare(right)) .map(([key, child]) => [key, sortObject(child)]), ); } export async function createOpenApiDocument(): Promise { const app = await NestFactory.create(OpenApiModule, { logger: false }); app.setGlobalPrefix('api/v1'); const options = new DocumentBuilder() .setTitle('A 股市场分析工具 API') .setVersion('0.0.8-draft') .build(); const document = SwaggerModule.createDocument(app, options); await app.close(); return sortObject(document) as OpenAPIObject; } async function writeOpenApiDocument(): Promise { const serverDirectory = path.resolve(__dirname, '..'); const output = path.join(serverDirectory, 'openapi', 'openapi.json'); const serialized = await format(JSON.stringify(await createOpenApiDocument()), { parser: 'json', }); await mkdir(path.dirname(output), { recursive: true }); await writeFile(output, serialized, 'utf8'); } if (require.main === module) { void writeOpenApiDocument().catch((error: unknown) => { console.error(error); process.exitCode = 1; }); }