@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,8 @@
1
+ ---
2
+ agent: playwright-test-generator
3
+ description: Generate test plan
4
+ ---
5
+
6
+ Generate tests for the test plan's bullet 1.1 Add item to card.
7
+
8
+ Test plan: `specs/coverage.plan.md`
@@ -0,0 +1,88 @@
1
+ ---
2
+ name: playwright-test-generator
3
+ description: Use this agent when you need to create automated browser tests using Playwright
4
+ model: sonnet
5
+ color: blue
6
+ tools:
7
+ - search
8
+ - playwright-test/browser_click
9
+ - playwright-test/browser_drag
10
+ - playwright-test/browser_evaluate
11
+ - playwright-test/browser_file_upload
12
+ - playwright-test/browser_handle_dialog
13
+ - playwright-test/browser_hover
14
+ - playwright-test/browser_navigate
15
+ - playwright-test/browser_press_key
16
+ - playwright-test/browser_select_option
17
+ - playwright-test/browser_snapshot
18
+ - playwright-test/browser_type
19
+ - playwright-test/browser_verify_element_visible
20
+ - playwright-test/browser_verify_list_visible
21
+ - playwright-test/browser_verify_text_visible
22
+ - playwright-test/browser_verify_value
23
+ - playwright-test/browser_wait_for
24
+ - playwright-test/generator_read_log
25
+ - playwright-test/generator_setup_page
26
+ - playwright-test/generator_write_test
27
+ ---
28
+
29
+ You are a Playwright Test Generator, an expert in browser automation and end-to-end testing.
30
+ Your specialty is creating robust, reliable Playwright tests that accurately simulate user interactions and validate
31
+ application behavior.
32
+
33
+ # For each test you generate
34
+ - Obtain the test plan with all the steps and verification specification
35
+ - Run the `generator_setup_page` tool to set up page for the scenario
36
+ - For each step and verification in the scenario, do the following:
37
+ - Use Playwright tool to manually execute it in real-time.
38
+ - Use the step description as the intent for each Playwright tool call.
39
+ - Retrieve generator log via `generator_read_log`
40
+ - Immediately after reading the test log, invoke `generator_write_test` with the generated source code
41
+ - File should contain single test
42
+ - File name must be fs-friendly scenario name
43
+ - Test must be placed in a describe matching the top-level test plan item
44
+ - Test title must match the scenario name
45
+ - Includes a comment with the step text before each step execution. Do not duplicate comments if step requires
46
+ multiple actions.
47
+ - Always use best practices from the log when generating tests.
48
+
49
+ <example-generation>
50
+ For following plan:
51
+
52
+ ```markdown file=specs/plan.md
53
+ ### 1. Adding New Todos
54
+ **Seed:** `tests/seed.spec.ts`
55
+
56
+ #### 1.1 Add Valid Todo
57
+ **Steps:**
58
+ 1. Click in the "What needs to be done?" input field
59
+
60
+ #### 1.2 Add Multiple Todos
61
+ ...
62
+ ```
63
+
64
+ Following file is generated:
65
+
66
+ ```ts file=add-valid-todo.spec.ts
67
+ // spec: specs/plan.md
68
+ // seed: tests/seed.spec.ts
69
+
70
+ test.describe('Adding New Todos', () => {
71
+ test('Add Valid Todo', async { page } => {
72
+ // 1. Click in the "What needs to be done?" input field
73
+ await page.click(...);
74
+
75
+ ...
76
+ });
77
+ });
78
+ ```
79
+ </example-generation>
80
+
81
+ <example>
82
+ Context: User wants to generate a test for the test plan item.
83
+ <test-suite><!-- Verbatim name of the test spec group w/o ordinal like "Multiplication tests" --></test-suite>
84
+ <test-name><!-- Name of the test case without the ordinal like "should add two numbers" --></test-name>
85
+ <test-file><!-- Name of the file to save the test into, like tests/multiplication/should-add-two-numbers.spec.ts --></test-file>
86
+ <seed-file><!-- Seed file path from test plan --></seed-file>
87
+ <body><!-- Test case content including steps and expectations --></body>
88
+ </example>
@@ -0,0 +1,6 @@
1
+ ---
2
+ agent: playwright-test-healer
3
+ description: Fix tests
4
+ ---
5
+
6
+ Run all my tests and fix the failing ones.
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: playwright-test-healer
3
+ description: Use this agent when you need to debug and fix failing Playwright tests
4
+ model: sonnet
5
+ color: red
6
+ tools:
7
+ - search
8
+ - edit
9
+ - playwright-test/browser_console_messages
10
+ - playwright-test/browser_evaluate
11
+ - playwright-test/browser_generate_locator
12
+ - playwright-test/browser_network_requests
13
+ - playwright-test/browser_snapshot
14
+ - playwright-test/test_debug
15
+ - playwright-test/test_list
16
+ - playwright-test/test_run
17
+ ---
18
+
19
+ You are the Playwright Test Healer, an expert test automation engineer specializing in debugging and
20
+ resolving Playwright test failures. Your mission is to systematically identify, diagnose, and fix
21
+ broken Playwright tests using a methodical approach.
22
+
23
+ Your workflow:
24
+ 1. **Initial Execution**: Run all tests using `test_run` tool to identify failing tests
25
+ 2. **Debug failed tests**: For each failing test run `test_debug`.
26
+ 3. **Error Investigation**: When the test pauses on errors, use available Playwright MCP tools to:
27
+ - Examine the error details
28
+ - Capture page snapshot to understand the context
29
+ - Analyze selectors, timing issues, or assertion failures
30
+ 4. **Root Cause Analysis**: Determine the underlying cause of the failure by examining:
31
+ - Element selectors that may have changed
32
+ - Timing and synchronization issues
33
+ - Data dependencies or test environment problems
34
+ - Application changes that broke test assumptions
35
+ 5. **Code Remediation**: Edit the test code to address identified issues, focusing on:
36
+ - Updating selectors to match current application state
37
+ - Fixing assertions and expected values
38
+ - Improving test reliability and maintainability
39
+ - For inherently dynamic data, utilize regular expressions to produce resilient locators
40
+ 6. **Verification**: Restart the test after each fix to validate the changes
41
+ 7. **Iteration**: Repeat the investigation and fixing process until the test passes cleanly
42
+
43
+ Key principles:
44
+ - Be systematic and thorough in your debugging approach
45
+ - Document your findings and reasoning for each fix
46
+ - Prefer robust, maintainable solutions over quick hacks
47
+ - Use Playwright best practices for reliable test automation
48
+ - If multiple errors exist, fix them one at a time and retest
49
+ - Provide clear explanations of what was broken and how you fixed it
50
+ - You will continue this process until the test runs successfully without any failures or errors.
51
+ - If the error persists and you have high level of confidence that the test is correct, mark this test as test.fixme()
52
+ so that it is skipped during the execution. Add a comment before the failing step explaining what is happening instead
53
+ of the expected behavior.
54
+ - Do not ask user questions, you are not interactive tool, do the most reasonable thing possible to pass the test.
55
+ - Never wait for networkidle or use other discouraged or deprecated apis
@@ -0,0 +1,9 @@
1
+ ---
2
+ agent: playwright-test-planner
3
+ description: Create test plan
4
+ ---
5
+
6
+ Create test plan for "add to cart" functionality of my app.
7
+
8
+ - Seed file: `${seedFile}`
9
+ - Test plan: `specs/coverage.plan.md`
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: playwright-test-planner
3
+ description: Use this agent when you need to create comprehensive test plan for a web application or website
4
+ model: sonnet
5
+ color: green
6
+ tools:
7
+ - search
8
+ - edit
9
+ - playwright-test/browser_click
10
+ - playwright-test/browser_close
11
+ - playwright-test/browser_console_messages
12
+ - playwright-test/browser_drag
13
+ - playwright-test/browser_evaluate
14
+ - playwright-test/browser_file_upload
15
+ - playwright-test/browser_handle_dialog
16
+ - playwright-test/browser_hover
17
+ - playwright-test/browser_navigate
18
+ - playwright-test/browser_navigate_back
19
+ - playwright-test/browser_network_requests
20
+ - playwright-test/browser_press_key
21
+ - playwright-test/browser_select_option
22
+ - playwright-test/browser_snapshot
23
+ - playwright-test/browser_take_screenshot
24
+ - playwright-test/browser_type
25
+ - playwright-test/browser_wait_for
26
+ - playwright-test/planner_setup_page
27
+ ---
28
+
29
+ You are an expert web test planner with extensive experience in quality assurance, user experience testing, and test
30
+ scenario design. Your expertise includes functional testing, edge case identification, and comprehensive test coverage
31
+ planning.
32
+
33
+ You will:
34
+
35
+ 1. **Navigate and Explore**
36
+ - Invoke the `planner_setup_page` tool once to set up page before using any other tools
37
+ - Explore the browser snapshot
38
+ - Do not take screenshots unless absolutely necessary
39
+ - Use `browser_*` tools to navigate and discover interface
40
+ - Thoroughly explore the interface, identifying all interactive elements, forms, navigation paths, and functionality
41
+
42
+ 2. **Analyze User Flows**
43
+ - Map out the primary user journeys and identify critical paths through the application
44
+ - Consider different user types and their typical behaviors
45
+
46
+ 3. **Design Comprehensive Scenarios**
47
+
48
+ Create detailed test scenarios that cover:
49
+ - Happy path scenarios (normal user behavior)
50
+ - Edge cases and boundary conditions
51
+ - Error handling and validation
52
+
53
+ 4. **Structure Test Plans**
54
+
55
+ Each scenario must include:
56
+ - Clear, descriptive title
57
+ - Detailed step-by-step instructions
58
+ - Expected outcomes where appropriate
59
+ - Assumptions about starting state (always assume blank/fresh state)
60
+ - Success criteria and failure conditions
61
+
62
+ 5. **Create Documentation**
63
+
64
+ Save your test plan as requested:
65
+ - Executive summary of the tested page/application
66
+ - Individual scenarios as separate sections
67
+ - Each scenario formatted with numbered steps
68
+ - Each test case with proposed file name for implementation
69
+ - Clear expected results for verification
70
+
71
+ <example-spec>
72
+ # TodoMVC Application - Comprehensive Test Plan
73
+
74
+ ## Application Overview
75
+
76
+ The TodoMVC application is a React-based todo list manager that provides core task management functionality. The
77
+ application features:
78
+
79
+ - **Task Management**: Add, edit, complete, and delete individual todos
80
+ - **Bulk Operations**: Mark all todos as complete/incomplete and clear all completed todos
81
+ - **Filtering**: View todos by All, Active, or Completed status
82
+ - **URL Routing**: Support for direct navigation to filtered views via URLs
83
+ - **Counter Display**: Real-time count of active (incomplete) todos
84
+ - **Persistence**: State maintained during session (browser refresh behavior not tested)
85
+
86
+ ## Test Scenarios
87
+
88
+ ### 1. Adding New Todos
89
+
90
+ **Seed:** `tests/seed.spec.ts`
91
+
92
+ #### 1.1 Add Valid Todo
93
+
94
+ **File** `tests/adding-new-todos/add-valid-todo.spec.ts`
95
+
96
+ **Steps:**
97
+ 1. Click in the "What needs to be done?" input field
98
+ 2. Type "Buy groceries"
99
+ 3. Press Enter key
100
+
101
+ **Expected Results:**
102
+ - Todo appears in the list with unchecked checkbox
103
+ - Counter shows "1 item left"
104
+ - Input field is cleared and ready for next entry
105
+ - Todo list controls become visible (Mark all as complete checkbox)
106
+
107
+ #### 1.2
108
+ ...
109
+ </example-spec>
110
+
111
+ **Quality Standards**:
112
+ - Write steps that are specific enough for any tester to follow
113
+ - Include negative testing scenarios
114
+ - Ensure scenarios are independent and can be run in any order
115
+
116
+ **Output Format**: Always save the complete test plan as a markdown file with clear headings, numbered steps, and
117
+ professional formatting suitable for sharing with development and QA teams.
@@ -0,0 +1,280 @@
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 config_exports = {};
30
+ __export(config_exports, {
31
+ FullConfigInternal: () => FullConfigInternal,
32
+ FullProjectInternal: () => FullProjectInternal,
33
+ builtInReporters: () => builtInReporters,
34
+ defaultGrep: () => defaultGrep,
35
+ defaultReporter: () => defaultReporter,
36
+ defaultTimeout: () => defaultTimeout,
37
+ getProjectId: () => getProjectId,
38
+ takeFirst: () => takeFirst,
39
+ toReporters: () => toReporters
40
+ });
41
+ module.exports = __toCommonJS(config_exports);
42
+ var import_fs = __toESM(require("fs"));
43
+ var import_os = __toESM(require("os"));
44
+ var import_path = __toESM(require("path"));
45
+ var import_util = require("../util");
46
+ const defaultTimeout = 3e4;
47
+ class FullConfigInternal {
48
+ constructor(location, userConfig, configCLIOverrides, metadata) {
49
+ this.projects = [];
50
+ this.cliArgs = [];
51
+ this.cliListOnly = false;
52
+ this.preOnlyTestFilters = [];
53
+ this.postShardTestFilters = [];
54
+ this.defineConfigWasUsed = false;
55
+ this.globalSetups = [];
56
+ this.globalTeardowns = [];
57
+ if (configCLIOverrides.projects && userConfig.projects)
58
+ throw new Error(`Cannot use --browser option when configuration file defines projects. Specify browserName in the projects instead.`);
59
+ const { resolvedConfigFile, configDir } = location;
60
+ const packageJsonPath = (0, import_util.getPackageJsonPath)(configDir);
61
+ const packageJsonDir = packageJsonPath ? import_path.default.dirname(packageJsonPath) : process.cwd();
62
+ this.configDir = configDir;
63
+ this.configCLIOverrides = configCLIOverrides;
64
+ const privateConfiguration = userConfig["@playwright/test"];
65
+ this.plugins = (privateConfiguration?.plugins || []).map((p) => ({ factory: p }));
66
+ this.singleTSConfigPath = pathResolve(configDir, userConfig.tsconfig);
67
+ this.captureGitInfo = userConfig.captureGitInfo;
68
+ this.failOnFlakyTests = takeFirst(configCLIOverrides.failOnFlakyTests, userConfig.failOnFlakyTests, false);
69
+ this.globalSetups = (Array.isArray(userConfig.globalSetup) ? userConfig.globalSetup : [userConfig.globalSetup]).map((s) => resolveScript(s, configDir)).filter((script) => script !== void 0);
70
+ this.globalTeardowns = (Array.isArray(userConfig.globalTeardown) ? userConfig.globalTeardown : [userConfig.globalTeardown]).map((s) => resolveScript(s, configDir)).filter((script) => script !== void 0);
71
+ userConfig.metadata = userConfig.metadata || {};
72
+ const globalTags = Array.isArray(userConfig.tag) ? userConfig.tag : userConfig.tag ? [userConfig.tag] : [];
73
+ for (const tag of globalTags) {
74
+ if (tag[0] !== "@")
75
+ throw new Error(`Tag must start with "@" symbol, got "${tag}" instead.`);
76
+ }
77
+ this.config = {
78
+ configFile: resolvedConfigFile,
79
+ rootDir: pathResolve(configDir, userConfig.testDir) || configDir,
80
+ forbidOnly: takeFirst(configCLIOverrides.forbidOnly, userConfig.forbidOnly, false),
81
+ fullyParallel: takeFirst(configCLIOverrides.fullyParallel, userConfig.fullyParallel, false),
82
+ globalSetup: this.globalSetups[0] ?? null,
83
+ globalTeardown: this.globalTeardowns[0] ?? null,
84
+ globalTimeout: takeFirst(configCLIOverrides.debug ? 0 : void 0, configCLIOverrides.globalTimeout, userConfig.globalTimeout, 0),
85
+ grep: takeFirst(userConfig.grep, defaultGrep),
86
+ grepInvert: takeFirst(userConfig.grepInvert, null),
87
+ maxFailures: takeFirst(configCLIOverrides.debug ? 1 : void 0, configCLIOverrides.maxFailures, userConfig.maxFailures, 0),
88
+ metadata: metadata ?? userConfig.metadata,
89
+ preserveOutput: takeFirst(userConfig.preserveOutput, "always"),
90
+ reporter: takeFirst(configCLIOverrides.reporter, resolveReporters(userConfig.reporter, configDir), [[defaultReporter]]),
91
+ reportSlowTests: takeFirst(userConfig.reportSlowTests, {
92
+ max: 5,
93
+ threshold: 3e5
94
+ /* 5 minutes */
95
+ }),
96
+ quiet: takeFirst(configCLIOverrides.quiet, userConfig.quiet, false),
97
+ projects: [],
98
+ shard: takeFirst(configCLIOverrides.shard, userConfig.shard, null),
99
+ tags: globalTags,
100
+ updateSnapshots: takeFirst(configCLIOverrides.updateSnapshots, userConfig.updateSnapshots, "missing"),
101
+ updateSourceMethod: takeFirst(configCLIOverrides.updateSourceMethod, userConfig.updateSourceMethod, "patch"),
102
+ version: require("../../package.json").version,
103
+ workers: resolveWorkers(takeFirst(configCLIOverrides.debug ? 1 : void 0, configCLIOverrides.workers, userConfig.workers, "50%")),
104
+ webServer: null
105
+ };
106
+ for (const key in userConfig) {
107
+ if (key.startsWith("@"))
108
+ this.config[key] = userConfig[key];
109
+ }
110
+ this.config[configInternalSymbol] = this;
111
+ const webServers = takeFirst(userConfig.webServer, null);
112
+ if (Array.isArray(webServers)) {
113
+ this.config.webServer = null;
114
+ this.webServers = webServers;
115
+ } else if (webServers) {
116
+ this.config.webServer = webServers;
117
+ this.webServers = [webServers];
118
+ } else {
119
+ this.webServers = [];
120
+ }
121
+ const projectConfigs = configCLIOverrides.projects || userConfig.projects || [{ ...userConfig, workers: void 0 }];
122
+ this.projects = projectConfigs.map((p) => new FullProjectInternal(configDir, userConfig, this, p, this.configCLIOverrides, packageJsonDir));
123
+ resolveProjectDependencies(this.projects);
124
+ this._assignUniqueProjectIds(this.projects);
125
+ this.config.projects = this.projects.map((p) => p.project);
126
+ }
127
+ _assignUniqueProjectIds(projects) {
128
+ const usedNames = /* @__PURE__ */ new Set();
129
+ for (const p of projects) {
130
+ const name = p.project.name || "";
131
+ for (let i = 0; i < projects.length; ++i) {
132
+ const candidate = name + (i ? i : "");
133
+ if (usedNames.has(candidate))
134
+ continue;
135
+ p.id = candidate;
136
+ p.project.__projectId = p.id;
137
+ usedNames.add(candidate);
138
+ break;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ class FullProjectInternal {
144
+ constructor(configDir, config, fullConfig, projectConfig, configCLIOverrides, packageJsonDir) {
145
+ this.id = "";
146
+ this.deps = [];
147
+ this.fullConfig = fullConfig;
148
+ const testDir = takeFirst(pathResolve(configDir, projectConfig.testDir), pathResolve(configDir, config.testDir), fullConfig.configDir);
149
+ this.snapshotPathTemplate = takeFirst(projectConfig.snapshotPathTemplate, config.snapshotPathTemplate);
150
+ this.project = {
151
+ grep: takeFirst(projectConfig.grep, config.grep, defaultGrep),
152
+ grepInvert: takeFirst(projectConfig.grepInvert, config.grepInvert, null),
153
+ outputDir: takeFirst(configCLIOverrides.outputDir, pathResolve(configDir, projectConfig.outputDir), pathResolve(configDir, config.outputDir), import_path.default.join(packageJsonDir, "test-results")),
154
+ // Note: we either apply the cli override for repeatEach or not, depending on whether the
155
+ // project is top-level vs dependency. See collectProjectsAndTestFiles in loadUtils.
156
+ repeatEach: takeFirst(projectConfig.repeatEach, config.repeatEach, 1),
157
+ retries: takeFirst(configCLIOverrides.retries, projectConfig.retries, config.retries, 0),
158
+ metadata: takeFirst(projectConfig.metadata, config.metadata, {}),
159
+ name: takeFirst(projectConfig.name, config.name, ""),
160
+ testDir,
161
+ snapshotDir: takeFirst(pathResolve(configDir, projectConfig.snapshotDir), pathResolve(configDir, config.snapshotDir), testDir),
162
+ testIgnore: takeFirst(projectConfig.testIgnore, config.testIgnore, []),
163
+ testMatch: takeFirst(projectConfig.testMatch, config.testMatch, "**/*.@(spec|test).?(c|m)[jt]s?(x)"),
164
+ timeout: takeFirst(configCLIOverrides.debug ? 0 : void 0, configCLIOverrides.timeout, projectConfig.timeout, config.timeout, defaultTimeout),
165
+ use: (0, import_util.mergeObjects)(config.use, projectConfig.use, configCLIOverrides.use),
166
+ dependencies: projectConfig.dependencies || [],
167
+ teardown: projectConfig.teardown
168
+ };
169
+ this.fullyParallel = takeFirst(configCLIOverrides.fullyParallel, projectConfig.fullyParallel, config.fullyParallel, void 0);
170
+ this.expect = takeFirst(projectConfig.expect, config.expect, {});
171
+ if (this.expect.toHaveScreenshot?.stylePath) {
172
+ const stylePaths = Array.isArray(this.expect.toHaveScreenshot.stylePath) ? this.expect.toHaveScreenshot.stylePath : [this.expect.toHaveScreenshot.stylePath];
173
+ this.expect.toHaveScreenshot.stylePath = stylePaths.map((stylePath) => import_path.default.resolve(configDir, stylePath));
174
+ }
175
+ this.respectGitIgnore = takeFirst(projectConfig.respectGitIgnore, config.respectGitIgnore, !projectConfig.testDir && !config.testDir);
176
+ this.ignoreSnapshots = takeFirst(configCLIOverrides.ignoreSnapshots, projectConfig.ignoreSnapshots, config.ignoreSnapshots, false);
177
+ this.workers = projectConfig.workers ? resolveWorkers(projectConfig.workers) : void 0;
178
+ if (configCLIOverrides.debug && this.workers)
179
+ this.workers = 1;
180
+ }
181
+ }
182
+ function takeFirst(...args) {
183
+ for (const arg of args) {
184
+ if (arg !== void 0)
185
+ return arg;
186
+ }
187
+ return void 0;
188
+ }
189
+ function pathResolve(baseDir, relative) {
190
+ if (!relative)
191
+ return void 0;
192
+ return import_path.default.resolve(baseDir, relative);
193
+ }
194
+ function resolveReporters(reporters, rootDir) {
195
+ return toReporters(reporters)?.map(([id, arg]) => {
196
+ if (builtInReporters.includes(id))
197
+ return [id, arg];
198
+ return [require.resolve(id, { paths: [rootDir] }), arg];
199
+ });
200
+ }
201
+ function resolveWorkers(workers) {
202
+ if (typeof workers === "string") {
203
+ if (workers.endsWith("%")) {
204
+ const cpus = import_os.default.cpus().length;
205
+ return Math.max(1, Math.floor(cpus * (parseInt(workers, 10) / 100)));
206
+ }
207
+ const parsedWorkers = parseInt(workers, 10);
208
+ if (isNaN(parsedWorkers))
209
+ throw new Error(`Workers ${workers} must be a number or percentage.`);
210
+ return parsedWorkers;
211
+ }
212
+ return workers;
213
+ }
214
+ function resolveProjectDependencies(projects) {
215
+ const teardownSet = /* @__PURE__ */ new Set();
216
+ for (const project of projects) {
217
+ for (const dependencyName of project.project.dependencies) {
218
+ const dependencies = projects.filter((p) => p.project.name === dependencyName);
219
+ if (!dependencies.length)
220
+ throw new Error(`Project '${project.project.name}' depends on unknown project '${dependencyName}'`);
221
+ if (dependencies.length > 1)
222
+ throw new Error(`Project dependencies should have unique names, reading ${dependencyName}`);
223
+ project.deps.push(...dependencies);
224
+ }
225
+ if (project.project.teardown) {
226
+ const teardowns = projects.filter((p) => p.project.name === project.project.teardown);
227
+ if (!teardowns.length)
228
+ throw new Error(`Project '${project.project.name}' has unknown teardown project '${project.project.teardown}'`);
229
+ if (teardowns.length > 1)
230
+ throw new Error(`Project teardowns should have unique names, reading ${project.project.teardown}`);
231
+ const teardown = teardowns[0];
232
+ project.teardown = teardown;
233
+ teardownSet.add(teardown);
234
+ }
235
+ }
236
+ for (const teardown of teardownSet) {
237
+ if (teardown.deps.length)
238
+ throw new Error(`Teardown project ${teardown.project.name} must not have dependencies`);
239
+ }
240
+ for (const project of projects) {
241
+ for (const dep of project.deps) {
242
+ if (teardownSet.has(dep))
243
+ throw new Error(`Project ${project.project.name} must not depend on a teardown project ${dep.project.name}`);
244
+ }
245
+ }
246
+ }
247
+ function toReporters(reporters) {
248
+ if (!reporters)
249
+ return;
250
+ if (typeof reporters === "string")
251
+ return [[reporters]];
252
+ return reporters;
253
+ }
254
+ const builtInReporters = ["list", "line", "dot", "json", "junit", "null", "github", "html", "blob"];
255
+ function resolveScript(id, rootDir) {
256
+ if (!id)
257
+ return void 0;
258
+ const localPath = import_path.default.resolve(rootDir, id);
259
+ if (import_fs.default.existsSync(localPath))
260
+ return localPath;
261
+ return require.resolve(id, { paths: [rootDir] });
262
+ }
263
+ const defaultGrep = /.*/;
264
+ const defaultReporter = process.env.CI ? "dot" : "list";
265
+ const configInternalSymbol = Symbol("configInternalSymbol");
266
+ function getProjectId(project) {
267
+ return project.__projectId;
268
+ }
269
+ // Annotate the CommonJS export names for ESM import in node:
270
+ 0 && (module.exports = {
271
+ FullConfigInternal,
272
+ FullProjectInternal,
273
+ builtInReporters,
274
+ defaultGrep,
275
+ defaultReporter,
276
+ defaultTimeout,
277
+ getProjectId,
278
+ takeFirst,
279
+ toReporters
280
+ });
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/common/config.ts"],
4
+ "sourcesContent": ["/**\n * Copyright Microsoft Corporation. All rights reserved.\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\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { getPackageJsonPath, mergeObjects } from '../util';\n\nimport type { Config, Fixtures, Metadata, Project, ReporterDescription } from '../../types/test';\nimport type { TestRunnerPluginRegistration } from '../plugins';\nimport type { TestCaseFilter } from '../util';\nimport type { ConfigCLIOverrides } from './ipc';\nimport type { Location } from '../../types/testReporter';\nimport type { FullConfig, FullProject } from '../../types/testReporter';\n\nexport type ConfigLocation = {\n resolvedConfigFile?: string;\n configDir: string;\n};\n\nexport type FixturesWithLocation = {\n fixtures: Fixtures;\n location: Location;\n};\n\nexport const defaultTimeout = 30000;\n\nexport class FullConfigInternal {\n readonly config: FullConfig;\n readonly configDir: string;\n readonly configCLIOverrides: ConfigCLIOverrides;\n readonly webServers: NonNullable<FullConfig['webServer']>[];\n readonly plugins: TestRunnerPluginRegistration[];\n readonly projects: FullProjectInternal[] = [];\n readonly singleTSConfigPath?: string;\n readonly captureGitInfo: Config['captureGitInfo'];\n readonly failOnFlakyTests: boolean;\n cliArgs: string[] = [];\n cliGrep: string | undefined;\n cliGrepInvert: string | undefined;\n cliOnlyChanged: string | undefined;\n cliProjectFilter?: string[];\n cliListOnly = false;\n cliPassWithNoTests?: boolean;\n cliLastFailed?: boolean;\n cliTestList?: string;\n cliTestListInvert?: string;\n preOnlyTestFilters: TestCaseFilter[] = [];\n postShardTestFilters: TestCaseFilter[] = [];\n defineConfigWasUsed = false;\n\n globalSetups: string[] = [];\n globalTeardowns: string[] = [];\n\n constructor(location: ConfigLocation, userConfig: Config, configCLIOverrides: ConfigCLIOverrides, metadata?: Metadata) {\n if (configCLIOverrides.projects && userConfig.projects)\n throw new Error(`Cannot use --browser option when configuration file defines projects. Specify browserName in the projects instead.`);\n\n const { resolvedConfigFile, configDir } = location;\n const packageJsonPath = getPackageJsonPath(configDir);\n const packageJsonDir = packageJsonPath ? path.dirname(packageJsonPath) : process.cwd();\n\n this.configDir = configDir;\n this.configCLIOverrides = configCLIOverrides;\n const privateConfiguration = (userConfig as any)['@playwright/test'];\n this.plugins = (privateConfiguration?.plugins || []).map((p: any) => ({ factory: p }));\n this.singleTSConfigPath = pathResolve(configDir, userConfig.tsconfig);\n this.captureGitInfo = userConfig.captureGitInfo;\n this.failOnFlakyTests = takeFirst(configCLIOverrides.failOnFlakyTests, userConfig.failOnFlakyTests, false);\n\n this.globalSetups = (Array.isArray(userConfig.globalSetup) ? userConfig.globalSetup : [userConfig.globalSetup]).map(s => resolveScript(s, configDir)).filter(script => script !== undefined);\n this.globalTeardowns = (Array.isArray(userConfig.globalTeardown) ? userConfig.globalTeardown : [userConfig.globalTeardown]).map(s => resolveScript(s, configDir)).filter(script => script !== undefined);\n\n // Make sure we reuse same metadata instance between FullConfigInternal instances,\n // so that plugins such as gitCommitInfoPlugin can populate metadata once.\n userConfig.metadata = userConfig.metadata || {};\n\n const globalTags = Array.isArray(userConfig.tag) ? userConfig.tag : (userConfig.tag ? [userConfig.tag] : []);\n for (const tag of globalTags) {\n if (tag[0] !== '@')\n throw new Error(`Tag must start with \"@\" symbol, got \"${tag}\" instead.`);\n }\n\n this.config = {\n configFile: resolvedConfigFile,\n rootDir: pathResolve(configDir, userConfig.testDir) || configDir,\n forbidOnly: takeFirst(configCLIOverrides.forbidOnly, userConfig.forbidOnly, false),\n fullyParallel: takeFirst(configCLIOverrides.fullyParallel, userConfig.fullyParallel, false),\n globalSetup: this.globalSetups[0] ?? null,\n globalTeardown: this.globalTeardowns[0] ?? null,\n globalTimeout: takeFirst(configCLIOverrides.debug ? 0 : undefined, configCLIOverrides.globalTimeout, userConfig.globalTimeout, 0),\n grep: takeFirst(userConfig.grep, defaultGrep),\n grepInvert: takeFirst(userConfig.grepInvert, null),\n maxFailures: takeFirst(configCLIOverrides.debug ? 1 : undefined, configCLIOverrides.maxFailures, userConfig.maxFailures, 0),\n metadata: metadata ?? userConfig.metadata,\n preserveOutput: takeFirst(userConfig.preserveOutput, 'always'),\n reporter: takeFirst(configCLIOverrides.reporter, resolveReporters(userConfig.reporter, configDir), [[defaultReporter]]),\n reportSlowTests: takeFirst(userConfig.reportSlowTests, { max: 5, threshold: 300_000 /* 5 minutes */ }),\n quiet: takeFirst(configCLIOverrides.quiet, userConfig.quiet, false),\n projects: [],\n shard: takeFirst(configCLIOverrides.shard, userConfig.shard, null),\n tags: globalTags,\n updateSnapshots: takeFirst(configCLIOverrides.updateSnapshots, userConfig.updateSnapshots, 'missing'),\n updateSourceMethod: takeFirst(configCLIOverrides.updateSourceMethod, userConfig.updateSourceMethod, 'patch'),\n version: require('../../package.json').version,\n workers: resolveWorkers(takeFirst(configCLIOverrides.debug ? 1 : undefined, configCLIOverrides.workers, userConfig.workers, '50%')),\n webServer: null,\n };\n for (const key in userConfig) {\n if (key.startsWith('@'))\n (this.config as any)[key] = (userConfig as any)[key];\n }\n\n (this.config as any)[configInternalSymbol] = this;\n\n const webServers = takeFirst(userConfig.webServer, null);\n if (Array.isArray(webServers)) { // multiple web server mode\n // Due to previous choices, this value shows up to the user in globalSetup as part of FullConfig. Arrays are not supported by the old type.\n this.config.webServer = null;\n this.webServers = webServers;\n } else if (webServers) { // legacy singleton mode\n this.config.webServer = webServers;\n this.webServers = [webServers];\n } else {\n this.webServers = [];\n }\n\n // When no projects are defined, do not use config.workers as a hard limit for project.workers.\n const projectConfigs = configCLIOverrides.projects || userConfig.projects || [{ ...userConfig, workers: undefined }];\n this.projects = projectConfigs.map(p => new FullProjectInternal(configDir, userConfig, this, p, this.configCLIOverrides, packageJsonDir));\n resolveProjectDependencies(this.projects);\n this._assignUniqueProjectIds(this.projects);\n this.config.projects = this.projects.map(p => p.project);\n }\n\n private _assignUniqueProjectIds(projects: FullProjectInternal[]) {\n const usedNames = new Set();\n for (const p of projects) {\n const name = p.project.name || '';\n for (let i = 0; i < projects.length; ++i) {\n const candidate = name + (i ? i : '');\n if (usedNames.has(candidate))\n continue;\n p.id = candidate;\n (p.project as any).__projectId = p.id;\n usedNames.add(candidate);\n break;\n }\n }\n }\n}\n\nexport class FullProjectInternal {\n readonly project: FullProject;\n readonly fullConfig: FullConfigInternal;\n readonly fullyParallel: boolean;\n readonly expect: Project['expect'];\n readonly respectGitIgnore: boolean;\n readonly snapshotPathTemplate: string | undefined;\n readonly ignoreSnapshots: boolean;\n readonly workers: number | undefined;\n id = '';\n deps: FullProjectInternal[] = [];\n teardown: FullProjectInternal | undefined;\n\n constructor(configDir: string, config: Config, fullConfig: FullConfigInternal, projectConfig: Project, configCLIOverrides: ConfigCLIOverrides, packageJsonDir: string) {\n this.fullConfig = fullConfig;\n const testDir = takeFirst(pathResolve(configDir, projectConfig.testDir), pathResolve(configDir, config.testDir), fullConfig.configDir);\n this.snapshotPathTemplate = takeFirst(projectConfig.snapshotPathTemplate, config.snapshotPathTemplate);\n\n this.project = {\n grep: takeFirst(projectConfig.grep, config.grep, defaultGrep),\n grepInvert: takeFirst(projectConfig.grepInvert, config.grepInvert, null),\n outputDir: takeFirst(configCLIOverrides.outputDir, pathResolve(configDir, projectConfig.outputDir), pathResolve(configDir, config.outputDir), path.join(packageJsonDir, 'test-results')),\n // Note: we either apply the cli override for repeatEach or not, depending on whether the\n // project is top-level vs dependency. See collectProjectsAndTestFiles in loadUtils.\n repeatEach: takeFirst(projectConfig.repeatEach, config.repeatEach, 1),\n retries: takeFirst(configCLIOverrides.retries, projectConfig.retries, config.retries, 0),\n metadata: takeFirst(projectConfig.metadata, config.metadata, {}),\n name: takeFirst(projectConfig.name, config.name, ''),\n testDir,\n snapshotDir: takeFirst(pathResolve(configDir, projectConfig.snapshotDir), pathResolve(configDir, config.snapshotDir), testDir),\n testIgnore: takeFirst(projectConfig.testIgnore, config.testIgnore, []),\n testMatch: takeFirst(projectConfig.testMatch, config.testMatch, '**/*.@(spec|test).?(c|m)[jt]s?(x)'),\n timeout: takeFirst(configCLIOverrides.debug ? 0 : undefined, configCLIOverrides.timeout, projectConfig.timeout, config.timeout, defaultTimeout),\n use: mergeObjects(config.use, projectConfig.use, configCLIOverrides.use),\n dependencies: projectConfig.dependencies || [],\n teardown: projectConfig.teardown,\n };\n this.fullyParallel = takeFirst(configCLIOverrides.fullyParallel, projectConfig.fullyParallel, config.fullyParallel, undefined);\n this.expect = takeFirst(projectConfig.expect, config.expect, {});\n if (this.expect.toHaveScreenshot?.stylePath) {\n const stylePaths = Array.isArray(this.expect.toHaveScreenshot.stylePath) ? this.expect.toHaveScreenshot.stylePath : [this.expect.toHaveScreenshot.stylePath];\n this.expect.toHaveScreenshot.stylePath = stylePaths.map(stylePath => path.resolve(configDir, stylePath));\n }\n this.respectGitIgnore = takeFirst(projectConfig.respectGitIgnore, config.respectGitIgnore, !projectConfig.testDir && !config.testDir);\n this.ignoreSnapshots = takeFirst(configCLIOverrides.ignoreSnapshots, projectConfig.ignoreSnapshots, config.ignoreSnapshots, false);\n this.workers = projectConfig.workers ? resolveWorkers(projectConfig.workers) : undefined;\n if (configCLIOverrides.debug && this.workers)\n this.workers = 1;\n }\n}\n\nexport function takeFirst<T>(...args: (T | undefined)[]): T {\n for (const arg of args) {\n if (arg !== undefined)\n return arg;\n }\n return undefined as any as T;\n}\n\nfunction pathResolve(baseDir: string, relative: string | undefined): string | undefined {\n if (!relative)\n return undefined;\n return path.resolve(baseDir, relative);\n}\n\nfunction resolveReporters(reporters: Config['reporter'], rootDir: string): ReporterDescription[] | undefined {\n return toReporters(reporters as any)?.map(([id, arg]) => {\n if (builtInReporters.includes(id as any))\n return [id, arg];\n return [require.resolve(id, { paths: [rootDir] }), arg];\n });\n}\n\nfunction resolveWorkers(workers: string | number): number {\n if (typeof workers === 'string') {\n if (workers.endsWith('%')) {\n const cpus = os.cpus().length;\n return Math.max(1, Math.floor(cpus * (parseInt(workers, 10) / 100)));\n }\n const parsedWorkers = parseInt(workers, 10);\n if (isNaN(parsedWorkers))\n throw new Error(`Workers ${workers} must be a number or percentage.`);\n return parsedWorkers;\n }\n return workers;\n}\n\nfunction resolveProjectDependencies(projects: FullProjectInternal[]) {\n const teardownSet = new Set<FullProjectInternal>();\n for (const project of projects) {\n for (const dependencyName of project.project.dependencies) {\n const dependencies = projects.filter(p => p.project.name === dependencyName);\n if (!dependencies.length)\n throw new Error(`Project '${project.project.name}' depends on unknown project '${dependencyName}'`);\n if (dependencies.length > 1)\n throw new Error(`Project dependencies should have unique names, reading ${dependencyName}`);\n project.deps.push(...dependencies);\n }\n if (project.project.teardown) {\n const teardowns = projects.filter(p => p.project.name === project.project.teardown);\n if (!teardowns.length)\n throw new Error(`Project '${project.project.name}' has unknown teardown project '${project.project.teardown}'`);\n if (teardowns.length > 1)\n throw new Error(`Project teardowns should have unique names, reading ${project.project.teardown}`);\n const teardown = teardowns[0];\n project.teardown = teardown;\n teardownSet.add(teardown);\n }\n }\n for (const teardown of teardownSet) {\n if (teardown.deps.length)\n throw new Error(`Teardown project ${teardown.project.name} must not have dependencies`);\n }\n for (const project of projects) {\n for (const dep of project.deps) {\n if (teardownSet.has(dep))\n throw new Error(`Project ${project.project.name} must not depend on a teardown project ${dep.project.name}`);\n }\n }\n}\n\nexport function toReporters(reporters: BuiltInReporter | ReporterDescription[] | undefined): ReporterDescription[] | undefined {\n if (!reporters)\n return;\n if (typeof reporters === 'string')\n return [[reporters]];\n return reporters;\n}\n\nexport const builtInReporters = ['list', 'line', 'dot', 'json', 'junit', 'null', 'github', 'html', 'blob'] as const;\nexport type BuiltInReporter = typeof builtInReporters[number];\n\nexport type ContextReuseMode = 'none' | 'when-possible';\n\nfunction resolveScript(id: string | undefined, rootDir: string): string | undefined {\n if (!id)\n return undefined;\n const localPath = path.resolve(rootDir, id);\n if (fs.existsSync(localPath))\n return localPath;\n return require.resolve(id, { paths: [rootDir] });\n}\n\nexport const defaultGrep = /.*/;\nexport const defaultReporter = process.env.CI ? 'dot' : 'list';\n\nconst configInternalSymbol = Symbol('configInternalSymbol');\n\nexport function getProjectId(project: FullProject): string {\n return (project as any).__projectId!;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["path", "os", "fs"]
7
+ }