@checkly/playwright-core 1.48.21 → 1.48.22-beta

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