@one2x/playwright 1.57.0-alpha.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 (331) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +168 -0
  4. package/ThirdPartyNotices.txt +6277 -0
  5. package/cli.js +19 -0
  6. package/index.d.ts +17 -0
  7. package/index.js +17 -0
  8. package/index.mjs +18 -0
  9. package/jsx-runtime.js +42 -0
  10. package/jsx-runtime.mjs +21 -0
  11. package/lib/agents/copilot-setup-steps.yml +34 -0
  12. package/lib/agents/generateAgents.js +394 -0
  13. package/lib/agents/generateAgents.js.map +7 -0
  14. package/lib/agents/playwright-test-coverage.prompt.md +31 -0
  15. package/lib/agents/playwright-test-generate.prompt.md +8 -0
  16. package/lib/agents/playwright-test-generator.agent.md +88 -0
  17. package/lib/agents/playwright-test-heal.prompt.md +6 -0
  18. package/lib/agents/playwright-test-healer.agent.md +55 -0
  19. package/lib/agents/playwright-test-plan.prompt.md +9 -0
  20. package/lib/agents/playwright-test-planner.agent.md +117 -0
  21. package/lib/common/config.js +280 -0
  22. package/lib/common/config.js.map +7 -0
  23. package/lib/common/configLoader.js +344 -0
  24. package/lib/common/configLoader.js.map +7 -0
  25. package/lib/common/esmLoaderHost.js +102 -0
  26. package/lib/common/esmLoaderHost.js.map +7 -0
  27. package/lib/common/expectBundle.js +52 -0
  28. package/lib/common/expectBundle.js.map +7 -0
  29. package/lib/common/expectBundleImpl.js +389 -0
  30. package/lib/common/expectBundleImpl.js.map +7 -0
  31. package/lib/common/fixtures.js +302 -0
  32. package/lib/common/fixtures.js.map +7 -0
  33. package/lib/common/globals.js +58 -0
  34. package/lib/common/globals.js.map +7 -0
  35. package/lib/common/ipc.js +60 -0
  36. package/lib/common/ipc.js.map +7 -0
  37. package/lib/common/poolBuilder.js +85 -0
  38. package/lib/common/poolBuilder.js.map +7 -0
  39. package/lib/common/process.js +104 -0
  40. package/lib/common/process.js.map +7 -0
  41. package/lib/common/suiteUtils.js +140 -0
  42. package/lib/common/suiteUtils.js.map +7 -0
  43. package/lib/common/test.js +321 -0
  44. package/lib/common/test.js.map +7 -0
  45. package/lib/common/testLoader.js +101 -0
  46. package/lib/common/testLoader.js.map +7 -0
  47. package/lib/common/testType.js +298 -0
  48. package/lib/common/testType.js.map +7 -0
  49. package/lib/common/validators.js +68 -0
  50. package/lib/common/validators.js.map +7 -0
  51. package/lib/fsWatcher.js +67 -0
  52. package/lib/fsWatcher.js.map +7 -0
  53. package/lib/index.js +682 -0
  54. package/lib/index.js.map +7 -0
  55. package/lib/internalsForTest.js +42 -0
  56. package/lib/internalsForTest.js.map +7 -0
  57. package/lib/isomorphic/events.js +77 -0
  58. package/lib/isomorphic/events.js.map +7 -0
  59. package/lib/isomorphic/folders.js +30 -0
  60. package/lib/isomorphic/folders.js.map +7 -0
  61. package/lib/isomorphic/stringInternPool.js +69 -0
  62. package/lib/isomorphic/stringInternPool.js.map +7 -0
  63. package/lib/isomorphic/teleReceiver.js +508 -0
  64. package/lib/isomorphic/teleReceiver.js.map +7 -0
  65. package/lib/isomorphic/teleSuiteUpdater.js +137 -0
  66. package/lib/isomorphic/teleSuiteUpdater.js.map +7 -0
  67. package/lib/isomorphic/testServerConnection.js +211 -0
  68. package/lib/isomorphic/testServerConnection.js.map +7 -0
  69. package/lib/isomorphic/testServerInterface.js +16 -0
  70. package/lib/isomorphic/testServerInterface.js.map +7 -0
  71. package/lib/isomorphic/testTree.js +334 -0
  72. package/lib/isomorphic/testTree.js.map +7 -0
  73. package/lib/isomorphic/types.d.js +16 -0
  74. package/lib/isomorphic/types.d.js.map +7 -0
  75. package/lib/loader/loaderMain.js +59 -0
  76. package/lib/loader/loaderMain.js.map +7 -0
  77. package/lib/matchers/expect.js +325 -0
  78. package/lib/matchers/expect.js.map +7 -0
  79. package/lib/matchers/matcherHint.js +87 -0
  80. package/lib/matchers/matcherHint.js.map +7 -0
  81. package/lib/matchers/matchers.js +366 -0
  82. package/lib/matchers/matchers.js.map +7 -0
  83. package/lib/matchers/toBeTruthy.js +73 -0
  84. package/lib/matchers/toBeTruthy.js.map +7 -0
  85. package/lib/matchers/toEqual.js +99 -0
  86. package/lib/matchers/toEqual.js.map +7 -0
  87. package/lib/matchers/toHaveURL.js +102 -0
  88. package/lib/matchers/toHaveURL.js.map +7 -0
  89. package/lib/matchers/toMatchAriaSnapshot.js +159 -0
  90. package/lib/matchers/toMatchAriaSnapshot.js.map +7 -0
  91. package/lib/matchers/toMatchSnapshot.js +341 -0
  92. package/lib/matchers/toMatchSnapshot.js.map +7 -0
  93. package/lib/matchers/toMatchText.js +99 -0
  94. package/lib/matchers/toMatchText.js.map +7 -0
  95. package/lib/mcp/browser/actions.d.js +16 -0
  96. package/lib/mcp/browser/actions.d.js.map +7 -0
  97. package/lib/mcp/browser/browserContextFactory.js +357 -0
  98. package/lib/mcp/browser/browserContextFactory.js.map +7 -0
  99. package/lib/mcp/browser/browserServerBackend.js +76 -0
  100. package/lib/mcp/browser/browserServerBackend.js.map +7 -0
  101. package/lib/mcp/browser/codegen.js +66 -0
  102. package/lib/mcp/browser/codegen.js.map +7 -0
  103. package/lib/mcp/browser/config.js +425 -0
  104. package/lib/mcp/browser/config.js.map +7 -0
  105. package/lib/mcp/browser/context.js +287 -0
  106. package/lib/mcp/browser/context.js.map +7 -0
  107. package/lib/mcp/browser/response.js +228 -0
  108. package/lib/mcp/browser/response.js.map +7 -0
  109. package/lib/mcp/browser/sessionLog.js +160 -0
  110. package/lib/mcp/browser/sessionLog.js.map +7 -0
  111. package/lib/mcp/browser/tab.js +280 -0
  112. package/lib/mcp/browser/tab.js.map +7 -0
  113. package/lib/mcp/browser/tools/actionRetry.js +40 -0
  114. package/lib/mcp/browser/tools/actionRetry.js.map +7 -0
  115. package/lib/mcp/browser/tools/common.js +63 -0
  116. package/lib/mcp/browser/tools/common.js.map +7 -0
  117. package/lib/mcp/browser/tools/console.js +44 -0
  118. package/lib/mcp/browser/tools/console.js.map +7 -0
  119. package/lib/mcp/browser/tools/dialogs.js +60 -0
  120. package/lib/mcp/browser/tools/dialogs.js.map +7 -0
  121. package/lib/mcp/browser/tools/evaluate.js +69 -0
  122. package/lib/mcp/browser/tools/evaluate.js.map +7 -0
  123. package/lib/mcp/browser/tools/files.js +58 -0
  124. package/lib/mcp/browser/tools/files.js.map +7 -0
  125. package/lib/mcp/browser/tools/form.js +79 -0
  126. package/lib/mcp/browser/tools/form.js.map +7 -0
  127. package/lib/mcp/browser/tools/install.js +69 -0
  128. package/lib/mcp/browser/tools/install.js.map +7 -0
  129. package/lib/mcp/browser/tools/keyboard.js +84 -0
  130. package/lib/mcp/browser/tools/keyboard.js.map +7 -0
  131. package/lib/mcp/browser/tools/mouse.js +107 -0
  132. package/lib/mcp/browser/tools/mouse.js.map +7 -0
  133. package/lib/mcp/browser/tools/navigate.js +62 -0
  134. package/lib/mcp/browser/tools/navigate.js.map +7 -0
  135. package/lib/mcp/browser/tools/network.js +54 -0
  136. package/lib/mcp/browser/tools/network.js.map +7 -0
  137. package/lib/mcp/browser/tools/pdf.js +59 -0
  138. package/lib/mcp/browser/tools/pdf.js.map +7 -0
  139. package/lib/mcp/browser/tools/screenshot.js +106 -0
  140. package/lib/mcp/browser/tools/screenshot.js.map +7 -0
  141. package/lib/mcp/browser/tools/snapshot.js +312 -0
  142. package/lib/mcp/browser/tools/snapshot.js.map +7 -0
  143. package/lib/mcp/browser/tools/tabs.js +67 -0
  144. package/lib/mcp/browser/tools/tabs.js.map +7 -0
  145. package/lib/mcp/browser/tools/tool.js +49 -0
  146. package/lib/mcp/browser/tools/tool.js.map +7 -0
  147. package/lib/mcp/browser/tools/tracing.js +74 -0
  148. package/lib/mcp/browser/tools/tracing.js.map +7 -0
  149. package/lib/mcp/browser/tools/utils.js +96 -0
  150. package/lib/mcp/browser/tools/utils.js.map +7 -0
  151. package/lib/mcp/browser/tools/verify.js +153 -0
  152. package/lib/mcp/browser/tools/verify.js.map +7 -0
  153. package/lib/mcp/browser/tools/wait.js +63 -0
  154. package/lib/mcp/browser/tools/wait.js.map +7 -0
  155. package/lib/mcp/browser/tools.js +80 -0
  156. package/lib/mcp/browser/tools.js.map +7 -0
  157. package/lib/mcp/browser/watchdog.js +44 -0
  158. package/lib/mcp/browser/watchdog.js.map +7 -0
  159. package/lib/mcp/config.d.js +16 -0
  160. package/lib/mcp/config.d.js.map +7 -0
  161. package/lib/mcp/extension/cdpRelay.js +351 -0
  162. package/lib/mcp/extension/cdpRelay.js.map +7 -0
  163. package/lib/mcp/extension/extensionContextFactory.js +75 -0
  164. package/lib/mcp/extension/extensionContextFactory.js.map +7 -0
  165. package/lib/mcp/extension/protocol.js +28 -0
  166. package/lib/mcp/extension/protocol.js.map +7 -0
  167. package/lib/mcp/index.js +61 -0
  168. package/lib/mcp/index.js.map +7 -0
  169. package/lib/mcp/log.js +35 -0
  170. package/lib/mcp/log.js.map +7 -0
  171. package/lib/mcp/program.js +118 -0
  172. package/lib/mcp/program.js.map +7 -0
  173. package/lib/mcp/sdk/bundle.js +81 -0
  174. package/lib/mcp/sdk/bundle.js.map +7 -0
  175. package/lib/mcp/sdk/exports.js +32 -0
  176. package/lib/mcp/sdk/exports.js.map +7 -0
  177. package/lib/mcp/sdk/http.js +276 -0
  178. package/lib/mcp/sdk/http.js.map +7 -0
  179. package/lib/mcp/sdk/inProcessTransport.js +71 -0
  180. package/lib/mcp/sdk/inProcessTransport.js.map +7 -0
  181. package/lib/mcp/sdk/mdb.js +208 -0
  182. package/lib/mcp/sdk/mdb.js.map +7 -0
  183. package/lib/mcp/sdk/proxyBackend.js +128 -0
  184. package/lib/mcp/sdk/proxyBackend.js.map +7 -0
  185. package/lib/mcp/sdk/server.js +190 -0
  186. package/lib/mcp/sdk/server.js.map +7 -0
  187. package/lib/mcp/sdk/tool.js +51 -0
  188. package/lib/mcp/sdk/tool.js.map +7 -0
  189. package/lib/mcp/test/browserBackend.js +98 -0
  190. package/lib/mcp/test/browserBackend.js.map +7 -0
  191. package/lib/mcp/test/generatorTools.js +122 -0
  192. package/lib/mcp/test/generatorTools.js.map +7 -0
  193. package/lib/mcp/test/plannerTools.js +46 -0
  194. package/lib/mcp/test/plannerTools.js.map +7 -0
  195. package/lib/mcp/test/seed.js +82 -0
  196. package/lib/mcp/test/seed.js.map +7 -0
  197. package/lib/mcp/test/streams.js +41 -0
  198. package/lib/mcp/test/streams.js.map +7 -0
  199. package/lib/mcp/test/testBackend.js +97 -0
  200. package/lib/mcp/test/testBackend.js.map +7 -0
  201. package/lib/mcp/test/testContext.js +216 -0
  202. package/lib/mcp/test/testContext.js.map +7 -0
  203. package/lib/mcp/test/testTool.js +30 -0
  204. package/lib/mcp/test/testTool.js.map +7 -0
  205. package/lib/mcp/test/testTools.js +111 -0
  206. package/lib/mcp/test/testTools.js.map +7 -0
  207. package/lib/mcpBundleImpl.js +41 -0
  208. package/lib/mcpBundleImpl.js.map +7 -0
  209. package/lib/plugins/gitCommitInfoPlugin.js +198 -0
  210. package/lib/plugins/gitCommitInfoPlugin.js.map +7 -0
  211. package/lib/plugins/index.js +28 -0
  212. package/lib/plugins/index.js.map +7 -0
  213. package/lib/plugins/webServerPlugin.js +233 -0
  214. package/lib/plugins/webServerPlugin.js.map +7 -0
  215. package/lib/program.js +412 -0
  216. package/lib/program.js.map +7 -0
  217. package/lib/reporters/base.js +609 -0
  218. package/lib/reporters/base.js.map +7 -0
  219. package/lib/reporters/blob.js +135 -0
  220. package/lib/reporters/blob.js.map +7 -0
  221. package/lib/reporters/dot.js +82 -0
  222. package/lib/reporters/dot.js.map +7 -0
  223. package/lib/reporters/empty.js +32 -0
  224. package/lib/reporters/empty.js.map +7 -0
  225. package/lib/reporters/github.js +128 -0
  226. package/lib/reporters/github.js.map +7 -0
  227. package/lib/reporters/html.js +623 -0
  228. package/lib/reporters/html.js.map +7 -0
  229. package/lib/reporters/internalReporter.js +130 -0
  230. package/lib/reporters/internalReporter.js.map +7 -0
  231. package/lib/reporters/json.js +254 -0
  232. package/lib/reporters/json.js.map +7 -0
  233. package/lib/reporters/junit.js +232 -0
  234. package/lib/reporters/junit.js.map +7 -0
  235. package/lib/reporters/line.js +113 -0
  236. package/lib/reporters/line.js.map +7 -0
  237. package/lib/reporters/list.js +231 -0
  238. package/lib/reporters/list.js.map +7 -0
  239. package/lib/reporters/listModeReporter.js +69 -0
  240. package/lib/reporters/listModeReporter.js.map +7 -0
  241. package/lib/reporters/markdown.js +144 -0
  242. package/lib/reporters/markdown.js.map +7 -0
  243. package/lib/reporters/merge.js +541 -0
  244. package/lib/reporters/merge.js.map +7 -0
  245. package/lib/reporters/multiplexer.js +104 -0
  246. package/lib/reporters/multiplexer.js.map +7 -0
  247. package/lib/reporters/reporterV2.js +102 -0
  248. package/lib/reporters/reporterV2.js.map +7 -0
  249. package/lib/reporters/teleEmitter.js +298 -0
  250. package/lib/reporters/teleEmitter.js.map +7 -0
  251. package/lib/reporters/versions/blobV1.js +16 -0
  252. package/lib/reporters/versions/blobV1.js.map +7 -0
  253. package/lib/runner/dispatcher.js +491 -0
  254. package/lib/runner/dispatcher.js.map +7 -0
  255. package/lib/runner/failureTracker.js +72 -0
  256. package/lib/runner/failureTracker.js.map +7 -0
  257. package/lib/runner/lastRun.js +77 -0
  258. package/lib/runner/lastRun.js.map +7 -0
  259. package/lib/runner/loadUtils.js +334 -0
  260. package/lib/runner/loadUtils.js.map +7 -0
  261. package/lib/runner/loaderHost.js +89 -0
  262. package/lib/runner/loaderHost.js.map +7 -0
  263. package/lib/runner/processHost.js +161 -0
  264. package/lib/runner/processHost.js.map +7 -0
  265. package/lib/runner/projectUtils.js +241 -0
  266. package/lib/runner/projectUtils.js.map +7 -0
  267. package/lib/runner/rebase.js +189 -0
  268. package/lib/runner/rebase.js.map +7 -0
  269. package/lib/runner/reporters.js +138 -0
  270. package/lib/runner/reporters.js.map +7 -0
  271. package/lib/runner/runner.js +110 -0
  272. package/lib/runner/sigIntWatcher.js +96 -0
  273. package/lib/runner/sigIntWatcher.js.map +7 -0
  274. package/lib/runner/taskRunner.js +127 -0
  275. package/lib/runner/taskRunner.js.map +7 -0
  276. package/lib/runner/tasks.js +410 -0
  277. package/lib/runner/tasks.js.map +7 -0
  278. package/lib/runner/testGroups.js +117 -0
  279. package/lib/runner/testGroups.js.map +7 -0
  280. package/lib/runner/testRunner.js +390 -0
  281. package/lib/runner/testRunner.js.map +7 -0
  282. package/lib/runner/testServer.js +267 -0
  283. package/lib/runner/testServer.js.map +7 -0
  284. package/lib/runner/uiModeReporter.js +30 -0
  285. package/lib/runner/uiModeReporter.js.map +7 -0
  286. package/lib/runner/vcs.js +72 -0
  287. package/lib/runner/vcs.js.map +7 -0
  288. package/lib/runner/watchMode.js +395 -0
  289. package/lib/runner/watchMode.js.map +7 -0
  290. package/lib/runner/workerHost.js +95 -0
  291. package/lib/runner/workerHost.js.map +7 -0
  292. package/lib/third_party/pirates.js +62 -0
  293. package/lib/third_party/pirates.js.map +7 -0
  294. package/lib/third_party/tsconfig-loader.js +103 -0
  295. package/lib/third_party/tsconfig-loader.js.map +7 -0
  296. package/lib/transform/babelBundle.js +43 -0
  297. package/lib/transform/babelBundle.js.map +7 -0
  298. package/lib/transform/babelBundleImpl.js +461 -0
  299. package/lib/transform/babelBundleImpl.js.map +7 -0
  300. package/lib/transform/compilationCache.js +272 -0
  301. package/lib/transform/compilationCache.js.map +7 -0
  302. package/lib/transform/esmLoader.js +104 -0
  303. package/lib/transform/esmLoader.js.map +7 -0
  304. package/lib/transform/portTransport.js +67 -0
  305. package/lib/transform/portTransport.js.map +7 -0
  306. package/lib/transform/transform.js +293 -0
  307. package/lib/transform/transform.js.map +7 -0
  308. package/lib/util.js +403 -0
  309. package/lib/util.js.map +7 -0
  310. package/lib/utilsBundle.js +43 -0
  311. package/lib/utilsBundle.js.map +7 -0
  312. package/lib/utilsBundleImpl.js +100 -0
  313. package/lib/utilsBundleImpl.js.map +7 -0
  314. package/lib/worker/fixtureRunner.js +258 -0
  315. package/lib/worker/fixtureRunner.js.map +7 -0
  316. package/lib/worker/testInfo.js +514 -0
  317. package/lib/worker/testInfo.js.map +7 -0
  318. package/lib/worker/testTracing.js +344 -0
  319. package/lib/worker/testTracing.js.map +7 -0
  320. package/lib/worker/timeoutManager.js +174 -0
  321. package/lib/worker/timeoutManager.js.map +7 -0
  322. package/lib/worker/util.js +31 -0
  323. package/lib/worker/util.js.map +7 -0
  324. package/lib/worker/workerMain.js +520 -0
  325. package/lib/worker/workerMain.js.map +7 -0
  326. package/package.json +74 -0
  327. package/test.d.ts +18 -0
  328. package/test.js +24 -0
  329. package/test.mjs +33 -0
  330. package/types/test.d.ts +10196 -0
  331. package/types/testReporter.d.ts +821 -0
@@ -0,0 +1,609 @@
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 base_exports = {};
30
+ __export(base_exports, {
31
+ TerminalReporter: () => TerminalReporter,
32
+ fitToWidth: () => fitToWidth,
33
+ formatError: () => formatError,
34
+ formatFailure: () => formatFailure,
35
+ formatResultFailure: () => formatResultFailure,
36
+ formatRetry: () => formatRetry,
37
+ internalScreen: () => internalScreen,
38
+ kOutputSymbol: () => kOutputSymbol,
39
+ nonTerminalScreen: () => nonTerminalScreen,
40
+ prepareErrorStack: () => prepareErrorStack,
41
+ relativeFilePath: () => relativeFilePath,
42
+ resolveOutputFile: () => resolveOutputFile,
43
+ separator: () => separator,
44
+ stepSuffix: () => stepSuffix,
45
+ terminalScreen: () => terminalScreen
46
+ });
47
+ module.exports = __toCommonJS(base_exports);
48
+ var import_path = __toESM(require("path"));
49
+ var import_utils = require("playwright-core/lib/utils");
50
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
51
+ var import_utils2 = require("playwright-core/lib/utils");
52
+ var import_util = require("../util");
53
+ var import_utilsBundle2 = require("../utilsBundle");
54
+ const kOutputSymbol = Symbol("output");
55
+ const DEFAULT_TTY_WIDTH = 100;
56
+ const DEFAULT_TTY_HEIGHT = 40;
57
+ const originalProcessStdout = process.stdout;
58
+ const originalProcessStderr = process.stderr;
59
+ const terminalScreen = (() => {
60
+ let isTTY = !!originalProcessStdout.isTTY;
61
+ let ttyWidth = originalProcessStdout.columns || 0;
62
+ let ttyHeight = originalProcessStdout.rows || 0;
63
+ if (process.env.PLAYWRIGHT_FORCE_TTY === "false" || process.env.PLAYWRIGHT_FORCE_TTY === "0") {
64
+ isTTY = false;
65
+ ttyWidth = 0;
66
+ ttyHeight = 0;
67
+ } else if (process.env.PLAYWRIGHT_FORCE_TTY === "true" || process.env.PLAYWRIGHT_FORCE_TTY === "1") {
68
+ isTTY = true;
69
+ ttyWidth = originalProcessStdout.columns || DEFAULT_TTY_WIDTH;
70
+ ttyHeight = originalProcessStdout.rows || DEFAULT_TTY_HEIGHT;
71
+ } else if (process.env.PLAYWRIGHT_FORCE_TTY) {
72
+ isTTY = true;
73
+ const sizeMatch = process.env.PLAYWRIGHT_FORCE_TTY.match(/^(\d+)x(\d+)$/);
74
+ if (sizeMatch) {
75
+ ttyWidth = +sizeMatch[1];
76
+ ttyHeight = +sizeMatch[2];
77
+ } else {
78
+ ttyWidth = +process.env.PLAYWRIGHT_FORCE_TTY;
79
+ ttyHeight = DEFAULT_TTY_HEIGHT;
80
+ }
81
+ if (isNaN(ttyWidth))
82
+ ttyWidth = DEFAULT_TTY_WIDTH;
83
+ if (isNaN(ttyHeight))
84
+ ttyHeight = DEFAULT_TTY_HEIGHT;
85
+ }
86
+ let useColors = isTTY;
87
+ if (process.env.DEBUG_COLORS === "0" || process.env.DEBUG_COLORS === "false" || process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false")
88
+ useColors = false;
89
+ else if (process.env.DEBUG_COLORS || process.env.FORCE_COLOR)
90
+ useColors = true;
91
+ const colors = useColors ? import_utils2.colors : import_utils2.noColors;
92
+ return {
93
+ resolveFiles: "cwd",
94
+ isTTY,
95
+ ttyWidth,
96
+ ttyHeight,
97
+ colors,
98
+ stdout: originalProcessStdout,
99
+ stderr: originalProcessStderr
100
+ };
101
+ })();
102
+ const nonTerminalScreen = {
103
+ colors: terminalScreen.colors,
104
+ isTTY: false,
105
+ ttyWidth: 0,
106
+ ttyHeight: 0,
107
+ resolveFiles: "rootDir"
108
+ };
109
+ const internalScreen = {
110
+ colors: import_utils2.colors,
111
+ isTTY: false,
112
+ ttyWidth: 0,
113
+ ttyHeight: 0,
114
+ resolveFiles: "rootDir"
115
+ };
116
+ class TerminalReporter {
117
+ constructor(options = {}) {
118
+ this.totalTestCount = 0;
119
+ this.fileDurations = /* @__PURE__ */ new Map();
120
+ this._fatalErrors = [];
121
+ this._failureCount = 0;
122
+ this.screen = options.screen ?? terminalScreen;
123
+ this._options = options;
124
+ }
125
+ version() {
126
+ return "v2";
127
+ }
128
+ onConfigure(config) {
129
+ this.config = config;
130
+ }
131
+ onBegin(suite) {
132
+ this.suite = suite;
133
+ this.totalTestCount = suite.allTests().length;
134
+ }
135
+ onStdOut(chunk, test, result) {
136
+ this._appendOutput({ chunk, type: "stdout" }, result);
137
+ }
138
+ onStdErr(chunk, test, result) {
139
+ this._appendOutput({ chunk, type: "stderr" }, result);
140
+ }
141
+ _appendOutput(output, result) {
142
+ if (!result)
143
+ return;
144
+ result[kOutputSymbol] = result[kOutputSymbol] || [];
145
+ result[kOutputSymbol].push(output);
146
+ }
147
+ onTestEnd(test, result) {
148
+ if (result.status !== "skipped" && result.status !== test.expectedStatus)
149
+ ++this._failureCount;
150
+ const projectName = test.titlePath()[1];
151
+ const relativePath = relativeTestPath(this.screen, this.config, test);
152
+ const fileAndProject = (projectName ? `[${projectName}] \u203A ` : "") + relativePath;
153
+ const entry = this.fileDurations.get(fileAndProject) || { duration: 0, workers: /* @__PURE__ */ new Set() };
154
+ entry.duration += result.duration;
155
+ entry.workers.add(result.workerIndex);
156
+ this.fileDurations.set(fileAndProject, entry);
157
+ }
158
+ onError(error) {
159
+ this._fatalErrors.push(error);
160
+ }
161
+ async onEnd(result) {
162
+ this.result = result;
163
+ }
164
+ fitToScreen(line, prefix) {
165
+ if (!this.screen.ttyWidth) {
166
+ return line;
167
+ }
168
+ return fitToWidth(line, this.screen.ttyWidth, prefix);
169
+ }
170
+ generateStartingMessage() {
171
+ const jobs = this.config.metadata.actualWorkers ?? this.config.workers;
172
+ const shardDetails = this.config.shard ? `, shard ${this.config.shard.current} of ${this.config.shard.total}` : "";
173
+ if (!this.totalTestCount)
174
+ return "";
175
+ return "\n" + this.screen.colors.dim("Running ") + this.totalTestCount + this.screen.colors.dim(` test${this.totalTestCount !== 1 ? "s" : ""} using `) + jobs + this.screen.colors.dim(` worker${jobs !== 1 ? "s" : ""}${shardDetails}`);
176
+ }
177
+ getSlowTests() {
178
+ if (!this.config.reportSlowTests)
179
+ return [];
180
+ const fileDurations = [...this.fileDurations.entries()].filter(([key, value]) => value.workers.size === 1).map(([key, value]) => [key, value.duration]);
181
+ fileDurations.sort((a, b) => b[1] - a[1]);
182
+ const count = Math.min(fileDurations.length, this.config.reportSlowTests.max || Number.POSITIVE_INFINITY);
183
+ const threshold = this.config.reportSlowTests.threshold;
184
+ return fileDurations.filter(([, duration]) => duration > threshold).slice(0, count);
185
+ }
186
+ generateSummaryMessage({ didNotRun, skipped, expected, interrupted, unexpected, flaky, fatalErrors }) {
187
+ const tokens = [];
188
+ if (unexpected.length) {
189
+ tokens.push(this.screen.colors.red(` ${unexpected.length} failed`));
190
+ for (const test of unexpected)
191
+ tokens.push(this.screen.colors.red(this.formatTestHeader(test, { indent: " " })));
192
+ }
193
+ if (interrupted.length) {
194
+ tokens.push(this.screen.colors.yellow(` ${interrupted.length} interrupted`));
195
+ for (const test of interrupted)
196
+ tokens.push(this.screen.colors.yellow(this.formatTestHeader(test, { indent: " " })));
197
+ }
198
+ if (flaky.length) {
199
+ tokens.push(this.screen.colors.yellow(` ${flaky.length} flaky`));
200
+ for (const test of flaky)
201
+ tokens.push(this.screen.colors.yellow(this.formatTestHeader(test, { indent: " " })));
202
+ }
203
+ if (skipped)
204
+ tokens.push(this.screen.colors.yellow(` ${skipped} skipped`));
205
+ if (didNotRun)
206
+ tokens.push(this.screen.colors.yellow(` ${didNotRun} did not run`));
207
+ if (expected)
208
+ tokens.push(this.screen.colors.green(` ${expected} passed`) + this.screen.colors.dim(` (${(0, import_utilsBundle.ms)(this.result.duration)})`));
209
+ if (fatalErrors.length && expected + unexpected.length + interrupted.length + flaky.length > 0)
210
+ tokens.push(this.screen.colors.red(` ${fatalErrors.length === 1 ? "1 error was not a part of any test" : fatalErrors.length + " errors were not a part of any test"}, see above for details`));
211
+ return tokens.join("\n");
212
+ }
213
+ generateSummary() {
214
+ let didNotRun = 0;
215
+ let skipped = 0;
216
+ let expected = 0;
217
+ const interrupted = [];
218
+ const interruptedToPrint = [];
219
+ const unexpected = [];
220
+ const flaky = [];
221
+ this.suite.allTests().forEach((test) => {
222
+ switch (test.outcome()) {
223
+ case "skipped": {
224
+ if (test.results.some((result) => result.status === "interrupted")) {
225
+ if (test.results.some((result) => !!result.error))
226
+ interruptedToPrint.push(test);
227
+ interrupted.push(test);
228
+ } else if (!test.results.length || test.expectedStatus !== "skipped") {
229
+ ++didNotRun;
230
+ } else {
231
+ ++skipped;
232
+ }
233
+ break;
234
+ }
235
+ case "expected":
236
+ ++expected;
237
+ break;
238
+ case "unexpected":
239
+ unexpected.push(test);
240
+ break;
241
+ case "flaky":
242
+ flaky.push(test);
243
+ break;
244
+ }
245
+ });
246
+ const failuresToPrint = [...unexpected, ...flaky, ...interruptedToPrint];
247
+ return {
248
+ didNotRun,
249
+ skipped,
250
+ expected,
251
+ interrupted,
252
+ unexpected,
253
+ flaky,
254
+ failuresToPrint,
255
+ fatalErrors: this._fatalErrors
256
+ };
257
+ }
258
+ epilogue(full) {
259
+ const summary = this.generateSummary();
260
+ const summaryMessage = this.generateSummaryMessage(summary);
261
+ if (full && summary.failuresToPrint.length && !this._options.omitFailures)
262
+ this._printFailures(summary.failuresToPrint);
263
+ this._printSlowTests();
264
+ this._printSummary(summaryMessage);
265
+ }
266
+ _printFailures(failures) {
267
+ this.writeLine("");
268
+ failures.forEach((test, index) => {
269
+ this.writeLine(this.formatFailure(test, index + 1));
270
+ });
271
+ }
272
+ _printSlowTests() {
273
+ const slowTests = this.getSlowTests();
274
+ slowTests.forEach(([file, duration]) => {
275
+ this.writeLine(this.screen.colors.yellow(" Slow test file: ") + file + this.screen.colors.yellow(` (${(0, import_utilsBundle.ms)(duration)})`));
276
+ });
277
+ if (slowTests.length)
278
+ this.writeLine(this.screen.colors.yellow(" Consider running tests from slow files in parallel. See: https://playwright.dev/docs/test-parallel"));
279
+ }
280
+ _printSummary(summary) {
281
+ if (summary.trim())
282
+ this.writeLine(summary);
283
+ }
284
+ willRetry(test) {
285
+ return test.outcome() === "unexpected" && test.results.length <= test.retries;
286
+ }
287
+ formatTestTitle(test, step) {
288
+ return formatTestTitle(this.screen, this.config, test, step, this._options);
289
+ }
290
+ formatTestHeader(test, options = {}) {
291
+ return formatTestHeader(this.screen, this.config, test, { ...options, includeTestId: this._options.includeTestId });
292
+ }
293
+ formatFailure(test, index) {
294
+ return formatFailure(this.screen, this.config, test, index, this._options);
295
+ }
296
+ formatError(error) {
297
+ return formatError(this.screen, error);
298
+ }
299
+ writeLine(line) {
300
+ this.screen.stdout?.write(line ? line + "\n" : "\n");
301
+ }
302
+ }
303
+ function formatFailure(screen, config, test, index, options) {
304
+ const lines = [];
305
+ const header = formatTestHeader(screen, config, test, { indent: " ", index, mode: "error", includeTestId: options?.includeTestId });
306
+ lines.push(screen.colors.red(header));
307
+ for (const result of test.results) {
308
+ const resultLines = [];
309
+ const errors = formatResultFailure(screen, test, result, " ");
310
+ if (!errors.length)
311
+ continue;
312
+ if (result.retry) {
313
+ resultLines.push("");
314
+ resultLines.push(screen.colors.gray(separator(screen, ` Retry #${result.retry}`)));
315
+ }
316
+ resultLines.push(...errors.map((error) => "\n" + error.message));
317
+ const attachmentGroups = groupAttachments(result.attachments);
318
+ for (let i = 0; i < attachmentGroups.length; ++i) {
319
+ const attachment = attachmentGroups[i];
320
+ if (attachment.name === "error-context" && attachment.path) {
321
+ resultLines.push("");
322
+ resultLines.push(screen.colors.dim(` Error Context: ${relativeFilePath(screen, config, attachment.path)}`));
323
+ continue;
324
+ }
325
+ if (attachment.name.startsWith("_"))
326
+ continue;
327
+ const hasPrintableContent = attachment.contentType.startsWith("text/");
328
+ if (!attachment.path && !hasPrintableContent)
329
+ continue;
330
+ resultLines.push("");
331
+ resultLines.push(screen.colors.dim(separator(screen, ` attachment #${i + 1}: ${screen.colors.bold(attachment.name)} (${attachment.contentType})`)));
332
+ if (attachment.actual?.path) {
333
+ if (attachment.expected?.path) {
334
+ const expectedPath = relativeFilePath(screen, config, attachment.expected.path);
335
+ resultLines.push(screen.colors.dim(` Expected: ${expectedPath}`));
336
+ }
337
+ const actualPath = relativeFilePath(screen, config, attachment.actual.path);
338
+ resultLines.push(screen.colors.dim(` Received: ${actualPath}`));
339
+ if (attachment.previous?.path) {
340
+ const previousPath = relativeFilePath(screen, config, attachment.previous.path);
341
+ resultLines.push(screen.colors.dim(` Previous: ${previousPath}`));
342
+ }
343
+ if (attachment.diff?.path) {
344
+ const diffPath = relativeFilePath(screen, config, attachment.diff.path);
345
+ resultLines.push(screen.colors.dim(` Diff: ${diffPath}`));
346
+ }
347
+ } else if (attachment.path) {
348
+ const relativePath = relativeFilePath(screen, config, attachment.path);
349
+ resultLines.push(screen.colors.dim(` ${relativePath}`));
350
+ if (attachment.name === "trace") {
351
+ const packageManagerCommand = (0, import_utils.getPackageManagerExecCommand)();
352
+ resultLines.push(screen.colors.dim(` Usage:`));
353
+ resultLines.push("");
354
+ resultLines.push(screen.colors.dim(` ${packageManagerCommand} playwright show-trace ${quotePathIfNeeded(relativePath)}`));
355
+ resultLines.push("");
356
+ }
357
+ } else {
358
+ if (attachment.contentType.startsWith("text/") && attachment.body) {
359
+ let text = attachment.body.toString();
360
+ if (text.length > 300)
361
+ text = text.slice(0, 300) + "...";
362
+ for (const line of text.split("\n"))
363
+ resultLines.push(screen.colors.dim(` ${line}`));
364
+ }
365
+ }
366
+ resultLines.push(screen.colors.dim(separator(screen, " ")));
367
+ }
368
+ lines.push(...resultLines);
369
+ }
370
+ lines.push("");
371
+ return lines.join("\n");
372
+ }
373
+ function formatRetry(screen, result) {
374
+ const retryLines = [];
375
+ if (result.retry) {
376
+ retryLines.push("");
377
+ retryLines.push(screen.colors.gray(separator(screen, ` Retry #${result.retry}`)));
378
+ }
379
+ return retryLines;
380
+ }
381
+ function quotePathIfNeeded(path2) {
382
+ if (/\s/.test(path2))
383
+ return `"${path2}"`;
384
+ return path2;
385
+ }
386
+ function formatResultFailure(screen, test, result, initialIndent) {
387
+ const errorDetails = [];
388
+ if (result.status === "passed" && test.expectedStatus === "failed") {
389
+ errorDetails.push({
390
+ message: indent(screen.colors.red(`Expected to fail, but passed.`), initialIndent)
391
+ });
392
+ }
393
+ if (result.status === "interrupted") {
394
+ errorDetails.push({
395
+ message: indent(screen.colors.red(`Test was interrupted.`), initialIndent)
396
+ });
397
+ }
398
+ for (const error of result.errors) {
399
+ const formattedError = formatError(screen, error);
400
+ errorDetails.push({
401
+ message: indent(formattedError.message, initialIndent),
402
+ location: formattedError.location
403
+ });
404
+ }
405
+ return errorDetails;
406
+ }
407
+ function relativeFilePath(screen, config, file) {
408
+ if (screen.resolveFiles === "cwd")
409
+ return import_path.default.relative(process.cwd(), file);
410
+ return import_path.default.relative(config.rootDir, file);
411
+ }
412
+ function relativeTestPath(screen, config, test) {
413
+ return relativeFilePath(screen, config, test.location.file);
414
+ }
415
+ function stepSuffix(step) {
416
+ const stepTitles = step ? step.titlePath() : [];
417
+ return stepTitles.map((t) => t.split("\n")[0]).map((t) => " \u203A " + t).join("");
418
+ }
419
+ function formatTestTitle(screen, config, test, step, options = {}) {
420
+ const [, projectName, , ...titles] = test.titlePath();
421
+ const location = `${relativeTestPath(screen, config, test)}:${test.location.line}:${test.location.column}`;
422
+ const testId = options.includeTestId ? `[id=${test.id}] ` : "";
423
+ const projectLabel = options.includeTestId ? `project=` : "";
424
+ const projectTitle = projectName ? `[${projectLabel}${projectName}] \u203A ` : "";
425
+ const testTitle = `${testId}${projectTitle}${location} \u203A ${titles.join(" \u203A ")}`;
426
+ const extraTags = test.tags.filter((t) => !testTitle.includes(t));
427
+ return `${testTitle}${stepSuffix(step)}${extraTags.length ? " " + extraTags.join(" ") : ""}`;
428
+ }
429
+ function formatTestHeader(screen, config, test, options = {}) {
430
+ const title = formatTestTitle(screen, config, test, void 0, options);
431
+ const header = `${options.indent || ""}${options.index ? options.index + ") " : ""}${title}`;
432
+ let fullHeader = header;
433
+ if (options.mode === "error") {
434
+ const stepPaths = /* @__PURE__ */ new Set();
435
+ for (const result of test.results.filter((r) => !!r.errors.length)) {
436
+ const stepPath = [];
437
+ const visit = (steps) => {
438
+ const errors = steps.filter((s) => s.error);
439
+ if (errors.length > 1)
440
+ return;
441
+ if (errors.length === 1 && errors[0].category === "test.step") {
442
+ stepPath.push(errors[0].title);
443
+ visit(errors[0].steps);
444
+ }
445
+ };
446
+ visit(result.steps);
447
+ stepPaths.add(["", ...stepPath].join(" \u203A "));
448
+ }
449
+ fullHeader = header + (stepPaths.size === 1 ? stepPaths.values().next().value : "");
450
+ }
451
+ return separator(screen, fullHeader);
452
+ }
453
+ function formatError(screen, error) {
454
+ const message = error.message || error.value || "";
455
+ const stack = error.stack;
456
+ if (!stack && !error.location)
457
+ return { message };
458
+ const tokens = [];
459
+ const parsedStack = stack ? prepareErrorStack(stack) : void 0;
460
+ tokens.push(parsedStack?.message || message);
461
+ if (error.snippet) {
462
+ let snippet = error.snippet;
463
+ if (!screen.colors.enabled)
464
+ snippet = (0, import_util.stripAnsiEscapes)(snippet);
465
+ tokens.push("");
466
+ tokens.push(snippet);
467
+ }
468
+ if (parsedStack && parsedStack.stackLines.length)
469
+ tokens.push(screen.colors.dim(parsedStack.stackLines.join("\n")));
470
+ let location = error.location;
471
+ if (parsedStack && !location)
472
+ location = parsedStack.location;
473
+ if (error.cause)
474
+ tokens.push(screen.colors.dim("[cause]: ") + formatError(screen, error.cause).message);
475
+ return {
476
+ location,
477
+ message: tokens.join("\n")
478
+ };
479
+ }
480
+ function separator(screen, text = "") {
481
+ if (text)
482
+ text += " ";
483
+ const columns = Math.min(100, screen.ttyWidth || 100);
484
+ return text + screen.colors.dim("\u2500".repeat(Math.max(0, columns - (0, import_util.stripAnsiEscapes)(text).length)));
485
+ }
486
+ function indent(lines, tab) {
487
+ return lines.replace(/^(?=.+$)/gm, tab);
488
+ }
489
+ function prepareErrorStack(stack) {
490
+ return (0, import_utils.parseErrorStack)(stack, import_path.default.sep, !!process.env.PWDEBUGIMPL);
491
+ }
492
+ function characterWidth(c) {
493
+ return import_utilsBundle2.getEastAsianWidth.eastAsianWidth(c.codePointAt(0));
494
+ }
495
+ function stringWidth(v) {
496
+ let width = 0;
497
+ for (const { segment } of new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(v))
498
+ width += characterWidth(segment);
499
+ return width;
500
+ }
501
+ function suffixOfWidth(v, width) {
502
+ const segments = [...new Intl.Segmenter(void 0, { granularity: "grapheme" }).segment(v)];
503
+ let suffixBegin = v.length;
504
+ for (const { segment, index } of segments.reverse()) {
505
+ const segmentWidth = stringWidth(segment);
506
+ if (segmentWidth > width)
507
+ break;
508
+ width -= segmentWidth;
509
+ suffixBegin = index;
510
+ }
511
+ return v.substring(suffixBegin);
512
+ }
513
+ function fitToWidth(line, width, prefix) {
514
+ const prefixLength = prefix ? (0, import_util.stripAnsiEscapes)(prefix).length : 0;
515
+ width -= prefixLength;
516
+ if (stringWidth(line) <= width)
517
+ return line;
518
+ const parts = line.split(import_util.ansiRegex);
519
+ const taken = [];
520
+ for (let i = parts.length - 1; i >= 0; i--) {
521
+ if (i % 2) {
522
+ taken.push(parts[i]);
523
+ } else {
524
+ let part = suffixOfWidth(parts[i], width);
525
+ const wasTruncated = part.length < parts[i].length;
526
+ if (wasTruncated && parts[i].length > 0) {
527
+ part = "\u2026" + suffixOfWidth(parts[i], width - 1);
528
+ }
529
+ taken.push(part);
530
+ width -= stringWidth(part);
531
+ }
532
+ }
533
+ return taken.reverse().join("");
534
+ }
535
+ function resolveFromEnv(name) {
536
+ const value = process.env[name];
537
+ if (value)
538
+ return import_path.default.resolve(process.cwd(), value);
539
+ return void 0;
540
+ }
541
+ function resolveOutputFile(reporterName, options) {
542
+ const name = reporterName.toUpperCase();
543
+ let outputFile = resolveFromEnv(`PLAYWRIGHT_${name}_OUTPUT_FILE`);
544
+ if (!outputFile && options.outputFile)
545
+ outputFile = import_path.default.resolve(options.configDir, options.outputFile);
546
+ if (outputFile)
547
+ return { outputFile };
548
+ let outputDir = resolveFromEnv(`PLAYWRIGHT_${name}_OUTPUT_DIR`);
549
+ if (!outputDir && options.outputDir)
550
+ outputDir = import_path.default.resolve(options.configDir, options.outputDir);
551
+ if (!outputDir && options.default)
552
+ outputDir = (0, import_util.resolveReporterOutputPath)(options.default.outputDir, options.configDir, void 0);
553
+ if (!outputDir)
554
+ outputDir = options.configDir;
555
+ const reportName = process.env[`PLAYWRIGHT_${name}_OUTPUT_NAME`] ?? options.fileName ?? options.default?.fileName;
556
+ if (!reportName)
557
+ return void 0;
558
+ outputFile = import_path.default.resolve(outputDir, reportName);
559
+ return { outputFile, outputDir };
560
+ }
561
+ function groupAttachments(attachments) {
562
+ const result = [];
563
+ const attachmentsByPrefix = /* @__PURE__ */ new Map();
564
+ for (const attachment of attachments) {
565
+ if (!attachment.path) {
566
+ result.push(attachment);
567
+ continue;
568
+ }
569
+ const match = attachment.name.match(/^(.*)-(expected|actual|diff|previous)(\.[^.]+)?$/);
570
+ if (!match) {
571
+ result.push(attachment);
572
+ continue;
573
+ }
574
+ const [, name, category] = match;
575
+ let group = attachmentsByPrefix.get(name);
576
+ if (!group) {
577
+ group = { ...attachment, name };
578
+ attachmentsByPrefix.set(name, group);
579
+ result.push(group);
580
+ }
581
+ if (category === "expected")
582
+ group.expected = attachment;
583
+ else if (category === "actual")
584
+ group.actual = attachment;
585
+ else if (category === "diff")
586
+ group.diff = attachment;
587
+ else if (category === "previous")
588
+ group.previous = attachment;
589
+ }
590
+ return result;
591
+ }
592
+ // Annotate the CommonJS export names for ESM import in node:
593
+ 0 && (module.exports = {
594
+ TerminalReporter,
595
+ fitToWidth,
596
+ formatError,
597
+ formatFailure,
598
+ formatResultFailure,
599
+ formatRetry,
600
+ internalScreen,
601
+ kOutputSymbol,
602
+ nonTerminalScreen,
603
+ prepareErrorStack,
604
+ relativeFilePath,
605
+ resolveOutputFile,
606
+ separator,
607
+ stepSuffix,
608
+ terminalScreen
609
+ });