So funktioniert es
Kein Monkey-Patching, keine Runtime-Proxys: nur das richtige Timing und Reflect-Metadaten.
Die Pipeline
DocfyModule.forRoot() läuft synchron während der NestFactory.create()-Phase, bevor SwaggerModule.createDocument() aufgerufen wird. Es nutzt require(), um jede Companion-Docs-Datei zu laden, was docs() ausführt und Reflect-Metadaten direkt auf die Methoden des Controllers schreibt, genau so, wie TypeScripts Decorator-Syntax es zur Klassendefinitionszeit tun würde.
Wenn SwaggerModule.createDocument() nach Metadaten sucht, ist bereits alles vorhanden. Kein Monkey-Patching, keine Runtime-Proxys.
Timing
onModuleInit und andere Lifecycle-Hooks feuern, nachdem SwaggerModule.createDocument() in main.ts bereits aufgerufen wurde. Jeder auf onModuleInit basierende Ansatz würde eine leere Swagger-Dokumentation erzeugen. Deshalb vermeidet nestjs-docfy diesen Weg und nutzt ein synchrones require() innerhalb von forRoot(), das während NestFactory.create() läuft, vor jedem Lifecycle-Hook oder SwaggerModule-Aufruf.
CLI: statische Analyse
Die generate-CLI nutzt ts-morph für statische Analyse: Sie liest den TypeScript-AST, ohne jeglichen Projektcode auszuführen. Alle benutzerdefinierten Pfade und Glob-Muster werden vor der Verwendung validiert und bereinigt.