@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.
Files changed (162) hide show
  1. package/README.md +116 -0
  2. package/dist/args.d.ts +16 -0
  3. package/dist/args.d.ts.map +1 -0
  4. package/dist/args.js +48 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/bridge-utils.cjs +197 -0
  7. package/dist/bridge-utils.cjs.map +1 -0
  8. package/dist/bridge-utils.d.cts +30 -0
  9. package/dist/bridge-utils.d.cts.map +1 -0
  10. package/dist/browser.d.ts +12 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +40 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/bundler.d.ts +6 -0
  15. package/dist/bundler.d.ts.map +1 -0
  16. package/dist/bundler.js +32 -0
  17. package/dist/bundler.js.map +1 -0
  18. package/dist/cdpPreload.cjs +44 -0
  19. package/dist/cdpPreload.cjs.map +1 -0
  20. package/dist/cdpPreload.d.cts +11 -0
  21. package/dist/cdpPreload.d.cts.map +1 -0
  22. package/dist/chrome-extension/background.js +233485 -0
  23. package/dist/chrome-extension/background.js.map +1 -0
  24. package/dist/chrome-extension/content/picker.js +279 -0
  25. package/dist/chrome-extension/content/recorder.js +475 -0
  26. package/dist/chrome-extension/devtools/console.html +17 -0
  27. package/dist/chrome-extension/devtools/console.js +28 -0
  28. package/dist/chrome-extension/devtools/console.js.map +1 -0
  29. package/dist/chrome-extension/devtools/devtools.html +8 -0
  30. package/dist/chrome-extension/devtools/devtools.js +7 -0
  31. package/dist/chrome-extension/devtools/devtools.js.map +1 -0
  32. package/dist/chrome-extension/icons/dramaturg_icon_128.png +0 -0
  33. package/dist/chrome-extension/icons/dramaturg_icon_16.png +0 -0
  34. package/dist/chrome-extension/icons/dramaturg_icon_32.png +0 -0
  35. package/dist/chrome-extension/icons/dramaturg_icon_48.png +0 -0
  36. package/dist/chrome-extension/index.css +1333 -0
  37. package/dist/chrome-extension/index.js +12462 -0
  38. package/dist/chrome-extension/index.js.map +1 -0
  39. package/dist/chrome-extension/index2.js +27327 -0
  40. package/dist/chrome-extension/index2.js.map +1 -0
  41. package/dist/chrome-extension/manifest.json +46 -0
  42. package/dist/chrome-extension/modulepreload-polyfill.js +30 -0
  43. package/dist/chrome-extension/modulepreload-polyfill.js.map +1 -0
  44. package/dist/chrome-extension/newtab/newtab.html +202 -0
  45. package/dist/chrome-extension/offscreen/offscreen.html +6 -0
  46. package/dist/chrome-extension/offscreen/offscreen.js +54 -0
  47. package/dist/chrome-extension/offscreen/offscreen.js.map +1 -0
  48. package/dist/chrome-extension/panel/panel.html +16 -0
  49. package/dist/chrome-extension/panel/panel.js +2210 -0
  50. package/dist/chrome-extension/panel/panel.js.map +1 -0
  51. package/dist/chrome-extension/preferences/preferences.html +14 -0
  52. package/dist/chrome-extension/preferences/preferences.js +102 -0
  53. package/dist/chrome-extension/preferences/preferences.js.map +1 -0
  54. package/dist/chrome-extension/settings.js +13 -0
  55. package/dist/chrome-extension/settings.js.map +1 -0
  56. package/dist/chrome-extension/sw-debugger-core.js +1127 -0
  57. package/dist/chrome-extension/sw-debugger-core.js.map +1 -0
  58. package/dist/cli.d.ts +14 -0
  59. package/dist/cli.d.ts.map +1 -0
  60. package/dist/cli.js +43 -0
  61. package/dist/cli.js.map +1 -0
  62. package/dist/compiler/classify.d.ts +13 -0
  63. package/dist/compiler/classify.d.ts.map +1 -0
  64. package/dist/compiler/classify.js +143 -0
  65. package/dist/compiler/classify.js.map +1 -0
  66. package/dist/compiler/index.d.ts +24 -0
  67. package/dist/compiler/index.d.ts.map +1 -0
  68. package/dist/compiler/index.js +41 -0
  69. package/dist/compiler/index.js.map +1 -0
  70. package/dist/compiler/parser.d.ts +24 -0
  71. package/dist/compiler/parser.d.ts.map +1 -0
  72. package/dist/compiler/parser.js +77 -0
  73. package/dist/compiler/parser.js.map +1 -0
  74. package/dist/compiler/transform.d.ts +20 -0
  75. package/dist/compiler/transform.d.ts.map +1 -0
  76. package/dist/compiler/transform.js +36 -0
  77. package/dist/compiler/transform.js.map +1 -0
  78. package/dist/compiler.d.ts +24 -0
  79. package/dist/compiler.d.ts.map +1 -0
  80. package/dist/compiler.js +129 -0
  81. package/dist/compiler.js.map +1 -0
  82. package/dist/config.d.ts +6 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +16 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/discover.d.ts +5 -0
  87. package/dist/discover.d.ts.map +1 -0
  88. package/dist/discover.js +46 -0
  89. package/dist/discover.js.map +1 -0
  90. package/dist/execute.d.ts +13 -0
  91. package/dist/execute.d.ts.map +1 -0
  92. package/dist/execute.js +281 -0
  93. package/dist/execute.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +2 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/mode-detect.d.ts +21 -0
  99. package/dist/mode-detect.d.ts.map +1 -0
  100. package/dist/mode-detect.js +67 -0
  101. package/dist/mode-detect.js.map +1 -0
  102. package/dist/proxy-page.d.ts +32 -0
  103. package/dist/proxy-page.d.ts.map +1 -0
  104. package/dist/proxy-page.js +192 -0
  105. package/dist/proxy-page.js.map +1 -0
  106. package/dist/pw-cli.d.ts +12 -0
  107. package/dist/pw-cli.d.ts.map +1 -0
  108. package/dist/pw-cli.js +73 -0
  109. package/dist/pw-cli.js.map +1 -0
  110. package/dist/pw-launch.d.ts +15 -0
  111. package/dist/pw-launch.d.ts.map +1 -0
  112. package/dist/pw-launch.js +97 -0
  113. package/dist/pw-launch.js.map +1 -0
  114. package/dist/pw-preload.cjs +164 -0
  115. package/dist/pw-preload.cjs.map +1 -0
  116. package/dist/pw-preload.d.cts +15 -0
  117. package/dist/pw-preload.d.cts.map +1 -0
  118. package/dist/pw-repl-extension.d.ts +12 -0
  119. package/dist/pw-repl-extension.d.ts.map +1 -0
  120. package/dist/pw-repl-extension.js +100 -0
  121. package/dist/pw-repl-extension.js.map +1 -0
  122. package/dist/pw-repl.d.ts +12 -0
  123. package/dist/pw-repl.d.ts.map +1 -0
  124. package/dist/pw-repl.js +111 -0
  125. package/dist/pw-repl.js.map +1 -0
  126. package/dist/pw-worker.cjs +216 -0
  127. package/dist/pw-worker.cjs.map +1 -0
  128. package/dist/pw-worker.d.cts +13 -0
  129. package/dist/pw-worker.d.cts.map +1 -0
  130. package/dist/pw-worker.d.ts +11 -0
  131. package/dist/pw-worker.d.ts.map +1 -0
  132. package/dist/pw-worker.js +51 -0
  133. package/dist/pw-worker.js.map +1 -0
  134. package/dist/run-test.d.ts +22 -0
  135. package/dist/run-test.d.ts.map +1 -0
  136. package/dist/run-test.js +358 -0
  137. package/dist/run-test.js.map +1 -0
  138. package/dist/runner.d.ts +10 -0
  139. package/dist/runner.d.ts.map +1 -0
  140. package/dist/runner.js +82 -0
  141. package/dist/runner.js.map +1 -0
  142. package/dist/shim/alias.d.ts +11 -0
  143. package/dist/shim/alias.d.ts.map +1 -0
  144. package/dist/shim/alias.js +24 -0
  145. package/dist/shim/alias.js.map +1 -0
  146. package/dist/shim/framework.d.ts +11 -0
  147. package/dist/shim/framework.d.ts.map +1 -0
  148. package/dist/shim/framework.js +11 -0
  149. package/dist/shim/framework.js.map +1 -0
  150. package/dist/shim/test-runner-node.d.ts +49 -0
  151. package/dist/shim/test-runner-node.d.ts.map +1 -0
  152. package/dist/shim/test-runner-node.js +191 -0
  153. package/dist/shim/test-runner-node.js.map +1 -0
  154. package/dist/shim/test-runner.d.ts +44 -0
  155. package/dist/shim/test-runner.d.ts.map +1 -0
  156. package/dist/shim/test-runner.js +181 -0
  157. package/dist/shim/test-runner.js.map +1 -0
  158. package/dist/types.d.ts +41 -0
  159. package/dist/types.d.ts.map +1 -0
  160. package/dist/types.js +2 -0
  161. package/dist/types.js.map +1 -0
  162. package/package.json +37 -0
@@ -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"}