@arghajit/playwright-pulse-report 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/report-types.d.ts +2 -0
- package/dist/reporter/playwright-pulse-reporter.d.ts +17 -1
- package/dist/reporter/playwright-pulse-reporter.js +91 -123
- package/dist/reporter/tsconfig.reporter.tsbuildinfo +1 -0
- package/dist/types/index.d.ts +45 -7
- package/package.json +17 -15
- package/scripts/config-reader.mjs +114 -124
- package/scripts/generate-email-report.mjs +56 -11
- package/scripts/generate-report.mjs +129 -39
- package/scripts/generate-static-report.mjs +134 -49
- package/scripts/generate-trend.mjs +8 -4
- package/scripts/{merge-pulse-report.js → merge-pulse-report.mjs} +55 -35
- package/scripts/merge-sequential-reports.mjs +172 -0
- package/scripts/sendReport.mjs +154 -203
|
@@ -4,11 +4,13 @@ export declare class PlaywrightPulseReporter implements Reporter {
|
|
|
4
4
|
private config;
|
|
5
5
|
private suite;
|
|
6
6
|
private results;
|
|
7
|
+
private _pendingTestEnds;
|
|
7
8
|
private runStartTime;
|
|
8
9
|
private options;
|
|
9
10
|
private outputDir;
|
|
10
11
|
private attachmentsDir;
|
|
11
12
|
private baseOutputFile;
|
|
13
|
+
private individualReportsSubDir;
|
|
12
14
|
private isSharded;
|
|
13
15
|
private shardIndex;
|
|
14
16
|
private resetOnEachRun;
|
|
@@ -21,14 +23,28 @@ export declare class PlaywrightPulseReporter implements Reporter {
|
|
|
21
23
|
private getBrowserDetails;
|
|
22
24
|
private processStep;
|
|
23
25
|
onTestEnd(test: TestCase, result: PwTestResult): Promise<void>;
|
|
26
|
+
private _processTestEnd;
|
|
24
27
|
private _getFinalizedResults;
|
|
25
28
|
onError(error: any): void;
|
|
26
29
|
private _getEnvDetails;
|
|
27
30
|
private _writeShardResults;
|
|
28
31
|
private _mergeShardResults;
|
|
29
32
|
private _cleanupTemporaryFiles;
|
|
33
|
+
/**
|
|
34
|
+
* Removes all individual run JSON files from the `pulse-results/` directory
|
|
35
|
+
* that were left over from previous test sessions.
|
|
36
|
+
*
|
|
37
|
+
* When `resetOnEachRun: false`, each run writes its own timestamped JSON to
|
|
38
|
+
* `pulse-results/` and then `_mergeAllRunReports()` merges them all. However,
|
|
39
|
+
* if files from *older* sessions accumulate there (e.g. because a previous run
|
|
40
|
+
* was interrupted before the post-merge cleanup, or because the user ran tests
|
|
41
|
+
* on a previous day), `_getFinalizedResults()` de-duplicates by `test.id` and
|
|
42
|
+
* collapses results from both sessions into a single entry — producing a
|
|
43
|
+
* `totalTests` count lower than the actual number of tests that ran.
|
|
44
|
+
*
|
|
45
|
+
* Cleaning up at `onBegin` time guarantees each run starts with a fresh slate.
|
|
46
|
+
*/
|
|
30
47
|
private _ensureDirExists;
|
|
31
48
|
onEnd(result: FullResult): Promise<void>;
|
|
32
|
-
private _mergeAllRunReports;
|
|
33
49
|
}
|
|
34
50
|
export default PlaywrightPulseReporter;
|
|
@@ -64,19 +64,21 @@ const convertStatus = (status, testCase) => {
|
|
|
64
64
|
};
|
|
65
65
|
const TEMP_SHARD_FILE_PREFIX = ".pulse-shard-results-";
|
|
66
66
|
const ATTACHMENTS_SUBDIR = "attachments";
|
|
67
|
-
const INDIVIDUAL_REPORTS_SUBDIR = "pulse-results";
|
|
68
67
|
class PlaywrightPulseReporter {
|
|
69
68
|
constructor(options = {}) {
|
|
70
|
-
var _a, _b, _c;
|
|
69
|
+
var _a, _b, _c, _d;
|
|
71
70
|
this.results = [];
|
|
71
|
+
this._pendingTestEnds = [];
|
|
72
72
|
this.baseOutputFile = "playwright-pulse-report.json";
|
|
73
|
+
this.individualReportsSubDir = "pulse-results";
|
|
73
74
|
this.isSharded = false;
|
|
74
75
|
this.shardIndex = undefined;
|
|
75
76
|
this.options = options;
|
|
76
77
|
this.baseOutputFile = (_a = options.outputFile) !== null && _a !== void 0 ? _a : this.baseOutputFile;
|
|
77
78
|
this.outputDir = (_b = options.outputDir) !== null && _b !== void 0 ? _b : "pulse-report";
|
|
79
|
+
this.individualReportsSubDir = (_c = options.individualReportsSubDir) !== null && _c !== void 0 ? _c : "pulse-results";
|
|
78
80
|
this.attachmentsDir = path.join(this.outputDir, ATTACHMENTS_SUBDIR);
|
|
79
|
-
this.resetOnEachRun = (
|
|
81
|
+
this.resetOnEachRun = (_d = options.resetOnEachRun) !== null && _d !== void 0 ? _d : true;
|
|
80
82
|
}
|
|
81
83
|
printsToStdio() {
|
|
82
84
|
return this.shardIndex === undefined || this.shardIndex === 0;
|
|
@@ -99,12 +101,12 @@ class PlaywrightPulseReporter {
|
|
|
99
101
|
? this.config.shard.current - 1
|
|
100
102
|
: undefined;
|
|
101
103
|
this._ensureDirExists(this.outputDir)
|
|
102
|
-
.then(() => {
|
|
104
|
+
.then(async () => {
|
|
103
105
|
if (this.printsToStdio()) {
|
|
104
106
|
console.log(`PlaywrightPulseReporter: Starting test run with ${suite.allTests().length} tests${this.isSharded ? ` across ${totalShards} shards` : ""}. Pulse outputting to ${this.outputDir}`);
|
|
105
107
|
if (this.shardIndex === undefined ||
|
|
106
108
|
(this.isSharded && this.shardIndex === 0)) {
|
|
107
|
-
|
|
109
|
+
await this._cleanupTemporaryFiles();
|
|
108
110
|
}
|
|
109
111
|
}
|
|
110
112
|
})
|
|
@@ -120,19 +122,19 @@ class PlaywrightPulseReporter {
|
|
|
120
122
|
extractCodeSnippet(filePath, targetLine, targetColumn) {
|
|
121
123
|
var _a;
|
|
122
124
|
try {
|
|
123
|
-
const fsSync = require(
|
|
125
|
+
const fsSync = require("fs");
|
|
124
126
|
if (!fsSync.existsSync(filePath)) {
|
|
125
|
-
return
|
|
127
|
+
return "";
|
|
126
128
|
}
|
|
127
|
-
const content = fsSync.readFileSync(filePath,
|
|
128
|
-
const lines = content.split(
|
|
129
|
+
const content = fsSync.readFileSync(filePath, "utf8");
|
|
130
|
+
const lines = content.split("\n");
|
|
129
131
|
if (targetLine < 1 || targetLine > lines.length) {
|
|
130
|
-
return
|
|
132
|
+
return "";
|
|
131
133
|
}
|
|
132
|
-
return ((_a = lines[targetLine - 1]) === null || _a === void 0 ? void 0 : _a.trim()) ||
|
|
134
|
+
return ((_a = lines[targetLine - 1]) === null || _a === void 0 ? void 0 : _a.trim()) || "";
|
|
133
135
|
}
|
|
134
136
|
catch (e) {
|
|
135
|
-
return
|
|
137
|
+
return "";
|
|
136
138
|
}
|
|
137
139
|
}
|
|
138
140
|
getBrowserDetails(test) {
|
|
@@ -199,7 +201,7 @@ class PlaywrightPulseReporter {
|
|
|
199
201
|
const startTime = new Date(step.startTime);
|
|
200
202
|
const endTime = new Date(startTime.getTime() + Math.max(0, duration));
|
|
201
203
|
let codeLocation = "";
|
|
202
|
-
let codeSnippet =
|
|
204
|
+
let codeSnippet = "";
|
|
203
205
|
if (step.location) {
|
|
204
206
|
codeLocation = `${path.relative(this.config.rootDir, step.location.file)}:${step.location.line}:${step.location.column}`;
|
|
205
207
|
codeSnippet = this.extractCodeSnippet(step.location.file, step.location.line, step.location.column);
|
|
@@ -226,9 +228,19 @@ class PlaywrightPulseReporter {
|
|
|
226
228
|
};
|
|
227
229
|
}
|
|
228
230
|
async onTestEnd(test, result) {
|
|
231
|
+
// Track this async call so onEnd() can wait for all in-flight processing
|
|
232
|
+
// before it reads this.results. This prevents the race condition where
|
|
233
|
+
// onEnd() fires before an interrupted test's onTestEnd() has finished
|
|
234
|
+
// its async attachment I/O and pushed to this.results.
|
|
235
|
+
const p = this._processTestEnd(test, result);
|
|
236
|
+
this._pendingTestEnds.push(p);
|
|
237
|
+
await p;
|
|
238
|
+
}
|
|
239
|
+
async _processTestEnd(test, result) {
|
|
229
240
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
230
241
|
const project = (_a = test.parent) === null || _a === void 0 ? void 0 : _a.project();
|
|
231
242
|
const browserDetails = this.getBrowserDetails(test);
|
|
243
|
+
const uniqueTestId = `${(project === null || project === void 0 ? void 0 : project.name) || "default"}-${test.id}`;
|
|
232
244
|
// Captured outcome from Playwright
|
|
233
245
|
const outcome = test.outcome();
|
|
234
246
|
// Calculate final status based on the last result (Last-Run-Wins)
|
|
@@ -239,15 +251,15 @@ class PlaywrightPulseReporter {
|
|
|
239
251
|
// Existing behavior: fail if flaky (implied by user request "existing status field should remain failed")
|
|
240
252
|
// If outcome is flaky, status should be 'failed' to indicate initial failure, but final_status is 'passed'
|
|
241
253
|
let testStatus = finalStatus;
|
|
242
|
-
if (outcome ===
|
|
243
|
-
testStatus =
|
|
254
|
+
if (outcome === "flaky") {
|
|
255
|
+
testStatus = "flaky";
|
|
244
256
|
}
|
|
245
257
|
const startTime = new Date(result.startTime);
|
|
246
258
|
const endTime = new Date(startTime.getTime() + result.duration);
|
|
247
259
|
const processAllSteps = async (steps) => {
|
|
248
260
|
let processed = [];
|
|
249
261
|
for (const step of steps) {
|
|
250
|
-
const processedStep = await this.processStep(step,
|
|
262
|
+
const processedStep = await this.processStep(step, uniqueTestId, browserDetails, test);
|
|
251
263
|
processed.push(processedStep);
|
|
252
264
|
if (step.steps && step.steps.length > 0) {
|
|
253
265
|
processedStep.steps = await processAllSteps(step.steps);
|
|
@@ -255,7 +267,7 @@ class PlaywrightPulseReporter {
|
|
|
255
267
|
}
|
|
256
268
|
return processed;
|
|
257
269
|
};
|
|
258
|
-
let codeSnippet =
|
|
270
|
+
let codeSnippet = "";
|
|
259
271
|
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)) {
|
|
260
272
|
codeSnippet = this.extractCodeSnippet(test.location.file, test.location.line, test.location.column);
|
|
261
273
|
}
|
|
@@ -284,14 +296,14 @@ class PlaywrightPulseReporter {
|
|
|
284
296
|
: undefined,
|
|
285
297
|
};
|
|
286
298
|
const pulseResult = {
|
|
287
|
-
id:
|
|
299
|
+
id: uniqueTestId,
|
|
288
300
|
runId: "TBD",
|
|
289
301
|
describe: describeBlockName,
|
|
290
302
|
spec_file: specFileName,
|
|
291
303
|
name: test.titlePath().join(" > "),
|
|
292
304
|
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",
|
|
293
305
|
status: testStatus,
|
|
294
|
-
outcome: outcome ===
|
|
306
|
+
outcome: outcome === "flaky" ? outcome : undefined, // Only Include if flaky
|
|
295
307
|
final_status: finalStatus, // New Field
|
|
296
308
|
duration: result.duration,
|
|
297
309
|
startTime: startTime,
|
|
@@ -318,7 +330,7 @@ class PlaywrightPulseReporter {
|
|
|
318
330
|
if (!attachment.path)
|
|
319
331
|
continue;
|
|
320
332
|
try {
|
|
321
|
-
const testSubfolder =
|
|
333
|
+
const testSubfolder = uniqueTestId.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
322
334
|
const safeAttachmentName = path
|
|
323
335
|
.basename(attachment.path)
|
|
324
336
|
.replace(/[^a-zA-Z0-9_.-]/g, "_");
|
|
@@ -363,21 +375,30 @@ class PlaywrightPulseReporter {
|
|
|
363
375
|
}
|
|
364
376
|
const finalResults = [];
|
|
365
377
|
for (const [testId, attempts] of resultsMap.entries()) {
|
|
366
|
-
|
|
378
|
+
// Sort by retry count (ASC) then timestamp (DESC) to ensure stable resolution
|
|
379
|
+
attempts.sort((a, b) => {
|
|
380
|
+
if (a.retries !== b.retries)
|
|
381
|
+
return a.retries - b.retries;
|
|
382
|
+
return (new Date(b.startTime).getTime() - new Date(a.startTime).getTime());
|
|
383
|
+
});
|
|
367
384
|
const firstAttempt = attempts[0];
|
|
368
385
|
const retryAttempts = attempts.slice(1);
|
|
369
386
|
// Only populate retryHistory if there were actual failures that triggered retries
|
|
370
387
|
// If all attempts passed, we don't need to show retry history
|
|
371
|
-
const hasActualRetries = retryAttempts.length > 0 &&
|
|
388
|
+
const hasActualRetries = retryAttempts.length > 0 &&
|
|
389
|
+
retryAttempts.some((attempt) => attempt.status === "failed" ||
|
|
390
|
+
attempt.status === "flaky" ||
|
|
391
|
+
firstAttempt.status === "failed" ||
|
|
392
|
+
firstAttempt.status === "flaky");
|
|
372
393
|
if (hasActualRetries) {
|
|
373
394
|
firstAttempt.retryHistory = retryAttempts;
|
|
374
395
|
// Calculate final status and outcome from the last attempt if retries exist
|
|
375
396
|
const lastAttempt = attempts[attempts.length - 1];
|
|
376
397
|
firstAttempt.final_status = lastAttempt.status;
|
|
377
398
|
// If the last attempt was flaky, ensure outcome is set on the main result
|
|
378
|
-
if (lastAttempt.outcome ===
|
|
379
|
-
firstAttempt.outcome =
|
|
380
|
-
firstAttempt.status =
|
|
399
|
+
if (lastAttempt.outcome === "flaky" || lastAttempt.status === "flaky") {
|
|
400
|
+
firstAttempt.outcome = "flaky";
|
|
401
|
+
firstAttempt.status = "flaky";
|
|
381
402
|
}
|
|
382
403
|
}
|
|
383
404
|
else {
|
|
@@ -444,10 +465,10 @@ class PlaywrightPulseReporter {
|
|
|
444
465
|
}
|
|
445
466
|
const finalResultsList = this._getFinalizedResults(allShardProcessedResults);
|
|
446
467
|
finalResultsList.forEach((r) => (r.runId = finalRunData.id));
|
|
447
|
-
finalRunData.passed = finalResultsList.filter((r) => r.status === "passed").length;
|
|
448
|
-
finalRunData.failed = finalResultsList.filter((r) => r.status === "failed").length;
|
|
449
|
-
finalRunData.skipped = finalResultsList.filter((r) => r.status === "skipped").length;
|
|
450
|
-
finalRunData.flaky = finalResultsList.filter((r) => r.status === "flaky").length;
|
|
468
|
+
finalRunData.passed = finalResultsList.filter((r) => (r.final_status || r.status) === "passed").length;
|
|
469
|
+
finalRunData.failed = finalResultsList.filter((r) => (r.final_status || r.status) === "failed").length;
|
|
470
|
+
finalRunData.skipped = finalResultsList.filter((r) => (r.final_status || r.status) === "skipped").length;
|
|
471
|
+
finalRunData.flaky = finalResultsList.filter((r) => (r.final_status || r.status) === "flaky").length;
|
|
451
472
|
finalRunData.totalTests = finalResultsList.length;
|
|
452
473
|
const reviveDates = (key, value) => {
|
|
453
474
|
const isoDateRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z$/;
|
|
@@ -461,7 +482,11 @@ class PlaywrightPulseReporter {
|
|
|
461
482
|
return {
|
|
462
483
|
run: finalRunData,
|
|
463
484
|
results: properlyTypedResults,
|
|
464
|
-
metadata: {
|
|
485
|
+
metadata: {
|
|
486
|
+
generatedAt: new Date().toISOString(),
|
|
487
|
+
reportDescription: this.options.reportDescription,
|
|
488
|
+
logo: this.options.logo,
|
|
489
|
+
},
|
|
465
490
|
};
|
|
466
491
|
}
|
|
467
492
|
async _cleanupTemporaryFiles() {
|
|
@@ -478,6 +503,20 @@ class PlaywrightPulseReporter {
|
|
|
478
503
|
}
|
|
479
504
|
}
|
|
480
505
|
}
|
|
506
|
+
/**
|
|
507
|
+
* Removes all individual run JSON files from the `pulse-results/` directory
|
|
508
|
+
* that were left over from previous test sessions.
|
|
509
|
+
*
|
|
510
|
+
* When `resetOnEachRun: false`, each run writes its own timestamped JSON to
|
|
511
|
+
* `pulse-results/` and then `_mergeAllRunReports()` merges them all. However,
|
|
512
|
+
* if files from *older* sessions accumulate there (e.g. because a previous run
|
|
513
|
+
* was interrupted before the post-merge cleanup, or because the user ran tests
|
|
514
|
+
* on a previous day), `_getFinalizedResults()` de-duplicates by `test.id` and
|
|
515
|
+
* collapses results from both sessions into a single entry — producing a
|
|
516
|
+
* `totalTests` count lower than the actual number of tests that ran.
|
|
517
|
+
*
|
|
518
|
+
* Cleaning up at `onBegin` time guarantees each run starts with a fresh slate.
|
|
519
|
+
*/
|
|
481
520
|
async _ensureDirExists(dirPath) {
|
|
482
521
|
try {
|
|
483
522
|
await fs.mkdir(dirPath, { recursive: true });
|
|
@@ -490,6 +529,11 @@ class PlaywrightPulseReporter {
|
|
|
490
529
|
}
|
|
491
530
|
}
|
|
492
531
|
async onEnd(result) {
|
|
532
|
+
// Wait for ALL in-flight onTestEnd calls to finish before reading this.results.
|
|
533
|
+
// This guards against Playwright calling onEnd() concurrently with (or just
|
|
534
|
+
// before) the last onTestEnd() finishing its async attachment I/O — which
|
|
535
|
+
// would cause that test to be silently dropped from the report.
|
|
536
|
+
await Promise.allSettled(this._pendingTestEnds);
|
|
493
537
|
if (this.shardIndex !== undefined) {
|
|
494
538
|
await this._writeShardResults();
|
|
495
539
|
return;
|
|
@@ -505,10 +549,10 @@ class PlaywrightPulseReporter {
|
|
|
505
549
|
timestamp: new Date(this.runStartTime),
|
|
506
550
|
// Use the length of the de-duplicated array for all counts
|
|
507
551
|
totalTests: finalResults.length,
|
|
508
|
-
passed: finalResults.filter((r) => r.status === "passed").length,
|
|
509
|
-
failed: finalResults.filter((r) => r.status === "failed").length,
|
|
510
|
-
skipped: finalResults.filter((r) => r.status === "skipped").length,
|
|
511
|
-
flaky: finalResults.filter((r) => r.status === "flaky").length,
|
|
552
|
+
passed: finalResults.filter((r) => (r.final_status || r.status) === "passed").length,
|
|
553
|
+
failed: finalResults.filter((r) => (r.final_status || r.status) === "failed").length,
|
|
554
|
+
skipped: finalResults.filter((r) => (r.final_status || r.status) === "skipped").length,
|
|
555
|
+
flaky: finalResults.filter((r) => (r.final_status || r.status) === "flaky").length,
|
|
512
556
|
duration,
|
|
513
557
|
environment: environmentDetails,
|
|
514
558
|
};
|
|
@@ -523,7 +567,11 @@ class PlaywrightPulseReporter {
|
|
|
523
567
|
run: runData,
|
|
524
568
|
// Use the de-duplicated results
|
|
525
569
|
results: finalResults,
|
|
526
|
-
metadata: {
|
|
570
|
+
metadata: {
|
|
571
|
+
generatedAt: new Date().toISOString(),
|
|
572
|
+
reportDescription: this.options.reportDescription,
|
|
573
|
+
logo: this.options.logo,
|
|
574
|
+
},
|
|
527
575
|
};
|
|
528
576
|
}
|
|
529
577
|
if (!finalReport) {
|
|
@@ -552,108 +600,28 @@ class PlaywrightPulseReporter {
|
|
|
552
600
|
}
|
|
553
601
|
else {
|
|
554
602
|
// Logic for appending/merging reports
|
|
555
|
-
const pulseResultsDir = path.join(this.outputDir,
|
|
556
|
-
const
|
|
603
|
+
const pulseResultsDir = path.join(this.outputDir, this.individualReportsSubDir);
|
|
604
|
+
const shardPrefix = this.baseOutputFile.replace(".json", "-");
|
|
605
|
+
const individualReportPath = path.join(pulseResultsDir, `${shardPrefix}${Date.now()}.json`);
|
|
557
606
|
try {
|
|
558
607
|
await this._ensureDirExists(pulseResultsDir);
|
|
559
608
|
await fs.writeFile(individualReportPath, JSON.stringify(finalReport, jsonReplacer, 2));
|
|
560
609
|
if (this.printsToStdio()) {
|
|
561
610
|
console.log(`PlaywrightPulseReporter: Individual run report for merging written to ${individualReportPath}`);
|
|
562
611
|
}
|
|
563
|
-
|
|
612
|
+
// DEFERRED MERGING:
|
|
613
|
+
// We do not call _mergeAllRunReports() here anymore when resetOnEachRun is false.
|
|
614
|
+
// The individual JSON files in pulse-results/ will be collected and merged
|
|
615
|
+
// into the main JSON when the user next runs one of the report generator commands.
|
|
564
616
|
}
|
|
565
617
|
catch (error) {
|
|
566
|
-
console.error(`Pulse Reporter: Failed to write
|
|
618
|
+
console.error(`Pulse Reporter: Failed to write report. Error: ${error.message}`);
|
|
567
619
|
}
|
|
568
620
|
}
|
|
569
621
|
if (this.isSharded) {
|
|
570
622
|
await this._cleanupTemporaryFiles();
|
|
571
623
|
}
|
|
572
624
|
}
|
|
573
|
-
async _mergeAllRunReports() {
|
|
574
|
-
const pulseResultsDir = path.join(this.outputDir, INDIVIDUAL_REPORTS_SUBDIR);
|
|
575
|
-
const finalOutputPath = path.join(this.outputDir, this.baseOutputFile);
|
|
576
|
-
let reportFiles;
|
|
577
|
-
try {
|
|
578
|
-
const allFiles = await fs.readdir(pulseResultsDir);
|
|
579
|
-
reportFiles = allFiles.filter((file) => file.startsWith("playwright-pulse-report-") && file.endsWith(".json"));
|
|
580
|
-
}
|
|
581
|
-
catch (error) {
|
|
582
|
-
if (error.code === "ENOENT") {
|
|
583
|
-
if (this.printsToStdio()) {
|
|
584
|
-
console.log(`Pulse Reporter: No individual reports directory found at ${pulseResultsDir}. Skipping merge.`);
|
|
585
|
-
}
|
|
586
|
-
return;
|
|
587
|
-
}
|
|
588
|
-
console.error(`Pulse Reporter: Error reading report directory ${pulseResultsDir}:`, error);
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
if (reportFiles.length === 0) {
|
|
592
|
-
if (this.printsToStdio()) {
|
|
593
|
-
console.log("Pulse Reporter: No matching JSON report files found to merge.");
|
|
594
|
-
}
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
const allResultsFromAllFiles = [];
|
|
598
|
-
let latestTimestamp = new Date(0);
|
|
599
|
-
let lastRunEnvironment = undefined;
|
|
600
|
-
let totalDuration = 0;
|
|
601
|
-
for (const file of reportFiles) {
|
|
602
|
-
const filePath = path.join(pulseResultsDir, file);
|
|
603
|
-
try {
|
|
604
|
-
const content = await fs.readFile(filePath, "utf-8");
|
|
605
|
-
const json = JSON.parse(content);
|
|
606
|
-
if (json.run) {
|
|
607
|
-
const runTimestamp = new Date(json.run.timestamp);
|
|
608
|
-
if (runTimestamp > latestTimestamp) {
|
|
609
|
-
latestTimestamp = runTimestamp;
|
|
610
|
-
lastRunEnvironment = json.run.environment || undefined;
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
if (json.results) {
|
|
614
|
-
allResultsFromAllFiles.push(...json.results);
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
catch (err) {
|
|
618
|
-
console.warn(`Pulse Reporter: Could not parse report file ${filePath}. Skipping. Error: ${err.message}`);
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
// De-duplicate the results from ALL merged files using the helper function
|
|
622
|
-
const finalMergedResults = this._getFinalizedResults(allResultsFromAllFiles);
|
|
623
|
-
// Sum the duration from the final, de-duplicated list of tests
|
|
624
|
-
totalDuration = finalMergedResults.reduce((acc, r) => acc + (r.duration || 0), 0);
|
|
625
|
-
const combinedRun = {
|
|
626
|
-
id: `merged-${Date.now()}`,
|
|
627
|
-
timestamp: latestTimestamp,
|
|
628
|
-
environment: lastRunEnvironment,
|
|
629
|
-
// Recalculate counts based on the truly final, de-duplicated list
|
|
630
|
-
totalTests: finalMergedResults.length,
|
|
631
|
-
passed: finalMergedResults.filter((r) => r.status === "passed").length,
|
|
632
|
-
failed: finalMergedResults.filter((r) => r.status === "failed").length,
|
|
633
|
-
skipped: finalMergedResults.filter((r) => r.status === "skipped").length,
|
|
634
|
-
duration: totalDuration,
|
|
635
|
-
};
|
|
636
|
-
const finalReport = {
|
|
637
|
-
run: combinedRun,
|
|
638
|
-
results: finalMergedResults, // Use the de-duplicated list
|
|
639
|
-
metadata: {
|
|
640
|
-
generatedAt: new Date().toISOString(),
|
|
641
|
-
},
|
|
642
|
-
};
|
|
643
|
-
try {
|
|
644
|
-
await fs.writeFile(finalOutputPath, JSON.stringify(finalReport, (key, value) => {
|
|
645
|
-
if (value instanceof Date)
|
|
646
|
-
return value.toISOString();
|
|
647
|
-
return value;
|
|
648
|
-
}, 2));
|
|
649
|
-
if (this.printsToStdio()) {
|
|
650
|
-
console.log(`PlaywrightPulseReporter: ✅ Merged report with ${finalMergedResults.length} total results saved to ${finalOutputPath}`);
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
catch (err) {
|
|
654
|
-
console.error(`Pulse Reporter: Failed to write final merged report to ${finalOutputPath}. Error: ${err.message}`);
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
625
|
}
|
|
658
626
|
exports.PlaywrightPulseReporter = PlaywrightPulseReporter;
|
|
659
627
|
exports.default = PlaywrightPulseReporter;
|
|
@@ -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/types/testreporter.d.ts","../../node_modules/@playwright/test/reporter.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/lucide-react/dist/lucide-react.d.ts","../../src/types/index.ts","../../src/lib/report-types.ts","../../src/reporter/playwright-pulse-reporter.ts","../../node_modules/@types/caseless/index.d.ts","../../node_modules/@types/d3-array/index.d.ts","../../node_modules/@types/d3-color/index.d.ts","../../node_modules/@types/d3-ease/index.d.ts","../../node_modules/@types/d3-interpolate/index.d.ts","../../node_modules/@types/d3-path/index.d.ts","../../node_modules/@types/d3-time/index.d.ts","../../node_modules/@types/d3-scale/index.d.ts","../../node_modules/@types/d3-shape/index.d.ts","../../node_modules/@types/d3-timer/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/long/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/buffer/index.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","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/request/node_modules/form-data/index.d.ts","../../node_modules/@types/tough-cookie/index.d.ts","../../node_modules/@types/request/index.d.ts","../../node_modules/@types/shimmer/index.d.ts","../../node_modules/@types/triple-beam/index.d.ts","../../node_modules/@types/yauzl/index.d.ts"],"fileIdsList":[[83,110,153],[110,153],[95,110,153],[99,110,153],[98,110,153],[110,150,153],[110,152,153],[153],[110,153,158,187],[110,153,154,159,165,166,173,184,195],[110,153,154,155,165,173],[105,106,107,110,153],[110,153,156,196],[110,153,157,158,166,174],[110,153,158,184,192],[110,153,159,161,165,173],[110,152,153,160],[110,153,161,162],[110,153,165],[110,153,163,165],[110,152,153,165],[110,153,165,166,167,184,195],[110,153,165,166,167,180,184,187],[110,148,153,200],[110,153,161,165,168,173,184,195],[110,153,165,166,168,169,173,184,192,195],[110,153,168,170,184,192,195],[108,109,110,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,197,198,199,200,201],[110,153,165,171],[110,153,172,195,200],[110,153,161,165,173,184],[110,153,174],[110,153,175],[110,152,153,176],[110,150,151,152,153,154,155,156,157,158,159,160,161,162,163,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,197,198,199,200,201],[110,153,178],[110,153,179],[110,153,165,180,181],[110,153,180,182,196,198],[110,153,165,184,185,186,187],[110,153,184,186],[110,153,184,185],[110,153,187],[110,153,188],[110,150,153,184],[110,153,165,190,191],[110,153,190,191],[110,153,158,173,184,192],[110,153,193],[110,153,173,194],[110,153,168,179,195],[110,153,158,196],[110,153,184,197],[110,153,172,198],[110,153,199],[110,153,158,165,167,176,184,195,198,200],[110,153,184,201],[88,110,153],[85,86,87,110,153],[93,110,153,166,168,170,173,184,195,202,204,205],[110,153,168,184,202],[110,153,165,184,202],[81,110,153],[79,80,110,153,154,166,184],[82,110,153],[110,120,124,153,195],[110,120,153,184,195],[110,115,153],[110,117,120,153,192,195],[110,153,173,192],[110,153,202],[110,115,153,202],[110,117,120,153,173,195],[110,112,113,116,119,153,165,184,195],[110,120,127,153],[110,112,118,153],[110,120,141,142,153],[110,116,120,153,187,195,202],[110,141,153,202],[110,114,115,153,202],[110,120,153],[110,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,144,145,146,147,153],[110,120,135,153],[110,120,127,128,153],[110,118,120,128,129,153],[110,119,153],[110,112,115,120,153],[110,120,124,128,129,153],[110,124,153],[110,118,120,123,153,195],[110,112,117,120,127,153],[110,153,184],[110,115,120,141,153,200,202],[90,110,153],[84,90,91,110,153,167,175],[89,110,153]],"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":"0ef72620b8ed8555b1a571fba0573059b427c72c0f8fe0af12117c01deaa62aa","impliedFormat":1},{"version":"32727845ab5bd8a9ef3e4844c567c09f6d418fcf0f90d381c00652a6f23e7f6e","impliedFormat":1},{"version":"317522008ac4f9a976630cb65fd5b072d7aea6da0a93ec0cfe0c0b0336337ee2","impliedFormat":1},{"version":"e241a236efd22fd53f0cad74d812bece9bc1691bf3890e95705a6e3b73e2f98e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3cd566b0923109e83f1fe321c59266003ba22668d73195cf53e2eab3a71746f","impliedFormat":1},{"version":"04392f8e190f9e51301f73d17bbb34babd54858c1efc932d2193962f66dabae2","impliedFormat":1},{"version":"36a2e4c9a67439aca5f91bb304611d5ae6e20d420503e96c230cf8fcdc948d94","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"65ff5a0aefd7817a03c1ad04fee85c9cdd3ec415cc3c9efec85d8008d4d5e4ee","impliedFormat":1},{"version":"b89c2ddec6bd955e8721d41e24ca667de06882338d88b183c2cdc1f41f4c5a34","affectsGlobalScope":true,"impliedFormat":1},{"version":"6717dad91e44ad22d68f1fc0db74e5eb5398c2c06a2943bf06d3a168e8b1ba45","impliedFormat":99},{"version":"83aa54434d56363ddc949b3af4dd9eccd2fa9db2ecbae5c4a12b6984f66a630c","signature":"9f468e28df7bf40a346ac2cdd8b64e9f10cf2fbec522b58b92fef46b17c42720"},{"version":"331a971aff7a6da8693ab1ab38961996fecd854f6a639d430c81f8207dc92e96","signature":"14e0d6b6ab7688c7a2b60eb9c844d911175dd49a0e950b19863a5e09b8f9f6bd"},{"version":"c43cfd76af4b5b3dbe5d13d8f3e4ff975093fc952e444f1ad7d2263160c04b25","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"2174e20517788d2a1379fc0aaacd87899a70f9e0197b4295edabfe75c4db03d8","impliedFormat":1},{"version":"e0c868a08451c879984ccf4d4e3c1240b3be15af8988d230214977a3a3dad4ce","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"0e60e0cbf2283adfd5a15430ae548cd2f662d581b5da6ecd98220203e7067c70","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":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","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},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"e91ad231af87f864b3f07cd0e39b1cf6c133988156f087c1c3ccb0a5491c9115","impliedFormat":1},{"version":"03c258e060b7da220973f84b89615e4e9850e9b5d30b3a8e4840b3e3268ae8eb","impliedFormat":1},{"version":"319c37263037e8d9481a3dc7eadf6afa6a5f5c002189ebe28776ac1a62a38e15","impliedFormat":1},{"version":"837f5c12e3e94ee97aca37aa2a50ede521e5887fb7fa89330f5625b70597e116","impliedFormat":1},{"version":"908217c4f2244ec402b73533ebfcc46d6dcd34fc1c807ff403d7f98702abb3bc","impliedFormat":1},{"version":"74d5a87c3616cd5d8691059d531504403aa857e09cbaecb1c64dfb9ace0db185","impliedFormat":1}],"root":[90,92],"options":{"allowJs":true,"declaration":true,"declarationDir":"./","emitDeclarationOnly":false,"esModuleInterop":true,"jsx":2,"module":1,"outDir":"./","skipLibCheck":true,"strict":true,"target":3},"referencedMap":[[84,1],[93,2],[94,2],[95,2],[96,2],[97,3],[98,2],[100,4],[101,5],[99,2],[102,2],[103,2],[104,2],[150,6],[151,6],[152,7],[110,8],[153,9],[154,10],[155,11],[105,2],[108,12],[106,2],[107,2],[156,13],[157,14],[158,15],[159,16],[160,17],[161,18],[162,18],[164,19],[163,20],[165,21],[166,22],[167,23],[149,24],[109,2],[168,25],[169,26],[170,27],[202,28],[171,29],[172,30],[173,31],[174,32],[175,33],[176,34],[177,35],[178,36],[179,37],[180,38],[181,38],[182,39],[183,2],[184,40],[186,41],[185,42],[187,43],[188,44],[189,45],[190,46],[191,47],[192,48],[193,49],[194,50],[195,51],[196,52],[197,53],[198,54],[199,55],[200,56],[201,57],[87,2],[203,58],[85,2],[88,59],[206,60],[204,61],[207,2],[205,2],[208,2],[209,62],[111,2],[86,2],[89,58],[79,2],[80,63],[81,64],[82,63],[83,65],[77,2],[78,2],[13,2],[14,2],[16,2],[15,2],[2,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[23,2],[24,2],[3,2],[25,2],[26,2],[4,2],[27,2],[31,2],[28,2],[29,2],[30,2],[32,2],[33,2],[34,2],[5,2],[35,2],[36,2],[37,2],[38,2],[6,2],[42,2],[39,2],[40,2],[41,2],[43,2],[7,2],[44,2],[49,2],[50,2],[45,2],[46,2],[47,2],[48,2],[8,2],[54,2],[51,2],[52,2],[53,2],[55,2],[9,2],[56,2],[57,2],[58,2],[60,2],[59,2],[61,2],[62,2],[10,2],[63,2],[64,2],[65,2],[11,2],[66,2],[67,2],[68,2],[69,2],[70,2],[1,2],[71,2],[72,2],[12,2],[75,2],[74,2],[73,2],[76,2],[127,66],[137,67],[126,66],[147,68],[118,69],[117,70],[146,71],[140,72],[145,73],[120,74],[134,75],[119,76],[143,77],[115,78],[114,71],[144,79],[116,80],[121,81],[122,2],[125,81],[112,2],[148,82],[138,83],[129,84],[130,85],[132,86],[128,87],[131,88],[141,71],[123,89],[124,90],[133,91],[113,92],[136,83],[135,81],[139,2],[142,93],[91,94],[92,95],[90,96]],"version":"5.7.3"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { LucideIcon } from "lucide-react";
|
|
2
1
|
export type TestStatus = "passed" | "failed" | "skipped" | "expected-failure" | "unexpected-success" | "explicitly-skipped" | "flaky";
|
|
3
2
|
export interface TestStep {
|
|
4
3
|
id: string;
|
|
@@ -81,17 +80,56 @@ export interface TrendDataPoint {
|
|
|
81
80
|
skipped: number;
|
|
82
81
|
flaky?: number;
|
|
83
82
|
}
|
|
84
|
-
export interface SummaryMetric {
|
|
85
|
-
label: string;
|
|
86
|
-
value: string | number;
|
|
87
|
-
icon: LucideIcon;
|
|
88
|
-
color?: string;
|
|
89
|
-
}
|
|
90
83
|
export interface PlaywrightPulseReporterOptions {
|
|
84
|
+
/**
|
|
85
|
+
* The name of the output JSON file. Kindly do not change.
|
|
86
|
+
* @default "playwright-pulse-report.json"
|
|
87
|
+
*/
|
|
91
88
|
outputFile?: string;
|
|
89
|
+
/**
|
|
90
|
+
* The directory where the report files will be generated.
|
|
91
|
+
*
|
|
92
|
+
* Mostly useful while using sharding
|
|
93
|
+
*
|
|
94
|
+
* @default "pulse-report"
|
|
95
|
+
*/
|
|
92
96
|
outputDir?: string;
|
|
97
|
+
/**
|
|
98
|
+
* Whether to embed images directly as base64 strings in the report.
|
|
99
|
+
* @default false
|
|
100
|
+
*/
|
|
93
101
|
base64Images?: boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Whether to reset the output directory before each run.
|
|
104
|
+
*
|
|
105
|
+
* Mostly useful while running multiple test suites in a single run with `&&` operator.
|
|
106
|
+
*
|
|
107
|
+
* example: `npx playwright test test1.spec.ts && npx playwright test test2.spec.ts`
|
|
108
|
+
*
|
|
109
|
+
* If `resetOnEachRun` is set to `false`, then the report of `test2.spec.ts` will be merged with `test1.spec.ts` report.
|
|
110
|
+
*
|
|
111
|
+
* @default true
|
|
112
|
+
*/
|
|
94
113
|
resetOnEachRun?: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* A custom description to embed or display in the report.
|
|
116
|
+
*
|
|
117
|
+
* If not added, the component will not appear in the html reports
|
|
118
|
+
*/
|
|
119
|
+
reportDescription?: string;
|
|
120
|
+
/**
|
|
121
|
+
* Path to a custom logo image file to use in the report, which will be displayed in the header of the html report's logo and favicon.
|
|
122
|
+
*
|
|
123
|
+
* If not added, the default logo will be used.
|
|
124
|
+
*/
|
|
125
|
+
logo?: string;
|
|
126
|
+
/**
|
|
127
|
+
* The subdirectory within `outputDir` where individual run reports are stored.
|
|
128
|
+
* Only used when `resetOnEachRun` is `false`.
|
|
129
|
+
*
|
|
130
|
+
* @default "pulse-results"
|
|
131
|
+
*/
|
|
132
|
+
individualReportsSubDir?: string;
|
|
95
133
|
}
|
|
96
134
|
export interface EnvDetails {
|
|
97
135
|
host: string;
|