@arghajit/dummy 0.3.19 → 0.3.28

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.
@@ -0,0 +1,116 @@
1
+ 'use server';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ const reportFileName = 'playwright-pulse-report.json'; // Use a constant for the filename
5
+ const reportFilePath = path.resolve(process.cwd(), reportFileName); // Default path relative to cwd
6
+ let cachedReportData = null;
7
+ let lastReadTime = null;
8
+ const CACHE_DURATION = 5000; // Cache duration in milliseconds (e.g., 5 seconds)
9
+ export async function readReportDataInternal() {
10
+ const now = Date.now();
11
+ // Use cache if it's recent and not forced refresh
12
+ if (cachedReportData && lastReadTime && (now - lastReadTime < CACHE_DURATION)) {
13
+ // console.log("Returning cached report data.");
14
+ return cachedReportData;
15
+ }
16
+ // console.log(`Attempting to read report file from: ${reportFilePath}`);
17
+ try {
18
+ const fileContent = await fs.readFile(reportFilePath, 'utf-8');
19
+ let parsedData;
20
+ try {
21
+ parsedData = JSON.parse(fileContent);
22
+ }
23
+ catch (parseError) {
24
+ console.error(`Error parsing JSON from ${reportFilePath}:`, parseError);
25
+ throw new Error(`Invalid JSON in report file: ${parseError.message}`);
26
+ }
27
+ // --- Date Reviver ---
28
+ // Function to convert ISO date strings back to Date objects recursively
29
+ const reviveDates = (key, value) => {
30
+ // Matches ISO 8601 date format (YYYY-MM-DDTHH:mm:ss.sssZ)
31
+ const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
32
+ if (typeof value === 'string' && isoDateRegex.test(value)) {
33
+ const date = new Date(value);
34
+ // Check if the parsed date is valid before returning
35
+ if (!isNaN(date.getTime())) {
36
+ return date;
37
+ }
38
+ }
39
+ return value;
40
+ };
41
+ // Re-parse with the date reviver
42
+ const reportData = JSON.parse(fileContent, reviveDates);
43
+ // Basic validation after parsing and date revival
44
+ if (!reportData || typeof reportData !== 'object') {
45
+ throw new Error('Report file is empty or not a valid object.');
46
+ }
47
+ if (!reportData.metadata || typeof reportData.metadata.generatedAt !== 'string') { // generatedAt should remain string from JSON
48
+ throw new Error('Invalid or missing metadata in report file.');
49
+ }
50
+ if (!Array.isArray(reportData.results)) {
51
+ throw new Error('Missing or invalid "results" array in report file.');
52
+ }
53
+ // Optional: Validate run data if present
54
+ if (reportData.run && typeof reportData.run !== 'object') {
55
+ throw new Error('Invalid "run" data in report file.');
56
+ }
57
+ if (reportData.run && !(reportData.run.timestamp instanceof Date)) {
58
+ console.warn('Warning: Run timestamp was not correctly revived to a Date object.');
59
+ // Potentially attempt fallback parsing or throw error
60
+ reportData.run.timestamp = new Date(reportData.run.timestamp); // Attempt fallback
61
+ if (isNaN(reportData.run.timestamp.getTime())) {
62
+ throw new Error('Invalid run timestamp format.');
63
+ }
64
+ }
65
+ // Validate dates within results and steps
66
+ reportData.results.forEach((result, index) => {
67
+ if (!(result.startTime instanceof Date) || !(result.endTime instanceof Date)) {
68
+ console.warn(`Warning: Invalid start/end time for result index ${index}. Attempting fallback parsing.`);
69
+ result.startTime = new Date(result.startTime);
70
+ result.endTime = new Date(result.endTime);
71
+ if (isNaN(result.startTime.getTime()) || isNaN(result.endTime.getTime())) {
72
+ throw new Error(`Invalid start/end time in result index ${index}.`);
73
+ }
74
+ }
75
+ if (Array.isArray(result.steps)) {
76
+ result.steps.forEach((step, stepIndex) => {
77
+ if (!(step.startTime instanceof Date) || !(step.endTime instanceof Date)) {
78
+ console.warn(`Warning: Invalid start/end time for step index ${stepIndex} in result index ${index}. Attempting fallback parsing.`);
79
+ step.startTime = new Date(step.startTime);
80
+ step.endTime = new Date(step.endTime);
81
+ if (isNaN(step.startTime.getTime()) || isNaN(step.endTime.getTime())) {
82
+ throw new Error(`Invalid start/end time in step index ${stepIndex}, result index ${index}.`);
83
+ }
84
+ }
85
+ });
86
+ }
87
+ else {
88
+ result.steps = []; // Initialize if steps array is missing
89
+ }
90
+ });
91
+ cachedReportData = reportData;
92
+ lastReadTime = now;
93
+ // console.log("Successfully read, parsed, and cached report file.");
94
+ return reportData;
95
+ }
96
+ catch (error) {
97
+ if (error.code === 'ENOENT') {
98
+ console.warn(`Report file not found at ${reportFilePath}. Returning empty data structure. Ensure Playwright tests ran with the reporter enabled and the file exists.`);
99
+ // Return a valid, empty structure
100
+ const defaultReport = {
101
+ run: null,
102
+ results: [],
103
+ metadata: { generatedAt: new Date().toISOString() }
104
+ };
105
+ cachedReportData = defaultReport; // Cache the default empty state
106
+ lastReadTime = now;
107
+ return defaultReport;
108
+ }
109
+ else {
110
+ // Log the specific error for debugging
111
+ console.error(`Error processing report file at ${reportFilePath}:`, error);
112
+ // Propagate a user-friendly error
113
+ throw new Error(`Failed to load report data: ${error.message}`);
114
+ }
115
+ }
116
+ }
@@ -0,0 +1,39 @@
1
+ 'use server';
2
+ import { readReportDataInternal } from './data-reader'; // Import the server-only reader
3
+ // --- Modified Data Fetching Functions ---
4
+ export const getLatestTestRun = async () => {
5
+ await new Promise(resolve => setTimeout(resolve, 20)); // Minimal delay for demo
6
+ const reportData = await readReportDataInternal();
7
+ return reportData.run;
8
+ };
9
+ export const getTestResultById = async (testId) => {
10
+ await new Promise(resolve => setTimeout(resolve, 20)); // Minimal delay for demo
11
+ const reportData = await readReportDataInternal();
12
+ return reportData.results.find(r => r.id === testId) || null;
13
+ };
14
+ export const getTrendData = async (limit = 1) => {
15
+ await new Promise(resolve => setTimeout(resolve, 30)); // Minimal delay for demo
16
+ const reportData = await readReportDataInternal();
17
+ if (reportData.run) {
18
+ const run = reportData.run;
19
+ // Return a single data point based on the current run
20
+ // You might want a more sophisticated trend mechanism later
21
+ return [{
22
+ date: run.timestamp.toISOString().split('T')[0], // Use date part of timestamp
23
+ passed: run.passed,
24
+ failed: run.failed,
25
+ skipped: run.skipped,
26
+ }];
27
+ }
28
+ return [];
29
+ };
30
+ export const getAllTestResults = async () => {
31
+ await new Promise(resolve => setTimeout(resolve, 50)); // Minimal delay for demo
32
+ const reportData = await readReportDataInternal();
33
+ return reportData.results;
34
+ };
35
+ export const getTestRuns = async (limit = 1) => {
36
+ await new Promise(resolve => setTimeout(resolve, 30)); // Minimal delay for demo
37
+ const reportData = await readReportDataInternal();
38
+ return reportData.run ? [reportData.run] : [];
39
+ };
@@ -0,0 +1 @@
1
+ export function cn(...inputs) { }
package/dist/pulse.js CHANGED
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pulse = void 0;
4
- const test_1 = require("@playwright/test");
5
- exports.pulse = {
1
+ import { test } from "@playwright/test";
2
+ export const pulse = {
6
3
  /**
7
4
  * Sets the severity level for the current test.
8
5
  * * @param level - The severity level ('Minor' | 'Low' | 'Medium' | 'High' | 'Critical')
@@ -16,7 +13,7 @@ exports.pulse = {
16
13
  // Default to "Medium" if an invalid string is passed
17
14
  const selectedLevel = validLevels.includes(level) ? level : "Medium";
18
15
  // Add the annotation to Playwright's test info
19
- test_1.test.info().annotations.push({
16
+ test.info().annotations.push({
20
17
  type: "pulse_severity",
21
18
  description: selectedLevel,
22
19
  });
@@ -116,33 +116,22 @@ class PlaywrightPulseReporter {
116
116
  const severityAnnotation = annotations.find((a) => a.type === "pulse_severity");
117
117
  return (severityAnnotation === null || severityAnnotation === void 0 ? void 0 : severityAnnotation.description) || "Medium";
118
118
  }
119
- async extractCodeSnippet(filePath, targetLine, targetColumn) {
119
+ extractCodeSnippet(filePath, targetLine, targetColumn) {
120
+ var _a;
120
121
  try {
121
- const fileContent = await fs.readFile(filePath, "utf-8");
122
- const lines = fileContent.split("\n");
123
- if (targetLine < 1 || targetLine > lines.length) {
124
- return undefined;
122
+ const fsSync = require('fs');
123
+ if (!fsSync.existsSync(filePath)) {
124
+ return '';
125
125
  }
126
- const contextLines = 2;
127
- const startLine = Math.max(0, targetLine - contextLines - 1);
128
- const endLine = Math.min(lines.length, targetLine + contextLines);
129
- const snippetLines = [];
130
- for (let i = startLine; i < endLine; i++) {
131
- const lineNum = i + 1;
132
- const isTargetLine = lineNum === targetLine;
133
- const lineContent = lines[i] || "";
134
- const prefix = isTargetLine ? ">" : " ";
135
- snippetLines.push(`${prefix} ${lineNum.toString().padStart(4)} | ${lineContent}`);
136
- if (isTargetLine && targetColumn > 0) {
137
- const pointer = " " + " ".repeat(4) + " | " + " ".repeat(Math.max(0, targetColumn)) + "^";
138
- snippetLines.push(pointer);
139
- }
126
+ const content = fsSync.readFileSync(filePath, 'utf8');
127
+ const lines = content.split('\n');
128
+ if (targetLine < 1 || targetLine > lines.length) {
129
+ return '';
140
130
  }
141
- return snippetLines.length > 0 ? snippetLines.join("\n") : undefined;
131
+ return ((_a = lines[targetLine - 1]) === null || _a === void 0 ? void 0 : _a.trim()) || '';
142
132
  }
143
- catch (error) {
144
- console.error(`Failed to extract code snippet from ${filePath}:${targetLine}:${targetColumn}`, error);
145
- return undefined;
133
+ catch (e) {
134
+ return '';
146
135
  }
147
136
  }
148
137
  getBrowserDetails(test) {
@@ -195,7 +184,7 @@ class PlaywrightPulseReporter {
195
184
  }
196
185
  return finalString.trim();
197
186
  }
198
- async processStep(step, testId, browserDetails, testCase, isFailedStep = false) {
187
+ async processStep(step, testId, browserDetails, testCase) {
199
188
  var _a, _b, _c, _d;
200
189
  let stepStatus = "passed";
201
190
  let errorMessage = ((_a = step.error) === null || _a === void 0 ? void 0 : _a.message) || undefined;
@@ -209,18 +198,10 @@ class PlaywrightPulseReporter {
209
198
  const startTime = new Date(step.startTime);
210
199
  const endTime = new Date(startTime.getTime() + Math.max(0, duration));
211
200
  let codeLocation = "";
212
- let codeSnippet = undefined;
201
+ let codeSnippet = '';
213
202
  if (step.location) {
214
203
  codeLocation = `${path.relative(this.config.rootDir, step.location.file)}:${step.location.line}:${step.location.column}`;
215
- try {
216
- codeSnippet = await this.extractCodeSnippet(step.location.file, step.location.line, step.location.column);
217
- if (!codeSnippet) {
218
- console.warn(`Pulse Reporter: extractCodeSnippet returned undefined for step "${step.title}" at ${step.location.file}:${step.location.line}:${step.location.column}`);
219
- }
220
- }
221
- catch (error) {
222
- console.error(`Pulse Reporter: Failed to extract code snippet for step "${step.title}":`, error);
223
- }
204
+ codeSnippet = this.extractCodeSnippet(step.location.file, step.location.line, step.location.column);
224
205
  }
225
206
  return {
226
207
  id: `${testId}_step_${startTime.toISOString()}-${duration}-${(0, crypto_1.randomUUID)()}`,
@@ -240,7 +221,6 @@ class PlaywrightPulseReporter {
240
221
  ? "before"
241
222
  : "after"
242
223
  : undefined,
243
- isFailedStep: isFailedStep,
244
224
  steps: [],
245
225
  };
246
226
  }
@@ -248,33 +228,35 @@ class PlaywrightPulseReporter {
248
228
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
249
229
  const project = (_a = test.parent) === null || _a === void 0 ? void 0 : _a.project();
250
230
  const browserDetails = this.getBrowserDetails(test);
251
- const testStatus = convertStatus(result.status, test);
231
+ // Captured outcome from Playwright
232
+ const outcome = test.outcome();
233
+ // Calculate final status based on the last result (Last-Run-Wins)
234
+ // result.status in onTestEnd is typically the status of the test run (passed if flaky passed)
235
+ // But we double check the last result in test.results just to be sure/consistent
236
+ const lastResult = test.results[test.results.length - 1];
237
+ const finalStatus = convertStatus(lastResult ? lastResult.status : result.status, test);
238
+ // Existing behavior: fail if flaky (implied by user request "existing status field should remain failed")
239
+ // If outcome is flaky, status should be 'failed' to indicate initial failure, but final_status is 'passed'
240
+ let testStatus = finalStatus;
241
+ if (outcome === 'flaky') {
242
+ testStatus = 'flaky';
243
+ }
252
244
  const startTime = new Date(result.startTime);
253
245
  const endTime = new Date(startTime.getTime() + result.duration);
254
- const processAllSteps = async (steps, parentFailed = false) => {
246
+ const processAllSteps = async (steps) => {
255
247
  let processed = [];
256
- let foundFailedStep = false;
257
248
  for (const step of steps) {
258
- const isThisStepFailed = !foundFailedStep && (step.error !== undefined || (testStatus === "failed" && !foundFailedStep));
259
- if (isThisStepFailed) {
260
- foundFailedStep = true;
261
- }
262
- const processedStep = await this.processStep(step, test.id, browserDetails, test, isThisStepFailed);
249
+ const processedStep = await this.processStep(step, test.id, browserDetails, test);
263
250
  processed.push(processedStep);
264
251
  if (step.steps && step.steps.length > 0) {
265
- processedStep.steps = await processAllSteps(step.steps, isThisStepFailed);
252
+ processedStep.steps = await processAllSteps(step.steps);
266
253
  }
267
254
  }
268
255
  return processed;
269
256
  };
270
- let codeSnippet = undefined;
271
- try {
272
- if (((_b = test.location) === null || _b === void 0 ? void 0 : _b.file) && ((_c = test.location) === null || _c === void 0 ? void 0 : _c.line) && ((_d = test.location) === null || _d === void 0 ? void 0 : _d.column)) {
273
- codeSnippet = await this.extractCodeSnippet(test.location.file, test.location.line, test.location.column);
274
- }
275
- }
276
- catch (e) {
277
- console.warn(`Pulse Reporter: Could not extract code snippet for ${test.title}`, e);
257
+ let codeSnippet = '';
258
+ if (((_b = test.location) === null || _b === void 0 ? void 0 : _b.file) && ((_c = test.location) === null || _c === void 0 ? void 0 : _c.line) && ((_d = test.location) === null || _d === void 0 ? void 0 : _d.column)) {
259
+ codeSnippet = this.extractCodeSnippet(test.location.file, test.location.line, test.location.column);
278
260
  }
279
261
  // 1. Get Spec File Name
280
262
  const specFileName = ((_e = test.location) === null || _e === void 0 ? void 0 : _e.file)
@@ -308,6 +290,8 @@ class PlaywrightPulseReporter {
308
290
  name: test.titlePath().join(" > "),
309
291
  suiteName: (project === null || project === void 0 ? void 0 : project.name) || ((_g = this.config.projects[0]) === null || _g === void 0 ? void 0 : _g.name) || "Default Suite",
310
292
  status: testStatus,
293
+ outcome: outcome === 'flaky' ? outcome : undefined, // Only Include if flaky
294
+ final_status: finalStatus, // New Field
311
295
  duration: result.duration,
312
296
  startTime: startTime,
313
297
  endTime: endTime,
@@ -366,15 +350,36 @@ class PlaywrightPulseReporter {
366
350
  this.results.push(pulseResult);
367
351
  }
368
352
  _getFinalizedResults(allResults) {
369
- const finalResultsMap = new Map();
353
+ const resultsMap = new Map();
370
354
  for (const result of allResults) {
371
- const existing = finalResultsMap.get(result.id);
372
- // Keep the result with the highest retry attempt for each test ID
373
- if (!existing || result.retries >= existing.retries) {
374
- finalResultsMap.set(result.id, result);
355
+ if (!resultsMap.has(result.id)) {
356
+ resultsMap.set(result.id, []);
357
+ }
358
+ resultsMap.get(result.id).push(result);
359
+ }
360
+ const finalResults = [];
361
+ for (const [testId, attempts] of resultsMap.entries()) {
362
+ attempts.sort((a, b) => a.retries - b.retries);
363
+ const firstAttempt = attempts[0];
364
+ const retryAttempts = attempts.slice(1);
365
+ if (retryAttempts.length > 0) {
366
+ firstAttempt.retryHistory = retryAttempts;
367
+ // Calculate final status and outcome from the last attempt if retries exist
368
+ const lastAttempt = attempts[attempts.length - 1];
369
+ firstAttempt.final_status = lastAttempt.status;
370
+ // If the last attempt was flaky, ensure outcome is set on the main result
371
+ if (lastAttempt.outcome === 'flaky' || lastAttempt.status === 'flaky') {
372
+ firstAttempt.outcome = 'flaky';
373
+ firstAttempt.status = 'flaky';
374
+ }
375
+ }
376
+ else {
377
+ // If no retries, ensure final_status is undefined (as requested)
378
+ delete firstAttempt.final_status;
375
379
  }
380
+ finalResults.push(firstAttempt);
376
381
  }
377
- return Array.from(finalResultsMap.values());
382
+ return finalResults;
378
383
  }
379
384
  onError(error) {
380
385
  var _a;
@@ -434,6 +439,7 @@ class PlaywrightPulseReporter {
434
439
  finalRunData.passed = finalResultsList.filter((r) => r.status === "passed").length;
435
440
  finalRunData.failed = finalResultsList.filter((r) => r.status === "failed").length;
436
441
  finalRunData.skipped = finalResultsList.filter((r) => r.status === "skipped").length;
442
+ finalRunData.flaky = finalResultsList.filter((r) => r.status === "flaky").length;
437
443
  finalRunData.totalTests = finalResultsList.length;
438
444
  const reviveDates = (key, value) => {
439
445
  const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
@@ -494,6 +500,7 @@ class PlaywrightPulseReporter {
494
500
  passed: finalResults.filter((r) => r.status === "passed").length,
495
501
  failed: finalResults.filter((r) => r.status === "failed").length,
496
502
  skipped: finalResults.filter((r) => r.status === "skipped").length,
503
+ flaky: finalResults.filter((r) => r.status === "flaky").length,
497
504
  duration,
498
505
  environment: environmentDetails,
499
506
  };
@@ -0,0 +1 @@
1
+ {"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.es2021.d.ts","../node_modules/typescript/lib/lib.es2022.d.ts","../node_modules/typescript/lib/lib.es2023.d.ts","../node_modules/typescript/lib/lib.es2024.d.ts","../node_modules/typescript/lib/lib.esnext.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2016.intl.d.ts","../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2017.date.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2019.intl.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.es2021.promise.d.ts","../node_modules/typescript/lib/lib.es2021.string.d.ts","../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../node_modules/typescript/lib/lib.es2021.intl.d.ts","../node_modules/typescript/lib/lib.es2022.array.d.ts","../node_modules/typescript/lib/lib.es2022.error.d.ts","../node_modules/typescript/lib/lib.es2022.intl.d.ts","../node_modules/typescript/lib/lib.es2022.object.d.ts","../node_modules/typescript/lib/lib.es2022.string.d.ts","../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../node_modules/typescript/lib/lib.es2023.array.d.ts","../node_modules/typescript/lib/lib.es2023.collection.d.ts","../node_modules/typescript/lib/lib.es2023.intl.d.ts","../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../node_modules/typescript/lib/lib.es2024.collection.d.ts","../node_modules/typescript/lib/lib.es2024.object.d.ts","../node_modules/typescript/lib/lib.es2024.promise.d.ts","../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2024.string.d.ts","../node_modules/typescript/lib/lib.esnext.array.d.ts","../node_modules/typescript/lib/lib.esnext.collection.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../node_modules/typescript/lib/lib.esnext.iterator.d.ts","../node_modules/typescript/lib/lib.decorators.d.ts","../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/playwright-core/types/protocol.d.ts","../node_modules/playwright-core/types/structs.d.ts","../node_modules/playwright-core/types/types.d.ts","../node_modules/playwright/types/test.d.ts","../node_modules/playwright/test.d.ts","../node_modules/@playwright/test/index.d.ts","../src/pulse.ts","../node_modules/lucide-react/dist/lucide-react.d.ts","../src/types/index.ts","../src/lib/report-types.ts","../src/lib/data-reader.ts","../src/lib/data.ts","../node_modules/clsx/clsx.d.ts","../src/lib/utils.ts","../node_modules/playwright/types/testreporter.d.ts","../node_modules/@playwright/test/reporter.d.ts","../src/reporter/attachment-utils.ts","../node_modules/@types/ua-parser-js/index.d.ts","../src/reporter/playwright-pulse-reporter.ts","../src/reporter/index.ts","../node_modules/@types/estree/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/node/compatibility/disposable.d.ts","../node_modules/@types/node/compatibility/indexable.d.ts","../node_modules/@types/node/compatibility/iterators.d.ts","../node_modules/@types/node/compatibility/index.d.ts","../node_modules/@types/node/globals.typedarray.d.ts","../node_modules/@types/node/buffer.buffer.d.ts","../node_modules/undici-types/header.d.ts","../node_modules/undici-types/readable.d.ts","../node_modules/undici-types/file.d.ts","../node_modules/undici-types/fetch.d.ts","../node_modules/undici-types/formdata.d.ts","../node_modules/undici-types/connector.d.ts","../node_modules/undici-types/client.d.ts","../node_modules/undici-types/errors.d.ts","../node_modules/undici-types/dispatcher.d.ts","../node_modules/undici-types/global-dispatcher.d.ts","../node_modules/undici-types/global-origin.d.ts","../node_modules/undici-types/pool-stats.d.ts","../node_modules/undici-types/pool.d.ts","../node_modules/undici-types/handlers.d.ts","../node_modules/undici-types/balanced-pool.d.ts","../node_modules/undici-types/agent.d.ts","../node_modules/undici-types/mock-interceptor.d.ts","../node_modules/undici-types/mock-agent.d.ts","../node_modules/undici-types/mock-client.d.ts","../node_modules/undici-types/mock-pool.d.ts","../node_modules/undici-types/mock-errors.d.ts","../node_modules/undici-types/proxy-agent.d.ts","../node_modules/undici-types/env-http-proxy-agent.d.ts","../node_modules/undici-types/retry-handler.d.ts","../node_modules/undici-types/retry-agent.d.ts","../node_modules/undici-types/api.d.ts","../node_modules/undici-types/interceptors.d.ts","../node_modules/undici-types/util.d.ts","../node_modules/undici-types/cookies.d.ts","../node_modules/undici-types/patch.d.ts","../node_modules/undici-types/websocket.d.ts","../node_modules/undici-types/eventsource.d.ts","../node_modules/undici-types/filereader.d.ts","../node_modules/undici-types/diagnostics-channel.d.ts","../node_modules/undici-types/content-type.d.ts","../node_modules/undici-types/cache.d.ts","../node_modules/undici-types/index.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/dom-events.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/readline/promises.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/sea.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/test.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/index.d.ts"],"fileIdsList":[[83,106,148],[93,106,148],[106,148],[106,145,148],[106,147,148],[148],[106,148,153,182],[106,148,149,154,160,161,168,179,190],[106,148,149,150,160,168],[101,102,103,106,148],[106,148,151,191],[106,148,152,153,161,169],[106,148,153,179,187],[106,148,154,156,160,168],[106,147,148,155],[106,148,156,157],[106,148,160],[106,148,158,160],[106,147,148,160],[106,148,160,161,162,179,190],[106,148,160,161,162,175,179,182],[106,143,148,195],[106,148,156,160,163,168,179,190],[106,148,160,161,163,164,168,179,187,190],[106,148,163,165,179,187,190],[104,105,106,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[106,148,160,166],[106,148,167,190,195],[106,148,156,160,168,179],[106,148,169],[106,148,170],[106,147,148,171],[106,145,146,147,148,149,150,151,152,153,154,155,156,157,158,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196],[106,148,173],[106,148,174],[106,148,160,175,176],[106,148,175,177,191,193],[106,148,160,179,180,181,182],[106,148,179,181],[106,148,179,180],[106,148,182],[106,148,183],[106,145,148,179],[106,148,160,185,186],[106,148,185,186],[106,148,153,168,179,187],[106,148,188],[106,148,168,189],[106,148,163,174,190],[106,148,153,191],[106,148,179,192],[106,148,167,193],[106,148,194],[106,148,153,160,162,171,179,190,193,195],[106,148,179,196],[81,106,148],[79,80,106,148,149,161,179],[82,106,148],[106,115,119,148,190],[106,115,148,179,190],[106,110,148],[106,112,115,148,187,190],[106,148,168,187],[106,148,197],[106,110,148,197],[106,112,115,148,168,190],[106,107,108,111,114,148,160,179,190],[106,115,122,148],[106,107,113,148],[106,115,136,137,148],[106,111,115,148,182,190,197],[106,136,148,197],[106,109,110,148,197],[106,115,148],[106,109,110,111,112,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,137,138,139,140,141,142,148],[106,115,130,148],[106,115,122,123,148],[106,113,115,123,124,148],[106,114,148],[106,107,110,115,148],[106,115,119,123,124,148],[106,119,148],[106,113,115,118,148,190],[106,107,112,115,122,148],[106,148,179],[106,110,115,136,148,195,197],[88,106,148,162,170],[87,89,106,148],[87,106,148],[91,106,148],[84,106,148],[87,94,106,148,161,170],[85,87,88,97,106,148],[87,88,94,96,106,148,153,162,169,170],[86,106,148]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f6ef9c13ca4e92bc06426a01f2c3198448e949f64f62eb02e2db23146a8d06c","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"254bdfc7c096df05586db7e69fd2c6d78c766d13713fb5a44b74d49fd45e8881","impliedFormat":1},{"version":"4a405da2b4fe59c59b09a9af656f7b40c18293b1e17118a93580585c01c7dc7a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f00324f263189b385c3a9383b1f4dae6237697bcf0801f96aa35c340512d79c","impliedFormat":1},{"version":"ec8997c2e5cea26befc76e7bf990750e96babb16977673a9ff3b5c0575d01e48","impliedFormat":1},"88a8818ff468a6bfbd1e798cf10688016e1035b81b841162722a956be0e3d417",{"version":"6717dad91e44ad22d68f1fc0db74e5eb5398c2c06a2943bf06d3a168e8b1ba45","impliedFormat":99},"e671563fbeb355f1e10a8296d3ff5ab2c1bf362801dbab2548e15e826adc3a71","331a971aff7a6da8693ab1ab38961996fecd854f6a639d430c81f8207dc92e96","b45a158fb0a2eae42e6c5d88d674ec5c72c610cc4840c8e9bb7178445dc4d4e3","83de864087649487b699d01917d4245750b114798d180426480e8019bc8497f5",{"version":"ef73bcfef9907c8b772a30e5a64a6bd86a5669cba3d210fcdcc6b625e3312459","impliedFormat":1},"91087920d3b2235d60b478f3d317c8737b64ce7fadba4dc3f88c9a0fb46080ba",{"version":"c76f94b31ae5c283f441916a9feb84257dca7041625eb7f3c9459fac5ac351cc","impliedFormat":1},{"version":"04392f8e190f9e51301f73d17bbb34babd54858c1efc932d2193962f66dabae2","impliedFormat":1},"c769507a3aab1d5491d133bcece45dd63aed97868e14673f73c11ba15ec90168",{"version":"98cbca6c3c5b2f8d1469dcee88c13304b6cb149fb057ec3b8a85f2e39ff1fc84","impliedFormat":1},"29a00357fe4b27487fa0631dfe3d4908249ed032cc4947b99f4098a7a30ad367","d502b970e98c03636f85ec36014de7c97aa31af702956549e1edc02b12067b03",{"version":"e2b48abff5a8adc6bb1cd13a702b9ef05e6045a98e7cfa95a8779b53b6d0e69d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fd06258805d26c72f5997e07a23155d322d5f05387adb3744a791fe6a0b042d","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"4d2b0eb911816f66abe4970898f97a2cfc902bcd743cbfa5017fad79f7ef90d8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"e53a3c2a9f624d90f24bf4588aacd223e7bec1b9d0d479b68d2f4a9e6011147f","impliedFormat":1},{"version":"24b8685c62562f5d98615c5a0c1d05f297cf5065f15246edfe99e81ec4c0e011","impliedFormat":1},{"version":"93507c745e8f29090efb99399c3f77bec07db17acd75634249dc92f961573387","impliedFormat":1},{"version":"339dc5265ee5ed92e536a93a04c4ebbc2128f45eeec6ed29f379e0085283542c","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"08faa97886e71757779428dd4c69a545c32c85fd629d1116d42710b32c6378bc","affectsGlobalScope":true,"impliedFormat":1},{"version":"a72ffc815104fb5c075106ebca459b2d55d07862a773768fce89efc621b3964b","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3d77c73be94570813f8cadd1f05ebc3dc5e2e4fdefe4d340ca20cd018724ee36","impliedFormat":1},{"version":"d674383111e06b6741c4ad2db962131b5b0fa4d0294b998566c635e86195a453","affectsGlobalScope":true,"impliedFormat":1},{"version":"f3e58c4c18a031cbb17abec7a4ad0bd5ae9fc70c1f4ba1e7fb921ad87c504aca","impliedFormat":1},{"version":"a3e8bafb2af8e850c644f4be7f5156cf7d23b7bfdc3b786bd4d10ed40329649c","impliedFormat":1},{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"a40826e8476694e90da94aa008283a7de50d1dafd37beada623863f1901cb7fb","impliedFormat":1},{"version":"f77d9188e41291acf14f476e931972460a303e1952538f9546e7b370cb8d0d20","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d04e3640dd9eb67f7f1e5bd3d0bf96c784666f7aefc8ac1537af6f2d38d4c29","impliedFormat":1},{"version":"3c884d9d9ec454bdf0d5a0b8465bf8297d2caa4d853851d92cc417ac6f30b969","impliedFormat":1},{"version":"5a369483ac4cfbdf0331c248deeb36140e6907db5e1daed241546b4a2055f82c","impliedFormat":1},{"version":"e8f5b5cc36615c17d330eaf8eebbc0d6bdd942c25991f96ef122f246f4ff722f","impliedFormat":1},{"version":"f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"0ada07543808f3b967624645a8e1ccd446f8b01ade47842acf1328aec899fed0","affectsGlobalScope":true,"impliedFormat":1},{"version":"c4a806152acbef81593f96cae6f2b04784d776457d97adbe2694478b243fcf03","impliedFormat":1},{"version":"71adf5dbc59568663d252a46179e71e4d544c053978bfc526d11543a3f716f42","impliedFormat":1},{"version":"c60db41f7bee80fb80c0b12819f5e465c8c8b465578da43e36d04f4a4646f57d","impliedFormat":1},{"version":"93bd413918fa921c8729cef45302b24d8b6c7855d72d5bf82d3972595ae8dcbf","impliedFormat":1},{"version":"4ff41188773cbf465807dd2f7059c7494cbee5115608efc297383832a1150c43","impliedFormat":1},{"version":"dccdf1677e531e33f8ac961a68bc537418c9a414797c1ea7e91307501cdc3f5e","impliedFormat":1},{"version":"e184c4b8918ef56c8c9e68bd79f3f3780e2d0d75bf2b8a41da1509a40c2deb46","affectsGlobalScope":true,"impliedFormat":1},{"version":"d206b4baf4ddcc15d9d69a9a2f4999a72a2c6adeaa8af20fa7a9960816287555","impliedFormat":1},{"version":"93f437e1398a4f06a984f441f7fa7a9f0535c04399619b5c22e0b87bdee182cb","impliedFormat":1},{"version":"afbe24ab0d74694372baa632ecb28bb375be53f3be53f9b07ecd7fc994907de5","impliedFormat":1},{"version":"70731d10d5311bd4cf710ef7f6539b62660f4b0bfdbb3f9fbe1d25fe6366a7fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"6b19db3600a17af69d4f33d08cc7076a7d19fb65bb36e442cac58929ec7c9482","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","impliedFormat":1},{"version":"137c2894e8f3e9672d401cc0a305dc7b1db7c69511cf6d3970fb53302f9eae09","impliedFormat":1},{"version":"3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","impliedFormat":1},{"version":"9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","impliedFormat":1},{"version":"235bfb54b4869c26f7e98e3d1f68dbfc85acf4cf5c38a4444a006fbf74a8a43d","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","impliedFormat":1},{"version":"bb715efb4857eb94539eafb420352105a0cff40746837c5140bf6b035dd220ba","affectsGlobalScope":true,"impliedFormat":1},{"version":"1851a3b4db78664f83901bb9cac9e45e03a37bb5933cc5bf37e10bb7e91ab4eb","impliedFormat":1},{"version":"fdedf82878e4c744bc2a1c1e802ae407d63474da51f14a54babe039018e53d8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"27d8987fd22d92efe6560cf0ce11767bf089903ffe26047727debfd1f3bf438b","affectsGlobalScope":true,"impliedFormat":1},{"version":"578d8bb6dcb2a1c03c4c3f8eb71abc9677e1a5c788b7f24848e3138ce17f3400","impliedFormat":1},{"version":"4f029899f9bae07e225c43aef893590541b2b43267383bf5e32e3a884d219ed5","impliedFormat":1},{"version":"ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","impliedFormat":1},{"version":"a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9","impliedFormat":1},{"version":"5b566927cad2ed2139655d55d690ffa87df378b956e7fe1c96024c4d9f75c4cf","affectsGlobalScope":true,"impliedFormat":1},{"version":"bce947017cb7a2deebcc4f5ba04cead891ce6ad1602a4438ae45ed9aa1f39104","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3dffd70e6375b872f0b4e152de4ae682d762c61a24881ecc5eb9f04c5caf76f","impliedFormat":1},{"version":"e2c72c065a36bc9ab2a00ac6a6f51e71501619a72c0609defd304d46610487a4","impliedFormat":1},{"version":"d91a7d8b5655c42986f1bdfe2105c4408f472831c8f20cf11a8c3345b6b56c8c","impliedFormat":1},{"version":"616075a6ac578cf5a013ee12964188b4412823796ce0b202c6f1d2e4ca8480d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"e8a979b8af001c9fc2e774e7809d233c8ca955a28756f52ee5dee88ccb0611d2","impliedFormat":1},{"version":"cac793cc47c29e26e4ac3601dcb00b4435ebed26203485790e44f2ad8b6ad847","impliedFormat":1}],"root":[85,[87,90],92,95,97,98],"options":{"allowJs":true,"esModuleInterop":true,"jsx":4,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[84,1],[94,2],[99,3],[100,3],[145,4],[146,4],[147,5],[106,6],[148,7],[149,8],[150,9],[101,3],[104,10],[102,3],[103,3],[151,11],[152,12],[153,13],[154,14],[155,15],[156,16],[157,16],[159,17],[158,18],[160,19],[161,20],[162,21],[144,22],[105,3],[163,23],[164,24],[165,25],[197,26],[166,27],[167,28],[168,29],[169,30],[170,31],[171,32],[172,33],[173,34],[174,35],[175,36],[176,36],[177,37],[178,3],[179,38],[181,39],[180,40],[182,41],[183,42],[184,43],[185,44],[186,45],[187,46],[188,47],[189,48],[190,49],[191,50],[192,51],[193,52],[194,53],[195,54],[196,55],[96,3],[91,3],[86,3],[79,3],[80,56],[81,57],[83,58],[82,56],[93,58],[77,3],[78,3],[13,3],[14,3],[16,3],[15,3],[2,3],[17,3],[18,3],[19,3],[20,3],[21,3],[22,3],[23,3],[24,3],[3,3],[25,3],[26,3],[4,3],[27,3],[31,3],[28,3],[29,3],[30,3],[32,3],[33,3],[34,3],[5,3],[35,3],[36,3],[37,3],[38,3],[6,3],[42,3],[39,3],[40,3],[41,3],[43,3],[7,3],[44,3],[49,3],[50,3],[45,3],[46,3],[47,3],[48,3],[8,3],[54,3],[51,3],[52,3],[53,3],[55,3],[9,3],[56,3],[57,3],[58,3],[60,3],[59,3],[61,3],[62,3],[10,3],[63,3],[64,3],[65,3],[11,3],[66,3],[67,3],[68,3],[69,3],[70,3],[1,3],[71,3],[72,3],[12,3],[75,3],[74,3],[73,3],[76,3],[122,59],[132,60],[121,59],[142,61],[113,62],[112,63],[141,64],[135,65],[140,66],[115,67],[129,68],[114,69],[138,70],[110,71],[109,64],[139,72],[111,73],[116,74],[117,3],[120,74],[107,3],[143,75],[133,76],[124,77],[125,78],[127,79],[123,80],[126,81],[136,64],[118,82],[119,83],[128,84],[108,85],[131,76],[130,74],[134,3],[137,86],[89,87],[90,88],[88,89],[92,90],[85,91],[95,92],[98,93],[97,94],[87,95]],"version":"5.7.3"}
@@ -1,5 +1,5 @@
1
1
  import type { LucideIcon } from "lucide-react";
2
- export type TestStatus = "passed" | "failed" | "skipped" | "expected-failure" | "unexpected-success" | "explicitly-skipped";
2
+ export type TestStatus = "passed" | "failed" | "skipped" | "expected-failure" | "unexpected-success" | "explicitly-skipped" | "flaky";
3
3
  export interface TestStep {
4
4
  id: string;
5
5
  title: string;
@@ -14,7 +14,6 @@ export interface TestStep {
14
14
  codeSnippet?: string;
15
15
  isHook?: boolean;
16
16
  hookType?: "before" | "after";
17
- isFailedStep?: boolean;
18
17
  steps?: TestStep[];
19
18
  }
20
19
  export interface TestResult {
@@ -37,6 +36,8 @@ export interface TestResult {
37
36
  suiteName?: string;
38
37
  runId: string;
39
38
  browser: string;
39
+ outcome?: string;
40
+ final_status?: TestStatus;
40
41
  screenshots?: string[];
41
42
  videoPath?: string[];
42
43
  tracePath?: string;
@@ -60,6 +61,7 @@ export interface TestResult {
60
61
  column: number;
61
62
  };
62
63
  }[];
64
+ retryHistory?: TestResult[];
63
65
  }
64
66
  export interface TestRun {
65
67
  id: string;
@@ -68,6 +70,7 @@ export interface TestRun {
68
70
  passed: number;
69
71
  failed: number;
70
72
  skipped: number;
73
+ flaky?: number;
71
74
  duration: number;
72
75
  environment?: EnvDetails | EnvDetails[];
73
76
  }
@@ -76,6 +79,7 @@ export interface TrendDataPoint {
76
79
  passed: number;
77
80
  failed: number;
78
81
  skipped: number;
82
+ flaky?: number;
79
83
  }
80
84
  export interface SummaryMetric {
81
85
  label: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@arghajit/dummy",
3
3
  "author": "Arghajit Singha",
4
- "version": "0.3.19",
4
+ "version": "0.3.28",
5
5
  "description": "A Playwright reporter and dashboard for visualizing test results.",
6
6
  "homepage": "https://arghajit47.github.io/playwright-pulse/",
7
7
  "repository": {
@@ -242,6 +242,17 @@ function generateMinifiedHTML(reportData) {
242
242
  severity
243
243
  )}; font-size: 0.8em; font-weight: 600; padding: 3px 8px; border-radius: 4px; color: #fff; margin-left: 10px; white-space: nowrap;">${severity}</span>`;
244
244
 
245
+ // --- NEW: Retry Count Badge ---
246
+ const retryCountBadge = (test.retryHistory && test.retryHistory.length > 0)
247
+ ? `<span style="background-color: #f59e0b; border: 1px solid #d97706; font-size: 0.8em; font-weight: 700; padding: 4px 10px; border-radius: 50px; color: #fff; margin-left: 10px; white-space: nowrap; display: inline-flex; align-items: center; gap: 4px;">
248
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="vertical-align: middle;">
249
+ <path d="M1 4v6h6"/>
250
+ <path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
251
+ </svg>
252
+ Retry Count: ${test.retryHistory.length}
253
+ </span>`
254
+ : '';
255
+
245
256
  // --- NEW: Tags Logic ---
246
257
  const tagsBadges = (test.tags || [])
247
258
  .map(
@@ -266,6 +277,7 @@ function generateMinifiedHTML(reportData) {
266
277
  test.name
267
278
  )}">${sanitizeHTML(testTitle)}</span>
268
279
 
280
+ ${retryCountBadge}
269
281
  ${severityBadge}
270
282
  ${tagsBadges}
271
283
  </li>
@@ -532,10 +544,10 @@ function generateMinifiedHTML(reportData) {
532
544
  </div>
533
545
  <div class="run-info">
534
546
  <strong>Run Date:</strong> ${formatDate(
535
- runSummary.timestamp
547
+ runSummary.timestamp,
536
548
  )}<br>
537
549
  <strong>Total Duration:</strong> ${formatDuration(
538
- runSummary.duration
550
+ runSummary.duration,
539
551
  )}
540
552
  </div>
541
553
  </header>
@@ -583,11 +595,11 @@ function generateMinifiedHTML(reportData) {
583
595
  <div class="filters-section">
584
596
  <input type="text" id="filter-min-name" placeholder="Search by test name...">
585
597
  <select id="filter-min-status">
586
- <option value="">All Statuses</option>
587
- <option value="passed">Passed</option>
588
- <option value="failed">Failed</option>
589
- <option value="skipped">Skipped</option>
590
- <option value="unknown">Unknown</option>
598
+ <option value="">All Status</option>
599
+ <option value="passed">✅ Passed</option>
600
+ <option value="failed">❌ Failed</option>
601
+ <option value="skipped">⏭️ Skipped</option>
602
+ <option value="unknown">❓ Unknown</option>
591
603
  </select>
592
604
  <select id="filter-min-browser">
593
605
  <option value="">All Browsers</option>
@@ -595,8 +607,8 @@ function generateMinifiedHTML(reportData) {
595
607
  .map(
596
608
  (browser) =>
597
609
  `<option value="${sanitizeHTML(
598
- browser.toLowerCase()
599
- )}">${sanitizeHTML(capitalize(browser))}</option>`
610
+ browser.toLowerCase(),
611
+ )}">${sanitizeHTML(capitalize(browser))}</option>`,
600
612
  )
601
613
  .join("")}
602
614
  </select>