@nsxbet/playwright-orchestrator 0.8.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -7
- package/dist/commands/assign.d.ts +1 -10
- package/dist/commands/assign.d.ts.map +1 -1
- package/dist/commands/assign.js +16 -188
- package/dist/commands/assign.js.map +1 -1
- package/dist/commands/extract-timing.d.ts +21 -7
- package/dist/commands/extract-timing.d.ts.map +1 -1
- package/dist/commands/extract-timing.js +105 -22
- package/dist/commands/extract-timing.js.map +1 -1
- package/dist/commands/filter-report.d.ts +19 -0
- package/dist/commands/filter-report.d.ts.map +1 -0
- package/dist/commands/filter-report.js +103 -0
- package/dist/commands/filter-report.js.map +1 -0
- package/dist/fixture.d.ts +0 -10
- package/dist/fixture.d.ts.map +1 -1
- package/dist/fixture.js +0 -36
- package/dist/fixture.js.map +1 -1
- package/dist/reporter.d.ts +26 -0
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +120 -0
- package/dist/reporter.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,9 @@ ORCHESTRATOR_SHARD_FILE=shard-1.json bunx playwright test --project "Mobile Chro
|
|
|
63
63
|
# Extract timing from report after tests complete
|
|
64
64
|
bunx playwright-orchestrator extract-timing \
|
|
65
65
|
--report-file ./playwright-report/results.json \
|
|
66
|
-
--output-file ./shard-1-timing.json
|
|
66
|
+
--output-file ./shard-1-timing.json \
|
|
67
|
+
--shard-file ./shard-1.json \
|
|
68
|
+
--project "Mobile Chrome"
|
|
67
69
|
|
|
68
70
|
# Merge timing data from all shards
|
|
69
71
|
bunx playwright-orchestrator merge-timing \
|
|
@@ -99,10 +101,18 @@ For test-level distribution to work, you need **two things**:
|
|
|
99
101
|
import { defineConfig } from "@playwright/test";
|
|
100
102
|
|
|
101
103
|
export default defineConfig({
|
|
102
|
-
reporter: [
|
|
104
|
+
reporter: [
|
|
105
|
+
["@nsxbet/playwright-orchestrator/reporter", {
|
|
106
|
+
filterJson: "playwright-report/results.json",
|
|
107
|
+
}],
|
|
108
|
+
["json", { outputFile: "playwright-report/results.json" }],
|
|
109
|
+
["html"],
|
|
110
|
+
],
|
|
103
111
|
});
|
|
104
112
|
```
|
|
105
113
|
|
|
114
|
+
The `filterJson` option (optional) tells the reporter to rewrite the JSON report after tests complete, removing specs not assigned to this shard. This keeps per-shard reports clean and prevents timing corruption from zero-duration orchestrator-skipped entries.
|
|
115
|
+
|
|
106
116
|
### 2. Test Fixture (in your test setup file)
|
|
107
117
|
|
|
108
118
|
Wrap your base test with `withOrchestratorFilter`:
|
|
@@ -223,11 +233,12 @@ See [docs/external-integration.md](./docs/external-integration.md) for complete
|
|
|
223
233
|
|
|
224
234
|
## CLI Commands
|
|
225
235
|
|
|
226
|
-
| Command | Description
|
|
227
|
-
| ---------------- |
|
|
228
|
-
| `assign` | Distribute tests across shards
|
|
229
|
-
| `extract-timing` | Extract timing from Playwright report
|
|
230
|
-
| `merge-timing` | Merge timing data with EMA smoothing
|
|
236
|
+
| Command | Description |
|
|
237
|
+
| ---------------- | --------------------------------------------------------- |
|
|
238
|
+
| `assign` | Distribute tests across shards |
|
|
239
|
+
| `extract-timing` | Extract timing from Playwright report |
|
|
240
|
+
| `merge-timing` | Merge timing data with EMA smoothing |
|
|
241
|
+
| `filter-report` | Remove orchestrator-skipped tests from merged JSON report |
|
|
231
242
|
|
|
232
243
|
Run `playwright-orchestrator <command> --help` for details.
|
|
233
244
|
|
|
@@ -3,24 +3,15 @@ export default class Assign extends Command {
|
|
|
3
3
|
static description: string;
|
|
4
4
|
static examples: string[];
|
|
5
5
|
static flags: {
|
|
6
|
-
'test-
|
|
7
|
-
'test-list': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
6
|
+
'test-list': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
7
|
'timing-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
8
|
shards: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
9
|
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
10
|
'output-format': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
-
'fallback-ms-per-line': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
11
|
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
-
'glob-pattern': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
-
level: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
12
|
timeout: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
-
'use-fallback': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
18
|
-
'config-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
13
|
};
|
|
20
14
|
run(): Promise<void>;
|
|
21
|
-
private runTestLevel;
|
|
22
|
-
private runFileLevel;
|
|
23
|
-
private outputTestResult;
|
|
24
15
|
private outputResult;
|
|
25
16
|
private formatDuration;
|
|
26
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"assign.d.ts","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAa7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,WAAW,SACgC;IAE3D,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;;;;;MAkCnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAkF1B,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,cAAc;CAQvB"}
|
package/dist/commands/assign.js
CHANGED
|
@@ -1,22 +1,16 @@
|
|
|
1
1
|
import * as path from 'node:path';
|
|
2
2
|
import { Command, Flags } from '@oclif/core';
|
|
3
|
-
import {
|
|
4
|
-
import { assignWithCKK, assignWithLPT, DEFAULT_CKK_TIMEOUT, DEFAULT_MS_PER_LINE, discoverTests, discoverTestsFromFiles, estimateDuration, formatAssignResult, getFileDuration, getTestDurations, loadTestListFromFile, loadTimingData, } from '../core/index.js';
|
|
3
|
+
import { assignWithCKK, DEFAULT_CKK_TIMEOUT, getTestDurations, loadTestListFromFile, loadTimingData, } from '../core/index.js';
|
|
5
4
|
export default class Assign extends Command {
|
|
6
|
-
static description = 'Assign
|
|
5
|
+
static description = 'Assign tests to shards based on historical timing data';
|
|
7
6
|
static examples = [
|
|
8
|
-
'<%= config.bin %> assign --test-
|
|
9
|
-
'<%= config.bin %> assign --test-
|
|
10
|
-
'<%= config.bin %> assign --test-dir ./e2e --shards 4 --level test --timeout 500',
|
|
7
|
+
'<%= config.bin %> assign --test-list ./test-list.json --shards 4',
|
|
8
|
+
'<%= config.bin %> assign --test-list ./test-list.json --timing-file ./timing.json --shards 4 --output-format json',
|
|
11
9
|
];
|
|
12
10
|
static flags = {
|
|
13
|
-
'test-dir': Flags.string({
|
|
14
|
-
char: 'd',
|
|
15
|
-
description: 'Path to test directory containing spec files',
|
|
16
|
-
required: false, // Not required when using --test-list
|
|
17
|
-
}),
|
|
18
11
|
'test-list': Flags.string({
|
|
19
|
-
description: 'Path to JSON file with test list (from playwright --list --reporter=json)
|
|
12
|
+
description: 'Path to JSON file with test list (from npx playwright test --list --reporter=json)',
|
|
13
|
+
required: true,
|
|
20
14
|
}),
|
|
21
15
|
'timing-file': Flags.string({
|
|
22
16
|
char: 't',
|
|
@@ -29,7 +23,7 @@ export default class Assign extends Command {
|
|
|
29
23
|
}),
|
|
30
24
|
project: Flags.string({
|
|
31
25
|
char: 'p',
|
|
32
|
-
description: 'Playwright project name (for
|
|
26
|
+
description: 'Playwright project name (for multi-project configs)',
|
|
33
27
|
}),
|
|
34
28
|
'output-format': Flags.string({
|
|
35
29
|
char: 'f',
|
|
@@ -37,101 +31,26 @@ export default class Assign extends Command {
|
|
|
37
31
|
default: 'json',
|
|
38
32
|
options: ['json', 'text'],
|
|
39
33
|
}),
|
|
40
|
-
'fallback-ms-per-line': Flags.integer({
|
|
41
|
-
description: 'Milliseconds per line for duration estimation',
|
|
42
|
-
default: DEFAULT_MS_PER_LINE,
|
|
43
|
-
}),
|
|
44
34
|
verbose: Flags.boolean({
|
|
45
35
|
char: 'v',
|
|
46
36
|
description: 'Show verbose output',
|
|
47
37
|
default: false,
|
|
48
38
|
}),
|
|
49
|
-
'glob-pattern': Flags.string({
|
|
50
|
-
description: 'Glob pattern for test files',
|
|
51
|
-
default: '**/*.spec.ts',
|
|
52
|
-
}),
|
|
53
|
-
level: Flags.string({
|
|
54
|
-
char: 'l',
|
|
55
|
-
description: 'Distribution level: file or test',
|
|
56
|
-
default: 'test',
|
|
57
|
-
options: ['file', 'test'],
|
|
58
|
-
}),
|
|
59
39
|
timeout: Flags.integer({
|
|
60
|
-
description: 'CKK algorithm timeout in milliseconds
|
|
40
|
+
description: 'CKK algorithm timeout in milliseconds',
|
|
61
41
|
default: DEFAULT_CKK_TIMEOUT,
|
|
62
42
|
}),
|
|
63
|
-
'use-fallback': Flags.boolean({
|
|
64
|
-
description: 'Use file parsing instead of Playwright --list for test discovery',
|
|
65
|
-
default: false,
|
|
66
|
-
}),
|
|
67
|
-
'config-dir': Flags.string({
|
|
68
|
-
char: 'c',
|
|
69
|
-
description: 'Directory where playwright.config.ts is located (defaults to test-dir)',
|
|
70
|
-
}),
|
|
71
43
|
};
|
|
72
44
|
async run() {
|
|
73
45
|
const { flags } = await this.parse(Assign);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const testDir = flags['test-dir'] ? path.resolve(flags['test-dir']) : '';
|
|
79
|
-
const pattern = flags['glob-pattern'];
|
|
80
|
-
if (flags.level === 'test') {
|
|
81
|
-
await this.runTestLevel(testDir, pattern, {
|
|
82
|
-
...flags,
|
|
83
|
-
project: flags.project,
|
|
84
|
-
'use-fallback': flags['use-fallback'],
|
|
85
|
-
'config-dir': flags['config-dir'],
|
|
86
|
-
'test-list': flags['test-list'],
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
if (flags['test-list']) {
|
|
91
|
-
this.error('--test-list is only supported with --level test');
|
|
92
|
-
}
|
|
93
|
-
await this.runFileLevel(testDir, pattern, flags);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
async runTestLevel(testDir, pattern, flags) {
|
|
97
|
-
// Discover tests - prefer pre-generated test list, then Playwright --list, then file parsing
|
|
98
|
-
let tests;
|
|
99
|
-
if (flags['test-list']) {
|
|
100
|
-
// Use pre-generated test list file (most reliable in CI)
|
|
101
|
-
const testListPath = path.resolve(flags['test-list']);
|
|
102
|
-
tests = loadTestListFromFile(testListPath, flags.project);
|
|
103
|
-
if (flags.verbose) {
|
|
104
|
-
this.log(`Using pre-generated test list from ${testListPath}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
else if (flags['use-fallback']) {
|
|
108
|
-
// Explicit fallback requested
|
|
109
|
-
tests = discoverTestsFromFiles(testDir, pattern);
|
|
110
|
-
if (flags.verbose) {
|
|
111
|
-
this.log('Using file parsing for test discovery (--use-fallback)');
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
try {
|
|
116
|
-
// Try Playwright --list first (handles parameterized tests correctly)
|
|
117
|
-
// Use config-dir if provided, otherwise use test-dir
|
|
118
|
-
tests = discoverTests(testDir, flags.project, flags['config-dir']);
|
|
119
|
-
if (flags.verbose) {
|
|
120
|
-
this.log('Using Playwright --list for test discovery (accurate, includes parameterized tests)');
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
// Fallback to file parsing if Playwright --list fails
|
|
125
|
-
if (flags.verbose) {
|
|
126
|
-
this.warn('Playwright --list failed, falling back to file parsing (may miss parameterized tests)');
|
|
127
|
-
}
|
|
128
|
-
tests = discoverTestsFromFiles(testDir, pattern);
|
|
129
|
-
}
|
|
46
|
+
const testListPath = path.resolve(flags['test-list']);
|
|
47
|
+
const tests = loadTestListFromFile(testListPath, flags.project);
|
|
48
|
+
if (flags.verbose) {
|
|
49
|
+
this.log(`Loaded ${tests.length} tests from ${testListPath}`);
|
|
130
50
|
}
|
|
131
51
|
if (tests.length === 0) {
|
|
132
|
-
|
|
133
|
-
this.
|
|
134
|
-
this.outputTestResult({
|
|
52
|
+
this.warn(`No tests found in ${testListPath}`);
|
|
53
|
+
this.outputResult({
|
|
135
54
|
shards: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, []])),
|
|
136
55
|
expectedDurations: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, 0])),
|
|
137
56
|
totalTests: 0,
|
|
@@ -140,15 +59,10 @@ export default class Assign extends Command {
|
|
|
140
59
|
}, flags['output-format']);
|
|
141
60
|
return;
|
|
142
61
|
}
|
|
143
|
-
if (flags.verbose) {
|
|
144
|
-
this.log(`Found ${tests.length} tests in ${testDir}`);
|
|
145
|
-
}
|
|
146
|
-
// Load timing data if available
|
|
147
62
|
let timingData = null;
|
|
148
63
|
if (flags['timing-file']) {
|
|
149
64
|
timingData = loadTimingData(flags['timing-file']);
|
|
150
65
|
}
|
|
151
|
-
// Get test durations
|
|
152
66
|
const testsWithDurations = getTestDurations(tests, timingData);
|
|
153
67
|
const estimatedTests = testsWithDurations
|
|
154
68
|
.filter((t) => t.estimated)
|
|
@@ -156,25 +70,21 @@ export default class Assign extends Command {
|
|
|
156
70
|
if (flags.verbose && estimatedTests.length > 0) {
|
|
157
71
|
this.log(`Estimated duration for ${estimatedTests.length} tests (no historical data)`);
|
|
158
72
|
}
|
|
159
|
-
// Convert to TestWithDuration format
|
|
160
73
|
const testInputs = testsWithDurations.map((t) => ({
|
|
161
74
|
testId: t.testId,
|
|
162
75
|
file: t.file,
|
|
163
76
|
duration: t.duration,
|
|
164
77
|
estimated: t.estimated,
|
|
165
78
|
}));
|
|
166
|
-
// Run CKK algorithm
|
|
167
79
|
const ckkResult = assignWithCKK(testInputs, flags.shards, flags.timeout);
|
|
168
80
|
if (flags.verbose) {
|
|
169
81
|
this.log(`Assignment ${ckkResult.isOptimal ? 'optimal' : 'near-optimal (LPT fallback)'}`);
|
|
170
82
|
this.log(`Makespan: ${this.formatDuration(ckkResult.makespan)}`);
|
|
171
83
|
}
|
|
172
|
-
// Build shard assignments
|
|
173
84
|
const shardTests = {};
|
|
174
85
|
for (const assignment of ckkResult.assignments) {
|
|
175
86
|
shardTests[assignment.shardIndex] = assignment.tests;
|
|
176
87
|
}
|
|
177
|
-
// Build result
|
|
178
88
|
const result = {
|
|
179
89
|
shards: shardTests,
|
|
180
90
|
expectedDurations: Object.fromEntries(ckkResult.assignments.map((a) => [a.shardIndex, a.expectedDuration])),
|
|
@@ -182,73 +92,14 @@ export default class Assign extends Command {
|
|
|
182
92
|
estimatedTests,
|
|
183
93
|
isOptimal: ckkResult.isOptimal,
|
|
184
94
|
};
|
|
185
|
-
this.outputTestResult(result, flags['output-format'], flags.verbose);
|
|
186
|
-
}
|
|
187
|
-
async runFileLevel(testDir, pattern, flags) {
|
|
188
|
-
// Find all test files
|
|
189
|
-
const testFiles = await glob(pattern, {
|
|
190
|
-
cwd: testDir,
|
|
191
|
-
nodir: true,
|
|
192
|
-
});
|
|
193
|
-
if (testFiles.length === 0) {
|
|
194
|
-
this.warn(`No test files found in ${testDir} matching ${pattern}`);
|
|
195
|
-
this.outputResult({
|
|
196
|
-
shards: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, []])),
|
|
197
|
-
expectedDurations: Object.fromEntries(Array.from({ length: flags.shards }, (_, i) => [i + 1, 0])),
|
|
198
|
-
totalFiles: 0,
|
|
199
|
-
estimatedFiles: [],
|
|
200
|
-
}, flags['output-format']);
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (flags.verbose) {
|
|
204
|
-
this.log(`Found ${testFiles.length} test files in ${testDir}`);
|
|
205
|
-
}
|
|
206
|
-
// Load timing data if available
|
|
207
|
-
const timingData = flags['timing-file']
|
|
208
|
-
? loadTimingData(flags['timing-file'])
|
|
209
|
-
: null;
|
|
210
|
-
// Build file list with durations
|
|
211
|
-
const filesWithDurations = [];
|
|
212
|
-
const estimatedFiles = [];
|
|
213
|
-
for (const file of testFiles) {
|
|
214
|
-
const historicalDuration = timingData
|
|
215
|
-
? getFileDuration(timingData, file)
|
|
216
|
-
: undefined;
|
|
217
|
-
if (historicalDuration !== undefined) {
|
|
218
|
-
filesWithDurations.push({
|
|
219
|
-
file,
|
|
220
|
-
duration: historicalDuration,
|
|
221
|
-
estimated: false,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
// Estimate based on line count
|
|
226
|
-
const fullPath = path.join(testDir, file);
|
|
227
|
-
const estimated = estimateDuration(fullPath, flags['fallback-ms-per-line']);
|
|
228
|
-
filesWithDurations.push({
|
|
229
|
-
file,
|
|
230
|
-
duration: estimated,
|
|
231
|
-
estimated: true,
|
|
232
|
-
});
|
|
233
|
-
estimatedFiles.push(file);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
if (flags.verbose && estimatedFiles.length > 0) {
|
|
237
|
-
this.log(`Estimated duration for ${estimatedFiles.length} files (no historical data)`);
|
|
238
|
-
}
|
|
239
|
-
// Run LPT algorithm
|
|
240
|
-
const assignments = assignWithLPT(filesWithDurations, flags.shards);
|
|
241
|
-
const result = formatAssignResult(assignments, estimatedFiles);
|
|
242
|
-
// Output result
|
|
243
95
|
this.outputResult(result, flags['output-format'], flags.verbose);
|
|
244
96
|
}
|
|
245
|
-
|
|
97
|
+
outputResult(result, format, verbose = false) {
|
|
246
98
|
if (format === 'json') {
|
|
247
99
|
this.log(JSON.stringify(result));
|
|
248
100
|
}
|
|
249
101
|
else {
|
|
250
|
-
|
|
251
|
-
this.log('\n=== Shard Assignments (Test-Level) ===\n');
|
|
102
|
+
this.log('\n=== Shard Assignments ===\n');
|
|
252
103
|
for (const [shard, tests] of Object.entries(result.shards)) {
|
|
253
104
|
const duration = result.expectedDurations[Number(shard)];
|
|
254
105
|
const durationStr = this.formatDuration(duration ?? 0);
|
|
@@ -268,29 +119,6 @@ export default class Assign extends Command {
|
|
|
268
119
|
}
|
|
269
120
|
}
|
|
270
121
|
}
|
|
271
|
-
outputResult(result, format, _verbose = false) {
|
|
272
|
-
if (format === 'json') {
|
|
273
|
-
this.log(JSON.stringify(result));
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
// Text format
|
|
277
|
-
this.log('\n=== Shard Assignments (File-Level) ===\n');
|
|
278
|
-
for (const [shard, files] of Object.entries(result.shards)) {
|
|
279
|
-
const duration = result.expectedDurations[Number(shard)];
|
|
280
|
-
const durationStr = this.formatDuration(duration ?? 0);
|
|
281
|
-
this.log(`Shard ${shard} (${durationStr}):`);
|
|
282
|
-
for (const file of files) {
|
|
283
|
-
const isEstimated = result.estimatedFiles.includes(file);
|
|
284
|
-
this.log(` - ${file}${isEstimated ? ' (estimated)' : ''}`);
|
|
285
|
-
}
|
|
286
|
-
this.log('');
|
|
287
|
-
}
|
|
288
|
-
this.log(`Total files: ${result.totalFiles}`);
|
|
289
|
-
if (result.estimatedFiles.length > 0) {
|
|
290
|
-
this.log(`Files with estimated duration: ${result.estimatedFiles.length}`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
122
|
formatDuration(ms) {
|
|
295
123
|
const seconds = Math.round(ms / 1000);
|
|
296
124
|
const minutes = Math.floor(seconds / 60);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assign.js","sourceRoot":"","sources":["../../src/commands/assign.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,11 @@ export default class ExtractTiming extends Command {
|
|
|
7
7
|
'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
8
|
shard: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
9
|
project: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
'shard-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
11
|
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
12
|
};
|
|
12
|
-
private
|
|
13
|
+
private testDir;
|
|
14
|
+
private rootDir;
|
|
13
15
|
run(): Promise<void>;
|
|
14
16
|
/**
|
|
15
17
|
* Extract test-level durations from Playwright report
|
|
@@ -19,19 +21,31 @@ export default class ExtractTiming extends Command {
|
|
|
19
21
|
private extractTestDurations;
|
|
20
22
|
/**
|
|
21
23
|
* Recursively extract test durations from a suite
|
|
24
|
+
*
|
|
25
|
+
* @param suite - Playwright suite from JSON report
|
|
26
|
+
* @param parentTitles - Title path from parent suites (describe blocks)
|
|
27
|
+
* @param testDurations - Map to collect test durations
|
|
28
|
+
* @param isRootSuite - Whether this is a root file suite (title is filename, should be skipped)
|
|
22
29
|
*/
|
|
23
30
|
private extractTestsFromSuite;
|
|
24
31
|
/**
|
|
25
|
-
* Normalize file path to be relative
|
|
26
|
-
*
|
|
32
|
+
* Normalize file path to be relative to testDir.
|
|
33
|
+
*
|
|
34
|
+
* DETERMINISTIC APPROACH:
|
|
35
|
+
* 1. suite.file in Playwright report is always relative to rootDir
|
|
36
|
+
* 2. testDir is either absolute or relative to rootDir
|
|
37
|
+
* 3. We resolve both to get absolute paths, then compute relative path
|
|
38
|
+
*
|
|
39
|
+
* This ensures consistent test IDs regardless of container path differences.
|
|
27
40
|
*/
|
|
28
41
|
private normalizeFilePath;
|
|
29
42
|
/**
|
|
30
|
-
* Extract
|
|
43
|
+
* Extract rootDir and testDir from Playwright report config.
|
|
31
44
|
*
|
|
32
|
-
* CRITICAL:
|
|
33
|
-
*
|
|
45
|
+
* CRITICAL: We need both paths to correctly resolve file locations:
|
|
46
|
+
* - rootDir: where playwright.config.ts is located (absolute)
|
|
47
|
+
* - testDir: where tests are located (can be relative to rootDir)
|
|
34
48
|
*/
|
|
35
|
-
private
|
|
49
|
+
private getPathsFromReport;
|
|
36
50
|
}
|
|
37
51
|
//# sourceMappingURL=extract-timing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-timing.d.ts","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,OAAgB,WAAW,SACyB;IAEpD,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK
|
|
1
|
+
{"version":3,"file":"extract-timing.d.ts","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,OAAgB,WAAW,SACyB;IAEpD,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;;;;MA8BnB;IAGF,OAAO,CAAC,OAAO,CAAc;IAE7B,OAAO,CAAC,OAAO,CAAc;IAEvB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAoF1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAmD7B;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAoD3B"}
|
|
@@ -26,7 +26,11 @@ export default class ExtractTiming extends Command {
|
|
|
26
26
|
project: Flags.string({
|
|
27
27
|
char: 'p',
|
|
28
28
|
description: 'Playwright project name',
|
|
29
|
-
|
|
29
|
+
required: true,
|
|
30
|
+
}),
|
|
31
|
+
'shard-file': Flags.string({
|
|
32
|
+
description: 'Path to shard JSON file — only extract timing for tests in this file',
|
|
33
|
+
required: true,
|
|
30
34
|
}),
|
|
31
35
|
verbose: Flags.boolean({
|
|
32
36
|
char: 'v',
|
|
@@ -34,8 +38,10 @@ export default class ExtractTiming extends Command {
|
|
|
34
38
|
default: false,
|
|
35
39
|
}),
|
|
36
40
|
};
|
|
37
|
-
// Base directory for path resolution (
|
|
38
|
-
|
|
41
|
+
// Base directory for path resolution (resolved testDir)
|
|
42
|
+
testDir = '';
|
|
43
|
+
// Root directory from Playwright config (where config file is)
|
|
44
|
+
rootDir = '';
|
|
39
45
|
async run() {
|
|
40
46
|
const { flags } = await this.parse(ExtractTiming);
|
|
41
47
|
// Read Playwright report
|
|
@@ -48,14 +54,42 @@ export default class ExtractTiming extends Command {
|
|
|
48
54
|
catch {
|
|
49
55
|
this.error(`Failed to read Playwright report: ${reportPath}`);
|
|
50
56
|
}
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
this.
|
|
57
|
+
// Extract rootDir and testDir from report config
|
|
58
|
+
const { rootDir, testDir } = this.getPathsFromReport(report, flags.project);
|
|
59
|
+
this.rootDir = rootDir;
|
|
60
|
+
this.testDir = testDir;
|
|
54
61
|
if (flags.verbose) {
|
|
55
|
-
this.log(`Using
|
|
62
|
+
this.log(`Using rootDir: ${this.rootDir}`);
|
|
63
|
+
this.log(`Using testDir: ${this.testDir}`);
|
|
56
64
|
}
|
|
57
65
|
// Extract test-level durations
|
|
58
66
|
const testDurations = this.extractTestDurations(report);
|
|
67
|
+
// Filter by shard file (required)
|
|
68
|
+
const shardFilePath = path.resolve(flags['shard-file']);
|
|
69
|
+
if (!fs.existsSync(shardFilePath)) {
|
|
70
|
+
this.error(`Shard file not found: ${shardFilePath}`);
|
|
71
|
+
}
|
|
72
|
+
let shardIds;
|
|
73
|
+
try {
|
|
74
|
+
shardIds = JSON.parse(fs.readFileSync(shardFilePath, 'utf-8'));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
this.error(`Failed to parse shard file: ${shardFilePath}`);
|
|
78
|
+
}
|
|
79
|
+
if (!Array.isArray(shardIds)) {
|
|
80
|
+
this.error(`Shard file must contain a JSON array: ${shardFilePath}`);
|
|
81
|
+
}
|
|
82
|
+
const allowed = new Set(shardIds);
|
|
83
|
+
const beforeCount = Object.keys(testDurations).length;
|
|
84
|
+
for (const testId of Object.keys(testDurations)) {
|
|
85
|
+
if (!allowed.has(testId)) {
|
|
86
|
+
delete testDurations[testId];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (flags.verbose) {
|
|
90
|
+
const afterCount = Object.keys(testDurations).length;
|
|
91
|
+
this.log(`Filtered by shard file: ${beforeCount} → ${afterCount} tests (removed ${beforeCount - afterCount})`);
|
|
92
|
+
}
|
|
59
93
|
if (flags.verbose) {
|
|
60
94
|
this.log(`Extracted timing for ${Object.keys(testDurations).length} tests`);
|
|
61
95
|
}
|
|
@@ -85,16 +119,27 @@ export default class ExtractTiming extends Command {
|
|
|
85
119
|
extractTestDurations(report) {
|
|
86
120
|
const testDurations = {};
|
|
87
121
|
for (const suite of report.suites) {
|
|
88
|
-
|
|
122
|
+
// Root suites represent files - their title is the filename
|
|
123
|
+
// We skip this title from titlePath since it's redundant with file
|
|
124
|
+
// This matches test-discovery.ts behavior
|
|
125
|
+
this.extractTestsFromSuite(suite, [], testDurations, true);
|
|
89
126
|
}
|
|
90
127
|
return testDurations;
|
|
91
128
|
}
|
|
92
129
|
/**
|
|
93
130
|
* Recursively extract test durations from a suite
|
|
131
|
+
*
|
|
132
|
+
* @param suite - Playwright suite from JSON report
|
|
133
|
+
* @param parentTitles - Title path from parent suites (describe blocks)
|
|
134
|
+
* @param testDurations - Map to collect test durations
|
|
135
|
+
* @param isRootSuite - Whether this is a root file suite (title is filename, should be skipped)
|
|
94
136
|
*/
|
|
95
|
-
extractTestsFromSuite(suite, parentTitles, testDurations) {
|
|
137
|
+
extractTestsFromSuite(suite, parentTitles, testDurations, isRootSuite = false) {
|
|
96
138
|
const file = this.normalizeFilePath(suite.file);
|
|
97
|
-
|
|
139
|
+
// Root suites have the filename as title - skip it from titlePath
|
|
140
|
+
// Nested suites (describe blocks) have meaningful titles to include
|
|
141
|
+
// This matches test-discovery.ts behavior exactly
|
|
142
|
+
const currentTitles = !isRootSuite && suite.title && suite.title !== ''
|
|
98
143
|
? [...parentTitles, suite.title]
|
|
99
144
|
: parentTitles;
|
|
100
145
|
// Process specs (actual tests)
|
|
@@ -112,7 +157,7 @@ export default class ExtractTiming extends Command {
|
|
|
112
157
|
testDurations[testId] = totalDuration;
|
|
113
158
|
}
|
|
114
159
|
}
|
|
115
|
-
// Process nested suites
|
|
160
|
+
// Process nested suites (describe blocks - never root suites)
|
|
116
161
|
if (suite.suites) {
|
|
117
162
|
for (const nestedSuite of suite.suites) {
|
|
118
163
|
// Pass the file from parent if nested suite doesn't have one
|
|
@@ -120,29 +165,65 @@ export default class ExtractTiming extends Command {
|
|
|
120
165
|
...nestedSuite,
|
|
121
166
|
file: nestedSuite.file || suite.file,
|
|
122
167
|
};
|
|
123
|
-
this.extractTestsFromSuite(nestedWithFile, currentTitles, testDurations);
|
|
168
|
+
this.extractTestsFromSuite(nestedWithFile, currentTitles, testDurations, false);
|
|
124
169
|
}
|
|
125
170
|
}
|
|
126
171
|
}
|
|
127
172
|
/**
|
|
128
|
-
* Normalize file path to be relative
|
|
129
|
-
*
|
|
173
|
+
* Normalize file path to be relative to testDir.
|
|
174
|
+
*
|
|
175
|
+
* DETERMINISTIC APPROACH:
|
|
176
|
+
* 1. suite.file in Playwright report is always relative to rootDir
|
|
177
|
+
* 2. testDir is either absolute or relative to rootDir
|
|
178
|
+
* 3. We resolve both to get absolute paths, then compute relative path
|
|
179
|
+
*
|
|
180
|
+
* This ensures consistent test IDs regardless of container path differences.
|
|
130
181
|
*/
|
|
131
182
|
normalizeFilePath(filePath) {
|
|
132
|
-
|
|
183
|
+
const normalizedFile = filePath.replace(/\\/g, '/');
|
|
184
|
+
const normalizedTestDir = this.testDir.replace(/\\/g, '/');
|
|
185
|
+
const normalizedRootDir = this.rootDir.replace(/\\/g, '/');
|
|
186
|
+
// suite.file in Playwright JSON report is relative to rootDir
|
|
187
|
+
// Resolve it to get the "logical" absolute path
|
|
188
|
+
const absoluteFile = path.isAbsolute(normalizedFile)
|
|
189
|
+
? normalizedFile
|
|
190
|
+
: path.join(normalizedRootDir, normalizedFile).replace(/\\/g, '/');
|
|
191
|
+
// testDir might be relative to rootDir, resolve it
|
|
192
|
+
const absoluteTestDir = path.isAbsolute(normalizedTestDir)
|
|
193
|
+
? normalizedTestDir
|
|
194
|
+
: path.join(normalizedRootDir, normalizedTestDir).replace(/\\/g, '/');
|
|
195
|
+
// Now compute relative path from testDir to file
|
|
196
|
+
// Both are now in the same "logical" path space
|
|
197
|
+
const relativePath = path
|
|
198
|
+
.relative(absoluteTestDir, absoluteFile)
|
|
199
|
+
.replace(/\\/g, '/');
|
|
200
|
+
// Sanity check: result should not start with ../
|
|
201
|
+
// If it does, the file is outside testDir which shouldn't happen
|
|
202
|
+
if (relativePath.startsWith('../')) {
|
|
203
|
+
// Log warning but continue - use basename as fallback
|
|
204
|
+
// This handles edge cases where paths are truly mismatched
|
|
205
|
+
return path.basename(filePath);
|
|
206
|
+
}
|
|
207
|
+
return relativePath;
|
|
133
208
|
}
|
|
134
209
|
/**
|
|
135
|
-
* Extract
|
|
210
|
+
* Extract rootDir and testDir from Playwright report config.
|
|
136
211
|
*
|
|
137
|
-
* CRITICAL:
|
|
138
|
-
*
|
|
212
|
+
* CRITICAL: We need both paths to correctly resolve file locations:
|
|
213
|
+
* - rootDir: where playwright.config.ts is located (absolute)
|
|
214
|
+
* - testDir: where tests are located (can be relative to rootDir)
|
|
139
215
|
*/
|
|
140
|
-
|
|
216
|
+
getPathsFromReport(report, projectName) {
|
|
141
217
|
const config = report.config;
|
|
142
218
|
if (!config) {
|
|
143
219
|
this.error('[Orchestrator] Report has no config section. ' +
|
|
144
220
|
'Ensure you are using Playwright JSON reporter with config output enabled.');
|
|
145
221
|
}
|
|
222
|
+
// rootDir is where playwright.config.ts is located
|
|
223
|
+
if (!config.rootDir) {
|
|
224
|
+
this.error('[Orchestrator] Report has no rootDir in config. ' +
|
|
225
|
+
'This is required to resolve test file paths correctly.');
|
|
226
|
+
}
|
|
146
227
|
if (!config.projects || config.projects.length === 0) {
|
|
147
228
|
this.error('[Orchestrator] Report has no projects in config. ' +
|
|
148
229
|
'Ensure your playwright.config.ts has at least one project configured.');
|
|
@@ -156,10 +237,12 @@ export default class ExtractTiming extends Command {
|
|
|
156
237
|
}
|
|
157
238
|
if (!project.testDir) {
|
|
158
239
|
this.error(`[Orchestrator] Project "${project.name}" has no testDir in report config. ` +
|
|
159
|
-
'Ensure your playwright.config.ts project has testDir set.
|
|
160
|
-
'Do NOT use rootDir as fallback - it causes path mismatch bugs.');
|
|
240
|
+
'Ensure your playwright.config.ts project has testDir set.');
|
|
161
241
|
}
|
|
162
|
-
return
|
|
242
|
+
return {
|
|
243
|
+
rootDir: config.rootDir,
|
|
244
|
+
testDir: project.testDir,
|
|
245
|
+
};
|
|
163
246
|
}
|
|
164
247
|
}
|
|
165
248
|
//# sourceMappingURL=extract-timing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-timing.js","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,MAAM,CAAU,WAAW,GACzB,iDAAiD,CAAC;IAEpD,MAAM,CAAU,QAAQ,GAAG;QACzB,6GAA6G;QAC7G,mGAAmG;KACpG,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,qCAAqC;YAClD,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,kCAAkC;SAChD,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,8BAA8B;YAC3C,OAAO,EAAE,CAAC;SACX,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,yBAAyB;YACtC,
|
|
1
|
+
{"version":3,"file":"extract-timing.js","sourceRoot":"","sources":["../../src/commands/extract-timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class FilterReport extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
'report-file': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
+
'output-file': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Remove specs where ALL tests are orchestrator-skipped
|
|
13
|
+
* (status "skipped" with annotation "Not in shard").
|
|
14
|
+
* Prune empty suites after removal.
|
|
15
|
+
*/
|
|
16
|
+
private filterSuites;
|
|
17
|
+
private countSpecs;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=filter-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-report.d.ts","sourceRoot":"","sources":["../../src/commands/filter-report.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,OAAgB,WAAW,SACyC;IAEpE,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;MAgBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC1B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA2CpB,OAAO,CAAC,UAAU;CAYnB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { Command, Flags } from '@oclif/core';
|
|
4
|
+
export default class FilterReport extends Command {
|
|
5
|
+
static description = 'Remove orchestrator-skipped tests from a Playwright JSON report';
|
|
6
|
+
static examples = [
|
|
7
|
+
'<%= config.bin %> filter-report --report-file ./results.json',
|
|
8
|
+
'<%= config.bin %> filter-report --report-file ./merged.json --output-file ./filtered.json',
|
|
9
|
+
];
|
|
10
|
+
static flags = {
|
|
11
|
+
'report-file': Flags.string({
|
|
12
|
+
char: 'r',
|
|
13
|
+
description: 'Path to Playwright JSON report file',
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
'output-file': Flags.string({
|
|
17
|
+
char: 'o',
|
|
18
|
+
description: 'Path to write filtered report (defaults to overwriting input)',
|
|
19
|
+
}),
|
|
20
|
+
verbose: Flags.boolean({
|
|
21
|
+
char: 'v',
|
|
22
|
+
description: 'Show verbose output',
|
|
23
|
+
default: false,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
async run() {
|
|
27
|
+
const { flags } = await this.parse(FilterReport);
|
|
28
|
+
const reportPath = path.resolve(flags['report-file']);
|
|
29
|
+
if (!fs.existsSync(reportPath)) {
|
|
30
|
+
this.warn(`Report file not found: ${reportPath}`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
let report;
|
|
34
|
+
try {
|
|
35
|
+
report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
this.error(`Failed to parse report: ${reportPath}`);
|
|
39
|
+
}
|
|
40
|
+
if (!report.suites) {
|
|
41
|
+
this.warn('Report has no suites, nothing to filter');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const suites = report.suites;
|
|
45
|
+
const beforeCount = this.countSpecs(suites);
|
|
46
|
+
this.filterSuites(suites);
|
|
47
|
+
const afterCount = this.countSpecs(suites);
|
|
48
|
+
const removed = beforeCount - afterCount;
|
|
49
|
+
const outputPath = flags['output-file']
|
|
50
|
+
? path.resolve(flags['output-file'])
|
|
51
|
+
: reportPath;
|
|
52
|
+
fs.writeFileSync(outputPath, JSON.stringify(report));
|
|
53
|
+
if (flags.verbose || removed > 0) {
|
|
54
|
+
this.log(`Filtered report: ${beforeCount} → ${afterCount} specs (removed ${removed} orchestrator-skipped)`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Remove specs where ALL tests are orchestrator-skipped
|
|
59
|
+
* (status "skipped" with annotation "Not in shard").
|
|
60
|
+
* Prune empty suites after removal.
|
|
61
|
+
*/
|
|
62
|
+
filterSuites(suites) {
|
|
63
|
+
for (let i = suites.length - 1; i >= 0; i--) {
|
|
64
|
+
const suite = suites[i];
|
|
65
|
+
if (!suite)
|
|
66
|
+
continue;
|
|
67
|
+
if (Array.isArray(suite.specs)) {
|
|
68
|
+
suite.specs = suite.specs.filter((spec) => {
|
|
69
|
+
const tests = spec.tests;
|
|
70
|
+
if (!tests || tests.length === 0)
|
|
71
|
+
return true;
|
|
72
|
+
const allOrchestratorSkipped = tests.every((test) => {
|
|
73
|
+
const status = test.status;
|
|
74
|
+
if (status !== 'skipped')
|
|
75
|
+
return false;
|
|
76
|
+
const annotations = test.annotations;
|
|
77
|
+
return annotations?.some((a) => a.type === 'skip' && a.description === 'Not in shard');
|
|
78
|
+
});
|
|
79
|
+
return !allOrchestratorSkipped;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(suite.suites)) {
|
|
83
|
+
this.filterSuites(suite.suites);
|
|
84
|
+
}
|
|
85
|
+
const hasSpecs = Array.isArray(suite.specs) && suite.specs.length > 0;
|
|
86
|
+
const hasSubSuites = Array.isArray(suite.suites) && suite.suites.length > 0;
|
|
87
|
+
if (!hasSpecs && !hasSubSuites) {
|
|
88
|
+
suites.splice(i, 1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
countSpecs(suites) {
|
|
93
|
+
let count = 0;
|
|
94
|
+
for (const suite of suites) {
|
|
95
|
+
if (Array.isArray(suite.specs))
|
|
96
|
+
count += suite.specs.length;
|
|
97
|
+
if (Array.isArray(suite.suites))
|
|
98
|
+
count += this.countSpecs(suite.suites);
|
|
99
|
+
}
|
|
100
|
+
return count;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=filter-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-report.js","sourceRoot":"","sources":["../../src/commands/filter-report.ts"],"names":[],"mappings":"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"}
|
package/dist/fixture.d.ts
CHANGED
|
@@ -56,16 +56,6 @@ import type { TestType } from '@playwright/test';
|
|
|
56
56
|
export declare function withOrchestratorFilter<T extends object, W extends object>(test: TestType<T, W>): TestType<T & {
|
|
57
57
|
_orchestratorFilter: undefined;
|
|
58
58
|
}, W>;
|
|
59
|
-
/**
|
|
60
|
-
* @deprecated Use `withOrchestratorFilter` instead. This function uses beforeEach
|
|
61
|
-
* which only works for the first test file processed, not subsequent files.
|
|
62
|
-
*
|
|
63
|
-
* Sets up the orchestrator filter as a beforeEach hook.
|
|
64
|
-
* This will skip tests that are not in the current shard.
|
|
65
|
-
*
|
|
66
|
-
* @param test - The test object from @playwright/test
|
|
67
|
-
*/
|
|
68
|
-
export declare function setupOrchestratorFilter<T extends object, W extends object>(test: TestType<T, W>): void;
|
|
69
59
|
/**
|
|
70
60
|
* Check if a test should run based on the shard file.
|
|
71
61
|
* Can be called manually in individual tests.
|
package/dist/fixture.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuDjD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACvE,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,QAAQ,CAAC,CAAC,GAAG;IAAE,mBAAmB,EAAE,SAAS,CAAA;CAAE,EAAE,CAAC,CAAC,CAwDrD;AAED
|
|
1
|
+
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuDjD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACvE,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,QAAQ,CAAC,CAAC,GAAG;IAAE,mBAAmB,EAAE,SAAS,CAAA;CAAE,EAAE,CAAC,CAAC,CAwDrD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,GAAG,OAAO,CAUV"}
|
package/dist/fixture.js
CHANGED
|
@@ -127,42 +127,6 @@ export function withOrchestratorFilter(test) {
|
|
|
127
127
|
],
|
|
128
128
|
});
|
|
129
129
|
}
|
|
130
|
-
/**
|
|
131
|
-
* @deprecated Use `withOrchestratorFilter` instead. This function uses beforeEach
|
|
132
|
-
* which only works for the first test file processed, not subsequent files.
|
|
133
|
-
*
|
|
134
|
-
* Sets up the orchestrator filter as a beforeEach hook.
|
|
135
|
-
* This will skip tests that are not in the current shard.
|
|
136
|
-
*
|
|
137
|
-
* @param test - The test object from @playwright/test
|
|
138
|
-
*/
|
|
139
|
-
export function setupOrchestratorFilter(test) {
|
|
140
|
-
// biome-ignore lint/correctness/noEmptyPattern: Playwright requires empty destructuring for fixtures
|
|
141
|
-
test.beforeEach(async ({}, testInfo) => {
|
|
142
|
-
const allowedTestIds = loadShardFile();
|
|
143
|
-
if (allowedTestIds) {
|
|
144
|
-
// CRITICAL: Use project.testDir for consistent path resolution with test-discovery
|
|
145
|
-
// No fallback to process.cwd() - this causes path mismatch bugs
|
|
146
|
-
const testDir = testInfo.project.testDir;
|
|
147
|
-
if (!testDir) {
|
|
148
|
-
throw new Error('[Orchestrator Fixture] Could not determine project testDir. ' +
|
|
149
|
-
'Ensure your playwright.config.ts has projects configured with testDir.');
|
|
150
|
-
}
|
|
151
|
-
const testId = buildTestIdFromRuntime(testInfo.file, testInfo.titlePath, {
|
|
152
|
-
projectName: testInfo.project.name,
|
|
153
|
-
baseDir: testDir,
|
|
154
|
-
});
|
|
155
|
-
const isAllowed = allowedTestIds.has(testId);
|
|
156
|
-
// Debug: Write to stderr for visibility in CI logs
|
|
157
|
-
if (process.env.ORCHESTRATOR_DEBUG === '1') {
|
|
158
|
-
process.stderr.write(`[Fixture] testDir=${testInfo.project.testDir} | testId=${testId} | allowed=${isAllowed}\n`);
|
|
159
|
-
}
|
|
160
|
-
if (!isAllowed) {
|
|
161
|
-
test.skip(true, 'Not in shard');
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
130
|
/**
|
|
167
131
|
* Check if a test should run based on the shard file.
|
|
168
132
|
* Can be called manually in individual tests.
|
package/dist/fixture.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fixture.js","sourceRoot":"","sources":["../src/fixture.ts"],"names":[],"mappings":"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"}
|
package/dist/reporter.d.ts
CHANGED
|
@@ -22,15 +22,21 @@
|
|
|
22
22
|
* @module @nsxbet/playwright-orchestrator/reporter
|
|
23
23
|
*/
|
|
24
24
|
import type { FullConfig, FullResult, Reporter, Suite, TestCase, TestResult } from '@playwright/test/reporter';
|
|
25
|
+
interface OrchestratorReporterOptions {
|
|
26
|
+
filterJson?: string;
|
|
27
|
+
}
|
|
25
28
|
export default class OrchestratorReporter implements Reporter {
|
|
26
29
|
private allowedTestIds;
|
|
27
30
|
private debug;
|
|
28
31
|
private startTime;
|
|
29
32
|
private rootDir;
|
|
33
|
+
private testDir;
|
|
34
|
+
private filterJsonPath;
|
|
30
35
|
private passed;
|
|
31
36
|
private failed;
|
|
32
37
|
private skipped;
|
|
33
38
|
private filtered;
|
|
39
|
+
constructor(options?: OrchestratorReporterOptions);
|
|
34
40
|
onBegin(config: FullConfig, suite: Suite): void;
|
|
35
41
|
onTestEnd(test: TestCase, result: TestResult): void;
|
|
36
42
|
onEnd(_result: FullResult): void;
|
|
@@ -55,6 +61,25 @@ export default class OrchestratorReporter implements Reporter {
|
|
|
55
61
|
* Format duration in human readable format
|
|
56
62
|
*/
|
|
57
63
|
private formatDuration;
|
|
64
|
+
onExit(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Filter specs by checking test IDs against the allowedTestIds set.
|
|
67
|
+
* Builds test IDs from the JSON report structure (file path + describe chain + spec title),
|
|
68
|
+
* matching the same format used by discovery (buildTestId) and runtime (buildTestIdFromRuntime).
|
|
69
|
+
*
|
|
70
|
+
* This correctly handles ALL non-shard tests, including genuinely skipped tests
|
|
71
|
+
* (test.skip, test.fixme, test.describe.skip) that never receive the "Not in shard" annotation
|
|
72
|
+
* because the orchestrator fixture doesn't run for them.
|
|
73
|
+
*/
|
|
74
|
+
private filterSuitesById;
|
|
75
|
+
private resolveReportFilePath;
|
|
76
|
+
/**
|
|
77
|
+
* Recalculate the stats object to match the filtered suites.
|
|
78
|
+
* Playwright JSON stats use: expected (passed), skipped, unexpected (failed), flaky.
|
|
79
|
+
*/
|
|
80
|
+
private recalculateStats;
|
|
81
|
+
private countTestStatuses;
|
|
82
|
+
private countSpecs;
|
|
58
83
|
/**
|
|
59
84
|
* Build test ID from TestCase.
|
|
60
85
|
* Uses shared buildTestIdFromRuntime function for consistency with fixture.
|
|
@@ -64,4 +89,5 @@ export default class OrchestratorReporter implements Reporter {
|
|
|
64
89
|
*/
|
|
65
90
|
private buildTestId;
|
|
66
91
|
}
|
|
92
|
+
export {};
|
|
67
93
|
//# sourceMappingURL=reporter.d.ts.map
|
package/dist/reporter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AA0BnC,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,QAAQ;IAC3D,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAM;
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AA0BnC,UAAU,2BAA2B;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,QAAQ;IAC3D,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,cAAc,CAAqB;IAG3C,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAK;gBAET,OAAO,CAAC,EAAE,2BAA2B;IAIjD,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;IAuCxC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAsB5C,KAAK,CAAC,OAAO,EAAE,UAAU;IA0BzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAahB,MAAM;IAoDZ;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAoDxB,OAAO,CAAC,qBAAqB;IAO7B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;CAepB"}
|
package/dist/reporter.js
CHANGED
|
@@ -45,14 +45,20 @@ export default class OrchestratorReporter {
|
|
|
45
45
|
debug = process.env.ORCHESTRATOR_DEBUG === '1';
|
|
46
46
|
startTime = 0;
|
|
47
47
|
rootDir = '';
|
|
48
|
+
testDir = '';
|
|
49
|
+
filterJsonPath;
|
|
48
50
|
// Counters for summary
|
|
49
51
|
passed = 0;
|
|
50
52
|
failed = 0;
|
|
51
53
|
skipped = 0;
|
|
52
54
|
filtered = 0;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.filterJsonPath = options?.filterJson;
|
|
57
|
+
}
|
|
53
58
|
onBegin(config, suite) {
|
|
54
59
|
this.startTime = Date.now();
|
|
55
60
|
this.rootDir = config.rootDir;
|
|
61
|
+
this.testDir = config.projects[0]?.testDir ?? config.rootDir;
|
|
56
62
|
const shardFile = process.env.ORCHESTRATOR_SHARD_FILE;
|
|
57
63
|
if (!shardFile || !fs.existsSync(shardFile)) {
|
|
58
64
|
// No shard file - let other reporters handle output
|
|
@@ -201,6 +207,120 @@ export default class OrchestratorReporter {
|
|
|
201
207
|
const remainingSeconds = Math.round(seconds % 60);
|
|
202
208
|
return `${minutes}m ${remainingSeconds}s`;
|
|
203
209
|
}
|
|
210
|
+
async onExit() {
|
|
211
|
+
if (!this.filterJsonPath || !this.allowedTestIds)
|
|
212
|
+
return;
|
|
213
|
+
const reportPath = path.resolve(this.filterJsonPath);
|
|
214
|
+
if (!fs.existsSync(reportPath)) {
|
|
215
|
+
if (this.debug) {
|
|
216
|
+
console.log(color('gray', `[Orchestrator] filterJson file not found: ${reportPath}`));
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));
|
|
222
|
+
if (!report.suites)
|
|
223
|
+
return;
|
|
224
|
+
const testDir = report.config?.projects?.[0]?.testDir || this.testDir || this.rootDir;
|
|
225
|
+
const beforeCount = this.countSpecs(report.suites);
|
|
226
|
+
this.filterSuitesById(report.suites, testDir, this.allowedTestIds, [], true);
|
|
227
|
+
const afterCount = this.countSpecs(report.suites);
|
|
228
|
+
if (report.stats) {
|
|
229
|
+
report.stats = this.recalculateStats(report.suites, report.stats);
|
|
230
|
+
}
|
|
231
|
+
fs.writeFileSync(reportPath, JSON.stringify(report));
|
|
232
|
+
if (this.debug) {
|
|
233
|
+
console.log(color('gray', `[Orchestrator] Filtered JSON report: ${beforeCount} → ${afterCount} specs (removed ${beforeCount - afterCount})`));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
console.error('[Orchestrator] Failed to filter JSON report:', error);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Filter specs by checking test IDs against the allowedTestIds set.
|
|
242
|
+
* Builds test IDs from the JSON report structure (file path + describe chain + spec title),
|
|
243
|
+
* matching the same format used by discovery (buildTestId) and runtime (buildTestIdFromRuntime).
|
|
244
|
+
*
|
|
245
|
+
* This correctly handles ALL non-shard tests, including genuinely skipped tests
|
|
246
|
+
* (test.skip, test.fixme, test.describe.skip) that never receive the "Not in shard" annotation
|
|
247
|
+
* because the orchestrator fixture doesn't run for them.
|
|
248
|
+
*/
|
|
249
|
+
filterSuitesById(suites, testDir, allowedIds, parentTitles, isRootLevel) {
|
|
250
|
+
for (let i = suites.length - 1; i >= 0; i--) {
|
|
251
|
+
const suite = suites[i];
|
|
252
|
+
if (!suite)
|
|
253
|
+
continue;
|
|
254
|
+
const suiteTitle = suite.title;
|
|
255
|
+
const suiteFile = suite.file;
|
|
256
|
+
// Root-level suites are file-level (title = filename) → skip from describe chain
|
|
257
|
+
// Nested suites are describe blocks → include title in chain
|
|
258
|
+
const currentTitles = isRootLevel ? [] : [...parentTitles, suiteTitle];
|
|
259
|
+
const filePath = suiteFile
|
|
260
|
+
? this.resolveReportFilePath(suiteFile, testDir)
|
|
261
|
+
: '';
|
|
262
|
+
if (Array.isArray(suite.specs)) {
|
|
263
|
+
suite.specs = suite.specs.filter((spec) => {
|
|
264
|
+
const specTitle = spec.title;
|
|
265
|
+
const testId = [filePath, ...currentTitles, specTitle].join('::');
|
|
266
|
+
return allowedIds.has(testId);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
if (Array.isArray(suite.suites)) {
|
|
270
|
+
this.filterSuitesById(suite.suites, testDir, allowedIds, currentTitles, false);
|
|
271
|
+
}
|
|
272
|
+
const hasSpecs = Array.isArray(suite.specs) && suite.specs.length > 0;
|
|
273
|
+
const hasSubSuites = Array.isArray(suite.suites) && suite.suites.length > 0;
|
|
274
|
+
if (!hasSpecs && !hasSubSuites) {
|
|
275
|
+
suites.splice(i, 1);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
resolveReportFilePath(filePath, testDir) {
|
|
280
|
+
if (path.isAbsolute(filePath)) {
|
|
281
|
+
return path.relative(testDir, filePath).replace(/\\/g, '/');
|
|
282
|
+
}
|
|
283
|
+
return filePath.replace(/\\/g, '/');
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Recalculate the stats object to match the filtered suites.
|
|
287
|
+
* Playwright JSON stats use: expected (passed), skipped, unexpected (failed), flaky.
|
|
288
|
+
*/
|
|
289
|
+
recalculateStats(suites, originalStats) {
|
|
290
|
+
const counts = { expected: 0, unexpected: 0, skipped: 0, flaky: 0 };
|
|
291
|
+
this.countTestStatuses(suites, counts);
|
|
292
|
+
return { ...originalStats, ...counts };
|
|
293
|
+
}
|
|
294
|
+
countTestStatuses(suites, counts) {
|
|
295
|
+
for (const suite of suites) {
|
|
296
|
+
if (Array.isArray(suite.specs)) {
|
|
297
|
+
for (const spec of suite.specs) {
|
|
298
|
+
const tests = spec.tests;
|
|
299
|
+
if (!tests)
|
|
300
|
+
continue;
|
|
301
|
+
for (const test of tests) {
|
|
302
|
+
const status = test.status;
|
|
303
|
+
if (status in counts && counts[status] !== undefined) {
|
|
304
|
+
counts[status] = counts[status] + 1;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (Array.isArray(suite.suites)) {
|
|
310
|
+
this.countTestStatuses(suite.suites, counts);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
countSpecs(suites) {
|
|
315
|
+
let count = 0;
|
|
316
|
+
for (const suite of suites) {
|
|
317
|
+
if (Array.isArray(suite.specs))
|
|
318
|
+
count += suite.specs.length;
|
|
319
|
+
if (Array.isArray(suite.suites))
|
|
320
|
+
count += this.countSpecs(suite.suites);
|
|
321
|
+
}
|
|
322
|
+
return count;
|
|
323
|
+
}
|
|
204
324
|
/**
|
|
205
325
|
* Build test ID from TestCase.
|
|
206
326
|
* Uses shared buildTestIdFromRuntime function for consistency with fixture.
|
package/dist/reporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED