@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.
- 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/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,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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"}
|