@oalacea/daemon 0.6.3 → 0.7.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/README.md +268 -58
- package/bin/Dockerfile +158 -16
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +22 -2
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/command.types.d.ts +216 -0
- package/dist/cli/commands/command.types.d.ts.map +1 -0
- package/dist/cli/commands/command.types.js +64 -0
- package/dist/cli/commands/command.types.js.map +1 -0
- package/dist/cli/commands/history.command.d.ts +91 -0
- package/dist/cli/commands/history.command.d.ts.map +1 -0
- package/dist/cli/commands/history.command.js +336 -0
- package/dist/cli/commands/history.command.js.map +1 -0
- package/dist/cli/commands/index.d.ts +14 -3
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +7 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.command.d.ts +12 -14
- package/dist/cli/commands/init.command.d.ts.map +1 -1
- package/dist/cli/commands/init.command.js +278 -144
- package/dist/cli/commands/init.command.js.map +1 -1
- package/dist/cli/commands/optimize.command.d.ts +110 -0
- package/dist/cli/commands/optimize.command.d.ts.map +1 -0
- package/dist/cli/commands/optimize.command.js +497 -0
- package/dist/cli/commands/optimize.command.js.map +1 -0
- package/dist/cli/commands/report.command.d.ts +110 -0
- package/dist/cli/commands/report.command.d.ts.map +1 -0
- package/dist/cli/commands/report.command.js +532 -0
- package/dist/cli/commands/report.command.js.map +1 -0
- package/dist/cli/commands/review.command.d.ts +110 -0
- package/dist/cli/commands/review.command.d.ts.map +1 -0
- package/dist/cli/commands/review.command.js +520 -0
- package/dist/cli/commands/review.command.js.map +1 -0
- package/dist/cli/commands/score.command.d.ts +47 -0
- package/dist/cli/commands/score.command.d.ts.map +1 -0
- package/dist/cli/commands/score.command.js +261 -0
- package/dist/cli/commands/score.command.js.map +1 -0
- package/dist/cli/utils/index.d.ts +10 -0
- package/dist/cli/utils/index.d.ts.map +1 -0
- package/dist/cli/utils/index.js +10 -0
- package/dist/cli/utils/index.js.map +1 -0
- package/dist/cli/utils/output.d.ts +192 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +411 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/cli/utils/progress.d.ts +204 -0
- package/dist/cli/utils/progress.d.ts.map +1 -0
- package/dist/cli/utils/progress.js +396 -0
- package/dist/cli/utils/progress.js.map +1 -0
- package/dist/core/types/index.d.ts +1 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/project.types.d.ts +3 -3
- package/dist/core/types/project.types.d.ts.map +1 -1
- package/dist/core/types/scoring.types.d.ts +301 -0
- package/dist/core/types/scoring.types.d.ts.map +1 -0
- package/dist/core/types/scoring.types.js +8 -0
- package/dist/core/types/scoring.types.js.map +1 -0
- package/dist/services/detection/framework-detector.d.ts.map +1 -1
- package/dist/services/detection/framework-detector.js +74 -5
- package/dist/services/detection/framework-detector.js.map +1 -1
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +14 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
- package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/bug-detector.js +443 -0
- package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
- package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
- package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
- package/dist/services/optimization/detectors/index.d.ts +7 -0
- package/dist/services/optimization/detectors/index.d.ts.map +1 -0
- package/dist/services/optimization/detectors/index.js +7 -0
- package/dist/services/optimization/detectors/index.js.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
- package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
- package/dist/services/optimization/detectors/perf-detector.js +451 -0
- package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
- package/dist/services/optimization/index.d.ts +61 -0
- package/dist/services/optimization/index.d.ts.map +1 -0
- package/dist/services/optimization/index.js +69 -0
- package/dist/services/optimization/index.js.map +1 -0
- package/dist/services/optimization/optimization.service.d.ts +65 -0
- package/dist/services/optimization/optimization.service.d.ts.map +1 -0
- package/dist/services/optimization/optimization.service.js +511 -0
- package/dist/services/optimization/optimization.service.js.map +1 -0
- package/dist/services/optimization/optimization.types.d.ts +343 -0
- package/dist/services/optimization/optimization.types.d.ts.map +1 -0
- package/dist/services/optimization/optimization.types.js +8 -0
- package/dist/services/optimization/optimization.types.js.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
- package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
- package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/index.d.ts +7 -0
- package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/index.js +7 -0
- package/dist/services/optimization/optimizers/index.js.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
- package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
- package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
- package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
- package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
- package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
- package/dist/services/optimization/patterns/anti-patterns.js +501 -0
- package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
- package/dist/services/optimization/patterns/index.d.ts +5 -0
- package/dist/services/optimization/patterns/index.d.ts.map +1 -0
- package/dist/services/optimization/patterns/index.js +5 -0
- package/dist/services/optimization/patterns/index.js.map +1 -0
- package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
- package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/chart.exporter.js +350 -0
- package/dist/services/reporting/export/chart.exporter.js.map +1 -0
- package/dist/services/reporting/export/index.d.ts +9 -0
- package/dist/services/reporting/export/index.d.ts.map +1 -0
- package/dist/services/reporting/export/index.js +10 -0
- package/dist/services/reporting/export/index.js.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
- package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
- package/dist/services/reporting/export/pdf.exporter.js +270 -0
- package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
- package/dist/services/reporting/history.service.d.ts +93 -0
- package/dist/services/reporting/history.service.d.ts.map +1 -0
- package/dist/services/reporting/history.service.js +285 -0
- package/dist/services/reporting/history.service.js.map +1 -0
- package/dist/services/reporting/index.d.ts +15 -0
- package/dist/services/reporting/index.d.ts.map +1 -0
- package/dist/services/reporting/index.js +16 -0
- package/dist/services/reporting/index.js.map +1 -0
- package/dist/services/reporting/report.service.d.ts +102 -0
- package/dist/services/reporting/report.service.d.ts.map +1 -0
- package/dist/services/reporting/report.service.js +240 -0
- package/dist/services/reporting/report.service.js.map +1 -0
- package/dist/services/reporting/reporting.types.d.ts +329 -0
- package/dist/services/reporting/reporting.types.d.ts.map +1 -0
- package/dist/services/reporting/reporting.types.js +8 -0
- package/dist/services/reporting/reporting.types.js.map +1 -0
- package/dist/services/reporting/templates/html.template.d.ts +81 -0
- package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/html.template.js +741 -0
- package/dist/services/reporting/templates/html.template.js.map +1 -0
- package/dist/services/reporting/templates/json.template.d.ts +85 -0
- package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/json.template.js +308 -0
- package/dist/services/reporting/templates/json.template.js.map +1 -0
- package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
- package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
- package/dist/services/reporting/templates/markdown.template.js +311 -0
- package/dist/services/reporting/templates/markdown.template.js.map +1 -0
- package/dist/services/reporting/trend-analyzer.d.ts +73 -0
- package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
- package/dist/services/reporting/trend-analyzer.js +291 -0
- package/dist/services/reporting/trend-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
- package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
- package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/index.d.ts +13 -0
- package/dist/services/review/analyzers/index.d.ts.map +1 -0
- package/dist/services/review/analyzers/index.js +13 -0
- package/dist/services/review/analyzers/index.js.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
- package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
- package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
- package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/performance-analyzer.js +589 -0
- package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
- package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/security-analyzer.js +512 -0
- package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
- package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
- package/dist/services/review/analyzers/static-analyzer.js +423 -0
- package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
- package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
- package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
- package/dist/services/review/fixers/auto-fixer.js +404 -0
- package/dist/services/review/fixers/auto-fixer.js.map +1 -0
- package/dist/services/review/fixers/index.d.ts +11 -0
- package/dist/services/review/fixers/index.d.ts.map +1 -0
- package/dist/services/review/fixers/index.js +11 -0
- package/dist/services/review/fixers/index.js.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
- package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
- package/dist/services/review/fixers/refactor-suggester.js +555 -0
- package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
- package/dist/services/review/fixers/test-generator.d.ts +99 -0
- package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
- package/dist/services/review/fixers/test-generator.js +458 -0
- package/dist/services/review/fixers/test-generator.js.map +1 -0
- package/dist/services/review/index.d.ts +14 -0
- package/dist/services/review/index.d.ts.map +1 -0
- package/dist/services/review/index.js +14 -0
- package/dist/services/review/index.js.map +1 -0
- package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
- package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/fix-reporter.js +437 -0
- package/dist/services/review/reporters/fix-reporter.js.map +1 -0
- package/dist/services/review/reporters/index.d.ts +10 -0
- package/dist/services/review/reporters/index.d.ts.map +1 -0
- package/dist/services/review/reporters/index.js +10 -0
- package/dist/services/review/reporters/index.js.map +1 -0
- package/dist/services/review/reporters/score-reporter.d.ts +84 -0
- package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
- package/dist/services/review/reporters/score-reporter.js +560 -0
- package/dist/services/review/reporters/score-reporter.js.map +1 -0
- package/dist/services/review/review.service.d.ts +129 -0
- package/dist/services/review/review.service.d.ts.map +1 -0
- package/dist/services/review/review.service.js +396 -0
- package/dist/services/review/review.service.js.map +1 -0
- package/dist/services/review/review.types.d.ts +443 -0
- package/dist/services/review/review.types.d.ts.map +1 -0
- package/dist/services/review/review.types.js +11 -0
- package/dist/services/review/review.types.js.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
- package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
- package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
- package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
- package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/index.d.ts +18 -0
- package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/index.js +27 -0
- package/dist/services/scoring/dimensions/index.js.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
- package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
- package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
- package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
- package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
- package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
- package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
- package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
- package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
- package/dist/services/scoring/index.d.ts +10 -0
- package/dist/services/scoring/index.d.ts.map +1 -0
- package/dist/services/scoring/index.js +10 -0
- package/dist/services/scoring/index.js.map +1 -0
- package/dist/services/scoring/scoring-service.d.ts +222 -0
- package/dist/services/scoring/scoring-service.d.ts.map +1 -0
- package/dist/services/scoring/scoring-service.js +636 -0
- package/dist/services/scoring/scoring-service.js.map +1 -0
- package/package.json +11 -3
- package/templates/README.md +183 -0
- package/templates/nestjs/controller.spec.ts +203 -0
- package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
- package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
- package/templates/nestjs/fixtures/test-module.ts +311 -0
- package/templates/nestjs/guard.spec.ts +314 -0
- package/templates/nestjs/interceptor.spec.ts +458 -0
- package/templates/nestjs/module.spec.ts +173 -0
- package/templates/nestjs/pipe.spec.ts +474 -0
- package/templates/nestjs/service.spec.ts +296 -0
- package/templates/rust/Cargo.toml +72 -0
- package/templates/rust/actix-controller.test.rs +114 -0
- package/templates/rust/axum-handler.test.rs +117 -0
- package/templates/rust/integration.test.rs +63 -0
- package/templates/rust/rocket-route.test.rs +106 -0
- package/templates/rust/unit.test.rs +38 -0
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refactor Suggester
|
|
3
|
+
*
|
|
4
|
+
* Suggestions de refactoring pour améliorer la qualité du code:
|
|
5
|
+
* - Fractionnement des fonctions longues
|
|
6
|
+
* - Simplification des conditions complexes
|
|
7
|
+
* - Extraction de code dupliqué
|
|
8
|
+
* - Amélioration du nommage
|
|
9
|
+
* - Suggestions priorisées
|
|
10
|
+
*
|
|
11
|
+
* @module services/review/fixers/refactor-suggester
|
|
12
|
+
*/
|
|
13
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
14
|
+
import { join, relative } from 'node:path';
|
|
15
|
+
import { DockerManager } from '../../docker/docker-manager.js';
|
|
16
|
+
import { createLogger } from '../../../shared/utils/logger.js';
|
|
17
|
+
/**
|
|
18
|
+
* Configuration pour les seuils de détection
|
|
19
|
+
*/
|
|
20
|
+
const THRESHOLDS = {
|
|
21
|
+
maxFunctionLength: 50, // lignes
|
|
22
|
+
maxComplexity: 10, // cyclomatic complexity
|
|
23
|
+
maxNestingDepth: 4,
|
|
24
|
+
maxParameterCount: 5,
|
|
25
|
+
minVariableNameLength: 3,
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Extensions de fichiers source
|
|
29
|
+
*/
|
|
30
|
+
const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'];
|
|
31
|
+
/**
|
|
32
|
+
* Dossiers à exclure
|
|
33
|
+
*/
|
|
34
|
+
const EXCLUDE_DIRS = ['node_modules', '.git', 'dist', 'build', 'coverage', '__tests__', '.next'];
|
|
35
|
+
/**
|
|
36
|
+
* Pattern de détection de code dupliqué (simple)
|
|
37
|
+
*/
|
|
38
|
+
const DUPLICATE_PATTERNS = [
|
|
39
|
+
// Même logique de map/filter
|
|
40
|
+
/\.map\s*\(\s*\w+\s*=>\s*\w+\.\w+\s*\)\s*\.filter\s*\(/g,
|
|
41
|
+
// fetch répétitif
|
|
42
|
+
/fetch\s*\([^)]+\)\s*\.then\s*\([^)]+\)\s*\.then\s*\(/g,
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* Suggéreur de refactoring
|
|
46
|
+
*/
|
|
47
|
+
export class RefactorSuggester {
|
|
48
|
+
docker;
|
|
49
|
+
logger;
|
|
50
|
+
suggestionCounter = 0;
|
|
51
|
+
constructor(docker) {
|
|
52
|
+
this.docker = docker ?? new DockerManager();
|
|
53
|
+
this.logger = createLogger('RefactorSuggester');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Analyse un projet et génère des suggestions de refactoring
|
|
57
|
+
*
|
|
58
|
+
* @param projectPath - Chemin du projet
|
|
59
|
+
* @param exclude - Patterns à exclure
|
|
60
|
+
* @returns Suggestions de refactoring
|
|
61
|
+
*/
|
|
62
|
+
async analyze(projectPath, exclude = []) {
|
|
63
|
+
this.suggestionCounter = 0;
|
|
64
|
+
const startTime = performance.now();
|
|
65
|
+
this.logger.info(`Starting refactor analysis for: ${projectPath}`);
|
|
66
|
+
const suggestions = [];
|
|
67
|
+
const files = await this.findSourceFiles(projectPath, exclude);
|
|
68
|
+
for (const filePath of files) {
|
|
69
|
+
const fileSuggestions = await this.analyzeFile(filePath, projectPath);
|
|
70
|
+
suggestions.push(...fileSuggestions);
|
|
71
|
+
}
|
|
72
|
+
// Trier par priorité
|
|
73
|
+
suggestions.sort((a, b) => b.priority - a.priority);
|
|
74
|
+
const duration = Math.round(performance.now() - startTime);
|
|
75
|
+
this.logger.info(`Refactor analysis completed in ${duration}ms (${suggestions.length} suggestions)`);
|
|
76
|
+
return suggestions;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Analyse un fichier spécifique
|
|
80
|
+
*/
|
|
81
|
+
async analyzeFile(filePath, projectPath) {
|
|
82
|
+
const suggestions = [];
|
|
83
|
+
try {
|
|
84
|
+
const content = await readFile(filePath, 'utf-8');
|
|
85
|
+
const lines = content.split('\n');
|
|
86
|
+
const relativePath = relative(projectPath, filePath);
|
|
87
|
+
// Détecter les fonctions longues
|
|
88
|
+
const longFunctions = this.detectLongFunctions(lines);
|
|
89
|
+
for (const func of longFunctions) {
|
|
90
|
+
suggestions.push(this.createLongFunctionSuggestion(filePath, func, lines, relativePath));
|
|
91
|
+
}
|
|
92
|
+
// Détecter les conditions complexes
|
|
93
|
+
const complexConditions = this.detectComplexConditions(lines);
|
|
94
|
+
for (const cond of complexConditions) {
|
|
95
|
+
suggestions.push(this.createComplexConditionSuggestion(filePath, cond, lines, relativePath));
|
|
96
|
+
}
|
|
97
|
+
// Détecter la duplication
|
|
98
|
+
const duplicates = this.detectDuplicates(content, lines);
|
|
99
|
+
for (const dup of duplicates) {
|
|
100
|
+
suggestions.push(this.createDuplicateSuggestion(filePath, dup, lines, relativePath));
|
|
101
|
+
}
|
|
102
|
+
// Détecter les problèmes de nommage
|
|
103
|
+
const namingIssues = this.detectNamingIssues(lines);
|
|
104
|
+
for (const issue of namingIssues) {
|
|
105
|
+
suggestions.push(this.createNamingSuggestion(filePath, issue, lines, relativePath));
|
|
106
|
+
}
|
|
107
|
+
// Détecter les paramètres trop nombreux
|
|
108
|
+
const paramIssues = this.detectTooManyParameters(lines);
|
|
109
|
+
for (const issue of paramIssues) {
|
|
110
|
+
suggestions.push(this.createParameterSuggestion(filePath, issue, lines, relativePath));
|
|
111
|
+
}
|
|
112
|
+
// Détecter le manque de commentaires pour code complexe
|
|
113
|
+
const uncommentedComplex = this.detectUncommentedComplex(lines);
|
|
114
|
+
for (const issue of uncommentedComplex) {
|
|
115
|
+
suggestions.push(this.createCommentSuggestion(filePath, issue, lines, relativePath));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.logger.debug(`Failed to analyze file: ${filePath}`, error);
|
|
120
|
+
}
|
|
121
|
+
return suggestions;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Détecte les fonctions longues
|
|
125
|
+
*/
|
|
126
|
+
detectLongFunctions(lines) {
|
|
127
|
+
const longFunctions = [];
|
|
128
|
+
const functionStack = [];
|
|
129
|
+
let currentIndent = 0;
|
|
130
|
+
for (let i = 0; i < lines.length; i++) {
|
|
131
|
+
const line = lines[i] ?? '';
|
|
132
|
+
const trimmed = line.trim();
|
|
133
|
+
// Détecter le début d'une fonction
|
|
134
|
+
const funcMatch = trimmed.match(/(?:function\s+(\w+)|(\w+)\s*\([^)]*\)\s*[{=>]|const\s+(\w+)\s*=\s*(?:\([^)]*\)\s*=>|async\s+function))/);
|
|
135
|
+
if (funcMatch) {
|
|
136
|
+
const name = funcMatch[1] || funcMatch[2] || funcMatch[3];
|
|
137
|
+
const indent = line.search(/\S/);
|
|
138
|
+
// Nouvelle fonction au même niveau ou moins profond
|
|
139
|
+
if (functionStack.length === 0 || indent <= currentIndent) {
|
|
140
|
+
// Vérifier si la fonction précédente était longue
|
|
141
|
+
if (functionStack.length > 0) {
|
|
142
|
+
const prev = functionStack[functionStack.length - 1];
|
|
143
|
+
if (prev && i - prev.startLine > THRESHOLDS.maxFunctionLength) {
|
|
144
|
+
longFunctions.push({
|
|
145
|
+
name: prev.name,
|
|
146
|
+
startLine: prev.startLine + 1,
|
|
147
|
+
endLine: i + 1,
|
|
148
|
+
length: i - prev.startLine,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
functionStack.push({ name: name ?? 'anonymous', startLine: i });
|
|
153
|
+
currentIndent = indent;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Détecter la fin d'une fonction
|
|
157
|
+
if (trimmed === '}' && functionStack.length > 0) {
|
|
158
|
+
const indent = line.search(/\S/);
|
|
159
|
+
if (indent <= currentIndent) {
|
|
160
|
+
const func = functionStack.pop();
|
|
161
|
+
if (func && i - func.startLine > THRESHOLDS.maxFunctionLength) {
|
|
162
|
+
longFunctions.push({
|
|
163
|
+
name: func.name,
|
|
164
|
+
startLine: func.startLine + 1,
|
|
165
|
+
endLine: i + 1,
|
|
166
|
+
length: i - func.startLine,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
currentIndent = indent - 2; // Approximation
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return longFunctions;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Détecte les conditions complexes
|
|
177
|
+
*/
|
|
178
|
+
detectComplexConditions(lines) {
|
|
179
|
+
const complexConditions = [];
|
|
180
|
+
for (let i = 0; i < lines.length; i++) {
|
|
181
|
+
const line = lines[i] ?? '';
|
|
182
|
+
const trimmed = line.trim();
|
|
183
|
+
// Compter les opérateurs logiques
|
|
184
|
+
const operators = (trimmed.match(/(&&|\|\|)/g) ?? []).length;
|
|
185
|
+
const ternary = (trimmed.match(/\?[^:]+:/g) ?? []).length;
|
|
186
|
+
if (operators + ternary >= 3) {
|
|
187
|
+
complexConditions.push({
|
|
188
|
+
line: i + 1,
|
|
189
|
+
content: trimmed,
|
|
190
|
+
complexity: operators + ternary,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return complexConditions;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Détecte le code dupliqué
|
|
198
|
+
*/
|
|
199
|
+
detectDuplicates(content, lines) {
|
|
200
|
+
const duplicates = [];
|
|
201
|
+
// Chercher les patterns répétitifs
|
|
202
|
+
for (const pattern of DUPLICATE_PATTERNS) {
|
|
203
|
+
const matches = content.match(pattern);
|
|
204
|
+
if (matches && matches.length > 2) {
|
|
205
|
+
// Trouver les lignes
|
|
206
|
+
pattern.lastIndex = 0;
|
|
207
|
+
let match;
|
|
208
|
+
const seenLines = new Set();
|
|
209
|
+
while ((match = pattern.exec(content)) !== null) {
|
|
210
|
+
const position = this.findPosition(content, match.index);
|
|
211
|
+
if (position && !seenLines.has(position.line)) {
|
|
212
|
+
seenLines.add(position.line);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (seenLines.size > 1) {
|
|
216
|
+
const firstLine = Math.min(...Array.from(seenLines));
|
|
217
|
+
duplicates.push({
|
|
218
|
+
line: firstLine,
|
|
219
|
+
pattern: pattern.source,
|
|
220
|
+
occurrences: seenLines.size,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return duplicates;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Détecte les problèmes de nommage
|
|
229
|
+
*/
|
|
230
|
+
detectNamingIssues(lines) {
|
|
231
|
+
const issues = [];
|
|
232
|
+
for (let i = 0; i < lines.length; i++) {
|
|
233
|
+
const line = lines[i] ?? '';
|
|
234
|
+
const trimmed = line.trim();
|
|
235
|
+
// Noms de variables trop courts
|
|
236
|
+
const shortVarMatch = trimmed.match(/(?:let|const|var)\s+([a-z]{1,2})\s*[=;]/);
|
|
237
|
+
if (shortVarMatch && !['i', 'j', 'x', 'y', '_'].includes(shortVarMatch[1])) {
|
|
238
|
+
issues.push({
|
|
239
|
+
line: i + 1,
|
|
240
|
+
issue: `Variable name "${shortVarMatch[1]}" is too short`,
|
|
241
|
+
suggestion: `Use a more descriptive name instead of "${shortVarMatch[1]}"`,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
// Fonctions avec nom verbeux
|
|
245
|
+
const longFuncMatch = trimmed.match(/function\s+([a-zA-Z_]\w{20,})\s*\(/);
|
|
246
|
+
if (longFuncMatch) {
|
|
247
|
+
issues.push({
|
|
248
|
+
line: i + 1,
|
|
249
|
+
issue: `Function name "${longFuncMatch[1]}" is too long`,
|
|
250
|
+
suggestion: 'Consider using a shorter, more concise name',
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
// Noms non descriptifs
|
|
254
|
+
const genericMatch = trimmed.match(/(?:let|const|var)\s+(data|temp|item|value|info|result)\s*=/);
|
|
255
|
+
if (genericMatch) {
|
|
256
|
+
issues.push({
|
|
257
|
+
line: i + 1,
|
|
258
|
+
issue: `Generic variable name "${genericMatch[1]}"`,
|
|
259
|
+
suggestion: `Use a more specific name describing what "${genericMatch[1]}" contains`,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return issues;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Détecte les fonctions avec trop de paramètres
|
|
267
|
+
*/
|
|
268
|
+
detectTooManyParameters(lines) {
|
|
269
|
+
const paramIssues = [];
|
|
270
|
+
for (let i = 0; i < lines.length; i++) {
|
|
271
|
+
const line = lines[i] ?? '';
|
|
272
|
+
// Détecter les déclarations de fonction
|
|
273
|
+
const funcMatch = line.match(/(?:function\s+(\w+)|(\w+)\s*=\s*(?:\([^)]*\)|async\s+\([^)]*\)))/);
|
|
274
|
+
if (funcMatch) {
|
|
275
|
+
const name = funcMatch[1] || funcMatch[2];
|
|
276
|
+
const paramsMatch = line.match(/\(([^)]*)\)/);
|
|
277
|
+
if (paramsMatch) {
|
|
278
|
+
const params = paramsMatch[1].split(',').filter((p) => p.trim().length > 0);
|
|
279
|
+
if (params.length > THRESHOLDS.maxParameterCount) {
|
|
280
|
+
paramIssues.push({
|
|
281
|
+
line: i + 1,
|
|
282
|
+
name: name ?? 'anonymous',
|
|
283
|
+
count: params.length,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return paramIssues;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Détecte le code complexe sans commentaires
|
|
293
|
+
*/
|
|
294
|
+
detectUncommentedComplex(lines) {
|
|
295
|
+
const issues = [];
|
|
296
|
+
for (let i = 0; i < lines.length; i++) {
|
|
297
|
+
const line = lines[i] ?? '';
|
|
298
|
+
const trimmed = line.trim();
|
|
299
|
+
// Chercher des patterns complexes sans commentaire avant
|
|
300
|
+
const complexPatterns = [
|
|
301
|
+
/\/\/.*TODO|FIXME|HACK/,
|
|
302
|
+
/for\s*\(\s*\w+\s+in\s+.*?\)\s*{/,
|
|
303
|
+
/while\s*\(\s*.*?\)\s*{/,
|
|
304
|
+
/switch\s*\(\s*.*?\)\s*{/,
|
|
305
|
+
];
|
|
306
|
+
const isComplex = complexPatterns.some((p) => p.test(trimmed));
|
|
307
|
+
const hasCommentBefore = i > 0 && (lines[i - 1] ?? '').trim().startsWith('//');
|
|
308
|
+
if (isComplex && !hasCommentBefore && !trimmed.startsWith('//')) {
|
|
309
|
+
// Vérifier si le bloc contient du code complexe
|
|
310
|
+
const hasComplexLogic = (trimmed.match(/&&|\|\|/g) ?? []).length >= 2 || trimmed.includes('?') || trimmed.includes('...');
|
|
311
|
+
if (hasComplexLogic) {
|
|
312
|
+
issues.push({
|
|
313
|
+
line: i + 1,
|
|
314
|
+
reason: 'Complex logic without explanatory comment',
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return issues;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Crée une suggestion pour fonction longue
|
|
323
|
+
*/
|
|
324
|
+
createLongFunctionSuggestion(filePath, func, lines, relativePath) {
|
|
325
|
+
const snippet = this.extractCodeSnippet(lines, func.startLine, 3);
|
|
326
|
+
return {
|
|
327
|
+
id: this.generateId('long-function', relativePath, func.startLine),
|
|
328
|
+
type: 'refactor',
|
|
329
|
+
priority: Math.min(10, Math.ceil(func.length / THRESHOLDS.maxFunctionLength) + 5),
|
|
330
|
+
title: `Long function: ${func.name}`,
|
|
331
|
+
description: `Function "${func.name}" is ${func.length} lines long. Consider splitting it into smaller, more focused functions.`,
|
|
332
|
+
location: {
|
|
333
|
+
file: filePath,
|
|
334
|
+
line: func.startLine,
|
|
335
|
+
},
|
|
336
|
+
before: snippet,
|
|
337
|
+
after: `// Split ${func.name} into smaller functions
|
|
338
|
+
function ${func.name}() {
|
|
339
|
+
const step1 = handleStep1();
|
|
340
|
+
const step2 = handleStep2(step1);
|
|
341
|
+
return handleStep3(step2);
|
|
342
|
+
}`,
|
|
343
|
+
benefits: [
|
|
344
|
+
'Improved readability',
|
|
345
|
+
'Easier to test individual parts',
|
|
346
|
+
'Better reusability',
|
|
347
|
+
'Simpler debugging',
|
|
348
|
+
],
|
|
349
|
+
effort: Math.ceil(func.length / 20) + 2,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Crée une suggestion pour condition complexe
|
|
354
|
+
*/
|
|
355
|
+
createComplexConditionSuggestion(filePath, cond, lines, relativePath) {
|
|
356
|
+
return {
|
|
357
|
+
id: this.generateId('complex-condition', relativePath, cond.line),
|
|
358
|
+
type: 'refactor',
|
|
359
|
+
priority: cond.complexity + 3,
|
|
360
|
+
title: 'Complex condition detected',
|
|
361
|
+
description: `Complex logical condition (complexity: ${cond.complexity}). Consider extracting to a named function or variable.`,
|
|
362
|
+
location: {
|
|
363
|
+
file: filePath,
|
|
364
|
+
line: cond.line,
|
|
365
|
+
},
|
|
366
|
+
before: cond.content,
|
|
367
|
+
after: `// Extract to a named function
|
|
368
|
+
const isValid = isValidUser && hasPermission && isActive;
|
|
369
|
+
if (isValid) { ... }`,
|
|
370
|
+
benefits: [
|
|
371
|
+
'Self-documenting code',
|
|
372
|
+
'Easier to test condition',
|
|
373
|
+
'Reusability',
|
|
374
|
+
'Reduced cognitive load',
|
|
375
|
+
],
|
|
376
|
+
effort: 3,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Crée une suggestion pour code dupliqué
|
|
381
|
+
*/
|
|
382
|
+
createDuplicateSuggestion(filePath, dup, lines, relativePath) {
|
|
383
|
+
const snippet = this.extractCodeSnippet(lines, dup.line, 2);
|
|
384
|
+
return {
|
|
385
|
+
id: this.generateId('duplicate', relativePath, dup.line),
|
|
386
|
+
type: 'extraction',
|
|
387
|
+
priority: dup.occurrences + 4,
|
|
388
|
+
title: 'Duplicated code detected',
|
|
389
|
+
description: `Code pattern appears ${dup.occurrences} times. Consider extracting to a reusable function.`,
|
|
390
|
+
location: {
|
|
391
|
+
file: filePath,
|
|
392
|
+
line: dup.line,
|
|
393
|
+
},
|
|
394
|
+
before: snippet,
|
|
395
|
+
after: `// Extract to a reusable function
|
|
396
|
+
function extractCommonLogic(input) {
|
|
397
|
+
// Common implementation here
|
|
398
|
+
return result;
|
|
399
|
+
}`,
|
|
400
|
+
benefits: [
|
|
401
|
+
'DRY principle',
|
|
402
|
+
'Single source of truth',
|
|
403
|
+
'Easier maintenance',
|
|
404
|
+
'Consistent behavior',
|
|
405
|
+
],
|
|
406
|
+
effort: 4,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Crée une suggestion pour problème de nommage
|
|
411
|
+
*/
|
|
412
|
+
createNamingSuggestion(filePath, issue, lines, relativePath) {
|
|
413
|
+
return {
|
|
414
|
+
id: this.generateId('naming', relativePath, issue.line),
|
|
415
|
+
type: 'naming',
|
|
416
|
+
priority: 3,
|
|
417
|
+
title: 'Naming issue detected',
|
|
418
|
+
description: issue.issue,
|
|
419
|
+
location: {
|
|
420
|
+
file: filePath,
|
|
421
|
+
line: issue.line,
|
|
422
|
+
},
|
|
423
|
+
before: lines[issue.line - 1] ?? '',
|
|
424
|
+
after: `// Use descriptive name instead`,
|
|
425
|
+
benefits: [
|
|
426
|
+
'Self-documenting code',
|
|
427
|
+
'Reduced need for comments',
|
|
428
|
+
'Better IDE autocomplete',
|
|
429
|
+
],
|
|
430
|
+
effort: 2,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* Crée une suggestion pour trop de paramètres
|
|
435
|
+
*/
|
|
436
|
+
createParameterSuggestion(filePath, issue, lines, relativePath) {
|
|
437
|
+
const snippet = this.extractCodeSnippet(lines, issue.line, 1);
|
|
438
|
+
return {
|
|
439
|
+
id: this.generateId('parameters', relativePath, issue.line),
|
|
440
|
+
type: 'refactor',
|
|
441
|
+
priority: issue.count - 2,
|
|
442
|
+
title: 'Too many parameters',
|
|
443
|
+
description: `Function "${issue.name}" has ${issue.count} parameters. Consider using an options object.`,
|
|
444
|
+
location: {
|
|
445
|
+
file: filePath,
|
|
446
|
+
line: issue.line,
|
|
447
|
+
},
|
|
448
|
+
before: snippet,
|
|
449
|
+
after: `// Use options object pattern
|
|
450
|
+
interface Options {
|
|
451
|
+
param1: string;
|
|
452
|
+
param2: number;
|
|
453
|
+
param3: boolean;
|
|
454
|
+
// ... other params
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
function ${issue.name}(options: Options) {
|
|
458
|
+
// ...
|
|
459
|
+
}`,
|
|
460
|
+
benefits: [
|
|
461
|
+
'Easier to extend',
|
|
462
|
+
'Named parameters',
|
|
463
|
+
'Optional parameters',
|
|
464
|
+
'Better self-documentation',
|
|
465
|
+
],
|
|
466
|
+
effort: 5,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Crée une suggestion pour manque de commentaires
|
|
471
|
+
*/
|
|
472
|
+
createCommentSuggestion(filePath, issue, lines, relativePath) {
|
|
473
|
+
const snippet = this.extractCodeSnippet(lines, issue.line, 2);
|
|
474
|
+
return {
|
|
475
|
+
id: this.generateId('comment', relativePath, issue.line),
|
|
476
|
+
type: 'refactor',
|
|
477
|
+
priority: 2,
|
|
478
|
+
title: 'Complex code needs documentation',
|
|
479
|
+
description: issue.reason,
|
|
480
|
+
location: {
|
|
481
|
+
file: filePath,
|
|
482
|
+
line: issue.line,
|
|
483
|
+
},
|
|
484
|
+
before: snippet,
|
|
485
|
+
after: `// Add comment explaining the logic
|
|
486
|
+
// Why this approach is used:
|
|
487
|
+
// - reason 1
|
|
488
|
+
// - reason 2
|
|
489
|
+
${snippet}`,
|
|
490
|
+
benefits: [
|
|
491
|
+
'Better maintainability',
|
|
492
|
+
'Knowledge transfer',
|
|
493
|
+
'Onboarding help',
|
|
494
|
+
],
|
|
495
|
+
effort: 2,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Trouve tous les fichiers source
|
|
500
|
+
*/
|
|
501
|
+
async findSourceFiles(projectPath, exclude) {
|
|
502
|
+
const files = [];
|
|
503
|
+
const traverse = async (dir) => {
|
|
504
|
+
try {
|
|
505
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
506
|
+
for (const entry of entries) {
|
|
507
|
+
const fullPath = join(dir, entry.name);
|
|
508
|
+
if (EXCLUDE_DIRS.includes(entry.name) || exclude.some((e) => fullPath.includes(e))) {
|
|
509
|
+
continue;
|
|
510
|
+
}
|
|
511
|
+
if (entry.isDirectory()) {
|
|
512
|
+
await traverse(fullPath);
|
|
513
|
+
}
|
|
514
|
+
else if (entry.isFile()) {
|
|
515
|
+
const ext = `.${entry.name.split('.').pop()}`;
|
|
516
|
+
if (SOURCE_EXTENSIONS.includes(ext)) {
|
|
517
|
+
files.push(fullPath);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
// Ignorer les erreurs
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
await traverse(projectPath);
|
|
527
|
+
return files;
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Extrait un extrait de code
|
|
531
|
+
*/
|
|
532
|
+
extractCodeSnippet(lines, targetLine, context) {
|
|
533
|
+
const start = Math.max(0, targetLine - context - 1);
|
|
534
|
+
const end = Math.min(lines.length, targetLine + context);
|
|
535
|
+
return lines.slice(start, end).join('\n');
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Trouve la position ligne/colonne à partir d'un index
|
|
539
|
+
*/
|
|
540
|
+
findPosition(content, index) {
|
|
541
|
+
const before = content.substring(0, index);
|
|
542
|
+
const lines = before.split('\n');
|
|
543
|
+
return {
|
|
544
|
+
line: lines.length,
|
|
545
|
+
column: (lines[lines.length - 1] ?? '').length + 1,
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Génère un ID unique
|
|
550
|
+
*/
|
|
551
|
+
generateId(type, file, line) {
|
|
552
|
+
return `refactor-${type}-${file.replace(/[^a-zA-Z0-9]/g, '-')}-${line}-${++this.suggestionCounter}`;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=refactor-suggester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refactor-suggester.js","sourceRoot":"","sources":["../../../../src/services/review/fixers/refactor-suggester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Generator
|
|
3
|
+
*
|
|
4
|
+
* Génération automatique de tests pour le code non couvert:
|
|
5
|
+
* - Génération de stubs de tests
|
|
6
|
+
* - Détection des fonctions sans tests
|
|
7
|
+
* - Suggestions de cas de test
|
|
8
|
+
* - Suivi des patterns du framework de test
|
|
9
|
+
*
|
|
10
|
+
* @module services/review/fixers/test-generator
|
|
11
|
+
*/
|
|
12
|
+
import type { Issue, TestGenerationResult, CoverageStats } from '../review.types.js';
|
|
13
|
+
import { DockerManager } from '../../docker/docker-manager.js';
|
|
14
|
+
/**
|
|
15
|
+
* Générateur de tests
|
|
16
|
+
*/
|
|
17
|
+
export declare class TestGenerator {
|
|
18
|
+
private readonly docker;
|
|
19
|
+
private readonly logger;
|
|
20
|
+
private projectPath;
|
|
21
|
+
private testFramework;
|
|
22
|
+
constructor(docker?: DockerManager);
|
|
23
|
+
/**
|
|
24
|
+
* Génère des tests pour un projet
|
|
25
|
+
*
|
|
26
|
+
* @param projectPath - Chemin du projet
|
|
27
|
+
* @param options - Options de génération
|
|
28
|
+
* @returns Résultat de la génération
|
|
29
|
+
*/
|
|
30
|
+
generateTests(projectPath: string, options?: {
|
|
31
|
+
coverage?: CoverageStats;
|
|
32
|
+
targetFiles?: string[];
|
|
33
|
+
framework?: 'vitest' | 'jest' | 'mocha';
|
|
34
|
+
dryRun?: boolean;
|
|
35
|
+
}): Promise<TestGenerationResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Génère des suggestions de tests pour une issue spécifique
|
|
38
|
+
*
|
|
39
|
+
* @param issue - Issue de couverture de test
|
|
40
|
+
* @returns Suggestions de tests
|
|
41
|
+
*/
|
|
42
|
+
generateTestSuggestions(issue: Issue): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Génère un stub de test pour un fichier source
|
|
45
|
+
*/
|
|
46
|
+
private generateTestForFile;
|
|
47
|
+
/**
|
|
48
|
+
* Génère les imports nécessaires pour le fichier de test
|
|
49
|
+
*/
|
|
50
|
+
private generateImports;
|
|
51
|
+
/**
|
|
52
|
+
* Génère les cas de test
|
|
53
|
+
*/
|
|
54
|
+
private generateTestCases;
|
|
55
|
+
/**
|
|
56
|
+
* Génère un test pour une fonction
|
|
57
|
+
*/
|
|
58
|
+
private generateFunctionTest;
|
|
59
|
+
/**
|
|
60
|
+
* Génère un test pour une classe
|
|
61
|
+
*/
|
|
62
|
+
private generateClassTest;
|
|
63
|
+
/**
|
|
64
|
+
* Extrait les fonctions d'un fichier
|
|
65
|
+
*/
|
|
66
|
+
private extractFunctions;
|
|
67
|
+
/**
|
|
68
|
+
* Extrait les classes d'un fichier
|
|
69
|
+
*/
|
|
70
|
+
private extractClasses;
|
|
71
|
+
/**
|
|
72
|
+
* Extrait les méthodes d'une classe
|
|
73
|
+
*/
|
|
74
|
+
private extractClassMethods;
|
|
75
|
+
/**
|
|
76
|
+
* Trouve les fichiers source sans tests
|
|
77
|
+
*/
|
|
78
|
+
private findFilesWithoutTests;
|
|
79
|
+
/**
|
|
80
|
+
* Vérifie si un fichier a un fichier de test correspondant
|
|
81
|
+
*/
|
|
82
|
+
private hasTestFile;
|
|
83
|
+
/**
|
|
84
|
+
* Obtient le chemin du fichier de test
|
|
85
|
+
*/
|
|
86
|
+
private getTestPath;
|
|
87
|
+
/**
|
|
88
|
+
* Écrit le fichier de test
|
|
89
|
+
*/
|
|
90
|
+
private writeTestFile;
|
|
91
|
+
/**
|
|
92
|
+
* Exécute les tests générés
|
|
93
|
+
*/
|
|
94
|
+
runTests(projectPath: string): Promise<{
|
|
95
|
+
success: boolean;
|
|
96
|
+
output: string;
|
|
97
|
+
}>;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=test-generator.d.ts.map
|