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

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

Wyjś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

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
Kiedy to nie pomoże

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.