@empiricalrun/playwright-utils 0.58.3 → 0.58.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.
@@ -1 +1 @@
1
- {"version":3,"file":"empirical-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/empirical-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAuBnC,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAG1B;IACF,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,kBAAkB,CAA2B;IAGrD,OAAO,CAAC,YAAY,CAAqB;IAEzC,cAEC;IAED,OAAO,CAAC,MAAM,EAAE,UAAU,QAEzB;IAED,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,6BAA6B,CA2CnC;IAEF,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,QAqI3C;IAEK,KAAK,CAAC,MAAM,EAAE,UAAU,iBAiH7B;IAED,OAAO,CAAC,qBAAqB;YAkBf,gBAAgB;YAOhB,iBAAiB;CAqChC;eAEc,iBAAiB"}
1
+ {"version":3,"file":"empirical-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/empirical-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAuBnC,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAG1B;IACF,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,kBAAkB,CAA2B;IAGrD,OAAO,CAAC,YAAY,CAAqB;IAEzC,cAEC;IAED,OAAO,CAAC,MAAM,EAAE,UAAU,QAEzB;IAED,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,6BAA6B,CA2CnC;IAEF,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,QA+I3C;IAEK,KAAK,CAAC,MAAM,EAAE,UAAU,iBAiH7B;IAED,OAAO,CAAC,qBAAqB;YAkBf,gBAAgB;YAOhB,iBAAiB;CAqChC;eAEc,iBAAiB"}
@@ -150,6 +150,15 @@ class EmpiricalReporter {
150
150
  stack: e.stack,
151
151
  location: e.location,
152
152
  })),
153
+ // Playwright seeds result.annotations with the full per-attempt
154
+ // set (static + suite + runtime-pushed); test.annotations is the
155
+ // fallback for older Playwright versions without it.
156
+ annotations: (result.annotations?.length
157
+ ? result.annotations
158
+ : test.annotations).map((a) => ({
159
+ type: a.type,
160
+ description: a.description,
161
+ })),
153
162
  },
154
163
  projectName,
155
164
  attachments: successfulAttachments,
@@ -122,6 +122,10 @@ export interface CleanRunResult extends RunResult {
122
122
  */
123
123
  export declare function runPlaywrightClean(ctx: ParityTestContext, opts: {
124
124
  workers: number;
125
+ shard?: {
126
+ current: number;
127
+ total: number;
128
+ };
125
129
  }): Promise<CleanRunResult>;
126
130
  /**
127
131
  * Runs `playwright merge-reports <blobDir> --reporter json` and returns the
@@ -1 +1 @@
1
- {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/reporter/harness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/reporter/harness.ts"],"names":[],"mappings":"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"}
@@ -48,11 +48,17 @@ async function setupFixture(suite) {
48
48
  async function setupReporterFixture({ suite, reporterPath, tempPrefix, }) {
49
49
  const fixtureDir = path_1.default.join(TEST_DATA_DIR, suite);
50
50
  const tempDir = await fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), tempPrefix));
51
- const files = await fs_1.default.promises.readdir(fixtureDir);
52
- for (const file of files) {
53
- const src = path_1.default.join(fixtureDir, file);
54
- const dest = path_1.default.join(tempDir, file);
55
- if (file === "playwright.config.ts") {
51
+ const entries = await fs_1.default.promises.readdir(fixtureDir, {
52
+ withFileTypes: true,
53
+ });
54
+ for (const entry of entries) {
55
+ const src = path_1.default.join(fixtureDir, entry.name);
56
+ const dest = path_1.default.join(tempDir, entry.name);
57
+ if (entry.isDirectory()) {
58
+ // Fixtures that put specs under a testDir subdir.
59
+ await fs_1.default.promises.cp(src, dest, { recursive: true });
60
+ }
61
+ else if (entry.name === "playwright.config.ts") {
56
62
  const content = await fs_1.default.promises.readFile(src, "utf8");
57
63
  await fs_1.default.promises.writeFile(dest, content.replace("__REPORTER_PATH__", reporterPath));
58
64
  }
@@ -298,13 +304,19 @@ async function setupParityFixture(suite) {
298
304
  * half of the matrix (the SIGINT helpers above cover interruption).
299
305
  */
300
306
  async function runPlaywrightClean(ctx, opts) {
301
- const child = (0, child_process_1.spawn)(PLAYWRIGHT_BIN, ["test", `--workers=${opts.workers}`], {
307
+ const args = ["test", `--workers=${opts.workers}`];
308
+ if (opts.shard) {
309
+ args.push(`--shard=${opts.shard.current}/${opts.shard.total}`);
310
+ }
311
+ const child = (0, child_process_1.spawn)(PLAYWRIGHT_BIN, args, {
302
312
  cwd: ctx.tempDir,
303
313
  env: {
304
314
  ...process.env,
305
315
  LOCAL_TEST: "false",
306
- SHARD_INDEX: "1",
307
- TOTAL_SHARDS: "1",
316
+ // With --shard, the env vars are cleared on purpose so IBR falls back to
317
+ // the same config.shard the built-in blob reporter sees.
318
+ SHARD_INDEX: opts.shard ? undefined : "1",
319
+ TOTAL_SHARDS: opts.shard ? undefined : "1",
308
320
  FORCE_COLOR: "0",
309
321
  },
310
322
  stdio: ["pipe", "pipe", "pipe"],
@@ -37,6 +37,9 @@ export type TestAnnotation = {
37
37
  description?: string;
38
38
  location?: JsonLocation;
39
39
  };
40
+ export declare function relativeToRootDir(absolutePath: string | undefined, rootDir: string): string | undefined;
41
+ export declare function relativeLocation(location: JsonLocation, rootDir: string): JsonLocation;
42
+ export declare function relativeLocation(location: JsonLocation | undefined, rootDir: string): JsonLocation | undefined;
40
43
  export declare function relativeAnnotationLocations(annotations: TestAnnotation[], rootDir: string): TestAnnotation[];
41
44
  export declare function serializeTest(test: TestCase, rootDir: string): JsonTestCase;
42
45
  export declare function serializeSuite(suite: Suite, rootDir: string): JsonSuite;
@@ -1 +1 @@
1
- {"version":3,"file":"ibr-utils.d.ts","sourceRoot":"","sources":["../../src/reporter/ibr-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAO3E,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC,CAAC;AAIF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAChD,WAAW,EAAE,CAOf;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAC1B,IAAI,EAAE,QAAQ,GACb,MAAM,CAOR;AAID,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAIF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD,CAAC;AAIF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,CAAC,YAAY,GAAG,SAAS,CAAC,EAAE,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB,CAAC;AAIF,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,cAAc,EAAE,EAC7B,OAAO,EAAE,MAAM,GACd,cAAc,EAAE,CAUlB;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAc3E;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAsBvE;AAMD;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,EAChB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC5B,SAAS,GAAG,IAAI,CAqBlB;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAK7D;AAED,wBAAgB,aAAa,CAC3B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,eAAe,CAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAoBf"}
1
+ {"version":3,"file":"ibr-utils.d.ts","sourceRoot":"","sources":["../../src/reporter/ibr-utils.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ exports.serializeRegexPatterns = serializeRegexPatterns;
7
7
  exports.generateId = generateId;
8
8
  exports.getOrCreateId = getOrCreateId;
9
9
  exports.getOrCreateStepId = getOrCreateStepId;
10
+ exports.relativeToRootDir = relativeToRootDir;
11
+ exports.relativeLocation = relativeLocation;
10
12
  exports.relativeAnnotationLocations = relativeAnnotationLocations;
11
13
  exports.serializeTest = serializeTest;
12
14
  exports.serializeSuite = serializeSuite;
@@ -46,17 +48,28 @@ function getOrCreateStepId(map, step) {
46
48
  }
47
49
  return id;
48
50
  }
51
+ // Mirrors _relativePath from Playwright's TeleReporterEmitter: every path in
52
+ // the blob travels relative to config.rootDir (NOT the cwd), because
53
+ // teleReceiver._absolutePath re-joins it onto rootDir on merge.
54
+ // See: packages/playwright/src/reporters/teleEmitter.ts
55
+ function relativeToRootDir(absolutePath, rootDir) {
56
+ if (!absolutePath) {
57
+ return absolutePath;
58
+ }
59
+ return path_1.default.relative(rootDir, absolutePath);
60
+ }
61
+ function relativeLocation(location, rootDir) {
62
+ if (!location) {
63
+ return location;
64
+ }
65
+ return { ...location, file: path_1.default.relative(rootDir, location.file) };
66
+ }
49
67
  // Mirrors _relativeAnnotationLocations from Playwright's TeleReporterEmitter
50
68
  // See: packages/playwright/src/reporters/teleEmitter.ts
51
69
  function relativeAnnotationLocations(annotations, rootDir) {
52
70
  return annotations.map((annotation) => ({
53
71
  ...annotation,
54
- location: annotation.location
55
- ? {
56
- ...annotation.location,
57
- file: path_1.default.relative(rootDir, annotation.location.file),
58
- }
59
- : undefined,
72
+ location: relativeLocation(annotation.location, rootDir),
60
73
  }));
61
74
  }
62
75
  // Mirrors _serializeTest from Playwright's TeleReporterEmitter
@@ -65,11 +78,7 @@ function serializeTest(test, rootDir) {
65
78
  return {
66
79
  testId: test.id,
67
80
  title: test.title,
68
- location: {
69
- file: path_1.default.relative(rootDir, test.location.file),
70
- line: test.location.line,
71
- column: test.location.column,
72
- },
81
+ location: relativeLocation(test.location, rootDir),
73
82
  retries: test.retries,
74
83
  tags: test.tags,
75
84
  repeatEachIndex: test.repeatEachIndex,
@@ -88,13 +97,11 @@ function serializeSuite(suite, rootDir) {
88
97
  }
89
98
  return {
90
99
  title: suite.title,
91
- location: suite.location
92
- ? {
93
- file: path_1.default.relative(rootDir, suite.location.file),
94
- line: suite.location.line,
95
- column: suite.location.column,
96
- }
97
- : { file: "", line: 0, column: 0 },
100
+ location: relativeLocation(suite.location, rootDir) ?? {
101
+ file: "",
102
+ line: 0,
103
+ column: 0,
104
+ },
98
105
  entries,
99
106
  };
100
107
  }
@@ -18,6 +18,7 @@ declare class IncrementalBlobReporter implements Reporter {
18
18
  private _attachmentUrlMap;
19
19
  private _resultIdMap;
20
20
  private _stepIdMap;
21
+ private _knownAttachmentCounts;
21
22
  private _uploader;
22
23
  private _completedTestIds;
23
24
  private _completedResultIds;
@@ -1 +1 @@
1
- {"version":3,"file":"incremental-blob-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/incremental-blob-reporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"incremental-blob-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/incremental-blob-reporter.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ class IncrementalBlobReporter {
24
24
  _attachmentUrlMap = new Map();
25
25
  _resultIdMap = new Map(); // testId+retry -> resultId
26
26
  _stepIdMap = new Map(); // step -> stepId
27
+ _knownAttachmentCounts = new Map(); // resultId -> attachments already sent
27
28
  _uploader = null;
28
29
  _completedTestIds = new Set();
29
30
  _completedResultIds = new Set();
@@ -247,14 +248,14 @@ class IncrementalBlobReporter {
247
248
  this._shardIndex = config.shard.current;
248
249
  this._totalShards = config.shard.total;
249
250
  }
250
- this._appendEvents((0, lifecycle_events_1.buildOnBeginEvents)(config, suite, this._currentWorkingDir, this._shardIndex, this._totalShards));
251
+ this._appendEvents((0, lifecycle_events_1.buildOnBeginEvents)(config, suite, this._shardIndex, this._totalShards));
251
252
  console.log(`[IncrementalBlobReporter] Started with ${suite.allTests().length} tests`);
252
253
  }
253
254
  onTestBegin(test, result) {
254
255
  this._appendEvent((0, lifecycle_events_1.buildOnTestBeginEvent)(test, result, this._resultIdMap));
255
256
  }
256
257
  onTestEnd(test, result) {
257
- const events = (0, lifecycle_events_1.buildOnTestEndEvents)(test, result, this._resultIdMap, this._stagingDir, this._rootDir);
258
+ const events = (0, lifecycle_events_1.buildOnTestEndEvents)(test, result, this._resultIdMap, this._stagingDir, this._rootDir, this._knownAttachmentCounts);
258
259
  if (this._appendEvents(events)) {
259
260
  if (!this._testRetries.has(test.id)) {
260
261
  this._testRetries.set(test.id, test.retries);
@@ -285,10 +286,10 @@ class IncrementalBlobReporter {
285
286
  this._appendEvent((0, lifecycle_events_1.buildOnErrorEvent)(error, workerInfo));
286
287
  }
287
288
  onStepBegin(test, result, step) {
288
- this._appendEvent((0, lifecycle_events_1.buildOnStepBeginEvent)(test, result, step, this._resultIdMap, this._stepIdMap));
289
+ this._appendEvent((0, lifecycle_events_1.buildOnStepBeginEvent)(test, result, step, this._resultIdMap, this._stepIdMap, this._rootDir));
289
290
  }
290
291
  onStepEnd(test, result, step) {
291
- this._appendEvent((0, lifecycle_events_1.buildOnStepEndEvent)(test, result, step, this._resultIdMap, this._stepIdMap, this._rootDir));
292
+ this._appendEvents((0, lifecycle_events_1.buildOnStepEndEvents)(test, result, step, this._resultIdMap, this._stepIdMap, this._rootDir, this._stagingDir, this._knownAttachmentCounts));
292
293
  }
293
294
  async onEnd(result) {
294
295
  this._removeSignalHandler();
@@ -3,13 +3,23 @@ export type JsonEvent = {
3
3
  method: string;
4
4
  params?: object;
5
5
  };
6
- export declare function buildOnBeginEvents(config: FullConfig, suite: Suite, currentWorkingDir: string, shardIndex: number, totalShards: number): JsonEvent[];
7
- export declare function buildOnProjectEvent(config: FullConfig, project: FullProject, projectSuite: Suite, currentWorkingDir: string): JsonEvent;
6
+ export declare function buildOnBeginEvents(config: FullConfig, suite: Suite, shardIndex: number, totalShards: number): JsonEvent[];
7
+ export declare function buildOnProjectEvent(project: FullProject, projectSuite: Suite, rootDir: string): JsonEvent;
8
8
  export declare function buildOnTestBeginEvent(test: TestCase, result: TestResult, resultIdMap: Map<string, string>): JsonEvent;
9
- export declare function buildOnTestEndEvents(test: TestCase, result: TestResult, resultIdMap: Map<string, string>, stagingDir: string, rootDir: string): JsonEvent[];
9
+ /**
10
+ * Mirrors TeleReporterEmitter._sendNewAttachments: whatever was appended to
11
+ * result.attachments since the last call for this result travels as one
12
+ * onAttach, emitted BEFORE the step or test end event that references it.
13
+ *
14
+ * Consumers read step.attachments as indices into result.attachments
15
+ * (TeleTestStep.attachments), resolved at access time — so an attachment that
16
+ * only arrives at test end reads as `undefined` from inside onStepEnd.
17
+ */
18
+ export declare function buildNewAttachmentEvents(test: TestCase, result: TestResult, resultId: string, stagingDir: string, knownAttachmentCounts: Map<string, number>): JsonEvent[];
19
+ export declare function buildOnTestEndEvents(test: TestCase, result: TestResult, resultIdMap: Map<string, string>, stagingDir: string, rootDir: string, knownAttachmentCounts: Map<string, number>): JsonEvent[];
10
20
  export declare function buildOnStdIOEvent(type: "stdout" | "stderr", chunk: string | Buffer, test: TestCase | undefined, result: TestResult | undefined, resultIdMap: Map<string, string>): JsonEvent;
11
21
  export declare function buildOnErrorEvent(error: TestError, workerInfo?: WorkerInfo): JsonEvent;
12
- export declare function buildOnStepBeginEvent(test: TestCase, result: TestResult, step: TestStep, resultIdMap: Map<string, string>, stepIdMap: Map<TestStep, string>): JsonEvent;
13
- export declare function buildOnStepEndEvent(test: TestCase, result: TestResult, step: TestStep, resultIdMap: Map<string, string>, stepIdMap: Map<TestStep, string>, rootDir: string): JsonEvent;
22
+ export declare function buildOnStepBeginEvent(test: TestCase, result: TestResult, step: TestStep, resultIdMap: Map<string, string>, stepIdMap: Map<TestStep, string>, rootDir: string): JsonEvent;
23
+ export declare function buildOnStepEndEvents(test: TestCase, result: TestResult, step: TestStep, resultIdMap: Map<string, string>, stepIdMap: Map<TestStep, string>, rootDir: string, stagingDir: string, knownAttachmentCounts: Map<string, number>): JsonEvent[];
14
24
  export declare function buildOnEndEvent(result: FullResult): JsonEvent;
15
25
  //# sourceMappingURL=lifecycle-events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-events.d.ts","sourceRoot":"","sources":["../../src/reporter/lifecycle-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAiBnC,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,KAAK,EACZ,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,SAAS,EAAE,CAqDb;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,KAAK,EACnB,iBAAiB,EAAE,MAAM,GACxB,SAAS,CA+BX;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,SAAS,CAeX;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,SAAS,EAAE,CA+Db;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,SAAS,CAgBX;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,SAAS,CAcX;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC/B,SAAS,CAsBX;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,MAAM,GACd,SAAS,CA+BX;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAW7D"}
1
+ {"version":3,"file":"lifecycle-events.d.ts","sourceRoot":"","sources":["../../src/reporter/lifecycle-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAmBnC,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,SAAS,EAAE,CAwDb;AAGD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,KAAK,EACnB,OAAO,EAAE,MAAM,GACd,SAAS,CAgCX;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,SAAS,CAeX;AAyBD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,SAAS,EAAE,CAoBb;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,SAAS,EAAE,CA0Cb;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,IAAI,EAAE,QAAQ,GAAG,SAAS,EAC1B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,SAAS,CAgBX;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,EAChB,UAAU,CAAC,EAAE,UAAU,GACtB,SAAS,CAcX;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,MAAM,GACd,SAAS,CAwBX;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,SAAS,EAAE,CAqCb;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAW7D"}
@@ -6,18 +6,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.buildOnBeginEvents = buildOnBeginEvents;
7
7
  exports.buildOnProjectEvent = buildOnProjectEvent;
8
8
  exports.buildOnTestBeginEvent = buildOnTestBeginEvent;
9
+ exports.buildNewAttachmentEvents = buildNewAttachmentEvents;
9
10
  exports.buildOnTestEndEvents = buildOnTestEndEvents;
10
11
  exports.buildOnStdIOEvent = buildOnStdIOEvent;
11
12
  exports.buildOnErrorEvent = buildOnErrorEvent;
12
13
  exports.buildOnStepBeginEvent = buildOnStepBeginEvent;
13
- exports.buildOnStepEndEvent = buildOnStepEndEvent;
14
+ exports.buildOnStepEndEvents = buildOnStepEndEvents;
14
15
  exports.buildOnEndEvent = buildOnEndEvent;
15
16
  const os_1 = __importDefault(require("os"));
16
17
  const path_1 = __importDefault(require("path"));
17
18
  const ibr_utils_1 = require("./ibr-utils");
18
19
  const BLOB_REPORT_VERSION = 2;
19
- function buildOnBeginEvents(config, suite, currentWorkingDir, shardIndex, totalShards) {
20
+ function buildOnBeginEvents(config, suite, shardIndex, totalShards) {
20
21
  const events = [];
22
+ const rootDir = config.rootDir || "";
21
23
  // 1. onBlobReportMetadata
22
24
  const osName = process.platform === "darwin" ? "macOS" : process.platform;
23
25
  const osVersion = os_1.default.release();
@@ -30,24 +32,28 @@ function buildOnBeginEvents(config, suite, currentWorkingDir, shardIndex, totalS
30
32
  pathSeparator: path_1.default.sep,
31
33
  },
32
34
  });
33
- // 2. onConfigure
35
+ // 2. onConfigure — field-for-field mirror of
36
+ // TeleReporterEmitter._serializeConfig.
34
37
  events.push({
35
38
  method: "onConfigure",
36
39
  params: {
37
40
  config: {
38
- configFile: config.configFile
39
- ? path_1.default.relative(currentWorkingDir, config.configFile)
40
- : null,
41
+ configFile: (0, ibr_utils_1.relativeToRootDir)(config.configFile, rootDir),
41
42
  globalTimeout: config.globalTimeout,
42
43
  maxFailures: config.maxFailures,
43
44
  metadata: config.metadata,
44
45
  rootDir: config.rootDir,
46
+ // Round-trips into the merged report's FullConfig: `shard` and
47
+ // `failOnFlakyTests` drive reporter behaviour after the merge, and
48
+ // `tags` carries the config-level global tag.
49
+ shard: config.shard,
45
50
  version: config.version,
46
51
  workers: config.workers,
47
52
  globalSetup: config.globalSetup,
48
53
  globalTeardown: config.globalTeardown,
49
- tags: [],
54
+ tags: config.tags,
50
55
  webServer: config.webServer,
56
+ failOnFlakyTests: config.failOnFlakyTests,
51
57
  },
52
58
  },
53
59
  });
@@ -57,14 +63,14 @@ function buildOnBeginEvents(config, suite, currentWorkingDir, shardIndex, totalS
57
63
  if (!project) {
58
64
  continue;
59
65
  }
60
- events.push(buildOnProjectEvent(config, project, projectSuite, currentWorkingDir));
66
+ events.push(buildOnProjectEvent(project, projectSuite, rootDir));
61
67
  }
62
68
  // 4. onBegin (empty params per Playwright format)
63
69
  events.push({ method: "onBegin" });
64
70
  return events;
65
71
  }
66
- function buildOnProjectEvent(config, project, projectSuite, currentWorkingDir) {
67
- const rootDir = config.rootDir || "";
72
+ // Field-for-field mirror of TeleReporterEmitter._serializeProject.
73
+ function buildOnProjectEvent(project, projectSuite, rootDir) {
68
74
  const suites = [];
69
75
  for (const fileSuite of projectSuite.suites) {
70
76
  suites.push((0, ibr_utils_1.serializeSuite)(fileSuite, rootDir));
@@ -75,21 +81,23 @@ function buildOnProjectEvent(config, project, projectSuite, currentWorkingDir) {
75
81
  project: {
76
82
  metadata: project.metadata,
77
83
  name: project.name,
78
- outputDir: path_1.default.relative(currentWorkingDir, project.outputDir),
84
+ outputDir: (0, ibr_utils_1.relativeToRootDir)(project.outputDir, rootDir),
79
85
  repeatEach: project.repeatEach,
80
86
  retries: project.retries,
81
- testDir: project.testDir,
87
+ testDir: (0, ibr_utils_1.relativeToRootDir)(project.testDir, rootDir),
82
88
  testIgnore: (0, ibr_utils_1.serializeRegexPatterns)(project.testIgnore),
83
89
  testMatch: (0, ibr_utils_1.serializeRegexPatterns)(project.testMatch),
84
90
  timeout: project.timeout,
85
91
  suites,
86
92
  grep: (0, ibr_utils_1.serializeRegexPatterns)(project.grep),
87
- grepInvert: project.grepInvert
88
- ? (0, ibr_utils_1.serializeRegexPatterns)(project.grepInvert)
89
- : [],
93
+ grepInvert: (0, ibr_utils_1.serializeRegexPatterns)(project.grepInvert || []),
90
94
  dependencies: project.dependencies,
91
- snapshotDir: project.snapshotDir,
92
- use: project.use,
95
+ snapshotDir: (0, ibr_utils_1.relativeToRootDir)(project.snapshotDir, rootDir),
96
+ teardown: project.teardown,
97
+ ignoreSnapshots: project.ignoreSnapshots ? true : undefined,
98
+ // Only testIdAttribute crosses the wire: the rest of `use` holds
99
+ // fixture options that need not be JSON-serializable.
100
+ use: { testIdAttribute: project.use.testIdAttribute },
93
101
  },
94
102
  },
95
103
  };
@@ -110,39 +118,56 @@ function buildOnTestBeginEvent(test, result, resultIdMap) {
110
118
  },
111
119
  };
112
120
  }
113
- function buildOnTestEndEvents(test, result, resultIdMap, stagingDir, rootDir) {
114
- const resultId = (0, ibr_utils_1.getOrCreateId)(resultIdMap, `${test.id}-${result.retry}`);
115
- const events = [];
116
- // onAttach for each attachment (matching Playwright's blob format)
117
- for (const attachment of result.attachments) {
118
- const embeddedPath = (0, ibr_utils_1.embedAttachment)(attachment.path, resultId, stagingDir);
119
- let attachmentPath;
120
- if (embeddedPath) {
121
- attachmentPath = embeddedPath;
122
- }
123
- else if (attachment.path) {
124
- attachmentPath = (0, ibr_utils_1.toResourcePath)(attachment.path);
125
- }
126
- events.push({
121
+ // Mirrors TeleReporterEmitter._serializeAttachments.
122
+ function serializeAttachment(attachment, resultId, stagingDir) {
123
+ const embeddedPath = (0, ibr_utils_1.embedAttachment)(attachment.path, resultId, stagingDir);
124
+ let attachmentPath;
125
+ if (embeddedPath) {
126
+ attachmentPath = embeddedPath;
127
+ }
128
+ else if (attachment.path) {
129
+ attachmentPath = (0, ibr_utils_1.toResourcePath)(attachment.path);
130
+ }
131
+ return {
132
+ name: attachment.name,
133
+ contentType: attachment.contentType,
134
+ path: attachmentPath,
135
+ // Body-based attachments travel inline, mirroring
136
+ // TeleReporterEmitter._serializeAttachments.
137
+ base64: attachment.body ? attachment.body.toString("base64") : undefined,
138
+ };
139
+ }
140
+ /**
141
+ * Mirrors TeleReporterEmitter._sendNewAttachments: whatever was appended to
142
+ * result.attachments since the last call for this result travels as one
143
+ * onAttach, emitted BEFORE the step or test end event that references it.
144
+ *
145
+ * Consumers read step.attachments as indices into result.attachments
146
+ * (TeleTestStep.attachments), resolved at access time — so an attachment that
147
+ * only arrives at test end reads as `undefined` from inside onStepEnd.
148
+ */
149
+ function buildNewAttachmentEvents(test, result, resultId, stagingDir, knownAttachmentCounts) {
150
+ const known = knownAttachmentCounts.get(resultId) ?? 0;
151
+ if (result.attachments.length <= known) {
152
+ return [];
153
+ }
154
+ knownAttachmentCounts.set(resultId, result.attachments.length);
155
+ return [
156
+ {
127
157
  method: "onAttach",
128
158
  params: {
129
159
  testId: test.id,
130
160
  resultId,
131
- attachments: [
132
- {
133
- name: attachment.name,
134
- contentType: attachment.contentType,
135
- path: attachmentPath,
136
- // Body-based attachments travel inline, mirroring
137
- // TeleReporterEmitter._serializeAttachments.
138
- base64: attachment.body
139
- ? attachment.body.toString("base64")
140
- : undefined,
141
- },
142
- ],
161
+ attachments: result.attachments
162
+ .slice(known)
163
+ .map((attachment) => serializeAttachment(attachment, resultId, stagingDir)),
143
164
  },
144
- });
145
- }
165
+ },
166
+ ];
167
+ }
168
+ function buildOnTestEndEvents(test, result, resultIdMap, stagingDir, rootDir, knownAttachmentCounts) {
169
+ const resultId = (0, ibr_utils_1.getOrCreateId)(resultIdMap, `${test.id}-${result.retry}`);
170
+ const events = buildNewAttachmentEvents(test, result, resultId, stagingDir, knownAttachmentCounts);
146
171
  events.push({
147
172
  method: "onTestEnd",
148
173
  params: {
@@ -156,12 +181,11 @@ function buildOnTestEndEvents(test, result, resultIdMap, stagingDir, rootDir) {
156
181
  id: resultId,
157
182
  duration: result.duration,
158
183
  status: result.status,
159
- errors: result.errors.map((e) => ({
160
- message: e.message,
161
- stack: e.stack,
162
- location: e.location,
163
- snippet: e.snippet,
164
- })),
184
+ // Raw pass-through, mirroring TeleReporterEmitter._serializeResultEnd:
185
+ // TestError carries more than {message, stack, location, snippet} —
186
+ // `value` for non-Error throws, `cause` chains, AggregateError
187
+ // sub-errors — and subsetting drops them from the merged report.
188
+ errors: result.errors,
165
189
  // Blob v2 carries annotations on the result; the merge reads them
166
190
  // from here (result-level), not from the test payload above.
167
191
  annotations: result.annotations?.length
@@ -170,6 +194,9 @@ function buildOnTestEndEvents(test, result, resultIdMap, stagingDir, rootDir) {
170
194
  },
171
195
  },
172
196
  });
197
+ // Mirrors the emitter, which drops the per-result counters once the result
198
+ // is closed — no further attachments can arrive for it.
199
+ knownAttachmentCounts.delete(resultId);
173
200
  return events;
174
201
  }
175
202
  function buildOnStdIOEvent(type, chunk, test, result, resultIdMap) {
@@ -203,7 +230,7 @@ function buildOnErrorEvent(error, workerInfo) {
203
230
  },
204
231
  };
205
232
  }
206
- function buildOnStepBeginEvent(test, result, step, resultIdMap, stepIdMap) {
233
+ function buildOnStepBeginEvent(test, result, step, resultIdMap, stepIdMap, rootDir) {
207
234
  const resultId = (0, ibr_utils_1.getOrCreateId)(resultIdMap, `${test.id}-${result.retry}`);
208
235
  const stepId = (0, ibr_utils_1.getOrCreateStepId)(stepIdMap, step);
209
236
  const parentStepId = step.parent
@@ -220,15 +247,20 @@ function buildOnStepBeginEvent(test, result, step, resultIdMap, stepIdMap) {
220
247
  title: step.title,
221
248
  category: step.category,
222
249
  startTime: step.startTime.getTime(),
223
- location: step.location,
250
+ // Relative to rootDir like every other location in the blob; the
251
+ // merged HTML report renders this path as-is.
252
+ location: (0, ibr_utils_1.relativeLocation)(step.location, rootDir),
224
253
  },
225
254
  },
226
255
  };
227
256
  }
228
- function buildOnStepEndEvent(test, result, step, resultIdMap, stepIdMap, rootDir) {
257
+ function buildOnStepEndEvents(test, result, step, resultIdMap, stepIdMap, rootDir, stagingDir, knownAttachmentCounts) {
229
258
  const resultId = (0, ibr_utils_1.getOrCreateId)(resultIdMap, `${test.id}-${result.retry}`);
230
259
  const stepId = (0, ibr_utils_1.getOrCreateStepId)(stepIdMap, step);
231
- return {
260
+ // Anything the step attached has to reach the receiver before the step end
261
+ // that indexes into it.
262
+ const events = buildNewAttachmentEvents(test, result, resultId, stagingDir, knownAttachmentCounts);
263
+ events.push({
232
264
  method: "onStepEnd",
233
265
  params: {
234
266
  testId: test.id,
@@ -236,14 +268,8 @@ function buildOnStepEndEvent(test, result, step, resultIdMap, stepIdMap, rootDir
236
268
  step: {
237
269
  id: stepId,
238
270
  duration: step.duration,
239
- error: step.error
240
- ? {
241
- message: step.error.message,
242
- stack: step.error.stack,
243
- location: step.error.location,
244
- snippet: step.error.snippet,
245
- }
246
- : undefined,
271
+ // Raw pass-through, like the result errors above.
272
+ error: step.error,
247
273
  // Indices into the result's attachments, matching
248
274
  // TeleReporterEmitter._serializeStepEnd.
249
275
  attachments: step.attachments.length
@@ -254,7 +280,8 @@ function buildOnStepEndEvent(test, result, step, resultIdMap, stepIdMap, rootDir
254
280
  : undefined,
255
281
  },
256
282
  },
257
- };
283
+ });
284
+ return events;
258
285
  }
259
286
  function buildOnEndEvent(result) {
260
287
  return {
@@ -58,6 +58,27 @@ export declare function normalizeJsonReport(report: Record<string, unknown>, opt
58
58
  * The merged JSON report drops steps, so step parity is checked here.
59
59
  */
60
60
  export declare function stepSignatures(events: BlobEvent[]): Map<string, string[]>;
61
+ /**
62
+ * What a reporter would see for `step.attachments` DURING onStepEnd, replayed
63
+ * from the raw event stream the way teleReceiver does it: onAttach pushes onto
64
+ * `result.attachments`, and a step end carries indices into that array
65
+ * (TeleTestStep.attachments resolves them at access time). An attachment that
66
+ * only arrives at test end therefore reads as `<missing>` here.
67
+ *
68
+ * Keyed by `testId:retry`; each entry is one `title -> [names]` line per
69
+ * onStepEnd, in stream order.
70
+ */
71
+ export declare function stepAttachmentsAtStepEnd(events: BlobEvent[]): Map<string, string[]>;
72
+ /**
73
+ * The onConfigure config payload plus every onProject project payload, keyed
74
+ * by project name. The merged report's FullConfig/FullProject is rebuilt from
75
+ * exactly these, and normalizeJsonReport compares only the suite/stats body —
76
+ * so this is where config and project serialization drift shows up.
77
+ */
78
+ export declare function configAndProjects(events: BlobEvent[]): {
79
+ config: unknown;
80
+ projects: Record<string, unknown>;
81
+ };
61
82
  /** Event method names present in `reference` but absent from `candidate`. */
62
83
  export declare function missingEventMethods(reference: BlobEvent[], candidate: BlobEvent[]): string[];
63
84
  //# sourceMappingURL=parity-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parity-utils.d.ts","sourceRoot":"","sources":["../../src/reporter/parity-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAiD3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAwED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,gBAAgB,GACrB,gBAAgB,CAclB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA+BzE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EAAE,EACtB,SAAS,EAAE,SAAS,EAAE,GACrB,MAAM,EAAE,CASV"}
1
+ {"version":3,"file":"parity-utils.d.ts","sourceRoot":"","sources":["../../src/reporter/parity-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAiD3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtD,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAwED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,gBAAgB,GACrB,gBAAgB,CAclB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAwCzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EAAE,GAClB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAgDvB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG;IACtD,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAYA;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EAAE,EACtB,SAAS,EAAE,SAAS,EAAE,GACrB,MAAM,EAAE,CASV"}