docfy export
Inicializa a própria app Nest do projeto e escreve o documento OpenAPI, sem abrir porta nem precisar de infra viva.
Por que existe
A única coisa que SwaggerModule.createDocument() estruturalmente precisa é uma app Nest totalmente inicializada — o container de DI precisa ter resolvido todo provider antes de existir metadata de rota/DTO pra introspectar.
Isso não exige .listen() — nenhuma porta é aberta.
Na prática também costuma não precisar de infra viva: a maioria dos clients TypeOrmModule, ioredis e kafkajs conecta de forma lazy em vez de bloquear o bootstrap, então export tende a funcionar com banco, Redis e Kafka todos parados.
Uso
Forneça um entry file pequeno — as mesmas linhas que seu main.ts já tem, menos o .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.jsonA saída informativa sempre vai pro stderr, nunca pro stdout — seguro pra fazer pipe: npx nestjs-docfy export --entry docfy-export.ts > openapi.json.
O contrato do arquivo de entrada
O export default é uma função assíncrona que retorna { app, document }. O export a executa num processo filho, serializa document e chama app.close() por você em seguida.
Um entry file .ts precisa de ts-node como devDependency do seu projeto (e de tsconfig-paths também, pra path aliases como @app/common).
Options
| 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 |
Um provider com uma conexão genuinamente eager, que falha bloqueando o construtor ou o onModuleInit, não se beneficia de pular a infra desse jeito — nada no export consegue mudar como seus próprios providers se conectam. Ele só evita a única coisa que o próprio NestJS não precisa: uma porta aberta.