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.
Files changed (85) hide show
  1. package/dist/analysis/bug-hunter.d.ts +32 -0
  2. package/dist/analysis/bug-hunter.d.ts.map +1 -0
  3. package/dist/analysis/bug-hunter.js +106 -0
  4. package/dist/analysis/bug-hunter.js.map +1 -0
  5. package/dist/analysis/chaos-testing.d.ts +41 -0
  6. package/dist/analysis/chaos-testing.d.ts.map +1 -0
  7. package/dist/analysis/chaos-testing.js +87 -0
  8. package/dist/analysis/chaos-testing.js.map +1 -0
  9. package/dist/analysis/index.d.ts +10 -0
  10. package/dist/analysis/index.d.ts.map +1 -0
  11. package/dist/analysis/index.js +26 -0
  12. package/dist/analysis/index.js.map +1 -0
  13. package/dist/analysis/natural-language.d.ts +43 -0
  14. package/dist/analysis/natural-language.d.ts.map +1 -0
  15. package/dist/analysis/natural-language.js +205 -0
  16. package/dist/analysis/natural-language.js.map +1 -0
  17. package/dist/analysis/persona-comparison.d.ts +31 -0
  18. package/dist/analysis/persona-comparison.d.ts.map +1 -0
  19. package/dist/analysis/persona-comparison.js +217 -0
  20. package/dist/analysis/persona-comparison.js.map +1 -0
  21. package/dist/browser.d.ts +1 -411
  22. package/dist/browser.d.ts.map +1 -1
  23. package/dist/browser.js +0 -4745
  24. package/dist/browser.js.map +1 -1
  25. package/dist/cli.js +64 -56
  26. package/dist/cli.js.map +1 -1
  27. package/dist/daemon.d.ts.map +1 -1
  28. package/dist/daemon.js +2 -1
  29. package/dist/daemon.js.map +1 -1
  30. package/dist/index.d.ts +4 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +9 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/mcp-server.d.ts.map +1 -1
  35. package/dist/mcp-server.js +406 -1
  36. package/dist/mcp-server.js.map +1 -1
  37. package/dist/performance/index.d.ts +7 -0
  38. package/dist/performance/index.d.ts.map +1 -0
  39. package/dist/performance/index.js +23 -0
  40. package/dist/performance/index.js.map +1 -0
  41. package/dist/performance/metrics.d.ts +49 -0
  42. package/dist/performance/metrics.d.ts.map +1 -0
  43. package/dist/performance/metrics.js +386 -0
  44. package/dist/performance/metrics.js.map +1 -0
  45. package/dist/testing/coverage.d.ts +39 -0
  46. package/dist/testing/coverage.d.ts.map +1 -0
  47. package/dist/testing/coverage.js +713 -0
  48. package/dist/testing/coverage.js.map +1 -0
  49. package/dist/testing/flaky-detection.d.ts +28 -0
  50. package/dist/testing/flaky-detection.d.ts.map +1 -0
  51. package/dist/testing/flaky-detection.js +332 -0
  52. package/dist/testing/flaky-detection.js.map +1 -0
  53. package/dist/testing/index.d.ts +10 -0
  54. package/dist/testing/index.d.ts.map +1 -0
  55. package/dist/testing/index.js +26 -0
  56. package/dist/testing/index.js.map +1 -0
  57. package/dist/testing/nl-test-suite.d.ts +70 -0
  58. package/dist/testing/nl-test-suite.d.ts.map +1 -0
  59. package/dist/testing/nl-test-suite.js +427 -0
  60. package/dist/testing/nl-test-suite.js.map +1 -0
  61. package/dist/testing/test-repair.d.ts +36 -0
  62. package/dist/testing/test-repair.d.ts.map +1 -0
  63. package/dist/testing/test-repair.js +528 -0
  64. package/dist/testing/test-repair.js.map +1 -0
  65. package/dist/visual/ab-comparison.d.ts +23 -0
  66. package/dist/visual/ab-comparison.d.ts.map +1 -0
  67. package/dist/visual/ab-comparison.js +366 -0
  68. package/dist/visual/ab-comparison.js.map +1 -0
  69. package/dist/visual/cross-browser.d.ts +41 -0
  70. package/dist/visual/cross-browser.d.ts.map +1 -0
  71. package/dist/visual/cross-browser.js +442 -0
  72. package/dist/visual/cross-browser.js.map +1 -0
  73. package/dist/visual/index.d.ts +10 -0
  74. package/dist/visual/index.d.ts.map +1 -0
  75. package/dist/visual/index.js +26 -0
  76. package/dist/visual/index.js.map +1 -0
  77. package/dist/visual/regression.d.ts +55 -0
  78. package/dist/visual/regression.d.ts.map +1 -0
  79. package/dist/visual/regression.js +616 -0
  80. package/dist/visual/regression.js.map +1 -0
  81. package/dist/visual/responsive.d.ts +27 -0
  82. package/dist/visual/responsive.d.ts.map +1 -0
  83. package/dist/visual/responsive.js +450 -0
  84. package/dist/visual/responsive.js.map +1 -0
  85. package/package.json +32 -3
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Responsive Visual Testing (v7.2.0)
3
+ *
4
+ * Test how pages render across different viewport sizes.
5
+ */
6
+ import type { ViewportPreset, ResponsiveTestResult, ResponsiveTestOptions, ResponsiveSuite, ResponsiveSuiteResult } from "../types.js";
7
+ /**
8
+ * Run responsive visual test for a single URL
9
+ */
10
+ export declare function runResponsiveTest(url: string, options?: ResponsiveTestOptions): Promise<ResponsiveTestResult>;
11
+ /**
12
+ * Run responsive test suite for multiple URLs
13
+ */
14
+ export declare function runResponsiveSuite(suite: ResponsiveSuite): Promise<ResponsiveSuiteResult>;
15
+ /**
16
+ * Format responsive test result as console report
17
+ */
18
+ export declare function formatResponsiveReport(result: ResponsiveTestResult): string;
19
+ /**
20
+ * Generate HTML report for responsive test suite
21
+ */
22
+ export declare function generateResponsiveHtmlReport(suiteResult: ResponsiveSuiteResult): string;
23
+ /**
24
+ * List available viewport presets
25
+ */
26
+ export declare function listViewportPresets(): ViewportPreset[];
27
+ //# sourceMappingURL=responsive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive.d.ts","sourceRoot":"","sources":["../../src/visual/responsive.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,cAAc,EAId,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAqJrB;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA0G/B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAwC/F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA+D3E;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,qBAAqB,GAAG,MAAM,CA6GvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAEtD"}
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ /**
3
+ * Responsive Visual Testing (v7.2.0)
4
+ *
5
+ * Test how pages render across different viewport sizes.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.runResponsiveTest = runResponsiveTest;
9
+ exports.runResponsiveSuite = runResponsiveSuite;
10
+ exports.formatResponsiveReport = formatResponsiveReport;
11
+ exports.generateResponsiveHtmlReport = generateResponsiveHtmlReport;
12
+ exports.listViewportPresets = listViewportPresets;
13
+ const fs_1 = require("fs");
14
+ const path_1 = require("path");
15
+ const browser_js_1 = require("../browser.js");
16
+ const types_js_1 = require("../types.js");
17
+ const regression_js_1 = require("./regression.js");
18
+ /**
19
+ * Get viewport presets by name or return custom preset
20
+ */
21
+ function resolveViewports(viewports) {
22
+ if (!viewports || viewports.length === 0) {
23
+ // Default: mobile, tablet, desktop
24
+ return types_js_1.VIEWPORT_PRESETS.filter(v => v.name === "mobile" || v.name === "tablet" || v.name === "desktop");
25
+ }
26
+ return viewports.map(v => {
27
+ if (typeof v === "string") {
28
+ const preset = types_js_1.VIEWPORT_PRESETS.find(p => p.name === v);
29
+ if (!preset) {
30
+ throw new Error(`Unknown viewport preset: ${v}. Available: ${types_js_1.VIEWPORT_PRESETS.map(p => p.name).join(", ")}`);
31
+ }
32
+ return preset;
33
+ }
34
+ return v;
35
+ });
36
+ }
37
+ /**
38
+ * Get the path for responsive testing screenshots
39
+ */
40
+ function getResponsiveScreenshotsPath() {
41
+ const basePath = process.cwd();
42
+ const screenshotsPath = (0, path_1.join)(basePath, ".cbrowser", "responsive");
43
+ if (!(0, fs_1.existsSync)(screenshotsPath)) {
44
+ (0, fs_1.mkdirSync)(screenshotsPath, { recursive: true });
45
+ }
46
+ return screenshotsPath;
47
+ }
48
+ /**
49
+ * Capture screenshot at a specific viewport
50
+ */
51
+ async function captureAtViewport(url, viewport, options = {}) {
52
+ const startTime = Date.now();
53
+ const browser = new browser_js_1.CBrowser({
54
+ viewportWidth: viewport.width,
55
+ viewportHeight: viewport.height,
56
+ });
57
+ try {
58
+ await browser.launch();
59
+ const page = await browser.getPage();
60
+ // Set mobile emulation if needed
61
+ if (viewport.isMobile || viewport.hasTouch) {
62
+ await page.emulateMedia({ reducedMotion: "reduce" });
63
+ }
64
+ await browser.navigate(url);
65
+ // Wait if specified
66
+ if (options.waitForSelector) {
67
+ await page.waitForSelector(options.waitForSelector, { timeout: 10000 }).catch(() => { });
68
+ }
69
+ if (options.waitBeforeCapture) {
70
+ await new Promise(resolve => setTimeout(resolve, options.waitBeforeCapture));
71
+ }
72
+ // Take screenshot
73
+ const screenshotsPath = getResponsiveScreenshotsPath();
74
+ const filename = `${viewport.name}-${Date.now()}.png`;
75
+ const screenshotPath = (0, path_1.join)(screenshotsPath, filename);
76
+ await page.screenshot({ path: screenshotPath, fullPage: false });
77
+ return {
78
+ viewport,
79
+ screenshotPath,
80
+ timestamp: new Date().toISOString(),
81
+ captureTime: Date.now() - startTime,
82
+ };
83
+ }
84
+ finally {
85
+ await browser.close();
86
+ }
87
+ }
88
+ /**
89
+ * Analyze responsive issues from comparisons
90
+ */
91
+ function analyzeResponsiveIssues(comparisons, screenshots) {
92
+ const issues = [];
93
+ for (const comparison of comparisons) {
94
+ if (comparison.analysis.overallStatus !== "pass") {
95
+ const changes = comparison.analysis.changes || [];
96
+ for (const change of changes) {
97
+ let issueType = "other";
98
+ const desc = change.description.toLowerCase();
99
+ if (desc.includes("overflow") || desc.includes("scroll")) {
100
+ issueType = "overflow";
101
+ }
102
+ else if (desc.includes("truncat") || desc.includes("cut off")) {
103
+ issueType = "truncation";
104
+ }
105
+ else if (desc.includes("overlap")) {
106
+ issueType = "overlap";
107
+ }
108
+ else if (desc.includes("hidden") || desc.includes("disappear")) {
109
+ issueType = "hidden_content";
110
+ }
111
+ else if (desc.includes("text") && (desc.includes("small") || desc.includes("read"))) {
112
+ issueType = "unreadable_text";
113
+ }
114
+ else if (desc.includes("layout") || desc.includes("break") || desc.includes("shift")) {
115
+ issueType = "layout_break";
116
+ }
117
+ // Map VisualChange severity to ResponsiveIssue severity
118
+ const severityMap = {
119
+ breaking: "critical",
120
+ warning: "major",
121
+ info: "minor",
122
+ acceptable: "minor",
123
+ };
124
+ issues.push({
125
+ type: issueType,
126
+ severity: severityMap[change.severity] || "minor",
127
+ description: change.description,
128
+ affectedViewports: [comparison.viewportA.name, comparison.viewportB.name],
129
+ breakpointRange: {
130
+ min: Math.min(comparison.viewportA.width, comparison.viewportB.width),
131
+ max: Math.max(comparison.viewportA.width, comparison.viewportB.width),
132
+ },
133
+ });
134
+ }
135
+ }
136
+ }
137
+ return issues;
138
+ }
139
+ /**
140
+ * Run responsive visual test for a single URL
141
+ */
142
+ async function runResponsiveTest(url, options = {}) {
143
+ const startTime = Date.now();
144
+ const viewports = resolveViewports(options.viewports);
145
+ console.log(`\n📱 Responsive Visual Test`);
146
+ console.log(` URL: ${url}`);
147
+ console.log(` Viewports: ${viewports.map(v => v.name).join(", ")}\n`);
148
+ // Capture screenshots at each viewport
149
+ const screenshots = [];
150
+ for (const viewport of viewports) {
151
+ console.log(` 📸 Capturing ${viewport.name} (${viewport.width}x${viewport.height})...`);
152
+ try {
153
+ const screenshot = await captureAtViewport(url, viewport, options);
154
+ screenshots.push(screenshot);
155
+ console.log(` ✅ Captured in ${screenshot.captureTime}ms`);
156
+ }
157
+ catch (error) {
158
+ console.log(` ❌ Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
159
+ }
160
+ }
161
+ if (screenshots.length < 2) {
162
+ return {
163
+ url,
164
+ screenshots,
165
+ comparisons: [],
166
+ issues: [],
167
+ overallStatus: "major_issues",
168
+ summary: "Could not capture enough screenshots for comparison",
169
+ problematicViewports: [],
170
+ duration: Date.now() - startTime,
171
+ timestamp: new Date().toISOString(),
172
+ };
173
+ }
174
+ // Compare adjacent viewport sizes (small to large)
175
+ const sortedScreenshots = [...screenshots].sort((a, b) => a.viewport.width - b.viewport.width);
176
+ const comparisons = [];
177
+ let hasMinorIssues = false;
178
+ let hasMajorIssues = false;
179
+ const problematicViewports = new Set();
180
+ console.log(`\n 🔍 Comparing viewports...`);
181
+ for (let i = 0; i < sortedScreenshots.length - 1; i++) {
182
+ const a = sortedScreenshots[i];
183
+ const b = sortedScreenshots[i + 1];
184
+ console.log(` ${a.viewport.name} → ${b.viewport.name}...`);
185
+ const analysis = await (0, regression_js_1.analyzeVisualDifferences)(a.screenshotPath, b.screenshotPath, { sensitivity: options.sensitivity || "medium" });
186
+ comparisons.push({
187
+ viewportA: a.viewport,
188
+ viewportB: b.viewport,
189
+ analysis,
190
+ screenshots: {
191
+ a: a.screenshotPath,
192
+ b: b.screenshotPath,
193
+ },
194
+ });
195
+ if (analysis.overallStatus === "fail") {
196
+ hasMajorIssues = true;
197
+ problematicViewports.add(a.viewport.name);
198
+ problematicViewports.add(b.viewport.name);
199
+ console.log(` ❌ Major issues (${(analysis.similarityScore * 100).toFixed(1)}%)`);
200
+ }
201
+ else if (analysis.overallStatus === "warning") {
202
+ hasMinorIssues = true;
203
+ console.log(` ⚠️ Minor issues (${(analysis.similarityScore * 100).toFixed(1)}%)`);
204
+ }
205
+ else {
206
+ console.log(` ✅ Responsive (${(analysis.similarityScore * 100).toFixed(1)}%)`);
207
+ }
208
+ }
209
+ // Analyze issues
210
+ const issues = analyzeResponsiveIssues(comparisons, screenshots);
211
+ const overallStatus = hasMajorIssues
212
+ ? "major_issues"
213
+ : hasMinorIssues
214
+ ? "minor_issues"
215
+ : "responsive";
216
+ const summary = overallStatus === "responsive"
217
+ ? "Page is fully responsive across all tested viewports"
218
+ : overallStatus === "minor_issues"
219
+ ? "Minor responsive issues detected"
220
+ : "Significant responsive issues detected";
221
+ return {
222
+ url,
223
+ screenshots,
224
+ comparisons,
225
+ issues,
226
+ overallStatus,
227
+ summary,
228
+ problematicViewports: Array.from(problematicViewports),
229
+ duration: Date.now() - startTime,
230
+ timestamp: new Date().toISOString(),
231
+ };
232
+ }
233
+ /**
234
+ * Run responsive test suite for multiple URLs
235
+ */
236
+ async function runResponsiveSuite(suite) {
237
+ const startTime = Date.now();
238
+ const results = [];
239
+ console.log(`\n📱 Responsive Test Suite: ${suite.name}`);
240
+ console.log(` Testing ${suite.urls.length} URLs\n`);
241
+ for (const url of suite.urls) {
242
+ const result = await runResponsiveTest(url, suite.options);
243
+ results.push(result);
244
+ }
245
+ // Aggregate common issues
246
+ const issueMap = new Map();
247
+ for (const result of results) {
248
+ for (const issue of result.issues) {
249
+ const key = `${issue.type}-${issue.description}`;
250
+ if (issueMap.has(key)) {
251
+ const existing = issueMap.get(key);
252
+ existing.affectedViewports = [...new Set([...existing.affectedViewports, ...issue.affectedViewports])];
253
+ }
254
+ else {
255
+ issueMap.set(key, { ...issue });
256
+ }
257
+ }
258
+ }
259
+ return {
260
+ suite,
261
+ results,
262
+ summary: {
263
+ total: results.length,
264
+ responsive: results.filter(r => r.overallStatus === "responsive").length,
265
+ minorIssues: results.filter(r => r.overallStatus === "minor_issues").length,
266
+ majorIssues: results.filter(r => r.overallStatus === "major_issues").length,
267
+ totalIssues: results.reduce((sum, r) => sum + r.issues.length, 0),
268
+ },
269
+ commonIssues: Array.from(issueMap.values()),
270
+ duration: Date.now() - startTime,
271
+ timestamp: new Date().toISOString(),
272
+ };
273
+ }
274
+ /**
275
+ * Format responsive test result as console report
276
+ */
277
+ function formatResponsiveReport(result) {
278
+ const lines = [];
279
+ const duration = (result.duration / 1000).toFixed(2);
280
+ lines.push(`╔${"═".repeat(78)}╗`);
281
+ lines.push(`║${" ".repeat(20)}RESPONSIVE VISUAL TEST REPORT${" ".repeat(29)}║`);
282
+ lines.push(`╚${"═".repeat(78)}╝`);
283
+ lines.push("");
284
+ const statusIcon = result.overallStatus === "responsive" ? "✅" : result.overallStatus === "minor_issues" ? "⚠️" : "❌";
285
+ const statusText = result.overallStatus.toUpperCase().replace("_", " ");
286
+ lines.push(`${statusIcon} Status: ${statusText}`);
287
+ lines.push(`🔗 URL: ${result.url}`);
288
+ lines.push(`⏱️ Duration: ${duration}s`);
289
+ lines.push("");
290
+ lines.push("─".repeat(79));
291
+ lines.push("📸 VIEWPORT SCREENSHOTS");
292
+ lines.push("─".repeat(79));
293
+ for (const screenshot of result.screenshots) {
294
+ const v = screenshot.viewport;
295
+ lines.push(` ${v.name.toUpperCase()} (${v.deviceType})`);
296
+ lines.push(` Dimensions: ${v.width}x${v.height}`);
297
+ if (v.deviceName)
298
+ lines.push(` Device: ${v.deviceName}`);
299
+ lines.push(` Capture time: ${screenshot.captureTime}ms`);
300
+ lines.push(` Path: ${screenshot.screenshotPath}`);
301
+ lines.push("");
302
+ }
303
+ lines.push("─".repeat(79));
304
+ lines.push("🔍 VIEWPORT COMPARISONS");
305
+ lines.push("─".repeat(79));
306
+ for (const comparison of result.comparisons) {
307
+ const icon = comparison.analysis.overallStatus === "pass" ? "✅" : comparison.analysis.overallStatus === "warning" ? "⚠️" : "❌";
308
+ lines.push(` ${comparison.viewportA.name} → ${comparison.viewportB.name}: ${icon}`);
309
+ lines.push(` Similarity: ${(comparison.analysis.similarityScore * 100).toFixed(1)}%`);
310
+ lines.push(` ${comparison.analysis.summary}`);
311
+ lines.push("");
312
+ }
313
+ if (result.issues.length > 0) {
314
+ lines.push("─".repeat(79));
315
+ lines.push("⚠️ RESPONSIVE ISSUES DETECTED");
316
+ lines.push("─".repeat(79));
317
+ for (const issue of result.issues) {
318
+ const severityIcon = issue.severity === "critical" ? "🔴" : issue.severity === "major" ? "🟠" : "🟡";
319
+ lines.push(` ${severityIcon} [${issue.type.toUpperCase()}] ${issue.description}`);
320
+ lines.push(` Affected: ${issue.affectedViewports.join(", ")}`);
321
+ if (issue.breakpointRange) {
322
+ lines.push(` Breakpoint range: ${issue.breakpointRange.min}px - ${issue.breakpointRange.max}px`);
323
+ }
324
+ lines.push("");
325
+ }
326
+ }
327
+ lines.push("─".repeat(79));
328
+ lines.push(`📝 SUMMARY: ${result.summary}`);
329
+ lines.push("─".repeat(79));
330
+ return lines.join("\n");
331
+ }
332
+ /**
333
+ * Generate HTML report for responsive test suite
334
+ */
335
+ function generateResponsiveHtmlReport(suiteResult) {
336
+ const { suite, results, summary, duration } = suiteResult;
337
+ return `<!DOCTYPE html>
338
+ <html>
339
+ <head>
340
+ <title>Responsive Test Report - ${suite.name}</title>
341
+ <style>
342
+ * { margin: 0; padding: 0; box-sizing: border-box; }
343
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0f172a; color: #e2e8f0; line-height: 1.6; }
344
+ .container { max-width: 1200px; margin: 0 auto; padding: 2rem; }
345
+ header { text-align: center; margin-bottom: 2rem; }
346
+ h1 { font-size: 2rem; margin-bottom: 0.5rem; background: linear-gradient(135deg, #8b5cf6, #06b6d4); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
347
+ .subtitle { color: #94a3b8; }
348
+ .summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
349
+ .summary-card { background: #1e293b; border-radius: 0.5rem; padding: 1.5rem; text-align: center; }
350
+ .summary-value { font-size: 2rem; font-weight: bold; }
351
+ .summary-label { color: #94a3b8; font-size: 0.875rem; }
352
+ .responsive { color: #22c55e; }
353
+ .minor { color: #f59e0b; }
354
+ .major { color: #ef4444; }
355
+ .result-card { background: #1e293b; border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 1rem; }
356
+ .result-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; }
357
+ .badge { padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; }
358
+ .badge-responsive { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
359
+ .badge-minor { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }
360
+ .badge-major { background: rgba(239, 68, 68, 0.2); color: #ef4444; }
361
+ .viewport-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.5rem; margin-top: 1rem; }
362
+ .viewport-item { background: #0f172a; padding: 0.75rem; border-radius: 0.375rem; font-size: 0.875rem; }
363
+ .viewport-name { font-weight: 600; color: #8b5cf6; }
364
+ .issue { background: #0f172a; padding: 0.75rem; border-radius: 0.375rem; margin-top: 0.5rem; border-left: 3px solid; }
365
+ .issue-critical { border-color: #ef4444; }
366
+ .issue-major { border-color: #f59e0b; }
367
+ .issue-minor { border-color: #22c55e; }
368
+ footer { text-align: center; color: #64748b; padding: 2rem 0; font-size: 0.875rem; }
369
+ </style>
370
+ </head>
371
+ <body>
372
+ <div class="container">
373
+ <header>
374
+ <h1>📱 Responsive Test Report</h1>
375
+ <p class="subtitle">${suite.name}</p>
376
+ </header>
377
+
378
+ <div class="summary-grid">
379
+ <div class="summary-card">
380
+ <div class="summary-value">${summary.total}</div>
381
+ <div class="summary-label">Total URLs</div>
382
+ </div>
383
+ <div class="summary-card">
384
+ <div class="summary-value responsive">${summary.responsive}</div>
385
+ <div class="summary-label">Fully Responsive</div>
386
+ </div>
387
+ <div class="summary-card">
388
+ <div class="summary-value minor">${summary.minorIssues}</div>
389
+ <div class="summary-label">Minor Issues</div>
390
+ </div>
391
+ <div class="summary-card">
392
+ <div class="summary-value major">${summary.majorIssues}</div>
393
+ <div class="summary-label">Major Issues</div>
394
+ </div>
395
+ <div class="summary-card">
396
+ <div class="summary-value">${summary.totalIssues}</div>
397
+ <div class="summary-label">Total Issues</div>
398
+ </div>
399
+ </div>
400
+
401
+ <div class="results">
402
+ ${results.map(result => {
403
+ const badgeClass = result.overallStatus === "responsive" ? "badge-responsive" : result.overallStatus === "minor_issues" ? "badge-minor" : "badge-major";
404
+ return `
405
+ <div class="result-card">
406
+ <div class="result-header">
407
+ <div>
408
+ <strong>${result.url}</strong>
409
+ <p style="color: #94a3b8; font-size: 0.875rem;">${result.summary}</p>
410
+ </div>
411
+ <span class="badge ${badgeClass}">${result.overallStatus.replace("_", " ").toUpperCase()}</span>
412
+ </div>
413
+ <div class="viewport-grid">
414
+ ${result.screenshots.map(s => `
415
+ <div class="viewport-item">
416
+ <span class="viewport-name">${s.viewport.name}</span>
417
+ <span style="color: #94a3b8;"> ${s.viewport.width}×${s.viewport.height}</span>
418
+ </div>
419
+ `).join("")}
420
+ </div>
421
+ ${result.issues.length > 0 ? `
422
+ <div style="margin-top: 1rem;">
423
+ <strong style="color: #f59e0b;">Issues:</strong>
424
+ ${result.issues.map(issue => `
425
+ <div class="issue issue-${issue.severity}">
426
+ <strong>[${issue.type.toUpperCase()}]</strong> ${issue.description}
427
+ <br><span style="color: #94a3b8; font-size: 0.75rem;">Affected: ${issue.affectedViewports.join(", ")}</span>
428
+ </div>
429
+ `).join("")}
430
+ </div>
431
+ ` : ""}
432
+ </div>
433
+ `;
434
+ }).join("")}
435
+ </div>
436
+
437
+ <footer>
438
+ Generated by CBrowser v7.2.0 | Test completed in ${(duration / 1000).toFixed(1)}s
439
+ </footer>
440
+ </div>
441
+ </body>
442
+ </html>`;
443
+ }
444
+ /**
445
+ * List available viewport presets
446
+ */
447
+ function listViewportPresets() {
448
+ return types_js_1.VIEWPORT_PRESETS;
449
+ }
450
+ //# sourceMappingURL=responsive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive.js","sourceRoot":"","sources":["../../src/visual/responsive.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,39 @@
1
1
  {
2
2
  "name": "cbrowser",
3
- "version": "7.3.0",
4
- "description": "AI-powered browser automation with constitutional safety, AI visual regression, persona testing, and natural language test suites.",
3
+ "version": "7.4.1",
4
+ "description": "AI-powered browser automation with constitutional safety, AI visual regression, persona testing, and natural language test suites. Modular architecture for visual, testing, analysis, and performance modules.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
8
8
  "cbrowser": "dist/cli.js"
9
9
  },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.js"
15
+ },
16
+ "./visual": {
17
+ "types": "./dist/visual/index.d.ts",
18
+ "import": "./dist/visual/index.js",
19
+ "require": "./dist/visual/index.js"
20
+ },
21
+ "./testing": {
22
+ "types": "./dist/testing/index.d.ts",
23
+ "import": "./dist/testing/index.js",
24
+ "require": "./dist/testing/index.js"
25
+ },
26
+ "./analysis": {
27
+ "types": "./dist/analysis/index.d.ts",
28
+ "import": "./dist/analysis/index.js",
29
+ "require": "./dist/analysis/index.js"
30
+ },
31
+ "./performance": {
32
+ "types": "./dist/performance/index.d.ts",
33
+ "import": "./dist/performance/index.js",
34
+ "require": "./dist/performance/index.js"
35
+ }
36
+ },
10
37
  "scripts": {
11
38
  "build": "tsc",
12
39
  "dev": "tsc --watch",
@@ -38,7 +65,9 @@
38
65
  "ai-visual-regression",
39
66
  "visual-testing",
40
67
  "screenshot-comparison",
41
- "cross-browser-testing"
68
+ "cross-browser-testing",
69
+ "modular-architecture",
70
+ "performance-testing"
42
71
  ],
43
72
  "author": "WF Media",
44
73
  "license": "MIT",