Jak to działa
Bez monkey-patchingu, bez proxy w runtime: wystarczy właściwy moment i metadane Reflect.
Pipeline
DocfyModule.forRoot() działa synchronicznie podczas fazy NestFactory.create(), zanim wywołane zostanie SwaggerModule.createDocument(). Używa require(), aby wczytać każdy towarzyszący plik docs, który wykonuje docs() i zapisuje metadane Reflect bezpośrednio na metodach kontrolera, dokładnie tak, jak zrobiłaby to składnia dekoratorów TypeScript w momencie definicji klasy.
Zanim SwaggerModule.createDocument() zeskanuje metadane, wszystko jest już na miejscu. Bez monkey-patchingu, bez proxy w runtime.
Czasowanie
onModuleInit i inne hooki cyklu życia uruchamiają się już po tym, jak SwaggerModule.createDocument() zostało wywołane w main.ts. Każde podejście oparte na onModuleInit dałoby pustą dokumentację Swaggera. Dlatego nestjs-docfy unika tej ścieżki i używa synchronicznego require() wewnątrz forRoot(), które działa podczas NestFactory.create(), zanim jakikolwiek hook cyklu życia albo wywołanie SwaggerModule.
CLI: analiza statyczna
CLI generate używa ts-morph do analizy statycznej: czyta AST TypeScript bez wykonywania żadnego kodu projektu. Wszystkie ścieżki i wzorce glob podane przez użytkownika są walidowane i sanityzowane przed użyciem.