docfy export

Arranca la propia app Nest del proyecto y escribe el documento OpenAPI, sin abrir un puerto ni necesitar infraestructura viva.

Por qué existe

Lo único que SwaggerModule.createDocument() necesita estructuralmente es una app Nest completamente inicializada: su contenedor de DI tiene que resolver cada provider antes de que exista metadata de ruta/DTO para introspeccionar.

Eso no requiere .listen(). No se abre ningún puerto.

En la práctica tampoco suele necesitar infraestructura viva: la mayoría de clientes TypeOrmModule, ioredis y kafkajs se conectan de forma perezosa en vez de bloquear el bootstrap, así que export suele funcionar con la base de datos, Redis y Kafka todos parados.

Uso

Proporciona un pequeño entry file (las mismas líneas que ya tiene tu main.ts, menos .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

La salida informativa siempre va a stderr, nunca a stdout, así que es seguro hacer pipe: npx nestjs-docfy export --entry docfy-export.ts > openapi.json.

El contrato del entry file

El export por defecto es una función async que devuelve { app, document }. export la ejecuta en un proceso hijo, serializa document, y llama a app.close() por ti después.

Un entry .ts necesita ts-node como devDependency de tu proyecto (y también tsconfig-paths, para alias de path como @app/common).

Opciones

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
Cuando esto no ayuda

Un provider con una conexión genuinamente eager que falla bloqueando su constructor o onModuleInit no se beneficia de saltarse la infra así. Nada en export puede cambiar cómo se conectan tus propios providers. Solo evita la única cosa que el propio NestJS no necesita: un puerto abierto.