@playwright-repl/runner 0.21.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 +116 -0
- package/dist/args.d.ts +16 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +48 -0
- package/dist/args.js.map +1 -0
- package/dist/bridge-utils.cjs +197 -0
- package/dist/bridge-utils.cjs.map +1 -0
- package/dist/bridge-utils.d.cts +30 -0
- package/dist/bridge-utils.d.cts.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +40 -0
- package/dist/browser.js.map +1 -0
- package/dist/bundler.d.ts +6 -0
- package/dist/bundler.d.ts.map +1 -0
- package/dist/bundler.js +32 -0
- package/dist/bundler.js.map +1 -0
- package/dist/cdpPreload.cjs +44 -0
- package/dist/cdpPreload.cjs.map +1 -0
- package/dist/cdpPreload.d.cts +11 -0
- package/dist/cdpPreload.d.cts.map +1 -0
- package/dist/chrome-extension/background.js +233485 -0
- package/dist/chrome-extension/background.js.map +1 -0
- package/dist/chrome-extension/content/picker.js +279 -0
- package/dist/chrome-extension/content/recorder.js +475 -0
- package/dist/chrome-extension/devtools/console.html +17 -0
- package/dist/chrome-extension/devtools/console.js +28 -0
- package/dist/chrome-extension/devtools/console.js.map +1 -0
- package/dist/chrome-extension/devtools/devtools.html +8 -0
- package/dist/chrome-extension/devtools/devtools.js +7 -0
- package/dist/chrome-extension/devtools/devtools.js.map +1 -0
- package/dist/chrome-extension/icons/dramaturg_icon_128.png +0 -0
- package/dist/chrome-extension/icons/dramaturg_icon_16.png +0 -0
- package/dist/chrome-extension/icons/dramaturg_icon_32.png +0 -0
- package/dist/chrome-extension/icons/dramaturg_icon_48.png +0 -0
- package/dist/chrome-extension/index.css +1333 -0
- package/dist/chrome-extension/index.js +12462 -0
- package/dist/chrome-extension/index.js.map +1 -0
- package/dist/chrome-extension/index2.js +27327 -0
- package/dist/chrome-extension/index2.js.map +1 -0
- package/dist/chrome-extension/manifest.json +46 -0
- package/dist/chrome-extension/modulepreload-polyfill.js +30 -0
- package/dist/chrome-extension/modulepreload-polyfill.js.map +1 -0
- package/dist/chrome-extension/newtab/newtab.html +202 -0
- package/dist/chrome-extension/offscreen/offscreen.html +6 -0
- package/dist/chrome-extension/offscreen/offscreen.js +54 -0
- package/dist/chrome-extension/offscreen/offscreen.js.map +1 -0
- package/dist/chrome-extension/panel/panel.html +16 -0
- package/dist/chrome-extension/panel/panel.js +2210 -0
- package/dist/chrome-extension/panel/panel.js.map +1 -0
- package/dist/chrome-extension/preferences/preferences.html +14 -0
- package/dist/chrome-extension/preferences/preferences.js +102 -0
- package/dist/chrome-extension/preferences/preferences.js.map +1 -0
- package/dist/chrome-extension/settings.js +13 -0
- package/dist/chrome-extension/settings.js.map +1 -0
- package/dist/chrome-extension/sw-debugger-core.js +1127 -0
- package/dist/chrome-extension/sw-debugger-core.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler/classify.d.ts +13 -0
- package/dist/compiler/classify.d.ts.map +1 -0
- package/dist/compiler/classify.js +143 -0
- package/dist/compiler/classify.js.map +1 -0
- package/dist/compiler/index.d.ts +24 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +41 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/parser.d.ts +24 -0
- package/dist/compiler/parser.d.ts.map +1 -0
- package/dist/compiler/parser.js +77 -0
- package/dist/compiler/parser.js.map +1 -0
- package/dist/compiler/transform.d.ts +20 -0
- package/dist/compiler/transform.d.ts.map +1 -0
- package/dist/compiler/transform.js +36 -0
- package/dist/compiler/transform.js.map +1 -0
- package/dist/compiler.d.ts +24 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +129 -0
- package/dist/compiler.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -0
- package/dist/discover.d.ts +5 -0
- package/dist/discover.d.ts.map +1 -0
- package/dist/discover.js +46 -0
- package/dist/discover.js.map +1 -0
- package/dist/execute.d.ts +13 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +281 -0
- package/dist/execute.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/mode-detect.d.ts +21 -0
- package/dist/mode-detect.d.ts.map +1 -0
- package/dist/mode-detect.js +67 -0
- package/dist/mode-detect.js.map +1 -0
- package/dist/proxy-page.d.ts +32 -0
- package/dist/proxy-page.d.ts.map +1 -0
- package/dist/proxy-page.js +192 -0
- package/dist/proxy-page.js.map +1 -0
- package/dist/pw-cli.d.ts +12 -0
- package/dist/pw-cli.d.ts.map +1 -0
- package/dist/pw-cli.js +73 -0
- package/dist/pw-cli.js.map +1 -0
- package/dist/pw-launch.d.ts +15 -0
- package/dist/pw-launch.d.ts.map +1 -0
- package/dist/pw-launch.js +97 -0
- package/dist/pw-launch.js.map +1 -0
- package/dist/pw-preload.cjs +164 -0
- package/dist/pw-preload.cjs.map +1 -0
- package/dist/pw-preload.d.cts +15 -0
- package/dist/pw-preload.d.cts.map +1 -0
- package/dist/pw-repl-extension.d.ts +12 -0
- package/dist/pw-repl-extension.d.ts.map +1 -0
- package/dist/pw-repl-extension.js +100 -0
- package/dist/pw-repl-extension.js.map +1 -0
- package/dist/pw-repl.d.ts +12 -0
- package/dist/pw-repl.d.ts.map +1 -0
- package/dist/pw-repl.js +111 -0
- package/dist/pw-repl.js.map +1 -0
- package/dist/pw-worker.cjs +216 -0
- package/dist/pw-worker.cjs.map +1 -0
- package/dist/pw-worker.d.cts +13 -0
- package/dist/pw-worker.d.cts.map +1 -0
- package/dist/pw-worker.d.ts +11 -0
- package/dist/pw-worker.d.ts.map +1 -0
- package/dist/pw-worker.js +51 -0
- package/dist/pw-worker.js.map +1 -0
- package/dist/run-test.d.ts +22 -0
- package/dist/run-test.d.ts.map +1 -0
- package/dist/run-test.js +358 -0
- package/dist/run-test.js.map +1 -0
- package/dist/runner.d.ts +10 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +82 -0
- package/dist/runner.js.map +1 -0
- package/dist/shim/alias.d.ts +11 -0
- package/dist/shim/alias.d.ts.map +1 -0
- package/dist/shim/alias.js +24 -0
- package/dist/shim/alias.js.map +1 -0
- package/dist/shim/framework.d.ts +11 -0
- package/dist/shim/framework.d.ts.map +1 -0
- package/dist/shim/framework.js +11 -0
- package/dist/shim/framework.js.map +1 -0
- package/dist/shim/test-runner-node.d.ts +49 -0
- package/dist/shim/test-runner-node.d.ts.map +1 -0
- package/dist/shim/test-runner-node.js +191 -0
- package/dist/shim/test-runner-node.js.map +1 -0
- package/dist/shim/test-runner.d.ts +44 -0
- package/dist/shim/test-runner.d.ts.map +1 -0
- package/dist/shim/test-runner.js +181 -0
- package/dist/shim/test-runner.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -0
package/dist/pw-repl.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pw repl — minimal Node REPL with Playwright globals.
|
|
3
|
+
*
|
|
4
|
+
* Connects to an existing Chrome via CDP, exposes page/context/browser/expect
|
|
5
|
+
* on the REPL context, and lets you type raw Playwright API or plain JS.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* pw repl --port 9222 # interactive REPL
|
|
9
|
+
* pw repl --port 9222 bench.js # run script, exit (browser stays alive)
|
|
10
|
+
*/
|
|
11
|
+
import repl from 'node:repl';
|
|
12
|
+
import { inspect } from 'node:util';
|
|
13
|
+
import fs from 'node:fs';
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
import { fileURLToPath } from 'node:url';
|
|
16
|
+
import { minimist } from '@playwright-repl/core';
|
|
17
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
+
const _require = createRequire(__filename);
|
|
19
|
+
export async function handleRepl(argv) {
|
|
20
|
+
const args = minimist(argv, {
|
|
21
|
+
string: ['port'],
|
|
22
|
+
default: { port: '9222' },
|
|
23
|
+
});
|
|
24
|
+
const port = parseInt(args.port, 10);
|
|
25
|
+
const scriptFile = args._[0];
|
|
26
|
+
// Connect to browser via CDP
|
|
27
|
+
const pw = _require('@playwright/test');
|
|
28
|
+
const browser = await pw.chromium.connectOverCDP(`http://localhost:${port}`);
|
|
29
|
+
const context = browser.contexts()[0];
|
|
30
|
+
// Skip internal pages (devtools://, chrome://, about:)
|
|
31
|
+
const pages = context?.pages() ?? [];
|
|
32
|
+
const page = pages.find((p) => {
|
|
33
|
+
const url = p.url();
|
|
34
|
+
return !url.startsWith('devtools://') && !url.startsWith('chrome://') && !url.startsWith('about:');
|
|
35
|
+
}) ?? pages[0];
|
|
36
|
+
if (!page) {
|
|
37
|
+
console.error('No page found. Open a page in the browser first.');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const { expect } = _require('@playwright/test');
|
|
41
|
+
console.log(`Connected to Chrome on port ${port}`);
|
|
42
|
+
console.log(`Globals: page, context, browser, expect`);
|
|
43
|
+
// Script mode: read file, eval each line, print timing, exit
|
|
44
|
+
if (scriptFile) {
|
|
45
|
+
const script = fs.readFileSync(scriptFile, 'utf-8');
|
|
46
|
+
const fn = new Function('page', 'context', 'browser', 'expect', `return (async () => {\n${script}\n})()`);
|
|
47
|
+
const start = performance.now();
|
|
48
|
+
try {
|
|
49
|
+
const result = await fn(page, context, browser, expect);
|
|
50
|
+
const elapsed = performance.now() - start;
|
|
51
|
+
if (result !== undefined)
|
|
52
|
+
console.log(result);
|
|
53
|
+
console.log(`\n${elapsed.toFixed(1)}ms`);
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
const elapsed = performance.now() - start;
|
|
57
|
+
console.error(e.message);
|
|
58
|
+
console.log(`\n${elapsed.toFixed(1)}ms (error)`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
let lastElapsed = 0;
|
|
64
|
+
function formatValue(value) {
|
|
65
|
+
if (value === undefined || value === null)
|
|
66
|
+
return '';
|
|
67
|
+
// Playwright Response object → short summary
|
|
68
|
+
if (value && typeof value === 'object' && typeof value.status === 'function' && typeof value.url === 'function') {
|
|
69
|
+
const resp = value;
|
|
70
|
+
return `Response { ${resp.status()} ${resp.url()} }`;
|
|
71
|
+
}
|
|
72
|
+
// Primitives → simple string
|
|
73
|
+
if (typeof value === 'string')
|
|
74
|
+
return value;
|
|
75
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
76
|
+
return String(value);
|
|
77
|
+
// Default: inspect with depth limit
|
|
78
|
+
return inspect(value, { depth: 1, colors: true });
|
|
79
|
+
}
|
|
80
|
+
const r = repl.start({
|
|
81
|
+
prompt: 'pw> ',
|
|
82
|
+
useGlobal: true,
|
|
83
|
+
writer(value) {
|
|
84
|
+
const formatted = formatValue(value);
|
|
85
|
+
const timing = `(${lastElapsed.toFixed(1)}ms)`;
|
|
86
|
+
lastElapsed = 0;
|
|
87
|
+
if (!formatted && !timing)
|
|
88
|
+
return '';
|
|
89
|
+
if (!formatted)
|
|
90
|
+
return timing;
|
|
91
|
+
return timing ? `${formatted}\n${timing}` : formatted;
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
Object.assign(r.context, { page, context, browser, expect });
|
|
95
|
+
// Wrap eval to track timing
|
|
96
|
+
const originalEval = r.eval.bind(r);
|
|
97
|
+
// @ts-expect-error — overriding readonly eval
|
|
98
|
+
r.eval = (code, context, file, cb) => {
|
|
99
|
+
const start = performance.now();
|
|
100
|
+
originalEval(code, context, file, (err, result) => {
|
|
101
|
+
lastElapsed = performance.now() - start;
|
|
102
|
+
cb(err, result);
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
// Block until REPL exits (Ctrl+D / .exit)
|
|
106
|
+
await new Promise((resolve) => {
|
|
107
|
+
r.on('exit', () => resolve());
|
|
108
|
+
});
|
|
109
|
+
process.exit(0);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=pw-repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-repl.js","sourceRoot":"","sources":["../src/pw-repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pw-worker — bridge helper for patched WorkerMain.
|
|
4
|
+
*
|
|
5
|
+
* Called by pw-preload.cjs to patch the real WorkerMain's runTestGroup.
|
|
6
|
+
* Per-file routing:
|
|
7
|
+
* - Bridge-compatible files → compile + send to bridge (fast path)
|
|
8
|
+
* - Node-dependent files → original runTestGroup (normal Playwright path)
|
|
9
|
+
*
|
|
10
|
+
* Bridge state (browser + bridge server) is lazily created and reused
|
|
11
|
+
* across all bridge test groups within the same worker process.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
const path = require("path");
|
|
15
|
+
const url_1 = require("url");
|
|
16
|
+
const bridge_utils_cjs_1 = require("./bridge-utils.cjs");
|
|
17
|
+
// ─── Bridge state (shared across test groups in one worker) ───
|
|
18
|
+
let _bridge = null;
|
|
19
|
+
let _context = null;
|
|
20
|
+
let _usingExternalBridge = false;
|
|
21
|
+
async function ensureBridge() {
|
|
22
|
+
if (_bridge)
|
|
23
|
+
return;
|
|
24
|
+
// If PW_BRIDGE_PORT is set, reuse BrowserManager's bridge via HTTP proxy
|
|
25
|
+
const externalPort = process.env.PW_BRIDGE_PORT;
|
|
26
|
+
if (externalPort) {
|
|
27
|
+
_bridge = new HttpBridgeClient(parseInt(externalPort, 10));
|
|
28
|
+
_usingExternalBridge = true;
|
|
29
|
+
console.error('[pw-worker] reusing external bridge on port ' + externalPort + ' (pid ' + process.pid + ')');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Resolve from user's project to avoid duplicate module instances
|
|
33
|
+
const { createRequire } = require('module');
|
|
34
|
+
const projectRequire = createRequire(path.join(process.cwd(), 'package.json'));
|
|
35
|
+
let coreMain;
|
|
36
|
+
try {
|
|
37
|
+
coreMain = projectRequire.resolve('@playwright-repl/core');
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
coreMain = require.resolve('@playwright-repl/core');
|
|
41
|
+
}
|
|
42
|
+
const { BridgeServer } = await import((0, url_1.pathToFileURL)(coreMain).href);
|
|
43
|
+
_bridge = new BridgeServer();
|
|
44
|
+
await _bridge.start(0);
|
|
45
|
+
const extPath = process.env.PW_EXT_PATH;
|
|
46
|
+
const pw = projectRequire('@playwright/test');
|
|
47
|
+
_context = await pw.chromium.launchPersistentContext('', {
|
|
48
|
+
channel: 'chromium',
|
|
49
|
+
headless: true,
|
|
50
|
+
args: [
|
|
51
|
+
'--disable-extensions-except=' + extPath,
|
|
52
|
+
'--load-extension=' + extPath,
|
|
53
|
+
'--disable-background-timer-throttling',
|
|
54
|
+
],
|
|
55
|
+
});
|
|
56
|
+
let sw = _context.serviceWorkers()[0];
|
|
57
|
+
if (!sw)
|
|
58
|
+
sw = await _context.waitForEvent('serviceworker', { timeout: 10000 });
|
|
59
|
+
await sw.evaluate(function (port) {
|
|
60
|
+
globalThis.chrome.storage.local.set({ bridgePort: port });
|
|
61
|
+
}, _bridge.port);
|
|
62
|
+
await _bridge.waitForConnection(10000);
|
|
63
|
+
console.error('[pw-worker] bridge ready, port ' + _bridge.port + ' (pid ' + process.pid + ')');
|
|
64
|
+
}
|
|
65
|
+
async function closeBridge() {
|
|
66
|
+
// External bridge is owned by BrowserManager — don't close it
|
|
67
|
+
if (_usingExternalBridge) {
|
|
68
|
+
_bridge = null;
|
|
69
|
+
_usingExternalBridge = false;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Persistent context with extensions may hang on close (macOS/Windows).
|
|
73
|
+
// Use a timeout to prevent blocking the worker shutdown.
|
|
74
|
+
const timeout = (ms) => new Promise(r => setTimeout(r, ms));
|
|
75
|
+
if (_context)
|
|
76
|
+
await Promise.race([_context.close(), timeout(3000)]).catch(() => { });
|
|
77
|
+
if (_bridge)
|
|
78
|
+
await Promise.race([_bridge.close(), timeout(1000)]).catch(() => { });
|
|
79
|
+
_context = null;
|
|
80
|
+
_bridge = null;
|
|
81
|
+
}
|
|
82
|
+
// ─── HTTP bridge client (calls BrowserManager's proxy) ───
|
|
83
|
+
class HttpBridgeClient {
|
|
84
|
+
_port;
|
|
85
|
+
constructor(port) { this._port = port; }
|
|
86
|
+
get port() { return this._port; }
|
|
87
|
+
async runScript(script, language = 'javascript') {
|
|
88
|
+
return this._post('/run-script', { script, language });
|
|
89
|
+
}
|
|
90
|
+
async run(command) {
|
|
91
|
+
return this._post('/run', { command });
|
|
92
|
+
}
|
|
93
|
+
_post(urlPath, body) {
|
|
94
|
+
const http = require('http');
|
|
95
|
+
const data = JSON.stringify(body);
|
|
96
|
+
return new Promise((resolve) => {
|
|
97
|
+
const req = http.request({
|
|
98
|
+
hostname: '127.0.0.1',
|
|
99
|
+
port: this._port,
|
|
100
|
+
path: urlPath,
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(data) },
|
|
103
|
+
}, (res) => {
|
|
104
|
+
let chunks = '';
|
|
105
|
+
res.on('data', (c) => chunks += c);
|
|
106
|
+
res.on('end', () => {
|
|
107
|
+
try {
|
|
108
|
+
resolve(JSON.parse(chunks));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
resolve({ text: chunks, isError: true });
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
req.on('error', (e) => resolve({ text: e.message, isError: true }));
|
|
116
|
+
req.write(data);
|
|
117
|
+
req.end();
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// ─── Test name resolution ───
|
|
122
|
+
async function resolveTestNames(worker, runPayload) {
|
|
123
|
+
await worker._loadIfNeeded();
|
|
124
|
+
const cacheKeys = Object.keys(require.cache);
|
|
125
|
+
const testLoaderPath = cacheKeys.find((k) => k.includes('common') && k.endsWith('testLoader.js'));
|
|
126
|
+
const suiteUtilsPath = cacheKeys.find((k) => k.includes('common') && k.endsWith('suiteUtils.js'));
|
|
127
|
+
if (!testLoaderPath || !suiteUtilsPath)
|
|
128
|
+
return null;
|
|
129
|
+
const { loadTestFile } = require(testLoaderPath);
|
|
130
|
+
const { bindFileSuiteToProject, applyRepeatEachIndex } = require(suiteUtilsPath);
|
|
131
|
+
const fileSuite = await loadTestFile(runPayload.file, worker._config);
|
|
132
|
+
const suite = bindFileSuiteToProject(worker._project, fileSuite);
|
|
133
|
+
if (worker._params.repeatEachIndex)
|
|
134
|
+
applyRepeatEachIndex(worker._project, suite, worker._params.repeatEachIndex);
|
|
135
|
+
const idToTitle = new Map();
|
|
136
|
+
for (const test of suite.allTests()) {
|
|
137
|
+
const fullName = test.titlePath().slice(1).join(' > ');
|
|
138
|
+
idToTitle.set(test.id, fullName);
|
|
139
|
+
}
|
|
140
|
+
return idToTitle;
|
|
141
|
+
}
|
|
142
|
+
function buildGrep(testNames) {
|
|
143
|
+
if (!testNames || testNames.length === 0)
|
|
144
|
+
return null;
|
|
145
|
+
const escaped = testNames.map((n) => n.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
146
|
+
return '^(' + escaped.join('|') + ')$';
|
|
147
|
+
}
|
|
148
|
+
// ─── Bridge execution ───
|
|
149
|
+
async function runOnBridge(worker, compiled, runPayload, idToTitle) {
|
|
150
|
+
const entries = runPayload.entries;
|
|
151
|
+
const requestedNames = idToTitle
|
|
152
|
+
? entries.map((e) => idToTitle.get(e.testId)).filter(Boolean)
|
|
153
|
+
: [];
|
|
154
|
+
const grepPattern = buildGrep(requestedNames);
|
|
155
|
+
let script = 'globalThis.__resetTestState();\n';
|
|
156
|
+
if (grepPattern) {
|
|
157
|
+
script += 'globalThis.__setGrepExact(' + JSON.stringify(grepPattern) + ');\n';
|
|
158
|
+
}
|
|
159
|
+
script += compiled + '\n';
|
|
160
|
+
script += 'await globalThis.__runTests();';
|
|
161
|
+
const r = await _bridge.runScript(script, 'javascript');
|
|
162
|
+
const resultText = r.isError ? '' : (r.text || '');
|
|
163
|
+
const lines = resultText.split('\n');
|
|
164
|
+
for (const entry of entries) {
|
|
165
|
+
const testId = entry.testId;
|
|
166
|
+
const testName = idToTitle ? idToTitle.get(testId) : null;
|
|
167
|
+
worker.dispatchEvent('testBegin', {
|
|
168
|
+
testId,
|
|
169
|
+
startWallTime: Date.now(),
|
|
170
|
+
});
|
|
171
|
+
const testResult = testName
|
|
172
|
+
? (0, bridge_utils_cjs_1.findResultByName)(lines, testName)
|
|
173
|
+
: (0, bridge_utils_cjs_1.findResultByIndex)(lines, entries.indexOf(entry));
|
|
174
|
+
worker.dispatchEvent('testEnd', {
|
|
175
|
+
testId,
|
|
176
|
+
duration: testResult.duration,
|
|
177
|
+
status: testResult.status,
|
|
178
|
+
errors: testResult.errors,
|
|
179
|
+
hasNonRetriableError: false,
|
|
180
|
+
expectedStatus: 'passed',
|
|
181
|
+
annotations: [],
|
|
182
|
+
timeout: 30000,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
worker.dispatchEvent('done', {
|
|
186
|
+
fatalErrors: r.isError ? [{ message: r.text }] : [],
|
|
187
|
+
skipTestsDueToSetupFailure: [],
|
|
188
|
+
});
|
|
189
|
+
console.error('[pw-worker] bridge done (pid ' + process.pid + ')');
|
|
190
|
+
}
|
|
191
|
+
// ─── Patch real WorkerMain ───
|
|
192
|
+
function patchWorker(worker, _params) {
|
|
193
|
+
const origRunTestGroup = worker.runTestGroup.bind(worker);
|
|
194
|
+
const origGracefullyClose = worker.gracefullyClose.bind(worker);
|
|
195
|
+
worker.runTestGroup = async function (runPayload) {
|
|
196
|
+
if ((0, bridge_utils_cjs_1.needsNode)(runPayload.file)) {
|
|
197
|
+
console.error('[pw-worker] node mode: ' + runPayload.file);
|
|
198
|
+
return origRunTestGroup(runPayload);
|
|
199
|
+
}
|
|
200
|
+
const idToTitle = await resolveTestNames(worker, runPayload);
|
|
201
|
+
const names = idToTitle
|
|
202
|
+
? runPayload.entries.map((e) => idToTitle.get(e.testId)).filter(Boolean)
|
|
203
|
+
: [];
|
|
204
|
+
console.error('[pw-worker] bridge mode: ' + runPayload.file +
|
|
205
|
+
(names.length ? ' (' + names.join(', ') + ')' : ''));
|
|
206
|
+
const compiled = await (0, bridge_utils_cjs_1.compile)(runPayload.file);
|
|
207
|
+
await ensureBridge();
|
|
208
|
+
return runOnBridge(worker, compiled, runPayload, idToTitle);
|
|
209
|
+
};
|
|
210
|
+
worker.gracefullyClose = async function () {
|
|
211
|
+
await closeBridge();
|
|
212
|
+
return origGracefullyClose();
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
module.exports = { patchWorker };
|
|
216
|
+
//# sourceMappingURL=pw-worker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-worker.cjs","sourceRoot":"","sources":["../src/pw-worker.cts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pw-worker — bridge helper for patched WorkerMain.
|
|
3
|
+
*
|
|
4
|
+
* Called by pw-preload.cjs to patch the real WorkerMain's runTestGroup.
|
|
5
|
+
* Per-file routing:
|
|
6
|
+
* - Bridge-compatible files → compile + send to bridge (fast path)
|
|
7
|
+
* - Node-dependent files → original runTestGroup (normal Playwright path)
|
|
8
|
+
*
|
|
9
|
+
* Bridge state (browser + bridge server) is lazily created and reused
|
|
10
|
+
* across all bridge test groups within the same worker process.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=pw-worker.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-worker.d.cts","sourceRoot":"","sources":["../src/pw-worker.cts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pw-worker — Playwright worker that reuses browser contexts.
|
|
3
|
+
*
|
|
4
|
+
* Patches Playwright's Browser.newContext to reuse a single context
|
|
5
|
+
* and page across tests. This eliminates the ~800ms per-test overhead.
|
|
6
|
+
*
|
|
7
|
+
* Test code stays unchanged — { page } fixture works as before,
|
|
8
|
+
* but gets the reused page instead of a fresh one.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=pw-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-worker.d.ts","sourceRoot":"","sources":["../src/pw-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pw-worker — Playwright worker that reuses browser contexts.
|
|
3
|
+
*
|
|
4
|
+
* Patches Playwright's Browser.newContext to reuse a single context
|
|
5
|
+
* and page across tests. This eliminates the ~800ms per-test overhead.
|
|
6
|
+
*
|
|
7
|
+
* Test code stays unchanged — { page } fixture works as before,
|
|
8
|
+
* but gets the reused page instead of a fresh one.
|
|
9
|
+
*/
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { fileURLToPath } from 'node:url';
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const require = createRequire(__filename);
|
|
15
|
+
console.error('[pw-worker] loaded, PW_WS_ENDPOINT:', process.env.PW_WS_ENDPOINT || 'not set');
|
|
16
|
+
if (process.env.PW_WS_ENDPOINT) {
|
|
17
|
+
// Patch Browser.prototype.newContext to reuse one context
|
|
18
|
+
const pw = require('playwright-core');
|
|
19
|
+
const origConnect = pw.chromium.connect.bind(pw.chromium);
|
|
20
|
+
let sharedContext = null;
|
|
21
|
+
let sharedPage = null;
|
|
22
|
+
pw.chromium.connect = async function (wsEndpoint, options) {
|
|
23
|
+
const browser = await origConnect(wsEndpoint, options);
|
|
24
|
+
const origNewContext = browser.newContext.bind(browser);
|
|
25
|
+
browser.newContext = async function (contextOptions) {
|
|
26
|
+
if (!sharedContext) {
|
|
27
|
+
sharedContext = await origNewContext(contextOptions);
|
|
28
|
+
sharedPage = await sharedContext.newPage();
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Reset page state for next test
|
|
32
|
+
try {
|
|
33
|
+
await sharedPage.goto('about:blank');
|
|
34
|
+
}
|
|
35
|
+
catch { }
|
|
36
|
+
}
|
|
37
|
+
// Patch context.newPage to return shared page
|
|
38
|
+
sharedContext.newPage = async () => sharedPage;
|
|
39
|
+
// Patch context.close to be a no-op (keep alive)
|
|
40
|
+
sharedContext.close = async () => { };
|
|
41
|
+
return sharedContext;
|
|
42
|
+
};
|
|
43
|
+
return browser;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Run Playwright's real worker
|
|
47
|
+
const pwDir = path.dirname(require.resolve('playwright/package.json'));
|
|
48
|
+
const pwRequire = createRequire(path.join(pwDir, 'lib', 'index.js'));
|
|
49
|
+
const { create } = pwRequire('./worker/workerMain');
|
|
50
|
+
create('worker');
|
|
51
|
+
//# sourceMappingURL=pw-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pw-worker.js","sourceRoot":"","sources":["../src/pw-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;AAE1C,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,SAAS,CAAC,CAAC;AAC9F,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IAC/B,0DAA0D;IAC1D,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,aAAa,GAAQ,IAAI,CAAC;IAC9B,IAAI,UAAU,GAAQ,IAAI,CAAC;IAE3B,EAAE,CAAC,QAAQ,CAAC,OAAO,GAAG,KAAK,WAAU,UAAkB,EAAE,OAAa;QACpE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEvD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,UAAU,GAAG,KAAK,WAAU,cAAoB;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,aAAa,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;gBACrD,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,IAAI,CAAC;oBAAC,MAAM,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACxD,CAAC;YACD,8CAA8C;YAC9C,aAAa,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC;YAC/C,iDAAiD;YACjD,aAAa,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;YACrC,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC;AAED,+BAA+B;AAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;AACvE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AACrE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;AACpD,MAAM,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runTestFile — in-process test execution for IDE integration.
|
|
3
|
+
*
|
|
4
|
+
* Called directly by VS Code extension with its existing bridge + page.
|
|
5
|
+
* No subprocess, no browser launch — bridge stays warm between runs.
|
|
6
|
+
*
|
|
7
|
+
* Two modes:
|
|
8
|
+
* - Browser: compile → send to bridge → runs in service worker (~50ms)
|
|
9
|
+
* - Node (DIRECT): load test in Node → run with real page/expect (reuse browser)
|
|
10
|
+
*/
|
|
11
|
+
import type { BridgeServer } from '@playwright-repl/core';
|
|
12
|
+
import type { TestResult, DiscoveredTest } from './types.js';
|
|
13
|
+
export { needsNode as needsNodeMode };
|
|
14
|
+
declare function needsNode(filePath: string): boolean;
|
|
15
|
+
export interface RunTestOptions {
|
|
16
|
+
grep?: string;
|
|
17
|
+
timeout?: number;
|
|
18
|
+
headless?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function runTestFile(filePath: string, bridge: BridgeServer, page: any, opts?: RunTestOptions, onResult?: (result: TestResult) => void): Promise<TestResult[]>;
|
|
21
|
+
export declare function listTests(filePath: string): Promise<DiscoveredTest[]>;
|
|
22
|
+
//# sourceMappingURL=run-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-test.d.ts","sourceRoot":"","sources":["../src/run-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmC7D,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,CAAC;AAEtC,iBAAS,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiC5C;AA6BD,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,GAAG,EACT,IAAI,CAAC,EAAE,cAAc,EACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GACtC,OAAO,CAAC,UAAU,EAAE,CAAC,CAOvB;AAyID,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA+C3E"}
|