@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 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
@@ -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,GAC3B,iBAAiB,MAAM,KACtB,OAAO,CAAC,WAAW,CAwDrB,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAa,OAAO,CACxD,mBAAmB,EAAE,CAkDtB,CAAC"}
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://dash.empirical.run";
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) {
@@ -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;AAwDF,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"}
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
- if (typeof e.name !== "string" || !e.name.trim())
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,CAgB/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,CAmCjB"}
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"}
@@ -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://dash.empirical.run";
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,GACvC,OAAO,MAAM,EAAE,EACf,iBAAiB,MAAM,EAAE,EAAE,KAC1B,MAAM,EAUR,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GACvC,iBAAiB,MAAM,EAAE,EACzB,UAAU,MAAM,EAAE,KACjB,MAAM,EASR,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B,GACzC,iBAAiB,MAAM,EAAE,EACzB,OAAO,MAAM,EAAE,EACf,QAAQ,MAAM,EAAE,KACf,MAAM,EAYR,CAAC"}
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
@@ -23,4 +23,5 @@ export declare function spawnCmd(command: string, args: string[], options: {
23
23
  code: number;
24
24
  output?: string;
25
25
  }>;
26
+ export declare function getChildProcessGraceMs(): number;
26
27
  //# sourceMappingURL=cmd.d.ts.map
@@ -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;AAExC,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"}
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
- // Clean up signal handlers when the process exits
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
- try {
93
- process.kill(-proc.pid, signal);
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":"AAaA,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAsIf"}
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
- // Support both old format (1.53.x) and new format (1.57.0+)
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
- let updatedHtml;
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,CAsC/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"}
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
- "playwright@1.58.2",
144
+ `playwright@${playwrightVersion}`,
76
145
  "merge-reports",
77
146
  blobDir,
78
147
  "--reporter",
@@ -0,0 +1,2 @@
1
+ export { default } from "@empiricalrun/playwright-utils/test-case-sync-reporter";
2
+ //# sourceMappingURL=test-case-sync-reporter.d.ts.map
@@ -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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/test-run",
3
- "version": "0.17.0",
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.0"
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.13.0"
50
+ "@empiricalrun/shared-types": "0.15.3"
50
51
  },
51
52
  "scripts": {
52
- "dev": "tsc --build --watch",
53
- "build": "tsc --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
  }
@@ -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"],"version":"5.8.3"}
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"]}