@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/run-test.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
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 path from 'node:path';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
// ─── Node API detection ─────────────────────────────────────────────────────
|
|
16
|
+
const NODE_MODULES = new Set([
|
|
17
|
+
'fs', 'path', 'child_process', 'os', 'crypto', 'util',
|
|
18
|
+
'stream', 'events', 'net', 'http', 'https', 'url',
|
|
19
|
+
'worker_threads',
|
|
20
|
+
]);
|
|
21
|
+
const NODE_PATTERNS = [
|
|
22
|
+
/\brequire\s*\(\s*['"]fs['"]\)/,
|
|
23
|
+
/\brequire\s*\(\s*['"]path['"]\)/,
|
|
24
|
+
/\brequire\s*\(\s*['"]child_process['"]\)/,
|
|
25
|
+
/\bfrom\s+['"]fs['"]/,
|
|
26
|
+
/\bfrom\s+['"]path['"]/,
|
|
27
|
+
/\bfrom\s+['"]child_process['"]/,
|
|
28
|
+
/\bfrom\s+['"]node:/,
|
|
29
|
+
/\bprocess\.env\b/,
|
|
30
|
+
/\bprocess\.cwd\b/,
|
|
31
|
+
/\b__dirname\b/,
|
|
32
|
+
/\b__filename\b/,
|
|
33
|
+
/\bBuffer\.\b/,
|
|
34
|
+
/\.route\s*\(/,
|
|
35
|
+
/\.unroute\s*\(/,
|
|
36
|
+
/\.routeFromHAR\s*\(/,
|
|
37
|
+
/\.waitForEvent\s*\(/,
|
|
38
|
+
/\.waitForResponse\s*\(/,
|
|
39
|
+
/\.waitForRequest\s*\(/,
|
|
40
|
+
/\.\$eval\s*\(/,
|
|
41
|
+
/\.\$\$eval\s*\(/,
|
|
42
|
+
];
|
|
43
|
+
export { needsNode as needsNodeMode };
|
|
44
|
+
function needsNode(filePath) {
|
|
45
|
+
const checked = new Set();
|
|
46
|
+
function check(file) {
|
|
47
|
+
if (checked.has(file))
|
|
48
|
+
return false;
|
|
49
|
+
checked.add(file);
|
|
50
|
+
let source;
|
|
51
|
+
try {
|
|
52
|
+
source = fs.readFileSync(file, 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
for (const pattern of NODE_PATTERNS) {
|
|
58
|
+
if (pattern.test(source))
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
// Check local imports
|
|
62
|
+
const importRe = /(?:import|from)\s+['"](\.[^'"]+)['"]/g;
|
|
63
|
+
let m;
|
|
64
|
+
while ((m = importRe.exec(source)) !== null) {
|
|
65
|
+
const dir = path.dirname(file);
|
|
66
|
+
const candidates = [
|
|
67
|
+
path.resolve(dir, m[1]),
|
|
68
|
+
path.resolve(dir, m[1] + '.ts'),
|
|
69
|
+
path.resolve(dir, m[1] + '.js'),
|
|
70
|
+
];
|
|
71
|
+
for (const c of candidates) {
|
|
72
|
+
if (fs.existsSync(c) && check(c))
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
return check(filePath);
|
|
79
|
+
}
|
|
80
|
+
// ─── Alias path ─────────────────────────────────────────────────────────────
|
|
81
|
+
let _aliasPath = null;
|
|
82
|
+
function getAliasPath() {
|
|
83
|
+
if (_aliasPath)
|
|
84
|
+
return _aliasPath;
|
|
85
|
+
_aliasPath = path.resolve(path.dirname(__filename), 'shim/alias.ts');
|
|
86
|
+
if (!fs.existsSync(_aliasPath))
|
|
87
|
+
_aliasPath = _aliasPath.replace('.ts', '.js');
|
|
88
|
+
return _aliasPath;
|
|
89
|
+
}
|
|
90
|
+
// ─── Find playwright.config.ts by walking up from test file ──────────────────
|
|
91
|
+
function findConfigDir(startDir) {
|
|
92
|
+
let dir = startDir;
|
|
93
|
+
while (dir !== path.dirname(dir)) {
|
|
94
|
+
if (fs.existsSync(path.join(dir, 'playwright.config.ts')) ||
|
|
95
|
+
fs.existsSync(path.join(dir, 'playwright.config.js'))) {
|
|
96
|
+
return dir;
|
|
97
|
+
}
|
|
98
|
+
dir = path.dirname(dir);
|
|
99
|
+
}
|
|
100
|
+
return startDir; // fallback to test file's directory
|
|
101
|
+
}
|
|
102
|
+
export async function runTestFile(filePath, bridge, page, opts, onResult) {
|
|
103
|
+
const isNode = needsNode(filePath);
|
|
104
|
+
if (isNode) {
|
|
105
|
+
return executeNode(filePath, page, opts, onResult);
|
|
106
|
+
}
|
|
107
|
+
return executeBrowser(filePath, bridge, opts);
|
|
108
|
+
}
|
|
109
|
+
// ─── Browser path ───────────────────────────────────────────────────────────
|
|
110
|
+
async function executeBrowser(filePath, bridge, opts) {
|
|
111
|
+
const esbuild = await import('esbuild');
|
|
112
|
+
const testDir = path.dirname(filePath);
|
|
113
|
+
const testFileName = path.basename(filePath);
|
|
114
|
+
const plugin = {
|
|
115
|
+
name: 'pw-browser',
|
|
116
|
+
setup(build) {
|
|
117
|
+
build.onResolve({ filter: /^__entry__$/ }, () => ({ path: '__entry__', namespace: 'entry' }));
|
|
118
|
+
build.onLoad({ filter: /.*/, namespace: 'entry' }, () => ({
|
|
119
|
+
contents: `import './${testFileName}';`,
|
|
120
|
+
resolveDir: testDir,
|
|
121
|
+
loader: 'ts',
|
|
122
|
+
}));
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
const result = await esbuild.build({
|
|
126
|
+
entryPoints: ['__entry__'],
|
|
127
|
+
bundle: true, write: false, format: 'iife', platform: 'neutral',
|
|
128
|
+
plugins: [plugin],
|
|
129
|
+
alias: { '@playwright/test': getAliasPath() },
|
|
130
|
+
});
|
|
131
|
+
const compiled = result.outputFiles[0].text;
|
|
132
|
+
// Build script with optional grep
|
|
133
|
+
let script = 'globalThis.__resetTestState();\n';
|
|
134
|
+
if (opts?.grep) {
|
|
135
|
+
const escaped = opts.grep.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
136
|
+
script += `globalThis.__setGrep(${JSON.stringify(escaped)});\n`;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
script += 'globalThis.__setGrep(null);\n';
|
|
140
|
+
}
|
|
141
|
+
script += compiled + '\n';
|
|
142
|
+
script += 'await globalThis.__runTests();';
|
|
143
|
+
const r = await bridge.runScript(script, 'javascript');
|
|
144
|
+
if (r.isError)
|
|
145
|
+
throw new Error(r.text || 'Bridge error');
|
|
146
|
+
return parseResults(r.text || '', filePath);
|
|
147
|
+
}
|
|
148
|
+
// ─── Node DIRECT path ───────────────────────────────────────────────────────
|
|
149
|
+
async function executeNode(filePath, _page, opts, onResult) {
|
|
150
|
+
const { spawn } = await import('node:child_process');
|
|
151
|
+
const { createRequire } = await import('node:module');
|
|
152
|
+
const require = createRequire(__filename);
|
|
153
|
+
const pwCliPath = require.resolve('@playwright/test/cli');
|
|
154
|
+
const configDir = findConfigDir(path.dirname(filePath));
|
|
155
|
+
const relPath = path.relative(configDir, filePath).replace(/\\/g, '/');
|
|
156
|
+
const args = [pwCliPath, 'test', relPath, '--workers', '1', '--reporter', 'list', '--project', 'chromium'];
|
|
157
|
+
if (opts?.grep) {
|
|
158
|
+
// Escape regex special chars for Playwright's --grep (which is a regex)
|
|
159
|
+
const escaped = opts.grep.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
160
|
+
args.push('--grep', escaped);
|
|
161
|
+
}
|
|
162
|
+
// Use 'node' not process.execPath (which is Electron in VS Code)
|
|
163
|
+
const nodePath = process.env.NVM_SYMLINK
|
|
164
|
+
? path.join(process.env.NVM_SYMLINK, 'node')
|
|
165
|
+
: 'node';
|
|
166
|
+
console.error(`[pw-cli] ${nodePath} ${args.map(a => a.includes(' ') ? `"${a}"` : a).join(' ')}`);
|
|
167
|
+
return new Promise((resolve) => {
|
|
168
|
+
const results = [];
|
|
169
|
+
let buffer = '';
|
|
170
|
+
const child = spawn(nodePath, args, {
|
|
171
|
+
cwd: configDir,
|
|
172
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
173
|
+
shell: true,
|
|
174
|
+
env: (() => {
|
|
175
|
+
const env = { ...process.env };
|
|
176
|
+
delete env.ELECTRON_RUN_AS_NODE;
|
|
177
|
+
delete env.NODE_OPTIONS;
|
|
178
|
+
return env;
|
|
179
|
+
})(),
|
|
180
|
+
});
|
|
181
|
+
child.stdout?.on('data', (d) => {
|
|
182
|
+
buffer += d.toString();
|
|
183
|
+
// Parse complete lines
|
|
184
|
+
const lines = buffer.split('\n');
|
|
185
|
+
buffer = lines.pop() || ''; // keep incomplete line in buffer
|
|
186
|
+
for (const line of lines) {
|
|
187
|
+
const result = parseListLine(line, filePath);
|
|
188
|
+
if (result) {
|
|
189
|
+
results.push(result);
|
|
190
|
+
if (onResult)
|
|
191
|
+
onResult(result);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
child.on('close', (code) => {
|
|
196
|
+
// Parse remaining buffer
|
|
197
|
+
if (buffer.trim()) {
|
|
198
|
+
const result = parseListLine(buffer, filePath);
|
|
199
|
+
if (result) {
|
|
200
|
+
results.push(result);
|
|
201
|
+
if (onResult)
|
|
202
|
+
onResult(result);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
console.error(`[pw-cli] exit code: ${code}, ${results.length} results`);
|
|
206
|
+
resolve(results);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// ─── Test Discovery ──────────────────────────────────────────────────────────
|
|
211
|
+
// Discover tests by running `playwright test --list` in a subprocess.
|
|
212
|
+
// Evaluates the file through Playwright's loader — resolves template literals,
|
|
213
|
+
// expands parameterized tests, and returns accurate test names + line numbers.
|
|
214
|
+
//
|
|
215
|
+
// Why subprocess instead of TestServerDispatcher API:
|
|
216
|
+
// The in-process API fails under pnpm because the forked loader worker resolves
|
|
217
|
+
// @playwright/test to a different physical copy than the one that set the
|
|
218
|
+
// currentFileSuite global — same version, two module instances, broken singleton.
|
|
219
|
+
// The CLI boots from a single entry point so resolution is consistent.
|
|
220
|
+
export async function listTests(filePath) {
|
|
221
|
+
const { spawn } = await import('node:child_process');
|
|
222
|
+
const { createRequire } = await import('node:module');
|
|
223
|
+
const require = createRequire(__filename);
|
|
224
|
+
const pwCliPath = require.resolve('@playwright/test/cli');
|
|
225
|
+
const configDir = findConfigDir(path.dirname(filePath));
|
|
226
|
+
const relPath = path.relative(configDir, filePath).replace(/\\/g, '/');
|
|
227
|
+
const args = [pwCliPath, 'test', '--list', relPath, '--reporter', 'list'];
|
|
228
|
+
const nodePath = process.env.NVM_SYMLINK
|
|
229
|
+
? path.join(process.env.NVM_SYMLINK, 'node')
|
|
230
|
+
: 'node';
|
|
231
|
+
return new Promise((resolve) => {
|
|
232
|
+
let buffer = '';
|
|
233
|
+
const tests = [];
|
|
234
|
+
const child = spawn(nodePath, args, {
|
|
235
|
+
cwd: configDir,
|
|
236
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
237
|
+
shell: true,
|
|
238
|
+
env: (() => {
|
|
239
|
+
const env = { ...process.env };
|
|
240
|
+
delete env.ELECTRON_RUN_AS_NODE;
|
|
241
|
+
delete env.NODE_OPTIONS;
|
|
242
|
+
return env;
|
|
243
|
+
})(),
|
|
244
|
+
});
|
|
245
|
+
child.stdout?.on('data', (d) => { buffer += d.toString(); });
|
|
246
|
+
child.on('close', () => {
|
|
247
|
+
// Parse lines: " [project] › file.spec.ts:LINE:COL › [describe ›] test name"
|
|
248
|
+
for (const line of buffer.split('\n')) {
|
|
249
|
+
const m = line.match(/›\s+\S+?:(\d+):(\d+)\s+›\s+(.+)/);
|
|
250
|
+
if (!m)
|
|
251
|
+
continue;
|
|
252
|
+
const lineNum = parseInt(m[1]);
|
|
253
|
+
const col = parseInt(m[2]);
|
|
254
|
+
const namePath = m[3].trim();
|
|
255
|
+
const parts = namePath.split(/\s+›\s+/);
|
|
256
|
+
const title = parts[parts.length - 1];
|
|
257
|
+
tests.push({ title, fullName: parts.join(' > '), line: lineNum, column: col });
|
|
258
|
+
}
|
|
259
|
+
resolve(tests);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
// Parse Playwright list reporter line:
|
|
264
|
+
// ✓ 1 [chromium] › file.spec.ts:10:1 › describe › test name (1.2s)
|
|
265
|
+
// ✗ 2 [chromium] › file.spec.ts:20:1 › test name (3.4s)
|
|
266
|
+
// - 3 [chromium] › file.spec.ts:30:1 › test name
|
|
267
|
+
function parseListLine(line, filePath) {
|
|
268
|
+
// Extract line number from file location: "file.spec.ts:23:1"
|
|
269
|
+
const locMatch = line.match(/›\s+\S+?:(\d+):\d+\s+›/);
|
|
270
|
+
const sourceLine = locMatch ? parseInt(locMatch[1]) : undefined;
|
|
271
|
+
// Match passed: ✓ or ok
|
|
272
|
+
const passMatch = line.match(/^\s*[✓✔].*?›\s+.*?›\s+(.+?)\s+\(([0-9.]+)(m?s)\)/);
|
|
273
|
+
if (passMatch) {
|
|
274
|
+
const dur = passMatch[3] === 's' ? parseFloat(passMatch[2]) * 1000 : parseFloat(passMatch[2]);
|
|
275
|
+
return { name: passMatch[1].trim(), file: filePath, passed: true, skipped: false, duration: dur, line: sourceLine };
|
|
276
|
+
}
|
|
277
|
+
// Match passed (plain text): " ok N [project] › ..."
|
|
278
|
+
const okMatch = line.match(/^\s*ok\s+\d+.*?›\s+.*?›\s+(.+?)\s+\(([0-9.]+)(m?s)\)/);
|
|
279
|
+
if (okMatch) {
|
|
280
|
+
const dur = okMatch[3] === 's' ? parseFloat(okMatch[2]) * 1000 : parseFloat(okMatch[2]);
|
|
281
|
+
return { name: okMatch[1].trim(), file: filePath, passed: true, skipped: false, duration: dur, line: sourceLine };
|
|
282
|
+
}
|
|
283
|
+
// Match failed: ✗ or x
|
|
284
|
+
const failMatch = line.match(/^\s*[✗✘×].*?›\s+.*?›\s+(.+?)\s+\(([0-9.]+)(m?s)\)/);
|
|
285
|
+
if (failMatch) {
|
|
286
|
+
const dur = failMatch[3] === 's' ? parseFloat(failMatch[2]) * 1000 : parseFloat(failMatch[2]);
|
|
287
|
+
return { name: failMatch[1].trim(), file: filePath, passed: false, skipped: false, duration: dur, line: sourceLine };
|
|
288
|
+
}
|
|
289
|
+
// Match skipped: -
|
|
290
|
+
const skipMatch = line.match(/^\s*-\s+\d+.*?›\s+.*?›\s+(.+)/);
|
|
291
|
+
if (skipMatch) {
|
|
292
|
+
return { name: skipMatch[1].trim(), file: filePath, passed: true, skipped: true, duration: 0, line: sourceLine };
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
function parseJsonResults(stdout, filePath) {
|
|
297
|
+
try {
|
|
298
|
+
const report = JSON.parse(stdout);
|
|
299
|
+
const results = [];
|
|
300
|
+
for (const suite of report.suites || []) {
|
|
301
|
+
collectResults(suite, results, filePath);
|
|
302
|
+
}
|
|
303
|
+
console.error(`[pw-cli] parsed ${results.length} results: ${results.map(r => `${r.passed ? '✓' : '✗'} ${r.name} (${r.duration}ms)`).join(', ')}`);
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
console.error(`[pw-cli] failed to parse JSON: ${e.message}`);
|
|
308
|
+
console.error(`[pw-cli] stdout first 200 chars: ${stdout.slice(0, 200)}`);
|
|
309
|
+
return [];
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function collectResults(suite, results, filePath, parentTitle) {
|
|
313
|
+
for (const spec of suite.specs || []) {
|
|
314
|
+
for (const test of spec.tests || []) {
|
|
315
|
+
const result = test.results?.[0];
|
|
316
|
+
const name = parentTitle ? `${parentTitle} > ${spec.title}` : spec.title;
|
|
317
|
+
results.push({
|
|
318
|
+
name,
|
|
319
|
+
file: filePath,
|
|
320
|
+
passed: test.status === 'expected',
|
|
321
|
+
skipped: test.status === 'skipped',
|
|
322
|
+
error: result?.error?.message,
|
|
323
|
+
duration: result?.duration || 0,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
for (const child of suite.suites || []) {
|
|
328
|
+
// Skip file-level suite title (it's the filename), keep describe titles
|
|
329
|
+
const childTitle = parentTitle !== undefined
|
|
330
|
+
? (child.title ? `${parentTitle} > ${child.title}` : parentTitle)
|
|
331
|
+
: child.title || undefined;
|
|
332
|
+
collectResults(child, results, filePath, childTitle);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
// ─── Parse Results (browser path) ───────────────────────────────────────────
|
|
336
|
+
function parseResults(output, file) {
|
|
337
|
+
const results = [];
|
|
338
|
+
const lines = output.split('\n');
|
|
339
|
+
for (let i = 0; i < lines.length; i++) {
|
|
340
|
+
const passMatch = lines[i].match(/^\s*[✓✔]\s+(.+?)\s+\((\d+)ms\)/);
|
|
341
|
+
if (passMatch) {
|
|
342
|
+
results.push({ name: passMatch[1], file, passed: true, skipped: false, duration: parseInt(passMatch[2]) });
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
const failMatch = lines[i].match(/^\s*[✗✘]\s+(.+?)\s+\((\d+)ms\)/);
|
|
346
|
+
if (failMatch) {
|
|
347
|
+
const error = lines[i + 1]?.trim() || 'Test failed';
|
|
348
|
+
results.push({ name: failMatch[1], file, passed: false, skipped: false, error, duration: parseInt(failMatch[2]) });
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
const skipMatch = lines[i].match(/^\s*-\s+(.+?)\s+\(skipped\)/);
|
|
352
|
+
if (skipMatch) {
|
|
353
|
+
results.push({ name: skipMatch[1], file, passed: true, skipped: true, duration: 0 });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return results;
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=run-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-test.js","sourceRoot":"","sources":["../src/run-test.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Runner
|
|
3
|
+
*
|
|
4
|
+
* Discovers and executes Playwright test files via bridge mode.
|
|
5
|
+
* Reads playwright.config.ts for configuration.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: single worker, basic config, list reporter.
|
|
8
|
+
*/
|
|
9
|
+
export declare function run(args: string[]): Promise<number>;
|
|
10
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4EzD"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Runner
|
|
3
|
+
*
|
|
4
|
+
* Discovers and executes Playwright test files via bridge mode.
|
|
5
|
+
* Reads playwright.config.ts for configuration.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: single worker, basic config, list reporter.
|
|
8
|
+
*/
|
|
9
|
+
import { BridgeServer } from '@playwright-repl/core';
|
|
10
|
+
import { parseArgs } from './args.js';
|
|
11
|
+
import { loadConfig } from './config.js';
|
|
12
|
+
import { discoverTests } from './discover.js';
|
|
13
|
+
import { executeTestFile } from './execute.js';
|
|
14
|
+
export async function run(args) {
|
|
15
|
+
const opts = parseArgs(args);
|
|
16
|
+
const config = await loadConfig(opts.config);
|
|
17
|
+
// Merge CLI options with config
|
|
18
|
+
const runOpts = {
|
|
19
|
+
testDir: config.testDir || '.',
|
|
20
|
+
timeout: opts.timeout ?? config.timeout ?? 30000,
|
|
21
|
+
headed: opts.headed ?? false,
|
|
22
|
+
grep: opts.grep,
|
|
23
|
+
retries: opts.retries ?? config.retries ?? 0,
|
|
24
|
+
workers: opts.workers ?? 1, // Phase 1: single worker
|
|
25
|
+
baseURL: config.use?.baseURL,
|
|
26
|
+
forceNode: opts.forceNode,
|
|
27
|
+
};
|
|
28
|
+
console.log(`\npw test runner\n`);
|
|
29
|
+
// Discover test files
|
|
30
|
+
const testFiles = discoverTests(runOpts.testDir, opts.filter);
|
|
31
|
+
if (testFiles.length === 0) {
|
|
32
|
+
console.log('No test files found.');
|
|
33
|
+
return 1;
|
|
34
|
+
}
|
|
35
|
+
console.log(`Found ${testFiles.length} test file(s)\n`);
|
|
36
|
+
// Start bridge on random port (avoids conflicts with VS Code extension or other instances)
|
|
37
|
+
const bridge = new BridgeServer();
|
|
38
|
+
await bridge.start(0);
|
|
39
|
+
const bridgePort = bridge.port;
|
|
40
|
+
// Launch Chromium with extension — returns context + the active page
|
|
41
|
+
const { launchBrowser } = await import('./browser.js');
|
|
42
|
+
const { context, page: nodePage } = await launchBrowser({ headed: runOpts.headed, bridgePort });
|
|
43
|
+
// Wait for extension to connect
|
|
44
|
+
await bridge.waitForConnection(30000);
|
|
45
|
+
console.log('Browser connected.\n');
|
|
46
|
+
// Verify bridge works
|
|
47
|
+
const ping = await bridge.run('help');
|
|
48
|
+
console.log(`Bridge verify: ${ping.isError ? 'ERROR' : 'OK'} (connected: ${bridge.connected})`);
|
|
49
|
+
console.log(`Bridge response: ${(ping.text || '').substring(0, 100)}`);
|
|
50
|
+
// Run test files
|
|
51
|
+
const allResults = [];
|
|
52
|
+
let failed = 0;
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
for (const file of testFiles) {
|
|
55
|
+
// context = for route/unroute (context-level), nodePage = for waitForEvent (CDP page)
|
|
56
|
+
const results = await executeTestFile(file, bridge, runOpts, context, nodePage);
|
|
57
|
+
allResults.push(...results);
|
|
58
|
+
for (const r of results) {
|
|
59
|
+
if (r.skipped) {
|
|
60
|
+
console.log(` - ${r.name} (skipped)`);
|
|
61
|
+
}
|
|
62
|
+
else if (r.passed) {
|
|
63
|
+
console.log(` \u2713 ${r.name} (${r.duration}ms)`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(` \u2717 ${r.name} (${r.duration}ms)`);
|
|
67
|
+
if (r.error)
|
|
68
|
+
console.log(` ${r.error}`);
|
|
69
|
+
failed++;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Summary
|
|
74
|
+
const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
75
|
+
const passed = allResults.filter(r => r.passed && !r.skipped).length;
|
|
76
|
+
const skipped = allResults.filter(r => r.skipped).length;
|
|
77
|
+
console.log(`\n ${passed} passed, ${failed} failed, ${skipped} skipped (${totalTime}s)\n`);
|
|
78
|
+
// Cleanup
|
|
79
|
+
await bridge.close();
|
|
80
|
+
return failed > 0 ? 1 : 0;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin alias for @playwright/test
|
|
3
|
+
*
|
|
4
|
+
* esbuild aliases '@playwright/test' to this file.
|
|
5
|
+
* Re-exports test/expect from globalThis (installed by framework.ts).
|
|
6
|
+
* This file is tiny — bundled per test but adds negligible size.
|
|
7
|
+
*/
|
|
8
|
+
export declare const test: any;
|
|
9
|
+
export declare const it: any;
|
|
10
|
+
export declare const expect: any;
|
|
11
|
+
//# sourceMappingURL=alias.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.d.ts","sourceRoot":"","sources":["../../src/shim/alias.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,eAAO,MAAM,IAAI,EAAY,GAAG,CAAC;AACjC,eAAO,MAAM,EAAE,EAAY,GAAG,CAAC;AAC/B,eAAO,MAAM,MAAM,KAAc,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin alias for @playwright/test
|
|
3
|
+
*
|
|
4
|
+
* esbuild aliases '@playwright/test' to this file.
|
|
5
|
+
* Re-exports test/expect from globalThis (installed by framework.ts).
|
|
6
|
+
* This file is tiny — bundled per test but adds negligible size.
|
|
7
|
+
*/
|
|
8
|
+
const _g = globalThis;
|
|
9
|
+
// Dynamic lookup — reads globalThis.__test at call time, not import time.
|
|
10
|
+
// This ensures test() inside describe uses the wrapped version.
|
|
11
|
+
function _test(...args) { return _g.__test(...args); }
|
|
12
|
+
Object.defineProperty(_test, 'describe', { get: () => _g.__test?.describe });
|
|
13
|
+
Object.defineProperty(_test, 'beforeEach', { get: () => _g.__test?.beforeEach });
|
|
14
|
+
Object.defineProperty(_test, 'afterEach', { get: () => _g.__test?.afterEach });
|
|
15
|
+
Object.defineProperty(_test, 'beforeAll', { get: () => _g.__test?.beforeAll });
|
|
16
|
+
Object.defineProperty(_test, 'afterAll', { get: () => _g.__test?.afterAll });
|
|
17
|
+
Object.defineProperty(_test, 'skip', { get: () => _g.__test?.skip });
|
|
18
|
+
Object.defineProperty(_test, 'only', { get: () => _g.__test?.only });
|
|
19
|
+
Object.defineProperty(_test, 'extend', { get: () => _g.__test?.extend });
|
|
20
|
+
Object.defineProperty(_test, 'use', { get: () => _g.__test?.use });
|
|
21
|
+
export const test = _test;
|
|
22
|
+
export const it = _test;
|
|
23
|
+
export const expect = _g.__expect;
|
|
24
|
+
//# sourceMappingURL=alias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.js","sourceRoot":"","sources":["../../src/shim/alias.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,EAAE,GAAG,UAAiB,CAAC;AAE7B,0EAA0E;AAC1E,gEAAgE;AAChE,SAAS,KAAK,CAAC,GAAG,IAAW,IAAI,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AACjF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACrE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACrE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;AAEnE,MAAM,CAAC,MAAM,IAAI,GAAG,KAAY,CAAC;AACjC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAY,CAAC;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* DEPRECATED — the test framework lives in packages/extension/src/test-framework.ts.
|
|
4
|
+
*
|
|
5
|
+
* The Chrome extension's background.ts calls installFramework() which sets up
|
|
6
|
+
* globalThis.__test, __expect, __runTests. Bridge-mode tests access these
|
|
7
|
+
* via alias.ts which re-exports from globalThis.
|
|
8
|
+
*
|
|
9
|
+
* This file is no longer used. Kept to document the architecture.
|
|
10
|
+
*/
|
|
11
|
+
//# sourceMappingURL=framework.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/shim/framework.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
/**
|
|
3
|
+
* DEPRECATED — the test framework lives in packages/extension/src/test-framework.ts.
|
|
4
|
+
*
|
|
5
|
+
* The Chrome extension's background.ts calls installFramework() which sets up
|
|
6
|
+
* globalThis.__test, __expect, __runTests. Bridge-mode tests access these
|
|
7
|
+
* via alias.ts which re-exports from globalThis.
|
|
8
|
+
*
|
|
9
|
+
* This file is no longer used. Kept to document the architecture.
|
|
10
|
+
*/
|
|
11
|
+
//# sourceMappingURL=framework.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.js","sourceRoot":"","sources":["../../src/shim/framework.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Runner Shim
|
|
3
|
+
*
|
|
4
|
+
* Lightweight test framework that replaces @playwright/test imports.
|
|
5
|
+
* esbuild aliases '@playwright/test' to this file, so test files
|
|
6
|
+
* use our runner without any code changes.
|
|
7
|
+
*
|
|
8
|
+
* Runs inside playwright-crx's service worker where `page`, `context`,
|
|
9
|
+
* and `expect` are already available in scope.
|
|
10
|
+
*/
|
|
11
|
+
type TestFn = (fixtures: {
|
|
12
|
+
page: unknown;
|
|
13
|
+
context: unknown;
|
|
14
|
+
expect: unknown;
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
type HookFn = (fixtures: {
|
|
17
|
+
page: unknown;
|
|
18
|
+
context: unknown;
|
|
19
|
+
expect: unknown;
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
declare function test(name: string, fn: TestFn): void;
|
|
22
|
+
declare namespace test {
|
|
23
|
+
var only: (name: string, fn: TestFn) => void;
|
|
24
|
+
var skip: (name: string, fn: TestFn) => void;
|
|
25
|
+
var describe: (name: string, fn: () => void) => void;
|
|
26
|
+
var beforeAll: (fn: HookFn) => void;
|
|
27
|
+
var afterAll: (fn: HookFn) => void;
|
|
28
|
+
var beforeEach: (fn: HookFn) => void;
|
|
29
|
+
var extend: (fixtures: Record<string, any>) => {
|
|
30
|
+
(name: string, fn: TestFn): void;
|
|
31
|
+
only: (name: string, fn: TestFn) => void;
|
|
32
|
+
skip: (name: string, fn: TestFn) => void;
|
|
33
|
+
describe: (name: string, fn: () => void) => void;
|
|
34
|
+
beforeAll: (fn: HookFn) => void;
|
|
35
|
+
afterAll: (fn: HookFn) => void;
|
|
36
|
+
beforeEach: (fn: HookFn) => void;
|
|
37
|
+
afterEach: (fn: HookFn) => void;
|
|
38
|
+
extend: /*elided*/ any;
|
|
39
|
+
};
|
|
40
|
+
var afterEach: (fn: HookFn) => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run all registered tests and return formatted results.
|
|
44
|
+
* Called after the test file has been evaluated (all test/describe calls done).
|
|
45
|
+
*/
|
|
46
|
+
declare function __runTests(): Promise<string>;
|
|
47
|
+
declare function expect(target: unknown): unknown;
|
|
48
|
+
export { test, expect, __runTests };
|
|
49
|
+
//# sourceMappingURL=test-runner-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-runner-node.d.ts","sourceRoot":"","sources":["../../src/shim/test-runner-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,KAAK,MAAM,GAAG,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAChG,KAAK,MAAM,GAAG,CAAC,QAAQ,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AA4ChG,iBAAS,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAErC;kBAFQ,IAAI;qBAIM,MAAM,MAAM,MAAM;qBAKlB,MAAM,MAAM,MAAM;yBAId,MAAM,MAAM,MAAM,IAAI;wBAqBvB,MAAM;uBACP,MAAM;yBACJ,MAAM;2BAIJ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;eACd,MAAM,MAAM,MAAM;qBArC7B,MAAM,MAAM,MAAM;qBAKlB,MAAM,MAAM,MAAM;yBAId,MAAM,MAAM,MAAM,IAAI;wBAqBvB,MAAM;uBACP,MAAM;yBACJ,MAAM;wBA0CP,MAAM;;;wBAAN,MAAM;;AA0F5B;;;GAGG;AACH,iBAAe,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAG3C;AASD,iBAAS,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAIxC;AAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC"}
|