@empiricalrun/test-run 0.17.1 → 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,13 @@
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
+
3
11
  ## 0.17.1
4
12
 
5
13
  ### Patch 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":"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,CA6Bf;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"}
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"}
@@ -84,8 +84,9 @@ function parsePlaywrightVersionFromReportJsonl(content) {
84
84
  const userAgent = event.params?.userAgent;
85
85
  if (typeof userAgent === "string") {
86
86
  const match = userAgent.match(/\bPlaywright\/([^\s)]+)/);
87
- if (match?.[1])
87
+ if (match?.[1]) {
88
88
  userAgentVersion = match[1];
89
+ }
89
90
  }
90
91
  }
91
92
  }
@@ -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.1",
3
+ "version": "0.17.2",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -36,6 +36,7 @@
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
41
  "@empiricalrun/reporter": "^0.29.1"
41
42
  },
@@ -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.14.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"]}