@checkly/playwright-core 1.48.22-beta → 1.48.22

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