@rpcbase/test 0.341.0 → 0.343.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.
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/runners/playwright.ts"],"names":[],"mappings":"AA0DA,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CA2Ff"}
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../../src/runners/playwright.ts"],"names":[],"mappings":"AAmEA,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CAsFf"}
@@ -10,7 +10,7 @@ const COMBINED_COVERAGE_ENV_VAR = "RB_TEST_COMBINED_COVERAGE";
10
10
  const PLAYWRIGHT_RESULTS_FILE = path.join(process.cwd(), "build", "playwright", "results.json");
11
11
  const PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE = /* @__PURE__ */ new Set(["--browser", "--config", "-c", "--grep", "-g", "--grep-invert", "--global-timeout", "--max-failures", "--output", "--project", "--repeat-each", "--reporter", "--retries", "--shard", "--timeout", "--trace", "--tsconfig", "--workers", "-j"]);
12
12
  const PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE = /* @__PURE__ */ new Set(["--only-changed", "--update-snapshots", "-u"]);
13
- const PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY = /* @__PURE__ */ new Set(["--last-failed", "--only-changed", "--retries", "--pass-with-no-tests"]);
13
+ const PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY = /* @__PURE__ */ new Set(["--last-failed", "--only-changed", "--output", "--retries", "--pass-with-no-tests", "--reporter", "--workers", "-j"]);
14
14
  const PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN = /* @__PURE__ */ new Set(["--retries"]);
15
15
  async function runPlaywright(userArgs, {
16
16
  disableCoverage = false
@@ -29,13 +29,15 @@ async function runPlaywright(userArgs, {
29
29
  if (disableCoverage) {
30
30
  env.RB_DISABLE_COVERAGE = "1";
31
31
  }
32
- const configuredRetries = await resolveFreshWorkerRetryBudget({
32
+ const runtimeSettings = await resolveFreshWorkerRetrySettings({
33
33
  launcher,
34
34
  configPath,
35
35
  hasCustomConfig,
36
36
  userArgs,
37
37
  env
38
38
  });
39
+ const configuredRetries = runtimeSettings.retries;
40
+ const retryConcurrency = Math.max(1, runtimeSettings.workers ?? 1);
39
41
  const resultsMtimeBeforeRun = getFileMtimeMs(PLAYWRIGHT_RESULTS_FILE);
40
42
  const initialRunArgs = buildPlaywrightInitialFreshWorkerArgs(userArgs);
41
43
  const initialPlaywrightArgs = ["test"];
@@ -59,27 +61,22 @@ async function runPlaywright(userArgs, {
59
61
  let failedFiles = summary.failedFiles;
60
62
  const maxAttempts = configuredRetries;
61
63
  for (let attempt = 1; attempt <= maxAttempts && failedFiles.length > 0; attempt += 1) {
62
- console.warn(`[rb-test] Retrying ${failedFiles.length} failed Playwright file(s) with fresh workers (${attempt}/${maxAttempts})`);
63
- const nextFailedFiles = [];
64
- for (const failedFile of failedFiles) {
65
- const retryArgs = buildPlaywrightWorkerRetryArgs(userArgs, [failedFile]);
66
- const retryPlaywrightArgs = ["test"];
67
- if (!hasCustomConfig) {
68
- retryPlaywrightArgs.push("--config", configPath);
69
- }
70
- retryPlaywrightArgs.push(...retryArgs);
71
- try {
72
- await runPlaywrightOnce({
73
- launcher,
74
- args: retryPlaywrightArgs,
75
- env
76
- });
77
- } catch (retryError) {
78
- lastError = retryError;
79
- nextFailedFiles.push(failedFile);
80
- }
64
+ const activeRetryWorkers = Math.max(1, Math.min(retryConcurrency, failedFiles.length));
65
+ console.warn(`[rb-test] Retrying ${failedFiles.length} failed Playwright file(s) with fresh workers (${attempt}/${maxAttempts}, up to ${activeRetryWorkers} in parallel)`);
66
+ const retryResults = await runPlaywrightRetryAttempt({
67
+ launcher,
68
+ userArgs,
69
+ failedFiles,
70
+ retryConcurrency: activeRetryWorkers,
71
+ configPath,
72
+ hasCustomConfig,
73
+ env,
74
+ attempt
75
+ });
76
+ if (retryResults.lastError) {
77
+ lastError = retryResults.lastError;
81
78
  }
82
- failedFiles = nextFailedFiles;
79
+ failedFiles = retryResults.failedFiles;
83
80
  }
84
81
  if (failedFiles.length === 0) {
85
82
  return;
@@ -90,15 +87,19 @@ async function runPlaywright(userArgs, {
90
87
  function runPlaywrightOnce({
91
88
  launcher,
92
89
  args,
93
- env
90
+ env,
91
+ outputMode = "chunk",
92
+ successMessage,
93
+ failureMessage
94
94
  }) {
95
95
  return spawnWithLogs({
96
96
  name: "Playwright",
97
97
  launcher,
98
98
  args,
99
99
  env,
100
- successMessage: "Playwright suite passed!",
101
- failureMessage: "Playwright failed"
100
+ outputMode,
101
+ successMessage: successMessage === void 0 ? "Playwright suite passed!" : successMessage ?? void 0,
102
+ failureMessage: failureMessage === void 0 ? "Playwright failed" : failureMessage ?? void 0
102
103
  });
103
104
  }
104
105
  function resolvePlaywrightLauncher() {
@@ -137,10 +138,10 @@ function resolveCliPath() {
137
138
  }
138
139
  return null;
139
140
  }
140
- function buildPlaywrightWorkerRetryArgs(userArgs, failedFiles) {
141
+ function buildPlaywrightWorkerRetryArgs(userArgs, failedFiles, attempt) {
141
142
  const optionArgs = extractPlaywrightOptionArgs(userArgs);
142
143
  const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY);
143
- return [...sanitizedOptions, "--retries=0", ...failedFiles];
144
+ return [...sanitizedOptions, "--retries=0", "--workers=1", "--reporter=list", "--output", buildPlaywrightRetryOutputDir(attempt, failedFiles), ...failedFiles];
144
145
  }
145
146
  function buildPlaywrightInitialFreshWorkerArgs(userArgs) {
146
147
  const optionArgs = extractPlaywrightOptionArgs(userArgs);
@@ -148,51 +149,26 @@ function buildPlaywrightInitialFreshWorkerArgs(userArgs) {
148
149
  const positionalArgs = extractPlaywrightPositionalArgs(userArgs);
149
150
  return [...sanitizedOptions, "--retries=0", ...positionalArgs];
150
151
  }
151
- async function resolveFreshWorkerRetryBudget({
152
+ async function resolveFreshWorkerRetrySettings({
152
153
  launcher,
153
154
  configPath,
154
155
  hasCustomConfig,
155
156
  userArgs,
156
157
  env
157
158
  }) {
158
- const cliRetries = resolveRetriesOverrideFromCli(userArgs);
159
- if (cliRetries != null) {
160
- return cliRetries;
161
- }
162
- const configuredRetries = await probeConfiguredPlaywrightRetries({
159
+ const configuredSettings = await probeConfiguredPlaywrightSettings({
163
160
  launcher,
164
161
  configPath,
165
162
  hasCustomConfig,
166
163
  userArgs,
167
164
  env
168
165
  });
169
- if (configuredRetries == null) {
170
- return 0;
171
- }
172
- return configuredRetries;
173
- }
174
- function resolveRetriesOverrideFromCli(userArgs) {
175
- for (let i = userArgs.length - 1; i >= 0; i -= 1) {
176
- const arg = userArgs[i];
177
- if (arg.startsWith("--retries=")) {
178
- const value = Number(arg.slice("--retries=".length));
179
- if (Number.isFinite(value)) {
180
- return Math.max(0, Math.floor(value));
181
- }
182
- return null;
183
- }
184
- if (arg === "--retries") {
185
- const valueArg = userArgs[i + 1];
186
- const value = Number(valueArg);
187
- if (valueArg != null && Number.isFinite(value)) {
188
- return Math.max(0, Math.floor(value));
189
- }
190
- return null;
191
- }
192
- }
193
- return null;
166
+ return {
167
+ retries: configuredSettings.retries ?? 0,
168
+ workers: configuredSettings.workers
169
+ };
194
170
  }
195
- async function probeConfiguredPlaywrightRetries({
171
+ async function probeConfiguredPlaywrightSettings({
196
172
  launcher,
197
173
  configPath,
198
174
  hasCustomConfig,
@@ -213,11 +189,20 @@ async function probeConfiguredPlaywrightRetries({
213
189
  });
214
190
  const json = parseJsonObjectFromText(stdout);
215
191
  if (!json) {
216
- return null;
192
+ return {
193
+ retries: null,
194
+ workers: null
195
+ };
217
196
  }
218
- return resolvePlaywrightRetriesFromReport(json);
197
+ return {
198
+ retries: resolvePlaywrightRetriesFromReport(json),
199
+ workers: resolvePlaywrightWorkersFromReport(json)
200
+ };
219
201
  } catch (_error) {
220
- return null;
202
+ return {
203
+ retries: null,
204
+ workers: null
205
+ };
221
206
  }
222
207
  }
223
208
  function extractPlaywrightProjectArgs(userArgs) {
@@ -382,6 +367,18 @@ function resolvePlaywrightRetriesFromReport(data) {
382
367
  }
383
368
  return 0;
384
369
  }
370
+ function resolvePlaywrightWorkersFromReport(data) {
371
+ const configWorkers = Number(data?.config?.workers);
372
+ if (Number.isFinite(configWorkers)) {
373
+ return Math.max(1, Math.floor(configWorkers));
374
+ }
375
+ const projects = Array.isArray(data?.config?.projects) ? data.config.projects : [];
376
+ const workersFromProjects = projects.map((project) => Number(project?.metadata?.actualWorkers ?? project?.workers)).filter((value) => Number.isFinite(value)).map((value) => Math.max(1, Math.floor(value)));
377
+ if (workersFromProjects.length > 0) {
378
+ return Math.max(...workersFromProjects);
379
+ }
380
+ return null;
381
+ }
385
382
  function resolveFailedPlaywrightFiles(data) {
386
383
  const suites = Array.isArray(data?.suites) ? data.suites : [];
387
384
  const rootDir = typeof data?.config?.rootDir === "string" ? data.config.rootDir : null;
@@ -455,6 +452,56 @@ function normalizePlaywrightReportFile(filePath, rootDir) {
455
452
  function toPosixPath(input) {
456
453
  return String(input ?? "").split(path.sep).join("/");
457
454
  }
455
+ function buildPlaywrightRetryOutputDir(attempt, failedFiles) {
456
+ const slug = failedFiles.map((file) => toPosixPath(file).replace(/[^a-zA-Z0-9._/-]+/g, "-").replace(/\//g, "__")).join("--");
457
+ return toPosixPath(path.join("build", "playwright", "test-results", "rb-retries", `attempt-${attempt}`, slug));
458
+ }
459
+ async function runPlaywrightRetryAttempt({
460
+ launcher,
461
+ userArgs,
462
+ failedFiles,
463
+ retryConcurrency,
464
+ configPath,
465
+ hasCustomConfig,
466
+ env,
467
+ attempt
468
+ }) {
469
+ const failedAgain = /* @__PURE__ */ new Set();
470
+ let lastError = null;
471
+ let nextIndex = 0;
472
+ async function runNext() {
473
+ while (nextIndex < failedFiles.length) {
474
+ const fileIndex = nextIndex;
475
+ nextIndex += 1;
476
+ const failedFile = failedFiles[fileIndex];
477
+ const retryArgs = buildPlaywrightWorkerRetryArgs(userArgs, [failedFile], attempt);
478
+ const retryPlaywrightArgs = ["test"];
479
+ if (!hasCustomConfig) {
480
+ retryPlaywrightArgs.push("--config", configPath);
481
+ }
482
+ retryPlaywrightArgs.push(...retryArgs);
483
+ try {
484
+ await runPlaywrightOnce({
485
+ launcher,
486
+ args: retryPlaywrightArgs,
487
+ env,
488
+ outputMode: "line",
489
+ successMessage: null
490
+ });
491
+ } catch (retryError) {
492
+ lastError = retryError;
493
+ failedAgain.add(failedFile);
494
+ }
495
+ }
496
+ }
497
+ await Promise.all(Array.from({
498
+ length: Math.max(1, Math.min(retryConcurrency, failedFiles.length))
499
+ }, () => runNext()));
500
+ return {
501
+ failedFiles: failedFiles.filter((failedFile) => failedAgain.has(failedFile)),
502
+ lastError
503
+ };
504
+ }
458
505
  async function readJson(filePath) {
459
506
  try {
460
507
  const raw = await fs$1.readFile(filePath, "utf8");
@@ -1 +1 @@
1
- {"version":3,"file":"playwright.js","sources":["../../src/runners/playwright.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport fsPromises from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { spawnAndCaptureStdout, spawnWithLogs, withRegisterShim, type SpawnLauncher } from \"./process\"\n\n\nconst require = createRequire(import.meta.url)\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\n\nconst COMBINED_COVERAGE_ENV_VAR = \"RB_TEST_COMBINED_COVERAGE\"\nconst PLAYWRIGHT_RESULTS_FILE = path.join(process.cwd(), \"build\", \"playwright\", \"results.json\")\n\ntype PlaywrightReportSummary = {\n failedFiles: string[]\n}\n\nconst PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE = new Set([\n \"--browser\",\n \"--config\",\n \"-c\",\n \"--grep\",\n \"-g\",\n \"--grep-invert\",\n \"--global-timeout\",\n \"--max-failures\",\n \"--output\",\n \"--project\",\n \"--repeat-each\",\n \"--reporter\",\n \"--retries\",\n \"--shard\",\n \"--timeout\",\n \"--trace\",\n \"--tsconfig\",\n \"--workers\",\n \"-j\",\n])\n\nconst PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE = new Set([\n \"--only-changed\",\n \"--update-snapshots\",\n \"-u\",\n])\n\nconst PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY = new Set([\n \"--last-failed\",\n \"--only-changed\",\n \"--retries\",\n \"--pass-with-no-tests\",\n])\n\nconst PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN = new Set([\n \"--retries\",\n])\n\nexport async function runPlaywright(\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const configPath = fs.existsSync(\n path.join(process.cwd(), \"playwright.config.ts\"),\n )\n ? path.join(process.cwd(), \"playwright.config.ts\")\n : path.join(moduleDir, \"..\", \"playwright.config.ts\")\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n\n return arg.startsWith(\"--config=\")\n })\n\n ensureJsxRuntimeShim(process.cwd())\n const launcher = resolvePlaywrightLauncher()\n const env = withRegisterShim(process.env)\n env[COMBINED_COVERAGE_ENV_VAR] = \"1\"\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n const configuredRetries = await resolveFreshWorkerRetryBudget({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n })\n\n const resultsMtimeBeforeRun = getFileMtimeMs(PLAYWRIGHT_RESULTS_FILE)\n const initialRunArgs = buildPlaywrightInitialFreshWorkerArgs(userArgs)\n const initialPlaywrightArgs = [\"test\"]\n if (!hasCustomConfig) {\n initialPlaywrightArgs.push(\"--config\", configPath)\n }\n initialPlaywrightArgs.push(...initialRunArgs)\n\n try {\n await runPlaywrightOnce({\n launcher,\n args: initialPlaywrightArgs,\n env,\n })\n return\n } catch (error) {\n const summary = await readPlaywrightReportSummary(PLAYWRIGHT_RESULTS_FILE, resultsMtimeBeforeRun)\n if (!summary || configuredRetries <= 0 || summary.failedFiles.length === 0) {\n throw error\n }\n\n let lastError = error\n let failedFiles = summary.failedFiles\n const maxAttempts = configuredRetries\n\n for (let attempt = 1; attempt <= maxAttempts && failedFiles.length > 0; attempt += 1) {\n console.warn(\n `[rb-test] Retrying ${failedFiles.length} failed Playwright file(s) with fresh workers (${attempt}/${maxAttempts})`,\n )\n const nextFailedFiles: string[] = []\n\n for (const failedFile of failedFiles) {\n const retryArgs = buildPlaywrightWorkerRetryArgs(userArgs, [failedFile])\n const retryPlaywrightArgs = [\"test\"]\n if (!hasCustomConfig) {\n retryPlaywrightArgs.push(\"--config\", configPath)\n }\n retryPlaywrightArgs.push(...retryArgs)\n\n try {\n await runPlaywrightOnce({\n launcher,\n args: retryPlaywrightArgs,\n env,\n })\n } catch (retryError) {\n lastError = retryError\n nextFailedFiles.push(failedFile)\n }\n }\n\n failedFiles = nextFailedFiles\n }\n\n if (failedFiles.length === 0) {\n return\n }\n\n throw lastError\n }\n}\n\nfunction runPlaywrightOnce({\n launcher,\n args,\n env,\n}: {\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n}): Promise<void> {\n return spawnWithLogs({\n name: \"Playwright\",\n launcher,\n args,\n env,\n successMessage: \"Playwright suite passed!\",\n failureMessage: \"Playwright failed\",\n })\n}\n\nfunction resolvePlaywrightLauncher(): SpawnLauncher {\n const cliPath = resolveCliPath()\n if (cliPath) {\n return {\n command: process.execPath,\n args: [cliPath],\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/playwright\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"playwright\",\n args: [],\n }\n}\n\nfunction resolveCliPath(): string | null {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"@playwright/test/package.json\", { paths: [base] })\n const cliPath = path.join(path.dirname(pkgPath), \"cli.js\")\n if (fs.existsSync(cliPath)) {\n return cliPath\n }\n } catch (_error) {\n // Continue searching for a usable playwright launcher.\n }\n }\n\n return null\n}\n\nfunction buildPlaywrightWorkerRetryArgs(userArgs: string[], failedFiles: string[]): string[] {\n const optionArgs = extractPlaywrightOptionArgs(userArgs)\n const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY)\n return [...sanitizedOptions, \"--retries=0\", ...failedFiles]\n}\n\nfunction buildPlaywrightInitialFreshWorkerArgs(userArgs: string[]): string[] {\n const optionArgs = extractPlaywrightOptionArgs(userArgs)\n const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN)\n const positionalArgs = extractPlaywrightPositionalArgs(userArgs)\n return [...sanitizedOptions, \"--retries=0\", ...positionalArgs]\n}\n\nasync function resolveFreshWorkerRetryBudget({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n}: {\n launcher: SpawnLauncher\n configPath: string\n hasCustomConfig: boolean\n userArgs: string[]\n env: NodeJS.ProcessEnv\n}): Promise<number> {\n const cliRetries = resolveRetriesOverrideFromCli(userArgs)\n if (cliRetries != null) {\n return cliRetries\n }\n\n const configuredRetries = await probeConfiguredPlaywrightRetries({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n })\n\n if (configuredRetries == null) {\n return 0\n }\n\n return configuredRetries\n}\n\nfunction resolveRetriesOverrideFromCli(userArgs: string[]): number | null {\n for (let i = userArgs.length - 1; i >= 0; i -= 1) {\n const arg = userArgs[i]\n if (arg.startsWith(\"--retries=\")) {\n const value = Number(arg.slice(\"--retries=\".length))\n if (Number.isFinite(value)) {\n return Math.max(0, Math.floor(value))\n }\n return null\n }\n\n if (arg === \"--retries\") {\n const valueArg = userArgs[i + 1]\n const value = Number(valueArg)\n if (valueArg != null && Number.isFinite(value)) {\n return Math.max(0, Math.floor(value))\n }\n return null\n }\n }\n\n return null\n}\n\nasync function probeConfiguredPlaywrightRetries({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n}: {\n launcher: SpawnLauncher\n configPath: string\n hasCustomConfig: boolean\n userArgs: string[]\n env: NodeJS.ProcessEnv\n}): Promise<number | null> {\n const probeArgs = [\"test\"]\n if (!hasCustomConfig) {\n probeArgs.push(\"--config\", configPath)\n }\n probeArgs.push(\"--list\", \"--reporter=json\", ...extractPlaywrightProjectArgs(userArgs))\n\n try {\n const stdout = await spawnAndCaptureStdout({\n name: \"Playwright retries probe\",\n launcher,\n args: probeArgs,\n env,\n })\n const json = parseJsonObjectFromText(stdout)\n if (!json) {\n return null\n }\n return resolvePlaywrightRetriesFromReport(json)\n } catch (_error) {\n return null\n }\n}\n\nfunction extractPlaywrightProjectArgs(userArgs: string[]): string[] {\n const output: string[] = []\n for (let i = 0; i < userArgs.length; i += 1) {\n const arg = userArgs[i]\n if (arg === \"--\") {\n break\n }\n if (arg === \"--project\") {\n const next = userArgs[i + 1]\n if (next != null) {\n output.push(arg, next)\n i += 1\n }\n continue\n }\n if (arg.startsWith(\"--project=\")) {\n output.push(arg)\n }\n }\n return output\n}\n\nfunction parseJsonObjectFromText(input: string): any | null {\n try {\n return JSON.parse(input)\n } catch {\n const start = input.indexOf(\"{\")\n const end = input.lastIndexOf(\"}\")\n if (start === -1 || end === -1 || end <= start) {\n return null\n }\n try {\n return JSON.parse(input.slice(start, end + 1))\n } catch {\n return null\n }\n }\n}\n\nfunction extractPlaywrightPositionalArgs(userArgs: string[]): string[] {\n const output: string[] = []\n\n for (let i = 0; i < userArgs.length; i += 1) {\n const arg = userArgs[i]\n\n if (arg === \"--\") {\n break\n }\n\n if (!arg.startsWith(\"-\")) {\n output.push(arg)\n continue\n }\n\n if (arg.includes(\"=\")) {\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined) {\n i += 1\n }\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n i += 1\n }\n }\n }\n\n return output\n}\n\nfunction removePlaywrightOptions(optionArgs: string[], optionsToRemove: Set<string>): string[] {\n const output: string[] = []\n for (let i = 0; i < optionArgs.length; i += 1) {\n const arg = optionArgs[i]\n const normalized = arg.split(\"=\")[0]\n if (!arg.startsWith(\"-\") || !optionsToRemove.has(normalized)) {\n output.push(arg)\n continue\n }\n\n if (arg.includes(\"=\")) {\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(normalized)) {\n const next = optionArgs[i + 1]\n if (next !== undefined) {\n i += 1\n }\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(normalized)) {\n const next = optionArgs[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n i += 1\n }\n }\n }\n return output\n}\n\nfunction extractPlaywrightOptionArgs(userArgs: string[]): string[] {\n const output: string[] = []\n\n for (let i = 0; i < userArgs.length; i += 1) {\n const arg = userArgs[i]\n\n if (arg === \"--\") {\n break\n }\n\n if (!arg.startsWith(\"-\")) {\n continue\n }\n\n output.push(arg)\n\n if (arg.includes(\"=\")) {\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined) {\n output.push(next)\n i += 1\n }\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n output.push(next)\n i += 1\n }\n }\n }\n\n return output\n}\n\nasync function readPlaywrightReportSummary(\n resultsFilePath: string,\n newerThanMtimeMs: number | null,\n): Promise<PlaywrightReportSummary | null> {\n const stats = await fsPromises.stat(resultsFilePath).catch(() => null)\n if (!stats) {\n return null\n }\n\n if (newerThanMtimeMs != null && stats.mtimeMs <= newerThanMtimeMs) {\n return null\n }\n\n const data = await readJson(resultsFilePath)\n if (!data || typeof data !== \"object\") {\n return null\n }\n\n return {\n failedFiles: resolveFailedPlaywrightFiles(data),\n }\n}\n\nfunction getFileMtimeMs(filePath: string): number | null {\n try {\n return fs.statSync(filePath).mtimeMs\n } catch {\n return null\n }\n}\n\nfunction resolvePlaywrightRetriesFromReport(data: any): number {\n const projects = Array.isArray(data?.config?.projects) ? data.config.projects : []\n const retriesFromProjects = projects\n .map((project: any) => Number(project?.retries))\n .filter((value: number) => Number.isFinite(value))\n .map((value: number) => Math.max(0, Math.floor(value)))\n\n if (retriesFromProjects.length > 0) {\n return Math.max(...retriesFromProjects)\n }\n\n const fallback = Number(data?.config?.retries)\n if (Number.isFinite(fallback)) {\n return Math.max(0, Math.floor(fallback))\n }\n\n return 0\n}\n\nfunction resolveFailedPlaywrightFiles(data: any): string[] {\n const suites = Array.isArray(data?.suites) ? data.suites : []\n const rootDir = typeof data?.config?.rootDir === \"string\" ? data.config.rootDir : null\n const failedFiles = new Set<string>()\n\n for (const suite of suites) {\n collectFailedPlaywrightFiles(suite, failedFiles, rootDir)\n }\n\n return Array.from(failedFiles).sort()\n}\n\nfunction collectFailedPlaywrightFiles(suite: any, output: Set<string>, rootDir: string | null): void {\n const specs = Array.isArray(suite?.specs) ? suite.specs : []\n\n for (const spec of specs) {\n if (isPlaywrightSpecSuccessful(spec)) {\n continue\n }\n const file = normalizePlaywrightReportFile(spec?.file ?? suite?.file, rootDir)\n if (file) {\n output.add(file)\n }\n }\n\n const innerSuites = Array.isArray(suite?.suites) ? suite.suites : []\n for (const innerSuite of innerSuites) {\n collectFailedPlaywrightFiles(innerSuite, output, rootDir)\n }\n}\n\nfunction isPlaywrightSpecSuccessful(spec: any): boolean {\n if (typeof spec?.ok === \"boolean\") {\n return spec.ok\n }\n\n const tests = Array.isArray(spec?.tests) ? spec.tests : []\n if (tests.length === 0) {\n return false\n }\n\n return tests.every((test: any) => {\n const testStatus = String(test?.status ?? \"\")\n if (testStatus === \"expected\" || testStatus === \"skipped\" || testStatus === \"flaky\") {\n return true\n }\n\n const results = Array.isArray(test?.results) ? test.results : []\n if (results.length === 0) {\n return false\n }\n return results.every((result: any) => result?.status === \"passed\" || result?.status === \"skipped\")\n })\n}\n\nfunction normalizePlaywrightReportFile(filePath: unknown, rootDir: string | null): string | null {\n const raw = String(filePath ?? \"\").trim()\n if (!raw) {\n return null\n }\n\n let absolutePath: string\n if (path.isAbsolute(raw)) {\n absolutePath = path.normalize(raw)\n } else {\n const cwdCandidate = path.resolve(process.cwd(), raw)\n const rootCandidate = rootDir ? path.resolve(rootDir, raw) : null\n if (rootCandidate && fs.existsSync(rootCandidate)) {\n absolutePath = rootCandidate\n } else if (fs.existsSync(cwdCandidate)) {\n absolutePath = cwdCandidate\n } else {\n absolutePath = rootCandidate ?? cwdCandidate\n }\n }\n\n const relative = path.relative(process.cwd(), absolutePath)\n if (relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))) {\n return toPosixPath(relative || raw)\n }\n\n return toPosixPath(raw)\n}\n\nfunction toPosixPath(input: unknown): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nasync function readJson(filePath: string): Promise<any | null> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\")\n return JSON.parse(raw)\n } catch {\n return null\n }\n}\n\nfunction ensureJsxRuntimeShim(projectRoot: string): void {\n const shimDir = path.join(projectRoot, \"node_modules\", \"playwright\")\n fs.mkdirSync(shimDir, { recursive: true })\n const shims = [\n { file: \"jsx-runtime.js\", target: \"react/jsx-runtime\" },\n { file: \"jsx-dev-runtime.js\", target: \"react/jsx-dev-runtime\" },\n ]\n\n for (const { file, target } of shims) {\n const filePath = path.join(shimDir, file)\n if (!fs.existsSync(filePath)) {\n const content = `export * from \"${target}\";\\nexport { default } from \"${target}\";\\n`\n fs.writeFileSync(filePath, content, \"utf8\")\n }\n }\n}\n"],"names":["require","createRequire","import","url","moduleDir","path","dirname","fileURLToPath","COMBINED_COVERAGE_ENV_VAR","PLAYWRIGHT_RESULTS_FILE","join","process","cwd","PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE","Set","PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE","PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY","PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN","runPlaywright","userArgs","disableCoverage","configPath","fs","existsSync","hasCustomConfig","some","arg","startsWith","ensureJsxRuntimeShim","launcher","resolvePlaywrightLauncher","env","withRegisterShim","RB_DISABLE_COVERAGE","configuredRetries","resolveFreshWorkerRetryBudget","resultsMtimeBeforeRun","getFileMtimeMs","initialRunArgs","buildPlaywrightInitialFreshWorkerArgs","initialPlaywrightArgs","push","runPlaywrightOnce","args","error","summary","readPlaywrightReportSummary","failedFiles","length","lastError","maxAttempts","attempt","console","warn","nextFailedFiles","failedFile","retryArgs","buildPlaywrightWorkerRetryArgs","retryPlaywrightArgs","retryError","spawnWithLogs","name","successMessage","failureMessage","cliPath","resolveCliPath","command","execPath","localBin","resolve","searchRoots","base","pkgPath","paths","_error","optionArgs","extractPlaywrightOptionArgs","sanitizedOptions","removePlaywrightOptions","positionalArgs","extractPlaywrightPositionalArgs","cliRetries","resolveRetriesOverrideFromCli","probeConfiguredPlaywrightRetries","i","value","Number","slice","isFinite","Math","max","floor","valueArg","probeArgs","extractPlaywrightProjectArgs","stdout","spawnAndCaptureStdout","json","parseJsonObjectFromText","resolvePlaywrightRetriesFromReport","output","next","input","JSON","parse","start","indexOf","end","lastIndexOf","includes","has","undefined","optionsToRemove","normalized","split","resultsFilePath","newerThanMtimeMs","stats","fsPromises","stat","catch","mtimeMs","data","readJson","resolveFailedPlaywrightFiles","filePath","statSync","projects","Array","isArray","config","retriesFromProjects","map","project","retries","filter","fallback","suites","rootDir","suite","collectFailedPlaywrightFiles","from","sort","specs","spec","isPlaywrightSpecSuccessful","file","normalizePlaywrightReportFile","add","innerSuites","innerSuite","ok","tests","every","test","testStatus","String","status","results","result","raw","trim","absolutePath","isAbsolute","normalize","cwdCandidate","rootCandidate","relative","toPosixPath","sep","readFile","projectRoot","shimDir","mkdirSync","recursive","shims","target","content","writeFileSync"],"mappings":"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"}
1
+ {"version":3,"file":"playwright.js","sources":["../../src/runners/playwright.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport fsPromises from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { spawnAndCaptureStdout, spawnWithLogs, withRegisterShim, type SpawnLauncher } from \"./process\"\n\n\nconst require = createRequire(import.meta.url)\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\n\nconst COMBINED_COVERAGE_ENV_VAR = \"RB_TEST_COMBINED_COVERAGE\"\nconst PLAYWRIGHT_RESULTS_FILE = path.join(process.cwd(), \"build\", \"playwright\", \"results.json\")\n\ntype PlaywrightReportSummary = {\n failedFiles: string[]\n}\n\ntype PlaywrightRuntimeSettings = {\n retries: number | null\n workers: number | null\n}\n\nconst PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE = new Set([\n \"--browser\",\n \"--config\",\n \"-c\",\n \"--grep\",\n \"-g\",\n \"--grep-invert\",\n \"--global-timeout\",\n \"--max-failures\",\n \"--output\",\n \"--project\",\n \"--repeat-each\",\n \"--reporter\",\n \"--retries\",\n \"--shard\",\n \"--timeout\",\n \"--trace\",\n \"--tsconfig\",\n \"--workers\",\n \"-j\",\n])\n\nconst PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE = new Set([\n \"--only-changed\",\n \"--update-snapshots\",\n \"-u\",\n])\n\nconst PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY = new Set([\n \"--last-failed\",\n \"--only-changed\",\n \"--output\",\n \"--retries\",\n \"--pass-with-no-tests\",\n \"--reporter\",\n \"--workers\",\n \"-j\",\n])\n\nconst PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN = new Set([\n \"--retries\",\n])\n\nexport async function runPlaywright(\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const configPath = fs.existsSync(\n path.join(process.cwd(), \"playwright.config.ts\"),\n )\n ? path.join(process.cwd(), \"playwright.config.ts\")\n : path.join(moduleDir, \"..\", \"playwright.config.ts\")\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n\n return arg.startsWith(\"--config=\")\n })\n\n ensureJsxRuntimeShim(process.cwd())\n const launcher = resolvePlaywrightLauncher()\n const env = withRegisterShim(process.env)\n env[COMBINED_COVERAGE_ENV_VAR] = \"1\"\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n const runtimeSettings = await resolveFreshWorkerRetrySettings({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n })\n const configuredRetries = runtimeSettings.retries\n const retryConcurrency = Math.max(1, runtimeSettings.workers ?? 1)\n\n const resultsMtimeBeforeRun = getFileMtimeMs(PLAYWRIGHT_RESULTS_FILE)\n const initialRunArgs = buildPlaywrightInitialFreshWorkerArgs(userArgs)\n const initialPlaywrightArgs = [\"test\"]\n if (!hasCustomConfig) {\n initialPlaywrightArgs.push(\"--config\", configPath)\n }\n initialPlaywrightArgs.push(...initialRunArgs)\n\n try {\n await runPlaywrightOnce({\n launcher,\n args: initialPlaywrightArgs,\n env,\n })\n return\n } catch (error) {\n const summary = await readPlaywrightReportSummary(PLAYWRIGHT_RESULTS_FILE, resultsMtimeBeforeRun)\n if (!summary || configuredRetries <= 0 || summary.failedFiles.length === 0) {\n throw error\n }\n\n let lastError = error\n let failedFiles = summary.failedFiles\n const maxAttempts = configuredRetries\n\n for (let attempt = 1; attempt <= maxAttempts && failedFiles.length > 0; attempt += 1) {\n const activeRetryWorkers = Math.max(1, Math.min(retryConcurrency, failedFiles.length))\n console.warn(\n `[rb-test] Retrying ${failedFiles.length} failed Playwright file(s) with fresh workers (${attempt}/${maxAttempts}, up to ${activeRetryWorkers} in parallel)`,\n )\n const retryResults = await runPlaywrightRetryAttempt({\n launcher,\n userArgs,\n failedFiles,\n retryConcurrency: activeRetryWorkers,\n configPath,\n hasCustomConfig,\n env,\n attempt,\n })\n\n if (retryResults.lastError) {\n lastError = retryResults.lastError\n }\n failedFiles = retryResults.failedFiles\n }\n\n if (failedFiles.length === 0) {\n return\n }\n\n throw lastError\n }\n}\n\nfunction runPlaywrightOnce({\n launcher,\n args,\n env,\n outputMode = \"chunk\",\n successMessage,\n failureMessage,\n}: {\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n outputMode?: \"chunk\" | \"line\"\n successMessage?: string | null\n failureMessage?: string | null\n}): Promise<void> {\n return spawnWithLogs({\n name: \"Playwright\",\n launcher,\n args,\n env,\n outputMode,\n successMessage: successMessage === undefined ? \"Playwright suite passed!\" : successMessage ?? undefined,\n failureMessage: failureMessage === undefined ? \"Playwright failed\" : failureMessage ?? undefined,\n })\n}\n\nfunction resolvePlaywrightLauncher(): SpawnLauncher {\n const cliPath = resolveCliPath()\n if (cliPath) {\n return {\n command: process.execPath,\n args: [cliPath],\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/playwright\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"playwright\",\n args: [],\n }\n}\n\nfunction resolveCliPath(): string | null {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"@playwright/test/package.json\", { paths: [base] })\n const cliPath = path.join(path.dirname(pkgPath), \"cli.js\")\n if (fs.existsSync(cliPath)) {\n return cliPath\n }\n } catch (_error) {\n // Continue searching for a usable playwright launcher.\n }\n }\n\n return null\n}\n\nfunction buildPlaywrightWorkerRetryArgs(userArgs: string[], failedFiles: string[], attempt: number): string[] {\n const optionArgs = extractPlaywrightOptionArgs(userArgs)\n const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY)\n return [\n ...sanitizedOptions,\n \"--retries=0\",\n \"--workers=1\",\n \"--reporter=list\",\n \"--output\",\n buildPlaywrightRetryOutputDir(attempt, failedFiles),\n ...failedFiles,\n ]\n}\n\nfunction buildPlaywrightInitialFreshWorkerArgs(userArgs: string[]): string[] {\n const optionArgs = extractPlaywrightOptionArgs(userArgs)\n const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN)\n const positionalArgs = extractPlaywrightPositionalArgs(userArgs)\n return [...sanitizedOptions, \"--retries=0\", ...positionalArgs]\n}\n\nasync function resolveFreshWorkerRetrySettings({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n}: {\n launcher: SpawnLauncher\n configPath: string\n hasCustomConfig: boolean\n userArgs: string[]\n env: NodeJS.ProcessEnv\n}): Promise<{ retries: number; workers: number | null }> {\n const configuredSettings = await probeConfiguredPlaywrightSettings({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n })\n\n return {\n retries: configuredSettings.retries ?? 0,\n workers: configuredSettings.workers,\n }\n}\n\nasync function probeConfiguredPlaywrightSettings({\n launcher,\n configPath,\n hasCustomConfig,\n userArgs,\n env,\n}: {\n launcher: SpawnLauncher\n configPath: string\n hasCustomConfig: boolean\n userArgs: string[]\n env: NodeJS.ProcessEnv\n}): Promise<PlaywrightRuntimeSettings> {\n const probeArgs = [\"test\"]\n if (!hasCustomConfig) {\n probeArgs.push(\"--config\", configPath)\n }\n probeArgs.push(\"--list\", \"--reporter=json\", ...extractPlaywrightProjectArgs(userArgs))\n\n try {\n const stdout = await spawnAndCaptureStdout({\n name: \"Playwright retries probe\",\n launcher,\n args: probeArgs,\n env,\n })\n const json = parseJsonObjectFromText(stdout)\n if (!json) {\n return { retries: null, workers: null }\n }\n return {\n retries: resolvePlaywrightRetriesFromReport(json),\n workers: resolvePlaywrightWorkersFromReport(json),\n }\n } catch (_error) {\n return { retries: null, workers: null }\n }\n}\n\nfunction extractPlaywrightProjectArgs(userArgs: string[]): string[] {\n const output: string[] = []\n for (let i = 0; i < userArgs.length; i += 1) {\n const arg = userArgs[i]\n if (arg === \"--\") {\n break\n }\n if (arg === \"--project\") {\n const next = userArgs[i + 1]\n if (next != null) {\n output.push(arg, next)\n i += 1\n }\n continue\n }\n if (arg.startsWith(\"--project=\")) {\n output.push(arg)\n }\n }\n return output\n}\n\nfunction parseJsonObjectFromText(input: string): any | null {\n try {\n return JSON.parse(input)\n } catch {\n const start = input.indexOf(\"{\")\n const end = input.lastIndexOf(\"}\")\n if (start === -1 || end === -1 || end <= start) {\n return null\n }\n try {\n return JSON.parse(input.slice(start, end + 1))\n } catch {\n return null\n }\n }\n}\n\nfunction extractPlaywrightPositionalArgs(userArgs: string[]): string[] {\n const output: string[] = []\n\n for (let i = 0; i < userArgs.length; i += 1) {\n const arg = userArgs[i]\n\n if (arg === \"--\") {\n break\n }\n\n if (!arg.startsWith(\"-\")) {\n output.push(arg)\n continue\n }\n\n if (arg.includes(\"=\")) {\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined) {\n i += 1\n }\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n i += 1\n }\n }\n }\n\n return output\n}\n\nfunction removePlaywrightOptions(optionArgs: string[], optionsToRemove: Set<string>): string[] {\n const output: string[] = []\n for (let i = 0; i < optionArgs.length; i += 1) {\n const arg = optionArgs[i]\n const normalized = arg.split(\"=\")[0]\n if (!arg.startsWith(\"-\") || !optionsToRemove.has(normalized)) {\n output.push(arg)\n continue\n }\n\n if (arg.includes(\"=\")) {\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(normalized)) {\n const next = optionArgs[i + 1]\n if (next !== undefined) {\n i += 1\n }\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(normalized)) {\n const next = optionArgs[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n i += 1\n }\n }\n }\n return output\n}\n\nfunction extractPlaywrightOptionArgs(userArgs: string[]): string[] {\n const output: string[] = []\n\n for (let i = 0; i < userArgs.length; i += 1) {\n const arg = userArgs[i]\n\n if (arg === \"--\") {\n break\n }\n\n if (!arg.startsWith(\"-\")) {\n continue\n }\n\n output.push(arg)\n\n if (arg.includes(\"=\")) {\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined) {\n output.push(next)\n i += 1\n }\n continue\n }\n\n if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(arg)) {\n const next = userArgs[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n output.push(next)\n i += 1\n }\n }\n }\n\n return output\n}\n\nasync function readPlaywrightReportSummary(\n resultsFilePath: string,\n newerThanMtimeMs: number | null,\n): Promise<PlaywrightReportSummary | null> {\n const stats = await fsPromises.stat(resultsFilePath).catch(() => null)\n if (!stats) {\n return null\n }\n\n if (newerThanMtimeMs != null && stats.mtimeMs <= newerThanMtimeMs) {\n return null\n }\n\n const data = await readJson(resultsFilePath)\n if (!data || typeof data !== \"object\") {\n return null\n }\n\n return {\n failedFiles: resolveFailedPlaywrightFiles(data),\n }\n}\n\nfunction getFileMtimeMs(filePath: string): number | null {\n try {\n return fs.statSync(filePath).mtimeMs\n } catch {\n return null\n }\n}\n\nfunction resolvePlaywrightRetriesFromReport(data: any): number {\n const projects = Array.isArray(data?.config?.projects) ? data.config.projects : []\n const retriesFromProjects = projects\n .map((project: any) => Number(project?.retries))\n .filter((value: number) => Number.isFinite(value))\n .map((value: number) => Math.max(0, Math.floor(value)))\n\n if (retriesFromProjects.length > 0) {\n return Math.max(...retriesFromProjects)\n }\n\n const fallback = Number(data?.config?.retries)\n if (Number.isFinite(fallback)) {\n return Math.max(0, Math.floor(fallback))\n }\n\n return 0\n}\n\nfunction resolvePlaywrightWorkersFromReport(data: any): number | null {\n const configWorkers = Number(data?.config?.workers)\n if (Number.isFinite(configWorkers)) {\n return Math.max(1, Math.floor(configWorkers))\n }\n\n const projects = Array.isArray(data?.config?.projects) ? data.config.projects : []\n const workersFromProjects = projects\n .map((project: any) => Number(project?.metadata?.actualWorkers ?? project?.workers))\n .filter((value: number) => Number.isFinite(value))\n .map((value: number) => Math.max(1, Math.floor(value)))\n\n if (workersFromProjects.length > 0) {\n return Math.max(...workersFromProjects)\n }\n\n return null\n}\n\nfunction resolveFailedPlaywrightFiles(data: any): string[] {\n const suites = Array.isArray(data?.suites) ? data.suites : []\n const rootDir = typeof data?.config?.rootDir === \"string\" ? data.config.rootDir : null\n const failedFiles = new Set<string>()\n\n for (const suite of suites) {\n collectFailedPlaywrightFiles(suite, failedFiles, rootDir)\n }\n\n return Array.from(failedFiles).sort()\n}\n\nfunction collectFailedPlaywrightFiles(suite: any, output: Set<string>, rootDir: string | null): void {\n const specs = Array.isArray(suite?.specs) ? suite.specs : []\n\n for (const spec of specs) {\n if (isPlaywrightSpecSuccessful(spec)) {\n continue\n }\n const file = normalizePlaywrightReportFile(spec?.file ?? suite?.file, rootDir)\n if (file) {\n output.add(file)\n }\n }\n\n const innerSuites = Array.isArray(suite?.suites) ? suite.suites : []\n for (const innerSuite of innerSuites) {\n collectFailedPlaywrightFiles(innerSuite, output, rootDir)\n }\n}\n\nfunction isPlaywrightSpecSuccessful(spec: any): boolean {\n if (typeof spec?.ok === \"boolean\") {\n return spec.ok\n }\n\n const tests = Array.isArray(spec?.tests) ? spec.tests : []\n if (tests.length === 0) {\n return false\n }\n\n return tests.every((test: any) => {\n const testStatus = String(test?.status ?? \"\")\n if (testStatus === \"expected\" || testStatus === \"skipped\" || testStatus === \"flaky\") {\n return true\n }\n\n const results = Array.isArray(test?.results) ? test.results : []\n if (results.length === 0) {\n return false\n }\n return results.every((result: any) => result?.status === \"passed\" || result?.status === \"skipped\")\n })\n}\n\nfunction normalizePlaywrightReportFile(filePath: unknown, rootDir: string | null): string | null {\n const raw = String(filePath ?? \"\").trim()\n if (!raw) {\n return null\n }\n\n let absolutePath: string\n if (path.isAbsolute(raw)) {\n absolutePath = path.normalize(raw)\n } else {\n const cwdCandidate = path.resolve(process.cwd(), raw)\n const rootCandidate = rootDir ? path.resolve(rootDir, raw) : null\n if (rootCandidate && fs.existsSync(rootCandidate)) {\n absolutePath = rootCandidate\n } else if (fs.existsSync(cwdCandidate)) {\n absolutePath = cwdCandidate\n } else {\n absolutePath = rootCandidate ?? cwdCandidate\n }\n }\n\n const relative = path.relative(process.cwd(), absolutePath)\n if (relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))) {\n return toPosixPath(relative || raw)\n }\n\n return toPosixPath(raw)\n}\n\nfunction toPosixPath(input: unknown): string {\n return String(input ?? \"\").split(path.sep).join(\"/\")\n}\n\nfunction buildPlaywrightRetryOutputDir(attempt: number, failedFiles: string[]): string {\n const slug = failedFiles\n .map((file) => toPosixPath(file).replace(/[^a-zA-Z0-9._/-]+/g, \"-\").replace(/\\//g, \"__\"))\n .join(\"--\")\n return toPosixPath(path.join(\"build\", \"playwright\", \"test-results\", \"rb-retries\", `attempt-${attempt}`, slug))\n}\n\nasync function runPlaywrightRetryAttempt({\n launcher,\n userArgs,\n failedFiles,\n retryConcurrency,\n configPath,\n hasCustomConfig,\n env,\n attempt,\n}: {\n launcher: SpawnLauncher\n userArgs: string[]\n failedFiles: string[]\n retryConcurrency: number\n configPath: string\n hasCustomConfig: boolean\n env: NodeJS.ProcessEnv\n attempt: number\n}): Promise<{ failedFiles: string[]; lastError: unknown }> {\n const failedAgain = new Set<string>()\n let lastError: unknown = null\n let nextIndex = 0\n\n async function runNext(): Promise<void> {\n while (nextIndex < failedFiles.length) {\n const fileIndex = nextIndex\n nextIndex += 1\n\n const failedFile = failedFiles[fileIndex]\n const retryArgs = buildPlaywrightWorkerRetryArgs(userArgs, [failedFile], attempt)\n const retryPlaywrightArgs = [\"test\"]\n if (!hasCustomConfig) {\n retryPlaywrightArgs.push(\"--config\", configPath)\n }\n retryPlaywrightArgs.push(...retryArgs)\n\n try {\n await runPlaywrightOnce({\n launcher,\n args: retryPlaywrightArgs,\n env,\n outputMode: \"line\",\n successMessage: null,\n })\n } catch (retryError) {\n lastError = retryError\n failedAgain.add(failedFile)\n }\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.max(1, Math.min(retryConcurrency, failedFiles.length)) }, () => runNext()),\n )\n\n return {\n failedFiles: failedFiles.filter((failedFile) => failedAgain.has(failedFile)),\n lastError,\n }\n}\n\nasync function readJson(filePath: string): Promise<any | null> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\")\n return JSON.parse(raw)\n } catch {\n return null\n }\n}\n\nfunction ensureJsxRuntimeShim(projectRoot: string): void {\n const shimDir = path.join(projectRoot, \"node_modules\", \"playwright\")\n fs.mkdirSync(shimDir, { recursive: true })\n const shims = [\n { file: \"jsx-runtime.js\", target: \"react/jsx-runtime\" },\n { file: \"jsx-dev-runtime.js\", target: \"react/jsx-dev-runtime\" },\n ]\n\n for (const { file, target } of shims) {\n const filePath = path.join(shimDir, file)\n if (!fs.existsSync(filePath)) {\n const content = `export * from \"${target}\";\\nexport { default } from \"${target}\";\\n`\n fs.writeFileSync(filePath, content, \"utf8\")\n }\n }\n}\n"],"names":["require","createRequire","import","url","moduleDir","path","dirname","fileURLToPath","COMBINED_COVERAGE_ENV_VAR","PLAYWRIGHT_RESULTS_FILE","join","process","cwd","PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE","Set","PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE","PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY","PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN","runPlaywright","userArgs","disableCoverage","configPath","fs","existsSync","hasCustomConfig","some","arg","startsWith","ensureJsxRuntimeShim","launcher","resolvePlaywrightLauncher","env","withRegisterShim","RB_DISABLE_COVERAGE","runtimeSettings","resolveFreshWorkerRetrySettings","configuredRetries","retries","retryConcurrency","Math","max","workers","resultsMtimeBeforeRun","getFileMtimeMs","initialRunArgs","buildPlaywrightInitialFreshWorkerArgs","initialPlaywrightArgs","push","runPlaywrightOnce","args","error","summary","readPlaywrightReportSummary","failedFiles","length","lastError","maxAttempts","attempt","activeRetryWorkers","min","console","warn","retryResults","runPlaywrightRetryAttempt","outputMode","successMessage","failureMessage","spawnWithLogs","name","undefined","cliPath","resolveCliPath","command","execPath","localBin","resolve","searchRoots","base","pkgPath","paths","_error","buildPlaywrightWorkerRetryArgs","optionArgs","extractPlaywrightOptionArgs","sanitizedOptions","removePlaywrightOptions","buildPlaywrightRetryOutputDir","positionalArgs","extractPlaywrightPositionalArgs","configuredSettings","probeConfiguredPlaywrightSettings","probeArgs","extractPlaywrightProjectArgs","stdout","spawnAndCaptureStdout","json","parseJsonObjectFromText","resolvePlaywrightRetriesFromReport","resolvePlaywrightWorkersFromReport","output","i","next","input","JSON","parse","start","indexOf","end","lastIndexOf","slice","includes","has","optionsToRemove","normalized","split","resultsFilePath","newerThanMtimeMs","stats","fsPromises","stat","catch","mtimeMs","data","readJson","resolveFailedPlaywrightFiles","filePath","statSync","projects","Array","isArray","config","retriesFromProjects","map","project","Number","filter","value","isFinite","floor","fallback","configWorkers","workersFromProjects","metadata","actualWorkers","suites","rootDir","suite","collectFailedPlaywrightFiles","from","sort","specs","spec","isPlaywrightSpecSuccessful","file","normalizePlaywrightReportFile","add","innerSuites","innerSuite","ok","tests","every","test","testStatus","String","status","results","result","raw","trim","absolutePath","isAbsolute","normalize","cwdCandidate","rootCandidate","relative","toPosixPath","sep","slug","replace","failedAgain","nextIndex","runNext","fileIndex","failedFile","retryArgs","retryPlaywrightArgs","retryError","Promise","all","readFile","projectRoot","shimDir","mkdirSync","recursive","shims","target","content","writeFileSync"],"mappings":"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"}
@@ -2,13 +2,15 @@ export type SpawnLauncher = {
2
2
  command: string;
3
3
  args?: string[];
4
4
  };
5
- export declare function spawnWithLogs({ name, launcher, args, env, successMessage, failureMessage, }: {
5
+ type SpawnOutputMode = "chunk" | "line";
6
+ export declare function spawnWithLogs({ name, launcher, args, env, successMessage, failureMessage, outputMode, }: {
6
7
  name: string;
7
8
  launcher: SpawnLauncher;
8
9
  args: string[];
9
10
  env: NodeJS.ProcessEnv;
10
11
  successMessage?: string;
11
12
  failureMessage?: string;
13
+ outputMode?: SpawnOutputMode;
12
14
  }): Promise<void>;
13
15
  export declare function spawnAndCaptureStdout({ name, launcher, args, env, }: {
14
16
  name: string;
@@ -17,4 +19,5 @@ export declare function spawnAndCaptureStdout({ name, launcher, args, env, }: {
17
19
  env: NodeJS.ProcessEnv;
18
20
  }): Promise<string>;
19
21
  export declare function withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
22
+ export {};
20
23
  //# sourceMappingURL=process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/runners/process.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,cAAc,EACd,cAAc,GACf,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,aAAa,CAAA;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDhB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,aAAa,CAAA;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkClB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAM9E"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/runners/process.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,CAAA;AAIvC,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,GAAG,EACH,cAAc,EACd,cAAc,EACd,UAAoB,GACrB,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,aAAa,CAAA;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEhB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,GAAG,GACJ,EAAE;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,aAAa,CAAA;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkClB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAM9E"}
@@ -3,13 +3,15 @@ import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  const moduleDir = path.dirname(fileURLToPath(import.meta.url));
5
5
  const isAider = process.env.IS_AIDER === "yes";
6
+ let queuedOutputWrite = Promise.resolve();
6
7
  function spawnWithLogs({
7
8
  name,
8
9
  launcher,
9
10
  args,
10
11
  env,
11
12
  successMessage,
12
- failureMessage
13
+ failureMessage,
14
+ outputMode = "chunk"
13
15
  }) {
14
16
  return new Promise((resolve, reject) => {
15
17
  const stdoutBuffer = [];
@@ -18,36 +20,45 @@ function spawnWithLogs({
18
20
  shell: false,
19
21
  env
20
22
  });
23
+ const stdoutForwarder = createOutputForwarder(process.stdout, outputMode);
24
+ const stderrForwarder = createOutputForwarder(process.stderr, outputMode);
21
25
  child.stdout?.on("data", (data) => {
22
26
  if (!isAider) {
23
- process.stdout.write(data);
27
+ stdoutForwarder.write(data);
24
28
  }
25
29
  stdoutBuffer.push(data.toString());
26
30
  });
27
31
  child.stderr?.on("data", (data) => {
28
32
  if (!isAider) {
29
- process.stderr.write(data);
33
+ stderrForwarder.write(data);
30
34
  }
31
35
  stderrBuffer.push(data.toString());
32
36
  });
33
37
  child.on("close", (code) => {
34
- if (code === 0) {
35
- if (successMessage) {
36
- console.log(successMessage);
37
- }
38
- resolve();
39
- } else {
40
- console.error(failureMessage || `${name} failed:`);
41
- if (isAider) {
42
- if (stdoutBuffer.length > 0) {
43
- console.error(stdoutBuffer.join(""));
38
+ if (!isAider) {
39
+ stdoutForwarder.flush();
40
+ stderrForwarder.flush();
41
+ }
42
+ const pendingWrites = queuedOutputWrite;
43
+ pendingWrites.then(() => {
44
+ if (code === 0) {
45
+ if (successMessage) {
46
+ console.log(successMessage);
44
47
  }
45
- if (stderrBuffer.length > 0) {
46
- console.error(stderrBuffer.join(""));
48
+ resolve();
49
+ } else {
50
+ console.error(failureMessage || `${name} failed:`);
51
+ if (isAider) {
52
+ if (stdoutBuffer.length > 0) {
53
+ console.error(stdoutBuffer.join(""));
54
+ }
55
+ if (stderrBuffer.length > 0) {
56
+ console.error(stderrBuffer.join(""));
57
+ }
47
58
  }
59
+ reject(new Error(`${name} failed with exit code: ${code}`));
48
60
  }
49
- reject(new Error(`${name} failed with exit code: ${code}`));
50
- }
61
+ });
51
62
  });
52
63
  child.on("error", (error) => {
53
64
  console.error(`Error spawning ${name}:`, error);
@@ -101,6 +112,40 @@ function appendNodeRequire(existing, modulePath) {
101
112
  }
102
113
  return `${existing} ${flag}`;
103
114
  }
115
+ function createOutputForwarder(stream, outputMode) {
116
+ let pendingLine = "";
117
+ return {
118
+ write(data) {
119
+ const text = data.toString();
120
+ if (outputMode === "chunk") {
121
+ queueStreamWrite(stream, text);
122
+ return;
123
+ }
124
+ pendingLine += text;
125
+ while (true) {
126
+ const newlineIndex = pendingLine.indexOf("\n");
127
+ if (newlineIndex === -1) {
128
+ break;
129
+ }
130
+ const nextLine = pendingLine.slice(0, newlineIndex + 1);
131
+ pendingLine = pendingLine.slice(newlineIndex + 1);
132
+ queueStreamWrite(stream, nextLine);
133
+ }
134
+ },
135
+ flush() {
136
+ if (pendingLine.length === 0) {
137
+ return;
138
+ }
139
+ queueStreamWrite(stream, pendingLine);
140
+ pendingLine = "";
141
+ }
142
+ };
143
+ }
144
+ function queueStreamWrite(stream, text) {
145
+ queuedOutputWrite = queuedOutputWrite.then(() => new Promise((resolve) => {
146
+ stream.write(text, () => resolve());
147
+ })).catch(() => void 0);
148
+ }
104
149
  export {
105
150
  spawnAndCaptureStdout,
106
151
  spawnWithLogs,
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sources":["../../src/runners/process.ts"],"sourcesContent":["import { spawn } from \"node:child_process\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\nconst isAider = process.env.IS_AIDER === \"yes\"\n\nexport type SpawnLauncher = {\n command: string\n args?: string[]\n}\n\nexport function spawnWithLogs({\n name,\n launcher,\n args,\n env,\n successMessage,\n failureMessage,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n successMessage?: string\n failureMessage?: string\n}): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n if (!isAider) {\n process.stdout.write(data)\n }\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n if (!isAider) {\n process.stderr.write(data)\n }\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n if (successMessage) {\n console.log(successMessage)\n }\n resolve()\n } else {\n console.error(failureMessage || `${name} failed:`)\n\n if (isAider) {\n if (stdoutBuffer.length > 0) {\n console.error(stdoutBuffer.join(\"\"))\n }\n\n if (stderrBuffer.length > 0) {\n console.error(stderrBuffer.join(\"\"))\n }\n }\n\n reject(new Error(`${name} failed with exit code: ${code}`))\n }\n })\n\n child.on(\"error\", (error) => {\n console.error(`Error spawning ${name}:`, error)\n reject(error)\n })\n })\n}\n\nexport function spawnAndCaptureStdout({\n name,\n launcher,\n args,\n env,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n}): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdoutBuffer.join(\"\"))\n } else {\n reject(new Error(`${name} failed with exit code: ${code}\\n${stderrBuffer.join(\"\")}`))\n }\n })\n\n child.on(\"error\", (error) => {\n reject(error)\n })\n })\n}\n\nexport function withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, \"..\", \"register-tty.cjs\"))\n return {\n ...baseEnv,\n NODE_OPTIONS: nodeOptions,\n }\n}\n\nfunction appendNodeRequire(existing: string | undefined, modulePath: string): string {\n const flag = `--require=${modulePath}`\n if (!existing || existing.length === 0) {\n return flag\n }\n return `${existing} ${flag}`\n}\n"],"names":["moduleDir","path","dirname","fileURLToPath","import","url","isAider","process","env","IS_AIDER","spawnWithLogs","name","launcher","args","successMessage","failureMessage","Promise","resolve","reject","stdoutBuffer","stderrBuffer","child","spawn","command","shell","stdout","on","data","write","push","toString","stderr","code","console","log","error","length","join","Error","spawnAndCaptureStdout","withRegisterShim","baseEnv","nodeOptions","appendNodeRequire","NODE_OPTIONS","existing","modulePath","flag"],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sources":["../../src/runners/process.ts"],"sourcesContent":["import { spawn } from \"node:child_process\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\nconst isAider = process.env.IS_AIDER === \"yes\"\n\nexport type SpawnLauncher = {\n command: string\n args?: string[]\n}\n\ntype SpawnOutputMode = \"chunk\" | \"line\"\n\nlet queuedOutputWrite: Promise<void> = Promise.resolve()\n\nexport function spawnWithLogs({\n name,\n launcher,\n args,\n env,\n successMessage,\n failureMessage,\n outputMode = \"chunk\",\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n successMessage?: string\n failureMessage?: string\n outputMode?: SpawnOutputMode\n}): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n const stdoutForwarder = createOutputForwarder(process.stdout, outputMode)\n const stderrForwarder = createOutputForwarder(process.stderr, outputMode)\n\n child.stdout?.on(\"data\", (data) => {\n if (!isAider) {\n stdoutForwarder.write(data)\n }\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n if (!isAider) {\n stderrForwarder.write(data)\n }\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (!isAider) {\n stdoutForwarder.flush()\n stderrForwarder.flush()\n }\n\n const pendingWrites = queuedOutputWrite\n pendingWrites.then(() => {\n if (code === 0) {\n if (successMessage) {\n console.log(successMessage)\n }\n resolve()\n } else {\n console.error(failureMessage || `${name} failed:`)\n\n if (isAider) {\n if (stdoutBuffer.length > 0) {\n console.error(stdoutBuffer.join(\"\"))\n }\n\n if (stderrBuffer.length > 0) {\n console.error(stderrBuffer.join(\"\"))\n }\n }\n\n reject(new Error(`${name} failed with exit code: ${code}`))\n }\n })\n })\n\n child.on(\"error\", (error) => {\n console.error(`Error spawning ${name}:`, error)\n reject(error)\n })\n })\n}\n\nexport function spawnAndCaptureStdout({\n name,\n launcher,\n args,\n env,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n}): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdoutBuffer.join(\"\"))\n } else {\n reject(new Error(`${name} failed with exit code: ${code}\\n${stderrBuffer.join(\"\")}`))\n }\n })\n\n child.on(\"error\", (error) => {\n reject(error)\n })\n })\n}\n\nexport function withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, \"..\", \"register-tty.cjs\"))\n return {\n ...baseEnv,\n NODE_OPTIONS: nodeOptions,\n }\n}\n\nfunction appendNodeRequire(existing: string | undefined, modulePath: string): string {\n const flag = `--require=${modulePath}`\n if (!existing || existing.length === 0) {\n return flag\n }\n return `${existing} ${flag}`\n}\n\nfunction createOutputForwarder(stream: NodeJS.WriteStream, outputMode: SpawnOutputMode) {\n let pendingLine = \"\"\n\n return {\n write(data: Buffer | string) {\n const text = data.toString()\n if (outputMode === \"chunk\") {\n queueStreamWrite(stream, text)\n return\n }\n\n pendingLine += text\n while (true) {\n const newlineIndex = pendingLine.indexOf(\"\\n\")\n if (newlineIndex === -1) {\n break\n }\n const nextLine = pendingLine.slice(0, newlineIndex + 1)\n pendingLine = pendingLine.slice(newlineIndex + 1)\n queueStreamWrite(stream, nextLine)\n }\n },\n flush() {\n if (pendingLine.length === 0) {\n return\n }\n queueStreamWrite(stream, pendingLine)\n pendingLine = \"\"\n },\n }\n}\n\nfunction queueStreamWrite(stream: NodeJS.WriteStream, text: string): void {\n queuedOutputWrite = queuedOutputWrite\n .then(() => new Promise<void>((resolve) => {\n stream.write(text, () => resolve())\n }))\n .catch(() => undefined)\n}\n"],"names":["moduleDir","path","dirname","fileURLToPath","import","url","isAider","process","env","IS_AIDER","queuedOutputWrite","Promise","resolve","spawnWithLogs","name","launcher","args","successMessage","failureMessage","outputMode","reject","stdoutBuffer","stderrBuffer","child","spawn","command","shell","stdoutForwarder","createOutputForwarder","stdout","stderrForwarder","stderr","on","data","write","push","toString","code","flush","pendingWrites","then","console","log","error","length","join","Error","spawnAndCaptureStdout","withRegisterShim","baseEnv","nodeOptions","appendNodeRequire","NODE_OPTIONS","existing","modulePath","flag","stream","pendingLine","text","queueStreamWrite","newlineIndex","indexOf","nextLine","slice","catch","undefined"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/test",
3
- "version": "0.341.0",
3
+ "version": "0.343.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"