docfy export
Поднимает Nest-приложение самого проекта и записывает документ OpenAPI, не занимая порт и не требуя живой инфраструктуры.
Зачем это нужно
Единственное, что структурно нужно SwaggerModule.createDocument(), — это полностью поднятое приложение Nest: его контейнер DI должен разрешить все провайдеры, и только тогда появятся метаданные маршрутов и DTO, которые можно разобрать.
Вызов .listen() для этого не нужен. Порт не занимается.
На практике живая инфраструктура тоже обычно не требуется: большинство клиентов TypeOrmModule, ioredis и kafkajs подключаются лениво, а не блокируют старт, поэтому export как правило отрабатывает при выключенных базе, Redis и Kafka.
Использование
Заведите небольшой входной файл (те же строки, что уже есть в вашем main.ts, но без .listen()):
// docfy-export.ts
import { NestFactory } from '@nestjs/core';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { AppModule } from './app.module';
export default async function () {
const app = await NestFactory.create(AppModule, { logger: false });
const config = new DocumentBuilder().setTitle('My API').setVersion('1.0.0').build();
const document = SwaggerModule.createDocument(app, config);
return { app, document }; // `app` gets closed for you afterward
}npx nestjs-docfy export --entry docfy-export.ts --out openapi.jsonСлужебный вывод всегда идёт в stderr и никогда в stdout, поэтому перенаправлять поток безопасно: npx nestjs-docfy export --entry docfy-export.ts > openapi.json.
Контракт входного файла
Экспорт по умолчанию — это асинхронная функция, возвращающая { app, document }. export запускает её в отдельном дочернем процессе, сериализует document и сам вызывает потом app.close().
Для входного файла .ts нужен ts-node в devDependencies проекта, а для путевых алиасов вроде @app/common ещё и tsconfig-paths.
Параметры
| Option | Default | Description |
|---|---|---|
--entry <path> | (required) | .ts/.js file whose default export returns { app, document } |
--out <path> | stdout | Where to write the document |
--root <path> | . | Project root — where ts-node/tsconfig-paths are resolved from |
--quiet | false | Suppress informational output |
Провайдер, который честно подключается сразу и падает при неудаче прямо в конструкторе или в onModuleInit, от такого обхода инфраструктуры ничего не выиграет. export не может изменить то, как подключаются ваши собственные провайдеры. Он лишь избавляет от единственной вещи, которая не нужна и самому NestJS: открытого порта.