@oalacea/daemon 0.6.4 → 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.
Files changed (285) hide show
  1. package/README.md +268 -58
  2. package/bin/Dockerfile +158 -16
  3. package/dist/cli/cli.d.ts.map +1 -1
  4. package/dist/cli/cli.js +22 -2
  5. package/dist/cli/cli.js.map +1 -1
  6. package/dist/cli/commands/command.types.d.ts +216 -0
  7. package/dist/cli/commands/command.types.d.ts.map +1 -0
  8. package/dist/cli/commands/command.types.js +64 -0
  9. package/dist/cli/commands/command.types.js.map +1 -0
  10. package/dist/cli/commands/history.command.d.ts +91 -0
  11. package/dist/cli/commands/history.command.d.ts.map +1 -0
  12. package/dist/cli/commands/history.command.js +336 -0
  13. package/dist/cli/commands/history.command.js.map +1 -0
  14. package/dist/cli/commands/index.d.ts +14 -3
  15. package/dist/cli/commands/index.d.ts.map +1 -1
  16. package/dist/cli/commands/index.js +7 -0
  17. package/dist/cli/commands/index.js.map +1 -1
  18. package/dist/cli/commands/optimize.command.d.ts +110 -0
  19. package/dist/cli/commands/optimize.command.d.ts.map +1 -0
  20. package/dist/cli/commands/optimize.command.js +497 -0
  21. package/dist/cli/commands/optimize.command.js.map +1 -0
  22. package/dist/cli/commands/report.command.d.ts +110 -0
  23. package/dist/cli/commands/report.command.d.ts.map +1 -0
  24. package/dist/cli/commands/report.command.js +532 -0
  25. package/dist/cli/commands/report.command.js.map +1 -0
  26. package/dist/cli/commands/review.command.d.ts +110 -0
  27. package/dist/cli/commands/review.command.d.ts.map +1 -0
  28. package/dist/cli/commands/review.command.js +520 -0
  29. package/dist/cli/commands/review.command.js.map +1 -0
  30. package/dist/cli/commands/score.command.d.ts +47 -0
  31. package/dist/cli/commands/score.command.d.ts.map +1 -0
  32. package/dist/cli/commands/score.command.js +261 -0
  33. package/dist/cli/commands/score.command.js.map +1 -0
  34. package/dist/cli/utils/index.d.ts +10 -0
  35. package/dist/cli/utils/index.d.ts.map +1 -0
  36. package/dist/cli/utils/index.js +10 -0
  37. package/dist/cli/utils/index.js.map +1 -0
  38. package/dist/cli/utils/output.d.ts +192 -0
  39. package/dist/cli/utils/output.d.ts.map +1 -0
  40. package/dist/cli/utils/output.js +411 -0
  41. package/dist/cli/utils/output.js.map +1 -0
  42. package/dist/cli/utils/progress.d.ts +204 -0
  43. package/dist/cli/utils/progress.d.ts.map +1 -0
  44. package/dist/cli/utils/progress.js +396 -0
  45. package/dist/cli/utils/progress.js.map +1 -0
  46. package/dist/core/types/index.d.ts +1 -0
  47. package/dist/core/types/index.d.ts.map +1 -1
  48. package/dist/core/types/project.types.d.ts +3 -3
  49. package/dist/core/types/project.types.d.ts.map +1 -1
  50. package/dist/core/types/scoring.types.d.ts +301 -0
  51. package/dist/core/types/scoring.types.d.ts.map +1 -0
  52. package/dist/core/types/scoring.types.js +8 -0
  53. package/dist/core/types/scoring.types.js.map +1 -0
  54. package/dist/services/detection/framework-detector.d.ts.map +1 -1
  55. package/dist/services/detection/framework-detector.js +74 -5
  56. package/dist/services/detection/framework-detector.js.map +1 -1
  57. package/dist/services/index.d.ts +12 -0
  58. package/dist/services/index.d.ts.map +1 -1
  59. package/dist/services/index.js +14 -0
  60. package/dist/services/index.js.map +1 -1
  61. package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
  62. package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
  63. package/dist/services/optimization/detectors/bug-detector.js +443 -0
  64. package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
  65. package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
  66. package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
  67. package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
  68. package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
  69. package/dist/services/optimization/detectors/index.d.ts +7 -0
  70. package/dist/services/optimization/detectors/index.d.ts.map +1 -0
  71. package/dist/services/optimization/detectors/index.js +7 -0
  72. package/dist/services/optimization/detectors/index.js.map +1 -0
  73. package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
  74. package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
  75. package/dist/services/optimization/detectors/perf-detector.js +451 -0
  76. package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
  77. package/dist/services/optimization/index.d.ts +61 -0
  78. package/dist/services/optimization/index.d.ts.map +1 -0
  79. package/dist/services/optimization/index.js +69 -0
  80. package/dist/services/optimization/index.js.map +1 -0
  81. package/dist/services/optimization/optimization.service.d.ts +65 -0
  82. package/dist/services/optimization/optimization.service.d.ts.map +1 -0
  83. package/dist/services/optimization/optimization.service.js +511 -0
  84. package/dist/services/optimization/optimization.service.js.map +1 -0
  85. package/dist/services/optimization/optimization.types.d.ts +343 -0
  86. package/dist/services/optimization/optimization.types.d.ts.map +1 -0
  87. package/dist/services/optimization/optimization.types.js +8 -0
  88. package/dist/services/optimization/optimization.types.js.map +1 -0
  89. package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
  90. package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
  91. package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
  92. package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
  93. package/dist/services/optimization/optimizers/index.d.ts +7 -0
  94. package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
  95. package/dist/services/optimization/optimizers/index.js +7 -0
  96. package/dist/services/optimization/optimizers/index.js.map +1 -0
  97. package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
  98. package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
  99. package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
  100. package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
  101. package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
  102. package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
  103. package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
  104. package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
  105. package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
  106. package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
  107. package/dist/services/optimization/patterns/anti-patterns.js +501 -0
  108. package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
  109. package/dist/services/optimization/patterns/index.d.ts +5 -0
  110. package/dist/services/optimization/patterns/index.d.ts.map +1 -0
  111. package/dist/services/optimization/patterns/index.js +5 -0
  112. package/dist/services/optimization/patterns/index.js.map +1 -0
  113. package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
  114. package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
  115. package/dist/services/reporting/export/chart.exporter.js +350 -0
  116. package/dist/services/reporting/export/chart.exporter.js.map +1 -0
  117. package/dist/services/reporting/export/index.d.ts +9 -0
  118. package/dist/services/reporting/export/index.d.ts.map +1 -0
  119. package/dist/services/reporting/export/index.js +10 -0
  120. package/dist/services/reporting/export/index.js.map +1 -0
  121. package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
  122. package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
  123. package/dist/services/reporting/export/pdf.exporter.js +270 -0
  124. package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
  125. package/dist/services/reporting/history.service.d.ts +93 -0
  126. package/dist/services/reporting/history.service.d.ts.map +1 -0
  127. package/dist/services/reporting/history.service.js +285 -0
  128. package/dist/services/reporting/history.service.js.map +1 -0
  129. package/dist/services/reporting/index.d.ts +15 -0
  130. package/dist/services/reporting/index.d.ts.map +1 -0
  131. package/dist/services/reporting/index.js +16 -0
  132. package/dist/services/reporting/index.js.map +1 -0
  133. package/dist/services/reporting/report.service.d.ts +102 -0
  134. package/dist/services/reporting/report.service.d.ts.map +1 -0
  135. package/dist/services/reporting/report.service.js +240 -0
  136. package/dist/services/reporting/report.service.js.map +1 -0
  137. package/dist/services/reporting/reporting.types.d.ts +329 -0
  138. package/dist/services/reporting/reporting.types.d.ts.map +1 -0
  139. package/dist/services/reporting/reporting.types.js +8 -0
  140. package/dist/services/reporting/reporting.types.js.map +1 -0
  141. package/dist/services/reporting/templates/html.template.d.ts +81 -0
  142. package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
  143. package/dist/services/reporting/templates/html.template.js +741 -0
  144. package/dist/services/reporting/templates/html.template.js.map +1 -0
  145. package/dist/services/reporting/templates/json.template.d.ts +85 -0
  146. package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
  147. package/dist/services/reporting/templates/json.template.js +308 -0
  148. package/dist/services/reporting/templates/json.template.js.map +1 -0
  149. package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
  150. package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
  151. package/dist/services/reporting/templates/markdown.template.js +311 -0
  152. package/dist/services/reporting/templates/markdown.template.js.map +1 -0
  153. package/dist/services/reporting/trend-analyzer.d.ts +73 -0
  154. package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
  155. package/dist/services/reporting/trend-analyzer.js +291 -0
  156. package/dist/services/reporting/trend-analyzer.js.map +1 -0
  157. package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
  158. package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
  159. package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
  160. package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
  161. package/dist/services/review/analyzers/index.d.ts +13 -0
  162. package/dist/services/review/analyzers/index.d.ts.map +1 -0
  163. package/dist/services/review/analyzers/index.js +13 -0
  164. package/dist/services/review/analyzers/index.js.map +1 -0
  165. package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
  166. package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
  167. package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
  168. package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
  169. package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
  170. package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
  171. package/dist/services/review/analyzers/performance-analyzer.js +589 -0
  172. package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
  173. package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
  174. package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
  175. package/dist/services/review/analyzers/security-analyzer.js +512 -0
  176. package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
  177. package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
  178. package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
  179. package/dist/services/review/analyzers/static-analyzer.js +423 -0
  180. package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
  181. package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
  182. package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
  183. package/dist/services/review/fixers/auto-fixer.js +404 -0
  184. package/dist/services/review/fixers/auto-fixer.js.map +1 -0
  185. package/dist/services/review/fixers/index.d.ts +11 -0
  186. package/dist/services/review/fixers/index.d.ts.map +1 -0
  187. package/dist/services/review/fixers/index.js +11 -0
  188. package/dist/services/review/fixers/index.js.map +1 -0
  189. package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
  190. package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
  191. package/dist/services/review/fixers/refactor-suggester.js +555 -0
  192. package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
  193. package/dist/services/review/fixers/test-generator.d.ts +99 -0
  194. package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
  195. package/dist/services/review/fixers/test-generator.js +458 -0
  196. package/dist/services/review/fixers/test-generator.js.map +1 -0
  197. package/dist/services/review/index.d.ts +14 -0
  198. package/dist/services/review/index.d.ts.map +1 -0
  199. package/dist/services/review/index.js +14 -0
  200. package/dist/services/review/index.js.map +1 -0
  201. package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
  202. package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
  203. package/dist/services/review/reporters/fix-reporter.js +437 -0
  204. package/dist/services/review/reporters/fix-reporter.js.map +1 -0
  205. package/dist/services/review/reporters/index.d.ts +10 -0
  206. package/dist/services/review/reporters/index.d.ts.map +1 -0
  207. package/dist/services/review/reporters/index.js +10 -0
  208. package/dist/services/review/reporters/index.js.map +1 -0
  209. package/dist/services/review/reporters/score-reporter.d.ts +84 -0
  210. package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
  211. package/dist/services/review/reporters/score-reporter.js +560 -0
  212. package/dist/services/review/reporters/score-reporter.js.map +1 -0
  213. package/dist/services/review/review.service.d.ts +129 -0
  214. package/dist/services/review/review.service.d.ts.map +1 -0
  215. package/dist/services/review/review.service.js +396 -0
  216. package/dist/services/review/review.service.js.map +1 -0
  217. package/dist/services/review/review.types.d.ts +443 -0
  218. package/dist/services/review/review.types.d.ts.map +1 -0
  219. package/dist/services/review/review.types.js +11 -0
  220. package/dist/services/review/review.types.js.map +1 -0
  221. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
  222. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
  223. package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
  224. package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
  225. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
  226. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
  227. package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
  228. package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
  229. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
  230. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
  231. package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
  232. package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
  233. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
  234. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
  235. package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
  236. package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
  237. package/dist/services/scoring/dimensions/index.d.ts +18 -0
  238. package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
  239. package/dist/services/scoring/dimensions/index.js +27 -0
  240. package/dist/services/scoring/dimensions/index.js.map +1 -0
  241. package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
  242. package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
  243. package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
  244. package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
  245. package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
  246. package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
  247. package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
  248. package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
  249. package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
  250. package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
  251. package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
  252. package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
  253. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
  254. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
  255. package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
  256. package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
  257. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
  258. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
  259. package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
  260. package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
  261. package/dist/services/scoring/index.d.ts +10 -0
  262. package/dist/services/scoring/index.d.ts.map +1 -0
  263. package/dist/services/scoring/index.js +10 -0
  264. package/dist/services/scoring/index.js.map +1 -0
  265. package/dist/services/scoring/scoring-service.d.ts +222 -0
  266. package/dist/services/scoring/scoring-service.d.ts.map +1 -0
  267. package/dist/services/scoring/scoring-service.js +636 -0
  268. package/dist/services/scoring/scoring-service.js.map +1 -0
  269. package/package.json +11 -3
  270. package/templates/README.md +183 -0
  271. package/templates/nestjs/controller.spec.ts +203 -0
  272. package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
  273. package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
  274. package/templates/nestjs/fixtures/test-module.ts +311 -0
  275. package/templates/nestjs/guard.spec.ts +314 -0
  276. package/templates/nestjs/interceptor.spec.ts +458 -0
  277. package/templates/nestjs/module.spec.ts +173 -0
  278. package/templates/nestjs/pipe.spec.ts +474 -0
  279. package/templates/nestjs/service.spec.ts +296 -0
  280. package/templates/rust/Cargo.toml +72 -0
  281. package/templates/rust/actix-controller.test.rs +114 -0
  282. package/templates/rust/axum-handler.test.rs +117 -0
  283. package/templates/rust/integration.test.rs +63 -0
  284. package/templates/rust/rocket-route.test.rs +106 -0
  285. 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