@stablyai/internal-playwright 0.1.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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +168 -0
- package/ThirdPartyNotices.txt +6277 -0
- package/cli.js +19 -0
- package/index.d.ts +17 -0
- package/index.js +17 -0
- package/index.mjs +18 -0
- package/jsx-runtime.js +42 -0
- package/jsx-runtime.mjs +21 -0
- package/lib/agents/generateAgents.js +265 -0
- package/lib/agents/generator.md +102 -0
- package/lib/agents/healer.md +78 -0
- package/lib/agents/planner.md +135 -0
- package/lib/cli.js +274 -0
- package/lib/common/config.js +274 -0
- package/lib/common/config.js.map +7 -0
- package/lib/common/configLoader.js +377 -0
- package/lib/common/configLoader.js.map +7 -0
- package/lib/common/esmLoaderHost.js +102 -0
- package/lib/common/esmLoaderHost.js.map +7 -0
- package/lib/common/expectBundle.js +52 -0
- package/lib/common/expectBundle.js.map +7 -0
- package/lib/common/expectBundleImpl.js +389 -0
- package/lib/common/expectBundleImpl.js.map +7 -0
- package/lib/common/fixtures.js +302 -0
- package/lib/common/fixtures.js.map +7 -0
- package/lib/common/globals.js +58 -0
- package/lib/common/globals.js.map +7 -0
- package/lib/common/ipc.js +60 -0
- package/lib/common/ipc.js.map +7 -0
- package/lib/common/poolBuilder.js +85 -0
- package/lib/common/poolBuilder.js.map +7 -0
- package/lib/common/process.js +104 -0
- package/lib/common/process.js.map +7 -0
- package/lib/common/suiteUtils.js +140 -0
- package/lib/common/suiteUtils.js.map +7 -0
- package/lib/common/test.js +321 -0
- package/lib/common/test.js.map +7 -0
- package/lib/common/testLoader.js +100 -0
- package/lib/common/testLoader.js.map +7 -0
- package/lib/common/testType.js +310 -0
- package/lib/common/testType.js.map +7 -0
- package/lib/fsWatcher.js +67 -0
- package/lib/fsWatcher.js.map +7 -0
- package/lib/index.js +696 -0
- package/lib/index.js.map +7 -0
- package/lib/internalsForTest.js +42 -0
- package/lib/internalsForTest.js.map +7 -0
- package/lib/isomorphic/events.js +77 -0
- package/lib/isomorphic/events.js.map +7 -0
- package/lib/isomorphic/folders.js +30 -0
- package/lib/isomorphic/folders.js.map +7 -0
- package/lib/isomorphic/stringInternPool.js +69 -0
- package/lib/isomorphic/stringInternPool.js.map +7 -0
- package/lib/isomorphic/teleReceiver.js +507 -0
- package/lib/isomorphic/teleReceiver.js.map +7 -0
- package/lib/isomorphic/teleSuiteUpdater.js +137 -0
- package/lib/isomorphic/teleSuiteUpdater.js.map +7 -0
- package/lib/isomorphic/testServerConnection.js +211 -0
- package/lib/isomorphic/testServerConnection.js.map +7 -0
- package/lib/isomorphic/testServerInterface.js +16 -0
- package/lib/isomorphic/testServerInterface.js.map +7 -0
- package/lib/isomorphic/testTree.js +334 -0
- package/lib/isomorphic/testTree.js.map +7 -0
- package/lib/isomorphic/types.d.js +16 -0
- package/lib/isomorphic/types.d.js.map +7 -0
- package/lib/loader/loaderMain.js +59 -0
- package/lib/loader/loaderMain.js.map +7 -0
- package/lib/matchers/expect.js +325 -0
- package/lib/matchers/expect.js.map +7 -0
- package/lib/matchers/matcherHint.js +87 -0
- package/lib/matchers/matcherHint.js.map +7 -0
- package/lib/matchers/matchers.js +366 -0
- package/lib/matchers/matchers.js.map +7 -0
- package/lib/matchers/toBeTruthy.js +73 -0
- package/lib/matchers/toBeTruthy.js.map +7 -0
- package/lib/matchers/toEqual.js +99 -0
- package/lib/matchers/toEqual.js.map +7 -0
- package/lib/matchers/toHaveURL.js +102 -0
- package/lib/matchers/toHaveURL.js.map +7 -0
- package/lib/matchers/toMatchAriaSnapshot.js +159 -0
- package/lib/matchers/toMatchAriaSnapshot.js.map +7 -0
- package/lib/matchers/toMatchSnapshot.js +359 -0
- package/lib/matchers/toMatchSnapshot.js.map +7 -0
- package/lib/matchers/toMatchText.js +99 -0
- package/lib/matchers/toMatchText.js.map +7 -0
- package/lib/mcp/browser/actions.d.js +16 -0
- package/lib/mcp/browser/backend.js +93 -0
- package/lib/mcp/browser/backend.js.map +7 -0
- package/lib/mcp/browser/browserContextFactory.js +296 -0
- package/lib/mcp/browser/browserServerBackend.js +76 -0
- package/lib/mcp/browser/codegen.js +66 -0
- package/lib/mcp/browser/config.js +385 -0
- package/lib/mcp/browser/context.js +287 -0
- package/lib/mcp/browser/response.js +228 -0
- package/lib/mcp/browser/sessionLog.js +160 -0
- package/lib/mcp/browser/tab.js +277 -0
- package/lib/mcp/browser/tool.js +30 -0
- package/lib/mcp/browser/tool.js.map +7 -0
- package/lib/mcp/browser/tools/common.js +63 -0
- package/lib/mcp/browser/tools/console.js +44 -0
- package/lib/mcp/browser/tools/dialogs.js +60 -0
- package/lib/mcp/browser/tools/evaluate.js +70 -0
- package/lib/mcp/browser/tools/files.js +58 -0
- package/lib/mcp/browser/tools/form.js +74 -0
- package/lib/mcp/browser/tools/install.js +69 -0
- package/lib/mcp/browser/tools/keyboard.js +85 -0
- package/lib/mcp/browser/tools/mouse.js +107 -0
- package/lib/mcp/browser/tools/navigate.js +62 -0
- package/lib/mcp/browser/tools/network.js +54 -0
- package/lib/mcp/browser/tools/pdf.js +59 -0
- package/lib/mcp/browser/tools/screenshot.js +88 -0
- package/lib/mcp/browser/tools/snapshot.js +182 -0
- package/lib/mcp/browser/tools/tabs.js +67 -0
- package/lib/mcp/browser/tools/tool.js +49 -0
- package/lib/mcp/browser/tools/tracing.js +74 -0
- package/lib/mcp/browser/tools/utils.js +100 -0
- package/lib/mcp/browser/tools/verify.js +154 -0
- package/lib/mcp/browser/tools/wait.js +63 -0
- package/lib/mcp/browser/tools.js +80 -0
- package/lib/mcp/browser/tools.js.map +7 -0
- package/lib/mcp/browser/watchdog.js +44 -0
- package/lib/mcp/config.d.js +16 -0
- package/lib/mcp/extension/cdpRelay.js +351 -0
- package/lib/mcp/extension/extensionContextFactory.js +75 -0
- package/lib/mcp/extension/protocol.js +28 -0
- package/lib/mcp/index.js +61 -0
- package/lib/mcp/log.js +35 -0
- package/lib/mcp/program.js +96 -0
- package/lib/mcp/sdk/bundle.js +81 -0
- package/lib/mcp/sdk/bundle.js.map +7 -0
- package/lib/mcp/sdk/call.js +49 -0
- package/lib/mcp/sdk/call.js.map +7 -0
- package/lib/mcp/sdk/exports.js +32 -0
- package/lib/mcp/sdk/exports.js.map +7 -0
- package/lib/mcp/sdk/http.js +187 -0
- package/lib/mcp/sdk/http.js.map +7 -0
- package/lib/mcp/sdk/inProcessTransport.js +71 -0
- package/lib/mcp/sdk/inProcessTransport.js.map +7 -0
- package/lib/mcp/sdk/mdb.js +206 -0
- package/lib/mcp/sdk/mdb.js.map +7 -0
- package/lib/mcp/sdk/proxyBackend.js +128 -0
- package/lib/mcp/sdk/proxyBackend.js.map +7 -0
- package/lib/mcp/sdk/server.js +189 -0
- package/lib/mcp/sdk/server.js.map +7 -0
- package/lib/mcp/sdk/tool.js +51 -0
- package/lib/mcp/sdk/tool.js.map +7 -0
- package/lib/mcp/test/backend.js +67 -0
- package/lib/mcp/test/backend.js.map +7 -0
- package/lib/mcp/test/browserBackend.js +98 -0
- package/lib/mcp/test/context.js +48 -0
- package/lib/mcp/test/context.js.map +7 -0
- package/lib/mcp/test/generatorTools.js +122 -0
- package/lib/mcp/test/plannerTools.js +46 -0
- package/lib/mcp/test/seed.js +72 -0
- package/lib/mcp/test/streams.js +39 -0
- package/lib/mcp/test/streams.js.map +7 -0
- package/lib/mcp/test/testBackend.js +97 -0
- package/lib/mcp/test/testContext.js +176 -0
- package/lib/mcp/test/testTool.js +30 -0
- package/lib/mcp/test/testTools.js +115 -0
- package/lib/mcp/test/tool.js +30 -0
- package/lib/mcp/test/tool.js.map +7 -0
- package/lib/mcp/test/tools.js +150 -0
- package/lib/mcp/test/tools.js.map +7 -0
- package/lib/mcp/vscode/host.js +187 -0
- package/lib/mcp/vscode/main.js +77 -0
- package/lib/mcpBundleImpl.js +41 -0
- package/lib/mcpBundleImpl.js.map +7 -0
- package/lib/plugins/gitCommitInfoPlugin.js +198 -0
- package/lib/plugins/gitCommitInfoPlugin.js.map +7 -0
- package/lib/plugins/index.js +28 -0
- package/lib/plugins/index.js.map +7 -0
- package/lib/plugins/webServerPlugin.js +209 -0
- package/lib/plugins/webServerPlugin.js.map +7 -0
- package/lib/program.js +412 -0
- package/lib/program.js.map +7 -0
- package/lib/reporters/base.js +609 -0
- package/lib/reporters/base.js.map +7 -0
- package/lib/reporters/blob.js +135 -0
- package/lib/reporters/blob.js.map +7 -0
- package/lib/reporters/dot.js +82 -0
- package/lib/reporters/dot.js.map +7 -0
- package/lib/reporters/empty.js +32 -0
- package/lib/reporters/empty.js.map +7 -0
- package/lib/reporters/github.js +128 -0
- package/lib/reporters/github.js.map +7 -0
- package/lib/reporters/html.js +644 -0
- package/lib/reporters/html.js.map +7 -0
- package/lib/reporters/internalReporter.js +130 -0
- package/lib/reporters/internalReporter.js.map +7 -0
- package/lib/reporters/json.js +254 -0
- package/lib/reporters/json.js.map +7 -0
- package/lib/reporters/junit.js +230 -0
- package/lib/reporters/junit.js.map +7 -0
- package/lib/reporters/line.js +113 -0
- package/lib/reporters/line.js.map +7 -0
- package/lib/reporters/list.js +235 -0
- package/lib/reporters/list.js.map +7 -0
- package/lib/reporters/listModeReporter.js +69 -0
- package/lib/reporters/listModeReporter.js.map +7 -0
- package/lib/reporters/markdown.js +144 -0
- package/lib/reporters/markdown.js.map +7 -0
- package/lib/reporters/merge.js +535 -0
- package/lib/reporters/merge.js.map +7 -0
- package/lib/reporters/multiplexer.js +104 -0
- package/lib/reporters/multiplexer.js.map +7 -0
- package/lib/reporters/reporterV2.js +102 -0
- package/lib/reporters/reporterV2.js.map +7 -0
- package/lib/reporters/teleEmitter.js +297 -0
- package/lib/reporters/teleEmitter.js.map +7 -0
- package/lib/reporters/versions/blobV1.js +16 -0
- package/lib/reporters/versions/blobV1.js.map +7 -0
- package/lib/runner/dispatcher.js +491 -0
- package/lib/runner/dispatcher.js.map +7 -0
- package/lib/runner/failureTracker.js +72 -0
- package/lib/runner/failureTracker.js.map +7 -0
- package/lib/runner/lastRun.js +77 -0
- package/lib/runner/lastRun.js.map +7 -0
- package/lib/runner/loadUtils.js +333 -0
- package/lib/runner/loadUtils.js.map +7 -0
- package/lib/runner/loaderHost.js +89 -0
- package/lib/runner/loaderHost.js.map +7 -0
- package/lib/runner/processHost.js +161 -0
- package/lib/runner/processHost.js.map +7 -0
- package/lib/runner/projectUtils.js +241 -0
- package/lib/runner/projectUtils.js.map +7 -0
- package/lib/runner/rebase.js +189 -0
- package/lib/runner/rebase.js.map +7 -0
- package/lib/runner/reporters.js +137 -0
- package/lib/runner/reporters.js.map +7 -0
- package/lib/runner/runner.js +173 -0
- package/lib/runner/sigIntWatcher.js +96 -0
- package/lib/runner/sigIntWatcher.js.map +7 -0
- package/lib/runner/taskRunner.js +127 -0
- package/lib/runner/taskRunner.js.map +7 -0
- package/lib/runner/tasks.js +410 -0
- package/lib/runner/tasks.js.map +7 -0
- package/lib/runner/testGroups.js +117 -0
- package/lib/runner/testGroups.js.map +7 -0
- package/lib/runner/testRunner.js +390 -0
- package/lib/runner/testRunner.js.map +7 -0
- package/lib/runner/testServer.js +264 -0
- package/lib/runner/testServer.js.map +7 -0
- package/lib/runner/uiMode.js +271 -0
- package/lib/runner/uiModeReporter.js +30 -0
- package/lib/runner/uiModeReporter.js.map +7 -0
- package/lib/runner/vcs.js +72 -0
- package/lib/runner/vcs.js.map +7 -0
- package/lib/runner/watchMode.js +395 -0
- package/lib/runner/watchMode.js.map +7 -0
- package/lib/runner/workerHost.js +95 -0
- package/lib/runner/workerHost.js.map +7 -0
- package/lib/store.js +98 -0
- package/lib/third_party/pirates.js +62 -0
- package/lib/third_party/pirates.js.map +7 -0
- package/lib/third_party/tsconfig-loader.js +103 -0
- package/lib/third_party/tsconfig-loader.js.map +7 -0
- package/lib/transform/babelBundle.js +43 -0
- package/lib/transform/babelBundle.js.map +7 -0
- package/lib/transform/babelBundleImpl.js +461 -0
- package/lib/transform/babelBundleImpl.js.map +7 -0
- package/lib/transform/compilationCache.js +272 -0
- package/lib/transform/compilationCache.js.map +7 -0
- package/lib/transform/esmLoader.js +104 -0
- package/lib/transform/esmLoader.js.map +7 -0
- package/lib/transform/esmUtils.js +32 -0
- package/lib/transform/portTransport.js +67 -0
- package/lib/transform/portTransport.js.map +7 -0
- package/lib/transform/transform.js +293 -0
- package/lib/transform/transform.js.map +7 -0
- package/lib/util.js +403 -0
- package/lib/util.js.map +7 -0
- package/lib/utilsBundle.js +43 -0
- package/lib/utilsBundle.js.map +7 -0
- package/lib/utilsBundleImpl.js +100 -0
- package/lib/utilsBundleImpl.js.map +7 -0
- package/lib/worker/fixtureRunner.js +258 -0
- package/lib/worker/fixtureRunner.js.map +7 -0
- package/lib/worker/stepContext.js +34 -0
- package/lib/worker/testInfo.js +508 -0
- package/lib/worker/testInfo.js.map +7 -0
- package/lib/worker/testTracing.js +344 -0
- package/lib/worker/testTracing.js.map +7 -0
- package/lib/worker/timeoutManager.js +174 -0
- package/lib/worker/timeoutManager.js.map +7 -0
- package/lib/worker/util.js +31 -0
- package/lib/worker/util.js.map +7 -0
- package/lib/worker/workerMain.js +520 -0
- package/lib/worker/workerMain.js.map +7 -0
- package/package.json +74 -0
- package/test.d.ts +18 -0
- package/test.js +24 -0
- package/test.mjs +33 -0
- package/types/test.d.ts +10217 -0
- package/types/testReporter.d.ts +816 -0
package/lib/program.js
ADDED
@@ -0,0 +1,412 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __create = Object.create;
|
3
|
+
var __defProp = Object.defineProperty;
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
8
|
+
var __export = (target, all) => {
|
9
|
+
for (var name in all)
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
11
|
+
};
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
14
|
+
for (let key of __getOwnPropNames(from))
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
17
|
+
}
|
18
|
+
return to;
|
19
|
+
};
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
26
|
+
mod
|
27
|
+
));
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
29
|
+
var program_exports = {};
|
30
|
+
__export(program_exports, {
|
31
|
+
program: () => import_program2.program
|
32
|
+
});
|
33
|
+
module.exports = __toCommonJS(program_exports);
|
34
|
+
var import_fs = __toESM(require("fs"));
|
35
|
+
var import_path = __toESM(require("path"));
|
36
|
+
var import_program = require("playwright-core/lib/cli/program");
|
37
|
+
var import_utils = require("playwright-core/lib/utils");
|
38
|
+
var import_config = require("./common/config");
|
39
|
+
var import_configLoader = require("./common/configLoader");
|
40
|
+
var import_program2 = require("playwright-core/lib/cli/program");
|
41
|
+
var import_base = require("./reporters/base");
|
42
|
+
var import_html = require("./reporters/html");
|
43
|
+
var import_merge = require("./reporters/merge");
|
44
|
+
var import_projectUtils = require("./runner/projectUtils");
|
45
|
+
var testServer = __toESM(require("./runner/testServer"));
|
46
|
+
var import_watchMode = require("./runner/watchMode");
|
47
|
+
var import_testRunner = require("./runner/testRunner");
|
48
|
+
var import_reporters = require("./runner/reporters");
|
49
|
+
var import_exports = require("./mcp/sdk/exports");
|
50
|
+
var import_testBackend = require("./mcp/test/testBackend");
|
51
|
+
var import_seed = require("./mcp/test/seed");
|
52
|
+
var import_program3 = require("./mcp/program");
|
53
|
+
var import_watchdog = require("./mcp/browser/watchdog");
|
54
|
+
var import_generateAgents = require("./agents/generateAgents");
|
55
|
+
const packageJSON = require("../package.json");
|
56
|
+
function addTestCommand(program3) {
|
57
|
+
const command = program3.command("test [test-filter...]");
|
58
|
+
command.description("run tests with Playwright Test");
|
59
|
+
const options = testOptions.sort((a, b) => a[0].replace(/-/g, "").localeCompare(b[0].replace(/-/g, "")));
|
60
|
+
options.forEach(([name, { description, choices, preset }]) => {
|
61
|
+
const option = command.createOption(name, description);
|
62
|
+
if (choices)
|
63
|
+
option.choices(choices);
|
64
|
+
if (preset)
|
65
|
+
option.preset(preset);
|
66
|
+
command.addOption(option);
|
67
|
+
return command;
|
68
|
+
});
|
69
|
+
command.action(async (args, opts) => {
|
70
|
+
try {
|
71
|
+
await runTests(args, opts);
|
72
|
+
} catch (e) {
|
73
|
+
console.error(e);
|
74
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(1);
|
75
|
+
}
|
76
|
+
});
|
77
|
+
command.addHelpText("afterAll", `
|
78
|
+
Arguments [test-filter...]:
|
79
|
+
Pass arguments to filter test files. Each argument is treated as a regular expression. Matching is performed against the absolute file paths.
|
80
|
+
|
81
|
+
Examples:
|
82
|
+
$ npx playwright test my.spec.ts
|
83
|
+
$ npx playwright test some.spec.ts:42
|
84
|
+
$ npx playwright test --headed
|
85
|
+
$ npx playwright test --project=webkit`);
|
86
|
+
}
|
87
|
+
function addClearCacheCommand(program3) {
|
88
|
+
const command = program3.command("clear-cache");
|
89
|
+
command.description("clears build and test caches");
|
90
|
+
command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
|
91
|
+
command.action(async (opts) => {
|
92
|
+
const runner = new import_testRunner.TestRunner((0, import_configLoader.resolveConfigLocation)(opts.config), {});
|
93
|
+
const { status } = await runner.clearCache((0, import_reporters.createErrorCollectingReporter)(import_base.terminalScreen));
|
94
|
+
const exitCode = status === "interrupted" ? 130 : status === "passed" ? 0 : 1;
|
95
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(exitCode);
|
96
|
+
});
|
97
|
+
}
|
98
|
+
function addDevServerCommand(program3) {
|
99
|
+
const command = program3.command("dev-server", { hidden: true });
|
100
|
+
command.description("start dev server");
|
101
|
+
command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
|
102
|
+
command.action(async (options) => {
|
103
|
+
const runner = new import_testRunner.TestRunner((0, import_configLoader.resolveConfigLocation)(options.config), {});
|
104
|
+
await runner.startDevServer((0, import_reporters.createErrorCollectingReporter)(import_base.terminalScreen), "in-process");
|
105
|
+
});
|
106
|
+
}
|
107
|
+
function addTestServerCommand(program3) {
|
108
|
+
const command = program3.command("test-server", { hidden: true });
|
109
|
+
command.description("start test server");
|
110
|
+
command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
|
111
|
+
command.option("--host <host>", "Host to start the server on", "localhost");
|
112
|
+
command.option("--port <port>", "Port to start the server on", "0");
|
113
|
+
command.action((opts) => runTestServer(opts));
|
114
|
+
}
|
115
|
+
function addShowReportCommand(program3) {
|
116
|
+
const command = program3.command("show-report [report]");
|
117
|
+
command.description("show HTML report");
|
118
|
+
command.action((report, options) => (0, import_html.showHTMLReport)(report, options.host, +options.port));
|
119
|
+
command.option("--host <host>", "Host to serve report on", "localhost");
|
120
|
+
command.option("--port <port>", "Port to serve report on", "9323");
|
121
|
+
command.addHelpText("afterAll", `
|
122
|
+
Arguments [report]:
|
123
|
+
When specified, opens given report, otherwise opens last generated report.
|
124
|
+
|
125
|
+
Examples:
|
126
|
+
$ npx playwright show-report
|
127
|
+
$ npx playwright show-report playwright-report`);
|
128
|
+
}
|
129
|
+
function addMergeReportsCommand(program3) {
|
130
|
+
const command = program3.command("merge-reports [dir]");
|
131
|
+
command.description("merge multiple blob reports (for sharded tests) into a single report");
|
132
|
+
command.action(async (dir, options) => {
|
133
|
+
try {
|
134
|
+
await mergeReports(dir, options);
|
135
|
+
} catch (e) {
|
136
|
+
console.error(e);
|
137
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(1);
|
138
|
+
}
|
139
|
+
});
|
140
|
+
command.option("-c, --config <file>", `Configuration file. Can be used to specify additional configuration for the output report.`);
|
141
|
+
command.option("--reporter <reporter>", `Reporter to use, comma-separated, can be ${import_config.builtInReporters.map((name) => `"${name}"`).join(", ")} (default: "${import_config.defaultReporter}")`);
|
142
|
+
command.addHelpText("afterAll", `
|
143
|
+
Arguments [dir]:
|
144
|
+
Directory containing blob reports.
|
145
|
+
|
146
|
+
Examples:
|
147
|
+
$ npx playwright merge-reports playwright-report`);
|
148
|
+
}
|
149
|
+
function addBrowserMCPServerCommand(program3) {
|
150
|
+
const command = program3.command("run-mcp-server", { hidden: true });
|
151
|
+
command.description("Interact with the browser over MCP");
|
152
|
+
(0, import_program3.decorateCommand)(command, packageJSON.version);
|
153
|
+
}
|
154
|
+
function addTestMCPServerCommand(program3) {
|
155
|
+
const command = program3.command("run-test-mcp-server", { hidden: true });
|
156
|
+
command.description("Interact with the test runner over MCP");
|
157
|
+
command.option("--headless", "run browser in headless mode, headed by default");
|
158
|
+
command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
|
159
|
+
command.option("--host <host>", "host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.");
|
160
|
+
command.option("--port <port>", "port to listen on for SSE transport.");
|
161
|
+
command.action(async (options) => {
|
162
|
+
(0, import_watchdog.setupExitWatchdog)();
|
163
|
+
const backendFactory = {
|
164
|
+
name: "Playwright Test Runner",
|
165
|
+
nameInConfig: "playwright-test-runner",
|
166
|
+
version: packageJSON.version,
|
167
|
+
create: () => new import_testBackend.TestServerBackend(options.config, { muteConsole: options.port === void 0, headless: options.headless })
|
168
|
+
};
|
169
|
+
const mdbUrl = await (0, import_exports.runMainBackend)(
|
170
|
+
backendFactory,
|
171
|
+
{
|
172
|
+
port: options.port === void 0 ? void 0 : +options.port
|
173
|
+
}
|
174
|
+
);
|
175
|
+
if (mdbUrl)
|
176
|
+
console.error("MCP Listening on: ", mdbUrl);
|
177
|
+
});
|
178
|
+
}
|
179
|
+
function addInitAgentsCommand(program3) {
|
180
|
+
const command = program3.command("init-agents");
|
181
|
+
command.description("Initialize repository agents");
|
182
|
+
const option = command.createOption("--loop <loop>", "Agentic loop provider");
|
183
|
+
option.choices(["vscode", "claude", "opencode"]);
|
184
|
+
command.addOption(option);
|
185
|
+
command.option("-c, --config <file>", `Configuration file to find a project to use for seed test`);
|
186
|
+
command.option("--project <project>", "Project to use for seed test");
|
187
|
+
command.action(async (opts) => {
|
188
|
+
if (opts.loop === "opencode") {
|
189
|
+
await (0, import_generateAgents.initOpencodeRepo)();
|
190
|
+
} else if (opts.loop === "vscode") {
|
191
|
+
await (0, import_generateAgents.initVSCodeRepo)();
|
192
|
+
} else if (opts.loop === "claude") {
|
193
|
+
await (0, import_generateAgents.initClaudeCodeRepo)();
|
194
|
+
} else {
|
195
|
+
command.help();
|
196
|
+
return;
|
197
|
+
}
|
198
|
+
const config = await (0, import_configLoader.loadConfigFromFile)(opts.config);
|
199
|
+
const project = (0, import_seed.seedProject)(config, opts.project);
|
200
|
+
await (0, import_seed.ensureSeedTest)(project, true);
|
201
|
+
});
|
202
|
+
}
|
203
|
+
async function runTests(args, opts) {
|
204
|
+
await (0, import_utils.startProfiling)();
|
205
|
+
const cliOverrides = overridesFromOptions(opts);
|
206
|
+
const config = await (0, import_configLoader.loadConfigFromFile)(opts.config, cliOverrides, opts.deps === false);
|
207
|
+
config.cliArgs = args;
|
208
|
+
config.cliGrep = opts.grep;
|
209
|
+
config.cliOnlyChanged = opts.onlyChanged === true ? "HEAD" : opts.onlyChanged;
|
210
|
+
config.cliGrepInvert = opts.grepInvert;
|
211
|
+
config.cliListOnly = !!opts.list;
|
212
|
+
config.cliProjectFilter = opts.project || void 0;
|
213
|
+
config.cliPassWithNoTests = !!opts.passWithNoTests;
|
214
|
+
config.cliLastFailed = !!opts.lastFailed;
|
215
|
+
config.cliTestList = opts.testList ? import_path.default.resolve(process.cwd(), opts.testList) : void 0;
|
216
|
+
config.cliTestListInvert = opts.testListInvert ? import_path.default.resolve(process.cwd(), opts.testListInvert) : void 0;
|
217
|
+
(0, import_projectUtils.filterProjects)(config.projects, config.cliProjectFilter);
|
218
|
+
if (opts.ui || opts.uiHost || opts.uiPort) {
|
219
|
+
if (opts.onlyChanged)
|
220
|
+
throw new Error(`--only-changed is not supported in UI mode. If you'd like that to change, see https://github.com/microsoft/playwright/issues/15075 for more details.`);
|
221
|
+
const status2 = await testServer.runUIMode(opts.config, cliOverrides, {
|
222
|
+
host: opts.uiHost,
|
223
|
+
port: opts.uiPort ? +opts.uiPort : void 0,
|
224
|
+
args,
|
225
|
+
grep: opts.grep,
|
226
|
+
grepInvert: opts.grepInvert,
|
227
|
+
project: opts.project || void 0,
|
228
|
+
reporter: Array.isArray(opts.reporter) ? opts.reporter : opts.reporter ? [opts.reporter] : void 0
|
229
|
+
});
|
230
|
+
await (0, import_utils.stopProfiling)("runner");
|
231
|
+
const exitCode2 = status2 === "interrupted" ? 130 : status2 === "passed" ? 0 : 1;
|
232
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(exitCode2);
|
233
|
+
return;
|
234
|
+
}
|
235
|
+
if (process.env.PWTEST_WATCH) {
|
236
|
+
if (opts.onlyChanged)
|
237
|
+
throw new Error(`--only-changed is not supported in watch mode. If you'd like that to change, file an issue and let us know about your usecase for it.`);
|
238
|
+
const status2 = await (0, import_watchMode.runWatchModeLoop)(
|
239
|
+
(0, import_configLoader.resolveConfigLocation)(opts.config),
|
240
|
+
{
|
241
|
+
projects: opts.project,
|
242
|
+
files: args,
|
243
|
+
grep: opts.grep
|
244
|
+
}
|
245
|
+
);
|
246
|
+
await (0, import_utils.stopProfiling)("runner");
|
247
|
+
const exitCode2 = status2 === "interrupted" ? 130 : status2 === "passed" ? 0 : 1;
|
248
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(exitCode2);
|
249
|
+
return;
|
250
|
+
}
|
251
|
+
const status = await (0, import_testRunner.runAllTestsWithConfig)(config);
|
252
|
+
await (0, import_utils.stopProfiling)("runner");
|
253
|
+
const exitCode = status === "interrupted" ? 130 : status === "passed" ? 0 : 1;
|
254
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(exitCode);
|
255
|
+
}
|
256
|
+
async function runTestServer(opts) {
|
257
|
+
const host = opts.host || "localhost";
|
258
|
+
const port = opts.port ? +opts.port : 0;
|
259
|
+
const status = await testServer.runTestServer(opts.config, {}, { host, port });
|
260
|
+
const exitCode = status === "interrupted" ? 130 : status === "passed" ? 0 : 1;
|
261
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(exitCode);
|
262
|
+
}
|
263
|
+
async function mergeReports(reportDir, opts) {
|
264
|
+
const configFile = opts.config;
|
265
|
+
const config = configFile ? await (0, import_configLoader.loadConfigFromFile)(configFile) : await (0, import_configLoader.loadEmptyConfigForMergeReports)();
|
266
|
+
const dir = import_path.default.resolve(process.cwd(), reportDir || "");
|
267
|
+
const dirStat = await import_fs.default.promises.stat(dir).catch((e) => null);
|
268
|
+
if (!dirStat)
|
269
|
+
throw new Error("Directory does not exist: " + dir);
|
270
|
+
if (!dirStat.isDirectory())
|
271
|
+
throw new Error(`"${dir}" is not a directory`);
|
272
|
+
let reporterDescriptions = resolveReporterOption(opts.reporter);
|
273
|
+
if (!reporterDescriptions && configFile)
|
274
|
+
reporterDescriptions = config.config.reporter;
|
275
|
+
if (!reporterDescriptions)
|
276
|
+
reporterDescriptions = [[import_config.defaultReporter]];
|
277
|
+
const rootDirOverride = configFile ? config.config.rootDir : void 0;
|
278
|
+
await (0, import_merge.createMergedReport)(config, dir, reporterDescriptions, rootDirOverride);
|
279
|
+
(0, import_utils.gracefullyProcessExitDoNotHang)(0);
|
280
|
+
}
|
281
|
+
function overridesFromOptions(options) {
|
282
|
+
const overrides = {
|
283
|
+
failOnFlakyTests: options.failOnFlakyTests ? true : void 0,
|
284
|
+
forbidOnly: options.forbidOnly ? true : void 0,
|
285
|
+
fullyParallel: options.fullyParallel ? true : void 0,
|
286
|
+
globalTimeout: options.globalTimeout ? parseInt(options.globalTimeout, 10) : void 0,
|
287
|
+
maxFailures: options.x ? 1 : options.maxFailures ? parseInt(options.maxFailures, 10) : void 0,
|
288
|
+
outputDir: options.output ? import_path.default.resolve(process.cwd(), options.output) : void 0,
|
289
|
+
quiet: options.quiet ? options.quiet : void 0,
|
290
|
+
repeatEach: options.repeatEach ? parseInt(options.repeatEach, 10) : void 0,
|
291
|
+
retries: options.retries ? parseInt(options.retries, 10) : void 0,
|
292
|
+
reporter: resolveReporterOption(options.reporter),
|
293
|
+
shard: resolveShardOption(options.shard),
|
294
|
+
timeout: options.timeout ? parseInt(options.timeout, 10) : void 0,
|
295
|
+
tsconfig: options.tsconfig ? import_path.default.resolve(process.cwd(), options.tsconfig) : void 0,
|
296
|
+
ignoreSnapshots: options.ignoreSnapshots ? !!options.ignoreSnapshots : void 0,
|
297
|
+
updateSnapshots: options.updateSnapshots,
|
298
|
+
updateSourceMethod: options.updateSourceMethod,
|
299
|
+
workers: options.workers
|
300
|
+
};
|
301
|
+
if (options.browser) {
|
302
|
+
const browserOpt = options.browser.toLowerCase();
|
303
|
+
if (!["all", "chromium", "firefox", "webkit"].includes(browserOpt))
|
304
|
+
throw new Error(`Unsupported browser "${options.browser}", must be one of "all", "chromium", "firefox" or "webkit"`);
|
305
|
+
const browserNames = browserOpt === "all" ? ["chromium", "firefox", "webkit"] : [browserOpt];
|
306
|
+
overrides.projects = browserNames.map((browserName) => {
|
307
|
+
return {
|
308
|
+
name: browserName,
|
309
|
+
use: { browserName }
|
310
|
+
};
|
311
|
+
});
|
312
|
+
}
|
313
|
+
if (options.headed || options.debug)
|
314
|
+
overrides.use = { headless: false };
|
315
|
+
if (!options.ui && options.debug) {
|
316
|
+
overrides.debug = true;
|
317
|
+
process.env.PWDEBUG = "1";
|
318
|
+
}
|
319
|
+
if (!options.ui && options.trace) {
|
320
|
+
overrides.use = overrides.use || {};
|
321
|
+
overrides.use.trace = options.trace;
|
322
|
+
}
|
323
|
+
if (overrides.tsconfig && !import_fs.default.existsSync(overrides.tsconfig))
|
324
|
+
throw new Error(`--tsconfig "${options.tsconfig}" does not exist`);
|
325
|
+
return overrides;
|
326
|
+
}
|
327
|
+
function resolveReporterOption(reporter) {
|
328
|
+
if (!reporter || !reporter.length)
|
329
|
+
return void 0;
|
330
|
+
return reporter.split(",").map((r) => [resolveReporter(r)]);
|
331
|
+
}
|
332
|
+
function resolveShardOption(shard) {
|
333
|
+
if (!shard)
|
334
|
+
return void 0;
|
335
|
+
const shardPair = shard.split("/");
|
336
|
+
if (shardPair.length !== 2) {
|
337
|
+
throw new Error(
|
338
|
+
`--shard "${shard}", expected format is "current/all", 1-based, for example "3/5".`
|
339
|
+
);
|
340
|
+
}
|
341
|
+
const current = parseInt(shardPair[0], 10);
|
342
|
+
const total = parseInt(shardPair[1], 10);
|
343
|
+
if (isNaN(total) || total < 1)
|
344
|
+
throw new Error(`--shard "${shard}" total must be a positive number`);
|
345
|
+
if (isNaN(current) || current < 1 || current > total) {
|
346
|
+
throw new Error(
|
347
|
+
`--shard "${shard}" current must be a positive number, not greater than shard total`
|
348
|
+
);
|
349
|
+
}
|
350
|
+
return { current, total };
|
351
|
+
}
|
352
|
+
function resolveReporter(id) {
|
353
|
+
if (import_config.builtInReporters.includes(id))
|
354
|
+
return id;
|
355
|
+
const localPath = import_path.default.resolve(process.cwd(), id);
|
356
|
+
if (import_fs.default.existsSync(localPath))
|
357
|
+
return localPath;
|
358
|
+
return require.resolve(id, { paths: [process.cwd()] });
|
359
|
+
}
|
360
|
+
const kTraceModes = ["on", "off", "on-first-retry", "on-all-retries", "retain-on-failure", "retain-on-first-failure"];
|
361
|
+
const testOptions = [
|
362
|
+
/* deprecated */
|
363
|
+
["--browser <browser>", { description: `Browser to use for tests, one of "all", "chromium", "firefox" or "webkit" (default: "chromium")` }],
|
364
|
+
["-c, --config <file>", { description: `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"` }],
|
365
|
+
["--debug", { description: `Run tests with Playwright Inspector. Shortcut for "PWDEBUG=1" environment variable and "--timeout=0 --max-failures=1 --headed --workers=1" options` }],
|
366
|
+
["--fail-on-flaky-tests", { description: `Fail if any test is flagged as flaky (default: false)` }],
|
367
|
+
["--forbid-only", { description: `Fail if test.only is called (default: false)` }],
|
368
|
+
["--fully-parallel", { description: `Run all tests in parallel (default: false)` }],
|
369
|
+
["--global-timeout <timeout>", { description: `Maximum time this test suite can run in milliseconds (default: unlimited)` }],
|
370
|
+
["-g, --grep <grep>", { description: `Only run tests matching this regular expression (default: ".*")` }],
|
371
|
+
["--grep-invert <grep>", { description: `Only run tests that do not match this regular expression` }],
|
372
|
+
["--headed", { description: `Run tests in headed browsers (default: headless)` }],
|
373
|
+
["--ignore-snapshots", { description: `Ignore screenshot and snapshot expectations` }],
|
374
|
+
["--last-failed", { description: `Only re-run the failures` }],
|
375
|
+
["--list", { description: `Collect all the tests and report them, but do not run` }],
|
376
|
+
["--max-failures <N>", { description: `Stop after the first N failures` }],
|
377
|
+
["--no-deps", { description: `Do not run project dependencies` }],
|
378
|
+
["--output <dir>", { description: `Folder for output artifacts (default: "test-results")` }],
|
379
|
+
["--only-changed [ref]", { description: `Only run test files that have been changed between 'HEAD' and 'ref'. Defaults to running all uncommitted changes. Only supports Git.` }],
|
380
|
+
["--pass-with-no-tests", { description: `Makes test run succeed even if no tests were found` }],
|
381
|
+
["--project <project-name...>", { description: `Only run tests from the specified list of projects, supports '*' wildcard (default: run all projects)` }],
|
382
|
+
["--quiet", { description: `Suppress stdio` }],
|
383
|
+
["--repeat-each <N>", { description: `Run each test N times (default: 1)` }],
|
384
|
+
["--reporter <reporter>", { description: `Reporter to use, comma-separated, can be ${import_config.builtInReporters.map((name) => `"${name}"`).join(", ")} (default: "${import_config.defaultReporter}")` }],
|
385
|
+
["--retries <retries>", { description: `Maximum retry count for flaky tests, zero for no retries (default: no retries)` }],
|
386
|
+
["--shard <shard>", { description: `Shard tests and execute only the selected shard, specify in the form "current/all", 1-based, for example "3/5"` }],
|
387
|
+
["--test-list <file>", { description: `Path to a file containing a list of tests to run. See https://playwright.dev/docs/test-cli for more details.` }],
|
388
|
+
["--test-list-invert <file>", { description: `Path to a file containing a list of tests to skip. See https://playwright.dev/docs/test-cli for more details.` }],
|
389
|
+
["--timeout <timeout>", { description: `Specify test timeout threshold in milliseconds, zero for unlimited (default: ${import_config.defaultTimeout})` }],
|
390
|
+
["--trace <mode>", { description: `Force tracing mode`, choices: kTraceModes }],
|
391
|
+
["--tsconfig <path>", { description: `Path to a single tsconfig applicable to all imported files (default: look up tsconfig for each imported file separately)` }],
|
392
|
+
["--ui", { description: `Run tests in interactive UI mode` }],
|
393
|
+
["--ui-host <host>", { description: `Host to serve UI on; specifying this option opens UI in a browser tab` }],
|
394
|
+
["--ui-port <port>", { description: `Port to serve UI on, 0 for any free port; specifying this option opens UI in a browser tab` }],
|
395
|
+
["-u, --update-snapshots [mode]", { description: `Update snapshots with actual results. Running tests without the flag defaults to "missing"`, choices: ["all", "changed", "missing", "none"], preset: "changed" }],
|
396
|
+
["--update-source-method <method>", { description: `Chooses the way source is updated (default: "patch")`, choices: ["overwrite", "3way", "patch"] }],
|
397
|
+
["-j, --workers <workers>", { description: `Number of concurrent workers or percentage of logical CPU cores, use 1 to run in a single worker (default: 50%)` }],
|
398
|
+
["-x", { description: `Stop after the first failure` }]
|
399
|
+
];
|
400
|
+
addTestCommand(import_program.program);
|
401
|
+
addShowReportCommand(import_program.program);
|
402
|
+
addMergeReportsCommand(import_program.program);
|
403
|
+
addClearCacheCommand(import_program.program);
|
404
|
+
addBrowserMCPServerCommand(import_program.program);
|
405
|
+
addTestMCPServerCommand(import_program.program);
|
406
|
+
addDevServerCommand(import_program.program);
|
407
|
+
addTestServerCommand(import_program.program);
|
408
|
+
addInitAgentsCommand(import_program.program);
|
409
|
+
// Annotate the CommonJS export names for ESM import in node:
|
410
|
+
0 && (module.exports = {
|
411
|
+
program
|
412
|
+
});
|
@@ -0,0 +1,7 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"sources": ["../src/program.ts"],
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) Microsoft Corporation.\n *\n * Licensed under the Apache License, Version 2.0 (the 'License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* eslint-disable no-console */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { program } from 'playwright-core/lib/cli/program';\nimport { gracefullyProcessExitDoNotHang, startProfiling, stopProfiling } from 'playwright-core/lib/utils';\n\nimport { builtInReporters, defaultReporter, defaultTimeout } from './common/config';\nimport { loadConfigFromFile, loadEmptyConfigForMergeReports, resolveConfigLocation } from './common/configLoader';\nexport { program } from 'playwright-core/lib/cli/program';\nimport { terminalScreen } from './reporters/base';\nimport { showHTMLReport } from './reporters/html';\nimport { createMergedReport } from './reporters/merge';\nimport { filterProjects } from './runner/projectUtils';\nimport * as testServer from './runner/testServer';\nimport { runWatchModeLoop } from './runner/watchMode';\nimport { runAllTestsWithConfig, TestRunner } from './runner/testRunner';\nimport { createErrorCollectingReporter } from './runner/reporters';\nimport { ServerBackendFactory } from './mcp/sdk/server';\nimport { TestServerBackend } from './mcp/test/backend';\nimport { runMainBackend } from './mcp/sdk/mdb';\n\nimport type { ConfigCLIOverrides } from './common/ipc';\nimport type { TraceMode } from '../types/test';\nimport type { ReporterDescription } from '../types/test';\nimport type { Command } from 'playwright-core/lib/utilsBundle';\n\nfunction addTestCommand(program: Command) {\n const command = program.command('test [test-filter...]');\n command.description('run tests with Playwright Test');\n const options = testOptions.sort((a, b) => a[0].replace(/-/g, '').localeCompare(b[0].replace(/-/g, '')));\n options.forEach(([name, { description, choices, preset }]) => {\n const option = command.createOption(name, description);\n if (choices)\n option.choices(choices);\n if (preset)\n option.preset(preset);\n // We don't set the default value here, because we want not specified options to\n // fall back to the user config, which we haven't parsed yet.\n command.addOption(option);\n return command;\n });\n command.action(async (args, opts) => {\n try {\n await runTests(args, opts);\n } catch (e) {\n console.error(e);\n gracefullyProcessExitDoNotHang(1);\n }\n });\n command.addHelpText('afterAll', `\nArguments [test-filter...]:\n Pass arguments to filter test files. Each argument is treated as a regular expression. Matching is performed against the absolute file paths.\n\nExamples:\n $ npx playwright test my.spec.ts\n $ npx playwright test some.spec.ts:42\n $ npx playwright test --headed\n $ npx playwright test --project=webkit`);\n}\n\nfunction addClearCacheCommand(program: Command) {\n const command = program.command('clear-cache');\n command.description('clears build and test caches');\n command.option('-c, --config <file>', `Configuration file, or a test directory with optional \"playwright.config.{m,c}?{js,ts}\"`);\n command.action(async opts => {\n const runner = new TestRunner(resolveConfigLocation(opts.config), {});\n const { status } = await runner.clearCache(createErrorCollectingReporter(terminalScreen));\n const exitCode = status === 'interrupted' ? 130 : (status === 'passed' ? 0 : 1);\n gracefullyProcessExitDoNotHang(exitCode);\n });\n}\n\nfunction addDevServerCommand(program: Command) {\n const command = program.command('dev-server', { hidden: true });\n command.description('start dev server');\n command.option('-c, --config <file>', `Configuration file, or a test directory with optional \"playwright.config.{m,c}?{js,ts}\"`);\n command.action(async options => {\n const runner = new TestRunner(resolveConfigLocation(options.config), {});\n await runner.startDevServer(createErrorCollectingReporter(terminalScreen), 'in-process');\n });\n}\n\nfunction addTestServerCommand(program: Command) {\n const command = program.command('test-server', { hidden: true });\n command.description('start test server');\n command.option('-c, --config <file>', `Configuration file, or a test directory with optional \"playwright.config.{m,c}?{js,ts}\"`);\n command.option('--host <host>', 'Host to start the server on', 'localhost');\n command.option('--port <port>', 'Port to start the server on', '0');\n command.action(opts => runTestServer(opts));\n}\n\nfunction addShowReportCommand(program: Command) {\n const command = program.command('show-report [report]');\n command.description('show HTML report');\n command.action((report, options) => showHTMLReport(report, options.host, +options.port));\n command.option('--host <host>', 'Host to serve report on', 'localhost');\n command.option('--port <port>', 'Port to serve report on', '9323');\n command.addHelpText('afterAll', `\nArguments [report]:\n When specified, opens given report, otherwise opens last generated report.\n\nExamples:\n $ npx playwright show-report\n $ npx playwright show-report playwright-report`);\n}\n\nfunction addMergeReportsCommand(program: Command) {\n const command = program.command('merge-reports [dir]');\n command.description('merge multiple blob reports (for sharded tests) into a single report');\n command.action(async (dir, options) => {\n try {\n await mergeReports(dir, options);\n } catch (e) {\n console.error(e);\n gracefullyProcessExitDoNotHang(1);\n }\n });\n command.option('-c, --config <file>', `Configuration file. Can be used to specify additional configuration for the output report.`);\n command.option('--reporter <reporter>', `Reporter to use, comma-separated, can be ${builtInReporters.map(name => `\"${name}\"`).join(', ')} (default: \"${defaultReporter}\")`);\n command.addHelpText('afterAll', `\nArguments [dir]:\n Directory containing blob reports.\n\nExamples:\n $ npx playwright merge-reports playwright-report`);\n}\n\nfunction addMCPServerCommand(program: Command) {\n const command = program.command('run-mcp-server', { hidden: true });\n command.description('Interact with the test runner over MCP');\n command.option('-c, --config <file>', `Configuration file, or a test directory with optional \"playwright.config.{m,c}?{js,ts}\"`);\n command.option('--host <host>', 'host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.');\n command.option('--port <port>', 'port to listen on for SSE transport.');\n command.action(async options => {\n const resolvedLocation = resolveConfigLocation(options.config);\n const backendFactory: ServerBackendFactory = {\n name: 'Playwright Test Runner',\n nameInConfig: 'playwright-test-runner',\n version: '0.0.0',\n create: () => new TestServerBackend(resolvedLocation, { muteConsole: options.port === undefined }),\n };\n const mdbUrl = await runMainBackend(backendFactory, { port: options.port === undefined ? undefined : +options.port });\n if (mdbUrl)\n console.error('MCP Listening on: ', mdbUrl);\n });\n}\n\nasync function runTests(args: string[], opts: { [key: string]: any }) {\n await startProfiling();\n const cliOverrides = overridesFromOptions(opts);\n\n const config = await loadConfigFromFile(opts.config, cliOverrides, opts.deps === false);\n config.cliArgs = args;\n config.cliGrep = opts.grep as string | undefined;\n config.cliOnlyChanged = opts.onlyChanged === true ? 'HEAD' : opts.onlyChanged;\n config.cliGrepInvert = opts.grepInvert as string | undefined;\n config.cliListOnly = !!opts.list;\n config.cliProjectFilter = opts.project || undefined;\n config.cliPassWithNoTests = !!opts.passWithNoTests;\n config.cliLastFailed = !!opts.lastFailed;\n config.cliLastRunFile = opts.lastRunFile ? path.resolve(process.cwd(), opts.lastRunFile) : undefined;\n\n // Evaluate project filters against config before starting execution. This enables a consistent error message across run modes\n filterProjects(config.projects, config.cliProjectFilter);\n\n if (opts.ui || opts.uiHost || opts.uiPort) {\n if (opts.onlyChanged)\n throw new Error(`--only-changed is not supported in UI mode. If you'd like that to change, see https://github.com/microsoft/playwright/issues/15075 for more details.`);\n\n const status = await testServer.runUIMode(opts.config, cliOverrides, {\n host: opts.uiHost,\n port: opts.uiPort ? +opts.uiPort : undefined,\n args,\n grep: opts.grep as string | undefined,\n grepInvert: opts.grepInvert as string | undefined,\n project: opts.project || undefined,\n reporter: Array.isArray(opts.reporter) ? opts.reporter : opts.reporter ? [opts.reporter] : undefined,\n });\n await stopProfiling('runner');\n const exitCode = status === 'interrupted' ? 130 : (status === 'passed' ? 0 : 1);\n gracefullyProcessExitDoNotHang(exitCode);\n return;\n }\n\n if (process.env.PWTEST_WATCH) {\n if (opts.onlyChanged)\n throw new Error(`--only-changed is not supported in watch mode. If you'd like that to change, file an issue and let us know about your usecase for it.`);\n\n const status = await runWatchModeLoop(\n resolveConfigLocation(opts.config),\n {\n projects: opts.project,\n files: args,\n grep: opts.grep\n }\n );\n await stopProfiling('runner');\n const exitCode = status === 'interrupted' ? 130 : (status === 'passed' ? 0 : 1);\n gracefullyProcessExitDoNotHang(exitCode);\n return;\n }\n\n const status = await runAllTestsWithConfig(config);\n await stopProfiling('runner');\n const exitCode = status === 'interrupted' ? 130 : (status === 'passed' ? 0 : 1);\n gracefullyProcessExitDoNotHang(exitCode);\n}\n\nasync function runTestServer(opts: { [key: string]: any }) {\n const host = opts.host || 'localhost';\n const port = opts.port ? +opts.port : 0;\n const status = await testServer.runTestServer(opts.config, { }, { host, port });\n const exitCode = status === 'interrupted' ? 130 : (status === 'passed' ? 0 : 1);\n gracefullyProcessExitDoNotHang(exitCode);\n}\n\nasync function mergeReports(reportDir: string | undefined, opts: { [key: string]: any }) {\n const configFile = opts.config;\n const config = configFile ? await loadConfigFromFile(configFile) : await loadEmptyConfigForMergeReports();\n\n const dir = path.resolve(process.cwd(), reportDir || '');\n const dirStat = await fs.promises.stat(dir).catch(e => null);\n if (!dirStat)\n throw new Error('Directory does not exist: ' + dir);\n if (!dirStat.isDirectory())\n throw new Error(`\"${dir}\" is not a directory`);\n let reporterDescriptions: ReporterDescription[] | undefined = resolveReporterOption(opts.reporter);\n if (!reporterDescriptions && configFile)\n reporterDescriptions = config.config.reporter;\n if (!reporterDescriptions)\n reporterDescriptions = [[defaultReporter]];\n const rootDirOverride = configFile ? config.config.rootDir : undefined;\n await createMergedReport(config, dir, reporterDescriptions!, rootDirOverride);\n gracefullyProcessExitDoNotHang(0);\n}\n\nfunction overridesFromOptions(options: { [key: string]: any }): ConfigCLIOverrides {\n const overrides: ConfigCLIOverrides = {\n failOnFlakyTests: options.failOnFlakyTests ? true : undefined,\n forbidOnly: options.forbidOnly ? true : undefined,\n fullyParallel: options.fullyParallel ? true : undefined,\n globalTimeout: options.globalTimeout ? parseInt(options.globalTimeout, 10) : undefined,\n maxFailures: options.x ? 1 : (options.maxFailures ? parseInt(options.maxFailures, 10) : undefined),\n outputDir: options.output ? path.resolve(process.cwd(), options.output) : undefined,\n quiet: options.quiet ? options.quiet : undefined,\n repeatEach: options.repeatEach ? parseInt(options.repeatEach, 10) : undefined,\n retries: options.retries ? parseInt(options.retries, 10) : undefined,\n reporter: resolveReporterOption(options.reporter),\n shard: resolveShardOption(options.shard),\n timeout: options.timeout ? parseInt(options.timeout, 10) : undefined,\n tsconfig: options.tsconfig ? path.resolve(process.cwd(), options.tsconfig) : undefined,\n ignoreSnapshots: options.ignoreSnapshots ? !!options.ignoreSnapshots : undefined,\n updateSnapshots: options.updateSnapshots,\n updateSourceMethod: options.updateSourceMethod,\n workers: options.workers,\n };\n\n if (options.browser) {\n const browserOpt = options.browser.toLowerCase();\n if (!['all', 'chromium', 'firefox', 'webkit'].includes(browserOpt))\n throw new Error(`Unsupported browser \"${options.browser}\", must be one of \"all\", \"chromium\", \"firefox\" or \"webkit\"`);\n const browserNames = browserOpt === 'all' ? ['chromium', 'firefox', 'webkit'] : [browserOpt];\n overrides.projects = browserNames.map(browserName => {\n return {\n name: browserName,\n use: { browserName },\n };\n });\n }\n\n if (options.headed || options.debug)\n overrides.use = { headless: false };\n if (!options.ui && options.debug) {\n overrides.debug = true;\n process.env.PWDEBUG = '1';\n }\n if (!options.ui && options.trace) {\n overrides.use = overrides.use || {};\n overrides.use.trace = options.trace;\n }\n if (overrides.tsconfig && !fs.existsSync(overrides.tsconfig))\n throw new Error(`--tsconfig \"${options.tsconfig}\" does not exist`);\n\n return overrides;\n}\n\nfunction resolveReporterOption(reporter?: string): ReporterDescription[] | undefined {\n if (!reporter || !reporter.length)\n return undefined;\n return reporter.split(',').map((r: string) => [resolveReporter(r)]);\n}\n\nfunction resolveShardOption(shard?: string): ConfigCLIOverrides['shard'] {\n if (!shard)\n return undefined;\n\n const shardPair = shard.split('/');\n\n if (shardPair.length !== 2) {\n throw new Error(\n `--shard \"${shard}\", expected format is \"current/all\", 1-based, for example \"3/5\".`,\n );\n }\n\n const current = parseInt(shardPair[0], 10);\n const total = parseInt(shardPair[1], 10);\n\n if (isNaN(total) || total < 1)\n throw new Error(`--shard \"${shard}\" total must be a positive number`);\n\n\n if (isNaN(current) || current < 1 || current > total) {\n throw new Error(\n `--shard \"${shard}\" current must be a positive number, not greater than shard total`,\n );\n }\n\n return { current, total };\n}\n\nfunction resolveReporter(id: string) {\n if (builtInReporters.includes(id as any))\n return id;\n const localPath = path.resolve(process.cwd(), id);\n if (fs.existsSync(localPath))\n return localPath;\n return require.resolve(id, { paths: [process.cwd()] });\n}\n\nconst kTraceModes: TraceMode[] = ['on', 'off', 'on-first-retry', 'on-all-retries', 'retain-on-failure', 'retain-on-first-failure'];\n\n// Note: update docs/src/test-cli-js.md when you update this, program is the source of truth.\n\nconst testOptions: [string, { description: string, choices?: string[], preset?: string }][] = [\n /* deprecated */ ['--browser <browser>', { description: `Browser to use for tests, one of \"all\", \"chromium\", \"firefox\" or \"webkit\" (default: \"chromium\")` }],\n ['-c, --config <file>', { description: `Configuration file, or a test directory with optional \"playwright.config.{m,c}?{js,ts}\"` }],\n ['--debug', { description: `Run tests with Playwright Inspector. Shortcut for \"PWDEBUG=1\" environment variable and \"--timeout=0 --max-failures=1 --headed --workers=1\" options` }],\n ['--fail-on-flaky-tests', { description: `Fail if any test is flagged as flaky (default: false)` }],\n ['--forbid-only', { description: `Fail if test.only is called (default: false)` }],\n ['--fully-parallel', { description: `Run all tests in parallel (default: false)` }],\n ['--global-timeout <timeout>', { description: `Maximum time this test suite can run in milliseconds (default: unlimited)` }],\n ['-g, --grep <grep>', { description: `Only run tests matching this regular expression (default: \".*\")` }],\n ['--grep-invert <grep>', { description: `Only run tests that do not match this regular expression` }],\n ['--headed', { description: `Run tests in headed browsers (default: headless)` }],\n ['--ignore-snapshots', { description: `Ignore screenshot and snapshot expectations` }],\n ['--last-failed', { description: `Only re-run the failures` }],\n ['--last-run-file <file>', { description: `Path to the last-run file (default: \"test-results/.last-run.json\")` }],\n ['--list', { description: `Collect all the tests and report them, but do not run` }],\n ['--max-failures <N>', { description: `Stop after the first N failures` }],\n ['--no-deps', { description: `Do not run project dependencies` }],\n ['--output <dir>', { description: `Folder for output artifacts (default: \"test-results\")` }],\n ['--only-changed [ref]', { description: `Only run test files that have been changed between 'HEAD' and 'ref'. Defaults to running all uncommitted changes. Only supports Git.` }],\n ['--pass-with-no-tests', { description: `Makes test run succeed even if no tests were found` }],\n ['--project <project-name...>', { description: `Only run tests from the specified list of projects, supports '*' wildcard (default: run all projects)` }],\n ['--quiet', { description: `Suppress stdio` }],\n ['--repeat-each <N>', { description: `Run each test N times (default: 1)` }],\n ['--reporter <reporter>', { description: `Reporter to use, comma-separated, can be ${builtInReporters.map(name => `\"${name}\"`).join(', ')} (default: \"${defaultReporter}\")` }],\n ['--retries <retries>', { description: `Maximum retry count for flaky tests, zero for no retries (default: no retries)` }],\n ['--shard <shard>', { description: `Shard tests and execute only the selected shard, specify in the form \"current/all\", 1-based, for example \"3/5\"` }],\n ['--timeout <timeout>', { description: `Specify test timeout threshold in milliseconds, zero for unlimited (default: ${defaultTimeout})` }],\n ['--trace <mode>', { description: `Force tracing mode`, choices: kTraceModes as string[] }],\n ['--tsconfig <path>', { description: `Path to a single tsconfig applicable to all imported files (default: look up tsconfig for each imported file separately)` }],\n ['--ui', { description: `Run tests in interactive UI mode` }],\n ['--ui-host <host>', { description: `Host to serve UI on; specifying this option opens UI in a browser tab` }],\n ['--ui-port <port>', { description: `Port to serve UI on, 0 for any free port; specifying this option opens UI in a browser tab` }],\n ['-u, --update-snapshots [mode]', { description: `Update snapshots with actual results. Running tests without the flag defaults to \"missing\"`, choices: ['all', 'changed', 'missing', 'none'], preset: 'changed' }],\n ['--update-source-method <method>', { description: `Chooses the way source is updated (default: \"patch\")`, choices: ['overwrite', '3way', 'patch'] }],\n ['-j, --workers <workers>', { description: `Number of concurrent workers or percentage of logical CPU cores, use 1 to run in a single worker (default: 50%)` }],\n ['-x', { description: `Stop after the first failure` }],\n];\n\naddTestCommand(program);\naddShowReportCommand(program);\naddMergeReportsCommand(program);\naddClearCacheCommand(program);\naddMCPServerCommand(program);\naddDevServerCommand(program);\naddTestServerCommand(program);\n"],
|
5
|
+
"mappings": "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",
|
6
|
+
"names": ["import_program", "program", "path", "status", "exitCode", "fs"]
|
7
|
+
}
|