patchright-bun 1.58.0 → 1.58.2
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/README.md +225 -225
- package/ThirdPartyNotices.txt +5041 -5041
- package/cli.js +19 -19
- package/index.d.ts +17 -17
- package/index.js +17 -17
- package/index.mjs +18 -18
- package/jsx-runtime.js +42 -42
- package/jsx-runtime.mjs +21 -21
- package/lib/agents/agentParser.js +89 -89
- package/lib/agents/copilot-setup-steps.yml +34 -34
- package/lib/agents/generateAgents.js +348 -348
- package/lib/agents/playwright-test-coverage.prompt.md +31 -31
- package/lib/agents/playwright-test-generate.prompt.md +8 -8
- package/lib/agents/playwright-test-generator.agent.md +88 -88
- package/lib/agents/playwright-test-heal.prompt.md +6 -6
- package/lib/agents/playwright-test-healer.agent.md +55 -55
- package/lib/agents/playwright-test-plan.prompt.md +9 -9
- package/lib/agents/playwright-test-planner.agent.md +73 -73
- package/lib/common/config.js +282 -282
- package/lib/common/configLoader.js +344 -344
- package/lib/common/esmLoaderHost.js +104 -104
- package/lib/common/expectBundle.js +28 -28
- package/lib/common/expectBundleImpl.js +407 -407
- package/lib/common/fixtures.js +302 -302
- package/lib/common/globals.js +58 -58
- package/lib/common/ipc.js +60 -60
- package/lib/common/poolBuilder.js +85 -85
- package/lib/common/process.js +132 -132
- package/lib/common/suiteUtils.js +140 -140
- package/lib/common/test.js +321 -321
- package/lib/common/testLoader.js +101 -101
- package/lib/common/testType.js +298 -298
- package/lib/common/validators.js +68 -68
- package/lib/fsWatcher.js +67 -67
- package/lib/index.js +726 -726
- package/lib/internalsForTest.js +42 -42
- package/lib/isomorphic/events.js +77 -77
- package/lib/isomorphic/folders.js +30 -30
- package/lib/isomorphic/stringInternPool.js +69 -69
- package/lib/isomorphic/teleReceiver.js +521 -521
- package/lib/isomorphic/teleSuiteUpdater.js +157 -157
- package/lib/isomorphic/testServerConnection.js +225 -225
- package/lib/isomorphic/testServerInterface.js +16 -16
- package/lib/isomorphic/testTree.js +329 -329
- package/lib/isomorphic/types.d.js +16 -16
- package/lib/loader/loaderMain.js +59 -59
- package/lib/matchers/expect.js +311 -311
- package/lib/matchers/matcherHint.js +44 -44
- package/lib/matchers/matchers.js +383 -383
- package/lib/matchers/toBeTruthy.js +75 -75
- package/lib/matchers/toEqual.js +100 -100
- package/lib/matchers/toHaveURL.js +101 -101
- package/lib/matchers/toMatchAriaSnapshot.js +159 -159
- package/lib/matchers/toMatchSnapshot.js +342 -342
- package/lib/matchers/toMatchText.js +99 -99
- package/lib/mcp/browser/browserContextFactory.js +329 -329
- package/lib/mcp/browser/browserServerBackend.js +84 -84
- package/lib/mcp/browser/config.js +421 -421
- package/lib/mcp/browser/context.js +244 -244
- package/lib/mcp/browser/response.js +278 -278
- package/lib/mcp/browser/sessionLog.js +75 -75
- package/lib/mcp/browser/tab.js +343 -343
- package/lib/mcp/browser/tools/common.js +65 -65
- package/lib/mcp/browser/tools/console.js +46 -46
- package/lib/mcp/browser/tools/dialogs.js +60 -60
- package/lib/mcp/browser/tools/evaluate.js +61 -61
- package/lib/mcp/browser/tools/files.js +58 -58
- package/lib/mcp/browser/tools/form.js +63 -63
- package/lib/mcp/browser/tools/install.js +72 -72
- package/lib/mcp/browser/tools/keyboard.js +107 -107
- package/lib/mcp/browser/tools/mouse.js +107 -107
- package/lib/mcp/browser/tools/navigate.js +71 -71
- package/lib/mcp/browser/tools/network.js +63 -63
- package/lib/mcp/browser/tools/open.js +57 -57
- package/lib/mcp/browser/tools/pdf.js +49 -49
- package/lib/mcp/browser/tools/runCode.js +78 -78
- package/lib/mcp/browser/tools/screenshot.js +93 -93
- package/lib/mcp/browser/tools/snapshot.js +173 -173
- package/lib/mcp/browser/tools/tabs.js +67 -67
- package/lib/mcp/browser/tools/tool.js +47 -47
- package/lib/mcp/browser/tools/tracing.js +74 -74
- package/lib/mcp/browser/tools/utils.js +94 -94
- package/lib/mcp/browser/tools/verify.js +143 -143
- package/lib/mcp/browser/tools/wait.js +63 -63
- package/lib/mcp/browser/tools.js +84 -84
- package/lib/mcp/browser/watchdog.js +44 -44
- package/lib/mcp/config.d.js +16 -16
- package/lib/mcp/extension/cdpRelay.js +351 -351
- package/lib/mcp/extension/extensionContextFactory.js +76 -76
- package/lib/mcp/extension/protocol.js +28 -28
- package/lib/mcp/index.js +61 -61
- package/lib/mcp/log.js +35 -35
- package/lib/mcp/program.js +111 -111
- package/lib/mcp/sdk/exports.js +28 -28
- package/lib/mcp/sdk/http.js +152 -152
- package/lib/mcp/sdk/inProcessTransport.js +71 -71
- package/lib/mcp/sdk/server.js +223 -223
- package/lib/mcp/sdk/tool.js +47 -47
- package/lib/mcp/terminal/cli.js +296 -296
- package/lib/mcp/terminal/command.js +56 -56
- package/lib/mcp/terminal/commands.js +333 -333
- package/lib/mcp/terminal/daemon.js +129 -129
- package/lib/mcp/terminal/help.json +31 -31
- package/lib/mcp/terminal/helpGenerator.js +88 -88
- package/lib/mcp/terminal/socketConnection.js +80 -80
- package/lib/mcp/test/browserBackend.js +98 -98
- package/lib/mcp/test/generatorTools.js +122 -122
- package/lib/mcp/test/plannerTools.js +145 -145
- package/lib/mcp/test/seed.js +82 -82
- package/lib/mcp/test/streams.js +44 -44
- package/lib/mcp/test/testBackend.js +99 -99
- package/lib/mcp/test/testContext.js +285 -285
- package/lib/mcp/test/testTool.js +30 -30
- package/lib/mcp/test/testTools.js +108 -108
- package/lib/plugins/gitCommitInfoPlugin.js +198 -198
- package/lib/plugins/index.js +28 -28
- package/lib/plugins/webServerPlugin.js +237 -237
- package/lib/program.js +417 -417
- package/lib/reporters/base.js +634 -634
- package/lib/reporters/blob.js +138 -138
- package/lib/reporters/dot.js +99 -99
- package/lib/reporters/empty.js +32 -32
- package/lib/reporters/github.js +128 -128
- package/lib/reporters/html.js +633 -633
- package/lib/reporters/internalReporter.js +138 -138
- package/lib/reporters/json.js +254 -254
- package/lib/reporters/junit.js +232 -232
- package/lib/reporters/line.js +131 -131
- package/lib/reporters/list.js +253 -253
- package/lib/reporters/listModeReporter.js +69 -69
- package/lib/reporters/markdown.js +144 -144
- package/lib/reporters/merge.js +558 -558
- package/lib/reporters/multiplexer.js +112 -112
- package/lib/reporters/reporterV2.js +102 -102
- package/lib/reporters/teleEmitter.js +317 -317
- package/lib/reporters/versions/blobV1.js +16 -16
- package/lib/runner/dispatcher.js +530 -530
- package/lib/runner/failureTracker.js +72 -72
- package/lib/runner/lastRun.js +77 -77
- package/lib/runner/loadUtils.js +334 -334
- package/lib/runner/loaderHost.js +89 -89
- package/lib/runner/processHost.js +180 -180
- package/lib/runner/projectUtils.js +241 -241
- package/lib/runner/rebase.js +189 -189
- package/lib/runner/reporters.js +138 -138
- package/lib/runner/sigIntWatcher.js +96 -96
- package/lib/runner/storage.js +91 -91
- package/lib/runner/taskRunner.js +127 -127
- package/lib/runner/tasks.js +410 -410
- package/lib/runner/testGroups.js +125 -125
- package/lib/runner/testRunner.js +398 -398
- package/lib/runner/testServer.js +269 -269
- package/lib/runner/uiModeReporter.js +30 -30
- package/lib/runner/vcs.js +72 -72
- package/lib/runner/watchMode.js +396 -396
- package/lib/runner/workerHost.js +104 -104
- package/lib/third_party/pirates.js +62 -62
- package/lib/third_party/tsconfig-loader.js +103 -103
- package/lib/transform/babelBundle.js +46 -46
- package/lib/transform/babelBundleImpl.js +461 -461
- package/lib/transform/compilationCache.js +274 -274
- package/lib/transform/esmLoader.js +103 -103
- package/lib/transform/md.js +221 -221
- package/lib/transform/portTransport.js +67 -67
- package/lib/transform/transform.js +303 -303
- package/lib/util.js +400 -400
- package/lib/utilsBundle.js +50 -50
- package/lib/utilsBundleImpl.js +103 -103
- package/lib/worker/fixtureRunner.js +262 -262
- package/lib/worker/testInfo.js +536 -536
- package/lib/worker/testTracing.js +345 -345
- package/lib/worker/timeoutManager.js +174 -174
- package/lib/worker/util.js +31 -31
- package/lib/worker/workerMain.js +530 -530
- package/package.json +2 -2
- package/test.d.ts +18 -18
- package/test.js +24 -24
- package/test.mjs +34 -34
- package/types/test.d.ts +10251 -10251
- package/types/testReporter.d.ts +822 -822
package/lib/runner/loaderHost.js
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
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 loaderHost_exports = {};
|
|
30
|
-
__export(loaderHost_exports, {
|
|
31
|
-
InProcessLoaderHost: () => InProcessLoaderHost,
|
|
32
|
-
OutOfProcessLoaderHost: () => OutOfProcessLoaderHost
|
|
33
|
-
});
|
|
34
|
-
module.exports = __toCommonJS(loaderHost_exports);
|
|
35
|
-
var import_processHost = require("./processHost");
|
|
36
|
-
var import_esmLoaderHost = require("../common/esmLoaderHost");
|
|
37
|
-
var import_ipc = require("../common/ipc");
|
|
38
|
-
var import_poolBuilder = require("../common/poolBuilder");
|
|
39
|
-
var import_test = require("../common/test");
|
|
40
|
-
var import_testLoader = require("../common/testLoader");
|
|
41
|
-
var import_compilationCache = require("../transform/compilationCache");
|
|
42
|
-
class InProcessLoaderHost {
|
|
43
|
-
constructor(config) {
|
|
44
|
-
this._config = config;
|
|
45
|
-
this._poolBuilder = import_poolBuilder.PoolBuilder.createForLoader();
|
|
46
|
-
}
|
|
47
|
-
async start(errors) {
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
async loadTestFile(file, testErrors) {
|
|
51
|
-
const result = await (0, import_testLoader.loadTestFile)(file, this._config, testErrors);
|
|
52
|
-
this._poolBuilder.buildPools(result, testErrors);
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
async stop() {
|
|
56
|
-
await (0, import_esmLoaderHost.incorporateCompilationCache)();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
class OutOfProcessLoaderHost {
|
|
60
|
-
constructor(config) {
|
|
61
|
-
this._config = config;
|
|
62
|
-
this._processHost = new import_processHost.ProcessHost(require.resolve("../loader/loaderMain.js"), "loader", {});
|
|
63
|
-
}
|
|
64
|
-
async start(errors) {
|
|
65
|
-
const startError = await this._processHost.startRunner((0, import_ipc.serializeConfig)(this._config, false));
|
|
66
|
-
if (startError) {
|
|
67
|
-
errors.push({
|
|
68
|
-
message: `Test loader process failed to start with code "${startError.code}" and signal "${startError.signal}"`
|
|
69
|
-
});
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
async loadTestFile(file, testErrors) {
|
|
75
|
-
const result = await this._processHost.sendMessage({ method: "loadTestFile", params: { file } });
|
|
76
|
-
testErrors.push(...result.testErrors);
|
|
77
|
-
return import_test.Suite._deepParse(result.fileSuite);
|
|
78
|
-
}
|
|
79
|
-
async stop() {
|
|
80
|
-
const result = await this._processHost.sendMessage({ method: "getCompilationCacheFromLoader" });
|
|
81
|
-
(0, import_compilationCache.addToCompilationCache)(result);
|
|
82
|
-
await this._processHost.stop();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
86
|
-
0 && (module.exports = {
|
|
87
|
-
InProcessLoaderHost,
|
|
88
|
-
OutOfProcessLoaderHost
|
|
89
|
-
});
|
|
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 loaderHost_exports = {};
|
|
30
|
+
__export(loaderHost_exports, {
|
|
31
|
+
InProcessLoaderHost: () => InProcessLoaderHost,
|
|
32
|
+
OutOfProcessLoaderHost: () => OutOfProcessLoaderHost
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(loaderHost_exports);
|
|
35
|
+
var import_processHost = require("./processHost");
|
|
36
|
+
var import_esmLoaderHost = require("../common/esmLoaderHost");
|
|
37
|
+
var import_ipc = require("../common/ipc");
|
|
38
|
+
var import_poolBuilder = require("../common/poolBuilder");
|
|
39
|
+
var import_test = require("../common/test");
|
|
40
|
+
var import_testLoader = require("../common/testLoader");
|
|
41
|
+
var import_compilationCache = require("../transform/compilationCache");
|
|
42
|
+
class InProcessLoaderHost {
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this._config = config;
|
|
45
|
+
this._poolBuilder = import_poolBuilder.PoolBuilder.createForLoader();
|
|
46
|
+
}
|
|
47
|
+
async start(errors) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
async loadTestFile(file, testErrors) {
|
|
51
|
+
const result = await (0, import_testLoader.loadTestFile)(file, this._config, testErrors);
|
|
52
|
+
this._poolBuilder.buildPools(result, testErrors);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
async stop() {
|
|
56
|
+
await (0, import_esmLoaderHost.incorporateCompilationCache)();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
class OutOfProcessLoaderHost {
|
|
60
|
+
constructor(config) {
|
|
61
|
+
this._config = config;
|
|
62
|
+
this._processHost = new import_processHost.ProcessHost(require.resolve("../loader/loaderMain.js"), "loader", {});
|
|
63
|
+
}
|
|
64
|
+
async start(errors) {
|
|
65
|
+
const startError = await this._processHost.startRunner((0, import_ipc.serializeConfig)(this._config, false));
|
|
66
|
+
if (startError) {
|
|
67
|
+
errors.push({
|
|
68
|
+
message: `Test loader process failed to start with code "${startError.code}" and signal "${startError.signal}"`
|
|
69
|
+
});
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
async loadTestFile(file, testErrors) {
|
|
75
|
+
const result = await this._processHost.sendMessage({ method: "loadTestFile", params: { file } });
|
|
76
|
+
testErrors.push(...result.testErrors);
|
|
77
|
+
return import_test.Suite._deepParse(result.fileSuite);
|
|
78
|
+
}
|
|
79
|
+
async stop() {
|
|
80
|
+
const result = await this._processHost.sendMessage({ method: "getCompilationCacheFromLoader" });
|
|
81
|
+
(0, import_compilationCache.addToCompilationCache)(result);
|
|
82
|
+
await this._processHost.stop();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
86
|
+
0 && (module.exports = {
|
|
87
|
+
InProcessLoaderHost,
|
|
88
|
+
OutOfProcessLoaderHost
|
|
89
|
+
});
|
|
@@ -1,180 +1,180 @@
|
|
|
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 processHost_exports = {};
|
|
30
|
-
__export(processHost_exports, {
|
|
31
|
-
ProcessHost: () => ProcessHost
|
|
32
|
-
});
|
|
33
|
-
module.exports = __toCommonJS(processHost_exports);
|
|
34
|
-
var import_child_process = __toESM(require("child_process"));
|
|
35
|
-
var import_events = require("events");
|
|
36
|
-
var import_utils = require("patchright-core/lib/utils");
|
|
37
|
-
var import_utilsBundle = require("patchright-core/lib/utilsBundle");
|
|
38
|
-
class ProcessHost extends import_events.EventEmitter {
|
|
39
|
-
constructor(runnerScript, processName, env) {
|
|
40
|
-
super();
|
|
41
|
-
this._didSendStop = false;
|
|
42
|
-
this._processDidExit = false;
|
|
43
|
-
this._didExitAndRanOnExit = false;
|
|
44
|
-
this._lastMessageId = 0;
|
|
45
|
-
this._callbacks = /* @__PURE__ */ new Map();
|
|
46
|
-
this._producedEnv = {};
|
|
47
|
-
this._requestHandlers = /* @__PURE__ */ new Map();
|
|
48
|
-
this._runnerScript = runnerScript;
|
|
49
|
-
this._processName = processName;
|
|
50
|
-
this._extraEnv = env;
|
|
51
|
-
}
|
|
52
|
-
async startRunner(runnerParams, options = {}) {
|
|
53
|
-
(0, import_utils.assert)(!this.process, "Internal error: starting the same process twice");
|
|
54
|
-
this.process = import_child_process.default.fork(require.resolve("../common/process"), {
|
|
55
|
-
// Note: we pass detached:false, so that workers are in the same process group.
|
|
56
|
-
// This way Ctrl+C or a kill command can shutdown all workers in case they misbehave.
|
|
57
|
-
// Otherwise user can end up with a bunch of workers stuck in a busy loop without self-destructing.
|
|
58
|
-
detached: false,
|
|
59
|
-
env: {
|
|
60
|
-
...process.env,
|
|
61
|
-
...this._extraEnv
|
|
62
|
-
},
|
|
63
|
-
stdio: [
|
|
64
|
-
"ignore",
|
|
65
|
-
options.onStdOut ? "pipe" : "inherit",
|
|
66
|
-
options.onStdErr && !process.env.PW_RUNNER_DEBUG ? "pipe" : "inherit",
|
|
67
|
-
"ipc"
|
|
68
|
-
]
|
|
69
|
-
});
|
|
70
|
-
this.process.on("exit", async (code, signal) => {
|
|
71
|
-
this._processDidExit = true;
|
|
72
|
-
await this.onExit();
|
|
73
|
-
this._didExitAndRanOnExit = true;
|
|
74
|
-
this.emit("exit", { unexpectedly: !this._didSendStop, code, signal });
|
|
75
|
-
});
|
|
76
|
-
this.process.on("error", (e) => {
|
|
77
|
-
});
|
|
78
|
-
this.process.on("message", (message) => {
|
|
79
|
-
if (import_utilsBundle.debug.enabled("pw:test:protocol"))
|
|
80
|
-
(0, import_utilsBundle.debug)("pw:test:protocol")("\u25C0 RECV " + JSON.stringify(message));
|
|
81
|
-
if (message.method === "__env_produced__") {
|
|
82
|
-
const producedEnv = message.params;
|
|
83
|
-
this._producedEnv = Object.fromEntries(producedEnv.map((e) => [e[0], e[1] ?? void 0]));
|
|
84
|
-
} else if (message.method === "__dispatch__") {
|
|
85
|
-
const { id, error: error2, method, params, result } = message.params;
|
|
86
|
-
if (id && this._callbacks.has(id)) {
|
|
87
|
-
const { resolve, reject } = this._callbacks.get(id);
|
|
88
|
-
this._callbacks.delete(id);
|
|
89
|
-
if (error2) {
|
|
90
|
-
const errorObject = new Error(error2.message);
|
|
91
|
-
errorObject.stack = error2.stack;
|
|
92
|
-
reject(errorObject);
|
|
93
|
-
} else {
|
|
94
|
-
resolve(result);
|
|
95
|
-
}
|
|
96
|
-
} else {
|
|
97
|
-
this.emit(method, params);
|
|
98
|
-
}
|
|
99
|
-
} else if (message.method === "__request__") {
|
|
100
|
-
const { id, method, params } = message.params;
|
|
101
|
-
const handler = this._requestHandlers.get(method);
|
|
102
|
-
if (!handler) {
|
|
103
|
-
this.send({ method: "__response__", params: { id, error: { message: "Unknown method" } } });
|
|
104
|
-
} else {
|
|
105
|
-
handler(params).then((result) => {
|
|
106
|
-
this.send({ method: "__response__", params: { id, result } });
|
|
107
|
-
}).catch((error2) => {
|
|
108
|
-
this.send({ method: "__response__", params: { id, error: { message: error2.message } } });
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
} else {
|
|
112
|
-
this.emit(message.method, message.params);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
if (options.onStdOut)
|
|
116
|
-
this.process.stdout?.on("data", options.onStdOut);
|
|
117
|
-
if (options.onStdErr)
|
|
118
|
-
this.process.stderr?.on("data", options.onStdErr);
|
|
119
|
-
const error = await new Promise((resolve) => {
|
|
120
|
-
this.process.once("exit", (code, signal) => resolve({ unexpectedly: true, code, signal }));
|
|
121
|
-
this.once("ready", () => resolve(void 0));
|
|
122
|
-
});
|
|
123
|
-
if (error)
|
|
124
|
-
return error;
|
|
125
|
-
const processParams = {
|
|
126
|
-
processName: this._processName,
|
|
127
|
-
timeOrigin: (0, import_utils.timeOrigin)()
|
|
128
|
-
};
|
|
129
|
-
this.send({
|
|
130
|
-
method: "__init__",
|
|
131
|
-
params: {
|
|
132
|
-
processParams,
|
|
133
|
-
runnerScript: this._runnerScript,
|
|
134
|
-
runnerParams
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
sendMessage(message) {
|
|
139
|
-
const id = ++this._lastMessageId;
|
|
140
|
-
this.send({
|
|
141
|
-
method: "__dispatch__",
|
|
142
|
-
params: { id, ...message }
|
|
143
|
-
});
|
|
144
|
-
return new Promise((resolve, reject) => {
|
|
145
|
-
this._callbacks.set(id, { resolve, reject });
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
sendMessageNoReply(message) {
|
|
149
|
-
this.sendMessage(message).catch(() => {
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
async onExit() {
|
|
153
|
-
}
|
|
154
|
-
onRequest(method, handler) {
|
|
155
|
-
this._requestHandlers.set(method, handler);
|
|
156
|
-
}
|
|
157
|
-
async stop() {
|
|
158
|
-
if (!this._processDidExit && !this._didSendStop) {
|
|
159
|
-
this.send({ method: "__stop__" });
|
|
160
|
-
this._didSendStop = true;
|
|
161
|
-
}
|
|
162
|
-
if (!this._didExitAndRanOnExit)
|
|
163
|
-
await new Promise((f) => this.once("exit", f));
|
|
164
|
-
}
|
|
165
|
-
didSendStop() {
|
|
166
|
-
return this._didSendStop;
|
|
167
|
-
}
|
|
168
|
-
producedEnv() {
|
|
169
|
-
return this._producedEnv;
|
|
170
|
-
}
|
|
171
|
-
send(message) {
|
|
172
|
-
if (import_utilsBundle.debug.enabled("pw:test:protocol"))
|
|
173
|
-
(0, import_utilsBundle.debug)("pw:test:protocol")("SEND \u25BA " + JSON.stringify(message));
|
|
174
|
-
this.process?.send(message);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
178
|
-
0 && (module.exports = {
|
|
179
|
-
ProcessHost
|
|
180
|
-
});
|
|
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 processHost_exports = {};
|
|
30
|
+
__export(processHost_exports, {
|
|
31
|
+
ProcessHost: () => ProcessHost
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(processHost_exports);
|
|
34
|
+
var import_child_process = __toESM(require("child_process"));
|
|
35
|
+
var import_events = require("events");
|
|
36
|
+
var import_utils = require("patchright-bun-core/lib/utils");
|
|
37
|
+
var import_utilsBundle = require("patchright-bun-core/lib/utilsBundle");
|
|
38
|
+
class ProcessHost extends import_events.EventEmitter {
|
|
39
|
+
constructor(runnerScript, processName, env) {
|
|
40
|
+
super();
|
|
41
|
+
this._didSendStop = false;
|
|
42
|
+
this._processDidExit = false;
|
|
43
|
+
this._didExitAndRanOnExit = false;
|
|
44
|
+
this._lastMessageId = 0;
|
|
45
|
+
this._callbacks = /* @__PURE__ */ new Map();
|
|
46
|
+
this._producedEnv = {};
|
|
47
|
+
this._requestHandlers = /* @__PURE__ */ new Map();
|
|
48
|
+
this._runnerScript = runnerScript;
|
|
49
|
+
this._processName = processName;
|
|
50
|
+
this._extraEnv = env;
|
|
51
|
+
}
|
|
52
|
+
async startRunner(runnerParams, options = {}) {
|
|
53
|
+
(0, import_utils.assert)(!this.process, "Internal error: starting the same process twice");
|
|
54
|
+
this.process = import_child_process.default.fork(require.resolve("../common/process"), {
|
|
55
|
+
// Note: we pass detached:false, so that workers are in the same process group.
|
|
56
|
+
// This way Ctrl+C or a kill command can shutdown all workers in case they misbehave.
|
|
57
|
+
// Otherwise user can end up with a bunch of workers stuck in a busy loop without self-destructing.
|
|
58
|
+
detached: false,
|
|
59
|
+
env: {
|
|
60
|
+
...process.env,
|
|
61
|
+
...this._extraEnv
|
|
62
|
+
},
|
|
63
|
+
stdio: [
|
|
64
|
+
"ignore",
|
|
65
|
+
options.onStdOut ? "pipe" : "inherit",
|
|
66
|
+
options.onStdErr && !process.env.PW_RUNNER_DEBUG ? "pipe" : "inherit",
|
|
67
|
+
"ipc"
|
|
68
|
+
]
|
|
69
|
+
});
|
|
70
|
+
this.process.on("exit", async (code, signal) => {
|
|
71
|
+
this._processDidExit = true;
|
|
72
|
+
await this.onExit();
|
|
73
|
+
this._didExitAndRanOnExit = true;
|
|
74
|
+
this.emit("exit", { unexpectedly: !this._didSendStop, code, signal });
|
|
75
|
+
});
|
|
76
|
+
this.process.on("error", (e) => {
|
|
77
|
+
});
|
|
78
|
+
this.process.on("message", (message) => {
|
|
79
|
+
if (import_utilsBundle.debug.enabled("pw:test:protocol"))
|
|
80
|
+
(0, import_utilsBundle.debug)("pw:test:protocol")("\u25C0 RECV " + JSON.stringify(message));
|
|
81
|
+
if (message.method === "__env_produced__") {
|
|
82
|
+
const producedEnv = message.params;
|
|
83
|
+
this._producedEnv = Object.fromEntries(producedEnv.map((e) => [e[0], e[1] ?? void 0]));
|
|
84
|
+
} else if (message.method === "__dispatch__") {
|
|
85
|
+
const { id, error: error2, method, params, result } = message.params;
|
|
86
|
+
if (id && this._callbacks.has(id)) {
|
|
87
|
+
const { resolve, reject } = this._callbacks.get(id);
|
|
88
|
+
this._callbacks.delete(id);
|
|
89
|
+
if (error2) {
|
|
90
|
+
const errorObject = new Error(error2.message);
|
|
91
|
+
errorObject.stack = error2.stack;
|
|
92
|
+
reject(errorObject);
|
|
93
|
+
} else {
|
|
94
|
+
resolve(result);
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
this.emit(method, params);
|
|
98
|
+
}
|
|
99
|
+
} else if (message.method === "__request__") {
|
|
100
|
+
const { id, method, params } = message.params;
|
|
101
|
+
const handler = this._requestHandlers.get(method);
|
|
102
|
+
if (!handler) {
|
|
103
|
+
this.send({ method: "__response__", params: { id, error: { message: "Unknown method" } } });
|
|
104
|
+
} else {
|
|
105
|
+
handler(params).then((result) => {
|
|
106
|
+
this.send({ method: "__response__", params: { id, result } });
|
|
107
|
+
}).catch((error2) => {
|
|
108
|
+
this.send({ method: "__response__", params: { id, error: { message: error2.message } } });
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
this.emit(message.method, message.params);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
if (options.onStdOut)
|
|
116
|
+
this.process.stdout?.on("data", options.onStdOut);
|
|
117
|
+
if (options.onStdErr)
|
|
118
|
+
this.process.stderr?.on("data", options.onStdErr);
|
|
119
|
+
const error = await new Promise((resolve) => {
|
|
120
|
+
this.process.once("exit", (code, signal) => resolve({ unexpectedly: true, code, signal }));
|
|
121
|
+
this.once("ready", () => resolve(void 0));
|
|
122
|
+
});
|
|
123
|
+
if (error)
|
|
124
|
+
return error;
|
|
125
|
+
const processParams = {
|
|
126
|
+
processName: this._processName,
|
|
127
|
+
timeOrigin: (0, import_utils.timeOrigin)()
|
|
128
|
+
};
|
|
129
|
+
this.send({
|
|
130
|
+
method: "__init__",
|
|
131
|
+
params: {
|
|
132
|
+
processParams,
|
|
133
|
+
runnerScript: this._runnerScript,
|
|
134
|
+
runnerParams
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
sendMessage(message) {
|
|
139
|
+
const id = ++this._lastMessageId;
|
|
140
|
+
this.send({
|
|
141
|
+
method: "__dispatch__",
|
|
142
|
+
params: { id, ...message }
|
|
143
|
+
});
|
|
144
|
+
return new Promise((resolve, reject) => {
|
|
145
|
+
this._callbacks.set(id, { resolve, reject });
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
sendMessageNoReply(message) {
|
|
149
|
+
this.sendMessage(message).catch(() => {
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
async onExit() {
|
|
153
|
+
}
|
|
154
|
+
onRequest(method, handler) {
|
|
155
|
+
this._requestHandlers.set(method, handler);
|
|
156
|
+
}
|
|
157
|
+
async stop() {
|
|
158
|
+
if (!this._processDidExit && !this._didSendStop) {
|
|
159
|
+
this.send({ method: "__stop__" });
|
|
160
|
+
this._didSendStop = true;
|
|
161
|
+
}
|
|
162
|
+
if (!this._didExitAndRanOnExit)
|
|
163
|
+
await new Promise((f) => this.once("exit", f));
|
|
164
|
+
}
|
|
165
|
+
didSendStop() {
|
|
166
|
+
return this._didSendStop;
|
|
167
|
+
}
|
|
168
|
+
producedEnv() {
|
|
169
|
+
return this._producedEnv;
|
|
170
|
+
}
|
|
171
|
+
send(message) {
|
|
172
|
+
if (import_utilsBundle.debug.enabled("pw:test:protocol"))
|
|
173
|
+
(0, import_utilsBundle.debug)("pw:test:protocol")("SEND \u25BA " + JSON.stringify(message));
|
|
174
|
+
this.process?.send(message);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
178
|
+
0 && (module.exports = {
|
|
179
|
+
ProcessHost
|
|
180
|
+
});
|