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.
- package/ThirdPartyNotices.txt +126 -650
- package/browsers.json +16 -14
- package/lib/bootstrap.js +77 -0
- package/lib/cli/browserActions.js +308 -0
- package/lib/cli/driver.js +3 -2
- package/lib/cli/installActions.js +171 -0
- package/lib/cli/program.js +47 -411
- package/lib/client/android.js +4 -4
- package/lib/client/api.js +3 -3
- package/lib/client/browser.js +8 -0
- package/lib/client/browserContext.js +18 -37
- package/lib/client/browserType.js +19 -51
- package/lib/client/cdpSession.js +6 -2
- package/lib/client/channelOwner.js +1 -1
- package/lib/client/{webSocket.js → connect.js} +57 -7
- package/lib/client/connection.js +8 -4
- package/lib/client/consoleMessage.js +3 -0
- package/lib/client/debugger.js +57 -0
- package/lib/client/dialog.js +8 -1
- package/lib/client/disposable.js +76 -0
- package/lib/client/electron.js +1 -0
- package/lib/client/elementHandle.js +1 -4
- package/lib/client/events.js +3 -3
- package/lib/client/fetch.js +0 -1
- package/lib/client/frame.js +0 -5
- package/lib/client/harRouter.js +13 -1
- package/lib/client/jsHandle.js +0 -4
- package/lib/client/locator.js +5 -7
- package/lib/client/network.js +14 -11
- package/lib/client/page.js +34 -48
- package/lib/client/platform.js +0 -3
- package/lib/client/screencast.js +88 -0
- package/lib/client/selectors.js +3 -1
- package/lib/client/tracing.js +11 -4
- package/lib/client/video.js +13 -20
- package/lib/generated/bindingsControllerSource.js +1 -1
- package/lib/generated/clockSource.js +1 -1
- package/lib/generated/injectedScriptSource.js +1 -1
- package/lib/generated/pollingRecorderSource.js +1 -1
- package/lib/generated/storageScriptSource.js +1 -1
- package/lib/generated/utilityScriptSource.js +1 -1
- package/lib/mcpBundle.js +0 -6
- package/lib/mcpBundleImpl.js +91 -0
- package/lib/protocol/validator.js +216 -118
- package/lib/protocol/validatorPrimitives.js +1 -1
- package/lib/remote/playwrightConnection.js +10 -8
- package/lib/remote/playwrightPipeServer.js +100 -0
- package/lib/remote/playwrightServer.js +13 -8
- package/lib/remote/playwrightWebSocketServer.js +73 -0
- package/lib/remote/serverTransport.js +96 -0
- package/lib/server/android/android.js +2 -2
- package/lib/server/bidi/bidiBrowser.js +30 -8
- package/lib/server/bidi/bidiChromium.js +18 -5
- package/lib/server/bidi/bidiNetworkManager.js +39 -11
- package/lib/server/bidi/bidiPage.js +31 -15
- package/lib/server/bidi/third_party/firefoxPrefs.js +3 -1
- package/lib/server/browser.js +84 -21
- package/lib/server/browserContext.js +97 -58
- package/lib/server/browserType.js +14 -12
- package/lib/server/chromium/chromium.js +15 -13
- package/lib/server/chromium/crBrowser.js +18 -10
- package/lib/server/chromium/crNetworkManager.js +4 -4
- package/lib/server/chromium/crPage.js +26 -64
- package/lib/server/chromium/crServiceWorker.js +5 -4
- package/lib/server/clock.js +33 -33
- package/lib/server/console.js +5 -1
- package/lib/server/debugController.js +12 -6
- package/lib/server/debugger.js +40 -47
- package/lib/server/deviceDescriptorsSource.json +137 -137
- package/lib/server/dispatchers/browserContextDispatcher.js +27 -30
- package/lib/server/dispatchers/browserDispatcher.js +11 -5
- package/lib/server/dispatchers/browserTypeDispatcher.js +7 -0
- package/lib/server/dispatchers/cdpSessionDispatcher.js +4 -1
- package/lib/server/dispatchers/debuggerDispatcher.js +84 -0
- package/lib/server/dispatchers/dispatcher.js +1 -1
- package/lib/server/dispatchers/disposableDispatcher.js +39 -0
- package/lib/server/dispatchers/electronDispatcher.js +2 -1
- package/lib/server/dispatchers/frameDispatcher.js +3 -3
- package/lib/server/dispatchers/localUtilsDispatcher.js +37 -1
- package/lib/server/dispatchers/networkDispatchers.js +6 -5
- package/lib/server/dispatchers/pageDispatcher.js +101 -38
- package/lib/server/dispatchers/webSocketRouteDispatcher.js +4 -5
- package/lib/server/disposable.js +41 -0
- package/lib/server/dom.js +44 -26
- package/lib/server/download.js +3 -2
- package/lib/server/electron/electron.js +12 -7
- package/lib/server/firefox/ffBrowser.js +9 -19
- package/lib/server/firefox/ffInput.js +21 -5
- package/lib/server/firefox/ffNetworkManager.js +2 -2
- package/lib/server/firefox/ffPage.js +24 -27
- package/lib/server/frames.js +40 -11
- package/lib/server/har/harRecorder.js +2 -2
- package/lib/server/har/harTracer.js +5 -4
- package/lib/server/input.js +49 -4
- package/lib/server/instrumentation.js +5 -0
- package/lib/server/launchApp.js +0 -1
- package/lib/server/localUtils.js +6 -6
- package/lib/server/network.js +9 -8
- package/lib/server/overlay.js +138 -0
- package/lib/server/page.js +111 -51
- package/lib/server/progress.js +6 -0
- package/lib/server/recorder/recorderApp.js +9 -8
- package/lib/server/recorder.js +76 -40
- package/lib/server/registry/index.js +54 -81
- package/lib/server/registry/nativeDeps.js +1 -0
- package/lib/server/screencast.js +90 -143
- package/lib/server/trace/recorder/snapshotter.js +2 -2
- package/lib/server/trace/recorder/tracing.js +87 -36
- package/lib/server/trace/viewer/traceViewer.js +3 -4
- package/lib/server/usKeyboardLayout.js +7 -0
- package/lib/server/utils/comparators.js +1 -1
- package/lib/server/utils/disposable.js +32 -0
- package/lib/server/utils/eventsHelper.js +3 -1
- package/lib/server/utils/fileUtils.js +16 -2
- package/lib/server/utils/happyEyeballs.js +15 -12
- package/lib/server/utils/hostPlatform.js +0 -15
- package/lib/server/utils/httpServer.js +5 -3
- package/lib/server/utils/network.js +2 -1
- package/lib/server/utils/nodePlatform.js +0 -6
- package/lib/server/utils/processLauncher.js +8 -6
- package/lib/server/utils/zipFile.js +2 -2
- package/lib/server/videoRecorder.js +82 -12
- package/lib/server/webkit/wkBrowser.js +1 -6
- package/lib/server/webkit/wkPage.js +27 -25
- package/lib/server/webkit/wkWorkers.js +2 -1
- package/lib/serverRegistry.js +156 -0
- package/lib/tools/backend/browserBackend.js +79 -0
- package/lib/tools/backend/common.js +63 -0
- package/lib/tools/backend/config.js +41 -0
- package/lib/tools/backend/console.js +66 -0
- package/lib/tools/backend/context.js +296 -0
- package/lib/tools/backend/cookies.js +152 -0
- package/lib/tools/backend/devtools.js +69 -0
- package/lib/tools/backend/dialogs.js +59 -0
- package/lib/tools/backend/evaluate.js +64 -0
- package/lib/tools/backend/files.js +60 -0
- package/lib/tools/backend/form.js +64 -0
- package/lib/tools/backend/keyboard.js +155 -0
- package/lib/tools/backend/logFile.js +95 -0
- package/lib/tools/backend/mouse.js +168 -0
- package/lib/tools/backend/navigate.js +106 -0
- package/lib/tools/backend/network.js +135 -0
- package/lib/tools/backend/pdf.js +48 -0
- package/lib/tools/backend/response.js +305 -0
- package/lib/tools/backend/route.js +140 -0
- package/lib/tools/backend/runCode.js +77 -0
- package/lib/tools/backend/screenshot.js +88 -0
- package/lib/tools/backend/sessionLog.js +74 -0
- package/lib/tools/backend/snapshot.js +208 -0
- package/lib/tools/backend/storage.js +68 -0
- package/lib/tools/backend/tab.js +445 -0
- package/lib/tools/backend/tabs.js +67 -0
- package/lib/tools/backend/tool.js +47 -0
- package/lib/tools/backend/tools.js +102 -0
- package/lib/tools/backend/tracing.js +78 -0
- package/lib/tools/backend/utils.js +83 -0
- package/lib/tools/backend/verify.js +151 -0
- package/lib/tools/backend/video.js +98 -0
- package/lib/tools/backend/wait.js +63 -0
- package/lib/tools/backend/webstorage.js +223 -0
- package/lib/tools/cli-client/cli.js +6 -0
- package/lib/tools/cli-client/help.json +399 -0
- package/lib/tools/cli-client/minimist.js +128 -0
- package/lib/tools/cli-client/program.js +350 -0
- package/lib/tools/cli-client/registry.js +176 -0
- package/lib/tools/cli-client/session.js +289 -0
- package/lib/tools/cli-client/skill/SKILL.md +328 -0
- package/lib/tools/cli-client/skill/references/element-attributes.md +23 -0
- package/lib/tools/cli-client/skill/references/playwright-tests.md +39 -0
- package/lib/tools/cli-client/skill/references/request-mocking.md +87 -0
- package/lib/tools/cli-client/skill/references/running-code.md +231 -0
- package/lib/tools/cli-client/skill/references/session-management.md +169 -0
- package/lib/tools/cli-client/skill/references/storage-state.md +275 -0
- package/lib/tools/cli-client/skill/references/test-generation.md +88 -0
- package/lib/tools/cli-client/skill/references/tracing.md +139 -0
- package/lib/tools/cli-client/skill/references/video-recording.md +143 -0
- package/lib/tools/cli-daemon/command.js +73 -0
- package/lib/tools/cli-daemon/commands.js +956 -0
- package/lib/tools/cli-daemon/daemon.js +157 -0
- package/lib/tools/cli-daemon/helpGenerator.js +177 -0
- package/lib/tools/cli-daemon/program.js +129 -0
- package/lib/tools/dashboard/appIcon.png +0 -0
- package/lib/tools/dashboard/dashboardApp.js +284 -0
- package/lib/tools/dashboard/dashboardController.js +296 -0
- package/lib/tools/exports.js +60 -0
- package/lib/tools/mcp/browserFactory.js +233 -0
- package/lib/tools/mcp/cdpRelay.js +352 -0
- package/lib/tools/mcp/cli-stub.js +7 -0
- package/lib/tools/mcp/config.d.js +16 -0
- package/lib/tools/mcp/config.js +446 -0
- package/lib/tools/mcp/configIni.js +189 -0
- package/lib/tools/mcp/extensionContextFactory.js +55 -0
- package/lib/tools/mcp/index.js +62 -0
- package/lib/tools/mcp/log.js +35 -0
- package/lib/tools/mcp/program.js +107 -0
- package/lib/tools/mcp/protocol.js +28 -0
- package/lib/tools/mcp/watchdog.js +44 -0
- package/lib/tools/trace/SKILL.md +171 -0
- package/lib/{server/trace/viewer/traceParser.js → tools/trace/installSkill.js} +15 -39
- package/lib/tools/trace/traceActions.js +142 -0
- package/lib/tools/trace/traceAttachments.js +69 -0
- package/lib/tools/trace/traceCli.js +87 -0
- package/lib/tools/trace/traceConsole.js +97 -0
- package/lib/tools/trace/traceErrors.js +55 -0
- package/lib/tools/trace/traceOpen.js +69 -0
- package/lib/tools/trace/traceParser.js +96 -0
- package/lib/tools/trace/traceRequests.js +182 -0
- package/lib/tools/trace/traceScreenshot.js +68 -0
- package/lib/tools/trace/traceSnapshot.js +149 -0
- package/lib/tools/trace/traceUtils.js +153 -0
- package/lib/tools/utils/connect.js +32 -0
- package/lib/tools/utils/mcp/http.js +152 -0
- package/lib/tools/utils/mcp/server.js +230 -0
- package/lib/tools/utils/mcp/tool.js +47 -0
- package/lib/tools/utils/socketConnection.js +108 -0
- package/lib/utils/isomorphic/formatUtils.js +64 -0
- package/lib/utils/isomorphic/jsonSchema.js +89 -0
- package/lib/utils/isomorphic/mimeType.js +7 -2
- package/lib/utils/isomorphic/protocolFormatter.js +2 -2
- package/lib/utils/isomorphic/protocolMetainfo.js +127 -106
- package/lib/utils/isomorphic/stringUtils.js +3 -3
- package/lib/utils/isomorphic/timeoutRunner.js +3 -3
- package/lib/utils/isomorphic/trace/snapshotRenderer.js +35 -42
- package/lib/utils/isomorphic/trace/traceLoader.js +15 -14
- package/lib/utils/isomorphic/trace/traceModel.js +3 -2
- package/lib/utils/isomorphic/trace/traceModernizer.js +1 -0
- package/lib/utils/isomorphic/urlMatch.js +54 -1
- package/lib/utils/isomorphic/utilityScriptSerializers.js +11 -0
- package/lib/utils.js +6 -2
- package/lib/utilsBundle.js +3 -21
- package/lib/utilsBundleImpl/index.js +132 -133
- package/lib/vite/dashboard/assets/index-BAOybkp8.js +50 -0
- package/lib/vite/dashboard/assets/index-CZAYOG76.css +1 -0
- package/lib/vite/dashboard/index.html +28 -0
- package/lib/vite/htmlReport/index.html +2 -70
- package/lib/vite/htmlReport/report.css +1 -0
- package/lib/vite/htmlReport/report.js +72 -0
- package/lib/vite/recorder/assets/{codeMirrorModule-DadYNm1I.js → codeMirrorModule-C8KMvO9L.js} +20 -20
- package/lib/vite/recorder/assets/index-CqAYX1I3.js +193 -0
- package/lib/vite/recorder/index.html +1 -1
- package/lib/vite/traceViewer/assets/{codeMirrorModule-a5XoALAZ.js → codeMirrorModule-DS0FLvoc.js} +20 -20
- package/lib/vite/traceViewer/assets/defaultSettingsView-GTWI-W_B.js +262 -0
- package/lib/vite/traceViewer/defaultSettingsView.B4dS75f0.css +1 -0
- package/lib/vite/traceViewer/{index.BVu7tZDe.css → index.CzXZzn5A.css} +1 -1
- package/lib/vite/traceViewer/{index.BDwrLSGN.js → index.Dtstcb7U.js} +1 -1
- package/lib/vite/traceViewer/index.html +4 -4
- package/lib/vite/traceViewer/sw.bundle.js +4 -4
- package/lib/vite/traceViewer/uiMode.Vipi55dB.js +6 -0
- package/lib/vite/traceViewer/uiMode.html +3 -3
- package/lib/zipBundleImpl.js +2 -2
- package/lib/zodBundle.js +39 -0
- package/lib/zodBundleImpl.js +40 -0
- package/package.json +6 -1
- package/types/protocol.d.ts +947 -51
- package/types/types.d.ts +854 -74
- package/lib/client/pageAgent.js +0 -64
- package/lib/mcpBundleImpl/index.js +0 -147
- package/lib/server/agent/actionRunner.js +0 -335
- package/lib/server/agent/actions.js +0 -128
- package/lib/server/agent/codegen.js +0 -111
- package/lib/server/agent/context.js +0 -150
- package/lib/server/agent/expectTools.js +0 -156
- package/lib/server/agent/pageAgent.js +0 -204
- package/lib/server/agent/performTools.js +0 -262
- package/lib/server/agent/tool.js +0 -109
- package/lib/server/dispatchers/pageAgentDispatcher.js +0 -96
- package/lib/vite/recorder/assets/index-BhTWtUlo.js +0 -193
- package/lib/vite/traceViewer/assets/defaultSettingsView-CJSZINFr.js +0 -266
- package/lib/vite/traceViewer/defaultSettingsView.7ch9cixO.css +0 -1
- package/lib/vite/traceViewer/uiMode.CQJ9SCIQ.js +0 -5
- /package/lib/{server/utils → utils/isomorphic}/imageUtils.js +0 -0
- /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
|
+
});
|