@oalacea/daemon 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/cli.d.ts +42 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +89 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/detect.command.d.ts +39 -0
- package/dist/cli/commands/detect.command.d.ts.map +1 -0
- package/dist/cli/commands/detect.command.js +111 -0
- package/dist/cli/commands/detect.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +11 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/init.command.d.ts +41 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -0
- package/dist/cli/commands/init.command.js +111 -0
- package/dist/cli/commands/init.command.js.map +1 -0
- package/dist/cli/commands/test.command.d.ts +58 -0
- package/dist/cli/commands/test.command.d.ts.map +1 -0
- package/dist/cli/commands/test.command.js +180 -0
- package/dist/cli/commands/test.command.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config/daemon.config.d.ts +32 -0
- package/dist/core/config/daemon.config.d.ts.map +1 -0
- package/dist/core/config/daemon.config.js +83 -0
- package/dist/core/config/daemon.config.js.map +1 -0
- package/dist/core/config/index.d.ts +5 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +5 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/constants.d.ts +36 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +56 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/types/common.types.d.ts +250 -0
- package/dist/core/types/common.types.d.ts.map +1 -0
- package/dist/core/types/common.types.js +7 -0
- package/dist/core/types/common.types.js.map +1 -0
- package/dist/core/types/detection.types.d.ts +232 -0
- package/dist/core/types/detection.types.d.ts.map +1 -0
- package/dist/core/types/detection.types.js +22 -0
- package/dist/core/types/detection.types.js.map +1 -0
- package/dist/core/types/docker.types.d.ts +322 -0
- package/dist/core/types/docker.types.d.ts.map +1 -0
- package/dist/core/types/docker.types.js +7 -0
- package/dist/core/types/docker.types.js.map +1 -0
- package/dist/core/types/index.d.ts +11 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +7 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/project.types.d.ts +74 -0
- package/dist/core/types/project.types.d.ts.map +1 -0
- package/dist/core/types/project.types.js +7 -0
- package/dist/core/types/project.types.js.map +1 -0
- package/dist/core/types/shared.types.d.ts +118 -0
- package/dist/core/types/shared.types.d.ts.map +1 -0
- package/dist/core/types/shared.types.js +7 -0
- package/dist/core/types/shared.types.js.map +1 -0
- package/dist/core/types/test.types.d.ts +230 -0
- package/dist/core/types/test.types.d.ts.map +1 -0
- package/dist/core/types/test.types.js +7 -0
- package/dist/core/types/test.types.js.map +1 -0
- package/dist/services/detection/__tests__/framework-detector.test.d.ts +5 -0
- package/dist/services/detection/__tests__/framework-detector.test.d.ts.map +1 -0
- package/dist/services/detection/__tests__/framework-detector.test.js +52 -0
- package/dist/services/detection/__tests__/framework-detector.test.js.map +1 -0
- package/dist/services/detection/framework-detector.d.ts +179 -0
- package/dist/services/detection/framework-detector.d.ts.map +1 -0
- package/dist/services/detection/framework-detector.js +636 -0
- package/dist/services/detection/framework-detector.js.map +1 -0
- package/dist/services/detection/index.d.ts +10 -0
- package/dist/services/detection/index.d.ts.map +1 -0
- package/dist/services/detection/index.js +7 -0
- package/dist/services/detection/index.js.map +1 -0
- package/dist/services/docker/__tests__/docker-manager.test.d.ts +5 -0
- package/dist/services/docker/__tests__/docker-manager.test.d.ts.map +1 -0
- package/dist/services/docker/__tests__/docker-manager.test.js +67 -0
- package/dist/services/docker/__tests__/docker-manager.test.js.map +1 -0
- package/dist/services/docker/docker-manager.d.ts +157 -0
- package/dist/services/docker/docker-manager.d.ts.map +1 -0
- package/dist/services/docker/docker-manager.js +516 -0
- package/dist/services/docker/docker-manager.js.map +1 -0
- package/dist/services/docker/index.d.ts +9 -0
- package/dist/services/docker/index.d.ts.map +1 -0
- package/dist/services/docker/index.js +9 -0
- package/dist/services/docker/index.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -0
- package/dist/services/index.js.map +1 -0
- package/dist/shared/errors/__tests__/base.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/base.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/base.error.test.js +61 -0
- package/dist/shared/errors/__tests__/base.error.test.js.map +1 -0
- package/dist/shared/errors/__tests__/command.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/command.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/command.error.test.js +62 -0
- package/dist/shared/errors/__tests__/command.error.test.js.map +1 -0
- package/dist/shared/errors/__tests__/file.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/file.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/file.error.test.js +75 -0
- package/dist/shared/errors/__tests__/file.error.test.js.map +1 -0
- package/dist/shared/errors/__tests__/index.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/index.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/index.test.js +62 -0
- package/dist/shared/errors/__tests__/index.test.js.map +1 -0
- package/dist/shared/errors/__tests__/validation.error.test.d.ts +5 -0
- package/dist/shared/errors/__tests__/validation.error.test.d.ts.map +1 -0
- package/dist/shared/errors/__tests__/validation.error.test.js +79 -0
- package/dist/shared/errors/__tests__/validation.error.test.js.map +1 -0
- package/dist/shared/errors/base.error.d.ts +54 -0
- package/dist/shared/errors/base.error.d.ts.map +1 -0
- package/dist/shared/errors/base.error.js +85 -0
- package/dist/shared/errors/base.error.js.map +1 -0
- package/dist/shared/errors/command.error.d.ts +58 -0
- package/dist/shared/errors/command.error.d.ts.map +1 -0
- package/dist/shared/errors/command.error.js +102 -0
- package/dist/shared/errors/command.error.js.map +1 -0
- package/dist/shared/errors/detection.error.d.ts +42 -0
- package/dist/shared/errors/detection.error.d.ts.map +1 -0
- package/dist/shared/errors/detection.error.js +82 -0
- package/dist/shared/errors/detection.error.js.map +1 -0
- package/dist/shared/errors/docker.error.d.ts +142 -0
- package/dist/shared/errors/docker.error.d.ts.map +1 -0
- package/dist/shared/errors/docker.error.js +172 -0
- package/dist/shared/errors/docker.error.js.map +1 -0
- package/dist/shared/errors/file.error.d.ts +66 -0
- package/dist/shared/errors/file.error.d.ts.map +1 -0
- package/dist/shared/errors/file.error.js +93 -0
- package/dist/shared/errors/file.error.js.map +1 -0
- package/dist/shared/errors/index.d.ts +56 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/errors/index.js +86 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/errors/validation.error.d.ts +67 -0
- package/dist/shared/errors/validation.error.d.ts.map +1 -0
- package/dist/shared/errors/validation.error.js +97 -0
- package/dist/shared/errors/validation.error.js.map +1 -0
- package/dist/shared/templates/index.d.ts +2 -0
- package/dist/shared/templates/index.d.ts.map +1 -0
- package/dist/shared/templates/index.js +2 -0
- package/dist/shared/templates/index.js.map +1 -0
- package/dist/shared/templates/prompt-builder.d.ts +2 -0
- package/dist/shared/templates/prompt-builder.d.ts.map +1 -0
- package/dist/shared/templates/prompt-builder.js +2 -0
- package/dist/shared/templates/prompt-builder.js.map +1 -0
- package/dist/shared/templates/template-engine.d.ts +2 -0
- package/dist/shared/templates/template-engine.d.ts.map +1 -0
- package/dist/shared/templates/template-engine.js +2 -0
- package/dist/shared/templates/template-engine.js.map +1 -0
- package/dist/shared/utils/__tests__/command-executor.test.d.ts +5 -0
- package/dist/shared/utils/__tests__/command-executor.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/command-executor.test.js +45 -0
- package/dist/shared/utils/__tests__/command-executor.test.js.map +1 -0
- package/dist/shared/utils/__tests__/file-helper.test.d.ts +5 -0
- package/dist/shared/utils/__tests__/file-helper.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/file-helper.test.js +71 -0
- package/dist/shared/utils/__tests__/file-helper.test.js.map +1 -0
- package/dist/shared/utils/__tests__/logger.test.d.ts +5 -0
- package/dist/shared/utils/__tests__/logger.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/logger.test.js +83 -0
- package/dist/shared/utils/__tests__/logger.test.js.map +1 -0
- package/dist/shared/utils/command-executer.d.ts +2 -0
- package/dist/shared/utils/command-executer.d.ts.map +1 -0
- package/dist/shared/utils/command-executer.js +2 -0
- package/dist/shared/utils/command-executer.js.map +1 -0
- package/dist/shared/utils/command-executor.d.ts +255 -0
- package/dist/shared/utils/command-executor.d.ts.map +1 -0
- package/dist/shared/utils/command-executor.js +287 -0
- package/dist/shared/utils/command-executor.js.map +1 -0
- package/dist/shared/utils/file-helper.d.ts +86 -0
- package/dist/shared/utils/file-helper.d.ts.map +1 -0
- package/dist/shared/utils/file-helper.js +323 -0
- package/dist/shared/utils/file-helper.js.map +1 -0
- package/dist/shared/utils/index.d.ts +9 -0
- package/dist/shared/utils/index.d.ts.map +1 -0
- package/dist/shared/utils/index.js +9 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/logger.d.ts +163 -0
- package/dist/shared/utils/logger.d.ts.map +1 -0
- package/dist/shared/utils/logger.js +389 -0
- package/dist/shared/utils/logger.js.map +1 -0
- package/package.json +25 -6
- package/CHANGELOG.md +0 -46
- package/agents/deps-analyzer.js +0 -366
- package/agents/detector.js +0 -570
- package/agents/fix-engine.js +0 -305
- package/agents/lighthouse-scanner.js +0 -405
- package/agents/perf-analyzer.js +0 -294
- package/agents/perf-front-analyzer.js +0 -229
- package/agents/test-generator.js +0 -387
- package/agents/test-runner.js +0 -318
- package/bin/cli.js +0 -449
- package/lib/config.js +0 -250
- package/lib/docker.js +0 -207
- package/lib/reporter.js +0 -297
- package/scripts/dev.js +0 -106
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileSystemHelper - Opérations fichiers sécurisées et async
|
|
3
|
+
*
|
|
4
|
+
* @module shared/utils/file-helper
|
|
5
|
+
*/
|
|
6
|
+
import type { Stats } from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* Options pour les opérations fichiers
|
|
9
|
+
*/
|
|
10
|
+
export interface FileHelperOptions {
|
|
11
|
+
/** Creer les repertoires parents si necessaire */
|
|
12
|
+
ensureDir?: boolean;
|
|
13
|
+
/** Encodage pour les operations texte */
|
|
14
|
+
encoding?: BufferEncoding;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resultat de recherche de fichiers
|
|
18
|
+
*/
|
|
19
|
+
export interface FileSearchResult {
|
|
20
|
+
/** Fichiers trouves */
|
|
21
|
+
files: string[];
|
|
22
|
+
/** Nombre total de fichiers */
|
|
23
|
+
total: number;
|
|
24
|
+
/** Duree de la recherche en ms */
|
|
25
|
+
duration: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Helper pour les operations systeme de fichiers
|
|
29
|
+
*
|
|
30
|
+
* Toutes les operations sont asynchrones et utilisent fs/promises.
|
|
31
|
+
* Les erreurs sont loguees et propagees avec contexte via DaemonError.
|
|
32
|
+
*/
|
|
33
|
+
export declare class FileSystemHelper {
|
|
34
|
+
/**
|
|
35
|
+
* Lit un fichier JSON et le parse
|
|
36
|
+
*/
|
|
37
|
+
readJson<T = unknown>(filePath: string): Promise<T>;
|
|
38
|
+
/**
|
|
39
|
+
* Ecrit des donnees JSON dans un fichier
|
|
40
|
+
*/
|
|
41
|
+
writeJson<T = unknown>(filePath: string, data: T, options?: FileHelperOptions): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Sassure quun repertoire existe (cree recursivement si necessaire)
|
|
44
|
+
*/
|
|
45
|
+
ensureDir(dirPath: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Trouve des fichiers correspondant a un pattern
|
|
48
|
+
*/
|
|
49
|
+
findFiles(pattern: string, cwd: string, options?: {
|
|
50
|
+
maxDepth?: number;
|
|
51
|
+
ignoreDirs?: string[];
|
|
52
|
+
}): Promise<FileSearchResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Verifie si un fichier ou repertoire existe
|
|
55
|
+
*/
|
|
56
|
+
exists(targetPath: string): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Lit le contenu dun fichier texte
|
|
59
|
+
*/
|
|
60
|
+
readFile(filePath: string, encoding?: BufferEncoding): Promise<string>;
|
|
61
|
+
/**
|
|
62
|
+
* Ecrit du contenu dans un fichier texte
|
|
63
|
+
*/
|
|
64
|
+
writeFile(filePath: string, content: string, options?: FileHelperOptions): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Copie un fichier vers une destination
|
|
67
|
+
*/
|
|
68
|
+
copyFile(src: string, dest: string, options?: FileHelperOptions): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Supprime un fichier ou un repertoire
|
|
71
|
+
*/
|
|
72
|
+
remove(targetPath: string): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Lit les metadonnees dun fichier
|
|
75
|
+
*/
|
|
76
|
+
stat(filePath: string): Promise<Stats>;
|
|
77
|
+
/**
|
|
78
|
+
* Liste le contenu dun repertoire
|
|
79
|
+
*/
|
|
80
|
+
readdir(dirPath: string): Promise<string[]>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Instance singleton
|
|
84
|
+
*/
|
|
85
|
+
export declare const fileHelper: FileSystemHelper;
|
|
86
|
+
//# sourceMappingURL=file-helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-helper.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/file-helper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAgBrC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uBAAuB;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAiCzD;;OAEG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB/C;;OAEG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAkE5B;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBrF;;OAEG;IACG,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwBhB;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCrF;;OAEG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/C;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAkB5C;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAsBlD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,kBAAyB,CAAC"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileSystemHelper - Opérations fichiers sécurisées et async
|
|
3
|
+
*
|
|
4
|
+
* @module shared/utils/file-helper
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs/promises';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { createLogger } from './logger.js';
|
|
9
|
+
import { FileNotFoundError, FilePermissionError, InvalidJsonError, DirectoryCreationError, FileWriteError, FileReadError, FileCopyError, FileSearchError, } from '../errors/file.error.js';
|
|
10
|
+
const logger = createLogger('FileSystemHelper');
|
|
11
|
+
/**
|
|
12
|
+
* Helper pour les operations systeme de fichiers
|
|
13
|
+
*
|
|
14
|
+
* Toutes les operations sont asynchrones et utilisent fs/promises.
|
|
15
|
+
* Les erreurs sont loguees et propagees avec contexte via DaemonError.
|
|
16
|
+
*/
|
|
17
|
+
export class FileSystemHelper {
|
|
18
|
+
/**
|
|
19
|
+
* Lit un fichier JSON et le parse
|
|
20
|
+
*/
|
|
21
|
+
async readJson(filePath) {
|
|
22
|
+
const start = Date.now();
|
|
23
|
+
const resolvedPath = path.resolve(filePath);
|
|
24
|
+
try {
|
|
25
|
+
logger.debug(`Reading JSON file: ${resolvedPath}`);
|
|
26
|
+
const content = await fs.readFile(resolvedPath, 'utf-8');
|
|
27
|
+
const parsed = JSON.parse(content);
|
|
28
|
+
logger.debug(`JSON file read in ${Date.now() - start}ms`);
|
|
29
|
+
return parsed;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const nodeError = error;
|
|
33
|
+
if (nodeError.code === 'ENOENT') {
|
|
34
|
+
logger.error(`File not found: ${resolvedPath}`);
|
|
35
|
+
throw new FileNotFoundError(resolvedPath, { cause: error });
|
|
36
|
+
}
|
|
37
|
+
if (error instanceof SyntaxError) {
|
|
38
|
+
logger.error(`Invalid JSON in file: ${resolvedPath}`, error);
|
|
39
|
+
throw new InvalidJsonError(resolvedPath, error.message, { cause: error });
|
|
40
|
+
}
|
|
41
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
42
|
+
logger.error(`Permission denied reading file: ${resolvedPath}`);
|
|
43
|
+
throw new FilePermissionError(resolvedPath, 'read', { cause: error });
|
|
44
|
+
}
|
|
45
|
+
logger.error(`Failed to read JSON file: ${resolvedPath}`, error);
|
|
46
|
+
throw new FileReadError(resolvedPath, { cause: error });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Ecrit des donnees JSON dans un fichier
|
|
51
|
+
*/
|
|
52
|
+
async writeJson(filePath, data, options) {
|
|
53
|
+
const start = Date.now();
|
|
54
|
+
const resolvedPath = path.resolve(filePath);
|
|
55
|
+
try {
|
|
56
|
+
logger.debug(`Writing JSON file: ${resolvedPath}`);
|
|
57
|
+
const dir = path.dirname(resolvedPath);
|
|
58
|
+
if (options?.ensureDir !== false) {
|
|
59
|
+
await this.ensureDir(dir);
|
|
60
|
+
}
|
|
61
|
+
const content = JSON.stringify(data, null, 2);
|
|
62
|
+
await fs.writeFile(resolvedPath, content, 'utf-8');
|
|
63
|
+
logger.debug(`JSON file written in ${Date.now() - start}ms`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const nodeError = error;
|
|
67
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
68
|
+
logger.error(`Permission denied writing file: ${resolvedPath}`);
|
|
69
|
+
throw new FilePermissionError(resolvedPath, 'write', { cause: error });
|
|
70
|
+
}
|
|
71
|
+
logger.error(`Failed to write JSON file: ${resolvedPath}`, error);
|
|
72
|
+
throw new FileWriteError(resolvedPath, { cause: error });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Sassure quun repertoire existe (cree recursivement si necessaire)
|
|
77
|
+
*/
|
|
78
|
+
async ensureDir(dirPath) {
|
|
79
|
+
const resolvedPath = path.resolve(dirPath);
|
|
80
|
+
try {
|
|
81
|
+
await fs.mkdir(resolvedPath, { recursive: true });
|
|
82
|
+
logger.debug(`Directory ensured: ${resolvedPath}`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const nodeError = error;
|
|
86
|
+
if (nodeError.code === 'EEXIST') {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
90
|
+
logger.error(`Permission denied creating directory: ${resolvedPath}`);
|
|
91
|
+
throw new FilePermissionError(resolvedPath, 'create directory', { cause: error });
|
|
92
|
+
}
|
|
93
|
+
logger.error(`Failed to create directory: ${resolvedPath}`, error);
|
|
94
|
+
throw new DirectoryCreationError(resolvedPath, { cause: error });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Trouve des fichiers correspondant a un pattern
|
|
99
|
+
*/
|
|
100
|
+
async findFiles(pattern, cwd, options) {
|
|
101
|
+
const start = Date.now();
|
|
102
|
+
const results = [];
|
|
103
|
+
const maxDepth = options?.maxDepth ?? 10;
|
|
104
|
+
const ignoreDirs = new Set([
|
|
105
|
+
'node_modules',
|
|
106
|
+
'.git',
|
|
107
|
+
'.next',
|
|
108
|
+
'dist',
|
|
109
|
+
'build',
|
|
110
|
+
'coverage',
|
|
111
|
+
...(options?.ignoreDirs ?? []),
|
|
112
|
+
]);
|
|
113
|
+
const searchDir = async (dir, depth = 0) => {
|
|
114
|
+
if (depth > maxDepth)
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
118
|
+
for (const entry of entries) {
|
|
119
|
+
const fullPath = path.join(dir, entry.name);
|
|
120
|
+
if (entry.isDirectory()) {
|
|
121
|
+
if (ignoreDirs.has(entry.name)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
await searchDir(fullPath, depth + 1);
|
|
125
|
+
}
|
|
126
|
+
else if (entry.isFile()) {
|
|
127
|
+
const regex = new RegExp('^' +
|
|
128
|
+
pattern
|
|
129
|
+
.replace(/\./g, '\\.')
|
|
130
|
+
.replace(/\*/g, '.*')
|
|
131
|
+
.replace(/\?/g, '.') +
|
|
132
|
+
'$');
|
|
133
|
+
if (regex.test(entry.name)) {
|
|
134
|
+
results.push(fullPath);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const nodeError = error;
|
|
141
|
+
if (nodeError.code !== 'EPERM' && nodeError.code !== 'EACCES') {
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
try {
|
|
147
|
+
await searchDir(cwd);
|
|
148
|
+
const duration = Date.now() - start;
|
|
149
|
+
logger.debug(`Found ${results.length} files matching '${pattern}' in ${duration}ms`);
|
|
150
|
+
return {
|
|
151
|
+
files: results,
|
|
152
|
+
total: results.length,
|
|
153
|
+
duration,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
logger.error(`Failed to search files: ${cwd}`, error);
|
|
158
|
+
throw new FileSearchError(cwd, pattern, { cause: error });
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Verifie si un fichier ou repertoire existe
|
|
163
|
+
*/
|
|
164
|
+
async exists(targetPath) {
|
|
165
|
+
try {
|
|
166
|
+
await fs.access(targetPath);
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Lit le contenu dun fichier texte
|
|
175
|
+
*/
|
|
176
|
+
async readFile(filePath, encoding = 'utf-8') {
|
|
177
|
+
const resolvedPath = path.resolve(filePath);
|
|
178
|
+
try {
|
|
179
|
+
return await fs.readFile(resolvedPath, encoding);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const nodeError = error;
|
|
183
|
+
if (nodeError.code === 'ENOENT') {
|
|
184
|
+
logger.error(`File not found: ${resolvedPath}`);
|
|
185
|
+
throw new FileNotFoundError(resolvedPath, { cause: error });
|
|
186
|
+
}
|
|
187
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
188
|
+
logger.error(`Permission denied reading file: ${resolvedPath}`);
|
|
189
|
+
throw new FilePermissionError(resolvedPath, 'read', { cause: error });
|
|
190
|
+
}
|
|
191
|
+
logger.error(`Failed to read file: ${resolvedPath}`, error);
|
|
192
|
+
throw new FileReadError(resolvedPath, { cause: error });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Ecrit du contenu dans un fichier texte
|
|
197
|
+
*/
|
|
198
|
+
async writeFile(filePath, content, options) {
|
|
199
|
+
const resolvedPath = path.resolve(filePath);
|
|
200
|
+
const dir = path.dirname(resolvedPath);
|
|
201
|
+
if (options?.ensureDir !== false) {
|
|
202
|
+
await this.ensureDir(dir);
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
await fs.writeFile(resolvedPath, content, options?.encoding ?? 'utf-8');
|
|
206
|
+
logger.debug(`File written: ${resolvedPath}`);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
const nodeError = error;
|
|
210
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
211
|
+
logger.error(`Permission denied writing file: ${resolvedPath}`);
|
|
212
|
+
throw new FilePermissionError(resolvedPath, 'write', { cause: error });
|
|
213
|
+
}
|
|
214
|
+
logger.error(`Failed to write file: ${resolvedPath}`, error);
|
|
215
|
+
throw new FileWriteError(resolvedPath, { cause: error });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Copie un fichier vers une destination
|
|
220
|
+
*/
|
|
221
|
+
async copyFile(src, dest, options) {
|
|
222
|
+
const resolvedSrc = path.resolve(src);
|
|
223
|
+
const resolvedDest = path.resolve(dest);
|
|
224
|
+
const destDir = path.dirname(resolvedDest);
|
|
225
|
+
if (options?.ensureDir !== false) {
|
|
226
|
+
await this.ensureDir(destDir);
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const sourceExists = await this.exists(resolvedSrc);
|
|
230
|
+
if (!sourceExists) {
|
|
231
|
+
throw new FileNotFoundError(resolvedSrc);
|
|
232
|
+
}
|
|
233
|
+
await fs.copyFile(resolvedSrc, resolvedDest);
|
|
234
|
+
logger.debug(`File copied: ${resolvedSrc} -> ${resolvedDest}`);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (error instanceof FileNotFoundError) {
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
const nodeError = error;
|
|
241
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
242
|
+
logger.error(`Permission denied copying file: ${resolvedSrc} -> ${resolvedDest}`);
|
|
243
|
+
throw new FilePermissionError(resolvedDest, 'copy', { cause: error });
|
|
244
|
+
}
|
|
245
|
+
logger.error(`Failed to copy file: ${resolvedSrc} -> ${resolvedDest}`, error);
|
|
246
|
+
throw new FileCopyError(resolvedSrc, resolvedDest, { cause: error });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Supprime un fichier ou un repertoire
|
|
251
|
+
*/
|
|
252
|
+
async remove(targetPath) {
|
|
253
|
+
const resolvedPath = path.resolve(targetPath);
|
|
254
|
+
try {
|
|
255
|
+
const stat = await fs.stat(resolvedPath);
|
|
256
|
+
if (stat.isDirectory()) {
|
|
257
|
+
await fs.rm(resolvedPath, { recursive: true, force: true });
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
await fs.unlink(resolvedPath);
|
|
261
|
+
}
|
|
262
|
+
logger.debug(`Removed: ${resolvedPath}`);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
const nodeError = error;
|
|
266
|
+
if (nodeError.code === 'ENOENT') {
|
|
267
|
+
logger.debug(`Path already removed: ${resolvedPath}`);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
271
|
+
logger.error(`Permission denied removing: ${resolvedPath}`);
|
|
272
|
+
throw new FilePermissionError(resolvedPath, 'delete', { cause: error });
|
|
273
|
+
}
|
|
274
|
+
logger.error(`Failed to remove: ${resolvedPath}`, error);
|
|
275
|
+
throw new FileReadError(resolvedPath, { cause: error });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Lit les metadonnees dun fichier
|
|
280
|
+
*/
|
|
281
|
+
async stat(filePath) {
|
|
282
|
+
const resolvedPath = path.resolve(filePath);
|
|
283
|
+
try {
|
|
284
|
+
return await fs.stat(resolvedPath);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
const nodeError = error;
|
|
288
|
+
if (nodeError.code === 'ENOENT') {
|
|
289
|
+
logger.error(`File not found: ${resolvedPath}`);
|
|
290
|
+
throw new FileNotFoundError(resolvedPath, { cause: error });
|
|
291
|
+
}
|
|
292
|
+
logger.error(`Failed to stat file: ${resolvedPath}`, error);
|
|
293
|
+
throw new FileReadError(resolvedPath, { cause: error });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Liste le contenu dun repertoire
|
|
298
|
+
*/
|
|
299
|
+
async readdir(dirPath) {
|
|
300
|
+
const resolvedPath = path.resolve(dirPath);
|
|
301
|
+
try {
|
|
302
|
+
return await fs.readdir(resolvedPath);
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
const nodeError = error;
|
|
306
|
+
if (nodeError.code === 'ENOENT') {
|
|
307
|
+
logger.error(`Directory not found: ${resolvedPath}`);
|
|
308
|
+
throw new FileNotFoundError(resolvedPath, { cause: error });
|
|
309
|
+
}
|
|
310
|
+
if (nodeError.code === 'EPERM' || nodeError.code === 'EACCES') {
|
|
311
|
+
logger.error(`Permission denied reading directory: ${resolvedPath}`);
|
|
312
|
+
throw new FilePermissionError(resolvedPath, 'read directory', { cause: error });
|
|
313
|
+
}
|
|
314
|
+
logger.error(`Failed to read directory: ${resolvedPath}`, error);
|
|
315
|
+
throw new FileReadError(resolvedPath, { cause: error });
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Instance singleton
|
|
321
|
+
*/
|
|
322
|
+
export const fileHelper = new FileSystemHelper();
|
|
323
|
+
//# sourceMappingURL=file-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-helper.js","sourceRoot":"","sources":["../../../src/shared/utils/file-helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger structuré avec support ANSI et contextes
|
|
3
|
+
*
|
|
4
|
+
* @module shared/utils/logger
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Niveaux de log supportés
|
|
8
|
+
*/
|
|
9
|
+
export declare enum LogLevel {
|
|
10
|
+
DEBUG = 0,
|
|
11
|
+
INFO = 1,
|
|
12
|
+
WARN = 2,
|
|
13
|
+
ERROR = 3,
|
|
14
|
+
SILENT = 4
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Options de configuration du logger
|
|
18
|
+
*/
|
|
19
|
+
export interface LoggerOptions {
|
|
20
|
+
/** Contexte du logger (ex: nom du module) */
|
|
21
|
+
context?: string;
|
|
22
|
+
/** Niveau minimum de log */
|
|
23
|
+
level?: LogLevel;
|
|
24
|
+
/** Format de sortie */
|
|
25
|
+
format?: 'pretty' | 'json';
|
|
26
|
+
/** Désactiver les couleurs */
|
|
27
|
+
noColor?: boolean;
|
|
28
|
+
/** Timestamp personnalisé */
|
|
29
|
+
timestamp?: boolean | (() => string);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Métadonnées structurées pour le logging
|
|
33
|
+
*/
|
|
34
|
+
export interface LogMetadata {
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Entrée de log structurée
|
|
39
|
+
*/
|
|
40
|
+
export interface LogEntry {
|
|
41
|
+
level: string;
|
|
42
|
+
message: string;
|
|
43
|
+
timestamp: string;
|
|
44
|
+
context?: string;
|
|
45
|
+
metadata?: LogMetadata;
|
|
46
|
+
error?: {
|
|
47
|
+
name: string;
|
|
48
|
+
message: string;
|
|
49
|
+
stack?: string;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Logger structuré avec support ANSI et contextes
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const logger = new Logger({ context: 'MyModule' });
|
|
58
|
+
* logger.info('Démarrage du module');
|
|
59
|
+
* logger.warn('Attention', { detail: 'valeur manquante' });
|
|
60
|
+
*
|
|
61
|
+
* // Contexte imbriqué
|
|
62
|
+
* const dbLogger = logger.createContext('Database');
|
|
63
|
+
* dbLogger.error('Erreur de connexion', new Error('ECONNREFUSED'));
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class Logger {
|
|
67
|
+
private readonly context;
|
|
68
|
+
private level;
|
|
69
|
+
private readonly format;
|
|
70
|
+
private readonly noColor;
|
|
71
|
+
private readonly timestampFn;
|
|
72
|
+
private static globalLevel;
|
|
73
|
+
private static globalNoColor;
|
|
74
|
+
/**
|
|
75
|
+
* Crée une nouvelle instance de Logger
|
|
76
|
+
*/
|
|
77
|
+
constructor(options?: LoggerOptions);
|
|
78
|
+
/**
|
|
79
|
+
* Définit le niveau de log global
|
|
80
|
+
*/
|
|
81
|
+
static setGlobalLevel(level: LogLevel): void;
|
|
82
|
+
/**
|
|
83
|
+
* Définit l'option de couleur globale
|
|
84
|
+
*/
|
|
85
|
+
static setGlobalNoColor(noColor: boolean): void;
|
|
86
|
+
/**
|
|
87
|
+
* Définit le niveau de log pour cette instance
|
|
88
|
+
*/
|
|
89
|
+
setLevel(level: LogLevel): void;
|
|
90
|
+
/**
|
|
91
|
+
* Retourne le niveau de log actuel
|
|
92
|
+
*/
|
|
93
|
+
getLevel(): LogLevel;
|
|
94
|
+
/**
|
|
95
|
+
* Log un message de niveau DEBUG
|
|
96
|
+
*/
|
|
97
|
+
debug(message: string, meta?: unknown): void;
|
|
98
|
+
/**
|
|
99
|
+
* Log un message de niveau INFO
|
|
100
|
+
*/
|
|
101
|
+
info(message: string, meta?: unknown): void;
|
|
102
|
+
/**
|
|
103
|
+
* Log un message de niveau WARN
|
|
104
|
+
*/
|
|
105
|
+
warn(message: string, meta?: unknown): void;
|
|
106
|
+
/**
|
|
107
|
+
* Log un message de niveau ERROR
|
|
108
|
+
*/
|
|
109
|
+
error(message: string, error?: Error | unknown): void;
|
|
110
|
+
/**
|
|
111
|
+
* Log un message de succès (vert)
|
|
112
|
+
*/
|
|
113
|
+
success(message: string, meta?: unknown): void;
|
|
114
|
+
/**
|
|
115
|
+
* Log au format succès avec couleur verte
|
|
116
|
+
*/
|
|
117
|
+
private logSuccess;
|
|
118
|
+
/**
|
|
119
|
+
* Crée un nouveau logger avec un contexte imbriqué
|
|
120
|
+
*/
|
|
121
|
+
createContext(context: string): Logger;
|
|
122
|
+
/**
|
|
123
|
+
* Log interne avec gestion du niveau et du format
|
|
124
|
+
*/
|
|
125
|
+
private log;
|
|
126
|
+
/**
|
|
127
|
+
* Log au format JSON structuré
|
|
128
|
+
*/
|
|
129
|
+
private logJson;
|
|
130
|
+
/**
|
|
131
|
+
* Log au format pretty avec couleurs ANSI
|
|
132
|
+
*/
|
|
133
|
+
private logPretty;
|
|
134
|
+
/**
|
|
135
|
+
* Normalise les métadonnées en objet plat
|
|
136
|
+
*/
|
|
137
|
+
private normalizeMetadata;
|
|
138
|
+
/**
|
|
139
|
+
* Colore une sortie JSON pour la console
|
|
140
|
+
*/
|
|
141
|
+
private colorizeJson;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Logger racine sans contexte
|
|
145
|
+
*/
|
|
146
|
+
export declare const rootLogger: Logger;
|
|
147
|
+
/**
|
|
148
|
+
* Crée un nouveau logger avec un contexte
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```ts
|
|
152
|
+
* import { createLogger } from './logger';
|
|
153
|
+
*
|
|
154
|
+
* const logger = createLogger('MyModule');
|
|
155
|
+
* logger.info('Hello world');
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export declare function createLogger(context: string, options?: Omit<LoggerOptions, 'context'>): Logger;
|
|
159
|
+
/**
|
|
160
|
+
* Logger global pour les usages simples
|
|
161
|
+
*/
|
|
162
|
+
export declare const logger: Logger;
|
|
163
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/logger.ts"],"names":[],"mappings":"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"}
|