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():

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

A 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

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
Quando isso não ajuda

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.