@checkly/playwright-core 1.47.20-alpha → 1.48.20

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