@smoothdeploy/playwright 1.58.4 → 1.60.1

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.
Files changed (182) hide show
  1. package/ThirdPartyNotices.txt +8 -5036
  2. package/lib/agents/agentParser.js +2 -2
  3. package/lib/agents/generateAgents.js +21 -22
  4. package/lib/agents/playwright-test-healer.agent.md +1 -0
  5. package/lib/agents/playwright-test-planner.agent.md +2 -1
  6. package/lib/cli/reportActions.js +78 -0
  7. package/lib/cli/testActions.js +211 -0
  8. package/lib/common/index.js +2898 -0
  9. package/lib/common/index.js.txt +35 -0
  10. package/lib/errorContext.js +130 -0
  11. package/lib/index.js +258 -206
  12. package/lib/{isomorphic/testServerConnection.js → isomorphic.js} +70 -35
  13. package/lib/isomorphic.js.txt +9 -0
  14. package/lib/loader/loaderProcessEntry.js +34 -0
  15. package/lib/loader/loaderProcessEntry.js.txt +9 -0
  16. package/lib/matchers/expect.js +12988 -249
  17. package/lib/matchers/expect.js.LICENSE +693 -0
  18. package/lib/matchers/expect.js.txt +72 -0
  19. package/lib/mcp/test/browserBackend.js +49 -22
  20. package/lib/mcp/test/generatorTools.js +16 -16
  21. package/lib/mcp/test/plannerTools.js +25 -20
  22. package/lib/mcp/test/seed.js +7 -7
  23. package/lib/mcp/test/testBackend.js +30 -30
  24. package/lib/mcp/test/testContext.js +50 -33
  25. package/lib/mcp/test/testTools.js +15 -25
  26. package/lib/{internalsForTest.js → package.js} +13 -8
  27. package/lib/program.js +63 -263
  28. package/lib/runner/index.js +8339 -0
  29. package/lib/runner/index.js.txt +60 -0
  30. package/lib/transform/babelBundle.js +71002 -18
  31. package/lib/transform/babelBundle.js.LICENSE +2359 -0
  32. package/lib/transform/babelBundle.js.txt +325 -0
  33. package/lib/transform/esmLoader.js +5884 -30
  34. package/lib/transform/esmLoader.js.LICENSE +335 -0
  35. package/lib/transform/esmLoader.js.txt +55 -0
  36. package/lib/util.js +37 -34
  37. package/lib/worker/workerProcessEntry.js +3251 -0
  38. package/lib/worker/workerProcessEntry.js.txt +24 -0
  39. package/package.json +5 -16
  40. package/test.mjs +1 -0
  41. package/types/test.d.ts +172 -12
  42. package/types/testReporter.d.ts +7 -5
  43. package/lib/common/config.js +0 -282
  44. package/lib/common/configLoader.js +0 -344
  45. package/lib/common/esmLoaderHost.js +0 -104
  46. package/lib/common/expectBundle.js +0 -28
  47. package/lib/common/expectBundleImpl.js +0 -407
  48. package/lib/common/fixtures.js +0 -302
  49. package/lib/common/ipc.js +0 -60
  50. package/lib/common/poolBuilder.js +0 -85
  51. package/lib/common/process.js +0 -132
  52. package/lib/common/suiteUtils.js +0 -140
  53. package/lib/common/test.js +0 -321
  54. package/lib/common/testLoader.js +0 -101
  55. package/lib/common/testType.js +0 -298
  56. package/lib/common/validators.js +0 -68
  57. package/lib/fsWatcher.js +0 -67
  58. package/lib/isomorphic/events.js +0 -77
  59. package/lib/isomorphic/folders.js +0 -30
  60. package/lib/isomorphic/stringInternPool.js +0 -69
  61. package/lib/isomorphic/teleReceiver.js +0 -521
  62. package/lib/isomorphic/teleSuiteUpdater.js +0 -157
  63. package/lib/isomorphic/testServerInterface.js +0 -16
  64. package/lib/isomorphic/testTree.js +0 -329
  65. package/lib/isomorphic/types.d.js +0 -16
  66. package/lib/loader/loaderMain.js +0 -59
  67. package/lib/matchers/matcherHint.js +0 -44
  68. package/lib/matchers/matchers.js +0 -383
  69. package/lib/matchers/toBeTruthy.js +0 -75
  70. package/lib/matchers/toEqual.js +0 -100
  71. package/lib/matchers/toHaveURL.js +0 -101
  72. package/lib/matchers/toMatchAriaSnapshot.js +0 -159
  73. package/lib/matchers/toMatchSnapshot.js +0 -342
  74. package/lib/matchers/toMatchText.js +0 -99
  75. package/lib/mcp/browser/browserContextFactory.js +0 -329
  76. package/lib/mcp/browser/browserServerBackend.js +0 -84
  77. package/lib/mcp/browser/config.js +0 -421
  78. package/lib/mcp/browser/context.js +0 -244
  79. package/lib/mcp/browser/response.js +0 -278
  80. package/lib/mcp/browser/sessionLog.js +0 -75
  81. package/lib/mcp/browser/tab.js +0 -343
  82. package/lib/mcp/browser/tools/common.js +0 -65
  83. package/lib/mcp/browser/tools/console.js +0 -46
  84. package/lib/mcp/browser/tools/dialogs.js +0 -60
  85. package/lib/mcp/browser/tools/evaluate.js +0 -61
  86. package/lib/mcp/browser/tools/files.js +0 -58
  87. package/lib/mcp/browser/tools/form.js +0 -63
  88. package/lib/mcp/browser/tools/install.js +0 -72
  89. package/lib/mcp/browser/tools/keyboard.js +0 -107
  90. package/lib/mcp/browser/tools/mouse.js +0 -107
  91. package/lib/mcp/browser/tools/navigate.js +0 -71
  92. package/lib/mcp/browser/tools/network.js +0 -63
  93. package/lib/mcp/browser/tools/open.js +0 -57
  94. package/lib/mcp/browser/tools/pdf.js +0 -49
  95. package/lib/mcp/browser/tools/runCode.js +0 -78
  96. package/lib/mcp/browser/tools/screenshot.js +0 -93
  97. package/lib/mcp/browser/tools/snapshot.js +0 -173
  98. package/lib/mcp/browser/tools/tabs.js +0 -67
  99. package/lib/mcp/browser/tools/tool.js +0 -47
  100. package/lib/mcp/browser/tools/tracing.js +0 -74
  101. package/lib/mcp/browser/tools/utils.js +0 -94
  102. package/lib/mcp/browser/tools/verify.js +0 -143
  103. package/lib/mcp/browser/tools/wait.js +0 -63
  104. package/lib/mcp/browser/tools.js +0 -84
  105. package/lib/mcp/browser/watchdog.js +0 -44
  106. package/lib/mcp/config.d.js +0 -16
  107. package/lib/mcp/extension/cdpRelay.js +0 -351
  108. package/lib/mcp/extension/extensionContextFactory.js +0 -76
  109. package/lib/mcp/extension/protocol.js +0 -28
  110. package/lib/mcp/index.js +0 -61
  111. package/lib/mcp/log.js +0 -35
  112. package/lib/mcp/program.js +0 -111
  113. package/lib/mcp/sdk/exports.js +0 -28
  114. package/lib/mcp/sdk/http.js +0 -152
  115. package/lib/mcp/sdk/inProcessTransport.js +0 -71
  116. package/lib/mcp/sdk/server.js +0 -223
  117. package/lib/mcp/sdk/tool.js +0 -47
  118. package/lib/mcp/terminal/cli.js +0 -296
  119. package/lib/mcp/terminal/command.js +0 -56
  120. package/lib/mcp/terminal/commands.js +0 -333
  121. package/lib/mcp/terminal/daemon.js +0 -129
  122. package/lib/mcp/terminal/help.json +0 -32
  123. package/lib/mcp/terminal/helpGenerator.js +0 -88
  124. package/lib/mcp/terminal/socketConnection.js +0 -80
  125. package/lib/plugins/gitCommitInfoPlugin.js +0 -198
  126. package/lib/plugins/index.js +0 -28
  127. package/lib/plugins/webServerPlugin.js +0 -237
  128. package/lib/reporters/base.js +0 -634
  129. package/lib/reporters/blob.js +0 -138
  130. package/lib/reporters/dot.js +0 -99
  131. package/lib/reporters/empty.js +0 -32
  132. package/lib/reporters/github.js +0 -128
  133. package/lib/reporters/html.js +0 -633
  134. package/lib/reporters/internalReporter.js +0 -138
  135. package/lib/reporters/json.js +0 -254
  136. package/lib/reporters/junit.js +0 -232
  137. package/lib/reporters/line.js +0 -131
  138. package/lib/reporters/list.js +0 -253
  139. package/lib/reporters/listModeReporter.js +0 -69
  140. package/lib/reporters/markdown.js +0 -144
  141. package/lib/reporters/merge.js +0 -558
  142. package/lib/reporters/multiplexer.js +0 -112
  143. package/lib/reporters/reporterV2.js +0 -102
  144. package/lib/reporters/smoothdeploy.js +0 -333
  145. package/lib/reporters/teleEmitter.js +0 -317
  146. package/lib/reporters/versions/blobV1.js +0 -16
  147. package/lib/runner/dispatcher.js +0 -531
  148. package/lib/runner/failureTracker.js +0 -72
  149. package/lib/runner/lastRun.js +0 -77
  150. package/lib/runner/loadUtils.js +0 -334
  151. package/lib/runner/loaderHost.js +0 -89
  152. package/lib/runner/processHost.js +0 -180
  153. package/lib/runner/projectUtils.js +0 -241
  154. package/lib/runner/rebase.js +0 -189
  155. package/lib/runner/reporters.js +0 -140
  156. package/lib/runner/sigIntWatcher.js +0 -96
  157. package/lib/runner/storage.js +0 -91
  158. package/lib/runner/taskRunner.js +0 -127
  159. package/lib/runner/tasks.js +0 -410
  160. package/lib/runner/testGroups.js +0 -125
  161. package/lib/runner/testRunner.js +0 -398
  162. package/lib/runner/testServer.js +0 -269
  163. package/lib/runner/uiModeReporter.js +0 -30
  164. package/lib/runner/vcs.js +0 -72
  165. package/lib/runner/watchMode.js +0 -396
  166. package/lib/runner/workerHost.js +0 -104
  167. package/lib/third_party/pirates.js +0 -62
  168. package/lib/third_party/tsconfig-loader.js +0 -103
  169. package/lib/transform/babelBundleImpl.js +0 -461
  170. package/lib/transform/compilationCache.js +0 -274
  171. package/lib/transform/md.js +0 -221
  172. package/lib/transform/portTransport.js +0 -67
  173. package/lib/transform/transform.js +0 -303
  174. package/lib/utilsBundle.js +0 -50
  175. package/lib/utilsBundleImpl.js +0 -103
  176. package/lib/worker/fixtureRunner.js +0 -262
  177. package/lib/worker/testInfo.js +0 -536
  178. package/lib/worker/testTracing.js +0 -345
  179. package/lib/worker/timeoutManager.js +0 -174
  180. package/lib/worker/util.js +0 -31
  181. package/lib/worker/workerMain.js +0 -530
  182. /package/lib/{common/globals.js → globals.js} +0 -0
package/lib/program.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,43 +15,25 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
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
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
  var program_exports = {};
30
20
  __export(program_exports, {
31
- program: () => import_program2.program
21
+ program: () => program
32
22
  });
33
23
  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 mcp = __toESM(require("./mcp/sdk/exports"));
24
+ var import_bootstrap = require("playwright-core/lib/bootstrap");
25
+ var import_coreBundle = require("playwright-core/lib/coreBundle");
26
+ var import_common = require("./common");
27
+ var import_testActions = require("./cli/testActions");
28
+ var import_reportActions = require("./cli/reportActions");
50
29
  var import_testBackend = require("./mcp/test/testBackend");
51
- var import_program3 = require("./mcp/program");
52
- var import_watchdog = require("./mcp/browser/watchdog");
53
30
  var import_generateAgents = require("./agents/generateAgents");
54
- const packageJSON = require("../package.json");
55
- function addTestCommand(program3) {
56
- const command = program3.command("test [test-filter...]");
31
+ var import_package = require("./package");
32
+ const { program } = require("playwright-core/lib/utilsBundle");
33
+ const { gracefullyProcessExitDoNotHang } = require("playwright-core/lib/coreBundle").utils;
34
+ import_coreBundle.libCli.decorateProgram(program);
35
+ function addTestCommand(program2) {
36
+ const command = program2.command("test [test-filter...]");
57
37
  command.description("run tests with Playwright Test");
58
38
  const options = testOptions.sort((a, b) => a[0].replace(/-/g, "").localeCompare(b[0].replace(/-/g, "")));
59
39
  options.forEach(([name, { description, choices, preset }]) => {
@@ -67,10 +47,10 @@ function addTestCommand(program3) {
67
47
  });
68
48
  command.action(async (args, opts) => {
69
49
  try {
70
- await runTests(args, opts);
50
+ await (0, import_testActions.runTests)(args, opts);
71
51
  } catch (e) {
72
52
  console.error(e);
73
- (0, import_utils.gracefullyProcessExitDoNotHang)(1);
53
+ gracefullyProcessExitDoNotHang(1);
74
54
  }
75
55
  });
76
56
  command.addHelpText("afterAll", `
@@ -83,61 +63,55 @@ Examples:
83
63
  $ npx playwright test --headed
84
64
  $ npx playwright test --project=webkit`);
85
65
  }
86
- function addClearCacheCommand(program3) {
87
- const command = program3.command("clear-cache");
66
+ function addClearCacheCommand(program2) {
67
+ const command = program2.command("clear-cache");
88
68
  command.description("clears build and test caches");
89
69
  command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
90
70
  command.action(async (opts) => {
91
- const runner = new import_testRunner.TestRunner((0, import_configLoader.resolveConfigLocation)(opts.config), {});
92
- const { status } = await runner.clearCache((0, import_reporters.createErrorCollectingReporter)(import_base.terminalScreen));
93
- const exitCode = status === "interrupted" ? 130 : status === "passed" ? 0 : 1;
94
- (0, import_utils.gracefullyProcessExitDoNotHang)(exitCode);
71
+ await (0, import_testActions.clearCache)(opts);
95
72
  });
96
73
  }
97
- function addDevServerCommand(program3) {
98
- const command = program3.command("dev-server", { hidden: true });
99
- command.description("start dev server");
100
- command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
101
- command.action(async (options) => {
102
- const runner = new import_testRunner.TestRunner((0, import_configLoader.resolveConfigLocation)(options.config), {});
103
- await runner.startDevServer((0, import_reporters.createErrorCollectingReporter)(import_base.terminalScreen), "in-process");
104
- });
105
- }
106
- function addTestServerCommand(program3) {
107
- const command = program3.command("test-server", { hidden: true });
74
+ function addTestServerCommand(program2) {
75
+ const command = program2.command("test-server", { hidden: true });
108
76
  command.description("start test server");
109
77
  command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
110
78
  command.option("--host <host>", "Host to start the server on", "localhost");
111
79
  command.option("--port <port>", "Port to start the server on", "0");
112
- command.action((opts) => runTestServer(opts));
80
+ command.action(async (opts) => {
81
+ await (0, import_testActions.runTestServerAction)(opts);
82
+ });
113
83
  }
114
- function addShowReportCommand(program3) {
115
- const command = program3.command("show-report [report]");
84
+ function addShowReportCommand(program2) {
85
+ const command = program2.command("show-report [report]");
116
86
  command.description("show HTML report");
117
- command.action((report, options) => (0, import_html.showHTMLReport)(report, options.host, +options.port));
87
+ command.action(async (report, options) => {
88
+ await (0, import_reportActions.showReport)(report, options.host, +options.port);
89
+ });
118
90
  command.option("--host <host>", "Host to serve report on", "localhost");
119
91
  command.option("--port <port>", "Port to serve report on", "9323");
120
92
  command.addHelpText("afterAll", `
121
93
  Arguments [report]:
122
94
  When specified, opens given report, otherwise opens last generated report.
95
+ Accepts a directory or a .zip archive whose top-level entry is "index.html" (e.g. one downloaded from a CI artifact).
123
96
 
124
97
  Examples:
125
98
  $ npx playwright show-report
126
- $ npx playwright show-report playwright-report`);
99
+ $ npx playwright show-report playwright-report
100
+ $ npx playwright show-report playwright-report.zip`);
127
101
  }
128
- function addMergeReportsCommand(program3) {
129
- const command = program3.command("merge-reports [dir]");
102
+ function addMergeReportsCommand(program2) {
103
+ const command = program2.command("merge-reports [dir]");
130
104
  command.description("merge multiple blob reports (for sharded tests) into a single report");
131
105
  command.action(async (dir, options) => {
132
106
  try {
133
- await mergeReports(dir, options);
107
+ await (0, import_reportActions.mergeReports)(dir, options);
134
108
  } catch (e) {
135
109
  console.error(e);
136
- (0, import_utils.gracefullyProcessExitDoNotHang)(1);
110
+ gracefullyProcessExitDoNotHang(1);
137
111
  }
138
112
  });
139
113
  command.option("-c, --config <file>", `Configuration file. Can be used to specify additional configuration for the output report.`);
140
- command.option("--reporter <reporter>", `Reporter to use, comma-separated, can be ${import_config.builtInReporters.map((name) => `"${name}"`).join(", ")} (default: "${import_config.defaultReporter}")`);
114
+ command.option("--reporter <reporter>", `Reporter to use, comma-separated, can be ${import_common.builtInReporters.map((name) => `"${name}"`).join(", ")} (default: "${import_common.config.defaultReporter}")`);
141
115
  command.addHelpText("afterAll", `
142
116
  Arguments [dir]:
143
117
  Directory containing blob reports.
@@ -145,31 +119,29 @@ Arguments [dir]:
145
119
  Examples:
146
120
  $ npx playwright merge-reports playwright-report`);
147
121
  }
148
- function addBrowserMCPServerCommand(program3) {
149
- const command = program3.command("run-mcp-server", { hidden: true });
150
- command.description("Interact with the browser over MCP");
151
- (0, import_program3.decorateCommand)(command, packageJSON.version);
152
- }
153
- function addTestMCPServerCommand(program3) {
154
- const command = program3.command("run-test-mcp-server", { hidden: true });
122
+ function addTestMCPServerCommand(program2) {
123
+ const command = program2.command("run-test-mcp-server", { hidden: true });
155
124
  command.description("Interact with the test runner over MCP");
156
125
  command.option("--headless", "run browser in headless mode, headed by default");
157
126
  command.option("-c, --config <file>", `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"`);
158
127
  command.option("--host <host>", "host to bind server to. Default is localhost. Use 0.0.0.0 to bind to all interfaces.");
159
128
  command.option("--port <port>", "port to listen on for SSE transport.");
160
129
  command.action(async (options) => {
161
- (0, import_watchdog.setupExitWatchdog)();
130
+ import_coreBundle.tools.setupExitWatchdog();
162
131
  const factory = {
163
132
  name: "Playwright Test Runner",
164
133
  nameInConfig: "playwright-test-runner",
165
- version: packageJSON.version,
166
- create: () => new import_testBackend.TestServerBackend(options.config, { muteConsole: options.port === void 0, headless: options.headless })
134
+ version: import_package.packageJSON.version,
135
+ toolSchemas: import_testBackend.testServerBackendTools.map((tool) => tool.schema),
136
+ create: async () => new import_testBackend.TestServerBackend(options.config, { muteConsole: options.port === void 0, headless: options.headless }),
137
+ disposed: async () => {
138
+ }
167
139
  };
168
- await mcp.start(factory, { port: options.port === void 0 ? void 0 : +options.port, host: options.host });
140
+ await import_coreBundle.tools.start(factory, { port: options.port === void 0 ? void 0 : +options.port, host: options.host });
169
141
  });
170
142
  }
171
- function addInitAgentsCommand(program3) {
172
- const command = program3.command("init-agents");
143
+ function addInitAgentsCommand(program2) {
144
+ const command = program2.command("init-agents");
173
145
  command.description("Initialize repository agents");
174
146
  const option = command.createOption("--loop <loop>", "Agentic loop provider");
175
147
  option.choices(["claude", "copilot", "opencode", "vscode", "vscode-legacy"]);
@@ -178,196 +150,25 @@ function addInitAgentsCommand(program3) {
178
150
  command.option("--project <project>", "Project to use for seed test");
179
151
  command.option("--prompts", "Whether to include prompts in the agent initialization");
180
152
  command.action(async (opts) => {
181
- const config = await (0, import_configLoader.loadConfigFromFile)(opts.config);
153
+ const loadedConfig = await import_common.configLoader.loadConfigFromFile(opts.config);
182
154
  if (opts.loop === "opencode") {
183
- await import_generateAgents.OpencodeGenerator.init(config, opts.project, opts.prompts);
155
+ await import_generateAgents.OpencodeGenerator.init(loadedConfig, opts.project, opts.prompts);
184
156
  } else if (opts.loop === "vscode-legacy") {
185
- await import_generateAgents.VSCodeGenerator.init(config, opts.project);
157
+ await import_generateAgents.VSCodeGenerator.init(loadedConfig, opts.project);
186
158
  } else if (opts.loop === "claude") {
187
- await import_generateAgents.ClaudeGenerator.init(config, opts.project, opts.prompts);
159
+ await import_generateAgents.ClaudeGenerator.init(loadedConfig, opts.project, opts.prompts);
188
160
  } else {
189
- await import_generateAgents.CopilotGenerator.init(config, opts.project, opts.prompts);
161
+ await import_generateAgents.CopilotGenerator.init(loadedConfig, opts.project, opts.prompts);
190
162
  return;
191
163
  }
192
164
  });
193
165
  }
194
- async function runTests(args, opts) {
195
- await (0, import_utils.startProfiling)();
196
- const cliOverrides = overridesFromOptions(opts);
197
- const config = await (0, import_configLoader.loadConfigFromFile)(opts.config, cliOverrides, opts.deps === false);
198
- config.cliArgs = args;
199
- config.cliGrep = opts.grep;
200
- config.cliOnlyChanged = opts.onlyChanged === true ? "HEAD" : opts.onlyChanged;
201
- config.cliGrepInvert = opts.grepInvert;
202
- config.cliListOnly = !!opts.list;
203
- config.cliProjectFilter = opts.project || void 0;
204
- config.cliPassWithNoTests = !!opts.passWithNoTests;
205
- config.cliLastFailed = !!opts.lastFailed;
206
- config.cliTestList = opts.testList ? import_path.default.resolve(process.cwd(), opts.testList) : void 0;
207
- config.cliTestListInvert = opts.testListInvert ? import_path.default.resolve(process.cwd(), opts.testListInvert) : void 0;
208
- (0, import_projectUtils.filterProjects)(config.projects, config.cliProjectFilter);
209
- if (opts.ui || opts.uiHost || opts.uiPort) {
210
- if (opts.onlyChanged)
211
- 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.`);
212
- const status2 = await testServer.runUIMode(opts.config, cliOverrides, {
213
- host: opts.uiHost,
214
- port: opts.uiPort ? +opts.uiPort : void 0,
215
- args,
216
- grep: opts.grep,
217
- grepInvert: opts.grepInvert,
218
- project: opts.project || void 0,
219
- reporter: Array.isArray(opts.reporter) ? opts.reporter : opts.reporter ? [opts.reporter] : void 0
220
- });
221
- await (0, import_utils.stopProfiling)("runner");
222
- const exitCode2 = status2 === "interrupted" ? 130 : status2 === "passed" ? 0 : 1;
223
- (0, import_utils.gracefullyProcessExitDoNotHang)(exitCode2);
224
- return;
225
- }
226
- if (process.env.PWTEST_WATCH) {
227
- if (opts.onlyChanged)
228
- 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.`);
229
- const status2 = await (0, import_watchMode.runWatchModeLoop)(
230
- (0, import_configLoader.resolveConfigLocation)(opts.config),
231
- {
232
- projects: opts.project,
233
- files: args,
234
- grep: opts.grep
235
- }
236
- );
237
- await (0, import_utils.stopProfiling)("runner");
238
- const exitCode2 = status2 === "interrupted" ? 130 : status2 === "passed" ? 0 : 1;
239
- (0, import_utils.gracefullyProcessExitDoNotHang)(exitCode2);
240
- return;
241
- }
242
- const status = await (0, import_testRunner.runAllTestsWithConfig)(config);
243
- await (0, import_utils.stopProfiling)("runner");
244
- const exitCode = status === "interrupted" ? 130 : status === "passed" ? 0 : 1;
245
- (0, import_utils.gracefullyProcessExitDoNotHang)(exitCode);
246
- }
247
- async function runTestServer(opts) {
248
- const host = opts.host;
249
- const port = opts.port ? +opts.port : void 0;
250
- const status = await testServer.runTestServer(opts.config, {}, { host, port });
251
- const exitCode = status === "interrupted" ? 130 : status === "passed" ? 0 : 1;
252
- (0, import_utils.gracefullyProcessExitDoNotHang)(exitCode);
253
- }
254
- async function mergeReports(reportDir, opts) {
255
- const configFile = opts.config;
256
- const config = configFile ? await (0, import_configLoader.loadConfigFromFile)(configFile) : await (0, import_configLoader.loadEmptyConfigForMergeReports)();
257
- const dir = import_path.default.resolve(process.cwd(), reportDir || "");
258
- const dirStat = await import_fs.default.promises.stat(dir).catch((e) => null);
259
- if (!dirStat)
260
- throw new Error("Directory does not exist: " + dir);
261
- if (!dirStat.isDirectory())
262
- throw new Error(`"${dir}" is not a directory`);
263
- let reporterDescriptions = resolveReporterOption(opts.reporter);
264
- if (!reporterDescriptions && configFile)
265
- reporterDescriptions = config.config.reporter;
266
- if (!reporterDescriptions)
267
- reporterDescriptions = [[import_config.defaultReporter]];
268
- const rootDirOverride = configFile ? config.config.rootDir : void 0;
269
- await (0, import_merge.createMergedReport)(config, dir, reporterDescriptions, rootDirOverride);
270
- (0, import_utils.gracefullyProcessExitDoNotHang)(0);
271
- }
272
- function overridesFromOptions(options) {
273
- const overrides = {
274
- failOnFlakyTests: options.failOnFlakyTests ? true : void 0,
275
- forbidOnly: options.forbidOnly ? true : void 0,
276
- fullyParallel: options.fullyParallel ? true : void 0,
277
- globalTimeout: options.globalTimeout ? parseInt(options.globalTimeout, 10) : void 0,
278
- maxFailures: options.x ? 1 : options.maxFailures ? parseInt(options.maxFailures, 10) : void 0,
279
- outputDir: options.output ? import_path.default.resolve(process.cwd(), options.output) : void 0,
280
- quiet: options.quiet ? options.quiet : void 0,
281
- repeatEach: options.repeatEach ? parseInt(options.repeatEach, 10) : void 0,
282
- retries: options.retries ? parseInt(options.retries, 10) : void 0,
283
- reporter: resolveReporterOption(options.reporter),
284
- shard: resolveShardOption(options.shard),
285
- shardWeights: resolveShardWeightsOption(),
286
- timeout: options.timeout ? parseInt(options.timeout, 10) : void 0,
287
- tsconfig: options.tsconfig ? import_path.default.resolve(process.cwd(), options.tsconfig) : void 0,
288
- ignoreSnapshots: options.ignoreSnapshots ? !!options.ignoreSnapshots : void 0,
289
- updateSnapshots: options.updateSnapshots,
290
- updateSourceMethod: options.updateSourceMethod,
291
- runAgents: options.runAgents,
292
- workers: options.workers,
293
- pause: process.env.PWPAUSE ? true : void 0
294
- };
295
- if (options.browser) {
296
- const browserOpt = options.browser.toLowerCase();
297
- if (!["all", "chromium", "firefox", "webkit"].includes(browserOpt))
298
- throw new Error(`Unsupported browser "${options.browser}", must be one of "all", "chromium", "firefox" or "webkit"`);
299
- const browserNames = browserOpt === "all" ? ["chromium", "firefox", "webkit"] : [browserOpt];
300
- overrides.projects = browserNames.map((browserName) => {
301
- return {
302
- name: browserName,
303
- use: { browserName }
304
- };
305
- });
306
- }
307
- if (options.headed || options.debug || overrides.pause)
308
- overrides.use = { headless: false };
309
- if (!options.ui && options.debug) {
310
- overrides.debug = true;
311
- process.env.PWDEBUG = "1";
312
- }
313
- if (!options.ui && options.trace) {
314
- overrides.use = overrides.use || {};
315
- overrides.use.trace = options.trace;
316
- }
317
- if (overrides.tsconfig && !import_fs.default.existsSync(overrides.tsconfig))
318
- throw new Error(`--tsconfig "${options.tsconfig}" does not exist`);
319
- return overrides;
320
- }
321
- function resolveReporterOption(reporter) {
322
- if (!reporter || !reporter.length)
323
- return void 0;
324
- return reporter.split(",").map((r) => [resolveReporter(r)]);
325
- }
326
- function resolveShardOption(shard) {
327
- if (!shard)
328
- return void 0;
329
- const shardPair = shard.split("/");
330
- if (shardPair.length !== 2) {
331
- throw new Error(
332
- `--shard "${shard}", expected format is "current/all", 1-based, for example "3/5".`
333
- );
334
- }
335
- const current = parseInt(shardPair[0], 10);
336
- const total = parseInt(shardPair[1], 10);
337
- if (isNaN(total) || total < 1)
338
- throw new Error(`--shard "${shard}" total must be a positive number`);
339
- if (isNaN(current) || current < 1 || current > total) {
340
- throw new Error(
341
- `--shard "${shard}" current must be a positive number, not greater than shard total`
342
- );
343
- }
344
- return { current, total };
345
- }
346
- function resolveShardWeightsOption() {
347
- const shardWeights = process.env.PWTEST_SHARD_WEIGHTS;
348
- if (!shardWeights)
349
- return void 0;
350
- return shardWeights.split(":").map((w) => {
351
- const weight = parseInt(w, 10);
352
- if (isNaN(weight) || weight < 0)
353
- throw new Error(`PWTEST_SHARD_WEIGHTS="${shardWeights}" weights must be non-negative numbers`);
354
- return weight;
355
- });
356
- }
357
- function resolveReporter(id) {
358
- if (import_config.builtInReporters.includes(id))
359
- return id;
360
- const localPath = import_path.default.resolve(process.cwd(), id);
361
- if (import_fs.default.existsSync(localPath))
362
- return localPath;
363
- return require.resolve(id, { paths: [process.cwd()] });
364
- }
365
- const kTraceModes = ["on", "off", "on-first-retry", "on-all-retries", "retain-on-failure", "retain-on-first-failure"];
166
+ const kTraceModes = ["on", "off", "on-first-retry", "on-all-retries", "retain-on-failure", "retain-on-first-failure", "retain-on-failure-and-retries"];
366
167
  const testOptions = [
367
168
  /* deprecated */
368
169
  ["--browser <browser>", { description: `Browser to use for tests, one of "all", "chromium", "firefox" or "webkit" (default: "chromium")` }],
369
170
  ["-c, --config <file>", { description: `Configuration file, or a test directory with optional "playwright.config.{m,c}?{js,ts}"` }],
370
- ["--debug", { description: `Run tests with Playwright Inspector. Shortcut for "PWDEBUG=1" environment variable and "--timeout=0 --max-failures=1 --headed --workers=1" options` }],
171
+ ["--debug [mode]", { description: `Run tests with Playwright Inspector. Shortcut for "PWDEBUG=1" environment variable and "--timeout=0 --max-failures=1 --headed --workers=1" options`, choices: ["inspector", "cli"], preset: "inspector" }],
371
172
  ["--fail-on-flaky-tests", { description: `Fail if any test is flagged as flaky (default: false)` }],
372
173
  ["--forbid-only", { description: `Fail if test.only is called (default: false)` }],
373
174
  ["--fully-parallel", { description: `Run all tests in parallel (default: false)` }],
@@ -386,12 +187,13 @@ const testOptions = [
386
187
  ["--project <project-name...>", { description: `Only run tests from the specified list of projects, supports '*' wildcard (default: run all projects)` }],
387
188
  ["--quiet", { description: `Suppress stdio` }],
388
189
  ["--repeat-each <N>", { description: `Run each test N times (default: 1)` }],
389
- ["--reporter <reporter>", { description: `Reporter to use, comma-separated, can be ${import_config.builtInReporters.map((name) => `"${name}"`).join(", ")} (default: "${import_config.defaultReporter}")` }],
190
+ ["--reporter <reporter>", { description: `Reporter to use, comma-separated, can be ${import_common.builtInReporters.map((name) => `"${name}"`).join(", ")} (default: "${import_common.config.defaultReporter}")` }],
390
191
  ["--retries <retries>", { description: `Maximum retry count for flaky tests, zero for no retries (default: no retries)` }],
192
+ ["--run-agents <mode>", { description: `Run agents to generate the code for page.perform`, choices: ["missing", "all", "none"], preset: "none" }],
391
193
  ["--shard <shard>", { description: `Shard tests and execute only the selected shard, specify in the form "current/all", 1-based, for example "3/5"` }],
392
194
  ["--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.` }],
393
195
  ["--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.` }],
394
- ["--timeout <timeout>", { description: `Specify test timeout threshold in milliseconds, zero for unlimited (default: ${import_config.defaultTimeout})` }],
196
+ ["--timeout <timeout>", { description: `Specify test timeout threshold in milliseconds, zero for unlimited (default: ${import_common.config.defaultTimeout})` }],
395
197
  ["--trace <mode>", { description: `Force tracing mode`, choices: kTraceModes }],
396
198
  ["--tsconfig <path>", { description: `Path to a single tsconfig applicable to all imported files (default: look up tsconfig for each imported file separately)` }],
397
199
  ["--ui", { description: `Run tests in interactive UI mode` }],
@@ -402,15 +204,13 @@ const testOptions = [
402
204
  ["-j, --workers <workers>", { description: `Number of concurrent workers or percentage of logical CPU cores, use 1 to run in a single worker (default: 50%)` }],
403
205
  ["-x", { description: `Stop after the first failure` }]
404
206
  ];
405
- addTestCommand(import_program.program);
406
- addShowReportCommand(import_program.program);
407
- addMergeReportsCommand(import_program.program);
408
- addClearCacheCommand(import_program.program);
409
- addBrowserMCPServerCommand(import_program.program);
410
- addTestMCPServerCommand(import_program.program);
411
- addDevServerCommand(import_program.program);
412
- addTestServerCommand(import_program.program);
413
- addInitAgentsCommand(import_program.program);
207
+ addTestCommand(program);
208
+ addShowReportCommand(program);
209
+ addMergeReportsCommand(program);
210
+ addClearCacheCommand(program);
211
+ addTestMCPServerCommand(program);
212
+ addTestServerCommand(program);
213
+ addInitAgentsCommand(program);
414
214
  // Annotate the CommonJS export names for ESM import in node:
415
215
  0 && (module.exports = {
416
216
  program