docfy export
Uruchamia własną aplikację Nest projektu i zapisuje dokument OpenAPI, bez bindowania portu ani potrzeby żywej infrastruktury.
Dlaczego istnieje
Jedyne, czego strukturalnie potrzebuje SwaggerModule.createDocument(), to w pełni zainicjalizowana aplikacja Nest: jej kontener DI musi rozwiązać każdy provider, zanim metadane tras i DTO w ogóle istnieją do introspekcji.
To nie wymaga .listen(). Żaden port nie jest bindowany.
W praktyce zwykle nie wymaga też żywej infrastruktury: większość klientów TypeOrmModule, ioredis i kafkajs łączy się leniwie zamiast blokować bootstrap, więc export zwykle działa nawet z zatrzymaną bazą danych, Redisem i Kafką.
Użycie
Podaj mały plik wejściowy (te same linie, które ma już Twój main.ts, minus .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.jsonWyjście informacyjne zawsze idzie na stderr, nigdy na stdout, więc bezpiecznie można je przekierować: npx nestjs-docfy export --entry docfy-export.ts > openapi.json.
Kontrakt pliku wejściowego
Domyślny eksport to asynchroniczna funkcja zwracająca { app, document }. export uruchamia ją w osobnym procesie potomnym, serializuje document i wywołuje za Ciebie app.close() na koniec.
Plik wejściowy .ts wymaga ts-node jako zależności devDependency Twojego projektu (a także tsconfig-paths, dla aliasów ścieżek takich jak @app/common).
Opcje
| 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 |
Provider z prawdziwie żarłocznym, twardo zawodzącym połączeniem w konstruktorze albo onModuleInit nie skorzysta na pominięciu infrastruktury w ten sposób. Nic w export nie zmienia sposobu, w jaki łączą się Twoje własne providery. Omija tylko jedną rzecz, której sam NestJS nie potrzebuje: otwarty port.