@rpcbase/test 0.338.0 → 0.340.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +4 -333
- package/dist/cli.js.map +1 -1
- package/dist/runners/playwright.d.ts +4 -0
- package/dist/runners/playwright.d.ts.map +1 -0
- package/dist/runners/playwright.js +494 -0
- package/dist/runners/playwright.js.map +1 -0
- package/dist/runners/process.d.ts +20 -0
- package/dist/runners/process.d.ts.map +1 -0
- package/dist/runners/process.js +109 -0
- package/dist/runners/process.js.map +1 -0
- package/dist/runners/vitest.d.ts +11 -0
- package/dist/runners/vitest.d.ts.map +1 -0
- package/dist/runners/vitest.js +191 -0
- package/dist/runners/vitest.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import fs$1 from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { withRegisterShim, spawnWithLogs, spawnAndCaptureStdout } from "./process.js";
|
|
7
|
+
const require$1 = createRequire(import.meta.url);
|
|
8
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const COMBINED_COVERAGE_ENV_VAR = "RB_TEST_COMBINED_COVERAGE";
|
|
10
|
+
const PLAYWRIGHT_RESULTS_FILE = path.join(process.cwd(), "build", "playwright", "results.json");
|
|
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
|
+
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"]);
|
|
14
|
+
const PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN = /* @__PURE__ */ new Set(["--retries"]);
|
|
15
|
+
async function runPlaywright(userArgs, {
|
|
16
|
+
disableCoverage = false
|
|
17
|
+
} = {}) {
|
|
18
|
+
const configPath = fs.existsSync(path.join(process.cwd(), "playwright.config.ts")) ? path.join(process.cwd(), "playwright.config.ts") : path.join(moduleDir, "..", "playwright.config.ts");
|
|
19
|
+
const hasCustomConfig = userArgs.some((arg) => {
|
|
20
|
+
if (arg === "--config" || arg === "-c") {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return arg.startsWith("--config=");
|
|
24
|
+
});
|
|
25
|
+
ensureJsxRuntimeShim(process.cwd());
|
|
26
|
+
const launcher = resolvePlaywrightLauncher();
|
|
27
|
+
const env = withRegisterShim(process.env);
|
|
28
|
+
env[COMBINED_COVERAGE_ENV_VAR] = "1";
|
|
29
|
+
if (disableCoverage) {
|
|
30
|
+
env.RB_DISABLE_COVERAGE = "1";
|
|
31
|
+
}
|
|
32
|
+
const configuredRetries = await resolveFreshWorkerRetryBudget({
|
|
33
|
+
launcher,
|
|
34
|
+
configPath,
|
|
35
|
+
hasCustomConfig,
|
|
36
|
+
userArgs,
|
|
37
|
+
env
|
|
38
|
+
});
|
|
39
|
+
const resultsMtimeBeforeRun = getFileMtimeMs(PLAYWRIGHT_RESULTS_FILE);
|
|
40
|
+
const initialRunArgs = buildPlaywrightInitialFreshWorkerArgs(userArgs);
|
|
41
|
+
const initialPlaywrightArgs = ["test"];
|
|
42
|
+
if (!hasCustomConfig) {
|
|
43
|
+
initialPlaywrightArgs.push("--config", configPath);
|
|
44
|
+
}
|
|
45
|
+
initialPlaywrightArgs.push(...initialRunArgs);
|
|
46
|
+
try {
|
|
47
|
+
await runPlaywrightOnce({
|
|
48
|
+
launcher,
|
|
49
|
+
args: initialPlaywrightArgs,
|
|
50
|
+
env
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
} catch (error) {
|
|
54
|
+
const summary = await readPlaywrightReportSummary(PLAYWRIGHT_RESULTS_FILE, resultsMtimeBeforeRun);
|
|
55
|
+
if (!summary || configuredRetries <= 0 || summary.failedFiles.length === 0) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
let lastError = error;
|
|
59
|
+
let failedFiles = summary.failedFiles;
|
|
60
|
+
const maxAttempts = configuredRetries;
|
|
61
|
+
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
|
+
}
|
|
81
|
+
}
|
|
82
|
+
failedFiles = nextFailedFiles;
|
|
83
|
+
}
|
|
84
|
+
if (failedFiles.length === 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
throw lastError;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function runPlaywrightOnce({
|
|
91
|
+
launcher,
|
|
92
|
+
args,
|
|
93
|
+
env
|
|
94
|
+
}) {
|
|
95
|
+
return spawnWithLogs({
|
|
96
|
+
name: "Playwright",
|
|
97
|
+
launcher,
|
|
98
|
+
args,
|
|
99
|
+
env,
|
|
100
|
+
successMessage: "Playwright suite passed!",
|
|
101
|
+
failureMessage: "Playwright failed"
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function resolvePlaywrightLauncher() {
|
|
105
|
+
const cliPath = resolveCliPath();
|
|
106
|
+
if (cliPath) {
|
|
107
|
+
return {
|
|
108
|
+
command: process.execPath,
|
|
109
|
+
args: [cliPath]
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const localBin = path.resolve(process.cwd(), "node_modules/.bin/playwright");
|
|
113
|
+
if (fs.existsSync(localBin)) {
|
|
114
|
+
return {
|
|
115
|
+
command: localBin,
|
|
116
|
+
args: []
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
command: "playwright",
|
|
121
|
+
args: []
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function resolveCliPath() {
|
|
125
|
+
const searchRoots = [process.cwd(), moduleDir];
|
|
126
|
+
for (const base of searchRoots) {
|
|
127
|
+
try {
|
|
128
|
+
const pkgPath = require$1.resolve("@playwright/test/package.json", {
|
|
129
|
+
paths: [base]
|
|
130
|
+
});
|
|
131
|
+
const cliPath = path.join(path.dirname(pkgPath), "cli.js");
|
|
132
|
+
if (fs.existsSync(cliPath)) {
|
|
133
|
+
return cliPath;
|
|
134
|
+
}
|
|
135
|
+
} catch (_error) {
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
function buildPlaywrightWorkerRetryArgs(userArgs, failedFiles) {
|
|
141
|
+
const optionArgs = extractPlaywrightOptionArgs(userArgs);
|
|
142
|
+
const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_WORKER_RETRY);
|
|
143
|
+
return [...sanitizedOptions, "--retries=0", ...failedFiles];
|
|
144
|
+
}
|
|
145
|
+
function buildPlaywrightInitialFreshWorkerArgs(userArgs) {
|
|
146
|
+
const optionArgs = extractPlaywrightOptionArgs(userArgs);
|
|
147
|
+
const sanitizedOptions = removePlaywrightOptions(optionArgs, PLAYWRIGHT_OPTIONS_TO_REMOVE_FOR_INITIAL_FRESH_RUN);
|
|
148
|
+
const positionalArgs = extractPlaywrightPositionalArgs(userArgs);
|
|
149
|
+
return [...sanitizedOptions, "--retries=0", ...positionalArgs];
|
|
150
|
+
}
|
|
151
|
+
async function resolveFreshWorkerRetryBudget({
|
|
152
|
+
launcher,
|
|
153
|
+
configPath,
|
|
154
|
+
hasCustomConfig,
|
|
155
|
+
userArgs,
|
|
156
|
+
env
|
|
157
|
+
}) {
|
|
158
|
+
const cliRetries = resolveRetriesOverrideFromCli(userArgs);
|
|
159
|
+
if (cliRetries != null) {
|
|
160
|
+
return cliRetries;
|
|
161
|
+
}
|
|
162
|
+
const configuredRetries = await probeConfiguredPlaywrightRetries({
|
|
163
|
+
launcher,
|
|
164
|
+
configPath,
|
|
165
|
+
hasCustomConfig,
|
|
166
|
+
userArgs,
|
|
167
|
+
env
|
|
168
|
+
});
|
|
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;
|
|
194
|
+
}
|
|
195
|
+
async function probeConfiguredPlaywrightRetries({
|
|
196
|
+
launcher,
|
|
197
|
+
configPath,
|
|
198
|
+
hasCustomConfig,
|
|
199
|
+
userArgs,
|
|
200
|
+
env
|
|
201
|
+
}) {
|
|
202
|
+
const probeArgs = ["test"];
|
|
203
|
+
if (!hasCustomConfig) {
|
|
204
|
+
probeArgs.push("--config", configPath);
|
|
205
|
+
}
|
|
206
|
+
probeArgs.push("--list", "--reporter=json", ...extractPlaywrightProjectArgs(userArgs));
|
|
207
|
+
try {
|
|
208
|
+
const stdout = await spawnAndCaptureStdout({
|
|
209
|
+
name: "Playwright retries probe",
|
|
210
|
+
launcher,
|
|
211
|
+
args: probeArgs,
|
|
212
|
+
env
|
|
213
|
+
});
|
|
214
|
+
const json = parseJsonObjectFromText(stdout);
|
|
215
|
+
if (!json) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
return resolvePlaywrightRetriesFromReport(json);
|
|
219
|
+
} catch (_error) {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function extractPlaywrightProjectArgs(userArgs) {
|
|
224
|
+
const output = [];
|
|
225
|
+
for (let i = 0; i < userArgs.length; i += 1) {
|
|
226
|
+
const arg = userArgs[i];
|
|
227
|
+
if (arg === "--") {
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
if (arg === "--project") {
|
|
231
|
+
const next = userArgs[i + 1];
|
|
232
|
+
if (next != null) {
|
|
233
|
+
output.push(arg, next);
|
|
234
|
+
i += 1;
|
|
235
|
+
}
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (arg.startsWith("--project=")) {
|
|
239
|
+
output.push(arg);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return output;
|
|
243
|
+
}
|
|
244
|
+
function parseJsonObjectFromText(input) {
|
|
245
|
+
try {
|
|
246
|
+
return JSON.parse(input);
|
|
247
|
+
} catch {
|
|
248
|
+
const start = input.indexOf("{");
|
|
249
|
+
const end = input.lastIndexOf("}");
|
|
250
|
+
if (start === -1 || end === -1 || end <= start) {
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
return JSON.parse(input.slice(start, end + 1));
|
|
255
|
+
} catch {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
function extractPlaywrightPositionalArgs(userArgs) {
|
|
261
|
+
const output = [];
|
|
262
|
+
for (let i = 0; i < userArgs.length; i += 1) {
|
|
263
|
+
const arg = userArgs[i];
|
|
264
|
+
if (arg === "--") {
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
if (!arg.startsWith("-")) {
|
|
268
|
+
output.push(arg);
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (arg.includes("=")) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(arg)) {
|
|
275
|
+
const next = userArgs[i + 1];
|
|
276
|
+
if (next !== void 0) {
|
|
277
|
+
i += 1;
|
|
278
|
+
}
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(arg)) {
|
|
282
|
+
const next = userArgs[i + 1];
|
|
283
|
+
if (next !== void 0 && !next.startsWith("-")) {
|
|
284
|
+
i += 1;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return output;
|
|
289
|
+
}
|
|
290
|
+
function removePlaywrightOptions(optionArgs, optionsToRemove) {
|
|
291
|
+
const output = [];
|
|
292
|
+
for (let i = 0; i < optionArgs.length; i += 1) {
|
|
293
|
+
const arg = optionArgs[i];
|
|
294
|
+
const normalized = arg.split("=")[0];
|
|
295
|
+
if (!arg.startsWith("-") || !optionsToRemove.has(normalized)) {
|
|
296
|
+
output.push(arg);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (arg.includes("=")) {
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(normalized)) {
|
|
303
|
+
const next = optionArgs[i + 1];
|
|
304
|
+
if (next !== void 0) {
|
|
305
|
+
i += 1;
|
|
306
|
+
}
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(normalized)) {
|
|
310
|
+
const next = optionArgs[i + 1];
|
|
311
|
+
if (next !== void 0 && !next.startsWith("-")) {
|
|
312
|
+
i += 1;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return output;
|
|
317
|
+
}
|
|
318
|
+
function extractPlaywrightOptionArgs(userArgs) {
|
|
319
|
+
const output = [];
|
|
320
|
+
for (let i = 0; i < userArgs.length; i += 1) {
|
|
321
|
+
const arg = userArgs[i];
|
|
322
|
+
if (arg === "--") {
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
if (!arg.startsWith("-")) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
output.push(arg);
|
|
329
|
+
if (arg.includes("=")) {
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
if (PLAYWRIGHT_OPTIONS_WITH_REQUIRED_VALUE.has(arg)) {
|
|
333
|
+
const next = userArgs[i + 1];
|
|
334
|
+
if (next !== void 0) {
|
|
335
|
+
output.push(next);
|
|
336
|
+
i += 1;
|
|
337
|
+
}
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
if (PLAYWRIGHT_OPTIONS_WITH_OPTIONAL_VALUE.has(arg)) {
|
|
341
|
+
const next = userArgs[i + 1];
|
|
342
|
+
if (next !== void 0 && !next.startsWith("-")) {
|
|
343
|
+
output.push(next);
|
|
344
|
+
i += 1;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return output;
|
|
349
|
+
}
|
|
350
|
+
async function readPlaywrightReportSummary(resultsFilePath, newerThanMtimeMs) {
|
|
351
|
+
const stats = await fs$1.stat(resultsFilePath).catch(() => null);
|
|
352
|
+
if (!stats) {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
if (newerThanMtimeMs != null && stats.mtimeMs <= newerThanMtimeMs) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
const data = await readJson(resultsFilePath);
|
|
359
|
+
if (!data || typeof data !== "object") {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
return {
|
|
363
|
+
failedFiles: resolveFailedPlaywrightFiles(data)
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
function getFileMtimeMs(filePath) {
|
|
367
|
+
try {
|
|
368
|
+
return fs.statSync(filePath).mtimeMs;
|
|
369
|
+
} catch {
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
function resolvePlaywrightRetriesFromReport(data) {
|
|
374
|
+
const projects = Array.isArray(data?.config?.projects) ? data.config.projects : [];
|
|
375
|
+
const retriesFromProjects = projects.map((project) => Number(project?.retries)).filter((value) => Number.isFinite(value)).map((value) => Math.max(0, Math.floor(value)));
|
|
376
|
+
if (retriesFromProjects.length > 0) {
|
|
377
|
+
return Math.max(...retriesFromProjects);
|
|
378
|
+
}
|
|
379
|
+
const fallback = Number(data?.config?.retries);
|
|
380
|
+
if (Number.isFinite(fallback)) {
|
|
381
|
+
return Math.max(0, Math.floor(fallback));
|
|
382
|
+
}
|
|
383
|
+
return 0;
|
|
384
|
+
}
|
|
385
|
+
function resolveFailedPlaywrightFiles(data) {
|
|
386
|
+
const suites = Array.isArray(data?.suites) ? data.suites : [];
|
|
387
|
+
const rootDir = typeof data?.config?.rootDir === "string" ? data.config.rootDir : null;
|
|
388
|
+
const failedFiles = /* @__PURE__ */ new Set();
|
|
389
|
+
for (const suite of suites) {
|
|
390
|
+
collectFailedPlaywrightFiles(suite, failedFiles, rootDir);
|
|
391
|
+
}
|
|
392
|
+
return Array.from(failedFiles).sort();
|
|
393
|
+
}
|
|
394
|
+
function collectFailedPlaywrightFiles(suite, output, rootDir) {
|
|
395
|
+
const specs = Array.isArray(suite?.specs) ? suite.specs : [];
|
|
396
|
+
for (const spec of specs) {
|
|
397
|
+
if (isPlaywrightSpecSuccessful(spec)) {
|
|
398
|
+
continue;
|
|
399
|
+
}
|
|
400
|
+
const file = normalizePlaywrightReportFile(spec?.file ?? suite?.file, rootDir);
|
|
401
|
+
if (file) {
|
|
402
|
+
output.add(file);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
const innerSuites = Array.isArray(suite?.suites) ? suite.suites : [];
|
|
406
|
+
for (const innerSuite of innerSuites) {
|
|
407
|
+
collectFailedPlaywrightFiles(innerSuite, output, rootDir);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function isPlaywrightSpecSuccessful(spec) {
|
|
411
|
+
if (typeof spec?.ok === "boolean") {
|
|
412
|
+
return spec.ok;
|
|
413
|
+
}
|
|
414
|
+
const tests = Array.isArray(spec?.tests) ? spec.tests : [];
|
|
415
|
+
if (tests.length === 0) {
|
|
416
|
+
return false;
|
|
417
|
+
}
|
|
418
|
+
return tests.every((test) => {
|
|
419
|
+
const testStatus = String(test?.status ?? "");
|
|
420
|
+
if (testStatus === "expected" || testStatus === "skipped" || testStatus === "flaky") {
|
|
421
|
+
return true;
|
|
422
|
+
}
|
|
423
|
+
const results = Array.isArray(test?.results) ? test.results : [];
|
|
424
|
+
if (results.length === 0) {
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
return results.every((result) => result?.status === "passed" || result?.status === "skipped");
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
function normalizePlaywrightReportFile(filePath, rootDir) {
|
|
431
|
+
const raw = String(filePath ?? "").trim();
|
|
432
|
+
if (!raw) {
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
let absolutePath;
|
|
436
|
+
if (path.isAbsolute(raw)) {
|
|
437
|
+
absolutePath = path.normalize(raw);
|
|
438
|
+
} else {
|
|
439
|
+
const cwdCandidate = path.resolve(process.cwd(), raw);
|
|
440
|
+
const rootCandidate = rootDir ? path.resolve(rootDir, raw) : null;
|
|
441
|
+
if (rootCandidate && fs.existsSync(rootCandidate)) {
|
|
442
|
+
absolutePath = rootCandidate;
|
|
443
|
+
} else if (fs.existsSync(cwdCandidate)) {
|
|
444
|
+
absolutePath = cwdCandidate;
|
|
445
|
+
} else {
|
|
446
|
+
absolutePath = rootCandidate ?? cwdCandidate;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
const relative = path.relative(process.cwd(), absolutePath);
|
|
450
|
+
if (relative === "" || !relative.startsWith("..") && !path.isAbsolute(relative)) {
|
|
451
|
+
return toPosixPath(relative || raw);
|
|
452
|
+
}
|
|
453
|
+
return toPosixPath(raw);
|
|
454
|
+
}
|
|
455
|
+
function toPosixPath(input) {
|
|
456
|
+
return String(input ?? "").split(path.sep).join("/");
|
|
457
|
+
}
|
|
458
|
+
async function readJson(filePath) {
|
|
459
|
+
try {
|
|
460
|
+
const raw = await fs$1.readFile(filePath, "utf8");
|
|
461
|
+
return JSON.parse(raw);
|
|
462
|
+
} catch {
|
|
463
|
+
return null;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
function ensureJsxRuntimeShim(projectRoot) {
|
|
467
|
+
const shimDir = path.join(projectRoot, "node_modules", "playwright");
|
|
468
|
+
fs.mkdirSync(shimDir, {
|
|
469
|
+
recursive: true
|
|
470
|
+
});
|
|
471
|
+
const shims = [{
|
|
472
|
+
file: "jsx-runtime.js",
|
|
473
|
+
target: "react/jsx-runtime"
|
|
474
|
+
}, {
|
|
475
|
+
file: "jsx-dev-runtime.js",
|
|
476
|
+
target: "react/jsx-dev-runtime"
|
|
477
|
+
}];
|
|
478
|
+
for (const {
|
|
479
|
+
file,
|
|
480
|
+
target
|
|
481
|
+
} of shims) {
|
|
482
|
+
const filePath = path.join(shimDir, file);
|
|
483
|
+
if (!fs.existsSync(filePath)) {
|
|
484
|
+
const content = `export * from "${target}";
|
|
485
|
+
export { default } from "${target}";
|
|
486
|
+
`;
|
|
487
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
export {
|
|
492
|
+
runPlaywright
|
|
493
|
+
};
|
|
494
|
+
//# sourceMappingURL=playwright.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type SpawnLauncher = {
|
|
2
|
+
command: string;
|
|
3
|
+
args?: string[];
|
|
4
|
+
};
|
|
5
|
+
export declare function spawnWithLogs({ name, launcher, args, env, successMessage, failureMessage, }: {
|
|
6
|
+
name: string;
|
|
7
|
+
launcher: SpawnLauncher;
|
|
8
|
+
args: string[];
|
|
9
|
+
env: NodeJS.ProcessEnv;
|
|
10
|
+
successMessage?: string;
|
|
11
|
+
failureMessage?: string;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
export declare function spawnAndCaptureStdout({ name, launcher, args, env, }: {
|
|
14
|
+
name: string;
|
|
15
|
+
launcher: SpawnLauncher;
|
|
16
|
+
args: string[];
|
|
17
|
+
env: NodeJS.ProcessEnv;
|
|
18
|
+
}): Promise<string>;
|
|
19
|
+
export declare function withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
20
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +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"}
|