docfy export

Поднимает Nest-приложение самого проекта и записывает документ OpenAPI, не занимая порт и не требуя живой инфраструктуры.

Зачем это нужно

Единственное, что структурно нужно SwaggerModule.createDocument(), — это полностью поднятое приложение Nest: его контейнер DI должен разрешить все провайдеры, и только тогда появятся метаданные маршрутов и DTO, которые можно разобрать.

Вызов .listen() для этого не нужен. Порт не занимается.

На практике живая инфраструктура тоже обычно не требуется: большинство клиентов TypeOrmModule, ioredis и kafkajs подключаются лениво, а не блокируют старт, поэтому export как правило отрабатывает при выключенных базе, Redis и Kafka.

Использование

Заведите небольшой входной файл (те же строки, что уже есть в вашем main.ts, но без .listen()):

ts
// 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
}
bash
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.

Параметры

OptionDefaultDescription
--entry <path>(required).ts/.js file whose default export returns { app, document }
--out <path>stdoutWhere to write the document
--root <path>.Project root — where ts-node/tsconfig-paths are resolved from
--quietfalseSuppress informational output
Когда это не поможет

Провайдер, который честно подключается сразу и падает при неудаче прямо в конструкторе или в onModuleInit, от такого обхода инфраструктуры ничего не выиграет. export не может изменить то, как подключаются ваши собственные провайдеры. Он лишь избавляет от единственной вещи, которая не нужна и самому NestJS: открытого порта.