cbrowser 7.2.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) 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 -395
  22. package/dist/browser.d.ts.map +1 -1
  23. package/dist/browser.js +0 -4388
  24. package/dist/browser.js.map +1 -1
  25. package/dist/cli.js +198 -55
  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/performance/index.d.ts +7 -0
  35. package/dist/performance/index.d.ts.map +1 -0
  36. package/dist/performance/index.js +23 -0
  37. package/dist/performance/index.js.map +1 -0
  38. package/dist/performance/metrics.d.ts +49 -0
  39. package/dist/performance/metrics.d.ts.map +1 -0
  40. package/dist/performance/metrics.js +386 -0
  41. package/dist/performance/metrics.js.map +1 -0
  42. package/dist/testing/coverage.d.ts +39 -0
  43. package/dist/testing/coverage.d.ts.map +1 -0
  44. package/dist/testing/coverage.js +713 -0
  45. package/dist/testing/coverage.js.map +1 -0
  46. package/dist/testing/flaky-detection.d.ts +28 -0
  47. package/dist/testing/flaky-detection.d.ts.map +1 -0
  48. package/dist/testing/flaky-detection.js +332 -0
  49. package/dist/testing/flaky-detection.js.map +1 -0
  50. package/dist/testing/index.d.ts +10 -0
  51. package/dist/testing/index.d.ts.map +1 -0
  52. package/dist/testing/index.js +26 -0
  53. package/dist/testing/index.js.map +1 -0
  54. package/dist/testing/nl-test-suite.d.ts +70 -0
  55. package/dist/testing/nl-test-suite.d.ts.map +1 -0
  56. package/dist/testing/nl-test-suite.js +427 -0
  57. package/dist/testing/nl-test-suite.js.map +1 -0
  58. package/dist/testing/test-repair.d.ts +36 -0
  59. package/dist/testing/test-repair.d.ts.map +1 -0
  60. package/dist/testing/test-repair.js +528 -0
  61. package/dist/testing/test-repair.js.map +1 -0
  62. package/dist/types.d.ts +125 -0
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/visual/ab-comparison.d.ts +23 -0
  65. package/dist/visual/ab-comparison.d.ts.map +1 -0
  66. package/dist/visual/ab-comparison.js +366 -0
  67. package/dist/visual/ab-comparison.js.map +1 -0
  68. package/dist/visual/cross-browser.d.ts +41 -0
  69. package/dist/visual/cross-browser.d.ts.map +1 -0
  70. package/dist/visual/cross-browser.js +442 -0
  71. package/dist/visual/cross-browser.js.map +1 -0
  72. package/dist/visual/index.d.ts +10 -0
  73. package/dist/visual/index.d.ts.map +1 -0
  74. package/dist/visual/index.js +26 -0
  75. package/dist/visual/index.js.map +1 -0
  76. package/dist/visual/regression.d.ts +55 -0
  77. package/dist/visual/regression.d.ts.map +1 -0
  78. package/dist/visual/regression.js +616 -0
  79. package/dist/visual/regression.js.map +1 -0
  80. package/dist/visual/responsive.d.ts +27 -0
  81. package/dist/visual/responsive.d.ts.map +1 -0
  82. package/dist/visual/responsive.js +450 -0
  83. package/dist/visual/responsive.js.map +1 -0
  84. package/package.json +32 -3
@@ -0,0 +1,366 @@
1
+ "use strict";
2
+ /**
3
+ * A/B Visual Comparison (v7.3.0)
4
+ *
5
+ * Compare two URLs side-by-side to detect visual differences.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.runABComparison = runABComparison;
9
+ exports.runABSuite = runABSuite;
10
+ exports.formatABReport = formatABReport;
11
+ exports.generateABHtmlReport = generateABHtmlReport;
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const browser_js_1 = require("../browser.js");
15
+ const regression_js_1 = require("./regression.js");
16
+ /**
17
+ * Get the path for A/B comparison screenshots
18
+ */
19
+ function getABScreenshotsPath() {
20
+ const basePath = process.cwd();
21
+ const screenshotsPath = (0, path_1.join)(basePath, ".cbrowser", "ab-comparison");
22
+ if (!(0, fs_1.existsSync)(screenshotsPath)) {
23
+ (0, fs_1.mkdirSync)(screenshotsPath, { recursive: true });
24
+ }
25
+ return screenshotsPath;
26
+ }
27
+ /**
28
+ * Capture screenshot for A/B comparison
29
+ */
30
+ async function captureForAB(url, label, options = {}) {
31
+ const startTime = Date.now();
32
+ const browser = new browser_js_1.CBrowser({
33
+ viewportWidth: options.viewport?.width || 1920,
34
+ viewportHeight: options.viewport?.height || 1080,
35
+ });
36
+ try {
37
+ await browser.launch();
38
+ await browser.navigate(url);
39
+ const page = await browser.getPage();
40
+ // Wait if specified
41
+ if (options.waitForSelector) {
42
+ await page.waitForSelector(options.waitForSelector, { timeout: 10000 }).catch(() => { });
43
+ }
44
+ if (options.waitBeforeCapture) {
45
+ await new Promise(resolve => setTimeout(resolve, options.waitBeforeCapture));
46
+ }
47
+ // Get page title
48
+ const title = await page.title();
49
+ // Take screenshot
50
+ const screenshotsPath = getABScreenshotsPath();
51
+ const filename = `${label.toLowerCase()}-${Date.now()}.png`;
52
+ const screenshotPath = (0, path_1.join)(screenshotsPath, filename);
53
+ const viewport = page.viewportSize() || { width: 1920, height: 1080 };
54
+ await page.screenshot({ path: screenshotPath, fullPage: false });
55
+ return {
56
+ label,
57
+ url,
58
+ screenshotPath,
59
+ title,
60
+ viewport,
61
+ timestamp: new Date().toISOString(),
62
+ captureTime: Date.now() - startTime,
63
+ };
64
+ }
65
+ finally {
66
+ await browser.close();
67
+ }
68
+ }
69
+ /**
70
+ * Analyze differences between A and B for detailed reporting
71
+ */
72
+ function analyzeABDifferences(analysis) {
73
+ const differences = [];
74
+ for (const change of analysis.changes || []) {
75
+ // Map VisualChange to ABDifference
76
+ const severityMap = {
77
+ breaking: "critical",
78
+ warning: "major",
79
+ info: "minor",
80
+ acceptable: "info",
81
+ };
82
+ const typeMap = {
83
+ layout: "layout",
84
+ content: "content",
85
+ style: "style",
86
+ missing: "missing",
87
+ added: "added",
88
+ moved: "structure",
89
+ };
90
+ differences.push({
91
+ type: typeMap[change.type] || "content",
92
+ severity: severityMap[change.severity] || "minor",
93
+ description: change.description,
94
+ affectedSide: "both", // AI analysis doesn't specify which side
95
+ region: change.region,
96
+ });
97
+ }
98
+ return differences;
99
+ }
100
+ /**
101
+ * Run A/B visual comparison between two URLs
102
+ */
103
+ async function runABComparison(urlA, urlB, options = {}) {
104
+ const startTime = Date.now();
105
+ const labels = options.labels || { a: "Version A", b: "Version B" };
106
+ console.log(`\n🔀 A/B Visual Comparison`);
107
+ console.log(` A: ${urlA}`);
108
+ console.log(` B: ${urlB}\n`);
109
+ // Capture both screenshots
110
+ console.log(` 📸 Capturing ${labels.a}...`);
111
+ const screenshotA = await captureForAB(urlA, "A", options);
112
+ console.log(` ✅ Captured in ${screenshotA.captureTime}ms`);
113
+ console.log(` 📸 Capturing ${labels.b}...`);
114
+ const screenshotB = await captureForAB(urlB, "B", options);
115
+ console.log(` ✅ Captured in ${screenshotB.captureTime}ms`);
116
+ // Compare using AI analysis
117
+ console.log(`\n 🔍 Comparing...`);
118
+ const analysis = await (0, regression_js_1.analyzeVisualDifferences)(screenshotA.screenshotPath, screenshotB.screenshotPath, { sensitivity: options.sensitivity || "medium" });
119
+ // Determine overall status based on similarity
120
+ let overallStatus;
121
+ if (analysis.similarityScore >= 0.95) {
122
+ overallStatus = "identical";
123
+ console.log(` ✅ Identical (${(analysis.similarityScore * 100).toFixed(1)}%)`);
124
+ }
125
+ else if (analysis.similarityScore >= 0.80) {
126
+ overallStatus = "similar";
127
+ console.log(` ⚠️ Similar (${(analysis.similarityScore * 100).toFixed(1)}%)`);
128
+ }
129
+ else if (analysis.similarityScore >= 0.50) {
130
+ overallStatus = "different";
131
+ console.log(` 🟠 Different (${(analysis.similarityScore * 100).toFixed(1)}%)`);
132
+ }
133
+ else {
134
+ overallStatus = "very_different";
135
+ console.log(` ❌ Very Different (${(analysis.similarityScore * 100).toFixed(1)}%)`);
136
+ }
137
+ // Analyze differences
138
+ const differences = analyzeABDifferences(analysis);
139
+ // Generate summary
140
+ const summaryMap = {
141
+ identical: "Pages are visually identical",
142
+ similar: "Pages are similar with minor differences",
143
+ different: "Pages have significant visual differences",
144
+ very_different: "Pages are very different - likely different designs",
145
+ };
146
+ return {
147
+ urlA,
148
+ urlB,
149
+ labels,
150
+ screenshots: {
151
+ a: screenshotA,
152
+ b: screenshotB,
153
+ },
154
+ analysis,
155
+ differences,
156
+ overallStatus,
157
+ summary: summaryMap[overallStatus],
158
+ duration: Date.now() - startTime,
159
+ timestamp: new Date().toISOString(),
160
+ };
161
+ }
162
+ /**
163
+ * Run A/B comparison suite for multiple page pairs
164
+ */
165
+ async function runABSuite(suite) {
166
+ const startTime = Date.now();
167
+ const results = [];
168
+ console.log(`\n🔀 A/B Comparison Suite: ${suite.name}`);
169
+ console.log(` Testing ${suite.pairs.length} page pairs\n`);
170
+ for (const pair of suite.pairs) {
171
+ const pairOptions = {
172
+ ...suite.options,
173
+ labels: pair.name ? { a: `${pair.name} (A)`, b: `${pair.name} (B)` } : suite.options?.labels,
174
+ };
175
+ const result = await runABComparison(pair.urlA, pair.urlB, pairOptions);
176
+ results.push(result);
177
+ }
178
+ return {
179
+ suite,
180
+ results,
181
+ summary: {
182
+ total: results.length,
183
+ identical: results.filter(r => r.overallStatus === "identical").length,
184
+ similar: results.filter(r => r.overallStatus === "similar").length,
185
+ different: results.filter(r => r.overallStatus === "different").length,
186
+ veryDifferent: results.filter(r => r.overallStatus === "very_different").length,
187
+ },
188
+ duration: Date.now() - startTime,
189
+ timestamp: new Date().toISOString(),
190
+ };
191
+ }
192
+ /**
193
+ * Format A/B comparison result as console report
194
+ */
195
+ function formatABReport(result) {
196
+ const lines = [];
197
+ const duration = (result.duration / 1000).toFixed(2);
198
+ lines.push(`╔${"═".repeat(78)}╗`);
199
+ lines.push(`║${" ".repeat(22)}A/B VISUAL COMPARISON REPORT${" ".repeat(28)}║`);
200
+ lines.push(`╚${"═".repeat(78)}╝`);
201
+ lines.push("");
202
+ const statusIcons = {
203
+ identical: "✅",
204
+ similar: "⚠️",
205
+ different: "🟠",
206
+ very_different: "❌",
207
+ };
208
+ const statusIcon = statusIcons[result.overallStatus];
209
+ const statusText = result.overallStatus.toUpperCase().replace("_", " ");
210
+ lines.push(`${statusIcon} Status: ${statusText}`);
211
+ lines.push(`📊 Similarity: ${(result.analysis.similarityScore * 100).toFixed(1)}%`);
212
+ lines.push(`⏱️ Duration: ${duration}s`);
213
+ lines.push("");
214
+ lines.push("─".repeat(79));
215
+ lines.push("📸 SCREENSHOTS");
216
+ lines.push("─".repeat(79));
217
+ lines.push(` ${result.labels.a.toUpperCase()} (A)`);
218
+ lines.push(` URL: ${result.screenshots.a.url}`);
219
+ lines.push(` Title: ${result.screenshots.a.title}`);
220
+ lines.push(` Capture time: ${result.screenshots.a.captureTime}ms`);
221
+ lines.push(` Path: ${result.screenshots.a.screenshotPath}`);
222
+ lines.push("");
223
+ lines.push(` ${result.labels.b.toUpperCase()} (B)`);
224
+ lines.push(` URL: ${result.screenshots.b.url}`);
225
+ lines.push(` Title: ${result.screenshots.b.title}`);
226
+ lines.push(` Capture time: ${result.screenshots.b.captureTime}ms`);
227
+ lines.push(` Path: ${result.screenshots.b.screenshotPath}`);
228
+ lines.push("");
229
+ if (result.differences.length > 0) {
230
+ lines.push("─".repeat(79));
231
+ lines.push("🔍 DIFFERENCES DETECTED");
232
+ lines.push("─".repeat(79));
233
+ for (const diff of result.differences) {
234
+ const severityIcons = { critical: "🔴", major: "🟠", minor: "🟡", info: "🔵" };
235
+ const icon = severityIcons[diff.severity];
236
+ lines.push(` ${icon} [${diff.type.toUpperCase()}] ${diff.description}`);
237
+ }
238
+ lines.push("");
239
+ }
240
+ lines.push("─".repeat(79));
241
+ lines.push(`📝 SUMMARY: ${result.summary}`);
242
+ lines.push("─".repeat(79));
243
+ return lines.join("\n");
244
+ }
245
+ /**
246
+ * Generate HTML report for A/B comparison suite
247
+ */
248
+ function generateABHtmlReport(suiteResult) {
249
+ const { suite, results, summary, duration } = suiteResult;
250
+ return `<!DOCTYPE html>
251
+ <html>
252
+ <head>
253
+ <title>A/B Comparison Report - ${suite.name}</title>
254
+ <style>
255
+ * { margin: 0; padding: 0; box-sizing: border-box; }
256
+ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0f172a; color: #e2e8f0; line-height: 1.6; }
257
+ .container { max-width: 1400px; margin: 0 auto; padding: 2rem; }
258
+ header { text-align: center; margin-bottom: 2rem; }
259
+ h1 { font-size: 2rem; margin-bottom: 0.5rem; background: linear-gradient(135deg, #f59e0b, #ef4444); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
260
+ .subtitle { color: #94a3b8; }
261
+ .summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
262
+ .summary-card { background: #1e293b; border-radius: 0.5rem; padding: 1.5rem; text-align: center; }
263
+ .summary-value { font-size: 2rem; font-weight: bold; }
264
+ .summary-label { color: #94a3b8; font-size: 0.875rem; }
265
+ .identical { color: #22c55e; }
266
+ .similar { color: #f59e0b; }
267
+ .different { color: #f97316; }
268
+ .very-different { color: #ef4444; }
269
+ .result-card { background: #1e293b; border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 1rem; }
270
+ .result-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; }
271
+ .badge { padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; }
272
+ .badge-identical { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
273
+ .badge-similar { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }
274
+ .badge-different { background: rgba(249, 115, 22, 0.2); color: #f97316; }
275
+ .badge-very-different { background: rgba(239, 68, 68, 0.2); color: #ef4444; }
276
+ .comparison-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 1rem; }
277
+ .side { background: #0f172a; padding: 1rem; border-radius: 0.375rem; }
278
+ .side-label { font-weight: 600; color: #f59e0b; margin-bottom: 0.5rem; }
279
+ .url { color: #94a3b8; font-size: 0.875rem; word-break: break-all; }
280
+ .diff-list { margin-top: 1rem; }
281
+ .diff-item { background: #0f172a; padding: 0.5rem 0.75rem; border-radius: 0.375rem; margin-top: 0.5rem; border-left: 3px solid; }
282
+ .diff-critical { border-color: #ef4444; }
283
+ .diff-major { border-color: #f97316; }
284
+ .diff-minor { border-color: #f59e0b; }
285
+ .diff-info { border-color: #3b82f6; }
286
+ footer { text-align: center; color: #64748b; padding: 2rem 0; font-size: 0.875rem; }
287
+ </style>
288
+ </head>
289
+ <body>
290
+ <div class="container">
291
+ <header>
292
+ <h1>🔀 A/B Comparison Report</h1>
293
+ <p class="subtitle">${suite.name}</p>
294
+ </header>
295
+
296
+ <div class="summary-grid">
297
+ <div class="summary-card">
298
+ <div class="summary-value">${summary.total}</div>
299
+ <div class="summary-label">Total Pairs</div>
300
+ </div>
301
+ <div class="summary-card">
302
+ <div class="summary-value identical">${summary.identical}</div>
303
+ <div class="summary-label">Identical</div>
304
+ </div>
305
+ <div class="summary-card">
306
+ <div class="summary-value similar">${summary.similar}</div>
307
+ <div class="summary-label">Similar</div>
308
+ </div>
309
+ <div class="summary-card">
310
+ <div class="summary-value different">${summary.different}</div>
311
+ <div class="summary-label">Different</div>
312
+ </div>
313
+ <div class="summary-card">
314
+ <div class="summary-value very-different">${summary.veryDifferent}</div>
315
+ <div class="summary-label">Very Different</div>
316
+ </div>
317
+ </div>
318
+
319
+ <div class="results">
320
+ ${results.map(result => {
321
+ const badgeClass = `badge-${result.overallStatus.replace("_", "-")}`;
322
+ return `
323
+ <div class="result-card">
324
+ <div class="result-header">
325
+ <div>
326
+ <strong>${result.summary}</strong>
327
+ <p style="color: #94a3b8; font-size: 0.875rem;">Similarity: ${(result.analysis.similarityScore * 100).toFixed(1)}%</p>
328
+ </div>
329
+ <span class="badge ${badgeClass}">${result.overallStatus.replace("_", " ").toUpperCase()}</span>
330
+ </div>
331
+ <div class="comparison-grid">
332
+ <div class="side">
333
+ <div class="side-label">${result.labels.a}</div>
334
+ <div class="url">${result.urlA}</div>
335
+ <div style="margin-top: 0.5rem; color: #64748b; font-size: 0.75rem;">Title: ${result.screenshots.a.title}</div>
336
+ </div>
337
+ <div class="side">
338
+ <div class="side-label">${result.labels.b}</div>
339
+ <div class="url">${result.urlB}</div>
340
+ <div style="margin-top: 0.5rem; color: #64748b; font-size: 0.75rem;">Title: ${result.screenshots.b.title}</div>
341
+ </div>
342
+ </div>
343
+ ${result.differences.length > 0 ? `
344
+ <div class="diff-list">
345
+ <strong style="color: #f59e0b;">Differences:</strong>
346
+ ${result.differences.slice(0, 5).map(diff => `
347
+ <div class="diff-item diff-${diff.severity}">
348
+ <strong>[${diff.type.toUpperCase()}]</strong> ${diff.description}
349
+ </div>
350
+ `).join("")}
351
+ ${result.differences.length > 5 ? `<div style="color: #94a3b8; margin-top: 0.5rem;">...and ${result.differences.length - 5} more</div>` : ""}
352
+ </div>
353
+ ` : ""}
354
+ </div>
355
+ `;
356
+ }).join("")}
357
+ </div>
358
+
359
+ <footer>
360
+ Generated by CBrowser v7.3.0 | Test completed in ${(duration / 1000).toFixed(1)}s
361
+ </footer>
362
+ </div>
363
+ </body>
364
+ </html>`;
365
+ }
366
+ //# sourceMappingURL=ab-comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ab-comparison.js","sourceRoot":"","sources":["../../src/visual/ab-comparison.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Cross-Browser Visual Testing (v7.1.0)
3
+ *
4
+ * Test how pages render across different browser engines.
5
+ */
6
+ import type { CrossBrowserResult, CrossBrowserOptions, CrossBrowserSuite, CrossBrowserSuiteResult } from "../types.js";
7
+ /**
8
+ * Run cross-browser visual test for a single URL
9
+ */
10
+ export declare function runCrossBrowserTest(url: string, options?: CrossBrowserOptions): Promise<CrossBrowserResult>;
11
+ /**
12
+ * Run cross-browser test suite
13
+ */
14
+ export declare function runCrossBrowserSuite(suite: CrossBrowserSuite): Promise<CrossBrowserSuiteResult>;
15
+ /**
16
+ * Format cross-browser result as text report
17
+ */
18
+ export declare function formatCrossBrowserReport(result: CrossBrowserResult): string;
19
+ /**
20
+ * Generate HTML report for cross-browser test suite
21
+ */
22
+ export declare function generateCrossBrowserHtmlReport(suiteResult: CrossBrowserSuiteResult): string;
23
+ export interface BrowserDiffResult {
24
+ url: string;
25
+ browsers: string[];
26
+ differences: Array<{
27
+ type: "visual" | "timing" | "content" | "error";
28
+ description: string;
29
+ browsers: string[];
30
+ }>;
31
+ screenshots: Record<string, string>;
32
+ metrics: Record<string, {
33
+ loadTime: number;
34
+ resourceCount: number;
35
+ }>;
36
+ }
37
+ /**
38
+ * Compare page behavior across multiple browsers.
39
+ */
40
+ export declare function crossBrowserDiff(url: string, browsers?: Array<"chromium" | "firefox" | "webkit">): Promise<BrowserDiffResult>;
41
+ //# sourceMappingURL=cross-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-browser.d.ts","sourceRoot":"","sources":["../../src/visual/cross-browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAIV,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAsErB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAuG7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,uBAAuB,CAAC,CAuClC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA2E3E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,uBAAuB,GAAG,MAAM,CAyH3F;AAMD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;QAChD,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,KAAK,CAAC,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAqC,GACrF,OAAO,CAAC,iBAAiB,CAAC,CAyD5B"}