patchright-bun 1.58.1 → 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
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var sigIntWatcher_exports = {};
|
|
20
|
-
__export(sigIntWatcher_exports, {
|
|
21
|
-
SigIntWatcher: () => SigIntWatcher
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(sigIntWatcher_exports);
|
|
24
|
-
class SigIntWatcher {
|
|
25
|
-
constructor() {
|
|
26
|
-
this._hadSignal = false;
|
|
27
|
-
let sigintCallback;
|
|
28
|
-
this._sigintPromise = new Promise((f) => sigintCallback = f);
|
|
29
|
-
this._sigintHandler = () => {
|
|
30
|
-
FixedNodeSIGINTHandler.off(this._sigintHandler);
|
|
31
|
-
this._hadSignal = true;
|
|
32
|
-
sigintCallback();
|
|
33
|
-
};
|
|
34
|
-
FixedNodeSIGINTHandler.on(this._sigintHandler);
|
|
35
|
-
}
|
|
36
|
-
promise() {
|
|
37
|
-
return this._sigintPromise;
|
|
38
|
-
}
|
|
39
|
-
hadSignal() {
|
|
40
|
-
return this._hadSignal;
|
|
41
|
-
}
|
|
42
|
-
disarm() {
|
|
43
|
-
FixedNodeSIGINTHandler.off(this._sigintHandler);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
class FixedNodeSIGINTHandler {
|
|
47
|
-
static {
|
|
48
|
-
this._handlers = [];
|
|
49
|
-
}
|
|
50
|
-
static {
|
|
51
|
-
this._ignoreNextSIGINTs = false;
|
|
52
|
-
}
|
|
53
|
-
static {
|
|
54
|
-
this._handlerInstalled = false;
|
|
55
|
-
}
|
|
56
|
-
static {
|
|
57
|
-
this._dispatch = () => {
|
|
58
|
-
if (this._ignoreNextSIGINTs)
|
|
59
|
-
return;
|
|
60
|
-
this._ignoreNextSIGINTs = true;
|
|
61
|
-
setTimeout(() => {
|
|
62
|
-
this._ignoreNextSIGINTs = false;
|
|
63
|
-
if (!this._handlers.length)
|
|
64
|
-
this._uninstall();
|
|
65
|
-
}, 1e3);
|
|
66
|
-
for (const handler of this._handlers)
|
|
67
|
-
handler();
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
static _install() {
|
|
71
|
-
if (!this._handlerInstalled) {
|
|
72
|
-
this._handlerInstalled = true;
|
|
73
|
-
process.on("SIGINT", this._dispatch);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
static _uninstall() {
|
|
77
|
-
if (this._handlerInstalled) {
|
|
78
|
-
this._handlerInstalled = false;
|
|
79
|
-
process.off("SIGINT", this._dispatch);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
static on(handler) {
|
|
83
|
-
this._handlers.push(handler);
|
|
84
|
-
if (this._handlers.length === 1)
|
|
85
|
-
this._install();
|
|
86
|
-
}
|
|
87
|
-
static off(handler) {
|
|
88
|
-
this._handlers = this._handlers.filter((h) => h !== handler);
|
|
89
|
-
if (!this._ignoreNextSIGINTs && !this._handlers.length)
|
|
90
|
-
this._uninstall();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
94
|
-
0 && (module.exports = {
|
|
95
|
-
SigIntWatcher
|
|
96
|
-
});
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var sigIntWatcher_exports = {};
|
|
20
|
+
__export(sigIntWatcher_exports, {
|
|
21
|
+
SigIntWatcher: () => SigIntWatcher
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(sigIntWatcher_exports);
|
|
24
|
+
class SigIntWatcher {
|
|
25
|
+
constructor() {
|
|
26
|
+
this._hadSignal = false;
|
|
27
|
+
let sigintCallback;
|
|
28
|
+
this._sigintPromise = new Promise((f) => sigintCallback = f);
|
|
29
|
+
this._sigintHandler = () => {
|
|
30
|
+
FixedNodeSIGINTHandler.off(this._sigintHandler);
|
|
31
|
+
this._hadSignal = true;
|
|
32
|
+
sigintCallback();
|
|
33
|
+
};
|
|
34
|
+
FixedNodeSIGINTHandler.on(this._sigintHandler);
|
|
35
|
+
}
|
|
36
|
+
promise() {
|
|
37
|
+
return this._sigintPromise;
|
|
38
|
+
}
|
|
39
|
+
hadSignal() {
|
|
40
|
+
return this._hadSignal;
|
|
41
|
+
}
|
|
42
|
+
disarm() {
|
|
43
|
+
FixedNodeSIGINTHandler.off(this._sigintHandler);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
class FixedNodeSIGINTHandler {
|
|
47
|
+
static {
|
|
48
|
+
this._handlers = [];
|
|
49
|
+
}
|
|
50
|
+
static {
|
|
51
|
+
this._ignoreNextSIGINTs = false;
|
|
52
|
+
}
|
|
53
|
+
static {
|
|
54
|
+
this._handlerInstalled = false;
|
|
55
|
+
}
|
|
56
|
+
static {
|
|
57
|
+
this._dispatch = () => {
|
|
58
|
+
if (this._ignoreNextSIGINTs)
|
|
59
|
+
return;
|
|
60
|
+
this._ignoreNextSIGINTs = true;
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
this._ignoreNextSIGINTs = false;
|
|
63
|
+
if (!this._handlers.length)
|
|
64
|
+
this._uninstall();
|
|
65
|
+
}, 1e3);
|
|
66
|
+
for (const handler of this._handlers)
|
|
67
|
+
handler();
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
static _install() {
|
|
71
|
+
if (!this._handlerInstalled) {
|
|
72
|
+
this._handlerInstalled = true;
|
|
73
|
+
process.on("SIGINT", this._dispatch);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
static _uninstall() {
|
|
77
|
+
if (this._handlerInstalled) {
|
|
78
|
+
this._handlerInstalled = false;
|
|
79
|
+
process.off("SIGINT", this._dispatch);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
static on(handler) {
|
|
83
|
+
this._handlers.push(handler);
|
|
84
|
+
if (this._handlers.length === 1)
|
|
85
|
+
this._install();
|
|
86
|
+
}
|
|
87
|
+
static off(handler) {
|
|
88
|
+
this._handlers = this._handlers.filter((h) => h !== handler);
|
|
89
|
+
if (!this._ignoreNextSIGINTs && !this._handlers.length)
|
|
90
|
+
this._uninstall();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
94
|
+
0 && (module.exports = {
|
|
95
|
+
SigIntWatcher
|
|
96
|
+
});
|
package/lib/runner/storage.js
CHANGED
|
@@ -1,91 +1,91 @@
|
|
|
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 storage_exports = {};
|
|
30
|
-
__export(storage_exports, {
|
|
31
|
-
Storage: () => Storage
|
|
32
|
-
});
|
|
33
|
-
module.exports = __toCommonJS(storage_exports);
|
|
34
|
-
var import_fs = __toESM(require("fs"));
|
|
35
|
-
var import_path = __toESM(require("path"));
|
|
36
|
-
var import_utils = require("patchright-core/lib/utils");
|
|
37
|
-
class Storage {
|
|
38
|
-
static {
|
|
39
|
-
this._storages = /* @__PURE__ */ new Map();
|
|
40
|
-
}
|
|
41
|
-
static {
|
|
42
|
-
this._serializeQueue = Promise.resolve();
|
|
43
|
-
}
|
|
44
|
-
static clone(storageFile, outputDir) {
|
|
45
|
-
return Storage._withStorage(storageFile, (storage) => storage._clone(outputDir));
|
|
46
|
-
}
|
|
47
|
-
static upstream(storageFile, storageOutFile) {
|
|
48
|
-
return Storage._withStorage(storageFile, (storage) => storage._upstream(storageOutFile));
|
|
49
|
-
}
|
|
50
|
-
static _withStorage(fileName, runnable) {
|
|
51
|
-
this._serializeQueue = this._serializeQueue.then(() => {
|
|
52
|
-
let storage = Storage._storages.get(fileName);
|
|
53
|
-
if (!storage) {
|
|
54
|
-
storage = new Storage(fileName);
|
|
55
|
-
Storage._storages.set(fileName, storage);
|
|
56
|
-
}
|
|
57
|
-
return runnable(storage);
|
|
58
|
-
});
|
|
59
|
-
return this._serializeQueue;
|
|
60
|
-
}
|
|
61
|
-
constructor(fileName) {
|
|
62
|
-
this._fileName = fileName;
|
|
63
|
-
}
|
|
64
|
-
async _clone(outputDir) {
|
|
65
|
-
const entries = await this._load();
|
|
66
|
-
if (this._lastSnapshotFileName)
|
|
67
|
-
return this._lastSnapshotFileName;
|
|
68
|
-
const snapshotFile = import_path.default.join(outputDir, `pw-storage-${(0, import_utils.createGuid)()}.json`);
|
|
69
|
-
await import_fs.default.promises.writeFile(snapshotFile, JSON.stringify(entries, null, 2)).catch(() => {
|
|
70
|
-
});
|
|
71
|
-
this._lastSnapshotFileName = snapshotFile;
|
|
72
|
-
return snapshotFile;
|
|
73
|
-
}
|
|
74
|
-
async _upstream(storageOutFile) {
|
|
75
|
-
const entries = await this._load();
|
|
76
|
-
const newEntries = await import_fs.default.promises.readFile(storageOutFile, "utf8").then(JSON.parse).catch(() => ({}));
|
|
77
|
-
for (const [key, newValue] of Object.entries(newEntries))
|
|
78
|
-
entries[key] = newValue;
|
|
79
|
-
this._lastSnapshotFileName = void 0;
|
|
80
|
-
await import_fs.default.promises.writeFile(this._fileName, JSON.stringify(entries, null, 2));
|
|
81
|
-
}
|
|
82
|
-
async _load() {
|
|
83
|
-
if (!this._entriesPromise)
|
|
84
|
-
this._entriesPromise = import_fs.default.promises.readFile(this._fileName, "utf8").then(JSON.parse).catch(() => ({}));
|
|
85
|
-
return this._entriesPromise;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
89
|
-
0 && (module.exports = {
|
|
90
|
-
Storage
|
|
91
|
-
});
|
|
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 storage_exports = {};
|
|
30
|
+
__export(storage_exports, {
|
|
31
|
+
Storage: () => Storage
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(storage_exports);
|
|
34
|
+
var import_fs = __toESM(require("fs"));
|
|
35
|
+
var import_path = __toESM(require("path"));
|
|
36
|
+
var import_utils = require("patchright-bun-core/lib/utils");
|
|
37
|
+
class Storage {
|
|
38
|
+
static {
|
|
39
|
+
this._storages = /* @__PURE__ */ new Map();
|
|
40
|
+
}
|
|
41
|
+
static {
|
|
42
|
+
this._serializeQueue = Promise.resolve();
|
|
43
|
+
}
|
|
44
|
+
static clone(storageFile, outputDir) {
|
|
45
|
+
return Storage._withStorage(storageFile, (storage) => storage._clone(outputDir));
|
|
46
|
+
}
|
|
47
|
+
static upstream(storageFile, storageOutFile) {
|
|
48
|
+
return Storage._withStorage(storageFile, (storage) => storage._upstream(storageOutFile));
|
|
49
|
+
}
|
|
50
|
+
static _withStorage(fileName, runnable) {
|
|
51
|
+
this._serializeQueue = this._serializeQueue.then(() => {
|
|
52
|
+
let storage = Storage._storages.get(fileName);
|
|
53
|
+
if (!storage) {
|
|
54
|
+
storage = new Storage(fileName);
|
|
55
|
+
Storage._storages.set(fileName, storage);
|
|
56
|
+
}
|
|
57
|
+
return runnable(storage);
|
|
58
|
+
});
|
|
59
|
+
return this._serializeQueue;
|
|
60
|
+
}
|
|
61
|
+
constructor(fileName) {
|
|
62
|
+
this._fileName = fileName;
|
|
63
|
+
}
|
|
64
|
+
async _clone(outputDir) {
|
|
65
|
+
const entries = await this._load();
|
|
66
|
+
if (this._lastSnapshotFileName)
|
|
67
|
+
return this._lastSnapshotFileName;
|
|
68
|
+
const snapshotFile = import_path.default.join(outputDir, `pw-storage-${(0, import_utils.createGuid)()}.json`);
|
|
69
|
+
await import_fs.default.promises.writeFile(snapshotFile, JSON.stringify(entries, null, 2)).catch(() => {
|
|
70
|
+
});
|
|
71
|
+
this._lastSnapshotFileName = snapshotFile;
|
|
72
|
+
return snapshotFile;
|
|
73
|
+
}
|
|
74
|
+
async _upstream(storageOutFile) {
|
|
75
|
+
const entries = await this._load();
|
|
76
|
+
const newEntries = await import_fs.default.promises.readFile(storageOutFile, "utf8").then(JSON.parse).catch(() => ({}));
|
|
77
|
+
for (const [key, newValue] of Object.entries(newEntries))
|
|
78
|
+
entries[key] = newValue;
|
|
79
|
+
this._lastSnapshotFileName = void 0;
|
|
80
|
+
await import_fs.default.promises.writeFile(this._fileName, JSON.stringify(entries, null, 2));
|
|
81
|
+
}
|
|
82
|
+
async _load() {
|
|
83
|
+
if (!this._entriesPromise)
|
|
84
|
+
this._entriesPromise = import_fs.default.promises.readFile(this._fileName, "utf8").then(JSON.parse).catch(() => ({}));
|
|
85
|
+
return this._entriesPromise;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
89
|
+
0 && (module.exports = {
|
|
90
|
+
Storage
|
|
91
|
+
});
|
package/lib/runner/taskRunner.js
CHANGED
|
@@ -1,127 +1,127 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var taskRunner_exports = {};
|
|
20
|
-
__export(taskRunner_exports, {
|
|
21
|
-
TaskRunner: () => TaskRunner
|
|
22
|
-
});
|
|
23
|
-
module.exports = __toCommonJS(taskRunner_exports);
|
|
24
|
-
var import_utils = require("patchright-core/lib/utils");
|
|
25
|
-
var import_utils2 = require("patchright-core/lib/utils");
|
|
26
|
-
var import_utilsBundle = require("patchright-core/lib/utilsBundle");
|
|
27
|
-
var import_sigIntWatcher = require("./sigIntWatcher");
|
|
28
|
-
var import_util = require("../util");
|
|
29
|
-
class TaskRunner {
|
|
30
|
-
constructor(reporter, globalTimeoutForError) {
|
|
31
|
-
this._tasks = [];
|
|
32
|
-
this._hasErrors = false;
|
|
33
|
-
this._interrupted = false;
|
|
34
|
-
this._isTearDown = false;
|
|
35
|
-
this._reporter = reporter;
|
|
36
|
-
this._globalTimeoutForError = globalTimeoutForError;
|
|
37
|
-
}
|
|
38
|
-
addTask(task) {
|
|
39
|
-
this._tasks.push(task);
|
|
40
|
-
}
|
|
41
|
-
async run(context, deadline, cancelPromise) {
|
|
42
|
-
const { status, cleanup } = await this.runDeferCleanup(context, deadline, cancelPromise);
|
|
43
|
-
const teardownStatus = await cleanup();
|
|
44
|
-
return status === "passed" ? teardownStatus : status;
|
|
45
|
-
}
|
|
46
|
-
async runDeferCleanup(context, deadline, cancelPromise = new import_utils.ManualPromise()) {
|
|
47
|
-
const sigintWatcher = new import_sigIntWatcher.SigIntWatcher();
|
|
48
|
-
const timeoutWatcher = new TimeoutWatcher(deadline);
|
|
49
|
-
const teardownRunner = new TaskRunner(this._reporter, this._globalTimeoutForError);
|
|
50
|
-
teardownRunner._isTearDown = true;
|
|
51
|
-
let currentTaskName;
|
|
52
|
-
const taskLoop = async () => {
|
|
53
|
-
for (const task of this._tasks) {
|
|
54
|
-
currentTaskName = task.title;
|
|
55
|
-
if (this._interrupted)
|
|
56
|
-
break;
|
|
57
|
-
(0, import_utilsBundle.debug)("pw:test:task")(`"${task.title}" started`);
|
|
58
|
-
const errors = [];
|
|
59
|
-
const softErrors = [];
|
|
60
|
-
try {
|
|
61
|
-
teardownRunner._tasks.unshift({ title: `teardown for ${task.title}`, setup: task.teardown });
|
|
62
|
-
await task.setup?.(context, errors, softErrors);
|
|
63
|
-
} catch (e) {
|
|
64
|
-
(0, import_utilsBundle.debug)("pw:test:task")(`error in "${task.title}": `, e);
|
|
65
|
-
errors.push((0, import_util.serializeError)(e));
|
|
66
|
-
} finally {
|
|
67
|
-
for (const error of [...softErrors, ...errors])
|
|
68
|
-
this._reporter.onError?.(error);
|
|
69
|
-
if (errors.length) {
|
|
70
|
-
if (!this._isTearDown)
|
|
71
|
-
this._interrupted = true;
|
|
72
|
-
this._hasErrors = true;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
(0, import_utilsBundle.debug)("pw:test:task")(`"${task.title}" finished`);
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
await Promise.race([
|
|
79
|
-
taskLoop(),
|
|
80
|
-
cancelPromise,
|
|
81
|
-
sigintWatcher.promise(),
|
|
82
|
-
timeoutWatcher.promise
|
|
83
|
-
]);
|
|
84
|
-
sigintWatcher.disarm();
|
|
85
|
-
timeoutWatcher.disarm();
|
|
86
|
-
this._interrupted = true;
|
|
87
|
-
let status = "passed";
|
|
88
|
-
if (sigintWatcher.hadSignal() || cancelPromise?.isDone()) {
|
|
89
|
-
status = "interrupted";
|
|
90
|
-
} else if (timeoutWatcher.timedOut()) {
|
|
91
|
-
this._reporter.onError?.({ message: import_utils2.colors.red(`Timed out waiting ${this._globalTimeoutForError / 1e3}s for the ${currentTaskName} to run`) });
|
|
92
|
-
status = "timedout";
|
|
93
|
-
} else if (this._hasErrors) {
|
|
94
|
-
status = "failed";
|
|
95
|
-
}
|
|
96
|
-
cancelPromise?.resolve();
|
|
97
|
-
const cleanup = () => teardownRunner.runDeferCleanup(context, deadline).then((r) => r.status);
|
|
98
|
-
return { status, cleanup };
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
class TimeoutWatcher {
|
|
102
|
-
constructor(deadline) {
|
|
103
|
-
this._timedOut = false;
|
|
104
|
-
this.promise = new import_utils.ManualPromise();
|
|
105
|
-
if (!deadline)
|
|
106
|
-
return;
|
|
107
|
-
if (deadline - (0, import_utils.monotonicTime)() <= 0) {
|
|
108
|
-
this._timedOut = true;
|
|
109
|
-
this.promise.resolve();
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
this._timer = setTimeout(() => {
|
|
113
|
-
this._timedOut = true;
|
|
114
|
-
this.promise.resolve();
|
|
115
|
-
}, deadline - (0, import_utils.monotonicTime)());
|
|
116
|
-
}
|
|
117
|
-
timedOut() {
|
|
118
|
-
return this._timedOut;
|
|
119
|
-
}
|
|
120
|
-
disarm() {
|
|
121
|
-
clearTimeout(this._timer);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
125
|
-
0 && (module.exports = {
|
|
126
|
-
TaskRunner
|
|
127
|
-
});
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var taskRunner_exports = {};
|
|
20
|
+
__export(taskRunner_exports, {
|
|
21
|
+
TaskRunner: () => TaskRunner
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(taskRunner_exports);
|
|
24
|
+
var import_utils = require("patchright-bun-core/lib/utils");
|
|
25
|
+
var import_utils2 = require("patchright-bun-core/lib/utils");
|
|
26
|
+
var import_utilsBundle = require("patchright-bun-core/lib/utilsBundle");
|
|
27
|
+
var import_sigIntWatcher = require("./sigIntWatcher");
|
|
28
|
+
var import_util = require("../util");
|
|
29
|
+
class TaskRunner {
|
|
30
|
+
constructor(reporter, globalTimeoutForError) {
|
|
31
|
+
this._tasks = [];
|
|
32
|
+
this._hasErrors = false;
|
|
33
|
+
this._interrupted = false;
|
|
34
|
+
this._isTearDown = false;
|
|
35
|
+
this._reporter = reporter;
|
|
36
|
+
this._globalTimeoutForError = globalTimeoutForError;
|
|
37
|
+
}
|
|
38
|
+
addTask(task) {
|
|
39
|
+
this._tasks.push(task);
|
|
40
|
+
}
|
|
41
|
+
async run(context, deadline, cancelPromise) {
|
|
42
|
+
const { status, cleanup } = await this.runDeferCleanup(context, deadline, cancelPromise);
|
|
43
|
+
const teardownStatus = await cleanup();
|
|
44
|
+
return status === "passed" ? teardownStatus : status;
|
|
45
|
+
}
|
|
46
|
+
async runDeferCleanup(context, deadline, cancelPromise = new import_utils.ManualPromise()) {
|
|
47
|
+
const sigintWatcher = new import_sigIntWatcher.SigIntWatcher();
|
|
48
|
+
const timeoutWatcher = new TimeoutWatcher(deadline);
|
|
49
|
+
const teardownRunner = new TaskRunner(this._reporter, this._globalTimeoutForError);
|
|
50
|
+
teardownRunner._isTearDown = true;
|
|
51
|
+
let currentTaskName;
|
|
52
|
+
const taskLoop = async () => {
|
|
53
|
+
for (const task of this._tasks) {
|
|
54
|
+
currentTaskName = task.title;
|
|
55
|
+
if (this._interrupted)
|
|
56
|
+
break;
|
|
57
|
+
(0, import_utilsBundle.debug)("pw:test:task")(`"${task.title}" started`);
|
|
58
|
+
const errors = [];
|
|
59
|
+
const softErrors = [];
|
|
60
|
+
try {
|
|
61
|
+
teardownRunner._tasks.unshift({ title: `teardown for ${task.title}`, setup: task.teardown });
|
|
62
|
+
await task.setup?.(context, errors, softErrors);
|
|
63
|
+
} catch (e) {
|
|
64
|
+
(0, import_utilsBundle.debug)("pw:test:task")(`error in "${task.title}": `, e);
|
|
65
|
+
errors.push((0, import_util.serializeError)(e));
|
|
66
|
+
} finally {
|
|
67
|
+
for (const error of [...softErrors, ...errors])
|
|
68
|
+
this._reporter.onError?.(error);
|
|
69
|
+
if (errors.length) {
|
|
70
|
+
if (!this._isTearDown)
|
|
71
|
+
this._interrupted = true;
|
|
72
|
+
this._hasErrors = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
(0, import_utilsBundle.debug)("pw:test:task")(`"${task.title}" finished`);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
await Promise.race([
|
|
79
|
+
taskLoop(),
|
|
80
|
+
cancelPromise,
|
|
81
|
+
sigintWatcher.promise(),
|
|
82
|
+
timeoutWatcher.promise
|
|
83
|
+
]);
|
|
84
|
+
sigintWatcher.disarm();
|
|
85
|
+
timeoutWatcher.disarm();
|
|
86
|
+
this._interrupted = true;
|
|
87
|
+
let status = "passed";
|
|
88
|
+
if (sigintWatcher.hadSignal() || cancelPromise?.isDone()) {
|
|
89
|
+
status = "interrupted";
|
|
90
|
+
} else if (timeoutWatcher.timedOut()) {
|
|
91
|
+
this._reporter.onError?.({ message: import_utils2.colors.red(`Timed out waiting ${this._globalTimeoutForError / 1e3}s for the ${currentTaskName} to run`) });
|
|
92
|
+
status = "timedout";
|
|
93
|
+
} else if (this._hasErrors) {
|
|
94
|
+
status = "failed";
|
|
95
|
+
}
|
|
96
|
+
cancelPromise?.resolve();
|
|
97
|
+
const cleanup = () => teardownRunner.runDeferCleanup(context, deadline).then((r) => r.status);
|
|
98
|
+
return { status, cleanup };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
class TimeoutWatcher {
|
|
102
|
+
constructor(deadline) {
|
|
103
|
+
this._timedOut = false;
|
|
104
|
+
this.promise = new import_utils.ManualPromise();
|
|
105
|
+
if (!deadline)
|
|
106
|
+
return;
|
|
107
|
+
if (deadline - (0, import_utils.monotonicTime)() <= 0) {
|
|
108
|
+
this._timedOut = true;
|
|
109
|
+
this.promise.resolve();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this._timer = setTimeout(() => {
|
|
113
|
+
this._timedOut = true;
|
|
114
|
+
this.promise.resolve();
|
|
115
|
+
}, deadline - (0, import_utils.monotonicTime)());
|
|
116
|
+
}
|
|
117
|
+
timedOut() {
|
|
118
|
+
return this._timedOut;
|
|
119
|
+
}
|
|
120
|
+
disarm() {
|
|
121
|
+
clearTimeout(this._timer);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
125
|
+
0 && (module.exports = {
|
|
126
|
+
TaskRunner
|
|
127
|
+
});
|