docfy export

Bootet die eigene Nest-App des Projekts und schreibt das OpenAPI-Dokument, ohne einen Port zu binden oder laufende Infrastruktur zu benötigen.

Warum es das gibt

Das Einzige, was SwaggerModule.createDocument() strukturell braucht, ist eine vollständig initialisierte Nest-App: Ihr DI-Container muss jeden Provider auflösen, bevor Route- und DTO-Metadaten zur Introspektion existieren.

Das erfordert kein .listen(). Es wird kein Port gebunden.

In der Praxis braucht es meist auch keine laufende Infrastruktur: Die meisten TypeOrmModule-, ioredis- und kafkajs-Clients verbinden sich lazy statt den Bootstrap zu blockieren, sodass export in der Regel auch funktioniert, wenn Datenbank, Redis und Kafka alle gestoppt sind.

Verwendung

Stell eine kleine Entry-Datei bereit (dieselben Zeilen, die deine main.ts schon hat, minus .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

Informative Ausgabe geht immer nach stderr, nie nach stdout, das Piping ist also sicher: npx nestjs-docfy export --entry docfy-export.ts > openapi.json.

Der Entry-Datei-Vertrag

Der Default-Export ist eine asynchrone Funktion, die { app, document } zurückgibt. export führt sie in einem Child-Prozess aus, serialisiert document und ruft danach für dich app.close() auf.

Eine .ts-Entry-Datei braucht ts-node als devDependency in deinem Projekt (und auch tsconfig-paths, für Pfad-Aliase wie @app/common).

Optionen

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
Wann das nicht hilft

Ein Provider mit einer wirklich eager, hart fehlschlagenden Verbindung in seinem Konstruktor oder onModuleInit profitiert nicht davon, Infra auf diese Weise zu überspringen. Nichts in export ändert, wie deine eigenen Provider sich verbinden. Es vermeidet nur das eine, was NestJS selbst nicht braucht: einen offenen Port.