@empiricalrun/test-run 0.17.0 → 0.17.2
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/CHANGELOG.md +16 -0
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +1 -1
- package/dist/env-files.d.ts.map +1 -1
- package/dist/env-files.js +12 -6
- package/dist/failed-test-list.d.ts.map +1 -1
- package/dist/failed-test-list.js +11 -6
- package/dist/glob-matcher.d.ts.map +1 -1
- package/dist/lib/cmd.d.ts +1 -0
- package/dist/lib/cmd.d.ts.map +1 -1
- package/dist/lib/cmd.js +56 -14
- package/dist/lib/merge-reports/html.d.ts.map +1 -1
- package/dist/lib/merge-reports/html.js +2 -11
- package/dist/lib/merge-reports/index.d.ts +2 -0
- package/dist/lib/merge-reports/index.d.ts.map +1 -1
- package/dist/lib/merge-reports/index.js +70 -1
- package/dist/reporters/test-case-sync-reporter.d.ts +2 -0
- package/dist/reporters/test-case-sync-reporter.d.ts.map +1 -0
- package/dist/reporters/test-case-sync-reporter.js +19 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/package.json +8 -6
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @empiricalrun/test-run
|
|
2
2
|
|
|
3
|
+
## 0.17.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [91798e6]
|
|
8
|
+
- @empiricalrun/playwright-utils@0.55.0
|
|
9
|
+
- @empiricalrun/reporter@0.29.1
|
|
10
|
+
|
|
11
|
+
## 0.17.1
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 8b1be9e: fix: html report attachment urls for pw 1.60.0
|
|
16
|
+
- Updated dependencies [8b1be9e]
|
|
17
|
+
- @empiricalrun/reporter@0.29.1
|
|
18
|
+
|
|
3
19
|
## 0.17.0
|
|
4
20
|
|
|
5
21
|
### Minor Changes
|
package/dist/dashboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,eAAO,MAAM,gBAAgB,oBACV,MAAM,KACtB,OAAO,CAAC,WAAW,CAwDrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAa,OAAO,CACxD,mBAAmB,EAAE,CAkDtB,CAAC"}
|
package/dist/dashboard.js
CHANGED
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.fetchEnvironmentVariables = exports.fetchEnvironment = void 0;
|
|
7
7
|
const async_retry_1 = __importDefault(require("async-retry"));
|
|
8
|
-
const DOMAIN = process.env.DASHBOARD_DOMAIN || "https://
|
|
8
|
+
const DOMAIN = process.env.DASHBOARD_DOMAIN || "https://api.empirical.run";
|
|
9
9
|
const fetchEnvironment = async (environmentSlug) => {
|
|
10
10
|
const data = await (0, async_retry_1.default)(async (bail) => {
|
|
11
11
|
if (!process.env.EMPIRICALRUN_API_KEY) {
|
package/dist/env-files.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-files.d.ts","sourceRoot":"","sources":["../src/env-files.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,CAAC,CAAC;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;
|
|
1
|
+
{"version":3,"file":"env-files.d.ts","sourceRoot":"","sources":["../src/env-files.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC9B,CAAC,CAAC;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAoEF,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,MAAM,GACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;CACxB,QAoDA"}
|
package/dist/env-files.js
CHANGED
|
@@ -60,20 +60,25 @@ function buildDotenvContent(vars) {
|
|
|
60
60
|
.join("\n");
|
|
61
61
|
}
|
|
62
62
|
function parseEnvironmentsYaml(value) {
|
|
63
|
-
if (typeof value !== "object" || value === null)
|
|
63
|
+
if (typeof value !== "object" || value === null) {
|
|
64
64
|
return null;
|
|
65
|
+
}
|
|
65
66
|
const obj = value;
|
|
66
|
-
if (!("environments" in obj) || !Array.isArray(obj.environments))
|
|
67
|
+
if (!("environments" in obj) || !Array.isArray(obj.environments)) {
|
|
67
68
|
return null;
|
|
69
|
+
}
|
|
68
70
|
const environments = [];
|
|
69
71
|
for (const env of obj.environments) {
|
|
70
|
-
if (typeof env !== "object" || env === null)
|
|
72
|
+
if (typeof env !== "object" || env === null) {
|
|
71
73
|
continue;
|
|
74
|
+
}
|
|
72
75
|
const e = env;
|
|
73
|
-
if (typeof e.slug !== "string" || !e.slug.trim())
|
|
76
|
+
if (typeof e.slug !== "string" || !e.slug.trim()) {
|
|
74
77
|
continue;
|
|
75
|
-
|
|
78
|
+
}
|
|
79
|
+
if (typeof e.name !== "string" || !e.name.trim()) {
|
|
76
80
|
continue;
|
|
81
|
+
}
|
|
77
82
|
environments.push({
|
|
78
83
|
slug: e.slug,
|
|
79
84
|
name: e.name,
|
|
@@ -89,8 +94,9 @@ function parseEnvironmentsYaml(value) {
|
|
|
89
94
|
}
|
|
90
95
|
function readEnvironmentsYaml(repoDir) {
|
|
91
96
|
const yamlPath = path.join(repoDir, ENVIRONMENTS_FILE_PATH);
|
|
92
|
-
if (!fs.existsSync(yamlPath))
|
|
97
|
+
if (!fs.existsSync(yamlPath)) {
|
|
93
98
|
return null;
|
|
99
|
+
}
|
|
94
100
|
const content = fs.readFileSync(yamlPath, "utf-8");
|
|
95
101
|
const parsed = js_yaml_1.default.load(content);
|
|
96
102
|
return parseEnvironmentsYaml(parsed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"failed-test-list.d.ts","sourceRoot":"","sources":["../src/failed-test-list.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"failed-test-list.d.ts","sourceRoot":"","sources":["../src/failed-test-list.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAsB/D;AAID;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBnB;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAmED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;CACvB;AAoBD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA+CjC;AA0FD,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0DD,wBAAsB,aAAa,CACjC,UAAU,EAAE,QAAQ,EAAE,EACtB,QAAQ,EAAE,QAAQ,EAAE,EACpB,OAAO,EAAE,oBAAoB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACnD,OAAO,CAAC,mBAAmB,CAAC,CA0D9B;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAa9B;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
|
package/dist/failed-test-list.js
CHANGED
|
@@ -16,7 +16,7 @@ const reporter_1 = require("@empiricalrun/reporter");
|
|
|
16
16
|
const fs_1 = __importDefault(require("fs"));
|
|
17
17
|
const path_1 = __importDefault(require("path"));
|
|
18
18
|
const utils_1 = require("./utils");
|
|
19
|
-
const DOMAIN = process.env.DASHBOARD_DOMAIN || "https://
|
|
19
|
+
const DOMAIN = process.env.DASHBOARD_DOMAIN || "https://api.empirical.run";
|
|
20
20
|
const SUITES_DELIMITER = " › ";
|
|
21
21
|
/**
|
|
22
22
|
* Normalize a test line for comparison between manifest and ran tests.
|
|
@@ -30,15 +30,18 @@ function normalizeTestLine(line) {
|
|
|
30
30
|
}
|
|
31
31
|
function parseTestListLine(line) {
|
|
32
32
|
const trimmed = normalizeTestLine(line.trim());
|
|
33
|
-
if (!trimmed || trimmed.startsWith("#"))
|
|
33
|
+
if (!trimmed || trimmed.startsWith("#")) {
|
|
34
34
|
return null;
|
|
35
|
+
}
|
|
35
36
|
const match = trimmed.match(/^\[(.*?)\]\s*[›>]\s*(.*)/);
|
|
36
|
-
if (!match?.[1] || !match[2])
|
|
37
|
+
if (!match?.[1] || !match[2]) {
|
|
37
38
|
return null;
|
|
39
|
+
}
|
|
38
40
|
const projectName = match[1];
|
|
39
41
|
const parts = match[2].split(/\s*[›>]\s*/);
|
|
40
|
-
if (parts.length < 2)
|
|
42
|
+
if (parts.length < 2) {
|
|
41
43
|
return null;
|
|
44
|
+
}
|
|
42
45
|
const file = parts[0].trim();
|
|
43
46
|
const suites = parts.slice(1, -1);
|
|
44
47
|
const title = parts[parts.length - 1].trim();
|
|
@@ -327,8 +330,9 @@ async function expandSerialDependencies(testListContent, outputPath, repoPath) {
|
|
|
327
330
|
const testsToRun = [];
|
|
328
331
|
for (const line of lines) {
|
|
329
332
|
const parsed = parseTestListLine(line);
|
|
330
|
-
if (parsed)
|
|
333
|
+
if (parsed) {
|
|
331
334
|
testsToRun.push(parsed);
|
|
335
|
+
}
|
|
332
336
|
}
|
|
333
337
|
if (testsToRun.length === 0) {
|
|
334
338
|
console.log("testListContent could not be parsed. Returning original tests");
|
|
@@ -341,8 +345,9 @@ async function expandSerialDependencies(testListContent, outputPath, repoPath) {
|
|
|
341
345
|
const allLines = await getAllTestsForFile(file, repoPath);
|
|
342
346
|
for (const line of allLines) {
|
|
343
347
|
const parsed = parseTestListLine(line);
|
|
344
|
-
if (parsed)
|
|
348
|
+
if (parsed) {
|
|
345
349
|
allTests.push(parsed);
|
|
350
|
+
}
|
|
346
351
|
}
|
|
347
352
|
}
|
|
348
353
|
const result = await buildTestList(testsToRun, allTests, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glob-matcher.d.ts","sourceRoot":"","sources":["../src/glob-matcher.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,
|
|
1
|
+
{"version":3,"file":"glob-matcher.d.ts","sourceRoot":"","sources":["../src/glob-matcher.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,UAChC,MAAM,EAAE,mBACE,MAAM,EAAE,EAAE,KAC1B,MAAM,EAUR,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,oBACtB,MAAM,EAAE,YACf,MAAM,EAAE,KACjB,MAAM,EASR,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B,oBACxB,MAAM,EAAE,SAClB,MAAM,EAAE,UACP,MAAM,EAAE,KACf,MAAM,EAYR,CAAC"}
|
package/dist/lib/cmd.d.ts
CHANGED
package/dist/lib/cmd.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmd.d.ts","sourceRoot":"","sources":["../../src/lib/cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"cmd.d.ts","sourceRoot":"","sources":["../../src/lib/cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,eAAe,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAeA;AAED,wBAAsB,cAAc,CAClC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,YAAY,EACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAChC;;;GAqBF;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IACP,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC,GACA,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD5C;AAmDD,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C"}
|
package/dist/lib/cmd.js
CHANGED
|
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getCommandFromString = getCommandFromString;
|
|
4
4
|
exports.runTestsForCmd = runTestsForCmd;
|
|
5
5
|
exports.spawnCmd = spawnCmd;
|
|
6
|
+
exports.getChildProcessGraceMs = getChildProcessGraceMs;
|
|
6
7
|
const child_process_1 = require("child_process");
|
|
7
8
|
const logger_1 = require("../logger");
|
|
9
|
+
const SPOT_CHILD_PROCESS_GRACE_MS = 20_000;
|
|
10
|
+
const DEFAULT_CHILD_PROCESS_GRACE_MS = 120_000;
|
|
8
11
|
function getCommandFromString(command) {
|
|
9
12
|
const regex = /[^\s"']+|"([^"]*)"|'([^']*)'/g;
|
|
10
13
|
const matches = command.match(regex) || [];
|
|
@@ -71,7 +74,7 @@ async function spawnCmd(command, args, options) {
|
|
|
71
74
|
errorLogs.push(log);
|
|
72
75
|
});
|
|
73
76
|
p.on("exit", (code) => {
|
|
74
|
-
|
|
77
|
+
forceKillProcessGroup(p);
|
|
75
78
|
cleanupSignalHandlers();
|
|
76
79
|
if (code != 0 && options.throwOnError) {
|
|
77
80
|
// assuming last log is the error message before exiting
|
|
@@ -84,24 +87,23 @@ async function spawnCmd(command, args, options) {
|
|
|
84
87
|
});
|
|
85
88
|
}
|
|
86
89
|
function setupProcessSignalHandlers(proc) {
|
|
90
|
+
let isShuttingDown = false;
|
|
91
|
+
let hasExited = false;
|
|
92
|
+
proc.once("exit", () => {
|
|
93
|
+
hasExited = true;
|
|
94
|
+
});
|
|
87
95
|
const handleSignal = async (signal) => {
|
|
96
|
+
if (isShuttingDown) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
isShuttingDown = true;
|
|
88
100
|
logger_1.logger.debug(`\nReceived ${signal}, gracefully shutting down...`);
|
|
89
101
|
if (proc && !proc.killed && proc.pid) {
|
|
90
102
|
// Forward the signal to the entire process group so all children
|
|
91
103
|
// (including Playwright workers and reporters) receive it
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
catch {
|
|
96
|
-
// Process group may have already exited
|
|
97
|
-
proc.kill(signal);
|
|
98
|
-
}
|
|
99
|
-
// Wait for the child process to exit
|
|
100
|
-
await new Promise((resolve) => {
|
|
101
|
-
proc.once("exit", () => {
|
|
102
|
-
resolve();
|
|
103
|
-
});
|
|
104
|
-
});
|
|
104
|
+
sendSignalToProcessGroup(proc, signal);
|
|
105
|
+
await waitForProcessExit(proc, () => hasExited, getChildProcessGraceMs());
|
|
106
|
+
forceKillProcessGroup(proc);
|
|
105
107
|
}
|
|
106
108
|
process.exit(0);
|
|
107
109
|
};
|
|
@@ -123,3 +125,43 @@ function setupProcessSignalHandlers(proc) {
|
|
|
123
125
|
});
|
|
124
126
|
};
|
|
125
127
|
}
|
|
128
|
+
function getChildProcessGraceMs() {
|
|
129
|
+
return process.env.SPOT_INSTANCE === "true"
|
|
130
|
+
? SPOT_CHILD_PROCESS_GRACE_MS
|
|
131
|
+
: DEFAULT_CHILD_PROCESS_GRACE_MS;
|
|
132
|
+
}
|
|
133
|
+
function sendSignalToProcessGroup(proc, signal) {
|
|
134
|
+
if (!proc.pid) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
process.kill(-proc.pid, signal);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Process group may have already exited.
|
|
142
|
+
proc.kill(signal);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function waitForProcessExit(proc, hasExited, timeoutMs) {
|
|
146
|
+
if (hasExited()) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await new Promise((resolve) => {
|
|
150
|
+
const timeout = setTimeout(resolve, timeoutMs);
|
|
151
|
+
proc.once("exit", () => {
|
|
152
|
+
clearTimeout(timeout);
|
|
153
|
+
resolve();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
function forceKillProcessGroup(proc) {
|
|
158
|
+
if (!proc.pid) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
process.kill(-proc.pid, "SIGKILL");
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// The group is already gone, which is the desired cleanup state.
|
|
166
|
+
}
|
|
167
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../src/lib/merge-reports/html.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../src/lib/merge-reports/html.ts"],"names":[],"mappings":"AAeA,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoHf"}
|
|
@@ -52,10 +52,7 @@ async function patchMergedHtmlReport(htmlFilePath, summaryJsonFilePath) {
|
|
|
52
52
|
logger_1.logger.error(`[Merge Reports] Failed to read HTML file:`, error);
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
const oldFormatMatch = htmlContent.match(/window\.playwrightReportBase64\s*=\s*"(?:data:application\/zip;base64,)?([^"]+)"/);
|
|
57
|
-
const newFormatMatch = htmlContent.match(/<script\s+id="playwrightReportBase64"[^>]*>(?:data:application\/zip;base64,)?([^<]+)<\/script>/);
|
|
58
|
-
const base64 = oldFormatMatch?.[1] || newFormatMatch?.[1];
|
|
55
|
+
const base64 = (0, reporter_1.findPlaywrightReportBase64)(htmlContent);
|
|
59
56
|
if (!base64) {
|
|
60
57
|
logger_1.logger.error(`[Merge Reports] Base64 zip data not found in HTML`);
|
|
61
58
|
return;
|
|
@@ -89,13 +86,7 @@ async function patchMergedHtmlReport(htmlFilePath, summaryJsonFilePath) {
|
|
|
89
86
|
const newBuffer = await (0, zip_1.createZipFromDirectory)(tempDir);
|
|
90
87
|
const newBase64 = newBuffer.toString("base64");
|
|
91
88
|
logger_1.logger.info(`[Merge Reports] New zip created in ${Date.now() - stepTime}ms`);
|
|
92
|
-
|
|
93
|
-
if (oldFormatMatch) {
|
|
94
|
-
updatedHtml = htmlContent.replace(/(window\.playwrightReportBase64\s*=\s*")(?:data:application\/zip;base64,)?[^"]*(")/, `$1data:application/zip;base64,${newBase64}$2`);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
updatedHtml = htmlContent.replace(/(<script\s+id="playwrightReportBase64"[^>]*>)(?:data:application\/zip;base64,)?[^<]*(<\/script>)/, `$1data:application/zip;base64,${newBase64}$2`);
|
|
98
|
-
}
|
|
89
|
+
const updatedHtml = (0, reporter_1.replacePlaywrightReportBase64)(htmlContent, newBase64);
|
|
99
90
|
await fs_1.default.promises.writeFile(htmlFilePath, updatedHtml, "utf8");
|
|
100
91
|
logger_1.logger.info(`[Merge Reports] HTML file patched successfully`);
|
|
101
92
|
}
|
|
@@ -2,6 +2,8 @@ import type { MergeReportsOptions, UploadOptions } from "./types";
|
|
|
2
2
|
export { patchMergedHtmlReport } from "./html";
|
|
3
3
|
export { patchSummaryJson } from "./json";
|
|
4
4
|
export type { MergeReportsOptions, UploadOptions } from "./types";
|
|
5
|
+
export declare function parsePlaywrightVersionFromReportJsonl(content: string): string | null;
|
|
6
|
+
export declare function getPlaywrightVersionForMerge(blobDir: string): Promise<string | null>;
|
|
5
7
|
export declare function runPlaywrightMergeReports(options: MergeReportsOptions): Promise<{
|
|
6
8
|
success: boolean;
|
|
7
9
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/merge-reports/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA0DlE,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/merge-reports/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AA0DlE,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CA+Bf;AAMD,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyCxB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+C/B;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAoCjC;AAED,wBAAsB,mBAAmB,CAAC,EACxC,SAAS,EACT,aAAa,GACd,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDhB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAgFhC"}
|
|
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.patchSummaryJson = exports.patchMergedHtmlReport = void 0;
|
|
7
|
+
exports.parsePlaywrightVersionFromReportJsonl = parsePlaywrightVersionFromReportJsonl;
|
|
8
|
+
exports.getPlaywrightVersionForMerge = getPlaywrightVersionForMerge;
|
|
7
9
|
exports.runPlaywrightMergeReports = runPlaywrightMergeReports;
|
|
8
10
|
exports.extractUrlMappingsFromBlobs = extractUrlMappingsFromBlobs;
|
|
9
11
|
exports.uploadMergedReports = uploadMergedReports;
|
|
@@ -64,15 +66,82 @@ function getCredentialsFromEnv(enableS3) {
|
|
|
64
66
|
}
|
|
65
67
|
return null;
|
|
66
68
|
}
|
|
69
|
+
function parsePlaywrightVersionFromReportJsonl(content) {
|
|
70
|
+
let userAgentVersion = null;
|
|
71
|
+
for (const line of content.split("\n")) {
|
|
72
|
+
if (!line.trim()) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const event = JSON.parse(line);
|
|
77
|
+
if (event.method === "onConfigure") {
|
|
78
|
+
const version = event.params?.config?.version;
|
|
79
|
+
if (typeof version === "string") {
|
|
80
|
+
return version;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (event.method === "onBlobReportMetadata") {
|
|
84
|
+
const userAgent = event.params?.userAgent;
|
|
85
|
+
if (typeof userAgent === "string") {
|
|
86
|
+
const match = userAgent.match(/\bPlaywright\/([^\s)]+)/);
|
|
87
|
+
if (match?.[1]) {
|
|
88
|
+
userAgentVersion = match[1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Ignore malformed lines; Playwright merge-reports will validate the blob.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return userAgentVersion;
|
|
98
|
+
}
|
|
99
|
+
function isSafePlaywrightVersion(version) {
|
|
100
|
+
return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version);
|
|
101
|
+
}
|
|
102
|
+
async function getPlaywrightVersionForMerge(blobDir) {
|
|
103
|
+
const override = process.env.PLAYWRIGHT_MERGE_VERSION;
|
|
104
|
+
if (override) {
|
|
105
|
+
if (!isSafePlaywrightVersion(override)) {
|
|
106
|
+
throw new Error(`Invalid PLAYWRIGHT_MERGE_VERSION: ${override}`);
|
|
107
|
+
}
|
|
108
|
+
return override;
|
|
109
|
+
}
|
|
110
|
+
const versions = new Set();
|
|
111
|
+
const files = fs_1.default.readdirSync(blobDir).filter((f) => f.endsWith(".zip"));
|
|
112
|
+
for (const fileName of files) {
|
|
113
|
+
const reportJsonl = await (0, zip_1.readZipEntry)(path_1.default.join(blobDir, fileName), "report.jsonl");
|
|
114
|
+
if (!reportJsonl) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const version = parsePlaywrightVersionFromReportJsonl(reportJsonl.toString("utf8"));
|
|
118
|
+
if (version) {
|
|
119
|
+
if (!isSafePlaywrightVersion(version)) {
|
|
120
|
+
throw new Error(`Invalid Playwright version in ${fileName}: ${version}`);
|
|
121
|
+
}
|
|
122
|
+
versions.add(version);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (versions.size > 1) {
|
|
126
|
+
logger_1.logger.warn(`[Merge Reports] Multiple Playwright versions found in blobs: ${Array.from(versions).join(", ")}`);
|
|
127
|
+
}
|
|
128
|
+
return versions.values().next().value ?? null;
|
|
129
|
+
}
|
|
67
130
|
async function runPlaywrightMergeReports(options) {
|
|
68
131
|
const { blobDir, outputDir, cwd } = options;
|
|
69
132
|
logger_1.logger.debug(`[Merge Reports] Running playwright merge-reports`);
|
|
70
133
|
logger_1.logger.debug(`[Merge Reports] Blob dir: ${blobDir}`);
|
|
71
134
|
logger_1.logger.debug(`[Merge Reports] Output dir: ${outputDir}`);
|
|
72
135
|
try {
|
|
136
|
+
const playwrightVersion = await getPlaywrightVersionForMerge(blobDir);
|
|
137
|
+
if (!playwrightVersion) {
|
|
138
|
+
logger_1.logger.error(`[Merge Reports] Could not determine Playwright version from blob reports`);
|
|
139
|
+
return { success: false };
|
|
140
|
+
}
|
|
141
|
+
logger_1.logger.debug(`[Merge Reports] Playwright version: ${playwrightVersion}`);
|
|
73
142
|
await (0, cmd_1.spawnCmd)("npx", [
|
|
74
143
|
"--yes",
|
|
75
|
-
|
|
144
|
+
`playwright@${playwrightVersion}`,
|
|
76
145
|
"merge-reports",
|
|
77
146
|
blobDir,
|
|
78
147
|
"--reporter",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-case-sync-reporter.d.ts","sourceRoot":"","sources":["../../src/reporters/test-case-sync-reporter.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,wDAAwD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
// Re-exports the @empiricalrun/playwright-utils test-case-sync reporter so the
|
|
8
|
+
// test-run-worker can point Playwright at a copy resolved from test-run's own
|
|
9
|
+
// node_modules (a worker-controlled, version-pinned location) rather than from
|
|
10
|
+
// the customer repo's installed @empiricalrun/playwright-utils. This decouples
|
|
11
|
+
// run-manifest generation from whatever playwright-utils version the customer
|
|
12
|
+
// happens to have, while the `test.id` values it reads still come from the
|
|
13
|
+
// customer's running Playwright (so they match the results reporter exactly).
|
|
14
|
+
//
|
|
15
|
+
// The reporter only uses the public Playwright Reporter API and has no runtime
|
|
16
|
+
// dependency on a specific @playwright/test, so it loads cleanly into the
|
|
17
|
+
// customer's Playwright process when referenced by absolute path.
|
|
18
|
+
var test_case_sync_reporter_1 = require("@empiricalrun/playwright-utils/test-case-sync-reporter");
|
|
19
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(test_case_sync_reporter_1).default; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAW,UAAU,EAAc,MAAM,UAAU,CAAC;AAWjE,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,YAAU,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAED,eAAO,MAAM,gCAAgC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAW,UAAU,EAAc,MAAM,UAAU,CAAC;AAWjE,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,YAAU,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BnB;AAED,eAAO,MAAM,gCAAgC,eAC/B,UAAU,KACrB,MAgBF,CAAC;AAEF,wBAAsB,eAAe,CAAC,EACpC,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,CAStE;AAED,wBAAsB,YAAY,CAAC,EACjC,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAWnE;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,IAAI,GAAG,SAAS,GACrB,IAAI,GAAG,SAAS,CA2BlB;AAED,wBAAsB,0CAA0C,CAC9D,QAAQ,EAAE,MAAM,oBA+BjB;AAED,wBAAsB,cAAc,CAAC,EACnC,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,UAAU,CAAC;IACvB,kBAAkB,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IACtC,YAAY,EAAE,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,iBAgBA;AAED,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAE/D,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CACR;IACE,UAAU,EAAE,OAAO,CAAC;IACpB,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C,EAAE,CACJ,CAkBA;AAED,eAAO,MAAM,sBAAsB,gCAGhC;IACD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB,KAAG,OAAO,CAAC,MAAM,EAAE,CAgBnB,CAAC;AAEF,eAAO,MAAM,wBAAwB,gCAIlC;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,KAAG,OAAO,CAAC,MAAM,EAAE,CAgBnB,CAAC;AAEF,eAAO,MAAM,aAAa,aAAoB,MAAM,KAAG,OAAO,CAAC,IAAI,CAclE,CAAC;AAEF,eAAO,MAAM,aAAa,QAAO,MAEhC,CAAC;AAqEF,eAAO,MAAM,sBAAsB,cACtB,MAAM,WACR,MAAM,kBAmBhB,CAAC;AA0BF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,YAAY,EACZ,MAAM,EACN,OAAO,EACP,OAAO,GACR,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG;IACF,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;CACxB,CAiDA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@empiricalrun/test-run",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.2",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -36,8 +36,9 @@
|
|
|
36
36
|
"js-yaml": "^4.1.0",
|
|
37
37
|
"minimatch": "^10.0.1",
|
|
38
38
|
"ts-morph": "^23.0.0",
|
|
39
|
+
"@empiricalrun/playwright-utils": "^0.55.0",
|
|
39
40
|
"@empiricalrun/r2-uploader": "^0.9.1",
|
|
40
|
-
"@empiricalrun/reporter": "^0.29.
|
|
41
|
+
"@empiricalrun/reporter": "^0.29.1"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@playwright/test": "1.60.0",
|
|
@@ -46,14 +47,15 @@
|
|
|
46
47
|
"@types/console-log-level": "^1.4.5",
|
|
47
48
|
"@types/node": "^22.5.5",
|
|
48
49
|
"memfs": "^4.17.1",
|
|
49
|
-
"@empiricalrun/shared-types": "0.
|
|
50
|
+
"@empiricalrun/shared-types": "0.15.3"
|
|
50
51
|
},
|
|
51
52
|
"scripts": {
|
|
52
|
-
"dev": "
|
|
53
|
-
"build": "
|
|
53
|
+
"dev": "tsgo --build --watch",
|
|
54
|
+
"build": "tsgo --build",
|
|
54
55
|
"clean": "rm -rf dist && tsc --build --clean",
|
|
55
56
|
"lint": "biome check --unsafe",
|
|
56
57
|
"test": "vitest run",
|
|
57
|
-
"test:watch": "vitest"
|
|
58
|
+
"test:watch": "vitest",
|
|
59
|
+
"typecheck": "tsgo --noEmit"
|
|
58
60
|
}
|
|
59
61
|
}
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/cmd.ts","./src/dashboard.ts","./src/env-files.ts","./src/failed-test-list.ts","./src/glob-matcher.ts","./src/index.ts","./src/logger.ts","./src/bin/index.ts","./src/bin/commands/failed-list.ts","./src/bin/commands/merge.ts","./src/bin/commands/run.ts","./src/lib/cmd.ts","./src/lib/run-all-tests.ts","./src/lib/run-specific-test.ts","./src/lib/memfs/read-hello-world.ts","./src/lib/merge-reports/html.ts","./src/lib/merge-reports/index.ts","./src/lib/merge-reports/json.ts","./src/lib/merge-reports/types.ts","./src/stdout-parser/index.ts","./src/types/index.ts","./src/utils/config-parser.ts","./src/utils/config.ts","./src/utils/index.ts"]
|
|
1
|
+
{"version":"7.0.0-dev.20260623.1","root":["./src/cmd.ts","./src/dashboard.ts","./src/env-files.ts","./src/failed-test-list.ts","./src/glob-matcher.ts","./src/index.ts","./src/logger.ts","./src/bin/index.ts","./src/bin/commands/failed-list.ts","./src/bin/commands/merge.ts","./src/bin/commands/run.ts","./src/lib/cmd.ts","./src/lib/run-all-tests.ts","./src/lib/run-specific-test.ts","./src/lib/memfs/read-hello-world.ts","./src/lib/merge-reports/html.ts","./src/lib/merge-reports/index.ts","./src/lib/merge-reports/json.ts","./src/lib/merge-reports/types.ts","./src/reporters/test-case-sync-reporter.ts","./src/stdout-parser/index.ts","./src/types/index.ts","./src/utils/config-parser.ts","./src/utils/config.ts","./src/utils/index.ts"]}
|