Comment ça marche

Aucun monkey-patching, aucun proxy runtime : juste le bon timing et les métadonnées Reflect.

Le pipeline

DocfyModule.forRoot() s'exécute de façon synchrone pendant la phase NestFactory.create(), avant que SwaggerModule.createDocument() soit appelé. Il utilise require() pour charger chaque fichier docs compagnon, ce qui exécute docs() et écrit les métadonnées Reflect directement sur les méthodes du contrôleur, exactement comme le ferait la syntaxe de décorateur de TypeScript au moment de la définition de la classe.

Au moment où SwaggerModule.createDocument() scanne les métadonnées, tout est déjà en place. Aucun monkey-patching, aucun proxy runtime.

Timing

L'astuce de timing clé

onModuleInit et les autres hooks de cycle de vie se déclenchent après que SwaggerModule.createDocument() a déjà été appelé dans main.ts. Toute approche basée sur onModuleInit produirait une documentation Swagger vide. C'est pour ça que nestjs-docfy évite ce chemin et utilise un require() synchrone à l'intérieur de forRoot(), qui s'exécute pendant NestFactory.create(), avant tout hook de cycle de vie ou appel à SwaggerModule.

CLI : analyse statique

Le CLI generate utilise ts-morph pour l'analyse statique : il lit l'AST TypeScript sans exécuter aucun code du projet. Tous les chemins et motifs glob fournis par l'utilisateur sont validés et nettoyés avant utilisation.