@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.
Files changed (289) 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/init.command.d.ts +12 -14
  19. package/dist/cli/commands/init.command.d.ts.map +1 -1
  20. package/dist/cli/commands/init.command.js +278 -144
  21. package/dist/cli/commands/init.command.js.map +1 -1
  22. package/dist/cli/commands/optimize.command.d.ts +110 -0
  23. package/dist/cli/commands/optimize.command.d.ts.map +1 -0
  24. package/dist/cli/commands/optimize.command.js +497 -0
  25. package/dist/cli/commands/optimize.command.js.map +1 -0
  26. package/dist/cli/commands/report.command.d.ts +110 -0
  27. package/dist/cli/commands/report.command.d.ts.map +1 -0
  28. package/dist/cli/commands/report.command.js +532 -0
  29. package/dist/cli/commands/report.command.js.map +1 -0
  30. package/dist/cli/commands/review.command.d.ts +110 -0
  31. package/dist/cli/commands/review.command.d.ts.map +1 -0
  32. package/dist/cli/commands/review.command.js +520 -0
  33. package/dist/cli/commands/review.command.js.map +1 -0
  34. package/dist/cli/commands/score.command.d.ts +47 -0
  35. package/dist/cli/commands/score.command.d.ts.map +1 -0
  36. package/dist/cli/commands/score.command.js +261 -0
  37. package/dist/cli/commands/score.command.js.map +1 -0
  38. package/dist/cli/utils/index.d.ts +10 -0
  39. package/dist/cli/utils/index.d.ts.map +1 -0
  40. package/dist/cli/utils/index.js +10 -0
  41. package/dist/cli/utils/index.js.map +1 -0
  42. package/dist/cli/utils/output.d.ts +192 -0
  43. package/dist/cli/utils/output.d.ts.map +1 -0
  44. package/dist/cli/utils/output.js +411 -0
  45. package/dist/cli/utils/output.js.map +1 -0
  46. package/dist/cli/utils/progress.d.ts +204 -0
  47. package/dist/cli/utils/progress.d.ts.map +1 -0
  48. package/dist/cli/utils/progress.js +396 -0
  49. package/dist/cli/utils/progress.js.map +1 -0
  50. package/dist/core/types/index.d.ts +1 -0
  51. package/dist/core/types/index.d.ts.map +1 -1
  52. package/dist/core/types/project.types.d.ts +3 -3
  53. package/dist/core/types/project.types.d.ts.map +1 -1
  54. package/dist/core/types/scoring.types.d.ts +301 -0
  55. package/dist/core/types/scoring.types.d.ts.map +1 -0
  56. package/dist/core/types/scoring.types.js +8 -0
  57. package/dist/core/types/scoring.types.js.map +1 -0
  58. package/dist/services/detection/framework-detector.d.ts.map +1 -1
  59. package/dist/services/detection/framework-detector.js +74 -5
  60. package/dist/services/detection/framework-detector.js.map +1 -1
  61. package/dist/services/index.d.ts +12 -0
  62. package/dist/services/index.d.ts.map +1 -1
  63. package/dist/services/index.js +14 -0
  64. package/dist/services/index.js.map +1 -1
  65. package/dist/services/optimization/detectors/bug-detector.d.ts +82 -0
  66. package/dist/services/optimization/detectors/bug-detector.d.ts.map +1 -0
  67. package/dist/services/optimization/detectors/bug-detector.js +443 -0
  68. package/dist/services/optimization/detectors/bug-detector.js.map +1 -0
  69. package/dist/services/optimization/detectors/code-smell-detector.d.ts +108 -0
  70. package/dist/services/optimization/detectors/code-smell-detector.d.ts.map +1 -0
  71. package/dist/services/optimization/detectors/code-smell-detector.js +569 -0
  72. package/dist/services/optimization/detectors/code-smell-detector.js.map +1 -0
  73. package/dist/services/optimization/detectors/index.d.ts +7 -0
  74. package/dist/services/optimization/detectors/index.d.ts.map +1 -0
  75. package/dist/services/optimization/detectors/index.js +7 -0
  76. package/dist/services/optimization/detectors/index.js.map +1 -0
  77. package/dist/services/optimization/detectors/perf-detector.d.ts +80 -0
  78. package/dist/services/optimization/detectors/perf-detector.d.ts.map +1 -0
  79. package/dist/services/optimization/detectors/perf-detector.js +451 -0
  80. package/dist/services/optimization/detectors/perf-detector.js.map +1 -0
  81. package/dist/services/optimization/index.d.ts +61 -0
  82. package/dist/services/optimization/index.d.ts.map +1 -0
  83. package/dist/services/optimization/index.js +69 -0
  84. package/dist/services/optimization/index.js.map +1 -0
  85. package/dist/services/optimization/optimization.service.d.ts +65 -0
  86. package/dist/services/optimization/optimization.service.d.ts.map +1 -0
  87. package/dist/services/optimization/optimization.service.js +511 -0
  88. package/dist/services/optimization/optimization.service.js.map +1 -0
  89. package/dist/services/optimization/optimization.types.d.ts +343 -0
  90. package/dist/services/optimization/optimization.types.d.ts.map +1 -0
  91. package/dist/services/optimization/optimization.types.js +8 -0
  92. package/dist/services/optimization/optimization.types.js.map +1 -0
  93. package/dist/services/optimization/optimizers/code-optimizer.d.ts +87 -0
  94. package/dist/services/optimization/optimizers/code-optimizer.d.ts.map +1 -0
  95. package/dist/services/optimization/optimizers/code-optimizer.js +436 -0
  96. package/dist/services/optimization/optimizers/code-optimizer.js.map +1 -0
  97. package/dist/services/optimization/optimizers/index.d.ts +7 -0
  98. package/dist/services/optimization/optimizers/index.d.ts.map +1 -0
  99. package/dist/services/optimization/optimizers/index.js +7 -0
  100. package/dist/services/optimization/optimizers/index.js.map +1 -0
  101. package/dist/services/optimization/optimizers/perf-optimizer.d.ts +64 -0
  102. package/dist/services/optimization/optimizers/perf-optimizer.d.ts.map +1 -0
  103. package/dist/services/optimization/optimizers/perf-optimizer.js +330 -0
  104. package/dist/services/optimization/optimizers/perf-optimizer.js.map +1 -0
  105. package/dist/services/optimization/optimizers/refact-optimizer.d.ts +82 -0
  106. package/dist/services/optimization/optimizers/refact-optimizer.d.ts.map +1 -0
  107. package/dist/services/optimization/optimizers/refact-optimizer.js +354 -0
  108. package/dist/services/optimization/optimizers/refact-optimizer.js.map +1 -0
  109. package/dist/services/optimization/patterns/anti-patterns.d.ts +31 -0
  110. package/dist/services/optimization/patterns/anti-patterns.d.ts.map +1 -0
  111. package/dist/services/optimization/patterns/anti-patterns.js +501 -0
  112. package/dist/services/optimization/patterns/anti-patterns.js.map +1 -0
  113. package/dist/services/optimization/patterns/index.d.ts +5 -0
  114. package/dist/services/optimization/patterns/index.d.ts.map +1 -0
  115. package/dist/services/optimization/patterns/index.js +5 -0
  116. package/dist/services/optimization/patterns/index.js.map +1 -0
  117. package/dist/services/reporting/export/chart.exporter.d.ts +59 -0
  118. package/dist/services/reporting/export/chart.exporter.d.ts.map +1 -0
  119. package/dist/services/reporting/export/chart.exporter.js +350 -0
  120. package/dist/services/reporting/export/chart.exporter.js.map +1 -0
  121. package/dist/services/reporting/export/index.d.ts +9 -0
  122. package/dist/services/reporting/export/index.d.ts.map +1 -0
  123. package/dist/services/reporting/export/index.js +10 -0
  124. package/dist/services/reporting/export/index.js.map +1 -0
  125. package/dist/services/reporting/export/pdf.exporter.d.ts +133 -0
  126. package/dist/services/reporting/export/pdf.exporter.d.ts.map +1 -0
  127. package/dist/services/reporting/export/pdf.exporter.js +270 -0
  128. package/dist/services/reporting/export/pdf.exporter.js.map +1 -0
  129. package/dist/services/reporting/history.service.d.ts +93 -0
  130. package/dist/services/reporting/history.service.d.ts.map +1 -0
  131. package/dist/services/reporting/history.service.js +285 -0
  132. package/dist/services/reporting/history.service.js.map +1 -0
  133. package/dist/services/reporting/index.d.ts +15 -0
  134. package/dist/services/reporting/index.d.ts.map +1 -0
  135. package/dist/services/reporting/index.js +16 -0
  136. package/dist/services/reporting/index.js.map +1 -0
  137. package/dist/services/reporting/report.service.d.ts +102 -0
  138. package/dist/services/reporting/report.service.d.ts.map +1 -0
  139. package/dist/services/reporting/report.service.js +240 -0
  140. package/dist/services/reporting/report.service.js.map +1 -0
  141. package/dist/services/reporting/reporting.types.d.ts +329 -0
  142. package/dist/services/reporting/reporting.types.d.ts.map +1 -0
  143. package/dist/services/reporting/reporting.types.js +8 -0
  144. package/dist/services/reporting/reporting.types.js.map +1 -0
  145. package/dist/services/reporting/templates/html.template.d.ts +81 -0
  146. package/dist/services/reporting/templates/html.template.d.ts.map +1 -0
  147. package/dist/services/reporting/templates/html.template.js +741 -0
  148. package/dist/services/reporting/templates/html.template.js.map +1 -0
  149. package/dist/services/reporting/templates/json.template.d.ts +85 -0
  150. package/dist/services/reporting/templates/json.template.d.ts.map +1 -0
  151. package/dist/services/reporting/templates/json.template.js +308 -0
  152. package/dist/services/reporting/templates/json.template.js.map +1 -0
  153. package/dist/services/reporting/templates/markdown.template.d.ts +69 -0
  154. package/dist/services/reporting/templates/markdown.template.d.ts.map +1 -0
  155. package/dist/services/reporting/templates/markdown.template.js +311 -0
  156. package/dist/services/reporting/templates/markdown.template.js.map +1 -0
  157. package/dist/services/reporting/trend-analyzer.d.ts +73 -0
  158. package/dist/services/reporting/trend-analyzer.d.ts.map +1 -0
  159. package/dist/services/reporting/trend-analyzer.js +291 -0
  160. package/dist/services/reporting/trend-analyzer.js.map +1 -0
  161. package/dist/services/review/analyzers/dependency-analyzer.d.ts +87 -0
  162. package/dist/services/review/analyzers/dependency-analyzer.d.ts.map +1 -0
  163. package/dist/services/review/analyzers/dependency-analyzer.js +458 -0
  164. package/dist/services/review/analyzers/dependency-analyzer.js.map +1 -0
  165. package/dist/services/review/analyzers/index.d.ts +13 -0
  166. package/dist/services/review/analyzers/index.d.ts.map +1 -0
  167. package/dist/services/review/analyzers/index.js +13 -0
  168. package/dist/services/review/analyzers/index.js.map +1 -0
  169. package/dist/services/review/analyzers/nestjs-analyzer.d.ts +210 -0
  170. package/dist/services/review/analyzers/nestjs-analyzer.d.ts.map +1 -0
  171. package/dist/services/review/analyzers/nestjs-analyzer.js +571 -0
  172. package/dist/services/review/analyzers/nestjs-analyzer.js.map +1 -0
  173. package/dist/services/review/analyzers/performance-analyzer.d.ts +91 -0
  174. package/dist/services/review/analyzers/performance-analyzer.d.ts.map +1 -0
  175. package/dist/services/review/analyzers/performance-analyzer.js +589 -0
  176. package/dist/services/review/analyzers/performance-analyzer.js.map +1 -0
  177. package/dist/services/review/analyzers/security-analyzer.d.ts +96 -0
  178. package/dist/services/review/analyzers/security-analyzer.d.ts.map +1 -0
  179. package/dist/services/review/analyzers/security-analyzer.js +512 -0
  180. package/dist/services/review/analyzers/security-analyzer.js.map +1 -0
  181. package/dist/services/review/analyzers/static-analyzer.d.ts +90 -0
  182. package/dist/services/review/analyzers/static-analyzer.d.ts.map +1 -0
  183. package/dist/services/review/analyzers/static-analyzer.js +423 -0
  184. package/dist/services/review/analyzers/static-analyzer.js.map +1 -0
  185. package/dist/services/review/fixers/auto-fixer.d.ts +94 -0
  186. package/dist/services/review/fixers/auto-fixer.d.ts.map +1 -0
  187. package/dist/services/review/fixers/auto-fixer.js +404 -0
  188. package/dist/services/review/fixers/auto-fixer.js.map +1 -0
  189. package/dist/services/review/fixers/index.d.ts +11 -0
  190. package/dist/services/review/fixers/index.d.ts.map +1 -0
  191. package/dist/services/review/fixers/index.js +11 -0
  192. package/dist/services/review/fixers/index.js.map +1 -0
  193. package/dist/services/review/fixers/refactor-suggester.d.ts +100 -0
  194. package/dist/services/review/fixers/refactor-suggester.d.ts.map +1 -0
  195. package/dist/services/review/fixers/refactor-suggester.js +555 -0
  196. package/dist/services/review/fixers/refactor-suggester.js.map +1 -0
  197. package/dist/services/review/fixers/test-generator.d.ts +99 -0
  198. package/dist/services/review/fixers/test-generator.d.ts.map +1 -0
  199. package/dist/services/review/fixers/test-generator.js +458 -0
  200. package/dist/services/review/fixers/test-generator.js.map +1 -0
  201. package/dist/services/review/index.d.ts +14 -0
  202. package/dist/services/review/index.d.ts.map +1 -0
  203. package/dist/services/review/index.js +14 -0
  204. package/dist/services/review/index.js.map +1 -0
  205. package/dist/services/review/reporters/fix-reporter.d.ts +67 -0
  206. package/dist/services/review/reporters/fix-reporter.d.ts.map +1 -0
  207. package/dist/services/review/reporters/fix-reporter.js +437 -0
  208. package/dist/services/review/reporters/fix-reporter.js.map +1 -0
  209. package/dist/services/review/reporters/index.d.ts +10 -0
  210. package/dist/services/review/reporters/index.d.ts.map +1 -0
  211. package/dist/services/review/reporters/index.js +10 -0
  212. package/dist/services/review/reporters/index.js.map +1 -0
  213. package/dist/services/review/reporters/score-reporter.d.ts +84 -0
  214. package/dist/services/review/reporters/score-reporter.d.ts.map +1 -0
  215. package/dist/services/review/reporters/score-reporter.js +560 -0
  216. package/dist/services/review/reporters/score-reporter.js.map +1 -0
  217. package/dist/services/review/review.service.d.ts +129 -0
  218. package/dist/services/review/review.service.d.ts.map +1 -0
  219. package/dist/services/review/review.service.js +396 -0
  220. package/dist/services/review/review.service.js.map +1 -0
  221. package/dist/services/review/review.types.d.ts +443 -0
  222. package/dist/services/review/review.types.d.ts.map +1 -0
  223. package/dist/services/review/review.types.js +11 -0
  224. package/dist/services/review/review.types.js.map +1 -0
  225. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts +53 -0
  226. package/dist/services/scoring/dimensions/accessibility.analyzer.d.ts.map +1 -0
  227. package/dist/services/scoring/dimensions/accessibility.analyzer.js +260 -0
  228. package/dist/services/scoring/dimensions/accessibility.analyzer.js.map +1 -0
  229. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts +138 -0
  230. package/dist/services/scoring/dimensions/backend-logic.analyzer.d.ts.map +1 -0
  231. package/dist/services/scoring/dimensions/backend-logic.analyzer.js +713 -0
  232. package/dist/services/scoring/dimensions/backend-logic.analyzer.js.map +1 -0
  233. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts +142 -0
  234. package/dist/services/scoring/dimensions/business-logic.analyzer.d.ts.map +1 -0
  235. package/dist/services/scoring/dimensions/business-logic.analyzer.js +747 -0
  236. package/dist/services/scoring/dimensions/business-logic.analyzer.js.map +1 -0
  237. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts +142 -0
  238. package/dist/services/scoring/dimensions/code-quality.analyzer.d.ts.map +1 -0
  239. package/dist/services/scoring/dimensions/code-quality.analyzer.js +685 -0
  240. package/dist/services/scoring/dimensions/code-quality.analyzer.js.map +1 -0
  241. package/dist/services/scoring/dimensions/index.d.ts +18 -0
  242. package/dist/services/scoring/dimensions/index.d.ts.map +1 -0
  243. package/dist/services/scoring/dimensions/index.js +27 -0
  244. package/dist/services/scoring/dimensions/index.js.map +1 -0
  245. package/dist/services/scoring/dimensions/performance.analyzer.d.ts +125 -0
  246. package/dist/services/scoring/dimensions/performance.analyzer.d.ts.map +1 -0
  247. package/dist/services/scoring/dimensions/performance.analyzer.js +615 -0
  248. package/dist/services/scoring/dimensions/performance.analyzer.js.map +1 -0
  249. package/dist/services/scoring/dimensions/security.analyzer.d.ts +53 -0
  250. package/dist/services/scoring/dimensions/security.analyzer.d.ts.map +1 -0
  251. package/dist/services/scoring/dimensions/security.analyzer.js +327 -0
  252. package/dist/services/scoring/dimensions/security.analyzer.js.map +1 -0
  253. package/dist/services/scoring/dimensions/seo.analyzer.d.ts +77 -0
  254. package/dist/services/scoring/dimensions/seo.analyzer.d.ts.map +1 -0
  255. package/dist/services/scoring/dimensions/seo.analyzer.js +502 -0
  256. package/dist/services/scoring/dimensions/seo.analyzer.js.map +1 -0
  257. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts +106 -0
  258. package/dist/services/scoring/dimensions/test-coverage.analyzer.d.ts.map +1 -0
  259. package/dist/services/scoring/dimensions/test-coverage.analyzer.js +496 -0
  260. package/dist/services/scoring/dimensions/test-coverage.analyzer.js.map +1 -0
  261. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts +126 -0
  262. package/dist/services/scoring/dimensions/ui-ux.analyzer.d.ts.map +1 -0
  263. package/dist/services/scoring/dimensions/ui-ux.analyzer.js +665 -0
  264. package/dist/services/scoring/dimensions/ui-ux.analyzer.js.map +1 -0
  265. package/dist/services/scoring/index.d.ts +10 -0
  266. package/dist/services/scoring/index.d.ts.map +1 -0
  267. package/dist/services/scoring/index.js +10 -0
  268. package/dist/services/scoring/index.js.map +1 -0
  269. package/dist/services/scoring/scoring-service.d.ts +222 -0
  270. package/dist/services/scoring/scoring-service.d.ts.map +1 -0
  271. package/dist/services/scoring/scoring-service.js +636 -0
  272. package/dist/services/scoring/scoring-service.js.map +1 -0
  273. package/package.json +11 -3
  274. package/templates/README.md +183 -0
  275. package/templates/nestjs/controller.spec.ts +203 -0
  276. package/templates/nestjs/e2e/api.e2e-spec.ts +451 -0
  277. package/templates/nestjs/e2e/auth.e2e-spec.ts +533 -0
  278. package/templates/nestjs/fixtures/test-module.ts +311 -0
  279. package/templates/nestjs/guard.spec.ts +314 -0
  280. package/templates/nestjs/interceptor.spec.ts +458 -0
  281. package/templates/nestjs/module.spec.ts +173 -0
  282. package/templates/nestjs/pipe.spec.ts +474 -0
  283. package/templates/nestjs/service.spec.ts +296 -0
  284. package/templates/rust/Cargo.toml +72 -0
  285. package/templates/rust/actix-controller.test.rs +114 -0
  286. package/templates/rust/axum-handler.test.rs +117 -0
  287. package/templates/rust/integration.test.rs +63 -0
  288. package/templates/rust/rocket-route.test.rs +106 -0
  289. package/templates/rust/unit.test.rs +38 -0
@@ -0,0 +1,615 @@
1
+ /**
2
+ * Performance Analyzer
3
+ *
4
+ * Analyzes performance metrics including Lighthouse scores, Core Web Vitals,
5
+ * bundle size analysis, and loading performance.
6
+ *
7
+ * @module services/scoring/dimensions/performance
8
+ */
9
+ import { readFile, access, readdir, stat } from 'node:fs/promises';
10
+ import { join, extname, relative } from 'node:path';
11
+ import { existsSync } from 'node:fs';
12
+ import { CommandExecutor } from '../../../shared/utils/command-executor.js';
13
+ import { createLogger } from '../../../shared/utils/logger.js';
14
+ /**
15
+ * Performance Analyzer
16
+ *
17
+ * Evaluates performance across multiple dimensions:
18
+ * - Lighthouse scores (performance, accessibility, best practices, SEO)
19
+ * - Core Web Vitals (LCP, FID, CLS)
20
+ * - Bundle size analysis
21
+ * - Loading performance
22
+ */
23
+ export class PerformanceAnalyzer {
24
+ /** Analyzer configuration */
25
+ config = {
26
+ dimension: 'performance',
27
+ defaultWeight: 0.15,
28
+ estimatedDuration: 60000,
29
+ requiresRunningProject: true,
30
+ supportedFrameworks: ['Next.js', 'React', 'Vue', 'Nuxt', 'Svelte', 'Angular', 'Remix', 'SvelteKit', 'Astro', 'Gatsby'],
31
+ };
32
+ logger;
33
+ executor;
34
+ appUrl;
35
+ lighthouseCommand;
36
+ maxBundleSize;
37
+ targetLcp;
38
+ targetCls;
39
+ runLighthouse;
40
+ // Thresholds for Core Web Vitals
41
+ VITAL_THRESHOLDS = {
42
+ lcp: { good: 2500, needsImprovement: 4000 },
43
+ fid: { good: 100, needsImprovement: 300 },
44
+ cls: { good: 0.1, needsImprovement: 0.25 },
45
+ fcp: { good: 1800, needsImprovement: 3000 },
46
+ tti: { good: 3800, needsImprovement: 7300 },
47
+ };
48
+ constructor(options = {}) {
49
+ this.logger = createLogger('PerformanceAnalyzer');
50
+ this.executor = new CommandExecutor();
51
+ this.appUrl = options.appUrl ?? 'http://localhost:3000';
52
+ this.lighthouseCommand = options.lighthouseCommand ?? 'npx lighthouse';
53
+ this.maxBundleSize = options.maxBundleSize ?? 250_000; // 250KB default
54
+ this.targetLcp = options.targetLcp ?? 2500;
55
+ this.targetCls = options.targetCls ?? 0.1;
56
+ this.runLighthouse = options.runLighthouse ?? false;
57
+ }
58
+ /**
59
+ * Get the dimension this analyzer handles
60
+ */
61
+ getDimension() {
62
+ return 'performance';
63
+ }
64
+ /**
65
+ * Get the default weight for this dimension
66
+ */
67
+ getWeight() {
68
+ return 0.15; // 15% weight in overall score
69
+ }
70
+ /**
71
+ * Analyze performance for a project
72
+ *
73
+ * @param projectPath - Path to the project root
74
+ * @param _framework - Detected framework (optional, for framework-specific analysis)
75
+ * @param _options - Scoring options (optional)
76
+ * @returns Dimension score with performance metrics
77
+ */
78
+ async analyze(projectPath, _framework, _options) {
79
+ const startTime = performance.now();
80
+ this.logger.info(`Analyzing performance for: ${projectPath}`);
81
+ const issues = [];
82
+ const improvements = [];
83
+ try {
84
+ // Run Lighthouse if configured
85
+ let lighthouseReport = null;
86
+ if (this.runLighthouse) {
87
+ lighthouseReport = await this.runLighthouseAnalysis();
88
+ }
89
+ // Analyze bundle size
90
+ const bundleMetrics = await this.analyzeBundleSize(projectPath);
91
+ // Check for performance optimizations
92
+ const optimizations = await this.checkPerformanceOptimizations(projectPath);
93
+ // Read existing Lighthouse report if available
94
+ if (!lighthouseReport) {
95
+ lighthouseReport = await this.readExistingLighthouseReport(projectPath);
96
+ }
97
+ // Build issues list
98
+ issues.push(...this.identifyPerformanceIssues(lighthouseReport, bundleMetrics, optimizations));
99
+ // Build improvements list
100
+ improvements.push(...this.generatePerformanceImprovements(lighthouseReport, bundleMetrics, optimizations));
101
+ // Calculate final score
102
+ const score = this.calculatePerformanceScore(lighthouseReport, bundleMetrics, optimizations);
103
+ const duration = Math.round(performance.now() - startTime);
104
+ return {
105
+ dimension: this.getDimension(),
106
+ score,
107
+ weight: this.getWeight(),
108
+ weightedScore: score * this.getWeight(),
109
+ issues,
110
+ improvements,
111
+ metadata: {
112
+ itemsChecked: this.countCheckedItems(bundleMetrics, optimizations),
113
+ itemsPassed: this.countPassedItems(lighthouseReport, bundleMetrics),
114
+ metrics: {
115
+ lighthousePerformance: lighthouseReport?.categories?.performance?.score ?? 0,
116
+ lighthouseAccessibility: lighthouseReport?.categories?.accessibility?.score ?? 0,
117
+ lighthouseBestPractices: lighthouseReport?.categories?.['best-practices']?.score ?? 0,
118
+ lighthouseSeo: lighthouseReport?.categories?.seo?.score ?? 0,
119
+ bundleSize: bundleMetrics?.rawSize ?? 0,
120
+ bundleSizeGzip: bundleMetrics?.gzippedSize ?? 0,
121
+ hasCodeSplitting: optimizations.hasCodeSplitting ? 1 : 0,
122
+ hasTreeShaking: optimizations.hasTreeShaking ? 1 : 0,
123
+ hasCompression: optimizations.hasCompression ? 1 : 0,
124
+ hasLazyLoading: optimizations.hasLazyLoading ? 1 : 0,
125
+ hasImageOptimization: optimizations.hasImageOptimization ? 1 : 0,
126
+ },
127
+ },
128
+ };
129
+ }
130
+ catch (error) {
131
+ this.logger.error('Error analyzing performance', error);
132
+ issues.push({
133
+ severity: 'medium',
134
+ category: 'performance',
135
+ description: `Failed to analyze performance: ${error instanceof Error ? error.message : String(error)}`,
136
+ fixable: false,
137
+ });
138
+ const duration = Math.round(performance.now() - startTime);
139
+ return {
140
+ dimension: this.getDimension(),
141
+ score: 50, // Neutral score on error
142
+ weight: this.getWeight(),
143
+ weightedScore: 50 * this.getWeight(),
144
+ issues,
145
+ improvements,
146
+ metadata: { error: String(error) },
147
+ };
148
+ }
149
+ }
150
+ /**
151
+ * Run Lighthouse analysis
152
+ */
153
+ async runLighthouseAnalysis() {
154
+ try {
155
+ const command = `${this.lighthouseCommand} ${this.appUrl} --output json --quiet`;
156
+ const result = await this.executor.execute(command, {
157
+ timeout: 120000, // 2 minutes
158
+ silent: true,
159
+ });
160
+ if (!result.success || !result.data) {
161
+ this.logger.warn('Lighthouse execution failed');
162
+ return null;
163
+ }
164
+ return JSON.parse(result.data.stdout);
165
+ }
166
+ catch (error) {
167
+ this.logger.warn('Failed to run Lighthouse', error);
168
+ return null;
169
+ }
170
+ }
171
+ /**
172
+ * Read existing Lighthouse report
173
+ */
174
+ async readExistingLighthouseReport(projectPath) {
175
+ const reportPaths = [
176
+ join(projectPath, '.lighthouseci', 'lhr-*.json'),
177
+ join(projectPath, 'lighthouse-report.json'),
178
+ join(projectPath, '.lighthouse', 'reports', '*.json'),
179
+ ];
180
+ for (const pattern of reportPaths) {
181
+ // In a real implementation, would use glob to find matching files
182
+ // For now, check the direct path without glob
183
+ const directPath = pattern.replace('*', 'latest');
184
+ try {
185
+ await access(directPath);
186
+ const content = await readFile(directPath, 'utf-8');
187
+ return JSON.parse(content);
188
+ }
189
+ catch {
190
+ continue;
191
+ }
192
+ }
193
+ return null;
194
+ }
195
+ /**
196
+ * Analyze bundle size from build output
197
+ */
198
+ async analyzeBundleSize(projectPath) {
199
+ const buildDirs = [
200
+ join(projectPath, '.next', 'static'),
201
+ join(projectPath, 'dist'),
202
+ join(projectPath, 'build'),
203
+ join(projectPath, 'out'),
204
+ ];
205
+ for (const buildDir of buildDirs) {
206
+ if (!existsSync(buildDir)) {
207
+ continue;
208
+ }
209
+ try {
210
+ const metrics = await this.calculateBundleMetrics(buildDir);
211
+ if (metrics) {
212
+ return metrics;
213
+ }
214
+ }
215
+ catch {
216
+ continue;
217
+ }
218
+ }
219
+ return null;
220
+ }
221
+ /**
222
+ * Calculate bundle metrics from build directory
223
+ */
224
+ async calculateBundleMetrics(buildDir) {
225
+ let totalSize = 0;
226
+ let largestSize = 0;
227
+ let largestAsset = { name: 'unknown', size: 0 };
228
+ let chunkCount = 0;
229
+ async function scanDir(dir) {
230
+ try {
231
+ const entries = await readdir(dir, { withFileTypes: true });
232
+ for (const entry of entries) {
233
+ const fullPath = join(dir, entry.name);
234
+ if (entry.isDirectory()) {
235
+ await scanDir(fullPath);
236
+ }
237
+ else if (entry.isFile()) {
238
+ const ext = extname(entry.name);
239
+ // Count JS and CSS files
240
+ if (['.js', '.mjs', '.cjs', '.css'].includes(ext)) {
241
+ const stats = await stat(fullPath);
242
+ const size = stats.size;
243
+ totalSize += size;
244
+ chunkCount++;
245
+ if (size > largestSize) {
246
+ largestSize = size;
247
+ largestAsset = {
248
+ name: relative(process.cwd(), fullPath),
249
+ size,
250
+ };
251
+ }
252
+ }
253
+ }
254
+ }
255
+ }
256
+ catch {
257
+ // Ignore
258
+ }
259
+ }
260
+ await scanDir(buildDir);
261
+ if (chunkCount === 0) {
262
+ return null;
263
+ }
264
+ // Estimate gzipped size (roughly 70% reduction for JS)
265
+ const gzippedSize = Math.round(totalSize * 0.3);
266
+ return {
267
+ rawSize: totalSize,
268
+ gzippedSize,
269
+ chunkCount,
270
+ largestAsset,
271
+ };
272
+ }
273
+ /**
274
+ * Check for performance optimizations
275
+ */
276
+ async checkPerformanceOptimizations(projectPath) {
277
+ const optimizations = {
278
+ hasCodeSplitting: false,
279
+ hasTreeShaking: false,
280
+ hasCompression: false,
281
+ hasLazyLoading: false,
282
+ hasImageOptimization: false,
283
+ hasCaching: false,
284
+ };
285
+ // Check Next.js optimizations
286
+ if (existsSync(join(projectPath, 'next.config.js')) || existsSync(join(projectPath, 'next.config.mjs')) || existsSync(join(projectPath, 'next.config.ts'))) {
287
+ optimizations.hasCodeSplitting = true; // Next.js has automatic code splitting
288
+ optimizations.hasImageOptimization = true; // Next.js Image component
289
+ }
290
+ // Check for Vite (has tree shaking by default)
291
+ try {
292
+ const pkgPath = join(projectPath, 'package.json');
293
+ const pkgContent = await readFile(pkgPath, 'utf-8');
294
+ const pkg = JSON.parse(pkgContent);
295
+ if (pkg.devDependencies?.vite || pkg.dependencies?.vite) {
296
+ optimizations.hasTreeShaking = true;
297
+ optimizations.hasCodeSplitting = true;
298
+ }
299
+ }
300
+ catch {
301
+ // Ignore
302
+ }
303
+ // Check for lazy loading patterns in code
304
+ const srcDir = join(projectPath, 'src');
305
+ if (existsSync(srcDir)) {
306
+ optimizations.hasLazyLoading = await this.checkForLazyLoading(srcDir);
307
+ }
308
+ // Check for compression middleware
309
+ optimizations.hasCompression = await this.checkForCompression(projectPath);
310
+ // Check for caching headers/strategy
311
+ optimizations.hasCaching = await this.checkForCaching(projectPath);
312
+ return optimizations;
313
+ }
314
+ /**
315
+ * Check for lazy loading patterns
316
+ */
317
+ async checkForLazyLoading(dir) {
318
+ try {
319
+ const entries = await readdir(dir, { withFileTypes: true });
320
+ for (const entry of entries) {
321
+ const fullPath = join(dir, entry.name);
322
+ if (entry.isDirectory()) {
323
+ if (!['node_modules', '.git', 'dist', 'build'].includes(entry.name)) {
324
+ if (await this.checkForLazyLoading(fullPath)) {
325
+ return true;
326
+ }
327
+ }
328
+ }
329
+ else if (entry.isFile()) {
330
+ const ext = extname(entry.name);
331
+ if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {
332
+ const content = await readFile(fullPath, 'utf-8');
333
+ // Check for dynamic import patterns
334
+ if (/\bimport\(|lazy\(|React\.lazy/.test(content)) {
335
+ return true;
336
+ }
337
+ }
338
+ }
339
+ }
340
+ }
341
+ catch {
342
+ // Ignore
343
+ }
344
+ return false;
345
+ }
346
+ /**
347
+ * Check for compression configuration
348
+ */
349
+ async checkForCompression(projectPath) {
350
+ // Check for common compression patterns
351
+ const compressionPatterns = [
352
+ 'compression',
353
+ 'compress',
354
+ 'gzip',
355
+ 'brotli',
356
+ 'ngsw-config.json', // Angular service worker
357
+ ];
358
+ // Check package.json for compression dependencies
359
+ try {
360
+ const pkgPath = join(projectPath, 'package.json');
361
+ const pkgContent = await readFile(pkgPath, 'utf-8');
362
+ const pkg = JSON.parse(pkgContent);
363
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
364
+ for (const pattern of compressionPatterns) {
365
+ if (Object.keys(allDeps).some((key) => key.toLowerCase().includes(pattern))) {
366
+ return true;
367
+ }
368
+ }
369
+ }
370
+ catch {
371
+ // Ignore
372
+ }
373
+ return false;
374
+ }
375
+ /**
376
+ * Check for caching strategy
377
+ */
378
+ async checkForCaching(projectPath) {
379
+ // Check for service worker, cache headers, or CDN config
380
+ const cacheIndicators = [
381
+ 'service-worker',
382
+ 'sw.js',
383
+ 'workbox',
384
+ 'cache-control',
385
+ 'vercel.json', // Vercel caching
386
+ 'netlify.toml', // Netlify caching
387
+ ];
388
+ for (const indicator of cacheIndicators) {
389
+ if (existsSync(join(projectPath, indicator)) || existsSync(join(projectPath, 'public', indicator))) {
390
+ return true;
391
+ }
392
+ }
393
+ // Check Next.js caching (ISR, revalidate)
394
+ if (existsSync(join(projectPath, 'next.config.js')) || existsSync(join(projectPath, 'next.config.mjs'))) {
395
+ return true;
396
+ }
397
+ return false;
398
+ }
399
+ /**
400
+ * Identify performance issues
401
+ */
402
+ identifyPerformanceIssues(lighthouseReport, bundleMetrics, optimizations) {
403
+ const issues = [];
404
+ // Lighthouse score issues
405
+ if (lighthouseReport?.categories?.performance?.score !== undefined) {
406
+ const perfScore = lighthouseReport.categories.performance.score * 100;
407
+ if (perfScore < 50) {
408
+ issues.push({
409
+ severity: 'high',
410
+ category: 'performance',
411
+ description: `Lighthouse performance score (${perfScore.toFixed(0)}) is below 50`,
412
+ fixable: false,
413
+ suggestion: 'Focus on improving Core Web Vitals: LCP, FID, and CLS',
414
+ });
415
+ }
416
+ else if (perfScore < 80) {
417
+ issues.push({
418
+ severity: 'medium',
419
+ category: 'performance',
420
+ description: `Lighthouse performance score (${perfScore.toFixed(0)}) is below 80`,
421
+ fixable: false,
422
+ suggestion: 'Optimize loading performance and resource delivery',
423
+ });
424
+ }
425
+ }
426
+ // Bundle size issues
427
+ if (bundleMetrics) {
428
+ const sizeMb = bundleMetrics.rawSize / 1_000_000;
429
+ if (bundleMetrics.rawSize > this.maxBundleSize) {
430
+ issues.push({
431
+ severity: 'medium',
432
+ category: 'performance',
433
+ description: `Bundle size (${sizeMb.toFixed(2)}MB) exceeds recommended limit (${(this.maxBundleSize / 1_000_000).toFixed(2)}MB)`,
434
+ fixable: false,
435
+ suggestion: 'Implement code splitting and remove unused dependencies',
436
+ });
437
+ }
438
+ if (bundleMetrics.gzippedSize > 100_000) {
439
+ issues.push({
440
+ severity: 'medium',
441
+ category: 'performance',
442
+ description: `Gzipped bundle size (${(bundleMetrics.gzippedSize / 1000).toFixed(0)}KB) is large`,
443
+ fixable: false,
444
+ suggestion: 'Analyze bundle composition and consider dynamic imports',
445
+ });
446
+ }
447
+ }
448
+ // Optimization issues
449
+ if (!optimizations.hasCodeSplitting) {
450
+ issues.push({
451
+ severity: 'medium',
452
+ category: 'performance',
453
+ description: 'No code splitting detected',
454
+ fixable: true,
455
+ suggestion: 'Implement route-based or component-based code splitting',
456
+ });
457
+ }
458
+ if (!optimizations.hasLazyLoading) {
459
+ issues.push({
460
+ severity: 'low',
461
+ category: 'performance',
462
+ description: 'No lazy loading detected for components or images',
463
+ fixable: true,
464
+ suggestion: 'Use dynamic imports for below-fold components and lazy loading for images',
465
+ });
466
+ }
467
+ if (!optimizations.hasCompression) {
468
+ issues.push({
469
+ severity: 'medium',
470
+ category: 'performance',
471
+ description: 'No compression middleware detected',
472
+ fixable: true,
473
+ suggestion: 'Enable gzip/brotli compression on your server',
474
+ });
475
+ }
476
+ return issues;
477
+ }
478
+ /**
479
+ * Generate performance improvements
480
+ */
481
+ generatePerformanceImprovements(lighthouseReport, bundleMetrics, optimizations) {
482
+ const improvements = [];
483
+ // Lighthouse-based improvements
484
+ if (lighthouseReport?.categories?.performance?.score !== undefined) {
485
+ const perfScore = lighthouseReport.categories.performance.score * 100;
486
+ if (perfScore < 90) {
487
+ improvements.push({
488
+ type: 'optimize',
489
+ description: `Improve Lighthouse performance score from ${perfScore.toFixed(0)} to 90+`,
490
+ effort: 'moderate',
491
+ impact: 'high',
492
+ steps: [
493
+ 'Eliminate render-blocking resources',
494
+ 'Reduce JavaScript execution time',
495
+ 'Properly size images',
496
+ 'Use modern image formats (WebP, AVIF)',
497
+ 'Implement text compression',
498
+ ],
499
+ });
500
+ }
501
+ }
502
+ // Bundle size improvements
503
+ if (bundleMetrics && bundleMetrics.rawSize > this.maxBundleSize) {
504
+ improvements.push({
505
+ type: 'optimize',
506
+ description: 'Reduce bundle size through code splitting and tree shaking',
507
+ effort: 'moderate',
508
+ impact: 'high',
509
+ steps: [
510
+ 'Analyze bundle composition using webpack-bundle-analyzer or similar',
511
+ 'Remove unused dependencies',
512
+ 'Implement route-based code splitting',
513
+ 'Use dynamic imports for large libraries',
514
+ 'Enable production optimizations',
515
+ ],
516
+ });
517
+ }
518
+ // Lazy loading improvements
519
+ if (!optimizations.hasLazyLoading) {
520
+ improvements.push({
521
+ type: 'optimize',
522
+ description: 'Implement lazy loading for images and components',
523
+ effort: 'quick',
524
+ impact: 'medium',
525
+ });
526
+ }
527
+ // Image optimization improvements
528
+ if (!optimizations.hasImageOptimization) {
529
+ improvements.push({
530
+ type: 'optimize',
531
+ description: 'Implement image optimization strategy',
532
+ effort: 'moderate',
533
+ impact: 'medium',
534
+ steps: [
535
+ 'Use responsive images with srcset',
536
+ 'Implement lazy loading for images',
537
+ 'Serve modern formats (WebP, AVIF)',
538
+ 'Compress images appropriately',
539
+ ],
540
+ });
541
+ }
542
+ // Caching improvements
543
+ if (!optimizations.hasCaching) {
544
+ improvements.push({
545
+ type: 'optimize',
546
+ description: 'Implement caching strategy for static assets',
547
+ effort: 'moderate',
548
+ impact: 'medium',
549
+ steps: [
550
+ 'Set appropriate Cache-Control headers',
551
+ 'Consider using a CDN for static assets',
552
+ 'Implement service worker caching',
553
+ ],
554
+ });
555
+ }
556
+ return improvements;
557
+ }
558
+ /**
559
+ * Calculate final performance score
560
+ */
561
+ calculatePerformanceScore(lighthouseReport, bundleMetrics, optimizations) {
562
+ let score = 50; // Base score
563
+ // Lighthouse performance score (40 points max)
564
+ if (lighthouseReport?.categories?.performance?.score !== undefined) {
565
+ score += lighthouseReport.categories.performance.score * 40;
566
+ }
567
+ else {
568
+ score += 20; // Neutral if no report
569
+ }
570
+ // Bundle size score (20 points max)
571
+ if (bundleMetrics) {
572
+ const sizeScore = Math.max(0, 1 - bundleMetrics.rawSize / (this.maxBundleSize * 2));
573
+ score += sizeScore * 20;
574
+ }
575
+ // Optimizations bonus (10 points)
576
+ const optCount = [
577
+ optimizations.hasCodeSplitting,
578
+ optimizations.hasTreeShaking,
579
+ optimizations.hasCompression,
580
+ optimizations.hasLazyLoading,
581
+ optimizations.hasImageOptimization,
582
+ optimizations.hasCaching,
583
+ ].filter(Boolean).length;
584
+ score += (optCount / 6) * 10;
585
+ return Math.min(100, Math.max(0, score));
586
+ }
587
+ /**
588
+ * Count checked items for metadata
589
+ */
590
+ countCheckedItems(bundleMetrics, optimizations) {
591
+ let count = 0;
592
+ if (bundleMetrics)
593
+ count++;
594
+ count += 6; // optimization checks
595
+ return count;
596
+ }
597
+ /**
598
+ * Count passed items for metadata
599
+ */
600
+ countPassedItems(lighthouseReport, bundleMetrics) {
601
+ let count = 0;
602
+ if (lighthouseReport?.categories?.performance?.score ?? 0 >= 0.8) {
603
+ count++;
604
+ }
605
+ if (bundleMetrics && bundleMetrics.rawSize <= this.maxBundleSize) {
606
+ count++;
607
+ }
608
+ return count;
609
+ }
610
+ }
611
+ /**
612
+ * Default analyzer instance
613
+ */
614
+ export const performanceAnalyzer = new PerformanceAnalyzer();
615
+ //# sourceMappingURL=performance.analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.analyzer.js","sourceRoot":"","sources":["../../../../src/services/scoring/dimensions/performance.analyzer.ts"],"names":[],"mappings":"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"}