patchright-bun-core 1.58.2 → 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 (272) hide show
  1. package/ThirdPartyNotices.txt +126 -650
  2. package/browsers.json +16 -14
  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 +47 -411
  8. package/lib/client/android.js +4 -4
  9. package/lib/client/api.js +3 -3
  10. package/lib/client/browser.js +8 -0
  11. package/lib/client/browserContext.js +18 -37
  12. package/lib/client/browserType.js +19 -51
  13. package/lib/client/cdpSession.js +6 -2
  14. package/lib/client/channelOwner.js +1 -1
  15. package/lib/client/{webSocket.js → connect.js} +57 -7
  16. package/lib/client/connection.js +8 -4
  17. package/lib/client/consoleMessage.js +3 -0
  18. package/lib/client/debugger.js +57 -0
  19. package/lib/client/dialog.js +8 -1
  20. package/lib/client/disposable.js +76 -0
  21. package/lib/client/electron.js +1 -0
  22. package/lib/client/elementHandle.js +1 -4
  23. package/lib/client/events.js +3 -3
  24. package/lib/client/fetch.js +0 -1
  25. package/lib/client/frame.js +0 -5
  26. package/lib/client/harRouter.js +13 -1
  27. package/lib/client/jsHandle.js +0 -4
  28. package/lib/client/locator.js +5 -7
  29. package/lib/client/network.js +14 -11
  30. package/lib/client/page.js +34 -48
  31. package/lib/client/platform.js +0 -3
  32. package/lib/client/screencast.js +88 -0
  33. package/lib/client/selectors.js +3 -1
  34. package/lib/client/tracing.js +11 -4
  35. package/lib/client/video.js +13 -20
  36. package/lib/generated/bindingsControllerSource.js +1 -1
  37. package/lib/generated/clockSource.js +1 -1
  38. package/lib/generated/injectedScriptSource.js +1 -1
  39. package/lib/generated/pollingRecorderSource.js +1 -1
  40. package/lib/generated/storageScriptSource.js +1 -1
  41. package/lib/generated/utilityScriptSource.js +1 -1
  42. package/lib/mcpBundle.js +0 -6
  43. package/lib/mcpBundleImpl.js +91 -0
  44. package/lib/protocol/validator.js +216 -118
  45. package/lib/protocol/validatorPrimitives.js +1 -1
  46. package/lib/remote/playwrightConnection.js +10 -8
  47. package/lib/remote/playwrightPipeServer.js +100 -0
  48. package/lib/remote/playwrightServer.js +13 -8
  49. package/lib/remote/playwrightWebSocketServer.js +73 -0
  50. package/lib/remote/serverTransport.js +96 -0
  51. package/lib/server/android/android.js +2 -2
  52. package/lib/server/bidi/bidiBrowser.js +30 -8
  53. package/lib/server/bidi/bidiChromium.js +18 -5
  54. package/lib/server/bidi/bidiNetworkManager.js +39 -11
  55. package/lib/server/bidi/bidiPage.js +31 -15
  56. package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
  57. package/lib/server/browser.js +84 -21
  58. package/lib/server/browserContext.js +97 -58
  59. package/lib/server/browserType.js +14 -12
  60. package/lib/server/chromium/chromium.js +15 -13
  61. package/lib/server/chromium/crBrowser.js +18 -10
  62. package/lib/server/chromium/crNetworkManager.js +4 -4
  63. package/lib/server/chromium/crPage.js +26 -64
  64. package/lib/server/chromium/crServiceWorker.js +5 -4
  65. package/lib/server/clock.js +33 -33
  66. package/lib/server/console.js +5 -1
  67. package/lib/server/debugController.js +12 -6
  68. package/lib/server/debugger.js +40 -47
  69. package/lib/server/deviceDescriptorsSource.json +137 -137
  70. package/lib/server/dispatchers/browserContextDispatcher.js +27 -30
  71. package/lib/server/dispatchers/browserDispatcher.js +11 -5
  72. package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
  73. package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
  74. package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
  75. package/lib/server/dispatchers/dispatcher.js +1 -1
  76. package/lib/server/dispatchers/disposableDispatcher.js +39 -0
  77. package/lib/server/dispatchers/electronDispatcher.js +2 -1
  78. package/lib/server/dispatchers/frameDispatcher.js +3 -3
  79. package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
  80. package/lib/server/dispatchers/networkDispatchers.js +6 -5
  81. package/lib/server/dispatchers/pageDispatcher.js +101 -38
  82. package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
  83. package/lib/server/disposable.js +41 -0
  84. package/lib/server/dom.js +44 -26
  85. package/lib/server/download.js +3 -2
  86. package/lib/server/electron/electron.js +12 -7
  87. package/lib/server/firefox/ffBrowser.js +9 -19
  88. package/lib/server/firefox/ffInput.js +21 -5
  89. package/lib/server/firefox/ffNetworkManager.js +2 -2
  90. package/lib/server/firefox/ffPage.js +24 -27
  91. package/lib/server/frames.js +40 -11
  92. package/lib/server/har/harRecorder.js +2 -2
  93. package/lib/server/har/harTracer.js +5 -4
  94. package/lib/server/input.js +49 -4
  95. package/lib/server/instrumentation.js +5 -0
  96. package/lib/server/launchApp.js +0 -1
  97. package/lib/server/localUtils.js +6 -6
  98. package/lib/server/network.js +9 -8
  99. package/lib/server/overlay.js +138 -0
  100. package/lib/server/page.js +111 -51
  101. package/lib/server/progress.js +6 -0
  102. package/lib/server/recorder/recorderApp.js +9 -8
  103. package/lib/server/recorder.js +76 -40
  104. package/lib/server/registry/index.js +54 -81
  105. package/lib/server/registry/nativeDeps.js +1 -0
  106. package/lib/server/screencast.js +90 -143
  107. package/lib/server/trace/recorder/snapshotter.js +2 -2
  108. package/lib/server/trace/recorder/tracing.js +87 -36
  109. package/lib/server/trace/viewer/traceViewer.js +3 -4
  110. package/lib/server/usKeyboardLayout.js +7 -0
  111. package/lib/server/utils/comparators.js +1 -1
  112. package/lib/server/utils/disposable.js +32 -0
  113. package/lib/server/utils/eventsHelper.js +3 -1
  114. package/lib/server/utils/fileUtils.js +16 -2
  115. package/lib/server/utils/happyEyeballs.js +15 -12
  116. package/lib/server/utils/hostPlatform.js +0 -15
  117. package/lib/server/utils/httpServer.js +5 -3
  118. package/lib/server/utils/network.js +2 -1
  119. package/lib/server/utils/nodePlatform.js +0 -6
  120. package/lib/server/utils/processLauncher.js +8 -6
  121. package/lib/server/utils/zipFile.js +2 -2
  122. package/lib/server/videoRecorder.js +82 -12
  123. package/lib/server/webkit/wkBrowser.js +1 -6
  124. package/lib/server/webkit/wkPage.js +27 -25
  125. package/lib/server/webkit/wkWorkers.js +2 -1
  126. package/lib/serverRegistry.js +156 -0
  127. package/lib/tools/backend/browserBackend.js +79 -0
  128. package/lib/tools/backend/common.js +63 -0
  129. package/lib/tools/backend/config.js +41 -0
  130. package/lib/tools/backend/console.js +66 -0
  131. package/lib/tools/backend/context.js +296 -0
  132. package/lib/tools/backend/cookies.js +152 -0
  133. package/lib/tools/backend/devtools.js +69 -0
  134. package/lib/tools/backend/dialogs.js +59 -0
  135. package/lib/tools/backend/evaluate.js +64 -0
  136. package/lib/tools/backend/files.js +60 -0
  137. package/lib/tools/backend/form.js +64 -0
  138. package/lib/tools/backend/keyboard.js +155 -0
  139. package/lib/tools/backend/logFile.js +95 -0
  140. package/lib/tools/backend/mouse.js +168 -0
  141. package/lib/tools/backend/navigate.js +106 -0
  142. package/lib/tools/backend/network.js +135 -0
  143. package/lib/tools/backend/pdf.js +48 -0
  144. package/lib/tools/backend/response.js +305 -0
  145. package/lib/tools/backend/route.js +140 -0
  146. package/lib/tools/backend/runCode.js +77 -0
  147. package/lib/tools/backend/screenshot.js +88 -0
  148. package/lib/tools/backend/sessionLog.js +74 -0
  149. package/lib/tools/backend/snapshot.js +208 -0
  150. package/lib/tools/backend/storage.js +68 -0
  151. package/lib/tools/backend/tab.js +445 -0
  152. package/lib/tools/backend/tabs.js +67 -0
  153. package/lib/tools/backend/tool.js +47 -0
  154. package/lib/tools/backend/tools.js +102 -0
  155. package/lib/tools/backend/tracing.js +78 -0
  156. package/lib/tools/backend/utils.js +83 -0
  157. package/lib/tools/backend/verify.js +151 -0
  158. package/lib/tools/backend/video.js +98 -0
  159. package/lib/tools/backend/wait.js +63 -0
  160. package/lib/tools/backend/webstorage.js +223 -0
  161. package/lib/tools/cli-client/cli.js +6 -0
  162. package/lib/tools/cli-client/help.json +399 -0
  163. package/lib/tools/cli-client/minimist.js +128 -0
  164. package/lib/tools/cli-client/program.js +350 -0
  165. package/lib/tools/cli-client/registry.js +176 -0
  166. package/lib/tools/cli-client/session.js +289 -0
  167. package/lib/tools/cli-client/skill/SKILL.md +328 -0
  168. package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
  169. package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
  170. package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
  171. package/lib/tools/cli-client/skill/references/running-code.md +231 -0
  172. package/lib/tools/cli-client/skill/references/session-management.md +169 -0
  173. package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
  174. package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
  175. package/lib/tools/cli-client/skill/references/tracing.md +139 -0
  176. package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
  177. package/lib/tools/cli-daemon/command.js +73 -0
  178. package/lib/tools/cli-daemon/commands.js +956 -0
  179. package/lib/tools/cli-daemon/daemon.js +157 -0
  180. package/lib/tools/cli-daemon/helpGenerator.js +177 -0
  181. package/lib/tools/cli-daemon/program.js +129 -0
  182. package/lib/tools/dashboard/appIcon.png +0 -0
  183. package/lib/tools/dashboard/dashboardApp.js +284 -0
  184. package/lib/tools/dashboard/dashboardController.js +296 -0
  185. package/lib/tools/exports.js +60 -0
  186. package/lib/tools/mcp/browserFactory.js +233 -0
  187. package/lib/tools/mcp/cdpRelay.js +352 -0
  188. package/lib/tools/mcp/cli-stub.js +7 -0
  189. package/lib/tools/mcp/config.d.js +16 -0
  190. package/lib/tools/mcp/config.js +446 -0
  191. package/lib/tools/mcp/configIni.js +189 -0
  192. package/lib/tools/mcp/extensionContextFactory.js +55 -0
  193. package/lib/tools/mcp/index.js +62 -0
  194. package/lib/tools/mcp/log.js +35 -0
  195. package/lib/tools/mcp/program.js +107 -0
  196. package/lib/tools/mcp/protocol.js +28 -0
  197. package/lib/tools/mcp/watchdog.js +44 -0
  198. package/lib/tools/trace/SKILL.md +171 -0
  199. package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
  200. package/lib/tools/trace/traceActions.js +142 -0
  201. package/lib/tools/trace/traceAttachments.js +69 -0
  202. package/lib/tools/trace/traceCli.js +87 -0
  203. package/lib/tools/trace/traceConsole.js +97 -0
  204. package/lib/tools/trace/traceErrors.js +55 -0
  205. package/lib/tools/trace/traceOpen.js +69 -0
  206. package/lib/tools/trace/traceParser.js +96 -0
  207. package/lib/tools/trace/traceRequests.js +182 -0
  208. package/lib/tools/trace/traceScreenshot.js +68 -0
  209. package/lib/tools/trace/traceSnapshot.js +149 -0
  210. package/lib/tools/trace/traceUtils.js +153 -0
  211. package/lib/tools/utils/connect.js +32 -0
  212. package/lib/tools/utils/mcp/http.js +152 -0
  213. package/lib/tools/utils/mcp/server.js +230 -0
  214. package/lib/tools/utils/mcp/tool.js +47 -0
  215. package/lib/tools/utils/socketConnection.js +108 -0
  216. package/lib/utils/isomorphic/formatUtils.js +64 -0
  217. package/lib/utils/isomorphic/jsonSchema.js +89 -0
  218. package/lib/utils/isomorphic/mimeType.js +7 -2
  219. package/lib/utils/isomorphic/protocolFormatter.js +2 -2
  220. package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
  221. package/lib/utils/isomorphic/stringUtils.js +3 -3
  222. package/lib/utils/isomorphic/timeoutRunner.js +3 -3
  223. package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
  224. package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
  225. package/lib/utils/isomorphic/trace/traceModel.js +3 -2
  226. package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
  227. package/lib/utils/isomorphic/urlMatch.js +54 -1
  228. package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
  229. package/lib/utils.js +6 -2
  230. package/lib/utilsBundle.js +3 -21
  231. package/lib/utilsBundleImpl/index.js +132 -133
  232. package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
  233. package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
  234. package/lib/vite/dashboard/index.html +28 -0
  235. package/lib/vite/htmlReport/index.html +2 -70
  236. package/lib/vite/htmlReport/report.css +1 -0
  237. package/lib/vite/htmlReport/report.js +72 -0
  238. package/lib/vite/recorder/assets/{codeMirrorModule-DadYNm1I.js → codeMirrorModule-C8KMvO9L.js} +20 -20
  239. package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
  240. package/lib/vite/recorder/index.html +1 -1
  241. package/lib/vite/traceViewer/assets/{codeMirrorModule-a5XoALAZ.js → codeMirrorModule-DS0FLvoc.js} +20 -20
  242. package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
  243. package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
  244. package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
  245. package/lib/vite/traceViewer/{index.BDwrLSGN.js → index.Dtstcb7U.js} +1 -1
  246. package/lib/vite/traceViewer/index.html +4 -4
  247. package/lib/vite/traceViewer/sw.bundle.js +4 -4
  248. package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
  249. package/lib/vite/traceViewer/uiMode.html +3 -3
  250. package/lib/zipBundleImpl.js +2 -2
  251. package/lib/zodBundle.js +39 -0
  252. package/lib/zodBundleImpl.js +40 -0
  253. package/package.json +6 -1
  254. package/types/protocol.d.ts +947 -51
  255. package/types/types.d.ts +854 -74
  256. package/lib/client/pageAgent.js +0 -64
  257. package/lib/mcpBundleImpl/index.js +0 -147
  258. package/lib/server/agent/actionRunner.js +0 -335
  259. package/lib/server/agent/actions.js +0 -128
  260. package/lib/server/agent/codegen.js +0 -111
  261. package/lib/server/agent/context.js +0 -150
  262. package/lib/server/agent/expectTools.js +0 -156
  263. package/lib/server/agent/pageAgent.js +0 -204
  264. package/lib/server/agent/performTools.js +0 -262
  265. package/lib/server/agent/tool.js +0 -109
  266. package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
  267. package/lib/vite/recorder/assets/index-BhTWtUlo.js +0 -193
  268. package/lib/vite/traceViewer/assets/defaultSettingsView-CJSZINFr.js +0 -266
  269. package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
  270. package/lib/vite/traceViewer/uiMode.CQJ9SCIQ.js +0 -5
  271. /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
  272. /package/lib/utils/isomorphic/{traceUtils.js → trace/traceUtils.js} +0 -0
@@ -0,0 +1,446 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var config_exports = {};
30
+ __export(config_exports, {
31
+ commaSeparatedList: () => commaSeparatedList,
32
+ configFromEnv: () => configFromEnv,
33
+ dotenvFileLoader: () => dotenvFileLoader,
34
+ enumParser: () => enumParser,
35
+ headerParser: () => headerParser,
36
+ loadConfig: () => loadConfig,
37
+ numberParser: () => numberParser,
38
+ resolutionParser: () => resolutionParser,
39
+ resolveCLIConfigForCLI: () => resolveCLIConfigForCLI,
40
+ resolveCLIConfigForMCP: () => resolveCLIConfigForMCP,
41
+ resolveConfig: () => resolveConfig,
42
+ semicolonSeparatedList: () => semicolonSeparatedList
43
+ });
44
+ module.exports = __toCommonJS(config_exports);
45
+ var import_fs = __toESM(require("fs"));
46
+ var import_path = __toESM(require("path"));
47
+ var import_os = __toESM(require("os"));
48
+ var import__ = require("../../..");
49
+ var import_utilsBundle = require("../../utilsBundle");
50
+ var import_configIni = require("./configIni");
51
+ async function fileExistsAsync(resolved) {
52
+ try {
53
+ return (await import_fs.default.promises.stat(resolved)).isFile();
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+ const defaultConfig = {
59
+ browser: {
60
+ launchOptions: {},
61
+ contextOptions: {}
62
+ },
63
+ timeouts: {
64
+ action: 5e3,
65
+ navigation: 6e4,
66
+ expect: 5e3
67
+ }
68
+ };
69
+ async function resolveConfig(config) {
70
+ const merged = mergeConfig(defaultConfig, config);
71
+ const browser = await validateBrowserConfig(merged.browser);
72
+ return { ...merged, browser };
73
+ }
74
+ async function resolveCLIConfigForMCP(cliOptions, env) {
75
+ const envOverrides = configFromEnv(env);
76
+ const cliOverrides = configFromCLIOptions(cliOptions);
77
+ const configFile = cliOverrides.configFile ?? envOverrides.configFile;
78
+ const configInFile = await loadConfig(configFile);
79
+ let result = defaultConfig;
80
+ result = mergeConfig(result, configInFile);
81
+ result = mergeConfig(result, envOverrides);
82
+ result = mergeConfig(result, cliOverrides);
83
+ const browser = await validateBrowserConfig(result.browser);
84
+ if (browser.launchOptions.headless === void 0)
85
+ browser.launchOptions.headless = import_os.default.platform() === "linux" && !process.env.DISPLAY;
86
+ return { ...result, browser, configFile };
87
+ }
88
+ async function resolveCLIConfigForCLI(daemonProfilesDir, sessionName, options, env) {
89
+ const config = options.config ? import_path.default.resolve(options.config) : void 0;
90
+ try {
91
+ const defaultConfigFile = import_path.default.resolve(".playwright", "cli.config.json");
92
+ if (!config && import_fs.default.existsSync(defaultConfigFile))
93
+ options.config = defaultConfigFile;
94
+ } catch {
95
+ }
96
+ const daemonOverrides = configFromCLIOptions({
97
+ endpoint: options.endpoint,
98
+ config: options.config,
99
+ browser: options.browser,
100
+ headless: options.headed ? false : void 0,
101
+ extension: options.extension,
102
+ userDataDir: options.profile,
103
+ snapshotMode: "full"
104
+ });
105
+ const envOverrides = configFromEnv(env);
106
+ const configFile = daemonOverrides.configFile ?? envOverrides.configFile;
107
+ const configInFile = await loadConfig(configFile);
108
+ const globalConfigPath = import_path.default.join((env ?? process.env)["PWTEST_CLI_GLOBAL_CONFIG"] ?? import_os.default.homedir(), ".playwright", "cli.config.json");
109
+ const globalConfigInFile = await loadConfig(import_fs.default.existsSync(globalConfigPath) ? globalConfigPath : void 0);
110
+ let result = defaultConfig;
111
+ result = mergeConfig(result, globalConfigInFile);
112
+ result = mergeConfig(result, configInFile);
113
+ result = mergeConfig(result, envOverrides);
114
+ result = mergeConfig(result, daemonOverrides);
115
+ if (result.browser.isolated === void 0)
116
+ result.browser.isolated = !options.profile && !options.persistent && !result.browser.userDataDir && !result.browser.remoteEndpoint && !result.extension;
117
+ if (!result.extension && !result.browser.isolated && !result.browser.userDataDir && !result.browser.remoteEndpoint) {
118
+ const browserToken = result.browser.launchOptions?.channel ?? result.browser?.browserName;
119
+ const userDataDir = import_path.default.resolve(daemonProfilesDir, `ud-${sessionName}-${browserToken}`);
120
+ result.browser.userDataDir = userDataDir;
121
+ }
122
+ if (result.browser.launchOptions.headless === void 0)
123
+ result.browser.launchOptions.headless = true;
124
+ const browser = await validateBrowserConfig(result.browser);
125
+ return { ...result, browser, configFile, skillMode: true };
126
+ }
127
+ async function validateBrowserConfig(browser) {
128
+ let browserName = browser.browserName;
129
+ if (!browserName) {
130
+ browserName = "chromium";
131
+ if (browser.launchOptions.channel === void 0)
132
+ browser.launchOptions.channel = "chrome";
133
+ }
134
+ if (browser.browserName === "chromium" && browser.launchOptions.chromiumSandbox === void 0) {
135
+ if (process.platform === "linux")
136
+ browser.launchOptions.chromiumSandbox = browser.launchOptions.channel !== "chromium" && browser.launchOptions.channel !== "chrome-for-testing";
137
+ else
138
+ browser.launchOptions.chromiumSandbox = true;
139
+ }
140
+ if (browser.isolated && browser.userDataDir)
141
+ throw new Error("Browser userDataDir is not supported in isolated mode.");
142
+ if (browser.initScript) {
143
+ for (const script of browser.initScript) {
144
+ if (!await fileExistsAsync(script))
145
+ throw new Error(`Init script file does not exist: ${script}`);
146
+ }
147
+ }
148
+ if (browser.initPage) {
149
+ for (const page of browser.initPage) {
150
+ if (!await fileExistsAsync(page))
151
+ throw new Error(`Init page file does not exist: ${page}`);
152
+ }
153
+ }
154
+ if (browser.contextOptions.viewport === void 0) {
155
+ if (browser.launchOptions.headless)
156
+ browser.contextOptions.viewport = { width: 1280, height: 720 };
157
+ else
158
+ browser.contextOptions.viewport = null;
159
+ }
160
+ return { ...browser, browserName };
161
+ }
162
+ function configFromCLIOptions(cliOptions) {
163
+ let browserName;
164
+ let channel;
165
+ switch (cliOptions.browser) {
166
+ case "chrome":
167
+ case "chrome-beta":
168
+ case "chrome-canary":
169
+ case "chrome-dev":
170
+ case "msedge":
171
+ case "msedge-beta":
172
+ case "msedge-canary":
173
+ case "msedge-dev":
174
+ browserName = "chromium";
175
+ channel = cliOptions.browser;
176
+ break;
177
+ case "chromium":
178
+ browserName = "chromium";
179
+ channel = "chrome-for-testing";
180
+ break;
181
+ case "firefox":
182
+ browserName = "firefox";
183
+ break;
184
+ case "webkit":
185
+ browserName = "webkit";
186
+ break;
187
+ }
188
+ const launchOptions = {
189
+ channel,
190
+ executablePath: cliOptions.executablePath,
191
+ headless: cliOptions.headless
192
+ };
193
+ if (cliOptions.sandbox !== void 0)
194
+ launchOptions.chromiumSandbox = cliOptions.sandbox;
195
+ if (cliOptions.proxyServer) {
196
+ launchOptions.proxy = {
197
+ server: cliOptions.proxyServer
198
+ };
199
+ if (cliOptions.proxyBypass)
200
+ launchOptions.proxy.bypass = cliOptions.proxyBypass;
201
+ }
202
+ if (cliOptions.device && cliOptions.cdpEndpoint)
203
+ throw new Error("Device emulation is not supported with cdpEndpoint.");
204
+ const contextOptions = cliOptions.device ? import__.devices[cliOptions.device] : {};
205
+ if (cliOptions.storageState)
206
+ contextOptions.storageState = cliOptions.storageState;
207
+ if (cliOptions.userAgent)
208
+ contextOptions.userAgent = cliOptions.userAgent;
209
+ if (cliOptions.viewportSize)
210
+ contextOptions.viewport = cliOptions.viewportSize;
211
+ if (cliOptions.ignoreHttpsErrors)
212
+ contextOptions.ignoreHTTPSErrors = true;
213
+ if (cliOptions.blockServiceWorkers)
214
+ contextOptions.serviceWorkers = "block";
215
+ if (cliOptions.grantPermissions)
216
+ contextOptions.permissions = cliOptions.grantPermissions;
217
+ const config = {
218
+ browser: {
219
+ browserName,
220
+ isolated: cliOptions.isolated,
221
+ userDataDir: cliOptions.userDataDir,
222
+ launchOptions,
223
+ contextOptions,
224
+ cdpEndpoint: cliOptions.cdpEndpoint,
225
+ cdpHeaders: cliOptions.cdpHeader,
226
+ cdpTimeout: cliOptions.cdpTimeout,
227
+ initPage: cliOptions.initPage,
228
+ initScript: cliOptions.initScript,
229
+ remoteEndpoint: cliOptions.endpoint
230
+ },
231
+ extension: cliOptions.extension,
232
+ server: {
233
+ port: cliOptions.port,
234
+ host: cliOptions.host,
235
+ allowedHosts: cliOptions.allowedHosts
236
+ },
237
+ capabilities: cliOptions.caps,
238
+ console: {
239
+ level: cliOptions.consoleLevel
240
+ },
241
+ network: {
242
+ allowedOrigins: cliOptions.allowedOrigins,
243
+ blockedOrigins: cliOptions.blockedOrigins
244
+ },
245
+ allowUnrestrictedFileAccess: cliOptions.allowUnrestrictedFileAccess,
246
+ codegen: cliOptions.codegen,
247
+ saveSession: cliOptions.saveSession,
248
+ secrets: cliOptions.secrets,
249
+ sharedBrowserContext: cliOptions.sharedBrowserContext,
250
+ snapshot: cliOptions.snapshotMode ? { mode: cliOptions.snapshotMode } : void 0,
251
+ outputDir: cliOptions.outputDir,
252
+ imageResponses: cliOptions.imageResponses,
253
+ testIdAttribute: cliOptions.testIdAttribute,
254
+ timeouts: {
255
+ action: cliOptions.timeoutAction,
256
+ navigation: cliOptions.timeoutNavigation
257
+ }
258
+ };
259
+ return { ...config, configFile: cliOptions.config };
260
+ }
261
+ function configFromEnv(env) {
262
+ const e = env ?? process.env;
263
+ const options = {};
264
+ options.allowedHosts = commaSeparatedList(e.PLAYWRIGHT_MCP_ALLOWED_HOSTS);
265
+ options.allowedOrigins = semicolonSeparatedList(e.PLAYWRIGHT_MCP_ALLOWED_ORIGINS);
266
+ options.allowUnrestrictedFileAccess = envToBoolean(e.PLAYWRIGHT_MCP_ALLOW_UNRESTRICTED_FILE_ACCESS);
267
+ options.blockedOrigins = semicolonSeparatedList(e.PLAYWRIGHT_MCP_BLOCKED_ORIGINS);
268
+ options.blockServiceWorkers = envToBoolean(e.PLAYWRIGHT_MCP_BLOCK_SERVICE_WORKERS);
269
+ options.browser = envToString(e.PLAYWRIGHT_MCP_BROWSER);
270
+ options.caps = commaSeparatedList(e.PLAYWRIGHT_MCP_CAPS);
271
+ options.cdpEndpoint = envToString(e.PLAYWRIGHT_MCP_CDP_ENDPOINT);
272
+ options.cdpHeader = headerParser(envToString(e.PLAYWRIGHT_MCP_CDP_HEADERS));
273
+ options.cdpTimeout = numberParser(e.PLAYWRIGHT_MCP_CDP_TIMEOUT);
274
+ options.config = envToString(e.PLAYWRIGHT_MCP_CONFIG);
275
+ if (e.PLAYWRIGHT_MCP_CONSOLE_LEVEL)
276
+ options.consoleLevel = enumParser("--console-level", ["error", "warning", "info", "debug"], e.PLAYWRIGHT_MCP_CONSOLE_LEVEL);
277
+ options.device = envToString(e.PLAYWRIGHT_MCP_DEVICE);
278
+ options.executablePath = envToString(e.PLAYWRIGHT_MCP_EXECUTABLE_PATH);
279
+ options.extension = envToBoolean(e.PLAYWRIGHT_MCP_EXTENSION);
280
+ options.grantPermissions = commaSeparatedList(e.PLAYWRIGHT_MCP_GRANT_PERMISSIONS);
281
+ options.headless = envToBoolean(e.PLAYWRIGHT_MCP_HEADLESS);
282
+ options.host = envToString(e.PLAYWRIGHT_MCP_HOST);
283
+ options.ignoreHttpsErrors = envToBoolean(e.PLAYWRIGHT_MCP_IGNORE_HTTPS_ERRORS);
284
+ const initPage = envToString(e.PLAYWRIGHT_MCP_INIT_PAGE);
285
+ if (initPage)
286
+ options.initPage = [initPage];
287
+ const initScript = envToString(e.PLAYWRIGHT_MCP_INIT_SCRIPT);
288
+ if (initScript)
289
+ options.initScript = [initScript];
290
+ options.isolated = envToBoolean(e.PLAYWRIGHT_MCP_ISOLATED);
291
+ if (e.PLAYWRIGHT_MCP_IMAGE_RESPONSES)
292
+ options.imageResponses = enumParser("--image-responses", ["allow", "omit"], e.PLAYWRIGHT_MCP_IMAGE_RESPONSES);
293
+ options.sandbox = envToBoolean(e.PLAYWRIGHT_MCP_SANDBOX);
294
+ options.outputDir = envToString(e.PLAYWRIGHT_MCP_OUTPUT_DIR);
295
+ options.port = numberParser(e.PLAYWRIGHT_MCP_PORT);
296
+ options.proxyBypass = envToString(e.PLAYWRIGHT_MCP_PROXY_BYPASS);
297
+ options.proxyServer = envToString(e.PLAYWRIGHT_MCP_PROXY_SERVER);
298
+ options.secrets = dotenvFileLoader(e.PLAYWRIGHT_MCP_SECRETS_FILE);
299
+ options.storageState = envToString(e.PLAYWRIGHT_MCP_STORAGE_STATE);
300
+ options.testIdAttribute = envToString(e.PLAYWRIGHT_MCP_TEST_ID_ATTRIBUTE);
301
+ options.timeoutAction = numberParser(e.PLAYWRIGHT_MCP_TIMEOUT_ACTION);
302
+ options.timeoutNavigation = numberParser(e.PLAYWRIGHT_MCP_TIMEOUT_NAVIGATION);
303
+ options.userAgent = envToString(e.PLAYWRIGHT_MCP_USER_AGENT);
304
+ options.userDataDir = envToString(e.PLAYWRIGHT_MCP_USER_DATA_DIR);
305
+ options.viewportSize = resolutionParser("--viewport-size", e.PLAYWRIGHT_MCP_VIEWPORT_SIZE);
306
+ return configFromCLIOptions(options);
307
+ }
308
+ async function loadConfig(configFile) {
309
+ if (!configFile)
310
+ return {};
311
+ if (configFile.endsWith(".ini"))
312
+ return (0, import_configIni.configFromIniFile)(configFile);
313
+ try {
314
+ const data = await import_fs.default.promises.readFile(configFile, "utf8");
315
+ return JSON.parse(data.charCodeAt(0) === 65279 ? data.slice(1) : data);
316
+ } catch {
317
+ return (0, import_configIni.configFromIniFile)(configFile);
318
+ }
319
+ }
320
+ function pickDefined(obj) {
321
+ return Object.fromEntries(
322
+ Object.entries(obj ?? {}).filter(([_, v]) => v !== void 0)
323
+ );
324
+ }
325
+ function mergeConfig(base, overrides) {
326
+ const browser = {
327
+ ...pickDefined(base.browser),
328
+ ...pickDefined(overrides.browser),
329
+ browserName: overrides.browser?.browserName ?? base.browser?.browserName,
330
+ isolated: overrides.browser?.isolated ?? base.browser?.isolated,
331
+ launchOptions: {
332
+ ...pickDefined(base.browser?.launchOptions),
333
+ ...pickDefined(overrides.browser?.launchOptions),
334
+ // Assistant mode is not a part of the public API.
335
+ ...{ assistantMode: true }
336
+ },
337
+ contextOptions: {
338
+ ...pickDefined(base.browser?.contextOptions),
339
+ ...pickDefined(overrides.browser?.contextOptions)
340
+ }
341
+ };
342
+ if (browser.browserName !== "chromium" && browser.launchOptions)
343
+ delete browser.launchOptions.channel;
344
+ return {
345
+ ...pickDefined(base),
346
+ ...pickDefined(overrides),
347
+ browser,
348
+ console: {
349
+ ...pickDefined(base.console),
350
+ ...pickDefined(overrides.console)
351
+ },
352
+ network: {
353
+ ...pickDefined(base.network),
354
+ ...pickDefined(overrides.network)
355
+ },
356
+ server: {
357
+ ...pickDefined(base.server),
358
+ ...pickDefined(overrides.server)
359
+ },
360
+ snapshot: {
361
+ ...pickDefined(base.snapshot),
362
+ ...pickDefined(overrides.snapshot)
363
+ },
364
+ timeouts: {
365
+ ...pickDefined(base.timeouts),
366
+ ...pickDefined(overrides.timeouts)
367
+ }
368
+ };
369
+ }
370
+ function semicolonSeparatedList(value) {
371
+ if (!value)
372
+ return void 0;
373
+ return value.split(";").map((v) => v.trim());
374
+ }
375
+ function commaSeparatedList(value) {
376
+ if (!value)
377
+ return void 0;
378
+ return value.split(",").map((v) => v.trim());
379
+ }
380
+ function dotenvFileLoader(value) {
381
+ if (!value)
382
+ return void 0;
383
+ return import_utilsBundle.dotenv.parse(import_fs.default.readFileSync(value, "utf8"));
384
+ }
385
+ function numberParser(value) {
386
+ if (!value)
387
+ return void 0;
388
+ return +value;
389
+ }
390
+ function resolutionParser(name, value) {
391
+ if (!value)
392
+ return void 0;
393
+ if (value.includes("x")) {
394
+ const [width, height] = value.split("x").map((v) => +v);
395
+ if (isNaN(width) || isNaN(height) || width <= 0 || height <= 0)
396
+ throw new Error(`Invalid resolution format: use ${name}="800x600"`);
397
+ return { width, height };
398
+ }
399
+ if (value.includes(",")) {
400
+ const [width, height] = value.split(",").map((v) => +v);
401
+ if (isNaN(width) || isNaN(height) || width <= 0 || height <= 0)
402
+ throw new Error(`Invalid resolution format: use ${name}="800x600"`);
403
+ return { width, height };
404
+ }
405
+ throw new Error(`Invalid resolution format: use ${name}="800x600"`);
406
+ }
407
+ function headerParser(arg, previous) {
408
+ if (!arg)
409
+ return previous;
410
+ const result = { ...previous ?? {} };
411
+ const colonIndex = arg.indexOf(":");
412
+ const name = colonIndex === -1 ? arg.trim() : arg.substring(0, colonIndex).trim();
413
+ const value = colonIndex === -1 ? "" : arg.substring(colonIndex + 1).trim();
414
+ result[name] = value;
415
+ return result;
416
+ }
417
+ function enumParser(name, options, value) {
418
+ if (!options.includes(value))
419
+ throw new Error(`Invalid ${name}: ${value}. Valid values are: ${options.join(", ")}`);
420
+ return value;
421
+ }
422
+ function envToBoolean(value) {
423
+ if (value === "true" || value === "1")
424
+ return true;
425
+ if (value === "false" || value === "0")
426
+ return false;
427
+ return void 0;
428
+ }
429
+ function envToString(value) {
430
+ return value ? value.trim() : void 0;
431
+ }
432
+ // Annotate the CommonJS export names for ESM import in node:
433
+ 0 && (module.exports = {
434
+ commaSeparatedList,
435
+ configFromEnv,
436
+ dotenvFileLoader,
437
+ enumParser,
438
+ headerParser,
439
+ loadConfig,
440
+ numberParser,
441
+ resolutionParser,
442
+ resolveCLIConfigForCLI,
443
+ resolveCLIConfigForMCP,
444
+ resolveConfig,
445
+ semicolonSeparatedList
446
+ });
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var configIni_exports = {};
30
+ __export(configIni_exports, {
31
+ configFromIniFile: () => configFromIniFile,
32
+ configsFromIniFile: () => configsFromIniFile
33
+ });
34
+ module.exports = __toCommonJS(configIni_exports);
35
+ var import_fs = __toESM(require("fs"));
36
+ var import_utilsBundle = require("../../utilsBundle");
37
+ function configFromIniFile(filePath) {
38
+ const content = import_fs.default.readFileSync(filePath, "utf8");
39
+ const parsed = import_utilsBundle.ini.parse(content);
40
+ return iniEntriesToConfig(parsed);
41
+ }
42
+ function configsFromIniFile(filePath) {
43
+ const content = import_fs.default.readFileSync(filePath, "utf8");
44
+ const parsed = import_utilsBundle.ini.parse(content);
45
+ const result = /* @__PURE__ */ new Map();
46
+ for (const [sectionName, sectionData] of Object.entries(parsed)) {
47
+ if (typeof sectionData !== "object" || sectionData === null)
48
+ continue;
49
+ result.set(sectionName, iniEntriesToConfig(sectionData));
50
+ }
51
+ return result;
52
+ }
53
+ function iniEntriesToConfig(entries) {
54
+ const config = {};
55
+ for (const [targetPath, rawValue] of Object.entries(entries)) {
56
+ const type = longhandTypes[targetPath];
57
+ const value = type ? coerceToType(rawValue, type) : coerceIniValue(rawValue);
58
+ setNestedValue(config, targetPath, value);
59
+ }
60
+ return config;
61
+ }
62
+ function coerceToType(value, type) {
63
+ switch (type) {
64
+ case "string":
65
+ return String(value);
66
+ case "number":
67
+ return Number(value);
68
+ case "boolean":
69
+ if (typeof value === "boolean")
70
+ return value;
71
+ return value === "true" || value === "1";
72
+ case "string[]":
73
+ if (Array.isArray(value))
74
+ return value.map(String);
75
+ return [String(value)];
76
+ case "size": {
77
+ if (typeof value === "string" && value.includes("x")) {
78
+ const [w, h] = value.split("x").map(Number);
79
+ if (!isNaN(w) && !isNaN(h) && w > 0 && h > 0)
80
+ return { width: w, height: h };
81
+ }
82
+ return void 0;
83
+ }
84
+ }
85
+ }
86
+ function coerceIniValue(value) {
87
+ if (typeof value !== "string")
88
+ return value;
89
+ const trimmed = value.trim();
90
+ if (trimmed === "")
91
+ return trimmed;
92
+ const num = Number(trimmed);
93
+ if (!isNaN(num))
94
+ return num;
95
+ return value;
96
+ }
97
+ function setNestedValue(obj, dotPath, value) {
98
+ const parts = dotPath.split(".");
99
+ let current = obj;
100
+ for (let i = 0; i < parts.length - 1; i++) {
101
+ const part = parts[i];
102
+ if (!(part in current) || typeof current[part] !== "object" || current[part] === null)
103
+ current[part] = {};
104
+ current = current[part];
105
+ }
106
+ current[parts[parts.length - 1]] = value;
107
+ }
108
+ const longhandTypes = {
109
+ // browser direct
110
+ "browser.browserName": "string",
111
+ "browser.isolated": "boolean",
112
+ "browser.userDataDir": "string",
113
+ "browser.cdpEndpoint": "string",
114
+ "browser.cdpTimeout": "number",
115
+ "browser.remoteEndpoint": "string",
116
+ "browser.initPage": "string[]",
117
+ "browser.initScript": "string[]",
118
+ // browser.launchOptions
119
+ "browser.launchOptions.channel": "string",
120
+ "browser.launchOptions.headless": "boolean",
121
+ "browser.launchOptions.executablePath": "string",
122
+ "browser.launchOptions.chromiumSandbox": "boolean",
123
+ "browser.launchOptions.args": "string[]",
124
+ "browser.launchOptions.downloadsPath": "string",
125
+ "browser.launchOptions.handleSIGHUP": "boolean",
126
+ "browser.launchOptions.handleSIGINT": "boolean",
127
+ "browser.launchOptions.handleSIGTERM": "boolean",
128
+ "browser.launchOptions.slowMo": "number",
129
+ "browser.launchOptions.timeout": "number",
130
+ "browser.launchOptions.tracesDir": "string",
131
+ "browser.launchOptions.proxy.server": "string",
132
+ "browser.launchOptions.proxy.bypass": "string",
133
+ "browser.launchOptions.proxy.username": "string",
134
+ "browser.launchOptions.proxy.password": "string",
135
+ // browser.contextOptions
136
+ "browser.contextOptions.acceptDownloads": "boolean",
137
+ "browser.contextOptions.baseURL": "string",
138
+ "browser.contextOptions.bypassCSP": "boolean",
139
+ "browser.contextOptions.colorScheme": "string",
140
+ "browser.contextOptions.contrast": "string",
141
+ "browser.contextOptions.deviceScaleFactor": "number",
142
+ "browser.contextOptions.forcedColors": "string",
143
+ "browser.contextOptions.hasTouch": "boolean",
144
+ "browser.contextOptions.ignoreHTTPSErrors": "boolean",
145
+ "browser.contextOptions.isMobile": "boolean",
146
+ "browser.contextOptions.javaScriptEnabled": "boolean",
147
+ "browser.contextOptions.locale": "string",
148
+ "browser.contextOptions.offline": "boolean",
149
+ "browser.contextOptions.permissions": "string[]",
150
+ "browser.contextOptions.reducedMotion": "string",
151
+ "browser.contextOptions.screen": "size",
152
+ "browser.contextOptions.serviceWorkers": "string",
153
+ "browser.contextOptions.storageState": "string",
154
+ "browser.contextOptions.strictSelectors": "boolean",
155
+ "browser.contextOptions.timezoneId": "string",
156
+ "browser.contextOptions.userAgent": "string",
157
+ "browser.contextOptions.viewport": "size",
158
+ // top-level
159
+ "extension": "boolean",
160
+ "capabilities": "string[]",
161
+ "saveSession": "boolean",
162
+ "saveTrace": "boolean",
163
+ "saveVideo": "size",
164
+ "sharedBrowserContext": "boolean",
165
+ "outputDir": "string",
166
+ "imageResponses": "string",
167
+ "allowUnrestrictedFileAccess": "boolean",
168
+ "codegen": "string",
169
+ "testIdAttribute": "string",
170
+ // server
171
+ "server.port": "number",
172
+ "server.host": "string",
173
+ "server.allowedHosts": "string[]",
174
+ // console
175
+ "console.level": "string",
176
+ // network
177
+ "network.allowedOrigins": "string[]",
178
+ "network.blockedOrigins": "string[]",
179
+ // timeouts
180
+ "timeouts.action": "number",
181
+ "timeouts.navigation": "number",
182
+ // snapshot
183
+ "snapshot.mode": "string"
184
+ };
185
+ // Annotate the CommonJS export names for ESM import in node:
186
+ 0 && (module.exports = {
187
+ configFromIniFile,
188
+ configsFromIniFile
189
+ });
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var extensionContextFactory_exports = {};
30
+ __export(extensionContextFactory_exports, {
31
+ createExtensionBrowser: () => createExtensionBrowser
32
+ });
33
+ module.exports = __toCommonJS(extensionContextFactory_exports);
34
+ var playwright = __toESM(require("../../.."));
35
+ var import_utilsBundle = require("../../utilsBundle");
36
+ var import_network = require("../../server/utils/network");
37
+ var import_cdpRelay = require("./cdpRelay");
38
+ const debugLogger = (0, import_utilsBundle.debug)("pw:mcp:relay");
39
+ async function createExtensionBrowser(config, clientInfo) {
40
+ const httpServer = (0, import_network.createHttpServer)();
41
+ await (0, import_network.startHttpServer)(httpServer, {});
42
+ const relay = new import_cdpRelay.CDPRelayServer(
43
+ httpServer,
44
+ config.browser.launchOptions.channel || "chrome",
45
+ config.browser.userDataDir,
46
+ config.browser.launchOptions.executablePath
47
+ );
48
+ debugLogger(`CDP relay server started, extension endpoint: ${relay.extensionEndpoint()}.`);
49
+ await relay.ensureExtensionConnectionForMCPContext(clientInfo);
50
+ return await playwright.chromium.connectOverCDP(relay.cdpEndpoint(), { isLocal: true });
51
+ }
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ createExtensionBrowser
55
+ });