import { TestResult, PerformanceMetrics, ComparisonResult, PerformanceBaseline as PerformanceBaselineType } from '../../types/reporting'; export class PerformanceBaseline { private baseline: Map = new Map(); calculate(results: TestResult[]): PerformanceBaselineType { results.forEach(result => { if (result.type === 'performance' && result.metrics) { this.updateBaseline(result); } }); const firstBaseline = this.baseline.values().next().value; return { timestamp: Date.now(), metrics: firstBaseline || { loadTime: 0, domContentLoaded: 0, firstContentfulPaint: 0, largestContentfulPaint: 0, cumulativeLayoutShift: 0, firstInputDelay: 0 }, url: '' }; } private updateBaseline(result: TestResult): void { const key = result.name; const current = this.baseline.get(key); const metrics = result.metrics as PerformanceMetrics; if (!current || metrics.loadTime < current.loadTime) { this.baseline.set(key, metrics); } } compareWithBaseline(metrics: PerformanceMetrics, testName: string): ComparisonResult { const baseline = this.baseline.get(testName); if (!baseline) { return { status: 'no-baseline', difference: 0 }; } const difference = metrics.loadTime - baseline.loadTime; const status = difference > 500 ? 'regression' : difference < -500 ? 'improvement' : 'stable'; return { status, difference }; } getBaseline(testName: string): PerformanceMetrics | undefined { return this.baseline.get(testName); } getAllBaselines(): Map { return this.baseline; } }