Skip to content

Commit d510734

Browse files
committed
feat: Add detailed JSDoc comments to logging functions and console entry point for improved documentation
1 parent e976965 commit d510734

File tree

3 files changed

+176
-20
lines changed

3 files changed

+176
-20
lines changed
Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,41 @@
1-
import { LogLevel } from '@nestjs/common';
1+
import { LogLevel } from '@nestjs/common'
22

3+
/**
4+
* Retourne un tableau de niveaux de log NestJS basé sur le niveau spécifié.
5+
*
6+
* Cette fonction implémente une hiérarchie de log cumulative où chaque niveau
7+
* inclut automatiquement tous les niveaux plus critiques. Par exemple, le niveau
8+
* "warn" inclura également "error" et "fatal".
9+
*
10+
* @param {string} [logLevel] - Niveau de log souhaité ('fatal', 'error', 'warn', 'info', 'debug', 'verbose')
11+
* @returns {LogLevel[]} Tableau des niveaux de log activés pour ce niveau
12+
*
13+
* @description
14+
* Hiérarchie des niveaux (du plus critique au plus verbeux) :
15+
* - fatal: Erreurs critiques uniquement
16+
* - error: Erreurs (error + fatal)
17+
* - warn: Avertissements (warn + error + fatal)
18+
* - info: Informations (log + warn + error + fatal)
19+
* - debug: Debug (debug + log + warn + error + fatal)
20+
* - verbose: Tout (verbose + debug + log + warn + error + fatal)
21+
*
22+
* Si aucun niveau n'est spécifié ou si le niveau est invalide, retourne 'info' par défaut.
23+
*
24+
* @example
25+
* ```typescript
26+
* // Configuration du logger avec niveau warn
27+
* const levels = getLogLevel('warn');
28+
* // Retourne: ['error', 'fatal', 'warn']
29+
*
30+
* // Configuration du logger avec niveau debug
31+
* const levels = getLogLevel('debug');
32+
* // Retourne: ['error', 'fatal', 'warn', 'log', 'debug']
33+
*
34+
* // Niveau invalide ou non spécifié
35+
* const levels = getLogLevel();
36+
* // Retourne: ['error', 'fatal', 'warn', 'log'] (niveau 'info' par défaut)
37+
* ```
38+
*/
339
export function getLogLevel(logLevel?: string): LogLevel[] {
440
const logLevelMap: Record<LogLevel | string, LogLevel[]> = {
541
fatal: ['fatal'],
@@ -8,6 +44,36 @@ export function getLogLevel(logLevel?: string): LogLevel[] {
844
info: ['error', 'fatal', 'warn', 'log'],
945
debug: ['error', 'fatal', 'warn', 'log', 'debug'],
1046
verbose: ['error', 'fatal', 'warn', 'log', 'debug', 'verbose'],
11-
};
12-
return logLevelMap[logLevel] || logLevelMap['info'];
47+
}
48+
49+
return logLevelMap[logLevel] || logLevelMap['info']
1350
}
51+
52+
/**
53+
* Niveau de log par défaut pour l'application.
54+
*
55+
* Correspond au niveau 'info' qui inclut les logs, avertissements, erreurs et fatals.
56+
* Ce niveau offre un bon équilibre entre visibilité et performance pour la production.
57+
*
58+
* @constant
59+
* @type {LogLevel[]}
60+
* @default ['error', 'fatal', 'warn', 'log']
61+
*/
62+
export const DEFAULT_LOG_LEVEL: LogLevel[] = getLogLevel('info')
63+
64+
/**
65+
* Niveau de log minimal pour les commandes console.
66+
*
67+
* Mode silencieux affichant uniquement les erreurs critiques pour éviter
68+
* de polluer la sortie des commandes CLI. Utile lors de l'exécution de
69+
* scripts ou de tâches automatisées.
70+
*
71+
* @constant
72+
* @type {LogLevel[]}
73+
*
74+
* @description
75+
* Ce niveau est utilisé au démarrage des commandes console pour minimiser
76+
* le bruit dans les logs et garder une sortie propre et lisible.
77+
* Correspond au niveau 'warn' qui inclut warn, error et fatal.
78+
*/
79+
export const CONSOLE_LOG_LEVEL: LogLevel[] = getLogLevel('warn')

apps/api/src/_common/functions/is-cli.ts

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,68 @@
1-
import { Abstract, DynamicModule, ForwardReference, Provider, Type } from '@nestjs/common'
21
import path from 'node:path'
2+
import { Abstract, DynamicModule, ForwardReference, Provider, Type } from '@nestjs/common'
33

4+
/**
5+
* Vérifie si le point d'entrée actuel est le mode console.
6+
*
7+
* Détermine si l'application a été lancée via le fichier console.ts ou console.js
8+
* en analysant le nom du fichier principal d'exécution.
9+
*
10+
* @returns {boolean} `true` si l'application est en mode console, `false` sinon
11+
*
12+
* @description
13+
* La détection se fait en vérifiant le nom du fichier d'entrée via :
14+
* 1. require.main.filename (module principal)
15+
* 2. process.argv[1] (premier argument du processus)
16+
*/
417
export function isConsoleEntrypoint(): boolean {
518
const entry =
619
(require?.main?.filename ?? process.argv[1] ?? '').toLowerCase()
720
const base = path.basename(entry)
821
return /^(console)\.(t|j)s$/.test(base)
922
}
1023

24+
/**
25+
* Retourne des providers, modules ou imports uniquement en mode console (CLI).
26+
*
27+
* Cette fonction utilitaire permet de conditionner l'inclusion de modules,
28+
* providers ou imports NestJS au contexte d'exécution. Les éléments ne seront
29+
* inclus que si l'application est lancée en mode console.
30+
*
31+
* @template T Type des éléments (Provider, DynamicModule, etc.)
32+
* @param {T | T[]} items - Élément(s) à inclure conditionnellement
33+
* @returns {T[]} Tableau des éléments si en mode console, tableau vide sinon
34+
*
35+
* @description
36+
* Cas d'usage typiques :
37+
* - Charger des modules CLI uniquement en mode console
38+
* - Injecter des providers spécifiques aux commandes
39+
* - Éviter le chargement de dépendances inutiles en mode serveur
40+
*
41+
* La fonction normalise toujours le retour en tableau, que l'entrée
42+
* soit un élément unique ou un tableau.
43+
*
44+
* @example
45+
* ```typescript
46+
* // Dans un module NestJS
47+
* @Module({
48+
* imports: [
49+
* CommonModule,
50+
* ...useOnCli([
51+
* CommanderModule,
52+
* InquirerModule,
53+
* ]),
54+
* ],
55+
* providers: [
56+
* AppService,
57+
* ...useOnCli(CliService),
58+
* ],
59+
* })
60+
* export class AppModule {}
61+
*
62+
* // En mode console : CommanderModule et InquirerModule sont chargés
63+
* // En mode serveur : Ces modules sont ignorés
64+
* ```
65+
*/
1166
export function useOnCli<
1267
T = Provider
1368
| (Type<any> | DynamicModule | Promise<DynamicModule> | ForwardReference<any>)

apps/api/src/console.ts

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,64 @@
1-
import { CommandFactory } from 'nest-commander';
2-
import configInstance from '~/config';
3-
import { getLogLevel } from './_common/functions/get-log-level';
4-
import { InternalLogger } from './core/logger/internal.logger';
5-
import { AppModule } from './app.module';
1+
import { CommandFactory } from 'nest-commander'
2+
import configInstance from '~/config'
3+
import { CONSOLE_LOG_LEVEL } from './_common/functions/get-log-level'
4+
import { AppModule } from './app.module'
5+
import { InternalLogger } from './core/logger/internal.logger'
66

7+
/**
8+
* Point d'entrée de l'interface en ligne de commande (CLI) de l'application.
9+
*
10+
* Cette fonction asynchrone auto-exécutée initialise et démarre l'application
11+
* en mode console pour exécuter des commandes CLI définies via nest-commander.
12+
*
13+
* @async
14+
* @function
15+
* @returns {Promise<void>}
16+
*
17+
* @description
18+
* Processus de démarrage :
19+
* 1. Charge la configuration de l'application
20+
* 2. Initialise le logger avec un niveau minimal (CONSOLE_LOG_LEVEL)
21+
* 3. Log le démarrage de la CLI avec le niveau de log configuré
22+
* 4. Crée l'application via CommandFactory sans fermeture automatique
23+
* 5. Configure un gestionnaire d'erreurs personnalisé
24+
* 6. Ferme proprement l'application après exécution
25+
* 7. Gère les erreurs critiques avec code de sortie approprié
26+
*
27+
* Codes de sortie :
28+
* - 0 : Exécution réussie
29+
* - 1 : Erreur lors de l'exécution d'une commande
30+
* - 255 : Erreur critique lors de l'initialisation
31+
*
32+
* @example
33+
* ```bash
34+
* # Exécution d'une commande CLI
35+
* yarn run console agents:create
36+
*
37+
* # La fonction initialise automatiquement l'application
38+
* # et exécute la commande spécifiée
39+
* ```
40+
*
41+
* @throws {Error} Erreur fatale capturée et loggée avec code de sortie 255
42+
*/
743
(async () => {
844
try {
945
const cfg = configInstance();
1046
const logger = new InternalLogger({
11-
logLevel: ['error'],
12-
// logLevel: getLogLevel(cfg?.application?.logLevel),
47+
logLevel: CONSOLE_LOG_LEVEL, // Silencieux au démarrage des commandes console
1348
mongoose: cfg?.mongoose,
1449
});
15-
logger.log(`Starting CLI with log level <${cfg?.application?.logLevel || 'info'}>`);
50+
logger.log(`Starting CLI with log level <${cfg?.application?.logLevel || 'info'}>`)
1651
const app = await CommandFactory.runWithoutClosing(AppModule, {
1752
logger,
1853
errorHandler: (err) => {
19-
console.error(err);
20-
process.exit(1);
54+
console.error(err)
55+
process.exit(1)
2156
},
22-
});
23-
await app.close();
57+
})
58+
await app.close()
2459
} catch (err) {
25-
console.error(err);
26-
process.exit(255);
60+
console.error(err)
61+
process.exit(255)
2762
}
28-
process.exit(0);
29-
})();
63+
process.exit(0)
64+
})()

0 commit comments

Comments
 (0)