patchright-core 1.57.0 → 1.59.0

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 (307) hide show
  1. package/ThirdPartyNotices.txt +2688 -297
  2. package/browsers.json +23 -22
  3. package/lib/bootstrap.js +77 -0
  4. package/lib/cli/browserActions.js +308 -0
  5. package/lib/cli/driver.js +3 -2
  6. package/lib/cli/installActions.js +171 -0
  7. package/lib/cli/program.js +48 -413
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -0
  10. package/lib/client/browser.js +11 -5
  11. package/lib/client/browserContext.js +20 -23
  12. package/lib/client/browserType.js +23 -54
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/clientHelper.js +2 -1
  16. package/lib/client/clock.js +0 -1
  17. package/lib/client/{webSocket.js → connect.js} +57 -7
  18. package/lib/client/connection.js +8 -0
  19. package/lib/client/consoleMessage.js +3 -0
  20. package/lib/client/debugger.js +57 -0
  21. package/lib/client/dialog.js +8 -1
  22. package/lib/client/disposable.js +76 -0
  23. package/lib/client/electron.js +1 -0
  24. package/lib/client/elementHandle.js +1 -1
  25. package/lib/client/events.js +3 -0
  26. package/lib/client/fetch.js +2 -4
  27. package/lib/client/frame.js +9 -13
  28. package/lib/client/harRouter.js +13 -1
  29. package/lib/client/jsHandle.js +4 -8
  30. package/lib/client/locator.js +13 -36
  31. package/lib/client/network.js +14 -11
  32. package/lib/client/page.js +44 -50
  33. package/lib/client/screencast.js +88 -0
  34. package/lib/client/selectors.js +3 -1
  35. package/lib/client/tracing.js +11 -5
  36. package/lib/client/video.js +13 -20
  37. package/lib/client/worker.js +6 -6
  38. package/lib/generated/bindingsControllerSource.js +1 -1
  39. package/lib/generated/clockSource.js +1 -1
  40. package/lib/generated/injectedScriptSource.js +1 -1
  41. package/lib/generated/pollingRecorderSource.js +1 -1
  42. package/lib/generated/storageScriptSource.js +1 -1
  43. package/lib/generated/utilityScriptSource.js +1 -1
  44. package/lib/mcpBundle.js +78 -0
  45. package/lib/mcpBundleImpl.js +91 -0
  46. package/lib/protocol/serializers.js +5 -0
  47. package/lib/protocol/validator.js +228 -58
  48. package/lib/protocol/validatorPrimitives.js +1 -1
  49. package/lib/remote/playwrightConnection.js +10 -8
  50. package/lib/remote/playwrightPipeServer.js +100 -0
  51. package/lib/remote/playwrightServer.js +14 -10
  52. package/lib/remote/playwrightWebSocketServer.js +73 -0
  53. package/lib/remote/serverTransport.js +96 -0
  54. package/lib/server/android/android.js +2 -2
  55. package/lib/server/artifact.js +1 -1
  56. package/lib/server/bidi/bidiBrowser.js +80 -14
  57. package/lib/server/bidi/bidiChromium.js +23 -14
  58. package/lib/server/bidi/bidiConnection.js +1 -0
  59. package/lib/server/bidi/bidiDeserializer.js +116 -0
  60. package/lib/server/bidi/bidiExecutionContext.js +75 -29
  61. package/lib/server/bidi/bidiFirefox.js +6 -8
  62. package/lib/server/bidi/bidiNetworkManager.js +40 -12
  63. package/lib/server/bidi/bidiPage.js +67 -40
  64. package/lib/server/bidi/third_party/bidiProtocolCore.js +1 -0
  65. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  66. package/lib/server/browser.js +84 -21
  67. package/lib/server/browserContext.js +137 -77
  68. package/lib/server/browserType.js +26 -16
  69. package/lib/server/chromium/chromium.js +28 -31
  70. package/lib/server/chromium/chromiumSwitches.js +16 -4
  71. package/lib/server/chromium/crBrowser.js +40 -27
  72. package/lib/server/chromium/crConnection.js +0 -5
  73. package/lib/server/chromium/crDevTools.js +1 -2
  74. package/lib/server/chromium/crNetworkManager.js +54 -229
  75. package/lib/server/chromium/crPage.js +74 -260
  76. package/lib/server/chromium/crServiceWorker.js +7 -14
  77. package/lib/server/clock.js +33 -41
  78. package/lib/server/codegen/javascript.js +6 -29
  79. package/lib/server/console.js +5 -1
  80. package/lib/server/debugController.js +12 -6
  81. package/lib/server/debugger.js +40 -47
  82. package/lib/server/deviceDescriptorsSource.json +137 -137
  83. package/lib/server/dispatchers/browserContextDispatcher.js +30 -30
  84. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  85. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  86. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  87. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  88. package/lib/server/dispatchers/dispatcher.js +7 -14
  89. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  90. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  91. package/lib/server/dispatchers/frameDispatcher.js +7 -7
  92. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  93. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  94. package/lib/server/dispatchers/pageDispatcher.js +101 -34
  95. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  96. package/lib/server/disposable.js +41 -0
  97. package/lib/server/dom.js +56 -29
  98. package/lib/server/download.js +3 -2
  99. package/lib/server/electron/electron.js +17 -9
  100. package/lib/server/firefox/ffBrowser.js +9 -29
  101. package/lib/server/firefox/ffConnection.js +0 -5
  102. package/lib/server/firefox/ffInput.js +21 -5
  103. package/lib/server/firefox/ffNetworkManager.js +4 -4
  104. package/lib/server/firefox/ffPage.js +27 -33
  105. package/lib/server/firefox/firefox.js +6 -8
  106. package/lib/server/frameSelectors.js +14 -169
  107. package/lib/server/frames.js +263 -551
  108. package/lib/server/har/harRecorder.js +2 -2
  109. package/lib/server/har/harTracer.js +5 -4
  110. package/lib/server/input.js +49 -4
  111. package/lib/server/instrumentation.js +8 -0
  112. package/lib/server/javascript.js +6 -22
  113. package/lib/server/launchApp.js +0 -1
  114. package/lib/server/localUtils.js +6 -6
  115. package/lib/server/network.js +59 -20
  116. package/lib/server/overlay.js +138 -0
  117. package/lib/server/page.js +179 -157
  118. package/lib/server/progress.js +32 -6
  119. package/lib/server/recorder/recorderApp.js +84 -104
  120. package/lib/server/recorder.js +76 -40
  121. package/lib/server/registry/browserFetcher.js +6 -4
  122. package/lib/server/registry/index.js +222 -226
  123. package/lib/server/registry/nativeDeps.js +1 -0
  124. package/lib/server/registry/oopDownloadBrowserMain.js +3 -0
  125. package/lib/server/screencast.js +137 -0
  126. package/lib/server/trace/recorder/snapshotter.js +2 -2
  127. package/lib/server/trace/recorder/snapshotterInjected.js +21 -1
  128. package/lib/server/trace/recorder/tracing.js +98 -47
  129. package/lib/server/trace/viewer/traceViewer.js +24 -21
  130. package/lib/server/usKeyboardLayout.js +7 -0
  131. package/lib/server/utils/comparators.js +1 -1
  132. package/lib/server/utils/disposable.js +32 -0
  133. package/lib/server/utils/eventsHelper.js +3 -1
  134. package/lib/server/utils/expectUtils.js +87 -2
  135. package/lib/server/utils/fileUtils.js +16 -2
  136. package/lib/server/utils/happyEyeballs.js +15 -12
  137. package/lib/server/utils/httpServer.js +10 -23
  138. package/lib/server/utils/network.js +39 -29
  139. package/lib/server/utils/processLauncher.js +8 -6
  140. package/lib/server/utils/zipFile.js +2 -2
  141. package/lib/server/videoRecorder.js +194 -0
  142. package/lib/server/webkit/webkit.js +4 -6
  143. package/lib/server/webkit/wkBrowser.js +1 -10
  144. package/lib/server/webkit/wkConnection.js +1 -6
  145. package/lib/server/webkit/wkInterceptableRequest.js +29 -1
  146. package/lib/server/webkit/wkPage.js +88 -57
  147. package/lib/server/webkit/wkWorkers.js +2 -1
  148. package/lib/serverRegistry.js +156 -0
  149. package/lib/tools/backend/browserBackend.js +79 -0
  150. package/lib/tools/backend/common.js +63 -0
  151. package/lib/tools/backend/config.js +41 -0
  152. package/lib/tools/backend/console.js +66 -0
  153. package/lib/tools/backend/context.js +296 -0
  154. package/lib/tools/backend/cookies.js +152 -0
  155. package/lib/tools/backend/devtools.js +69 -0
  156. package/lib/tools/backend/dialogs.js +59 -0
  157. package/lib/tools/backend/evaluate.js +64 -0
  158. package/lib/tools/backend/files.js +60 -0
  159. package/lib/tools/backend/form.js +64 -0
  160. package/lib/tools/backend/keyboard.js +155 -0
  161. package/lib/tools/backend/logFile.js +95 -0
  162. package/lib/tools/backend/mouse.js +168 -0
  163. package/lib/tools/backend/navigate.js +106 -0
  164. package/lib/tools/backend/network.js +135 -0
  165. package/lib/tools/backend/pdf.js +48 -0
  166. package/lib/tools/backend/response.js +305 -0
  167. package/lib/tools/backend/route.js +140 -0
  168. package/lib/tools/backend/runCode.js +77 -0
  169. package/lib/tools/backend/screenshot.js +88 -0
  170. package/lib/tools/backend/sessionLog.js +74 -0
  171. package/lib/tools/backend/snapshot.js +208 -0
  172. package/lib/tools/backend/storage.js +68 -0
  173. package/lib/tools/backend/tab.js +445 -0
  174. package/lib/tools/backend/tabs.js +67 -0
  175. package/lib/tools/backend/tool.js +47 -0
  176. package/lib/tools/backend/tools.js +102 -0
  177. package/lib/tools/backend/tracing.js +78 -0
  178. package/lib/tools/backend/utils.js +83 -0
  179. package/lib/tools/backend/verify.js +151 -0
  180. package/lib/tools/backend/video.js +98 -0
  181. package/lib/tools/backend/wait.js +63 -0
  182. package/lib/tools/backend/webstorage.js +223 -0
  183. package/lib/tools/cli-client/cli.js +6 -0
  184. package/lib/tools/cli-client/help.json +399 -0
  185. package/lib/tools/cli-client/minimist.js +128 -0
  186. package/lib/tools/cli-client/program.js +350 -0
  187. package/lib/tools/cli-client/registry.js +176 -0
  188. package/lib/tools/cli-client/session.js +289 -0
  189. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  190. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  191. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  192. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  193. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  194. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  195. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  196. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  197. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  198. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  199. package/lib/tools/cli-daemon/command.js +73 -0
  200. package/lib/tools/cli-daemon/commands.js +956 -0
  201. package/lib/tools/cli-daemon/daemon.js +157 -0
  202. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  203. package/lib/tools/cli-daemon/program.js +129 -0
  204. package/lib/tools/dashboard/appIcon.png +0 -0
  205. package/lib/tools/dashboard/dashboardApp.js +284 -0
  206. package/lib/tools/dashboard/dashboardController.js +296 -0
  207. package/lib/tools/exports.js +60 -0
  208. package/lib/tools/mcp/browserFactory.js +233 -0
  209. package/lib/tools/mcp/cdpRelay.js +352 -0
  210. package/lib/tools/mcp/cli-stub.js +7 -0
  211. package/lib/tools/mcp/config.d.js +16 -0
  212. package/lib/tools/mcp/config.js +446 -0
  213. package/lib/tools/mcp/configIni.js +189 -0
  214. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  215. package/lib/tools/mcp/index.js +62 -0
  216. package/lib/tools/mcp/log.js +35 -0
  217. package/lib/tools/mcp/program.js +107 -0
  218. package/lib/tools/mcp/protocol.js +28 -0
  219. package/lib/tools/mcp/watchdog.js +44 -0
  220. package/lib/tools/trace/SKILL.md +171 -0
  221. package/lib/tools/trace/installSkill.js +48 -0
  222. package/lib/tools/trace/traceActions.js +142 -0
  223. package/lib/tools/trace/traceAttachments.js +69 -0
  224. package/lib/tools/trace/traceCli.js +87 -0
  225. package/lib/tools/trace/traceConsole.js +97 -0
  226. package/lib/tools/trace/traceErrors.js +55 -0
  227. package/lib/tools/trace/traceOpen.js +69 -0
  228. package/lib/tools/trace/traceParser.js +96 -0
  229. package/lib/tools/trace/traceRequests.js +182 -0
  230. package/lib/tools/trace/traceScreenshot.js +68 -0
  231. package/lib/tools/trace/traceSnapshot.js +149 -0
  232. package/lib/tools/trace/traceUtils.js +153 -0
  233. package/lib/tools/utils/connect.js +32 -0
  234. package/lib/tools/utils/mcp/http.js +152 -0
  235. package/lib/tools/utils/mcp/server.js +230 -0
  236. package/lib/tools/utils/mcp/tool.js +47 -0
  237. package/lib/tools/utils/socketConnection.js +108 -0
  238. package/lib/utils/isomorphic/ariaSnapshot.js +60 -2
  239. package/lib/utils/isomorphic/formatUtils.js +64 -0
  240. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  241. package/lib/utils/isomorphic/lruCache.js +51 -0
  242. package/lib/utils/isomorphic/mimeType.js +7 -2
  243. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  244. package/lib/utils/isomorphic/protocolMetainfo.js +127 -98
  245. package/lib/utils/isomorphic/stringUtils.js +49 -0
  246. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  247. package/lib/utils/isomorphic/trace/entries.js +16 -0
  248. package/lib/utils/isomorphic/trace/snapshotRenderer.js +492 -0
  249. package/lib/utils/isomorphic/trace/snapshotServer.js +120 -0
  250. package/lib/utils/isomorphic/trace/snapshotStorage.js +89 -0
  251. package/lib/utils/isomorphic/trace/traceLoader.js +132 -0
  252. package/lib/utils/isomorphic/trace/traceModel.js +366 -0
  253. package/lib/utils/isomorphic/trace/traceModernizer.js +401 -0
  254. package/lib/utils/isomorphic/trace/versions/traceV3.js +16 -0
  255. package/lib/utils/isomorphic/trace/versions/traceV4.js +16 -0
  256. package/lib/utils/isomorphic/trace/versions/traceV5.js +16 -0
  257. package/lib/utils/isomorphic/trace/versions/traceV6.js +16 -0
  258. package/lib/utils/isomorphic/trace/versions/traceV7.js +16 -0
  259. package/lib/utils/isomorphic/trace/versions/traceV8.js +16 -0
  260. package/lib/utils/isomorphic/urlMatch.js +54 -1
  261. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  262. package/lib/utils/isomorphic/yaml.js +84 -0
  263. package/lib/utils.js +8 -2
  264. package/lib/utilsBundle.js +5 -26
  265. package/lib/utilsBundleImpl/index.js +172 -173
  266. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  267. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  268. package/lib/vite/dashboard/index.html +28 -0
  269. package/lib/vite/htmlReport/index.html +2 -70
  270. package/lib/vite/htmlReport/report.css +1 -0
  271. package/lib/vite/htmlReport/report.js +72 -0
  272. package/lib/vite/recorder/assets/codeMirrorModule-C8KMvO9L.js +32 -0
  273. package/lib/vite/recorder/assets/{codeMirrorModule-C3UTv-Ge.css → codeMirrorModule-DYBRYzYX.css} +1 -1
  274. package/lib/vite/recorder/assets/{index-Ri0uHF7I.css → index-BSjZa4pk.css} +1 -1
  275. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  276. package/lib/vite/recorder/index.html +2 -2
  277. package/lib/vite/traceViewer/assets/codeMirrorModule-DS0FLvoc.js +32 -0
  278. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  279. package/lib/vite/traceViewer/{codeMirrorModule.C3UTv-Ge.css → codeMirrorModule.DYBRYzYX.css} +1 -1
  280. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  281. package/lib/vite/traceViewer/index.CzXZzn5A.css +1 -0
  282. package/lib/vite/traceViewer/index.Dtstcb7U.js +2 -0
  283. package/lib/vite/traceViewer/index.html +4 -4
  284. package/lib/vite/traceViewer/sw.bundle.js +5 -3
  285. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  286. package/lib/vite/traceViewer/uiMode.html +3 -3
  287. package/lib/zipBundleImpl.js +2 -2
  288. package/lib/zodBundle.js +39 -0
  289. package/lib/zodBundleImpl.js +40 -0
  290. package/package.json +7 -1
  291. package/types/protocol.d.ts +1696 -221
  292. package/types/types.d.ts +879 -112
  293. package/lib/server/bidi/third_party/bidiDeserializer.js +0 -98
  294. package/lib/server/chromium/videoRecorder.js +0 -115
  295. package/lib/server/pageBinding.js +0 -87
  296. package/lib/server/trace/test/inMemorySnapshotter.js +0 -87
  297. package/lib/utils/isomorphic/oldUtilityScriptSerializers.js +0 -248
  298. package/lib/vite/recorder/assets/codeMirrorModule-CBbSe-ZI.js +0 -25
  299. package/lib/vite/recorder/assets/index-CpZVd2nA.js +0 -193
  300. package/lib/vite/traceViewer/assets/codeMirrorModule-DHz0wP2C.js +0 -25
  301. package/lib/vite/traceViewer/assets/defaultSettingsView-WsZP88O6.js +0 -266
  302. package/lib/vite/traceViewer/defaultSettingsView.ConWv5KN.css +0 -1
  303. package/lib/vite/traceViewer/index.C4Y3Aw8n.css +0 -1
  304. package/lib/vite/traceViewer/index.C8xAeo93.js +0 -2
  305. package/lib/vite/traceViewer/uiMode.BltraIJB.js +0 -5
  306. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  307. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -37,7 +37,6 @@ var import_artifact = require("../artifact");
37
37
  var import_harTracer = require("./harTracer");
38
38
  var import_crypto = require("../utils/crypto");
39
39
  var import_manualPromise = require("../../utils/isomorphic/manualPromise");
40
- var import_zipBundle = require("../../zipBundle");
41
40
  class HarRecorder {
42
41
  constructor(context, page, options) {
43
42
  this._isFlushed = false;
@@ -56,7 +55,8 @@ class HarRecorder {
56
55
  waitForContentOnStop: true,
57
56
  urlFilter: urlFilterRe ?? options.urlGlob
58
57
  });
59
- this._zipFile = content === "attach" || expectsZip ? new import_zipBundle.yazl.ZipFile() : null;
58
+ const { yazl } = require("../../zipBundle");
59
+ this._zipFile = content === "attach" || expectsZip ? new yazl.ZipFile() : null;
60
60
  this._tracer.start({ omitScripts: false });
61
61
  }
62
62
  onEntryStarted(entry) {
@@ -278,9 +278,6 @@ class HarTracer {
278
278
  harEntry._securityDetails = details;
279
279
  }));
280
280
  }
281
- const httpVersion = response.httpVersion();
282
- harEntry.request.httpVersion = httpVersion;
283
- harEntry.response.httpVersion = httpVersion;
284
281
  const compressionCalculationBarrier = this._options.omitSizes ? void 0 : {
285
282
  _encodedBodySize: -1,
286
283
  _decodedBodySize: -1,
@@ -317,6 +314,10 @@ class HarTracer {
317
314
  this._delegate.onEntryFinished(harEntry);
318
315
  });
319
316
  this._addBarrier(page || request.serviceWorker(), promise);
317
+ this._addBarrier(page || request.serviceWorker(), response.httpVersion().then((httpVersion) => {
318
+ harEntry.request.httpVersion = httpVersion;
319
+ harEntry.response.httpVersion = httpVersion;
320
+ }));
320
321
  const timing = response.timing();
321
322
  harEntry.timings.receive = response.request()._responseEndTiming !== -1 ? import_helper.helper.millisToRoundishMillis(response.request()._responseEndTiming - timing.responseStart) : -1;
322
323
  this._computeHarEntryTotalTime(harEntry);
@@ -389,7 +390,7 @@ class HarTracer {
389
390
  harEntry.response = {
390
391
  status: response.status(),
391
392
  statusText: response.statusText(),
392
- httpVersion: response.httpVersion(),
393
+ httpVersion: FALLBACK_HTTP_VERSION,
393
394
  // These are bad values that will be overwritten below.
394
395
  cookies: [],
395
396
  headers: [],
@@ -48,6 +48,10 @@ class Keyboard {
48
48
  this._raw = raw;
49
49
  this._page = page;
50
50
  }
51
+ async apiDown(progress, key) {
52
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
53
+ await this.down(progress, key);
54
+ }
51
55
  async down(progress, key) {
52
56
  const description = this._keyDescriptionForString(key);
53
57
  const autoRepeat = this._pressedKeys.has(description.code);
@@ -67,6 +71,10 @@ class Keyboard {
67
71
  return { ...description, text: "" };
68
72
  return description;
69
73
  }
74
+ async apiUp(progress, key) {
75
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
76
+ await this.up(progress, key);
77
+ }
70
78
  async up(progress, key) {
71
79
  const description = this._keyDescriptionForString(key);
72
80
  if (kModifiers.includes(description.key))
@@ -74,9 +82,17 @@ class Keyboard {
74
82
  this._pressedKeys.delete(description.code);
75
83
  await this._raw.keyup(progress, this._pressedModifiers, key, description);
76
84
  }
77
- async insertText(progress, text) {
85
+ async apiInsertText(progress, text) {
86
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
87
+ await this._insertText(progress, text);
88
+ }
89
+ async _insertText(progress, text) {
78
90
  await this._raw.sendText(progress, text);
79
91
  }
92
+ async apiType(progress, text, options) {
93
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
94
+ await this.type(progress, text, options);
95
+ }
80
96
  async type(progress, text, options) {
81
97
  const delay = options && options.delay || void 0;
82
98
  for (const char of text) {
@@ -85,10 +101,14 @@ class Keyboard {
85
101
  } else {
86
102
  if (delay)
87
103
  await progress.wait(delay);
88
- await this.insertText(progress, char);
104
+ await this._insertText(progress, char);
89
105
  }
90
106
  }
91
107
  }
108
+ async apiPress(progress, key, options = {}) {
109
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
110
+ await this.press(progress, key, options);
111
+ }
92
112
  async press(progress, key, options = {}) {
93
113
  function split(keyString) {
94
114
  const keys = [];
@@ -157,6 +177,11 @@ class Mouse {
157
177
  currentPoint() {
158
178
  return { x: this._x, y: this._y };
159
179
  }
180
+ async apiMove(progress, x, y, options = {}) {
181
+ progress.metadata.point = { x, y };
182
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
183
+ await this.move(progress, x, y, options);
184
+ }
160
185
  async move(progress, x, y, options = {}) {
161
186
  const { steps = 1 } = options;
162
187
  const fromX = this._x;
@@ -169,18 +194,33 @@ class Mouse {
169
194
  await this._raw.move(progress, middleX, middleY, this._lastButton, this._buttons, this._keyboard._modifiers(), !!options.forClick);
170
195
  }
171
196
  }
197
+ async apiDown(progress, options = {}) {
198
+ progress.metadata.point = this.currentPoint();
199
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
200
+ await this.down(progress, options);
201
+ }
172
202
  async down(progress, options = {}) {
173
203
  const { button = "left", clickCount = 1 } = options;
174
204
  this._lastButton = button;
175
205
  this._buttons.add(button);
176
206
  await this._raw.down(progress, this._x, this._y, this._lastButton, this._buttons, this._keyboard._modifiers(), clickCount);
177
207
  }
208
+ async apiUp(progress, options = {}) {
209
+ progress.metadata.point = this.currentPoint();
210
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
211
+ await this.up(progress, options);
212
+ }
178
213
  async up(progress, options = {}) {
179
214
  const { button = "left", clickCount = 1 } = options;
180
215
  this._lastButton = "none";
181
216
  this._buttons.delete(button);
182
217
  await this._raw.up(progress, this._x, this._y, button, this._buttons, this._keyboard._modifiers(), clickCount);
183
218
  }
219
+ async apiClick(progress, x, y, options = {}) {
220
+ progress.metadata.point = { x, y };
221
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
222
+ await this.click(progress, x, y, options);
223
+ }
184
224
  async click(progress, x, y, options = {}) {
185
225
  const { delay = null, clickCount = 1, steps } = options;
186
226
  if (delay) {
@@ -206,7 +246,8 @@ class Mouse {
206
246
  await Promise.all(promises);
207
247
  }
208
248
  }
209
- async wheel(progress, deltaX, deltaY) {
249
+ async apiWheel(progress, deltaX, deltaY) {
250
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
210
251
  await this._raw.wheel(progress, this._x, this._y, this._buttons, this._keyboard._modifiers(), deltaX, deltaY);
211
252
  }
212
253
  }
@@ -260,9 +301,13 @@ class Touchscreen {
260
301
  this._raw = raw;
261
302
  this._page = page;
262
303
  }
263
- async tap(progress, x, y) {
304
+ async apiTap(progress, x, y) {
264
305
  if (!this._page.browserContext._options.hasTouch)
265
306
  throw new Error("hasTouch must be enabled on the browser context before using the touchscreen.");
307
+ await this._page.instrumentation.onBeforeInputAction(this._page, progress.metadata);
308
+ await this.tap(progress, x, y);
309
+ }
310
+ async tap(progress, x, y) {
266
311
  await this._raw.tap(progress, x, y, this._page.keyboard._modifiers());
267
312
  }
268
313
  }
@@ -25,6 +25,7 @@ __export(instrumentation_exports, {
25
25
  module.exports = __toCommonJS(instrumentation_exports);
26
26
  var import_events = require("events");
27
27
  var import_crypto = require("./utils/crypto");
28
+ var import_debugLogger = require("./utils/debugLogger");
28
29
  class SdkObject extends import_events.EventEmitter {
29
30
  constructor(parent, guidPrefix, guid) {
30
31
  super();
@@ -33,6 +34,13 @@ class SdkObject extends import_events.EventEmitter {
33
34
  this.attribution = { ...parent.attribution };
34
35
  this.instrumentation = parent.instrumentation;
35
36
  }
37
+ apiLog(message) {
38
+ if (!this.attribution.playwright.options.isInternalPlaywright)
39
+ import_debugLogger.debugLogger.log("api", message);
40
+ }
41
+ closeReason() {
42
+ return this.attribution.page?._closeReason || this.attribution.context?._closeReason || this.attribution.browser?._closeReason;
43
+ }
36
44
  }
37
45
  function createRootSdkObject() {
38
46
  const fakeParent = { attribution: {}, instrumentation: createInstrumentation() };
@@ -113,30 +113,14 @@ class JSHandle extends import_instrumentation.SdkObject {
113
113
  async evaluateHandle(pageFunction, arg) {
114
114
  return evaluate(this._context, false, pageFunction, this, arg);
115
115
  }
116
- async evaluateExpression(expression, options, arg, isolatedContext) {
117
- let context = this._context;
118
- if (context.constructor.name === "FrameExecutionContext") {
119
- const frame = context.frame;
120
- if (frame) {
121
- if (isolatedContext) context = await frame._utilityContext();
122
- else if (!isolatedContext) context = await frame._mainContext();
123
- }
124
- }
125
- const value = await evaluateExpression(context, expression, { ...options, returnByValue: true }, this, arg);
126
- await context.doSlowMo();
116
+ async evaluateExpression(expression, options, arg) {
117
+ const value = await evaluateExpression(this._context, expression, { ...options, returnByValue: true }, this, arg);
118
+ await this._context.doSlowMo();
127
119
  return value;
128
120
  }
129
- async evaluateExpressionHandle(expression, options, arg, isolatedContext) {
130
- let context = this._context;
131
- if (context.constructor.name === "FrameExecutionContext") {
132
- const frame = this._context.frame;
133
- if (frame) {
134
- if (isolatedContext) context = await frame._utilityContext();
135
- else if (!isolatedContext) context = await frame._mainContext();
136
- }
137
- }
138
- const value = await evaluateExpression(context, expression, { ...options, returnByValue: false }, this, arg);
139
- await context.doSlowMo();
121
+ async evaluateExpressionHandle(expression, options, arg) {
122
+ const value = await evaluateExpression(this._context, expression, { ...options, returnByValue: false }, this, arg);
123
+ await this._context.doSlowMo();
140
124
  return value;
141
125
  }
142
126
  async getProperty(propertyName) {
@@ -106,7 +106,6 @@ async function syncLocalStorageWithSettings(page, appName) {
106
106
  });
107
107
  const settings = await import_fs.default.promises.readFile(settingsFile, "utf-8").catch(() => "{}");
108
108
  await page.addInitScript(
109
- progress,
110
109
  `(${String((settings2) => {
111
110
  if (location && location.protocol === "data:")
112
111
  return;
@@ -45,13 +45,13 @@ var import_crypto = require("./utils/crypto");
45
45
  var import_harBackend = require("./harBackend");
46
46
  var import_manualPromise = require("../utils/isomorphic/manualPromise");
47
47
  var import_zipFile = require("./utils/zipFile");
48
- var import_zipBundle = require("../zipBundle");
49
- var import_traceUtils = require("../utils/isomorphic/traceUtils");
48
+ var import_traceUtils = require("../utils/isomorphic/trace/traceUtils");
50
49
  var import_assert = require("../utils/isomorphic/assert");
51
50
  var import_fileUtils = require("./utils/fileUtils");
52
51
  async function zip(progress, stackSessions, params) {
53
52
  const promise = new import_manualPromise.ManualPromise();
54
- const zipFile = new import_zipBundle.yazl.ZipFile();
53
+ const { yauzl, yazl } = require("../zipBundle");
54
+ const zipFile = new yazl.ZipFile();
55
55
  zipFile.on("error", (error) => promise.reject(error));
56
56
  const addFile = (file, name) => {
57
57
  try {
@@ -69,7 +69,7 @@ async function zip(progress, stackSessions, params) {
69
69
  zipFile.addBuffer(buffer, "trace.stacks");
70
70
  }
71
71
  if (params.includeSources) {
72
- const sourceFiles = /* @__PURE__ */ new Set();
72
+ const sourceFiles = new Set(params.additionalSources);
73
73
  for (const { stack } of stackSession?.callStacks || []) {
74
74
  if (!stack)
75
75
  continue;
@@ -77,7 +77,7 @@ async function zip(progress, stackSessions, params) {
77
77
  sourceFiles.add(file);
78
78
  }
79
79
  for (const sourceFile of sourceFiles)
80
- addFile(sourceFile, "resources/src@" + await (0, import_crypto.calculateSha1)(sourceFile) + ".txt");
80
+ addFile(sourceFile, "resources/src@" + (0, import_crypto.calculateSha1)(sourceFile) + ".txt");
81
81
  }
82
82
  if (params.mode === "write") {
83
83
  await progress.race(import_fs.default.promises.mkdir(import_path.default.dirname(params.zipFile), { recursive: true }));
@@ -90,7 +90,7 @@ async function zip(progress, stackSessions, params) {
90
90
  }
91
91
  const tempFile = params.zipFile + ".tmp";
92
92
  await progress.race(import_fs.default.promises.rename(params.zipFile, tempFile));
93
- import_zipBundle.yauzl.open(tempFile, (err, inZipFile) => {
93
+ yauzl.open(tempFile, (err, inZipFile) => {
94
94
  if (err) {
95
95
  promise.reject(err);
96
96
  return;
@@ -22,6 +22,7 @@ __export(network_exports, {
22
22
  Response: () => Response,
23
23
  Route: () => Route,
24
24
  WebSocket: () => WebSocket,
25
+ applyHeadersOverrides: () => applyHeadersOverrides,
25
26
  filterCookies: () => filterCookies,
26
27
  isLocalHostname: () => isLocalHostname,
27
28
  kMaxCookieExpiresDateInSeconds: () => kMaxCookieExpiresDateInSeconds,
@@ -61,6 +62,48 @@ function filterCookies(cookies, urls) {
61
62
  function isLocalHostname(hostname) {
62
63
  return hostname === "localhost" || hostname.endsWith(".localhost");
63
64
  }
65
+ const FORBIDDEN_HEADER_NAMES = /* @__PURE__ */ new Set([
66
+ "accept-charset",
67
+ "accept-encoding",
68
+ "access-control-request-headers",
69
+ "access-control-request-method",
70
+ "connection",
71
+ "content-length",
72
+ "cookie",
73
+ "date",
74
+ "dnt",
75
+ "expect",
76
+ "host",
77
+ "keep-alive",
78
+ "origin",
79
+ "referer",
80
+ "set-cookie",
81
+ "te",
82
+ "trailer",
83
+ "transfer-encoding",
84
+ "upgrade",
85
+ "via"
86
+ ]);
87
+ const FORBIDDEN_METHODS = /* @__PURE__ */ new Set(["CONNECT", "TRACE", "TRACK"]);
88
+ function isForbiddenHeader(name, value) {
89
+ const lowerName = name.toLowerCase();
90
+ if (FORBIDDEN_HEADER_NAMES.has(lowerName))
91
+ return true;
92
+ if (lowerName.startsWith("proxy-"))
93
+ return true;
94
+ if (lowerName.startsWith("sec-"))
95
+ return true;
96
+ if (lowerName === "x-http-method" || lowerName === "x-http-method-override" || lowerName === "x-method-override") {
97
+ if (value && FORBIDDEN_METHODS.has(value.toUpperCase()))
98
+ return true;
99
+ }
100
+ return false;
101
+ }
102
+ function applyHeadersOverrides(original, overrides) {
103
+ const forbiddenHeaders = original.filter((header) => isForbiddenHeader(header.name, header.value));
104
+ const allowedHeaders = overrides.filter((header) => !isForbiddenHeader(header.name, header.value));
105
+ return mergeHeaders([allowedHeaders, forbiddenHeaders]);
106
+ }
64
107
  const kMaxCookieExpiresDateInSeconds = 253402300799;
65
108
  function rewriteCookies(cookies) {
66
109
  return cookies.map((c) => {
@@ -99,7 +142,6 @@ class Request extends import_instrumentation.SdkObject {
99
142
  this._response = null;
100
143
  this._redirectedTo = null;
101
144
  this._failureText = null;
102
- this._headersMap = /* @__PURE__ */ new Map();
103
145
  this._frame = null;
104
146
  this._serviceWorker = null;
105
147
  this._rawRequestHeadersPromise = new import_manualPromise.ManualPromise();
@@ -118,7 +160,6 @@ class Request extends import_instrumentation.SdkObject {
118
160
  this._method = method;
119
161
  this._postData = postData;
120
162
  this._headers = headers;
121
- this._updateHeadersMap();
122
163
  this._isFavicon = url.endsWith("/favicon.ico") || !!redirectedFrom?._isFavicon;
123
164
  }
124
165
  static {
@@ -132,13 +173,8 @@ class Request extends import_instrumentation.SdkObject {
132
173
  }
133
174
  _applyOverrides(overrides) {
134
175
  this._overrides = { ...this._overrides, ...overrides };
135
- this._updateHeadersMap();
136
176
  return this._overrides;
137
177
  }
138
- _updateHeadersMap() {
139
- for (const { name, value } of this.headers())
140
- this._headersMap.set(name.toLowerCase(), value);
141
- }
142
178
  overrides() {
143
179
  return this._overrides;
144
180
  }
@@ -158,7 +194,8 @@ class Request extends import_instrumentation.SdkObject {
158
194
  return this._overrides?.headers || this._headers;
159
195
  }
160
196
  headerValue(name) {
161
- return this._headersMap.get(name);
197
+ const lowerCaseName = name.toLowerCase();
198
+ return this.headers().find((h) => h.name.toLowerCase() === lowerCaseName)?.value;
162
199
  }
163
200
  // "null" means no raw headers available - we'll use provisional headers as raw headers.
164
201
  setRawRequestHeaders(headers) {
@@ -309,10 +346,7 @@ class Route extends import_instrumentation.SdkObject {
309
346
  throw new Error("New URL must have same protocol as overridden URL");
310
347
  }
311
348
  if (overrides.headers) {
312
- overrides.headers = overrides.headers?.filter((header) => {
313
- const headerName = header.name.toLowerCase();
314
- return headerName !== "cookie" && headerName !== "host";
315
- });
349
+ overrides.headers = applyHeadersOverrides(this._request._headers, overrides.headers);
316
350
  }
317
351
  overrides = this._request._applyOverrides(overrides);
318
352
  const nextHandler = this._futureHandlers.shift();
@@ -339,7 +373,7 @@ class Route extends import_instrumentation.SdkObject {
339
373
  }
340
374
  }
341
375
  class Response extends import_instrumentation.SdkObject {
342
- constructor(request, status, statusText2, headers, timing, getResponseBodyCallback, fromServiceWorker, httpVersion) {
376
+ constructor(request, status, statusText2, headers, timing, getResponseBodyCallback, fromServiceWorker) {
343
377
  super(request.frame() || request._context, "response");
344
378
  this._contentPromise = null;
345
379
  this._finishedPromise = new import_manualPromise.ManualPromise();
@@ -347,6 +381,7 @@ class Response extends import_instrumentation.SdkObject {
347
381
  this._serverAddrPromise = new import_manualPromise.ManualPromise();
348
382
  this._securityDetailsPromise = new import_manualPromise.ManualPromise();
349
383
  this._rawResponseHeadersPromise = new import_manualPromise.ManualPromise();
384
+ this._httpVersionPromise = new import_manualPromise.ManualPromise();
350
385
  this._encodedBodySizePromise = new import_manualPromise.ManualPromise();
351
386
  this._transferSizePromise = new import_manualPromise.ManualPromise();
352
387
  this._responseHeadersSizePromise = new import_manualPromise.ManualPromise();
@@ -360,7 +395,6 @@ class Response extends import_instrumentation.SdkObject {
360
395
  this._headersMap.set(name.toLowerCase(), value);
361
396
  this._getResponseBodyCallback = getResponseBodyCallback;
362
397
  this._request._setResponse(this);
363
- this._httpVersion = httpVersion;
364
398
  this._fromServiceWorker = fromServiceWorker;
365
399
  }
366
400
  _serverAddrFinished(addr) {
@@ -376,7 +410,7 @@ class Response extends import_instrumentation.SdkObject {
376
410
  this._finishedPromise.resolve();
377
411
  }
378
412
  _setHttpVersion(httpVersion) {
379
- this._httpVersion = httpVersion;
413
+ this._httpVersionPromise.resolve(httpVersion);
380
414
  }
381
415
  url() {
382
416
  return this._url;
@@ -436,17 +470,21 @@ class Response extends import_instrumentation.SdkObject {
436
470
  request() {
437
471
  return this._request;
438
472
  }
473
+ finished() {
474
+ return this._finishedPromise;
475
+ }
439
476
  frame() {
440
477
  return this._request.frame();
441
478
  }
442
- httpVersion() {
443
- if (!this._httpVersion)
479
+ async httpVersion() {
480
+ const httpVersion = await this._httpVersionPromise || null;
481
+ if (!httpVersion)
444
482
  return "HTTP/1.1";
445
- if (this._httpVersion === "http/1.1")
483
+ if (httpVersion === "http/1.1")
446
484
  return "HTTP/1.1";
447
- if (this._httpVersion === "h2")
485
+ if (httpVersion === "h2")
448
486
  return "HTTP/2.0";
449
- return this._httpVersion;
487
+ return httpVersion;
450
488
  }
451
489
  fromServiceWorker() {
452
490
  return this._fromServiceWorker;
@@ -617,6 +655,7 @@ function mergeHeaders(headers) {
617
655
  Response,
618
656
  Route,
619
657
  WebSocket,
658
+ applyHeadersOverrides,
620
659
  filterCookies,
621
660
  isLocalHostname,
622
661
  kMaxCookieExpiresDateInSeconds,
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var overlay_exports = {};
20
+ __export(overlay_exports, {
21
+ Overlay: () => Overlay
22
+ });
23
+ module.exports = __toCommonJS(overlay_exports);
24
+ var import_utils = require("../utils");
25
+ var import_page = require("./page");
26
+ class Overlay {
27
+ constructor(page) {
28
+ this._overlays = /* @__PURE__ */ new Map();
29
+ this._page = page;
30
+ this._page.on(import_page.Page.Events.InternalFrameNavigatedToNewDocument, (frame) => {
31
+ if (frame.parentFrame())
32
+ return;
33
+ for (const [id, html] of this._overlays)
34
+ this._doAdd(id, html).catch((e) => import_utils.debugLogger.log("error", e));
35
+ });
36
+ }
37
+ dispose() {
38
+ }
39
+ async show(html, duration) {
40
+ const id = (0, import_utils.createGuid)();
41
+ this._overlays.set(id, html);
42
+ await this._doAdd(id, html).catch((e) => import_utils.debugLogger.log("error", e));
43
+ if (duration) {
44
+ await new Promise((f) => setTimeout(f, duration));
45
+ await this.remove(id);
46
+ }
47
+ return id;
48
+ }
49
+ async _doAdd(id, html) {
50
+ const utility = await this._page.mainFrame()._utilityContext();
51
+ await utility.evaluate(({ injected, html: html2, id: id2 }) => {
52
+ return injected.addUserOverlay(id2, html2);
53
+ }, { injected: await utility.injectedScript(), html, id });
54
+ }
55
+ async remove(id) {
56
+ this._overlays.delete(id);
57
+ const utility = await this._page.mainFrame()._utilityContext();
58
+ await utility.evaluate(({ injected, id: id2 }) => {
59
+ injected.removeUserOverlay(id2);
60
+ }, { injected: await utility.injectedScript(), id }).catch((e) => import_utils.debugLogger.log("error", e));
61
+ }
62
+ async chapter(options) {
63
+ const fadeDuration = 300;
64
+ const descriptionHtml = options.description ? `<div id="description">${(0, import_utils.escapeHTML)(options.description)}</div>` : "";
65
+ const styleSheet = `
66
+ @keyframes pw-chapter-fade-in {
67
+ from { opacity: 0; }
68
+ to { opacity: 1; }
69
+ }
70
+ @keyframes pw-chapter-fade-out {
71
+ from { opacity: 1; }
72
+ to { opacity: 0; }
73
+ }
74
+ #background {
75
+ position: absolute;
76
+ inset: 0;
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ backdrop-filter: blur(2px);
81
+ animation: pw-chapter-fade-in ${fadeDuration}ms ease-out forwards;
82
+ }
83
+ #background.fade-out {
84
+ animation: pw-chapter-fade-out ${fadeDuration}ms ease-in forwards;
85
+ }
86
+ #content {
87
+ background: rgba(0, 0, 0, 0.7);
88
+ border: 1px solid rgba(255, 255, 255, 0.15);
89
+ border-radius: 16px;
90
+ padding: 40px 56px;
91
+ max-width: 560px;
92
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
93
+ }
94
+ #title {
95
+ color: white;
96
+ font-family: system-ui, -apple-system, sans-serif;
97
+ font-size: 28px;
98
+ font-weight: 600;
99
+ line-height: 1.3;
100
+ text-align: center;
101
+ letter-spacing: -0.01em;
102
+ }
103
+ #description {
104
+ color: rgba(255, 255, 255, 0.7);
105
+ font-family: system-ui, -apple-system, sans-serif;
106
+ font-size: 15px;
107
+ line-height: 1.5;
108
+ margin-top: 12px;
109
+ text-align: center;
110
+ }
111
+ `;
112
+ const duration = options.duration ?? 2e3;
113
+ const html = `<style>${styleSheet}</style><div id="background"><div id="content"><div id="title">${(0, import_utils.escapeHTML)(options.title)}</div>${descriptionHtml}</div></div>`;
114
+ const id = await this.show(html);
115
+ await new Promise((f) => setTimeout(f, duration));
116
+ const utility = await this._page.mainFrame()._utilityContext();
117
+ await utility.evaluate(({ injected, id: id2, fadeDuration: fadeDuration2 }) => {
118
+ const overlay = injected.getUserOverlay(id2);
119
+ const bg = overlay?.querySelector("#background");
120
+ if (bg)
121
+ bg.classList.add("fade-out");
122
+ return new Promise((f) => injected.utils.builtins.setTimeout(f, fadeDuration2));
123
+ }, { injected: await utility.injectedScript(), id, fadeDuration }).catch((e) => import_utils.debugLogger.log("error", e));
124
+ await this.remove(id);
125
+ }
126
+ async setVisible(visible) {
127
+ if (!this._overlays.size)
128
+ return;
129
+ const utility = await this._page.mainFrame()._utilityContext();
130
+ await utility.evaluate(({ injected, visible: visible2 }) => {
131
+ injected.setUserOverlaysVisible(visible2);
132
+ }, { injected: await utility.injectedScript(), visible }).catch((e) => import_utils.debugLogger.log("error", e));
133
+ }
134
+ }
135
+ // Annotate the CommonJS export names for ESM import in node:
136
+ 0 && (module.exports = {
137
+ Overlay
138
+ });