@checkly/playwright-core 1.48.21 → 1.48.22-beta.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 (185) hide show
  1. package/lib/cli/cli.js +61 -0
  2. package/lib/common/debugLogger.js +90 -0
  3. package/lib/generated/clockSource.js +2 -1
  4. package/lib/generated/consoleApiSource.js +2 -1
  5. package/lib/generated/injectedScriptSource.js +2 -1
  6. package/lib/generated/pollingRecorderSource.js +2 -1
  7. package/lib/generated/recorderSource.js +1 -1
  8. package/lib/generated/utilityScriptSource.js +2 -1
  9. package/lib/generated/webSocketMockSource.js +2 -1
  10. package/lib/server/recorder/java.js +4 -36
  11. package/lib/server/trace/recorder/tracing.js +22 -17
  12. package/lib/vite/{traceViewer/assets/codeMirrorModule-U6XMqGkV.js → recorder/assets/codeMirrorModule--bQcPrZ2.js} +2 -2
  13. package/lib/vite/recorder/assets/codeMirrorModule-Cy8X9Wtw.css +344 -0
  14. package/lib/vite/recorder/assets/index-BMeslH8X.js +9946 -0
  15. package/lib/vite/recorder/assets/index-BjXmTggo.css +2515 -0
  16. package/lib/vite/recorder/index.html +2 -2
  17. package/lib/vite/traceViewer/assets/codeMirrorModule-75b0ca4f.js +24 -0
  18. package/lib/vite/traceViewer/assets/codeMirrorModule-CBokkFJ2.js +16431 -0
  19. package/lib/vite/traceViewer/assets/codeMirrorModule-CNHvVrFd.js +16437 -0
  20. package/lib/vite/traceViewer/assets/{codeMirrorModule-BdBhzV6t.js → codeMirrorModule-CpGx_S8D.js} +2 -2
  21. package/lib/vite/traceViewer/assets/codeMirrorModule-SomGa-Da.js +16443 -0
  22. package/lib/vite/traceViewer/assets/codeMirrorModule-c1454a2e.js +24 -0
  23. package/lib/vite/traceViewer/assets/codeMirrorModule-c9bb9834.js +24 -0
  24. package/lib/vite/traceViewer/assets/{codeMirrorModule-Dx6AXgMV.js → codeMirrorModule-cc2329e4.js} +11 -1256
  25. package/lib/vite/traceViewer/assets/codeMirrorModule-d2cc7db0.js +15579 -0
  26. package/lib/vite/traceViewer/assets/codeMirrorModule-da915a35.js +15586 -0
  27. package/lib/vite/traceViewer/assets/{codeMirrorModule-CcviAl53.js → codeMirrorModule-f03b1a3e.js} +1118 -2370
  28. package/lib/vite/traceViewer/assets/codeMirrorModule-f333a775.js +24 -0
  29. package/lib/vite/traceViewer/assets/{codeMirrorModule-V7N6ppkd.js → codeMirrorModule-uWDlVSQz.js} +2 -2
  30. package/lib/vite/{recorder/assets/codeMirrorModule-d0KhC1qL.js → traceViewer/assets/codeMirrorModule-xvopPhZ4.js} +1 -1
  31. package/lib/vite/traceViewer/assets/{codeMirrorModule-BqcXH1AO.js → codeMirrorModule-yboVpgC0.js} +2 -1248
  32. package/lib/vite/traceViewer/assets/{inspectorTab-DpvLVMq5.js → inspectorTab-B4ynvyY9.js} +18 -8
  33. package/lib/vite/traceViewer/assets/{inspectorTab-BPzVEZSf.js → inspectorTab-BqBvUFio.js} +18 -8
  34. package/lib/vite/traceViewer/assets/{workbench-Bjkiwcr1.js → inspectorTab-Dw0Gnh1T.js} +1847 -3605
  35. package/lib/vite/traceViewer/assets/{inspectorTab-BABZNwlH.js → inspectorTab-Ywa000c9.js} +16 -6
  36. package/lib/vite/traceViewer/assets/{inspectorTab-BHcfR9dD.js → inspectorTab-wfvwpMHs.js} +2 -2
  37. package/lib/vite/traceViewer/assets/{workbench-BcgGQnKb.js → workbench-CROk6Fcc.js} +2 -2
  38. package/lib/vite/traceViewer/assets/{workbench-ByyWxoT8.js → workbench-CfXOj3eT.js} +2 -2
  39. package/lib/vite/traceViewer/assets/{workbench-DhqI6jeL.js → workbench-D9CTkv-4.js} +2 -2
  40. package/lib/vite/traceViewer/assets/{workbench-I4s6sWjN.js → workbench-DNolpp3y.js} +1 -1
  41. package/lib/vite/traceViewer/assets/workbench-DUc2iD0P.js +1473 -0
  42. package/lib/vite/traceViewer/assets/{workbench-B13nfocr.js → workbench-LKskf2Iy.js} +1 -1
  43. package/lib/vite/traceViewer/assets/workbench-dnZM5a7x.js +1473 -0
  44. package/lib/vite/traceViewer/assets/wsPort-54626118.js +18361 -0
  45. package/lib/vite/traceViewer/assets/{workbench-Crj6jzdv.js → wsPort-57f274c6.js} +4308 -5066
  46. package/lib/vite/traceViewer/assets/wsPort-762c6840.js +64 -0
  47. package/lib/vite/traceViewer/assets/wsPort-85286e61.js +18361 -0
  48. package/lib/vite/traceViewer/assets/wsPort-98e00a94.js +64 -0
  49. package/lib/vite/traceViewer/assets/{wsPort-EUvw-dwH.js → wsPort-CAXygIGt.js} +3 -3
  50. package/lib/vite/traceViewer/assets/{workbench-C5OQh9VX.js → wsPort-cc0077b5.js} +4046 -4623
  51. package/lib/vite/traceViewer/assets/wsPort-edfeeb7d.js +64 -0
  52. package/lib/vite/traceViewer/assets/wsPort-ee2830d7.js +64 -0
  53. package/lib/vite/traceViewer/assets/{workbench-BwodYCgl.js → wsPort-peeLnQhT.js} +985 -1540
  54. package/lib/vite/traceViewer/assets/xtermModule-443332e6.js +9 -0
  55. package/lib/vite/traceViewer/assets/xtermModule-60687b6b.js +6410 -0
  56. package/lib/vite/traceViewer/codeMirrorModule.5d0f417c.css +1 -0
  57. package/lib/vite/traceViewer/codeMirrorModule.eb494ea9.css +344 -0
  58. package/lib/vite/traceViewer/codicon.79f233d0.ttf +0 -0
  59. package/lib/vite/traceViewer/{embedded.27BGR_eD.js → embedded.6N1v7bZ1.js} +4 -3
  60. package/lib/vite/traceViewer/{embedded.DTjd2aiy.js → embedded.BOw0jX78.js} +4 -3
  61. package/lib/vite/traceViewer/{embedded.Dxe2heQk.js → embedded.BXYl5zRv.js} +1 -1
  62. package/lib/vite/traceViewer/{embedded.SsjKHrxC.js → embedded.BaqdbLsy.js} +4 -3
  63. package/lib/vite/traceViewer/embedded.CwwTDBzP.js +106 -0
  64. package/lib/vite/traceViewer/{embedded.Zu332ZC1.js → embedded.DeCrOtlO.js} +2 -2
  65. package/lib/vite/traceViewer/embedded.html +6 -6
  66. package/lib/vite/traceViewer/embedded.i_k4ceMJ.js +106 -0
  67. package/lib/vite/traceViewer/index.1a1fe659.css +1 -0
  68. package/lib/vite/traceViewer/index.1b525c1c.js +181 -0
  69. package/lib/vite/traceViewer/index.55e65778.js +181 -0
  70. package/lib/vite/traceViewer/{index.6KJ-JQ0L.js → index.5nqVcfiC.js} +2 -2
  71. package/lib/vite/traceViewer/{index.C0EgJ4oW.js → index.5ooko4n7.js} +21 -36
  72. package/lib/vite/traceViewer/index.76e9f312.css +124 -0
  73. package/lib/vite/traceViewer/{index.Dz3icWJV.js → index.Bugo2TbS.js} +4 -3
  74. package/lib/vite/traceViewer/{index.PqcsvBxQ.js → index.BzvnAP7t.js} +4 -3
  75. package/lib/vite/traceViewer/{index.CLxsp2W_.js → index.CM_h9lHr.js} +2 -2
  76. package/lib/vite/traceViewer/{index.yxAwzeWG.js → index.CY13pBr8.js} +4 -3
  77. package/lib/vite/traceViewer/index.DW2ZzZfL.js +197 -0
  78. package/lib/vite/traceViewer/{index.CB297BuW.js → index.DZkJsFod.js} +1 -1
  79. package/lib/vite/traceViewer/index.DblJtEW_.js +197 -0
  80. package/lib/vite/traceViewer/index.a265fbdb.js +2 -0
  81. package/lib/vite/traceViewer/index.c9f6fa8f.js +2 -0
  82. package/lib/vite/traceViewer/index.d86e70ca.js +181 -0
  83. package/lib/vite/traceViewer/index.decad628.js +2 -0
  84. package/lib/vite/traceViewer/index.e8730524.js +181 -0
  85. package/lib/vite/traceViewer/index.ed9a3c58.js +2 -0
  86. package/lib/vite/traceViewer/index.html +7 -7
  87. package/lib/vite/traceViewer/{recorder.BufKu9Hp.js → recorder.3Xfrl_zV.js} +3 -2
  88. package/lib/vite/traceViewer/{recorder.am-MV-DQ.js → recorder.B76AH9PE.js} +3 -2
  89. package/lib/vite/traceViewer/{recorder.C88JDknq.js → recorder.BVExlUUk.js} +1 -1
  90. package/lib/vite/traceViewer/{recorder.7Wl6HrQl.js → recorder.Db1aK_DY.js} +3 -2
  91. package/lib/vite/traceViewer/recorder.html +4 -4
  92. package/lib/vite/traceViewer/recorder.uj3cfoMf.js +551 -0
  93. package/lib/vite/traceViewer/uiMode.08ab2d90.js +4 -0
  94. package/lib/vite/traceViewer/uiMode.0d0d667b.js +4 -0
  95. package/lib/vite/traceViewer/uiMode.216233d5.js +1484 -0
  96. package/lib/vite/traceViewer/{uiMode.DVWUEIHq.css → uiMode.2c31018f.css} +88 -188
  97. package/lib/vite/traceViewer/uiMode.3ff70f7d.js +4 -0
  98. package/lib/vite/traceViewer/uiMode.4d0a45af.js +1484 -0
  99. package/lib/vite/traceViewer/uiMode.66eb0ce2.js +1484 -0
  100. package/lib/vite/traceViewer/uiMode.8b41a49d.css +1 -0
  101. package/lib/vite/traceViewer/uiMode.8d080c01.js +1486 -0
  102. package/lib/vite/traceViewer/uiMode.BKrDfnAk.js +1725 -0
  103. package/lib/vite/traceViewer/uiMode.BMYUvsRh.js +1725 -0
  104. package/lib/vite/traceViewer/{uiMode.BZoFj6zV.js → uiMode.BVpTBGoe.js} +4 -3
  105. package/lib/vite/traceViewer/uiMode.BWhJCEE9.js +1725 -0
  106. package/lib/vite/traceViewer/uiMode.Bg9fACTB.js +1725 -0
  107. package/lib/vite/traceViewer/{uiMode.CpC2B27N.js → uiMode.CYBsUhm_.js} +2 -2
  108. package/lib/vite/traceViewer/{uiMode.Dlo9s_YX.js → uiMode.DCSdxlAq.js} +4 -3
  109. package/lib/vite/traceViewer/{uiMode.2tr9k625.js → uiMode.DjTS7tqC.js} +1 -1
  110. package/lib/vite/traceViewer/{uiMode.wsGnVMQK.js → uiMode.DtleKuGI.js} +4 -3
  111. package/lib/vite/traceViewer/uiMode.UamAvOMX.js +1725 -0
  112. package/lib/vite/traceViewer/uiMode.bBcXYWNF.js +1725 -0
  113. package/lib/vite/traceViewer/uiMode.ca6ec898.js +4 -0
  114. package/lib/vite/traceViewer/{uiMode.iq7CyYy7.js → uiMode.e-PLonGl.js} +2 -2
  115. package/lib/vite/traceViewer/uiMode.e_-GuqEi.js +1725 -0
  116. package/lib/vite/traceViewer/uiMode.f1YADWIl.js +1724 -0
  117. package/lib/vite/traceViewer/uiMode.html +7 -7
  118. package/lib/vite/traceViewer/uiMode.kHsXCfV8.js +1490 -0
  119. package/lib/vite/traceViewer/uiMode.myF_lyEH.js +1724 -0
  120. package/lib/vite/traceViewer/{workbench.B3X2QtYa.css → wsPort.162042f9.css} +63 -315
  121. package/lib/vite/traceViewer/{workbench.wuxQoE2z.css → wsPort.997c92cf.css} +145 -335
  122. package/lib/vite/traceViewer/wsPort.9c9a6767.css +1 -0
  123. package/lib/vite/traceViewer/xtermModule.125f4259.css +191 -0
  124. package/lib/vite/traceViewer/xtermModule.6428296b.css +32 -0
  125. package/package.json +1 -1
  126. package/lib/vite/recorder/assets/codeMirrorModule-ez37Vkbh.css +0 -1
  127. package/lib/vite/recorder/assets/index-BW-aOBcL.css +0 -1
  128. package/lib/vite/recorder/assets/index-Bxxcmxlu.js +0 -42
  129. package/lib/vite/traceViewer/assets/codeMirrorModule-5yiV-3wl.js +0 -16831
  130. package/lib/vite/traceViewer/assets/codeMirrorModule-B7Z3vq11.js +0 -24
  131. package/lib/vite/traceViewer/assets/codeMirrorModule-C6p3E9Zg.js +0 -24
  132. package/lib/vite/traceViewer/assets/codeMirrorModule-Ca-1BNel.js +0 -24
  133. package/lib/vite/traceViewer/assets/codeMirrorModule-CqYUz5ms.js +0 -24
  134. package/lib/vite/traceViewer/assets/codeMirrorModule-DS3v0XrQ.js +0 -24
  135. package/lib/vite/traceViewer/assets/codeMirrorModule-DZoSgqUd.js +0 -24
  136. package/lib/vite/traceViewer/assets/codeMirrorModule-EhKN7Okm.js +0 -16449
  137. package/lib/vite/traceViewer/assets/codeMirrorModule-MzSmL4X2.js +0 -24
  138. package/lib/vite/traceViewer/assets/codeMirrorModule-T_sdMrbM.js +0 -24
  139. package/lib/vite/traceViewer/assets/inspectorTab-Bbgq0hgt.js +0 -64
  140. package/lib/vite/traceViewer/assets/inspectorTab-DhBbZz8I.js +0 -64
  141. package/lib/vite/traceViewer/assets/workbench-C43LWZEX.js +0 -72
  142. package/lib/vite/traceViewer/assets/workbench-DZqNXdoV.js +0 -9
  143. package/lib/vite/traceViewer/assets/workbench-DrQjKdyE.js +0 -72
  144. package/lib/vite/traceViewer/assets/workbench-Pa1v1Ojh.js +0 -72
  145. package/lib/vite/traceViewer/assets/workbench-caTaZnzx.js +0 -72
  146. package/lib/vite/traceViewer/assets/workbench-gtYcQBNA.js +0 -9
  147. package/lib/vite/traceViewer/assets/workbench-u2lRPMOT.js +0 -72
  148. package/lib/vite/traceViewer/assets/xtermModule-CZ7sDYXB.js +0 -6529
  149. package/lib/vite/traceViewer/embedded.BBZ9gQEw.js +0 -104
  150. package/lib/vite/traceViewer/embedded.BQq6Psnz.js +0 -104
  151. package/lib/vite/traceViewer/embedded.BVDVQOzc.js +0 -2
  152. package/lib/vite/traceViewer/embedded.Bn8Ptzv6.js +0 -2
  153. package/lib/vite/traceViewer/embedded.CorI3dFX.js +0 -104
  154. package/lib/vite/traceViewer/embedded.CvhnUgIi.js +0 -2
  155. package/lib/vite/traceViewer/embedded.D27cnKiB.js +0 -104
  156. package/lib/vite/traceViewer/embedded.D4lqGydT.js +0 -2
  157. package/lib/vite/traceViewer/embedded.DPqrDeET.js +0 -2
  158. package/lib/vite/traceViewer/embedded.DbzY7Q8w.js +0 -2
  159. package/lib/vite/traceViewer/embedded.f-PLGsBT.js +0 -2
  160. package/lib/vite/traceViewer/index.B7aiTMfZ.js +0 -2
  161. package/lib/vite/traceViewer/index.B8dgQwuN.js +0 -2
  162. package/lib/vite/traceViewer/index.BGj8jY3H.js +0 -2
  163. package/lib/vite/traceViewer/index.BSak5QT9.js +0 -2
  164. package/lib/vite/traceViewer/index.BrT2kfuc.js +0 -2
  165. package/lib/vite/traceViewer/index.CUpI-BFe.js +0 -195
  166. package/lib/vite/traceViewer/index.DkRbtWVo.js +0 -195
  167. package/lib/vite/traceViewer/index.DsjmhbB6.js +0 -195
  168. package/lib/vite/traceViewer/index._cX8k4co.js +0 -2
  169. package/lib/vite/traceViewer/index.pMAN88y-.js +0 -2
  170. package/lib/vite/traceViewer/recorder.Ch-WHviK.js +0 -2
  171. package/lib/vite/traceViewer/recorder.POd-toIn.js +0 -2
  172. package/lib/vite/traceViewer/uiMode.BEZVCe5O.js +0 -5
  173. package/lib/vite/traceViewer/uiMode.C4nbcio6.js +0 -1730
  174. package/lib/vite/traceViewer/uiMode.D-tg1Oci.js +0 -1730
  175. package/lib/vite/traceViewer/uiMode.D3cNFP6u.css +0 -1
  176. package/lib/vite/traceViewer/uiMode.DKjMBMlc.js +0 -1730
  177. package/lib/vite/traceViewer/uiMode.DVrL7a1K.js +0 -10
  178. package/lib/vite/traceViewer/uiMode.DdtUZZVS.js +0 -5
  179. package/lib/vite/traceViewer/uiMode.Dg9oJCQU.js +0 -10
  180. package/lib/vite/traceViewer/uiMode.DwZAzstF.js +0 -10
  181. package/lib/vite/traceViewer/uiMode.O07awP3T.js +0 -10
  182. package/lib/vite/traceViewer/uiMode.gGHHTsyL.js +0 -1730
  183. package/lib/vite/traceViewer/uiMode.jY2s-9ps.js +0 -10
  184. package/lib/vite/traceViewer/workbench.DjbIuxix.css +0 -1
  185. package/lib/vite/traceViewer/workbench.DyTpxWVb.css +0 -1
@@ -1,1730 +0,0 @@
1
- function __vite__mapDeps(indexes) {
2
- if (!__vite__mapDeps.viteFileDeps) {
3
- __vite__mapDeps.viteFileDeps = ["./assets/xtermModule-CZ7sDYXB.js","./xtermModule.4oRVGWQ-.css"]
4
- }
5
- return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
6
- }
7
- import { u as useMeasure, r as reactExports, b as currentTheme, _ as __vitePreload, d as addThemeListener, e as removeThemeListener, j as jsxRuntimeExports, R as React, E as Expandable, s as settings, f as clsx, m as msToString, g as Toolbar, T as ToolbarButton, h as testStatusIcon, i as TreeView, k as idForAction, W as Workbench, M as MultiTraceModel, l as useSetting, n as useDarkModeSetting, S as SplitView, o as SettingsView, a as applyTheme, c as createRoot } from "./assets/workbench-BwodYCgl.js";
8
- import { T as TestServerConnection, W as WebSocketTestServerTransport } from "./assets/testServerConnection-D-tXL3sj.js";
9
- var define_process_env_default = {};
10
- class TeleReporterReceiver {
11
- constructor(reporter, options = {}) {
12
- this.isListing = false;
13
- this._tests = /* @__PURE__ */ new Map();
14
- this._rootSuite = new TeleSuite("", "root");
15
- this._options = options;
16
- this._reporter = reporter;
17
- }
18
- reset() {
19
- this._rootSuite._entries = [];
20
- this._tests.clear();
21
- }
22
- dispatch(message) {
23
- const { method, params } = message;
24
- if (method === "onConfigure") {
25
- this._onConfigure(params.config);
26
- return;
27
- }
28
- if (method === "onProject") {
29
- this._onProject(params.project);
30
- return;
31
- }
32
- if (method === "onBegin") {
33
- this._onBegin();
34
- return;
35
- }
36
- if (method === "onTestBegin") {
37
- this._onTestBegin(params.testId, params.result);
38
- return;
39
- }
40
- if (method === "onTestEnd") {
41
- this._onTestEnd(params.test, params.result);
42
- return;
43
- }
44
- if (method === "onStepBegin") {
45
- this._onStepBegin(params.testId, params.resultId, params.step);
46
- return;
47
- }
48
- if (method === "onStepEnd") {
49
- this._onStepEnd(params.testId, params.resultId, params.step);
50
- return;
51
- }
52
- if (method === "onError") {
53
- this._onError(params.error);
54
- return;
55
- }
56
- if (method === "onStdIO") {
57
- this._onStdIO(params.type, params.testId, params.resultId, params.data, params.isBase64);
58
- return;
59
- }
60
- if (method === "onEnd")
61
- return this._onEnd(params.result);
62
- if (method === "onExit")
63
- return this._onExit();
64
- }
65
- _onConfigure(config) {
66
- var _a, _b;
67
- this._rootDir = config.rootDir;
68
- this._config = this._parseConfig(config);
69
- (_b = (_a = this._reporter).onConfigure) == null ? void 0 : _b.call(_a, this._config);
70
- }
71
- _onProject(project) {
72
- let projectSuite = this._options.mergeProjects ? this._rootSuite.suites.find((suite) => suite.project().name === project.name) : void 0;
73
- if (!projectSuite) {
74
- projectSuite = new TeleSuite(project.name, "project");
75
- this._rootSuite._addSuite(projectSuite);
76
- }
77
- projectSuite._project = this._parseProject(project);
78
- for (const suite of project.suites)
79
- this._mergeSuiteInto(suite, projectSuite);
80
- }
81
- _onBegin() {
82
- var _a, _b;
83
- (_b = (_a = this._reporter).onBegin) == null ? void 0 : _b.call(_a, this._rootSuite);
84
- }
85
- _onTestBegin(testId, payload) {
86
- var _a, _b;
87
- const test = this._tests.get(testId);
88
- if (this._options.clearPreviousResultsWhenTestBegins)
89
- test.results = [];
90
- const testResult = test._createTestResult(payload.id);
91
- testResult.retry = payload.retry;
92
- testResult.workerIndex = payload.workerIndex;
93
- testResult.parallelIndex = payload.parallelIndex;
94
- testResult.setStartTimeNumber(payload.startTime);
95
- (_b = (_a = this._reporter).onTestBegin) == null ? void 0 : _b.call(_a, test, testResult);
96
- }
97
- _onTestEnd(testEndPayload, payload) {
98
- var _a, _b, _c;
99
- const test = this._tests.get(testEndPayload.testId);
100
- test.timeout = testEndPayload.timeout;
101
- test.expectedStatus = testEndPayload.expectedStatus;
102
- test.annotations = testEndPayload.annotations;
103
- const result = test.results.find((r) => r._id === payload.id);
104
- result.duration = payload.duration;
105
- result.status = payload.status;
106
- result.errors = payload.errors;
107
- result.error = (_a = result.errors) == null ? void 0 : _a[0];
108
- result.attachments = this._parseAttachments(payload.attachments);
109
- (_c = (_b = this._reporter).onTestEnd) == null ? void 0 : _c.call(_b, test, result);
110
- result._stepMap = /* @__PURE__ */ new Map();
111
- }
112
- _onStepBegin(testId, resultId, payload) {
113
- var _a, _b;
114
- const test = this._tests.get(testId);
115
- const result = test.results.find((r) => r._id === resultId);
116
- const parentStep = payload.parentStepId ? result._stepMap.get(payload.parentStepId) : void 0;
117
- const location = this._absoluteLocation(payload.location);
118
- const step = new TeleTestStep(payload, parentStep, location);
119
- if (parentStep)
120
- parentStep.steps.push(step);
121
- else
122
- result.steps.push(step);
123
- result._stepMap.set(payload.id, step);
124
- (_b = (_a = this._reporter).onStepBegin) == null ? void 0 : _b.call(_a, test, result, step);
125
- }
126
- _onStepEnd(testId, resultId, payload) {
127
- var _a, _b;
128
- const test = this._tests.get(testId);
129
- const result = test.results.find((r) => r._id === resultId);
130
- const step = result._stepMap.get(payload.id);
131
- step.duration = payload.duration;
132
- step.error = payload.error;
133
- (_b = (_a = this._reporter).onStepEnd) == null ? void 0 : _b.call(_a, test, result, step);
134
- }
135
- _onError(error) {
136
- var _a, _b;
137
- (_b = (_a = this._reporter).onError) == null ? void 0 : _b.call(_a, error);
138
- }
139
- _onStdIO(type, testId, resultId, data, isBase64) {
140
- var _a, _b, _c, _d;
141
- const chunk = isBase64 ? globalThis.Buffer ? Buffer.from(data, "base64") : atob(data) : data;
142
- const test = testId ? this._tests.get(testId) : void 0;
143
- const result = test && resultId ? test.results.find((r) => r._id === resultId) : void 0;
144
- if (type === "stdout") {
145
- result == null ? void 0 : result.stdout.push(chunk);
146
- (_b = (_a = this._reporter).onStdOut) == null ? void 0 : _b.call(_a, chunk, test, result);
147
- } else {
148
- result == null ? void 0 : result.stderr.push(chunk);
149
- (_d = (_c = this._reporter).onStdErr) == null ? void 0 : _d.call(_c, chunk, test, result);
150
- }
151
- }
152
- async _onEnd(result) {
153
- var _a, _b;
154
- await ((_b = (_a = this._reporter).onEnd) == null ? void 0 : _b.call(_a, {
155
- status: result.status,
156
- startTime: new Date(result.startTime),
157
- duration: result.duration
158
- }));
159
- }
160
- _onExit() {
161
- var _a, _b;
162
- return (_b = (_a = this._reporter).onExit) == null ? void 0 : _b.call(_a);
163
- }
164
- _parseConfig(config) {
165
- const result = { ...baseFullConfig, ...config };
166
- if (this._options.configOverrides) {
167
- result.configFile = this._options.configOverrides.configFile;
168
- result.reportSlowTests = this._options.configOverrides.reportSlowTests;
169
- result.quiet = this._options.configOverrides.quiet;
170
- result.reporter = [...this._options.configOverrides.reporter];
171
- }
172
- return result;
173
- }
174
- _parseProject(project) {
175
- return {
176
- metadata: project.metadata,
177
- name: project.name,
178
- outputDir: this._absolutePath(project.outputDir),
179
- repeatEach: project.repeatEach,
180
- retries: project.retries,
181
- testDir: this._absolutePath(project.testDir),
182
- testIgnore: parseRegexPatterns(project.testIgnore),
183
- testMatch: parseRegexPatterns(project.testMatch),
184
- timeout: project.timeout,
185
- grep: parseRegexPatterns(project.grep),
186
- grepInvert: parseRegexPatterns(project.grepInvert),
187
- dependencies: project.dependencies,
188
- teardown: project.teardown,
189
- snapshotDir: this._absolutePath(project.snapshotDir),
190
- use: {}
191
- };
192
- }
193
- _parseAttachments(attachments) {
194
- return attachments.map((a) => {
195
- return {
196
- ...a,
197
- body: a.base64 && globalThis.Buffer ? Buffer.from(a.base64, "base64") : void 0
198
- };
199
- });
200
- }
201
- _mergeSuiteInto(jsonSuite, parent) {
202
- let targetSuite = parent.suites.find((s) => s.title === jsonSuite.title);
203
- if (!targetSuite) {
204
- targetSuite = new TeleSuite(jsonSuite.title, parent.type === "project" ? "file" : "describe");
205
- parent._addSuite(targetSuite);
206
- }
207
- targetSuite.location = this._absoluteLocation(jsonSuite.location);
208
- jsonSuite.entries.forEach((e) => {
209
- if ("testId" in e)
210
- this._mergeTestInto(e, targetSuite);
211
- else
212
- this._mergeSuiteInto(e, targetSuite);
213
- });
214
- }
215
- _mergeTestInto(jsonTest, parent) {
216
- let targetTest = this._options.mergeTestCases ? parent.tests.find((s) => s.title === jsonTest.title && s.repeatEachIndex === jsonTest.repeatEachIndex) : void 0;
217
- if (!targetTest) {
218
- targetTest = new TeleTestCase(jsonTest.testId, jsonTest.title, this._absoluteLocation(jsonTest.location), jsonTest.repeatEachIndex);
219
- parent._addTest(targetTest);
220
- this._tests.set(targetTest.id, targetTest);
221
- }
222
- this._updateTest(jsonTest, targetTest);
223
- }
224
- _updateTest(payload, test) {
225
- test.id = payload.testId;
226
- test.location = this._absoluteLocation(payload.location);
227
- test.retries = payload.retries;
228
- test.tags = payload.tags ?? [];
229
- test.annotations = payload.annotations ?? [];
230
- return test;
231
- }
232
- _absoluteLocation(location) {
233
- if (!location)
234
- return location;
235
- return {
236
- ...location,
237
- file: this._absolutePath(location.file)
238
- };
239
- }
240
- _absolutePath(relativePath) {
241
- if (relativePath === void 0)
242
- return;
243
- return this._options.resolvePath ? this._options.resolvePath(this._rootDir, relativePath) : this._rootDir + "/" + relativePath;
244
- }
245
- }
246
- class TeleSuite {
247
- constructor(title, type) {
248
- this._entries = [];
249
- this._requireFile = "";
250
- this._parallelMode = "none";
251
- this.title = title;
252
- this._type = type;
253
- }
254
- get type() {
255
- return this._type;
256
- }
257
- get suites() {
258
- return this._entries.filter((e) => e.type !== "test");
259
- }
260
- get tests() {
261
- return this._entries.filter((e) => e.type === "test");
262
- }
263
- entries() {
264
- return this._entries;
265
- }
266
- allTests() {
267
- const result = [];
268
- const visit = (suite) => {
269
- for (const entry of suite.entries()) {
270
- if (entry.type === "test")
271
- result.push(entry);
272
- else
273
- visit(entry);
274
- }
275
- };
276
- visit(this);
277
- return result;
278
- }
279
- titlePath() {
280
- const titlePath = this.parent ? this.parent.titlePath() : [];
281
- if (this.title || this._type !== "describe")
282
- titlePath.push(this.title);
283
- return titlePath;
284
- }
285
- project() {
286
- var _a;
287
- return this._project ?? ((_a = this.parent) == null ? void 0 : _a.project());
288
- }
289
- _addTest(test) {
290
- test.parent = this;
291
- this._entries.push(test);
292
- }
293
- _addSuite(suite) {
294
- suite.parent = this;
295
- this._entries.push(suite);
296
- }
297
- }
298
- class TeleTestCase {
299
- constructor(id, title, location, repeatEachIndex) {
300
- this.fn = () => {
301
- };
302
- this.results = [];
303
- this.type = "test";
304
- this.expectedStatus = "passed";
305
- this.timeout = 0;
306
- this.annotations = [];
307
- this.retries = 0;
308
- this.tags = [];
309
- this.repeatEachIndex = 0;
310
- this.id = id;
311
- this.title = title;
312
- this.location = location;
313
- this.repeatEachIndex = repeatEachIndex;
314
- }
315
- titlePath() {
316
- const titlePath = this.parent ? this.parent.titlePath() : [];
317
- titlePath.push(this.title);
318
- return titlePath;
319
- }
320
- outcome() {
321
- return computeTestCaseOutcome(this);
322
- }
323
- ok() {
324
- const status = this.outcome();
325
- return status === "expected" || status === "flaky" || status === "skipped";
326
- }
327
- _createTestResult(id) {
328
- const result = new TeleTestResult(this.results.length, id);
329
- this.results.push(result);
330
- return result;
331
- }
332
- }
333
- class TeleTestStep {
334
- constructor(payload, parentStep, location) {
335
- this.duration = -1;
336
- this.steps = [];
337
- this._startTime = 0;
338
- this.title = payload.title;
339
- this.category = payload.category;
340
- this.location = location;
341
- this.parent = parentStep;
342
- this._startTime = payload.startTime;
343
- }
344
- titlePath() {
345
- var _a;
346
- const parentPath = ((_a = this.parent) == null ? void 0 : _a.titlePath()) || [];
347
- return [...parentPath, this.title];
348
- }
349
- get startTime() {
350
- return new Date(this._startTime);
351
- }
352
- set startTime(value) {
353
- this._startTime = +value;
354
- }
355
- }
356
- class TeleTestResult {
357
- constructor(retry, id) {
358
- this.parallelIndex = -1;
359
- this.workerIndex = -1;
360
- this.duration = -1;
361
- this.stdout = [];
362
- this.stderr = [];
363
- this.attachments = [];
364
- this.status = "skipped";
365
- this.steps = [];
366
- this.errors = [];
367
- this._stepMap = /* @__PURE__ */ new Map();
368
- this._startTime = 0;
369
- this.retry = retry;
370
- this._id = id;
371
- }
372
- setStartTimeNumber(startTime) {
373
- this._startTime = startTime;
374
- }
375
- get startTime() {
376
- return new Date(this._startTime);
377
- }
378
- set startTime(value) {
379
- this._startTime = +value;
380
- }
381
- }
382
- const baseFullConfig = {
383
- forbidOnly: false,
384
- fullyParallel: false,
385
- globalSetup: null,
386
- globalTeardown: null,
387
- globalTimeout: 0,
388
- grep: /.*/,
389
- grepInvert: null,
390
- maxFailures: 0,
391
- metadata: {},
392
- preserveOutput: "always",
393
- projects: [],
394
- reporter: [[define_process_env_default.CI ? "dot" : "list"]],
395
- reportSlowTests: { max: 5, threshold: 15e3 },
396
- configFile: "",
397
- rootDir: "",
398
- quiet: false,
399
- shard: null,
400
- updateSnapshots: "missing",
401
- version: "",
402
- workers: 0,
403
- webServer: null
404
- };
405
- function parseRegexPatterns(patterns) {
406
- return patterns.map((p) => {
407
- if (p.s !== void 0)
408
- return p.s;
409
- return new RegExp(p.r.source, p.r.flags);
410
- });
411
- }
412
- function computeTestCaseOutcome(test) {
413
- let skipped = 0;
414
- let expected = 0;
415
- let unexpected = 0;
416
- for (const result of test.results) {
417
- if (result.status === "interrupted")
418
- ;
419
- else if (result.status === "skipped" && test.expectedStatus === "skipped") {
420
- ++skipped;
421
- } else if (result.status === "skipped")
422
- ;
423
- else if (result.status === test.expectedStatus) {
424
- ++expected;
425
- } else {
426
- ++unexpected;
427
- }
428
- }
429
- if (expected === 0 && unexpected === 0)
430
- return "skipped";
431
- if (unexpected === 0)
432
- return "expected";
433
- if (expected === 0 && skipped === 0)
434
- return "unexpected";
435
- return "flaky";
436
- }
437
- class TestTree {
438
- constructor(rootFolder, rootSuite, loadErrors, projectFilters, pathSeparator2) {
439
- this._treeItemById = /* @__PURE__ */ new Map();
440
- this._treeItemByTestId = /* @__PURE__ */ new Map();
441
- const filterProjects = projectFilters && [...projectFilters.values()].some(Boolean);
442
- this.pathSeparator = pathSeparator2;
443
- this.rootItem = {
444
- kind: "group",
445
- subKind: "folder",
446
- id: rootFolder,
447
- title: "",
448
- location: { file: "", line: 0, column: 0 },
449
- duration: 0,
450
- parent: void 0,
451
- children: [],
452
- status: "none",
453
- hasLoadErrors: false
454
- };
455
- this._treeItemById.set(rootFolder, this.rootItem);
456
- const visitSuite = (project, parentSuite, parentGroup) => {
457
- for (const suite of parentSuite.suites) {
458
- const title = suite.title || "<anonymous>";
459
- let group = parentGroup.children.find((item) => item.kind === "group" && item.title === title);
460
- if (!group) {
461
- group = {
462
- kind: "group",
463
- subKind: "describe",
464
- id: "suite:" + parentSuite.titlePath().join("") + "" + title,
465
- // account for anonymous suites
466
- title,
467
- location: suite.location,
468
- duration: 0,
469
- parent: parentGroup,
470
- children: [],
471
- status: "none",
472
- hasLoadErrors: false
473
- };
474
- this._addChild(parentGroup, group);
475
- }
476
- visitSuite(project, suite, group);
477
- }
478
- for (const test of parentSuite.tests) {
479
- const title = test.title;
480
- let testCaseItem = parentGroup.children.find((t) => t.kind !== "group" && t.title === title);
481
- if (!testCaseItem) {
482
- testCaseItem = {
483
- kind: "case",
484
- id: "test:" + test.titlePath().join(""),
485
- title,
486
- parent: parentGroup,
487
- children: [],
488
- tests: [],
489
- location: test.location,
490
- duration: 0,
491
- status: "none",
492
- project: void 0,
493
- test: void 0,
494
- tags: test.tags
495
- };
496
- this._addChild(parentGroup, testCaseItem);
497
- }
498
- const result = test.results[0];
499
- let status = "none";
500
- if ((result == null ? void 0 : result[statusEx]) === "scheduled")
501
- status = "scheduled";
502
- else if ((result == null ? void 0 : result[statusEx]) === "running")
503
- status = "running";
504
- else if ((result == null ? void 0 : result.status) === "skipped")
505
- status = "skipped";
506
- else if ((result == null ? void 0 : result.status) === "interrupted")
507
- status = "none";
508
- else if (result && test.outcome() !== "expected")
509
- status = "failed";
510
- else if (result && test.outcome() === "expected")
511
- status = "passed";
512
- testCaseItem.tests.push(test);
513
- const testItem = {
514
- kind: "test",
515
- id: test.id,
516
- title: project.name,
517
- location: test.location,
518
- test,
519
- parent: testCaseItem,
520
- children: [],
521
- status,
522
- duration: test.results.length ? Math.max(0, test.results[0].duration) : 0,
523
- project
524
- };
525
- this._addChild(testCaseItem, testItem);
526
- this._treeItemByTestId.set(test.id, testItem);
527
- testCaseItem.duration = testCaseItem.children.reduce((a, b) => a + b.duration, 0);
528
- }
529
- };
530
- for (const projectSuite of (rootSuite == null ? void 0 : rootSuite.suites) || []) {
531
- if (filterProjects && !projectFilters.get(projectSuite.title))
532
- continue;
533
- for (const fileSuite of projectSuite.suites) {
534
- const fileItem = this._fileItem(fileSuite.location.file.split(pathSeparator2), true);
535
- visitSuite(projectSuite.project(), fileSuite, fileItem);
536
- }
537
- }
538
- for (const loadError of loadErrors) {
539
- if (!loadError.location)
540
- continue;
541
- const fileItem = this._fileItem(loadError.location.file.split(pathSeparator2), true);
542
- fileItem.hasLoadErrors = true;
543
- }
544
- }
545
- _addChild(parent, child) {
546
- parent.children.push(child);
547
- child.parent = parent;
548
- this._treeItemById.set(child.id, child);
549
- }
550
- filterTree(filterText, statusFilters, runningTestIds) {
551
- const tokens = filterText.trim().toLowerCase().split(" ");
552
- const filtersStatuses = [...statusFilters.values()].some(Boolean);
553
- const filter = (testCase) => {
554
- const titleWithTags = [...testCase.tests[0].titlePath(), ...testCase.tests[0].tags].join(" ").toLowerCase();
555
- if (!tokens.every((token) => titleWithTags.includes(token)) && !testCase.tests.some((t) => runningTestIds == null ? void 0 : runningTestIds.has(t.id)))
556
- return false;
557
- testCase.children = testCase.children.filter((test) => {
558
- return !filtersStatuses || (runningTestIds == null ? void 0 : runningTestIds.has(test.test.id)) || statusFilters.get(test.status);
559
- });
560
- testCase.tests = testCase.children.map((c) => c.test);
561
- return !!testCase.children.length;
562
- };
563
- const visit = (treeItem) => {
564
- const newChildren = [];
565
- for (const child of treeItem.children) {
566
- if (child.kind === "case") {
567
- if (filter(child))
568
- newChildren.push(child);
569
- } else {
570
- visit(child);
571
- if (child.children.length || child.hasLoadErrors)
572
- newChildren.push(child);
573
- }
574
- }
575
- treeItem.children = newChildren;
576
- };
577
- visit(this.rootItem);
578
- }
579
- _fileItem(filePath, isFile) {
580
- if (filePath.length === 0)
581
- return this.rootItem;
582
- const fileName = filePath.join(this.pathSeparator);
583
- const existingFileItem = this._treeItemById.get(fileName);
584
- if (existingFileItem)
585
- return existingFileItem;
586
- const parentFileItem = this._fileItem(filePath.slice(0, filePath.length - 1), false);
587
- const fileItem = {
588
- kind: "group",
589
- subKind: isFile ? "file" : "folder",
590
- id: fileName,
591
- title: filePath[filePath.length - 1],
592
- location: { file: fileName, line: 0, column: 0 },
593
- duration: 0,
594
- parent: parentFileItem,
595
- children: [],
596
- status: "none",
597
- hasLoadErrors: false
598
- };
599
- this._addChild(parentFileItem, fileItem);
600
- return fileItem;
601
- }
602
- sortAndPropagateStatus() {
603
- sortAndPropagateStatus(this.rootItem);
604
- }
605
- flattenForSingleProject() {
606
- const visit = (treeItem) => {
607
- if (treeItem.kind === "case" && treeItem.children.length === 1) {
608
- treeItem.project = treeItem.children[0].project;
609
- treeItem.test = treeItem.children[0].test;
610
- treeItem.children = [];
611
- this._treeItemByTestId.set(treeItem.test.id, treeItem);
612
- } else {
613
- treeItem.children.forEach(visit);
614
- }
615
- };
616
- visit(this.rootItem);
617
- }
618
- shortenRoot() {
619
- let shortRoot = this.rootItem;
620
- while (shortRoot.children.length === 1 && shortRoot.children[0].kind === "group" && shortRoot.children[0].subKind === "folder")
621
- shortRoot = shortRoot.children[0];
622
- shortRoot.location = this.rootItem.location;
623
- this.rootItem = shortRoot;
624
- }
625
- testIds() {
626
- const result = /* @__PURE__ */ new Set();
627
- const visit = (treeItem) => {
628
- if (treeItem.kind === "case")
629
- treeItem.tests.forEach((t) => result.add(t.id));
630
- treeItem.children.forEach(visit);
631
- };
632
- visit(this.rootItem);
633
- return result;
634
- }
635
- fileNames() {
636
- const result = /* @__PURE__ */ new Set();
637
- const visit = (treeItem) => {
638
- if (treeItem.kind === "group" && treeItem.subKind === "file")
639
- result.add(treeItem.id);
640
- else
641
- treeItem.children.forEach(visit);
642
- };
643
- visit(this.rootItem);
644
- return [...result];
645
- }
646
- flatTreeItems() {
647
- const result = [];
648
- const visit = (treeItem) => {
649
- result.push(treeItem);
650
- treeItem.children.forEach(visit);
651
- };
652
- visit(this.rootItem);
653
- return result;
654
- }
655
- treeItemById(id) {
656
- return this._treeItemById.get(id);
657
- }
658
- collectTestIds(treeItem) {
659
- return treeItem ? collectTestIds(treeItem) : /* @__PURE__ */ new Set();
660
- }
661
- }
662
- function sortAndPropagateStatus(treeItem) {
663
- for (const child of treeItem.children)
664
- sortAndPropagateStatus(child);
665
- if (treeItem.kind === "group") {
666
- treeItem.children.sort((a, b) => {
667
- const fc = a.location.file.localeCompare(b.location.file);
668
- return fc || a.location.line - b.location.line;
669
- });
670
- }
671
- let allPassed = treeItem.children.length > 0;
672
- let allSkipped = treeItem.children.length > 0;
673
- let hasFailed = false;
674
- let hasRunning = false;
675
- let hasScheduled = false;
676
- for (const child of treeItem.children) {
677
- allSkipped = allSkipped && child.status === "skipped";
678
- allPassed = allPassed && (child.status === "passed" || child.status === "skipped");
679
- hasFailed = hasFailed || child.status === "failed";
680
- hasRunning = hasRunning || child.status === "running";
681
- hasScheduled = hasScheduled || child.status === "scheduled";
682
- }
683
- if (hasRunning)
684
- treeItem.status = "running";
685
- else if (hasScheduled)
686
- treeItem.status = "scheduled";
687
- else if (hasFailed)
688
- treeItem.status = "failed";
689
- else if (allSkipped)
690
- treeItem.status = "skipped";
691
- else if (allPassed)
692
- treeItem.status = "passed";
693
- }
694
- function collectTestIds(treeItem) {
695
- const testIds = /* @__PURE__ */ new Set();
696
- const visit = (treeItem2) => {
697
- var _a;
698
- if (treeItem2.kind === "case")
699
- treeItem2.tests.map((t) => t.id).forEach((id) => testIds.add(id));
700
- else if (treeItem2.kind === "test")
701
- testIds.add(treeItem2.id);
702
- else
703
- (_a = treeItem2.children) == null ? void 0 : _a.forEach(visit);
704
- };
705
- visit(treeItem);
706
- return testIds;
707
- }
708
- const statusEx = Symbol("statusEx");
709
- class TeleSuiteUpdater {
710
- constructor(options) {
711
- this.loadErrors = [];
712
- this.progress = {
713
- total: 0,
714
- passed: 0,
715
- failed: 0,
716
- skipped: 0
717
- };
718
- this._lastRunTestCount = 0;
719
- this._receiver = new TeleReporterReceiver(this._createReporter(), {
720
- mergeProjects: true,
721
- mergeTestCases: true,
722
- resolvePath: (rootDir, relativePath) => rootDir + options.pathSeparator + relativePath,
723
- clearPreviousResultsWhenTestBegins: true
724
- });
725
- this._options = options;
726
- }
727
- _createReporter() {
728
- return {
729
- version: () => "v2",
730
- onConfigure: (c) => {
731
- this.config = c;
732
- this._lastRunReceiver = new TeleReporterReceiver({
733
- onBegin: (suite) => {
734
- this._lastRunTestCount = suite.allTests().length;
735
- this._lastRunReceiver = void 0;
736
- }
737
- }, {
738
- mergeProjects: true,
739
- mergeTestCases: false,
740
- resolvePath: (rootDir, relativePath) => rootDir + this._options.pathSeparator + relativePath
741
- });
742
- },
743
- onBegin: (suite) => {
744
- var _a;
745
- if (!this.rootSuite)
746
- this.rootSuite = suite;
747
- if (this._testResultsSnapshot) {
748
- for (const test of this.rootSuite.allTests())
749
- test.results = ((_a = this._testResultsSnapshot) == null ? void 0 : _a.get(test.id)) || test.results;
750
- this._testResultsSnapshot = void 0;
751
- }
752
- this.progress.total = this._lastRunTestCount;
753
- this.progress.passed = 0;
754
- this.progress.failed = 0;
755
- this.progress.skipped = 0;
756
- this._options.onUpdate(true);
757
- },
758
- onEnd: () => {
759
- this._options.onUpdate(true);
760
- },
761
- onTestBegin: (test, testResult) => {
762
- testResult[statusEx] = "running";
763
- this._options.onUpdate();
764
- },
765
- onTestEnd: (test, testResult) => {
766
- if (test.outcome() === "skipped")
767
- ++this.progress.skipped;
768
- else if (test.outcome() === "unexpected")
769
- ++this.progress.failed;
770
- else
771
- ++this.progress.passed;
772
- testResult[statusEx] = testResult.status;
773
- this._options.onUpdate();
774
- },
775
- onError: (error) => this._handleOnError(error),
776
- printsToStdio: () => {
777
- return false;
778
- },
779
- onStdOut: () => {
780
- },
781
- onStdErr: () => {
782
- },
783
- onExit: () => {
784
- },
785
- onStepBegin: () => {
786
- },
787
- onStepEnd: () => {
788
- }
789
- };
790
- }
791
- processGlobalReport(report) {
792
- const receiver = new TeleReporterReceiver({
793
- onConfigure: (c) => {
794
- this.config = c;
795
- },
796
- onError: (error) => this._handleOnError(error)
797
- });
798
- for (const message of report)
799
- void receiver.dispatch(message);
800
- }
801
- processListReport(report) {
802
- var _a;
803
- const tests = ((_a = this.rootSuite) == null ? void 0 : _a.allTests()) || [];
804
- this._testResultsSnapshot = new Map(tests.map((test) => [test.id, test.results]));
805
- this._receiver.reset();
806
- for (const message of report)
807
- void this._receiver.dispatch(message);
808
- }
809
- processTestReportEvent(message) {
810
- var _a, _b, _c;
811
- (_b = (_a = this._lastRunReceiver) == null ? void 0 : _a.dispatch(message)) == null ? void 0 : _b.catch(() => {
812
- });
813
- (_c = this._receiver.dispatch(message)) == null ? void 0 : _c.catch(() => {
814
- });
815
- }
816
- _handleOnError(error) {
817
- var _a, _b;
818
- this.loadErrors.push(error);
819
- (_b = (_a = this._options).onError) == null ? void 0 : _b.call(_a, error);
820
- this._options.onUpdate();
821
- }
822
- asModel() {
823
- return {
824
- rootSuite: this.rootSuite || new TeleSuite("", "root"),
825
- config: this.config,
826
- loadErrors: this.loadErrors,
827
- progress: this.progress
828
- };
829
- }
830
- }
831
- const XtermWrapper = ({
832
- source
833
- }) => {
834
- const [measure, xtermElement] = useMeasure();
835
- const [theme, setTheme] = reactExports.useState(currentTheme());
836
- const [modulePromise] = reactExports.useState(__vitePreload(() => import("./assets/xtermModule-CZ7sDYXB.js"), true ? __vite__mapDeps([0,1]) : void 0, import.meta.url).then((m) => m.default));
837
- const terminal = reactExports.useRef(null);
838
- reactExports.useEffect(() => {
839
- addThemeListener(setTheme);
840
- return () => removeThemeListener(setTheme);
841
- }, []);
842
- reactExports.useEffect(() => {
843
- const oldSourceWrite = source.write;
844
- const oldSourceClear = source.clear;
845
- (async () => {
846
- const { Terminal, FitAddon } = await modulePromise;
847
- const element = xtermElement.current;
848
- if (!element)
849
- return;
850
- const terminalTheme = theme === "dark-mode" ? darkTheme : lightTheme;
851
- if (terminal.current && terminal.current.terminal.options.theme === terminalTheme)
852
- return;
853
- if (terminal.current)
854
- element.textContent = "";
855
- const newTerminal = new Terminal({
856
- convertEol: true,
857
- fontSize: 13,
858
- scrollback: 1e4,
859
- fontFamily: "var(--vscode-editor-font-family)",
860
- theme: terminalTheme
861
- });
862
- const fitAddon = new FitAddon();
863
- newTerminal.loadAddon(fitAddon);
864
- for (const p of source.pending)
865
- newTerminal.write(p);
866
- source.write = (data) => {
867
- source.pending.push(data);
868
- newTerminal.write(data);
869
- };
870
- source.clear = () => {
871
- source.pending = [];
872
- newTerminal.clear();
873
- };
874
- newTerminal.open(element);
875
- fitAddon.fit();
876
- terminal.current = { terminal: newTerminal, fitAddon };
877
- })();
878
- return () => {
879
- source.clear = oldSourceClear;
880
- source.write = oldSourceWrite;
881
- };
882
- }, [modulePromise, terminal, xtermElement, source, theme]);
883
- reactExports.useEffect(() => {
884
- setTimeout(() => {
885
- if (!terminal.current)
886
- return;
887
- terminal.current.fitAddon.fit();
888
- source.resize(terminal.current.terminal.cols, terminal.current.terminal.rows);
889
- }, 250);
890
- }, [measure, source]);
891
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "data-testid": "output", className: "xterm-wrapper", style: { flex: "auto" }, ref: xtermElement });
892
- };
893
- const lightTheme = {
894
- foreground: "#383a42",
895
- background: "#fafafa",
896
- cursor: "#383a42",
897
- black: "#000000",
898
- red: "#e45649",
899
- green: "#50a14f",
900
- yellow: "#c18401",
901
- blue: "#4078f2",
902
- magenta: "#a626a4",
903
- cyan: "#0184bc",
904
- white: "#a0a0a0",
905
- brightBlack: "#000000",
906
- brightRed: "#e06c75",
907
- brightGreen: "#98c379",
908
- brightYellow: "#d19a66",
909
- brightBlue: "#4078f2",
910
- brightMagenta: "#a626a4",
911
- brightCyan: "#0184bc",
912
- brightWhite: "#383a42",
913
- selectionBackground: "#d7d7d7",
914
- selectionForeground: "#383a42"
915
- };
916
- const darkTheme = {
917
- foreground: "#f8f8f2",
918
- background: "#1e1e1e",
919
- cursor: "#f8f8f0",
920
- black: "#000000",
921
- red: "#ff5555",
922
- green: "#50fa7b",
923
- yellow: "#f1fa8c",
924
- blue: "#bd93f9",
925
- magenta: "#ff79c6",
926
- cyan: "#8be9fd",
927
- white: "#bfbfbf",
928
- brightBlack: "#4d4d4d",
929
- brightRed: "#ff6e6e",
930
- brightGreen: "#69ff94",
931
- brightYellow: "#ffffa5",
932
- brightBlue: "#d6acff",
933
- brightMagenta: "#ff92df",
934
- brightCyan: "#a4ffff",
935
- brightWhite: "#e6e6e6",
936
- selectionBackground: "#44475a",
937
- selectionForeground: "#f8f8f2"
938
- };
939
- const FiltersView = ({ filterText, setFilterText, statusFilters, setStatusFilters, projectFilters, setProjectFilters, testModel, runTests }) => {
940
- const [expanded, setExpanded] = React.useState(false);
941
- const inputRef = React.useRef(null);
942
- React.useEffect(() => {
943
- var _a;
944
- (_a = inputRef.current) == null ? void 0 : _a.focus();
945
- }, []);
946
- const statusLine = [...statusFilters.entries()].filter(([_, v]) => v).map(([s]) => s).join(" ") || "all";
947
- const projectsLine = [...projectFilters.entries()].filter(([_, v]) => v).map(([p]) => p).join(" ") || "all";
948
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "filters", children: [
949
- /* @__PURE__ */ jsxRuntimeExports.jsx(
950
- Expandable,
951
- {
952
- expanded,
953
- setExpanded,
954
- title: /* @__PURE__ */ jsxRuntimeExports.jsx(
955
- "input",
956
- {
957
- ref: inputRef,
958
- type: "search",
959
- placeholder: "Filter (e.g. text, @tag)",
960
- spellCheck: false,
961
- value: filterText,
962
- onChange: (e) => {
963
- setFilterText(e.target.value);
964
- },
965
- onKeyDown: (e) => {
966
- if (e.key === "Enter")
967
- runTests();
968
- }
969
- }
970
- )
971
- }
972
- ),
973
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "filter-summary", title: "Status: " + statusLine + "\nProjects: " + projectsLine, onClick: () => setExpanded(!expanded), children: [
974
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "filter-label", children: "Status:" }),
975
- " ",
976
- statusLine,
977
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "filter-label", children: "Projects:" }),
978
- " ",
979
- projectsLine
980
- ] }),
981
- expanded && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hbox", style: { marginLeft: 14, maxHeight: 200, overflowY: "auto" }, children: [
982
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "filter-list", children: [...statusFilters.entries()].map(([status, value]) => {
983
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "filter-entry", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { children: [
984
- /* @__PURE__ */ jsxRuntimeExports.jsx("input", { type: "checkbox", checked: value, onClick: () => {
985
- const copy = new Map(statusFilters);
986
- copy.set(status, !copy.get(status));
987
- setStatusFilters(copy);
988
- } }),
989
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: status })
990
- ] }) }, status);
991
- }) }),
992
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "filter-list", children: [...projectFilters.entries()].map(([projectName, value]) => {
993
- return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "filter-entry", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { children: [
994
- /* @__PURE__ */ jsxRuntimeExports.jsx("input", { type: "checkbox", checked: value, onClick: () => {
995
- var _a;
996
- const copy = new Map(projectFilters);
997
- copy.set(projectName, !copy.get(projectName));
998
- setProjectFilters(copy);
999
- const configFile = (_a = testModel == null ? void 0 : testModel.config) == null ? void 0 : _a.configFile;
1000
- if (configFile)
1001
- settings.setObject(configFile + ":projects", [...copy.entries()].filter(([_, v]) => v).map(([k]) => k));
1002
- } }),
1003
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: projectName || "untitled" })
1004
- ] }) }, projectName);
1005
- }) })
1006
- ] })
1007
- ] });
1008
- };
1009
- const TagView = ({ tag, style, onClick }) => {
1010
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
1011
- "span",
1012
- {
1013
- className: clsx("tag", `tag-color-${tagNameToColor(tag)}`),
1014
- onClick,
1015
- style: { margin: "6px 0 0 6px", ...style },
1016
- title: `Click to filter by tag: ${tag}`,
1017
- children: tag
1018
- }
1019
- );
1020
- };
1021
- function tagNameToColor(str) {
1022
- let hash = 0;
1023
- for (let i = 0; i < str.length; i++)
1024
- hash = str.charCodeAt(i) + ((hash << 8) - hash);
1025
- return Math.abs(hash % 6);
1026
- }
1027
- const TestTreeView = TreeView;
1028
- const TestListView = ({ filterText, testModel, testServerConnection, testTree, runTests, runningState, watchAll, watchedTreeIds, setWatchedTreeIds, isLoading, onItemSelected, requestedCollapseAllCount, setFilterText, onRevealSource }) => {
1029
- const [treeState, setTreeState] = React.useState({ expandedItems: /* @__PURE__ */ new Map() });
1030
- const [selectedTreeItemId, setSelectedTreeItemId] = React.useState();
1031
- const [collapseAllCount, setCollapseAllCount] = React.useState(requestedCollapseAllCount);
1032
- React.useEffect(() => {
1033
- if (collapseAllCount !== requestedCollapseAllCount) {
1034
- treeState.expandedItems.clear();
1035
- for (const item of testTree.flatTreeItems())
1036
- treeState.expandedItems.set(item.id, false);
1037
- setCollapseAllCount(requestedCollapseAllCount);
1038
- setSelectedTreeItemId(void 0);
1039
- setTreeState({ ...treeState });
1040
- return;
1041
- }
1042
- if (!runningState || runningState.itemSelectedByUser)
1043
- return;
1044
- let selectedTreeItem2;
1045
- const visit = (treeItem) => {
1046
- var _a;
1047
- treeItem.children.forEach(visit);
1048
- if (selectedTreeItem2)
1049
- return;
1050
- if (treeItem.status === "failed") {
1051
- if (treeItem.kind === "test" && runningState.testIds.has(treeItem.test.id))
1052
- selectedTreeItem2 = treeItem;
1053
- else if (treeItem.kind === "case" && runningState.testIds.has((_a = treeItem.tests[0]) == null ? void 0 : _a.id))
1054
- selectedTreeItem2 = treeItem;
1055
- }
1056
- };
1057
- visit(testTree.rootItem);
1058
- if (selectedTreeItem2)
1059
- setSelectedTreeItemId(selectedTreeItem2.id);
1060
- }, [runningState, setSelectedTreeItemId, testTree, collapseAllCount, setCollapseAllCount, requestedCollapseAllCount, treeState, setTreeState]);
1061
- const { selectedTreeItem } = React.useMemo(() => {
1062
- if (!testModel)
1063
- return { selectedTreeItem: void 0 };
1064
- const selectedTreeItem2 = selectedTreeItemId ? testTree.treeItemById(selectedTreeItemId) : void 0;
1065
- const testFile = itemLocation(selectedTreeItem2, testModel);
1066
- let selectedTest;
1067
- if ((selectedTreeItem2 == null ? void 0 : selectedTreeItem2.kind) === "test")
1068
- selectedTest = selectedTreeItem2.test;
1069
- else if ((selectedTreeItem2 == null ? void 0 : selectedTreeItem2.kind) === "case" && selectedTreeItem2.tests.length === 1)
1070
- selectedTest = selectedTreeItem2.tests[0];
1071
- onItemSelected({ treeItem: selectedTreeItem2, testCase: selectedTest, testFile });
1072
- return { selectedTreeItem: selectedTreeItem2 };
1073
- }, [onItemSelected, selectedTreeItemId, testModel, testTree]);
1074
- React.useEffect(() => {
1075
- if (isLoading)
1076
- return;
1077
- if (watchAll) {
1078
- testServerConnection == null ? void 0 : testServerConnection.watchNoReply({ fileNames: testTree.fileNames() });
1079
- } else {
1080
- const fileNames = /* @__PURE__ */ new Set();
1081
- for (const itemId of watchedTreeIds.value) {
1082
- const treeItem = testTree.treeItemById(itemId);
1083
- const fileName = treeItem == null ? void 0 : treeItem.location.file;
1084
- if (fileName)
1085
- fileNames.add(fileName);
1086
- }
1087
- testServerConnection == null ? void 0 : testServerConnection.watchNoReply({ fileNames: [...fileNames] });
1088
- }
1089
- }, [isLoading, testTree, watchAll, watchedTreeIds, testServerConnection]);
1090
- const runTreeItem = (treeItem) => {
1091
- setSelectedTreeItemId(treeItem.id);
1092
- runTests("bounce-if-busy", testTree.collectTestIds(treeItem));
1093
- };
1094
- const handleTagClick = (e, tag) => {
1095
- e.preventDefault();
1096
- e.stopPropagation();
1097
- if (e.metaKey || e.ctrlKey) {
1098
- const parts = filterText.split(" ");
1099
- if (parts.includes(tag))
1100
- setFilterText(parts.filter((t) => t !== tag).join(" ").trim());
1101
- else
1102
- setFilterText((filterText + " " + tag).trim());
1103
- } else {
1104
- setFilterText((filterText.split(" ").filter((t) => !t.startsWith("@")).join(" ") + " " + tag).trim());
1105
- }
1106
- };
1107
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
1108
- TestTreeView,
1109
- {
1110
- name: "tests",
1111
- treeState,
1112
- setTreeState,
1113
- rootItem: testTree.rootItem,
1114
- dataTestId: "test-tree",
1115
- render: (treeItem) => {
1116
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hbox ui-mode-list-item", children: [
1117
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ui-mode-list-item-title", children: [
1118
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { title: treeItem.title, children: treeItem.title }),
1119
- treeItem.kind === "case" ? treeItem.tags.map((tag) => /* @__PURE__ */ jsxRuntimeExports.jsx(TagView, { tag: tag.slice(1), onClick: (e) => handleTagClick(e, tag) }, tag)) : null
1120
- ] }),
1121
- !!treeItem.duration && treeItem.status !== "skipped" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ui-mode-list-item-time", children: msToString(treeItem.duration) }),
1122
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { noMinHeight: true, noShadow: true, children: [
1123
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "play", title: "Run", onClick: () => runTreeItem(treeItem), disabled: !!runningState && !runningState.completed }),
1124
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "go-to-file", title: "Show source", onClick: onRevealSource, style: treeItem.kind === "group" && treeItem.subKind === "folder" ? { visibility: "hidden" } : {} }),
1125
- !watchAll && /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "eye", title: "Watch", onClick: () => {
1126
- if (watchedTreeIds.value.has(treeItem.id))
1127
- watchedTreeIds.value.delete(treeItem.id);
1128
- else
1129
- watchedTreeIds.value.add(treeItem.id);
1130
- setWatchedTreeIds({ ...watchedTreeIds });
1131
- }, toggled: watchedTreeIds.value.has(treeItem.id) })
1132
- ] })
1133
- ] });
1134
- },
1135
- icon: (treeItem) => testStatusIcon(treeItem.status),
1136
- selectedItem: selectedTreeItem,
1137
- onAccepted: runTreeItem,
1138
- onSelected: (treeItem) => {
1139
- if (runningState)
1140
- runningState.itemSelectedByUser = true;
1141
- setSelectedTreeItemId(treeItem.id);
1142
- },
1143
- isError: (treeItem) => treeItem.kind === "group" ? treeItem.hasLoadErrors : false,
1144
- autoExpandDepth: filterText ? 5 : 1,
1145
- noItemsMessage: isLoading ? "Loading…" : "No tests"
1146
- }
1147
- );
1148
- };
1149
- function itemLocation(item, model) {
1150
- if (!item || !model)
1151
- return;
1152
- return {
1153
- file: item.location.file,
1154
- line: item.location.line,
1155
- column: item.location.column,
1156
- source: {
1157
- errors: model.loadErrors.filter((e) => {
1158
- var _a;
1159
- return ((_a = e.location) == null ? void 0 : _a.file) === item.location.file;
1160
- }).map((e) => ({ line: e.location.line, message: e.message })),
1161
- content: void 0
1162
- }
1163
- };
1164
- }
1165
- function artifactsFolderName(workerIndex) {
1166
- return `.playwright-artifacts-${workerIndex}`;
1167
- }
1168
- const TraceView = ({ item, rootDir, onOpenExternally, revealSource }) => {
1169
- var _a, _b;
1170
- const [model, setModel] = React.useState();
1171
- const [counter, setCounter] = React.useState(0);
1172
- const pollTimer = React.useRef(null);
1173
- const { outputDir } = React.useMemo(() => {
1174
- const outputDir2 = item.testCase ? outputDirForTestCase(item.testCase) : void 0;
1175
- return { outputDir: outputDir2 };
1176
- }, [item]);
1177
- const [selectedActionId, setSelectedActionId] = React.useState();
1178
- const onSelectionChanged = React.useCallback((action) => setSelectedActionId(idForAction(action)), [setSelectedActionId]);
1179
- const initialSelection = selectedActionId ? model == null ? void 0 : model.model.actions.find((a) => idForAction(a) === selectedActionId) : void 0;
1180
- React.useEffect(() => {
1181
- var _a2, _b2;
1182
- if (pollTimer.current)
1183
- clearTimeout(pollTimer.current);
1184
- const result = (_a2 = item.testCase) == null ? void 0 : _a2.results[0];
1185
- if (!result) {
1186
- setModel(void 0);
1187
- return;
1188
- }
1189
- const attachment = result && result.duration >= 0 && result.attachments.find((a) => a.name === "trace");
1190
- if (attachment && attachment.path) {
1191
- loadSingleTraceFile(attachment.path).then((model2) => setModel({ model: model2, isLive: false }));
1192
- return;
1193
- }
1194
- if (!outputDir) {
1195
- setModel(void 0);
1196
- return;
1197
- }
1198
- const traceLocation = `${outputDir}/${artifactsFolderName(result.workerIndex)}/traces/${(_b2 = item.testCase) == null ? void 0 : _b2.id}.json`;
1199
- pollTimer.current = setTimeout(async () => {
1200
- try {
1201
- const model2 = await loadSingleTraceFile(traceLocation);
1202
- setModel({ model: model2, isLive: true });
1203
- } catch {
1204
- setModel(void 0);
1205
- } finally {
1206
- setCounter(counter + 1);
1207
- }
1208
- }, 500);
1209
- return () => {
1210
- if (pollTimer.current)
1211
- clearTimeout(pollTimer.current);
1212
- };
1213
- }, [outputDir, item, setModel, counter, setCounter]);
1214
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
1215
- Workbench,
1216
- {
1217
- model: model == null ? void 0 : model.model,
1218
- showSourcesFirst: true,
1219
- rootDir,
1220
- initialSelection,
1221
- onSelectionChanged,
1222
- fallbackLocation: item.testFile,
1223
- isLive: model == null ? void 0 : model.isLive,
1224
- status: (_a = item.treeItem) == null ? void 0 : _a.status,
1225
- annotations: ((_b = item.testCase) == null ? void 0 : _b.annotations) || [],
1226
- onOpenExternally,
1227
- revealSource
1228
- },
1229
- "workbench"
1230
- );
1231
- };
1232
- const outputDirForTestCase = (testCase) => {
1233
- var _a;
1234
- for (let suite = testCase.parent; suite; suite = suite.parent) {
1235
- if (suite.project())
1236
- return (_a = suite.project()) == null ? void 0 : _a.outputDir;
1237
- }
1238
- return void 0;
1239
- };
1240
- async function loadSingleTraceFile(url) {
1241
- const params = new URLSearchParams();
1242
- params.set("trace", url);
1243
- const response = await fetch(`contexts?${params.toString()}`);
1244
- const contextEntries = await response.json();
1245
- return new MultiTraceModel(contextEntries);
1246
- }
1247
- const pathSeparator = navigator.userAgent.toLowerCase().includes("windows") ? "\\" : "/";
1248
- let xtermSize = { cols: 80, rows: 24 };
1249
- const xtermDataSource = {
1250
- pending: [],
1251
- clear: () => {
1252
- },
1253
- write: (data) => xtermDataSource.pending.push(data),
1254
- resize: () => {
1255
- }
1256
- };
1257
- const searchParams = new URLSearchParams(window.location.search);
1258
- const guid = searchParams.get("ws");
1259
- const wsURL = new URL(`../${guid}`, window.location.toString());
1260
- wsURL.protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
1261
- const queryParams = {
1262
- args: searchParams.getAll("arg"),
1263
- grep: searchParams.get("grep") || void 0,
1264
- grepInvert: searchParams.get("grepInvert") || void 0,
1265
- projects: searchParams.getAll("project"),
1266
- workers: searchParams.get("workers") || void 0,
1267
- timeout: searchParams.has("timeout") ? +searchParams.get("timeout") : void 0,
1268
- headed: searchParams.has("headed"),
1269
- outputDir: searchParams.get("outputDir") || void 0,
1270
- updateSnapshots: searchParams.get("updateSnapshots") || void 0,
1271
- reporters: searchParams.has("reporter") ? searchParams.getAll("reporter") : void 0
1272
- };
1273
- if (queryParams.updateSnapshots && !["all", "none", "missing"].includes(queryParams.updateSnapshots))
1274
- queryParams.updateSnapshots = void 0;
1275
- const isMac = navigator.platform === "MacIntel";
1276
- const UIModeView = ({}) => {
1277
- var _a;
1278
- const [filterText, setFilterText] = React.useState("");
1279
- const [isShowingOutput, setIsShowingOutput] = React.useState(false);
1280
- const [statusFilters, setStatusFilters] = React.useState(/* @__PURE__ */ new Map([
1281
- ["passed", false],
1282
- ["failed", false],
1283
- ["skipped", false]
1284
- ]));
1285
- const [projectFilters, setProjectFilters] = React.useState(/* @__PURE__ */ new Map());
1286
- const [testModel, setTestModel] = React.useState();
1287
- const [progress, setProgress] = React.useState();
1288
- const [selectedItem, setSelectedItem] = React.useState({});
1289
- const [visibleTestIds, setVisibleTestIds] = React.useState(/* @__PURE__ */ new Set());
1290
- const [isLoading, setIsLoading] = React.useState(false);
1291
- const [runningState, setRunningState] = React.useState();
1292
- const isRunningTest = runningState && !runningState.completed;
1293
- const [watchAll, setWatchAll] = useSetting("watch-all", false);
1294
- const [watchedTreeIds, setWatchedTreeIds] = React.useState({ value: /* @__PURE__ */ new Set() });
1295
- const commandQueue = React.useRef(Promise.resolve());
1296
- const runTestBacklog = React.useRef(/* @__PURE__ */ new Set());
1297
- const [collapseAllCount, setCollapseAllCount] = React.useState(0);
1298
- const [isDisconnected, setIsDisconnected] = React.useState(false);
1299
- const [hasBrowsers, setHasBrowsers] = React.useState(true);
1300
- const [testServerConnection, setTestServerConnection] = React.useState();
1301
- const [teleSuiteUpdater, setTeleSuiteUpdater] = React.useState();
1302
- const [settingsVisible, setSettingsVisible] = React.useState(false);
1303
- React.useState(false);
1304
- const [revealSource, setRevealSource] = React.useState(false);
1305
- const onRevealSource = React.useCallback(() => setRevealSource(true), [setRevealSource]);
1306
- const showTestingOptions = false;
1307
- const [singleWorker, setSingleWorker] = React.useState(queryParams.workers === "1");
1308
- const [showBrowser, setShowBrowser] = React.useState(queryParams.headed);
1309
- const [updateSnapshots, setUpdateSnapshots] = React.useState(queryParams.updateSnapshots === "all");
1310
- const [showRouteActions, setShowRouteActions] = useSetting("show-route-actions", true);
1311
- const [darkMode, setDarkMode] = useDarkModeSetting();
1312
- const inputRef = React.useRef(null);
1313
- const reloadTests = React.useCallback(() => {
1314
- setTestServerConnection(new TestServerConnection(new WebSocketTestServerTransport(wsURL)));
1315
- }, []);
1316
- React.useEffect(() => {
1317
- var _a2;
1318
- (_a2 = inputRef.current) == null ? void 0 : _a2.focus();
1319
- setIsLoading(true);
1320
- reloadTests();
1321
- }, [reloadTests]);
1322
- React.useEffect(() => {
1323
- if (!testServerConnection)
1324
- return;
1325
- const disposables = [
1326
- testServerConnection.onStdio((params) => {
1327
- if (params.buffer) {
1328
- const data = atob(params.buffer);
1329
- xtermDataSource.write(data);
1330
- } else {
1331
- xtermDataSource.write(params.text);
1332
- }
1333
- }),
1334
- testServerConnection.onClose(() => setIsDisconnected(true))
1335
- ];
1336
- xtermDataSource.resize = (cols, rows) => {
1337
- xtermSize = { cols, rows };
1338
- testServerConnection.resizeTerminalNoReply({ cols, rows });
1339
- };
1340
- return () => {
1341
- for (const disposable of disposables)
1342
- disposable.dispose();
1343
- };
1344
- }, [testServerConnection]);
1345
- React.useEffect(() => {
1346
- if (!testServerConnection)
1347
- return;
1348
- let throttleTimer;
1349
- const teleSuiteUpdater2 = new TeleSuiteUpdater({
1350
- onUpdate: (immediate) => {
1351
- clearTimeout(throttleTimer);
1352
- throttleTimer = void 0;
1353
- if (immediate) {
1354
- setTestModel(teleSuiteUpdater2.asModel());
1355
- } else if (!throttleTimer) {
1356
- throttleTimer = setTimeout(() => {
1357
- setTestModel(teleSuiteUpdater2.asModel());
1358
- }, 250);
1359
- }
1360
- },
1361
- onError: (error) => {
1362
- xtermDataSource.write((error.stack || error.value || "") + "\n");
1363
- },
1364
- pathSeparator
1365
- });
1366
- setTeleSuiteUpdater(teleSuiteUpdater2);
1367
- setTestModel(void 0);
1368
- setIsLoading(true);
1369
- setWatchedTreeIds({ value: /* @__PURE__ */ new Set() });
1370
- (async () => {
1371
- try {
1372
- await testServerConnection.initialize({
1373
- interceptStdio: true,
1374
- watchTestDirs: true
1375
- });
1376
- const { status, report } = await testServerConnection.runGlobalSetup({
1377
- outputDir: queryParams.outputDir
1378
- });
1379
- teleSuiteUpdater2.processGlobalReport(report);
1380
- if (status !== "passed")
1381
- return;
1382
- const result = await testServerConnection.listTests({ projects: queryParams.projects, locations: queryParams.args, grep: queryParams.grep, grepInvert: queryParams.grepInvert, outputDir: queryParams.outputDir });
1383
- teleSuiteUpdater2.processListReport(result.report);
1384
- testServerConnection.onReport((params) => {
1385
- teleSuiteUpdater2.processTestReportEvent(params);
1386
- });
1387
- const { hasBrowsers: hasBrowsers2 } = await testServerConnection.checkBrowsers({});
1388
- setHasBrowsers(hasBrowsers2);
1389
- } finally {
1390
- setIsLoading(false);
1391
- }
1392
- })();
1393
- return () => {
1394
- clearTimeout(throttleTimer);
1395
- };
1396
- }, [testServerConnection]);
1397
- React.useEffect(() => {
1398
- if (!testModel)
1399
- return;
1400
- const { config, rootSuite } = testModel;
1401
- const selectedProjects = config.configFile ? settings.getObject(config.configFile + ":projects", void 0) : void 0;
1402
- const newFilter = new Map(projectFilters);
1403
- for (const projectName of newFilter.keys()) {
1404
- if (!rootSuite.suites.find((s) => s.title === projectName))
1405
- newFilter.delete(projectName);
1406
- }
1407
- for (const projectSuite of rootSuite.suites) {
1408
- if (!newFilter.has(projectSuite.title))
1409
- newFilter.set(projectSuite.title, !!(selectedProjects == null ? void 0 : selectedProjects.includes(projectSuite.title)));
1410
- }
1411
- if (!selectedProjects && newFilter.size && ![...newFilter.values()].includes(true))
1412
- newFilter.set(newFilter.entries().next().value[0], true);
1413
- if (projectFilters.size !== newFilter.size || [...projectFilters].some(([k, v]) => newFilter.get(k) !== v))
1414
- setProjectFilters(newFilter);
1415
- }, [projectFilters, testModel]);
1416
- React.useEffect(() => {
1417
- if (isRunningTest && (testModel == null ? void 0 : testModel.progress))
1418
- setProgress(testModel.progress);
1419
- else if (!testModel)
1420
- setProgress(void 0);
1421
- }, [testModel, isRunningTest]);
1422
- const { testTree } = React.useMemo(() => {
1423
- if (!testModel)
1424
- return { testTree: new TestTree("", new TeleSuite("", "root"), [], projectFilters, pathSeparator) };
1425
- const testTree2 = new TestTree("", testModel.rootSuite, testModel.loadErrors, projectFilters, pathSeparator);
1426
- testTree2.filterTree(filterText, statusFilters, isRunningTest ? runningState == null ? void 0 : runningState.testIds : void 0);
1427
- testTree2.sortAndPropagateStatus();
1428
- testTree2.shortenRoot();
1429
- testTree2.flattenForSingleProject();
1430
- setVisibleTestIds(testTree2.testIds());
1431
- return { testTree: testTree2 };
1432
- }, [filterText, testModel, statusFilters, projectFilters, setVisibleTestIds, runningState, isRunningTest]);
1433
- const runTests = React.useCallback((mode, testIds) => {
1434
- if (!testServerConnection || !testModel)
1435
- return;
1436
- if (mode === "bounce-if-busy" && isRunningTest)
1437
- return;
1438
- runTestBacklog.current = /* @__PURE__ */ new Set([...runTestBacklog.current, ...testIds]);
1439
- commandQueue.current = commandQueue.current.then(async () => {
1440
- var _a2, _b, _c;
1441
- const testIds2 = runTestBacklog.current;
1442
- runTestBacklog.current = /* @__PURE__ */ new Set();
1443
- if (!testIds2.size)
1444
- return;
1445
- {
1446
- for (const test of ((_a2 = testModel.rootSuite) == null ? void 0 : _a2.allTests()) || []) {
1447
- if (testIds2.has(test.id)) {
1448
- test.results = [];
1449
- const result = test._createTestResult("pending");
1450
- result[statusEx] = "scheduled";
1451
- }
1452
- }
1453
- setTestModel({ ...testModel });
1454
- }
1455
- const time = " [" + (/* @__PURE__ */ new Date()).toLocaleTimeString() + "]";
1456
- xtermDataSource.write("\x1B[2m—".repeat(Math.max(0, xtermSize.cols - time.length)) + time + "\x1B[22m");
1457
- setProgress({ total: 0, passed: 0, failed: 0, skipped: 0 });
1458
- setRunningState({ testIds: testIds2 });
1459
- await testServerConnection.runTests({
1460
- locations: queryParams.args,
1461
- grep: queryParams.grep,
1462
- grepInvert: queryParams.grepInvert,
1463
- testIds: [...testIds2],
1464
- projects: [...projectFilters].filter(([_, v]) => v).map(([p]) => p),
1465
- // When started with `--workers=1`, the setting allows to undo that.
1466
- // Otherwise, fallback to the cli `--workers=X` argument.
1467
- workers: singleWorker ? "1" : queryParams.workers === "1" ? void 0 : queryParams.workers,
1468
- timeout: queryParams.timeout,
1469
- headed: showBrowser,
1470
- outputDir: queryParams.outputDir,
1471
- updateSnapshots: updateSnapshots ? "all" : queryParams.updateSnapshots,
1472
- reporters: queryParams.reporters,
1473
- trace: "on"
1474
- });
1475
- for (const test of ((_b = testModel.rootSuite) == null ? void 0 : _b.allTests()) || []) {
1476
- if (((_c = test.results[0]) == null ? void 0 : _c.duration) === -1)
1477
- test.results = [];
1478
- }
1479
- setTestModel({ ...testModel });
1480
- setRunningState((oldState) => oldState ? { ...oldState, completed: true } : void 0);
1481
- });
1482
- }, [projectFilters, isRunningTest, testModel, testServerConnection, singleWorker, showBrowser, updateSnapshots]);
1483
- React.useEffect(() => {
1484
- if (!testServerConnection || !teleSuiteUpdater)
1485
- return;
1486
- const disposable = testServerConnection.onTestFilesChanged(async (params) => {
1487
- commandQueue.current = commandQueue.current.then(async () => {
1488
- setIsLoading(true);
1489
- try {
1490
- const result = await testServerConnection.listTests({ projects: queryParams.projects, locations: queryParams.args, grep: queryParams.grep, grepInvert: queryParams.grepInvert, outputDir: queryParams.outputDir });
1491
- teleSuiteUpdater.processListReport(result.report);
1492
- } catch (e) {
1493
- console.log(e);
1494
- } finally {
1495
- setIsLoading(false);
1496
- }
1497
- });
1498
- await commandQueue.current;
1499
- if (params.testFiles.length === 0)
1500
- return;
1501
- const testModel2 = teleSuiteUpdater.asModel();
1502
- const testTree2 = new TestTree("", testModel2.rootSuite, testModel2.loadErrors, projectFilters, pathSeparator);
1503
- const testIds = [];
1504
- const set = new Set(params.testFiles);
1505
- if (watchAll) {
1506
- const visit = (treeItem) => {
1507
- const fileName = treeItem.location.file;
1508
- if (fileName && set.has(fileName))
1509
- testIds.push(...testTree2.collectTestIds(treeItem));
1510
- if (treeItem.kind === "group" && treeItem.subKind === "folder")
1511
- treeItem.children.forEach(visit);
1512
- };
1513
- visit(testTree2.rootItem);
1514
- } else {
1515
- for (const treeId of watchedTreeIds.value) {
1516
- const treeItem = testTree2.treeItemById(treeId);
1517
- const fileName = treeItem == null ? void 0 : treeItem.location.file;
1518
- if (fileName && set.has(fileName))
1519
- testIds.push(...testTree2.collectTestIds(treeItem));
1520
- }
1521
- }
1522
- runTests("queue-if-busy", new Set(testIds));
1523
- });
1524
- return () => disposable.dispose();
1525
- }, [runTests, testServerConnection, watchAll, watchedTreeIds, teleSuiteUpdater, projectFilters]);
1526
- React.useEffect(() => {
1527
- if (!testServerConnection)
1528
- return;
1529
- const onShortcutEvent = (e) => {
1530
- if (e.code === "Backquote" && e.ctrlKey) {
1531
- e.preventDefault();
1532
- setIsShowingOutput(!isShowingOutput);
1533
- } else if (e.code === "F5" && e.shiftKey) {
1534
- e.preventDefault();
1535
- testServerConnection == null ? void 0 : testServerConnection.stopTestsNoReply({});
1536
- } else if (e.code === "F5") {
1537
- e.preventDefault();
1538
- runTests("bounce-if-busy", visibleTestIds);
1539
- }
1540
- };
1541
- addEventListener("keydown", onShortcutEvent);
1542
- return () => {
1543
- removeEventListener("keydown", onShortcutEvent);
1544
- };
1545
- }, [runTests, reloadTests, testServerConnection, visibleTestIds, isShowingOutput]);
1546
- const dialogRef = React.useRef(null);
1547
- const openInstallDialog = React.useCallback((e) => {
1548
- var _a2;
1549
- e.preventDefault();
1550
- e.stopPropagation();
1551
- (_a2 = dialogRef.current) == null ? void 0 : _a2.showModal();
1552
- }, []);
1553
- const closeInstallDialog = React.useCallback((e) => {
1554
- var _a2;
1555
- e.preventDefault();
1556
- e.stopPropagation();
1557
- (_a2 = dialogRef.current) == null ? void 0 : _a2.close();
1558
- }, []);
1559
- const installBrowsers = React.useCallback((e) => {
1560
- closeInstallDialog(e);
1561
- setIsShowingOutput(true);
1562
- testServerConnection == null ? void 0 : testServerConnection.installBrowsers({}).then(async () => {
1563
- setIsShowingOutput(false);
1564
- const { hasBrowsers: hasBrowsers2 } = await (testServerConnection == null ? void 0 : testServerConnection.checkBrowsers({}));
1565
- setHasBrowsers(hasBrowsers2);
1566
- });
1567
- }, [closeInstallDialog, testServerConnection]);
1568
- return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox ui-mode", children: [
1569
- !hasBrowsers && /* @__PURE__ */ jsxRuntimeExports.jsxs("dialog", { ref: dialogRef, children: [
1570
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "title", children: [
1571
- /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "codicon codicon-lightbulb" }),
1572
- "Install browsers"
1573
- ] }),
1574
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "body", children: [
1575
- "Playwright did not find installed browsers.",
1576
- /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
1577
- "Would you like to run `playwright install`?",
1578
- /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
1579
- /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "button", onClick: installBrowsers, children: "Install" }),
1580
- /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "button secondary", onClick: closeInstallDialog, children: "Dismiss" })
1581
- ] })
1582
- ] }),
1583
- isDisconnected && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "disconnected", children: [
1584
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "title", children: "UI Mode disconnected" }),
1585
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
1586
- /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "#", onClick: () => window.location.href = "/", children: "Reload the page" }),
1587
- " to reconnect"
1588
- ] })
1589
- ] }),
1590
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1591
- SplitView,
1592
- {
1593
- sidebarSize: 250,
1594
- minSidebarSize: 150,
1595
- orientation: "horizontal",
1596
- sidebarIsFirst: true,
1597
- settingName: "testListSidebar",
1598
- main: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox", children: [
1599
- /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: clsx("vbox", !isShowingOutput && "hidden"), children: [
1600
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { children: [
1601
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "section-title", style: { flex: "none" }, children: "Output" }),
1602
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "circle-slash", title: "Clear output", onClick: () => xtermDataSource.clear() }),
1603
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "spacer" }),
1604
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "close", title: "Close", onClick: () => setIsShowingOutput(false) })
1605
- ] }),
1606
- /* @__PURE__ */ jsxRuntimeExports.jsx(XtermWrapper, { source: xtermDataSource })
1607
- ] }),
1608
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: clsx("vbox", isShowingOutput && "hidden"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1609
- TraceView,
1610
- {
1611
- item: selectedItem,
1612
- rootDir: (_a = testModel == null ? void 0 : testModel.config) == null ? void 0 : _a.rootDir,
1613
- revealSource,
1614
- onOpenExternally: (location) => testServerConnection == null ? void 0 : testServerConnection.openNoReply({ location: { file: location.file, line: location.line, column: location.column } })
1615
- }
1616
- ) })
1617
- ] }),
1618
- sidebar: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "vbox ui-mode-sidebar", children: [
1619
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { noShadow: true, noMinHeight: true, children: [
1620
- /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "playwright-logo.svg", alt: "Playwright logo" }),
1621
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "section-title", children: "Playwright" }),
1622
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "refresh", title: "Reload", onClick: () => reloadTests(), disabled: isRunningTest || isLoading }),
1623
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "terminal", title: "Toggle output — " + (isMac ? "⌃`" : "Ctrl + `"), toggled: isShowingOutput, onClick: () => {
1624
- setIsShowingOutput(!isShowingOutput);
1625
- } }),
1626
- !hasBrowsers && /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "lightbulb-autofix", style: { color: "var(--vscode-list-warningForeground)" }, title: "Playwright browsers are missing", onClick: openInstallDialog })
1627
- ] }),
1628
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1629
- FiltersView,
1630
- {
1631
- filterText,
1632
- setFilterText,
1633
- statusFilters,
1634
- setStatusFilters,
1635
- projectFilters,
1636
- setProjectFilters,
1637
- testModel,
1638
- runTests: () => runTests("bounce-if-busy", visibleTestIds)
1639
- }
1640
- ),
1641
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { noMinHeight: true, children: [
1642
- !isRunningTest && !progress && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "section-title", children: "Tests" }),
1643
- !isRunningTest && progress && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "data-testid": "status-line", className: "status-line", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
1644
- progress.passed,
1645
- "/",
1646
- progress.total,
1647
- " passed (",
1648
- progress.passed / progress.total * 100 | 0,
1649
- "%)"
1650
- ] }) }),
1651
- isRunningTest && progress && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { "data-testid": "status-line", className: "status-line", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
1652
- "Running ",
1653
- progress.passed,
1654
- "/",
1655
- runningState.testIds.size,
1656
- " passed (",
1657
- progress.passed / runningState.testIds.size * 100 | 0,
1658
- "%)"
1659
- ] }) }),
1660
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "play", title: "Run all — F5", onClick: () => runTests("bounce-if-busy", visibleTestIds), disabled: isRunningTest || isLoading }),
1661
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "debug-stop", title: "Stop — " + (isMac ? "⇧F5" : "Shift + F5"), onClick: () => testServerConnection == null ? void 0 : testServerConnection.stopTests({}), disabled: !isRunningTest || isLoading }),
1662
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "eye", title: "Watch all", toggled: watchAll, onClick: () => {
1663
- setWatchedTreeIds({ value: /* @__PURE__ */ new Set() });
1664
- setWatchAll(!watchAll);
1665
- } }),
1666
- /* @__PURE__ */ jsxRuntimeExports.jsx(ToolbarButton, { icon: "collapse-all", title: "Collapse all", onClick: () => {
1667
- setCollapseAllCount(collapseAllCount + 1);
1668
- } })
1669
- ] }),
1670
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1671
- TestListView,
1672
- {
1673
- filterText,
1674
- testModel,
1675
- testTree,
1676
- testServerConnection,
1677
- runningState,
1678
- runTests,
1679
- onItemSelected: setSelectedItem,
1680
- watchAll,
1681
- watchedTreeIds,
1682
- setWatchedTreeIds,
1683
- isLoading,
1684
- requestedCollapseAllCount: collapseAllCount,
1685
- setFilterText,
1686
- onRevealSource
1687
- }
1688
- ),
1689
- showTestingOptions,
1690
- /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { noShadow: true, noMinHeight: true, className: "settings-toolbar", onClick: () => setSettingsVisible(!settingsVisible), children: [
1691
- /* @__PURE__ */ jsxRuntimeExports.jsx(
1692
- "span",
1693
- {
1694
- className: `codicon codicon-${settingsVisible ? "chevron-down" : "chevron-right"}`,
1695
- style: { marginLeft: 5 },
1696
- title: settingsVisible ? "Hide Settings" : "Show Settings"
1697
- }
1698
- ),
1699
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "section-title", children: "Settings" })
1700
- ] }),
1701
- settingsVisible && /* @__PURE__ */ jsxRuntimeExports.jsx(SettingsView, { settings: [
1702
- { value: darkMode, set: setDarkMode, title: "Dark mode" },
1703
- { value: showRouteActions, set: setShowRouteActions, title: "Show route actions" }
1704
- ] })
1705
- ] })
1706
- }
1707
- )
1708
- ] });
1709
- };
1710
- (async () => {
1711
- applyTheme();
1712
- if (window.location.protocol !== "file:") {
1713
- if (window.location.href.includes("isUnderTest=true"))
1714
- await new Promise((f) => setTimeout(f, 1e3));
1715
- if (!navigator.serviceWorker)
1716
- throw new Error(`Service workers are not supported.
1717
- Make sure to serve the website (${window.location}) via HTTPS or localhost.`);
1718
- navigator.serviceWorker.register("sw.bundle.js");
1719
- if (!navigator.serviceWorker.controller) {
1720
- await new Promise((f) => {
1721
- navigator.serviceWorker.oncontrollerchange = () => f();
1722
- });
1723
- }
1724
- setInterval(function() {
1725
- fetch("ping");
1726
- }, 1e4);
1727
- }
1728
- createRoot(document.querySelector("#root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(UIModeView, {}));
1729
- })();
1730
- //# sourceMappingURL=uiMode.C4nbcio6.js.map