cbrowser 7.3.0 → 7.4.1
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/dist/analysis/bug-hunter.d.ts +32 -0
- package/dist/analysis/bug-hunter.d.ts.map +1 -0
- package/dist/analysis/bug-hunter.js +106 -0
- package/dist/analysis/bug-hunter.js.map +1 -0
- package/dist/analysis/chaos-testing.d.ts +41 -0
- package/dist/analysis/chaos-testing.d.ts.map +1 -0
- package/dist/analysis/chaos-testing.js +87 -0
- package/dist/analysis/chaos-testing.js.map +1 -0
- package/dist/analysis/index.d.ts +10 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +26 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/natural-language.d.ts +43 -0
- package/dist/analysis/natural-language.d.ts.map +1 -0
- package/dist/analysis/natural-language.js +205 -0
- package/dist/analysis/natural-language.js.map +1 -0
- package/dist/analysis/persona-comparison.d.ts +31 -0
- package/dist/analysis/persona-comparison.d.ts.map +1 -0
- package/dist/analysis/persona-comparison.js +217 -0
- package/dist/analysis/persona-comparison.js.map +1 -0
- package/dist/browser.d.ts +1 -411
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +0 -4745
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +64 -56
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +2 -1
- package/dist/daemon.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +406 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/performance/index.d.ts +7 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +23 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/metrics.d.ts +49 -0
- package/dist/performance/metrics.d.ts.map +1 -0
- package/dist/performance/metrics.js +386 -0
- package/dist/performance/metrics.js.map +1 -0
- package/dist/testing/coverage.d.ts +39 -0
- package/dist/testing/coverage.d.ts.map +1 -0
- package/dist/testing/coverage.js +713 -0
- package/dist/testing/coverage.js.map +1 -0
- package/dist/testing/flaky-detection.d.ts +28 -0
- package/dist/testing/flaky-detection.d.ts.map +1 -0
- package/dist/testing/flaky-detection.js +332 -0
- package/dist/testing/flaky-detection.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +26 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/nl-test-suite.d.ts +70 -0
- package/dist/testing/nl-test-suite.d.ts.map +1 -0
- package/dist/testing/nl-test-suite.js +427 -0
- package/dist/testing/nl-test-suite.js.map +1 -0
- package/dist/testing/test-repair.d.ts +36 -0
- package/dist/testing/test-repair.d.ts.map +1 -0
- package/dist/testing/test-repair.js +528 -0
- package/dist/testing/test-repair.js.map +1 -0
- package/dist/visual/ab-comparison.d.ts +23 -0
- package/dist/visual/ab-comparison.d.ts.map +1 -0
- package/dist/visual/ab-comparison.js +366 -0
- package/dist/visual/ab-comparison.js.map +1 -0
- package/dist/visual/cross-browser.d.ts +41 -0
- package/dist/visual/cross-browser.d.ts.map +1 -0
- package/dist/visual/cross-browser.js +442 -0
- package/dist/visual/cross-browser.js.map +1 -0
- package/dist/visual/index.d.ts +10 -0
- package/dist/visual/index.d.ts.map +1 -0
- package/dist/visual/index.js +26 -0
- package/dist/visual/index.js.map +1 -0
- package/dist/visual/regression.d.ts +55 -0
- package/dist/visual/regression.d.ts.map +1 -0
- package/dist/visual/regression.js +616 -0
- package/dist/visual/regression.js.map +1 -0
- package/dist/visual/responsive.d.ts +27 -0
- package/dist/visual/responsive.d.ts.map +1 -0
- package/dist/visual/responsive.js +450 -0
- package/dist/visual/responsive.js.map +1 -0
- package/package.json +32 -3
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Regression Detection (v6.4.0)
|
|
3
|
+
*
|
|
4
|
+
* Performance baseline management and regression detection for CBrowser.
|
|
5
|
+
*/
|
|
6
|
+
import type { PerformanceBaseline, PerformanceRegressionThresholds, PerformanceRegressionResult } from "../types.js";
|
|
7
|
+
export interface PerformanceBaselineOptions {
|
|
8
|
+
/** Number of runs to average (default: 3) */
|
|
9
|
+
runs?: number;
|
|
10
|
+
/** Human-readable name for baseline */
|
|
11
|
+
name?: string;
|
|
12
|
+
/** Headless mode */
|
|
13
|
+
headless?: boolean;
|
|
14
|
+
/** Device to emulate */
|
|
15
|
+
device?: string;
|
|
16
|
+
/** Network throttling */
|
|
17
|
+
throttle?: "3g" | "4g" | "wifi";
|
|
18
|
+
}
|
|
19
|
+
export interface PerformanceRegressionOptions {
|
|
20
|
+
/** Regression thresholds */
|
|
21
|
+
thresholds?: PerformanceRegressionThresholds;
|
|
22
|
+
/** Headless mode */
|
|
23
|
+
headless?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Capture a performance baseline for a URL
|
|
27
|
+
*/
|
|
28
|
+
export declare function capturePerformanceBaseline(url: string, options?: PerformanceBaselineOptions): Promise<PerformanceBaseline>;
|
|
29
|
+
/**
|
|
30
|
+
* List all saved performance baselines
|
|
31
|
+
*/
|
|
32
|
+
export declare function listPerformanceBaselines(): PerformanceBaseline[];
|
|
33
|
+
/**
|
|
34
|
+
* Load a specific baseline by ID or name
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadPerformanceBaseline(idOrName: string): PerformanceBaseline | null;
|
|
37
|
+
/**
|
|
38
|
+
* Delete a performance baseline
|
|
39
|
+
*/
|
|
40
|
+
export declare function deletePerformanceBaseline(idOrName: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Compare current performance against a baseline
|
|
43
|
+
*/
|
|
44
|
+
export declare function detectPerformanceRegression(url: string, baselineIdOrName: string, options?: PerformanceRegressionOptions): Promise<PerformanceRegressionResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Format a performance regression report
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatPerformanceRegressionReport(result: PerformanceRegressionResult): string;
|
|
49
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/performance/metrics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,mBAAmB,EACnB,+BAA+B,EAG/B,2BAA2B,EAE5B,MAAM,aAAa,CAAC;AAqBrB,MAAM,WAAW,0BAA0B;IACzC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,4BAA4B;IAC3C,4BAA4B;IAC5B,UAAU,CAAC,EAAE,+BAA+B,CAAC;IAC7C,oBAAoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,mBAAmB,CAAC,CAyE9B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,mBAAmB,EAAE,CAqBhE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAcpF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAYnE;AAMD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,2BAA2B,CAAC,CAqHtC;AAMD;;GAEG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM,CAyH7F"}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Performance Regression Detection (v6.4.0)
|
|
4
|
+
*
|
|
5
|
+
* Performance baseline management and regression detection for CBrowser.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.capturePerformanceBaseline = capturePerformanceBaseline;
|
|
9
|
+
exports.listPerformanceBaselines = listPerformanceBaselines;
|
|
10
|
+
exports.loadPerformanceBaseline = loadPerformanceBaseline;
|
|
11
|
+
exports.deletePerformanceBaseline = deletePerformanceBaseline;
|
|
12
|
+
exports.detectPerformanceRegression = detectPerformanceRegression;
|
|
13
|
+
exports.formatPerformanceRegressionReport = formatPerformanceRegressionReport;
|
|
14
|
+
const fs_1 = require("fs");
|
|
15
|
+
const path_1 = require("path");
|
|
16
|
+
const browser_js_1 = require("../browser.js");
|
|
17
|
+
const config_js_1 = require("../config.js");
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Constants
|
|
20
|
+
// ============================================================================
|
|
21
|
+
const DEFAULT_REGRESSION_THRESHOLDS = {
|
|
22
|
+
lcp: 20, // 20% increase
|
|
23
|
+
fid: 50, // 50% increase
|
|
24
|
+
cls: 0.1, // Absolute increase of 0.1
|
|
25
|
+
fcp: 20, // 20% increase
|
|
26
|
+
ttfb: 30, // 30% increase
|
|
27
|
+
tti: 25, // 25% increase
|
|
28
|
+
tbt: 50, // 50% increase
|
|
29
|
+
transferSize: 25, // 25% increase
|
|
30
|
+
};
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Baseline Management Functions
|
|
33
|
+
// ============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Capture a performance baseline for a URL
|
|
36
|
+
*/
|
|
37
|
+
async function capturePerformanceBaseline(url, options = {}) {
|
|
38
|
+
const { runs = 3, name, headless = true, device, throttle } = options;
|
|
39
|
+
const paths = (0, config_js_1.getPaths)();
|
|
40
|
+
(0, config_js_1.ensureDirectories)();
|
|
41
|
+
const browser = new browser_js_1.CBrowser({ headless });
|
|
42
|
+
const allMetrics = [];
|
|
43
|
+
try {
|
|
44
|
+
for (let i = 0; i < runs; i++) {
|
|
45
|
+
await browser.navigate(url);
|
|
46
|
+
// Wait for page to stabilize
|
|
47
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
48
|
+
const metrics = await browser.getPerformanceMetrics();
|
|
49
|
+
allMetrics.push(metrics);
|
|
50
|
+
// Brief pause between runs
|
|
51
|
+
if (i < runs - 1) {
|
|
52
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
await browser.close();
|
|
58
|
+
}
|
|
59
|
+
// Average the metrics
|
|
60
|
+
const avgMetrics = {};
|
|
61
|
+
const numericMetricKeys = [
|
|
62
|
+
"lcp", "fid", "cls", "fcp", "ttfb", "tti", "tbt",
|
|
63
|
+
"domContentLoaded", "load", "resourceCount", "transferSize"
|
|
64
|
+
];
|
|
65
|
+
for (const key of numericMetricKeys) {
|
|
66
|
+
const values = allMetrics
|
|
67
|
+
.map((m) => m[key])
|
|
68
|
+
.filter((v) => v !== undefined && v !== null);
|
|
69
|
+
if (values.length > 0) {
|
|
70
|
+
avgMetrics[key] = values.reduce((a, b) => a + b, 0) / values.length;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Determine ratings
|
|
74
|
+
if (avgMetrics.lcp !== undefined) {
|
|
75
|
+
avgMetrics.lcpRating = avgMetrics.lcp <= 2500 ? "good" : avgMetrics.lcp <= 4000 ? "needs-improvement" : "poor";
|
|
76
|
+
}
|
|
77
|
+
if (avgMetrics.cls !== undefined) {
|
|
78
|
+
avgMetrics.clsRating = avgMetrics.cls <= 0.1 ? "good" : avgMetrics.cls <= 0.25 ? "needs-improvement" : "poor";
|
|
79
|
+
}
|
|
80
|
+
const baseline = {
|
|
81
|
+
id: `baseline-${Date.now()}`,
|
|
82
|
+
url,
|
|
83
|
+
name: name || new URL(url).hostname,
|
|
84
|
+
timestamp: new Date().toISOString(),
|
|
85
|
+
metrics: avgMetrics,
|
|
86
|
+
runsAveraged: runs,
|
|
87
|
+
environment: {
|
|
88
|
+
browser: "chromium",
|
|
89
|
+
viewport: { width: 1280, height: 720 },
|
|
90
|
+
device,
|
|
91
|
+
connection: throttle,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
// Save baseline
|
|
95
|
+
const baselinesDir = (0, path_1.join)(paths.dataDir, "baselines");
|
|
96
|
+
if (!(0, fs_1.existsSync)(baselinesDir)) {
|
|
97
|
+
(0, fs_1.mkdirSync)(baselinesDir, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
const baselineFile = (0, path_1.join)(baselinesDir, `${baseline.id}.json`);
|
|
100
|
+
(0, fs_1.writeFileSync)(baselineFile, JSON.stringify(baseline, null, 2));
|
|
101
|
+
return baseline;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* List all saved performance baselines
|
|
105
|
+
*/
|
|
106
|
+
function listPerformanceBaselines() {
|
|
107
|
+
const paths = (0, config_js_1.getPaths)();
|
|
108
|
+
const baselinesDir = (0, path_1.join)(paths.dataDir, "baselines");
|
|
109
|
+
if (!(0, fs_1.existsSync)(baselinesDir)) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const files = (0, fs_1.readdirSync)(baselinesDir).filter((f) => f.endsWith(".json"));
|
|
113
|
+
const baselines = [];
|
|
114
|
+
for (const file of files) {
|
|
115
|
+
try {
|
|
116
|
+
const content = (0, fs_1.readFileSync)((0, path_1.join)(baselinesDir, file), "utf-8");
|
|
117
|
+
baselines.push(JSON.parse(content));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Skip invalid files
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return baselines.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Load a specific baseline by ID or name
|
|
127
|
+
*/
|
|
128
|
+
function loadPerformanceBaseline(idOrName) {
|
|
129
|
+
const baselines = listPerformanceBaselines();
|
|
130
|
+
// Try exact ID match first
|
|
131
|
+
let baseline = baselines.find((b) => b.id === idOrName);
|
|
132
|
+
if (baseline)
|
|
133
|
+
return baseline;
|
|
134
|
+
// Try name match
|
|
135
|
+
baseline = baselines.find((b) => b.name === idOrName);
|
|
136
|
+
if (baseline)
|
|
137
|
+
return baseline;
|
|
138
|
+
// Try URL match
|
|
139
|
+
baseline = baselines.find((b) => b.url.includes(idOrName));
|
|
140
|
+
return baseline || null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Delete a performance baseline
|
|
144
|
+
*/
|
|
145
|
+
function deletePerformanceBaseline(idOrName) {
|
|
146
|
+
const baseline = loadPerformanceBaseline(idOrName);
|
|
147
|
+
if (!baseline)
|
|
148
|
+
return false;
|
|
149
|
+
const paths = (0, config_js_1.getPaths)();
|
|
150
|
+
const baselineFile = (0, path_1.join)(paths.dataDir, "baselines", `${baseline.id}.json`);
|
|
151
|
+
if ((0, fs_1.existsSync)(baselineFile)) {
|
|
152
|
+
(0, fs_1.unlinkSync)(baselineFile);
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Regression Detection Functions
|
|
159
|
+
// ============================================================================
|
|
160
|
+
/**
|
|
161
|
+
* Compare current performance against a baseline
|
|
162
|
+
*/
|
|
163
|
+
async function detectPerformanceRegression(url, baselineIdOrName, options = {}) {
|
|
164
|
+
const { thresholds = DEFAULT_REGRESSION_THRESHOLDS, headless = true } = options;
|
|
165
|
+
const startTime = Date.now();
|
|
166
|
+
// Load baseline
|
|
167
|
+
const baseline = loadPerformanceBaseline(baselineIdOrName);
|
|
168
|
+
if (!baseline) {
|
|
169
|
+
throw new Error(`Baseline not found: ${baselineIdOrName}`);
|
|
170
|
+
}
|
|
171
|
+
// Capture current metrics
|
|
172
|
+
const browser = new browser_js_1.CBrowser({ headless });
|
|
173
|
+
let currentMetrics;
|
|
174
|
+
try {
|
|
175
|
+
await browser.navigate(url);
|
|
176
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
177
|
+
currentMetrics = await browser.getPerformanceMetrics();
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
await browser.close();
|
|
181
|
+
}
|
|
182
|
+
// Compare metrics
|
|
183
|
+
const comparisons = [];
|
|
184
|
+
const regressions = [];
|
|
185
|
+
const metricsToCompare = [
|
|
186
|
+
"lcp", "fid", "cls", "fcp", "ttfb", "tti", "tbt", "transferSize"
|
|
187
|
+
];
|
|
188
|
+
for (const metric of metricsToCompare) {
|
|
189
|
+
const baselineValue = baseline.metrics[metric];
|
|
190
|
+
const currentValue = currentMetrics[metric];
|
|
191
|
+
if (baselineValue === undefined || currentValue === undefined)
|
|
192
|
+
continue;
|
|
193
|
+
const change = currentValue - baselineValue;
|
|
194
|
+
const changePercent = baselineValue > 0 ? (change / baselineValue) * 100 : 0;
|
|
195
|
+
// Determine threshold and if it's a regression
|
|
196
|
+
const threshold = thresholds[metric] || 20;
|
|
197
|
+
const isClsMetric = metric === "cls";
|
|
198
|
+
// For CLS, threshold is absolute; for others, it's percentage
|
|
199
|
+
const exceedsThreshold = isClsMetric
|
|
200
|
+
? change > threshold
|
|
201
|
+
: changePercent > threshold;
|
|
202
|
+
let status = "stable";
|
|
203
|
+
let severity = "warning";
|
|
204
|
+
if (changePercent < -10 || (isClsMetric && change < -0.05)) {
|
|
205
|
+
status = "improved";
|
|
206
|
+
}
|
|
207
|
+
else if (exceedsThreshold) {
|
|
208
|
+
if (isClsMetric ? change > threshold * 2 : changePercent > threshold * 2) {
|
|
209
|
+
status = "critical";
|
|
210
|
+
severity = "critical";
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
status = "regression";
|
|
214
|
+
severity = "regression";
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else if (changePercent > 5 || (isClsMetric && change > 0.02)) {
|
|
218
|
+
status = "warning";
|
|
219
|
+
}
|
|
220
|
+
const comparison = {
|
|
221
|
+
metric,
|
|
222
|
+
baseline: baselineValue,
|
|
223
|
+
current: currentValue,
|
|
224
|
+
change,
|
|
225
|
+
changePercent,
|
|
226
|
+
isRegression: status === "regression" || status === "critical",
|
|
227
|
+
isImprovement: status === "improved",
|
|
228
|
+
status,
|
|
229
|
+
};
|
|
230
|
+
comparisons.push(comparison);
|
|
231
|
+
if (comparison.isRegression) {
|
|
232
|
+
regressions.push({
|
|
233
|
+
metric,
|
|
234
|
+
baselineValue,
|
|
235
|
+
currentValue,
|
|
236
|
+
change,
|
|
237
|
+
changePercent,
|
|
238
|
+
threshold,
|
|
239
|
+
severity,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Calculate summary
|
|
244
|
+
const improved = comparisons.filter((c) => c.isImprovement).length;
|
|
245
|
+
const regressed = comparisons.filter((c) => c.status === "regression").length;
|
|
246
|
+
const critical = comparisons.filter((c) => c.status === "critical").length;
|
|
247
|
+
const stable = comparisons.filter((c) => c.status === "stable" || c.status === "warning").length;
|
|
248
|
+
const overallChange = comparisons.length > 0
|
|
249
|
+
? comparisons.reduce((sum, c) => sum + c.changePercent, 0) / comparisons.length
|
|
250
|
+
: 0;
|
|
251
|
+
return {
|
|
252
|
+
url,
|
|
253
|
+
baseline,
|
|
254
|
+
currentMetrics,
|
|
255
|
+
timestamp: new Date().toISOString(),
|
|
256
|
+
duration: Date.now() - startTime,
|
|
257
|
+
comparisons,
|
|
258
|
+
regressions,
|
|
259
|
+
passed: regressions.length === 0,
|
|
260
|
+
summary: {
|
|
261
|
+
totalMetrics: comparisons.length,
|
|
262
|
+
improved,
|
|
263
|
+
stable,
|
|
264
|
+
regressed,
|
|
265
|
+
critical,
|
|
266
|
+
overallChange,
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
// ============================================================================
|
|
271
|
+
// Reporting Functions
|
|
272
|
+
// ============================================================================
|
|
273
|
+
/**
|
|
274
|
+
* Format a performance regression report
|
|
275
|
+
*/
|
|
276
|
+
function formatPerformanceRegressionReport(result) {
|
|
277
|
+
const lines = [];
|
|
278
|
+
lines.push("PERFORMANCE REGRESSION REPORT");
|
|
279
|
+
lines.push("=".repeat(60));
|
|
280
|
+
lines.push("");
|
|
281
|
+
lines.push(`URL: ${result.url}`);
|
|
282
|
+
lines.push(`Baseline: ${result.baseline.name} (${new Date(result.baseline.timestamp).toLocaleDateString()})`);
|
|
283
|
+
lines.push(`Duration: ${(result.duration / 1000).toFixed(1)}s`);
|
|
284
|
+
lines.push("");
|
|
285
|
+
// Overall result
|
|
286
|
+
if (result.passed) {
|
|
287
|
+
lines.push("PASSED - No performance regressions detected");
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
lines.push(`FAILED - ${result.regressions.length} regression(s) detected`);
|
|
291
|
+
}
|
|
292
|
+
lines.push("");
|
|
293
|
+
// Detailed comparisons
|
|
294
|
+
lines.push("-".repeat(60));
|
|
295
|
+
lines.push("METRIC COMPARISON");
|
|
296
|
+
lines.push("-".repeat(60));
|
|
297
|
+
lines.push("");
|
|
298
|
+
const metricNames = {
|
|
299
|
+
lcp: "LCP (Largest Contentful Paint)",
|
|
300
|
+
fid: "FID (First Input Delay)",
|
|
301
|
+
cls: "CLS (Cumulative Layout Shift)",
|
|
302
|
+
fcp: "FCP (First Contentful Paint)",
|
|
303
|
+
ttfb: "TTFB (Time to First Byte)",
|
|
304
|
+
tti: "TTI (Time to Interactive)",
|
|
305
|
+
tbt: "TBT (Total Blocking Time)",
|
|
306
|
+
transferSize: "Transfer Size",
|
|
307
|
+
};
|
|
308
|
+
for (const comp of result.comparisons) {
|
|
309
|
+
const name = metricNames[comp.metric] || comp.metric;
|
|
310
|
+
const icon = comp.isImprovement ? "[OK]" :
|
|
311
|
+
comp.status === "critical" ? "[CRIT]" :
|
|
312
|
+
comp.status === "regression" ? "[FAIL]" :
|
|
313
|
+
comp.status === "warning" ? "[WARN]" : "[OK]";
|
|
314
|
+
const unit = comp.metric === "cls" ? "" :
|
|
315
|
+
comp.metric === "transferSize" ? " KB" : " ms";
|
|
316
|
+
const baseVal = comp.metric === "transferSize"
|
|
317
|
+
? (comp.baseline / 1024).toFixed(1)
|
|
318
|
+
: comp.baseline.toFixed(1);
|
|
319
|
+
const currVal = comp.metric === "transferSize"
|
|
320
|
+
? (comp.current / 1024).toFixed(1)
|
|
321
|
+
: comp.current.toFixed(1);
|
|
322
|
+
const changeStr = comp.changePercent >= 0
|
|
323
|
+
? `+${comp.changePercent.toFixed(1)}%`
|
|
324
|
+
: `${comp.changePercent.toFixed(1)}%`;
|
|
325
|
+
lines.push(`${icon} ${name}`);
|
|
326
|
+
lines.push(` Baseline: ${baseVal}${unit} -> Current: ${currVal}${unit} (${changeStr})`);
|
|
327
|
+
lines.push("");
|
|
328
|
+
}
|
|
329
|
+
// Summary
|
|
330
|
+
lines.push("-".repeat(60));
|
|
331
|
+
lines.push("SUMMARY");
|
|
332
|
+
lines.push("-".repeat(60));
|
|
333
|
+
lines.push("");
|
|
334
|
+
lines.push(` Total Metrics: ${result.summary.totalMetrics}`);
|
|
335
|
+
lines.push(` Improved: ${result.summary.improved}`);
|
|
336
|
+
lines.push(` Stable: ${result.summary.stable}`);
|
|
337
|
+
lines.push(` Regressed: ${result.summary.regressed}`);
|
|
338
|
+
lines.push(` Critical: ${result.summary.critical}`);
|
|
339
|
+
lines.push(` Overall Change: ${result.summary.overallChange >= 0 ? "+" : ""}${result.summary.overallChange.toFixed(1)}%`);
|
|
340
|
+
lines.push("");
|
|
341
|
+
// Recommendations if regressions found
|
|
342
|
+
if (result.regressions.length > 0) {
|
|
343
|
+
lines.push("-".repeat(60));
|
|
344
|
+
lines.push("RECOMMENDATIONS");
|
|
345
|
+
lines.push("-".repeat(60));
|
|
346
|
+
lines.push("");
|
|
347
|
+
for (const reg of result.regressions) {
|
|
348
|
+
const name = metricNames[reg.metric] || reg.metric;
|
|
349
|
+
lines.push(`[!] ${name}:`);
|
|
350
|
+
switch (reg.metric) {
|
|
351
|
+
case "lcp":
|
|
352
|
+
lines.push(" - Optimize largest content element (images, videos)");
|
|
353
|
+
lines.push(" - Consider lazy loading below-fold content");
|
|
354
|
+
lines.push(" - Improve server response times");
|
|
355
|
+
break;
|
|
356
|
+
case "cls":
|
|
357
|
+
lines.push(" - Set explicit dimensions on images/embeds");
|
|
358
|
+
lines.push(" - Avoid inserting content above existing content");
|
|
359
|
+
lines.push(" - Reserve space for dynamic content");
|
|
360
|
+
break;
|
|
361
|
+
case "fcp":
|
|
362
|
+
case "ttfb":
|
|
363
|
+
lines.push(" - Optimize server response time");
|
|
364
|
+
lines.push(" - Use CDN for static assets");
|
|
365
|
+
lines.push(" - Enable compression (gzip/brotli)");
|
|
366
|
+
break;
|
|
367
|
+
case "tbt":
|
|
368
|
+
case "tti":
|
|
369
|
+
lines.push(" - Split long JavaScript tasks");
|
|
370
|
+
lines.push(" - Defer non-critical JavaScript");
|
|
371
|
+
lines.push(" - Remove unused code");
|
|
372
|
+
break;
|
|
373
|
+
case "transferSize":
|
|
374
|
+
lines.push(" - Compress and optimize assets");
|
|
375
|
+
lines.push(" - Remove unused CSS/JavaScript");
|
|
376
|
+
lines.push(" - Optimize images (WebP, proper sizing)");
|
|
377
|
+
break;
|
|
378
|
+
default:
|
|
379
|
+
lines.push(" - Review recent changes for performance impact");
|
|
380
|
+
}
|
|
381
|
+
lines.push("");
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return lines.join("\n");
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/performance/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Coverage Map (v6.5.0)
|
|
3
|
+
*
|
|
4
|
+
* Analyze test coverage across your site.
|
|
5
|
+
*/
|
|
6
|
+
import type { TestedPage, SitePage, CoverageGap, TestCoverageAnalysis, CoverageMapResult, CoverageMapOptions } from "../types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse test files to extract tested URLs and actions
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseTestFilesForCoverage(testFiles: string[]): TestedPage[];
|
|
11
|
+
/**
|
|
12
|
+
* Fetch and parse sitemap.xml
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseSitemap(sitemapUrl: string): Promise<SitePage[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Crawl a site to discover pages
|
|
17
|
+
*/
|
|
18
|
+
export declare function crawlSiteForCoverage(startUrl: string, maxPages?: number, includePattern?: string, excludePattern?: string): Promise<SitePage[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Identify coverage gaps
|
|
21
|
+
*/
|
|
22
|
+
export declare function identifyCoverageGaps(sitePages: SitePage[], testedPages: TestedPage[], minCoverage?: number): CoverageGap[];
|
|
23
|
+
/**
|
|
24
|
+
* Calculate overall coverage analysis
|
|
25
|
+
*/
|
|
26
|
+
export declare function calculateCoverageAnalysis(sitePages: SitePage[], testedPages: TestedPage[]): TestCoverageAnalysis;
|
|
27
|
+
/**
|
|
28
|
+
* Generate complete coverage map
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateCoverageMap(baseUrl: string, testFiles: string[], options?: CoverageMapOptions): Promise<CoverageMapResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Format coverage map as text report
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatCoverageReport(result: CoverageMapResult): string;
|
|
35
|
+
/**
|
|
36
|
+
* Generate HTML coverage report
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateCoverageHtmlReport(result: CoverageMapResult): string;
|
|
39
|
+
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/testing/coverage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,UAAU,EAEV,QAAQ,EACR,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAgI3E;AAeD;;GAEG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsB1E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAY,EACtB,cAAc,CAAC,EAAE,MAAM,EACvB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA8ErB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,QAAQ,EAAE,EACrB,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,GAAE,MAAW,GACvB,WAAW,EAAE,CA2Df;AAiFD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,QAAQ,EAAE,EACrB,WAAW,EAAE,UAAU,EAAE,GACxB,oBAAoB,CAsCtB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA4D5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAoGtE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA8J5E"}
|