@playwright-repl/core 0.7.10
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/dist/colors.d.ts +6 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +17 -0
- package/dist/colors.js.map +1 -0
- package/dist/completion-data.d.ts +18 -0
- package/dist/completion-data.d.ts.map +1 -0
- package/dist/completion-data.js +53 -0
- package/dist/completion-data.js.map +1 -0
- package/dist/engine.d.ts +88 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +346 -0
- package/dist/engine.js.map +1 -0
- package/dist/extension-server.d.ts +25 -0
- package/dist/extension-server.d.ts.map +1 -0
- package/dist/extension-server.js +202 -0
- package/dist/extension-server.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/page-scripts.d.ts +36 -0
- package/dist/page-scripts.d.ts.map +1 -0
- package/dist/page-scripts.js +128 -0
- package/dist/page-scripts.js.map +1 -0
- package/dist/parser.d.ts +14 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +139 -0
- package/dist/parser.js.map +1 -0
- package/dist/resolve.d.ts +13 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +69 -0
- package/dist/resolve.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommandServer — HTTP server for the side panel extension.
|
|
3
|
+
*
|
|
4
|
+
* Endpoints:
|
|
5
|
+
* POST /run Panel commands → engine.run()
|
|
6
|
+
* GET /health Panel checks if server is running
|
|
7
|
+
*/
|
|
8
|
+
import { createServer } from 'node:http';
|
|
9
|
+
import { parseInput } from './parser.js';
|
|
10
|
+
import { replVersion } from './resolve.js';
|
|
11
|
+
import { buildRunCode, verifyText, verifyElement, verifyValue, verifyList, verifyTitle, verifyUrl, verifyNoText, verifyNoElement, actionByText, fillByText, selectByText, checkByText, uncheckByText, } from './page-scripts.js';
|
|
12
|
+
// ─── CommandServer ──────────────────────────────────────────────────────────
|
|
13
|
+
export class CommandServer {
|
|
14
|
+
_engine;
|
|
15
|
+
_server = null;
|
|
16
|
+
_port = null;
|
|
17
|
+
constructor(engine) {
|
|
18
|
+
this._engine = engine;
|
|
19
|
+
}
|
|
20
|
+
get port() { return this._port; }
|
|
21
|
+
async start(port = 6781) {
|
|
22
|
+
this._server = createServer((req, res) => this._handleHttp(req, res));
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
this._server.listen(port, () => {
|
|
25
|
+
this._port = this._server.address().port;
|
|
26
|
+
resolve();
|
|
27
|
+
});
|
|
28
|
+
this._server.on('error', reject);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async close() {
|
|
32
|
+
if (this._server) {
|
|
33
|
+
await new Promise((resolve) => this._server.close(() => resolve()));
|
|
34
|
+
this._server = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ─── HTTP handler ───────────────────────────────────────────────────────
|
|
38
|
+
async _handleHttp(req, res) {
|
|
39
|
+
// CORS — allow chrome-extension:// origins
|
|
40
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
41
|
+
res.setHeader('Access-Control-Allow-Methods', 'POST, GET');
|
|
42
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
43
|
+
if (req.method === 'OPTIONS') {
|
|
44
|
+
res.writeHead(204);
|
|
45
|
+
res.end();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const urlPath = (req.url || '').replace(/\/+$/, '');
|
|
49
|
+
// Health check endpoint
|
|
50
|
+
if (req.method === 'GET' && urlPath === '/health') {
|
|
51
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
52
|
+
res.end(JSON.stringify({ status: 'ok', version: replVersion }));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Panel command endpoint
|
|
56
|
+
if (req.method === 'POST' && urlPath === '/run') {
|
|
57
|
+
try {
|
|
58
|
+
const body = await readBody(req);
|
|
59
|
+
const { raw, activeTabUrl } = JSON.parse(body);
|
|
60
|
+
console.log(`[server] ${raw} | ${activeTabUrl || 'no-url'}`);
|
|
61
|
+
// Auto-select the tab matching the panel's active tab.
|
|
62
|
+
if (activeTabUrl) {
|
|
63
|
+
await withTimeout(this._engine.selectPageByUrl(activeTabUrl), 5000).catch(() => { });
|
|
64
|
+
}
|
|
65
|
+
let args = parseInput(raw);
|
|
66
|
+
if (!args) {
|
|
67
|
+
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
68
|
+
res.end(JSON.stringify({ text: `Unknown command: ${raw}`, isError: true }));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
args = resolveArgs(args);
|
|
72
|
+
const result = await withTimeout(this._engine.run(args), 15000);
|
|
73
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
74
|
+
res.end(JSON.stringify(result));
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
78
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
79
|
+
res.end(JSON.stringify({ text: message, isError: true }));
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
res.writeHead(404);
|
|
84
|
+
res.end('Not found');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Apply the same transformations the CLI REPL does before engine.run():
|
|
89
|
+
* - Verify commands → run-code with page scripts
|
|
90
|
+
* - Text locators → run-code with actionByText/fillByText/etc.
|
|
91
|
+
* - Auto-wrap run-code body with async (page) => { ... }
|
|
92
|
+
*/
|
|
93
|
+
function resolveArgs(args) {
|
|
94
|
+
const cmdName = args._[0];
|
|
95
|
+
// ── Unified verify command → run-code translation ──────────
|
|
96
|
+
if (cmdName === 'verify') {
|
|
97
|
+
const subType = args._[1];
|
|
98
|
+
const rest = args._.slice(2);
|
|
99
|
+
let translated = null;
|
|
100
|
+
if (subType === 'title' && rest.length > 0)
|
|
101
|
+
translated = buildRunCode(verifyTitle, rest.join(' '));
|
|
102
|
+
else if (subType === 'url' && rest.length > 0)
|
|
103
|
+
translated = buildRunCode(verifyUrl, rest.join(' '));
|
|
104
|
+
else if (subType === 'text' && rest.length > 0)
|
|
105
|
+
translated = buildRunCode(verifyText, rest.join(' '));
|
|
106
|
+
else if (subType === 'no-text' && rest.length > 0)
|
|
107
|
+
translated = buildRunCode(verifyNoText, rest.join(' '));
|
|
108
|
+
else if (subType === 'element' && rest.length >= 2)
|
|
109
|
+
translated = buildRunCode(verifyElement, rest[0], rest.slice(1).join(' '));
|
|
110
|
+
else if (subType === 'no-element' && rest.length >= 2)
|
|
111
|
+
translated = buildRunCode(verifyNoElement, rest[0], rest.slice(1).join(' '));
|
|
112
|
+
else if (subType === 'value' && rest.length >= 2)
|
|
113
|
+
translated = buildRunCode(verifyValue, rest[0], rest.slice(1).join(' '));
|
|
114
|
+
else if (subType === 'list' && rest.length >= 2)
|
|
115
|
+
translated = buildRunCode(verifyList, rest[0], rest.slice(1));
|
|
116
|
+
if (translated)
|
|
117
|
+
args = translated;
|
|
118
|
+
}
|
|
119
|
+
// ── Legacy verify-* commands (backward compat) ─────────────
|
|
120
|
+
const verifyFns = {
|
|
121
|
+
'verify-text': verifyText,
|
|
122
|
+
'verify-element': verifyElement,
|
|
123
|
+
'verify-value': verifyValue,
|
|
124
|
+
'verify-list': verifyList,
|
|
125
|
+
'verify-title': verifyTitle,
|
|
126
|
+
'verify-url': verifyUrl,
|
|
127
|
+
'verify-no-text': verifyNoText,
|
|
128
|
+
'verify-no-element': verifyNoElement,
|
|
129
|
+
};
|
|
130
|
+
if (verifyFns[cmdName]) {
|
|
131
|
+
const pos = args._.slice(1);
|
|
132
|
+
const fn = verifyFns[cmdName];
|
|
133
|
+
let translated = null;
|
|
134
|
+
if (cmdName === 'verify-text' || cmdName === 'verify-no-text' || cmdName === 'verify-title' || cmdName === 'verify-url') {
|
|
135
|
+
const text = pos.join(' ');
|
|
136
|
+
if (text)
|
|
137
|
+
translated = buildRunCode(fn, text);
|
|
138
|
+
}
|
|
139
|
+
else if (cmdName === 'verify-no-element' || cmdName === 'verify-element') {
|
|
140
|
+
if (pos[0] && pos.length >= 2)
|
|
141
|
+
translated = buildRunCode(fn, pos[0], pos.slice(1).join(' '));
|
|
142
|
+
}
|
|
143
|
+
else if (pos[0] && pos.length >= 2) {
|
|
144
|
+
const rest = cmdName === 'verify-list' ? pos.slice(1) : pos.slice(1).join(' ');
|
|
145
|
+
translated = buildRunCode(fn, pos[0], rest);
|
|
146
|
+
}
|
|
147
|
+
if (translated)
|
|
148
|
+
args = translated;
|
|
149
|
+
}
|
|
150
|
+
// ── Auto-resolve text to native Playwright locator ─────────
|
|
151
|
+
const textFns = {
|
|
152
|
+
click: actionByText, dblclick: actionByText, hover: actionByText,
|
|
153
|
+
fill: fillByText, select: selectByText, check: checkByText, uncheck: uncheckByText,
|
|
154
|
+
};
|
|
155
|
+
if (textFns[cmdName] && args._[1] && !/^e\d+$/.test(args._[1]) && !args._.some(a => a.includes('>>'))) {
|
|
156
|
+
const textArg = args._[1];
|
|
157
|
+
const extraArgs = args._.slice(2);
|
|
158
|
+
const fn = textFns[cmdName];
|
|
159
|
+
const nth = args.nth !== undefined ? parseInt(String(args.nth), 10) : undefined;
|
|
160
|
+
if (fn === actionByText)
|
|
161
|
+
args = buildRunCode(fn, textArg, cmdName, nth);
|
|
162
|
+
else if (cmdName === 'fill' || cmdName === 'select')
|
|
163
|
+
args = buildRunCode(fn, textArg, extraArgs[0] || '', nth);
|
|
164
|
+
else
|
|
165
|
+
args = buildRunCode(fn, textArg, nth);
|
|
166
|
+
}
|
|
167
|
+
// ── go-back / go-forward → evaluate history.back/forward ──
|
|
168
|
+
if (cmdName === 'go-back') {
|
|
169
|
+
args = { _: ['run-code', 'async (page) => { await page.evaluate(() => history.back()); return "Navigated back"; }'] };
|
|
170
|
+
}
|
|
171
|
+
if (cmdName === 'go-forward') {
|
|
172
|
+
args = { _: ['run-code', 'async (page) => { await page.evaluate(() => history.forward()); return "Navigated forward"; }'] };
|
|
173
|
+
}
|
|
174
|
+
// ── Auto-wrap run-code body with async (page) => { ... } ──
|
|
175
|
+
if (cmdName === 'run-code' && args._[1] && !args._[1].startsWith('async')) {
|
|
176
|
+
const STMT = /^(await|return|const|let|var|for|if|while|throw|try)\b/;
|
|
177
|
+
const body = !args._[1].includes(';') && !STMT.test(args._[1])
|
|
178
|
+
? `return await ${args._[1]}`
|
|
179
|
+
: args._[1];
|
|
180
|
+
args = { _: ['run-code', `async (page) => { ${body} }`] };
|
|
181
|
+
}
|
|
182
|
+
return args;
|
|
183
|
+
}
|
|
184
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
185
|
+
function readBody(req) {
|
|
186
|
+
return new Promise((resolve, reject) => {
|
|
187
|
+
let data = '';
|
|
188
|
+
req.on('data', (chunk) => data += chunk);
|
|
189
|
+
req.on('end', () => resolve(data));
|
|
190
|
+
req.on('error', reject);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function withTimeout(promise, ms) {
|
|
194
|
+
let timer;
|
|
195
|
+
return Promise.race([
|
|
196
|
+
promise,
|
|
197
|
+
new Promise((_, reject) => {
|
|
198
|
+
timer = setTimeout(() => reject(new Error(`Command timed out after ${ms / 1000}s`)), ms);
|
|
199
|
+
}),
|
|
200
|
+
]).finally(() => clearTimeout(timer));
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=extension-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-server.js","sourceRoot":"","sources":["../src/extension-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @playwright-repl/core — shared engine, parser, and utilities.
|
|
3
|
+
*/
|
|
4
|
+
export { minimist, replVersion, COMMANDS } from './resolve.js';
|
|
5
|
+
export { parseInput, ALIASES, ALL_COMMANDS, booleanOptions } from './parser.js';
|
|
6
|
+
export { buildCompletionItems } from './completion-data.js';
|
|
7
|
+
export { c } from './colors.js';
|
|
8
|
+
export { buildRunCode, verifyText, verifyElement, verifyValue, verifyList, verifyTitle, verifyUrl, verifyNoText, verifyNoElement, actionByText, fillByText, selectByText, checkByText, uncheckByText, } from './page-scripts.js';
|
|
9
|
+
export { Engine } from './engine.js';
|
|
10
|
+
export type { EngineOpts, EngineResult, ParsedArgs } from './engine.js';
|
|
11
|
+
export { CommandServer } from './extension-server.js';
|
|
12
|
+
export type { CompletionItem } from './completion-data.js';
|
|
13
|
+
export type { CommandInfo } from './resolve.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAChC,OAAO,EACL,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAChE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EACrD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,GACnE,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @playwright-repl/core — shared engine, parser, and utilities.
|
|
3
|
+
*/
|
|
4
|
+
export { minimist, replVersion, COMMANDS } from './resolve.js';
|
|
5
|
+
export { parseInput, ALIASES, ALL_COMMANDS, booleanOptions } from './parser.js';
|
|
6
|
+
export { buildCompletionItems } from './completion-data.js';
|
|
7
|
+
export { c } from './colors.js';
|
|
8
|
+
export { buildRunCode, verifyText, verifyElement, verifyValue, verifyList, verifyTitle, verifyUrl, verifyNoText, verifyNoElement, actionByText, fillByText, selectByText, checkByText, uncheckByText, } from './page-scripts.js';
|
|
9
|
+
export { Engine } from './engine.js';
|
|
10
|
+
export { CommandServer } from './extension-server.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAChC,OAAO,EACL,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAChE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EACrD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,GACnE,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page-context functions for run-code commands.
|
|
3
|
+
*
|
|
4
|
+
* Each function is a real, testable async function that takes (page, ...args).
|
|
5
|
+
* buildRunCode() converts them to code strings via Function.toString(),
|
|
6
|
+
* following the same pattern as playwright-repl-extension/lib/page-scripts.js.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: This file must remain plain JavaScript — NOT TypeScript.
|
|
9
|
+
* These functions are stringified via fn.toString() and sent to Playwright's
|
|
10
|
+
* browser_run_code tool for evaluation. TypeScript annotations would break
|
|
11
|
+
* the stringified output.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Wraps a function into a run-code args object.
|
|
15
|
+
* Uses fn.toString() + JSON.stringify() — no manual escaping needed.
|
|
16
|
+
*
|
|
17
|
+
* The daemon's browser_run_code calls: `await (code)(page)`
|
|
18
|
+
* So `code` must be a function expression, not an IIFE.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildRunCode(fn: any, ...args: any[]): {
|
|
21
|
+
_: string[];
|
|
22
|
+
};
|
|
23
|
+
export declare function verifyText(page: any, text: any): Promise<void>;
|
|
24
|
+
export declare function verifyElement(page: any, role: any, name: any): Promise<void>;
|
|
25
|
+
export declare function verifyValue(page: any, ref: any, expected: any): Promise<void>;
|
|
26
|
+
export declare function verifyList(page: any, ref: any, items: any): Promise<void>;
|
|
27
|
+
export declare function verifyTitle(page: any, text: any): Promise<void>;
|
|
28
|
+
export declare function verifyUrl(page: any, text: any): Promise<void>;
|
|
29
|
+
export declare function verifyNoText(page: any, text: any): Promise<void>;
|
|
30
|
+
export declare function verifyNoElement(page: any, role: any, name: any): Promise<void>;
|
|
31
|
+
export declare function actionByText(page: any, text: any, action: any, nth: any): Promise<void>;
|
|
32
|
+
export declare function fillByText(page: any, text: any, value: any, nth: any): Promise<void>;
|
|
33
|
+
export declare function selectByText(page: any, text: any, value: any, nth: any): Promise<void>;
|
|
34
|
+
export declare function checkByText(page: any, text: any, nth: any): Promise<void>;
|
|
35
|
+
export declare function uncheckByText(page: any, text: any, nth: any): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=page-scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-scripts.d.ts","sourceRoot":"","sources":["../src/page-scripts.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAIH;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAA,EAAE,GAAG,IAAI,OAAA;;EAIvC;AAID,wBAAsB,UAAU,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,iBAG1C;AAED,wBAAsB,aAAa,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,IAAI,KAAA,iBAGnD;AAED,wBAAsB,WAAW,CAAC,IAAI,KAAA,EAAE,GAAG,KAAA,EAAE,QAAQ,KAAA,iBAKpD;AAED,wBAAsB,UAAU,CAAC,IAAI,KAAA,EAAE,GAAG,KAAA,EAAE,KAAK,KAAA,iBAMhD;AAED,wBAAsB,WAAW,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,iBAI3C;AAED,wBAAsB,SAAS,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,iBAIzC;AAED,wBAAsB,YAAY,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,iBAG5C;AAED,wBAAsB,eAAe,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,IAAI,KAAA,iBAGrD;AAID,wBAAsB,YAAY,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,MAAM,KAAA,EAAE,GAAG,KAAA,iBAOzD;AAED,wBAAsB,UAAU,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,KAAK,KAAA,EAAE,GAAG,KAAA,iBAMtD;AAED,wBAAsB,YAAY,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,KAAK,KAAA,EAAE,GAAG,KAAA,iBAKxD;AAED,wBAAsB,WAAW,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,GAAG,KAAA,iBAWhD;AAED,wBAAsB,aAAa,CAAC,IAAI,KAAA,EAAE,IAAI,KAAA,EAAE,GAAG,KAAA,iBAWlD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// @ts-nocheck — This file is intentionally untyped JavaScript.
|
|
2
|
+
// Functions here are stringified via fn.toString() and sent to Playwright's
|
|
3
|
+
// browser_run_code tool. Type annotations would appear in the stringified output.
|
|
4
|
+
/**
|
|
5
|
+
* Page-context functions for run-code commands.
|
|
6
|
+
*
|
|
7
|
+
* Each function is a real, testable async function that takes (page, ...args).
|
|
8
|
+
* buildRunCode() converts them to code strings via Function.toString(),
|
|
9
|
+
* following the same pattern as playwright-repl-extension/lib/page-scripts.js.
|
|
10
|
+
*
|
|
11
|
+
* IMPORTANT: This file must remain plain JavaScript — NOT TypeScript.
|
|
12
|
+
* These functions are stringified via fn.toString() and sent to Playwright's
|
|
13
|
+
* browser_run_code tool for evaluation. TypeScript annotations would break
|
|
14
|
+
* the stringified output.
|
|
15
|
+
*/
|
|
16
|
+
// ─── Helper ─────────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Wraps a function into a run-code args object.
|
|
19
|
+
* Uses fn.toString() + JSON.stringify() — no manual escaping needed.
|
|
20
|
+
*
|
|
21
|
+
* The daemon's browser_run_code calls: `await (code)(page)`
|
|
22
|
+
* So `code` must be a function expression, not an IIFE.
|
|
23
|
+
*/
|
|
24
|
+
export function buildRunCode(fn, ...args) {
|
|
25
|
+
const filtered = args.filter(a => a !== undefined);
|
|
26
|
+
const serialized = filtered.map(a => JSON.stringify(a)).join(', ');
|
|
27
|
+
return { _: ['run-code', `async (page) => (${fn.toString()})(page, ${serialized})`] };
|
|
28
|
+
}
|
|
29
|
+
// ─── Verify functions ───────────────────────────────────────────────────────
|
|
30
|
+
export async function verifyText(page, text) {
|
|
31
|
+
if (await page.getByText(text).filter({ visible: true }).count() === 0)
|
|
32
|
+
throw new Error('Text not found: ' + text);
|
|
33
|
+
}
|
|
34
|
+
export async function verifyElement(page, role, name) {
|
|
35
|
+
if (await page.getByRole(role, { name }).count() === 0)
|
|
36
|
+
throw new Error('Element not found: ' + role + ' "' + name + '"');
|
|
37
|
+
}
|
|
38
|
+
export async function verifyValue(page, ref, expected) {
|
|
39
|
+
const el = page.locator('[aria-ref="' + ref + '"]');
|
|
40
|
+
const v = await el.inputValue();
|
|
41
|
+
if (v !== expected)
|
|
42
|
+
throw new Error('Expected "' + expected + '", got "' + v + '"');
|
|
43
|
+
}
|
|
44
|
+
export async function verifyList(page, ref, items) {
|
|
45
|
+
const loc = page.locator('[aria-ref="' + ref + '"]');
|
|
46
|
+
for (const item of items) {
|
|
47
|
+
if (await loc.getByText(item).count() === 0)
|
|
48
|
+
throw new Error('Item not found: ' + item);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function verifyTitle(page, text) {
|
|
52
|
+
const title = await page.title();
|
|
53
|
+
if (!title.includes(text))
|
|
54
|
+
throw new Error('Title "' + title + '" does not contain "' + text + '"');
|
|
55
|
+
}
|
|
56
|
+
export async function verifyUrl(page, text) {
|
|
57
|
+
const url = page.url();
|
|
58
|
+
if (!url.includes(text))
|
|
59
|
+
throw new Error('URL "' + url + '" does not contain "' + text + '"');
|
|
60
|
+
}
|
|
61
|
+
export async function verifyNoText(page, text) {
|
|
62
|
+
if (await page.getByText(text).filter({ visible: true }).count() > 0)
|
|
63
|
+
throw new Error('Text still visible: ' + text);
|
|
64
|
+
}
|
|
65
|
+
export async function verifyNoElement(page, role, name) {
|
|
66
|
+
if (await page.getByRole(role, { name }).count() > 0)
|
|
67
|
+
throw new Error('Element still exists: ' + role + ' "' + name + '"');
|
|
68
|
+
}
|
|
69
|
+
// ─── Text locator actions ───────────────────────────────────────────────────
|
|
70
|
+
export async function actionByText(page, text, action, nth) {
|
|
71
|
+
let loc = page.getByText(text, { exact: true });
|
|
72
|
+
if (await loc.count() === 0)
|
|
73
|
+
loc = page.getByRole('button', { name: text });
|
|
74
|
+
if (await loc.count() === 0)
|
|
75
|
+
loc = page.getByRole('link', { name: text });
|
|
76
|
+
if (await loc.count() === 0)
|
|
77
|
+
loc = page.getByText(text);
|
|
78
|
+
if (nth !== undefined)
|
|
79
|
+
loc = loc.filter({ visible: true }).nth(nth);
|
|
80
|
+
await loc[action]();
|
|
81
|
+
}
|
|
82
|
+
export async function fillByText(page, text, value, nth) {
|
|
83
|
+
let loc = page.getByLabel(text);
|
|
84
|
+
if (await loc.count() === 0)
|
|
85
|
+
loc = page.getByPlaceholder(text);
|
|
86
|
+
if (await loc.count() === 0)
|
|
87
|
+
loc = page.getByRole('textbox', { name: text });
|
|
88
|
+
if (nth !== undefined)
|
|
89
|
+
loc = loc.filter({ visible: true }).nth(nth);
|
|
90
|
+
await loc.fill(value);
|
|
91
|
+
}
|
|
92
|
+
export async function selectByText(page, text, value, nth) {
|
|
93
|
+
let loc = page.getByLabel(text);
|
|
94
|
+
if (await loc.count() === 0)
|
|
95
|
+
loc = page.getByRole('combobox', { name: text });
|
|
96
|
+
if (nth !== undefined)
|
|
97
|
+
loc = loc.filter({ visible: true }).nth(nth);
|
|
98
|
+
await loc.selectOption(value);
|
|
99
|
+
}
|
|
100
|
+
export async function checkByText(page, text, nth) {
|
|
101
|
+
const item = page.getByRole('listitem').filter({ hasText: text });
|
|
102
|
+
if (await item.count() > 0) {
|
|
103
|
+
const target = nth !== undefined ? item.filter({ visible: true }).nth(nth) : item;
|
|
104
|
+
await target.getByRole('checkbox').check();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
let loc = page.getByLabel(text);
|
|
108
|
+
if (await loc.count() === 0)
|
|
109
|
+
loc = page.getByRole('checkbox', { name: text });
|
|
110
|
+
if (nth !== undefined)
|
|
111
|
+
loc = loc.filter({ visible: true }).nth(nth);
|
|
112
|
+
await loc.check();
|
|
113
|
+
}
|
|
114
|
+
export async function uncheckByText(page, text, nth) {
|
|
115
|
+
const item = page.getByRole('listitem').filter({ hasText: text });
|
|
116
|
+
if (await item.count() > 0) {
|
|
117
|
+
const target = nth !== undefined ? item.filter({ visible: true }).nth(nth) : item;
|
|
118
|
+
await target.getByRole('checkbox').uncheck();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
let loc = page.getByLabel(text);
|
|
122
|
+
if (await loc.count() === 0)
|
|
123
|
+
loc = page.getByRole('checkbox', { name: text });
|
|
124
|
+
if (nth !== undefined)
|
|
125
|
+
loc = loc.filter({ visible: true }).nth(nth);
|
|
126
|
+
await loc.uncheck();
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=page-scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-scripts.js","sourceRoot":"","sources":["../src/page-scripts.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,4EAA4E;AAC5E,kFAAkF;AAElF;;;;;;;;;;;GAWG;AAEH,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,EAAE,GAAG,IAAI;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC,QAAQ,EAAE,WAAW,UAAU,GAAG,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,IAAI;IACzC,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI;IAClD,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ;IACnD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,QAAQ;QAChB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAI,EAAE,IAAI;IAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,GAAG,sBAAsB,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAI,EAAE,IAAI;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,sBAAsB,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,EAAE,IAAI;IAC3C,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI;IACpD,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AACzE,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG;IACxD,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,GAAG,KAAK,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG;IACrD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,GAAG,KAAK,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG;IACvD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,IAAI,GAAG,KAAK,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClF,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,IAAI,GAAG,KAAK,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClF,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,IAAI,GAAG,KAAK,SAAS;QAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input parser — transforms human input into minimist-style args.
|
|
3
|
+
*
|
|
4
|
+
* Flow: "c e5" → alias resolve → ["click", "e5"] → minimist → { _: ["click", "e5"] }
|
|
5
|
+
*
|
|
6
|
+
* The resulting object is sent to the daemon as-is. The daemon runs
|
|
7
|
+
* parseCliCommand() which maps it to a tool call.
|
|
8
|
+
*/
|
|
9
|
+
import type { ParsedArgs } from './engine.js';
|
|
10
|
+
export declare const ALIASES: Record<string, string>;
|
|
11
|
+
export declare const booleanOptions: Set<string>;
|
|
12
|
+
export declare const ALL_COMMANDS: string[];
|
|
13
|
+
export declare function parseInput(line: string): ParsedArgs | null;
|
|
14
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6C1C,CAAC;AAIF,eAAO,MAAM,cAAc,aAGzB,CAAC;AAIH,eAAO,MAAM,YAAY,EAAE,MAAM,EAA0B,CAAC;AA6C5D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAsC1D"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input parser — transforms human input into minimist-style args.
|
|
3
|
+
*
|
|
4
|
+
* Flow: "c e5" → alias resolve → ["click", "e5"] → minimist → { _: ["click", "e5"] }
|
|
5
|
+
*
|
|
6
|
+
* The resulting object is sent to the daemon as-is. The daemon runs
|
|
7
|
+
* parseCliCommand() which maps it to a tool call.
|
|
8
|
+
*/
|
|
9
|
+
import { minimist, COMMANDS } from './resolve.js';
|
|
10
|
+
// ─── Command aliases ─────────────────────────────────────────────────────────
|
|
11
|
+
export const ALIASES = {
|
|
12
|
+
// Navigation
|
|
13
|
+
'o': 'open',
|
|
14
|
+
'g': 'goto',
|
|
15
|
+
'go': 'goto',
|
|
16
|
+
'back': 'go-back',
|
|
17
|
+
'fwd': 'go-forward',
|
|
18
|
+
'r': 'reload',
|
|
19
|
+
// Interaction
|
|
20
|
+
'c': 'click',
|
|
21
|
+
'dc': 'dblclick',
|
|
22
|
+
't': 'type',
|
|
23
|
+
'f': 'fill',
|
|
24
|
+
'h': 'hover',
|
|
25
|
+
'p': 'press',
|
|
26
|
+
'sel': 'select',
|
|
27
|
+
'chk': 'check',
|
|
28
|
+
'unchk': 'uncheck',
|
|
29
|
+
// Inspection
|
|
30
|
+
'hl': 'highlight',
|
|
31
|
+
's': 'snapshot',
|
|
32
|
+
'snap': 'snapshot',
|
|
33
|
+
'ss': 'screenshot',
|
|
34
|
+
'e': 'eval',
|
|
35
|
+
'con': 'console',
|
|
36
|
+
'net': 'network',
|
|
37
|
+
// Tabs
|
|
38
|
+
'tl': 'tab-list',
|
|
39
|
+
'tn': 'tab-new',
|
|
40
|
+
'tc': 'tab-close',
|
|
41
|
+
'ts': 'tab-select',
|
|
42
|
+
// Assertions
|
|
43
|
+
'v': 'verify',
|
|
44
|
+
'vt': 'verify-text',
|
|
45
|
+
've': 'verify-element',
|
|
46
|
+
'vv': 'verify-value',
|
|
47
|
+
'vl': 'verify-list',
|
|
48
|
+
// Session
|
|
49
|
+
'q': 'close',
|
|
50
|
+
'ls': 'list',
|
|
51
|
+
};
|
|
52
|
+
// ─── Known boolean options ───────────────────────────────────────────────────
|
|
53
|
+
export const booleanOptions = new Set([
|
|
54
|
+
'headed', 'persistent', 'extension', 'submit', 'clear',
|
|
55
|
+
'fullPage', 'includeStatic',
|
|
56
|
+
]);
|
|
57
|
+
// ─── All known commands ──────────────────────────────────────────────────────
|
|
58
|
+
export const ALL_COMMANDS = Object.keys(COMMANDS);
|
|
59
|
+
// ─── Tokenizer ───────────────────────────────────────────────────────────────
|
|
60
|
+
/**
|
|
61
|
+
* Tokenize input respecting quoted strings.
|
|
62
|
+
* "fill e7 'hello world'" → ["fill", "e7", "hello world"]
|
|
63
|
+
*/
|
|
64
|
+
function tokenize(line) {
|
|
65
|
+
const tokens = [];
|
|
66
|
+
let current = '';
|
|
67
|
+
let inQuote = null;
|
|
68
|
+
for (let i = 0; i < line.length; i++) {
|
|
69
|
+
const ch = line[i];
|
|
70
|
+
if (inQuote) {
|
|
71
|
+
if (ch === inQuote) {
|
|
72
|
+
inQuote = null;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
current += ch;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (ch === '"' || ch === "'") {
|
|
79
|
+
inQuote = ch;
|
|
80
|
+
}
|
|
81
|
+
else if (ch === ' ' || ch === '\t') {
|
|
82
|
+
if (current) {
|
|
83
|
+
tokens.push(current);
|
|
84
|
+
current = '';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
current += ch;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (current)
|
|
92
|
+
tokens.push(current);
|
|
93
|
+
return tokens;
|
|
94
|
+
}
|
|
95
|
+
// ─── Main parse function ─────────────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* Parse a REPL input line into a minimist args object ready for the daemon.
|
|
98
|
+
* Returns null if the line is empty.
|
|
99
|
+
*/
|
|
100
|
+
// Commands where everything after the keyword is a single raw argument
|
|
101
|
+
const RAW_COMMANDS = new Set(['run-code', 'eval']);
|
|
102
|
+
export function parseInput(line) {
|
|
103
|
+
const tokens = tokenize(line);
|
|
104
|
+
if (tokens.length === 0)
|
|
105
|
+
return null;
|
|
106
|
+
// Resolve alias
|
|
107
|
+
const cmd = tokens[0].toLowerCase();
|
|
108
|
+
if (ALIASES[cmd])
|
|
109
|
+
tokens[0] = ALIASES[cmd];
|
|
110
|
+
// For run-code / eval, preserve the rest of the line as a single raw string
|
|
111
|
+
if (RAW_COMMANDS.has(tokens[0])) {
|
|
112
|
+
const cmdLen = line.match(/^\s*\S+/)[0].length;
|
|
113
|
+
const rest = line.slice(cmdLen).trim();
|
|
114
|
+
return rest ? { _: [tokens[0], rest] } : { _: [tokens[0]] };
|
|
115
|
+
}
|
|
116
|
+
// Parse with minimist (same lib and boolean set as playwright-cli)
|
|
117
|
+
const args = minimist(tokens, { boolean: [...booleanOptions] });
|
|
118
|
+
// Stringify non-boolean values (playwright-cli does this)
|
|
119
|
+
for (const key of Object.keys(args)) {
|
|
120
|
+
if (key === '_')
|
|
121
|
+
continue;
|
|
122
|
+
if (typeof args[key] !== 'boolean')
|
|
123
|
+
args[key] = String(args[key]);
|
|
124
|
+
}
|
|
125
|
+
for (let i = 0; i < args._.length; i++)
|
|
126
|
+
args._[i] = String(args._[i]);
|
|
127
|
+
// Remove boolean options set to false that weren't explicitly passed.
|
|
128
|
+
// minimist sets all declared booleans to false by default, but the
|
|
129
|
+
// daemon rejects unknown options like --headed false.
|
|
130
|
+
for (const opt of booleanOptions) {
|
|
131
|
+
if (args[opt] === false) {
|
|
132
|
+
const hasExplicitNo = tokens.some(t => t === `--no-${opt}`);
|
|
133
|
+
if (!hasExplicitNo)
|
|
134
|
+
delete args[opt];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return args;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared dependencies and command vocabulary.
|
|
3
|
+
*/
|
|
4
|
+
export declare const minimist: (args: string[], opts?: Record<string, unknown>) => Record<string, unknown> & {
|
|
5
|
+
_: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare const replVersion: string;
|
|
8
|
+
export interface CommandInfo {
|
|
9
|
+
desc: string;
|
|
10
|
+
options: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare const COMMANDS: Record<string, CommandInfo>;
|
|
13
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,eAAO,MAAM,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,CAAC,EAAE,MAAM,EAAE,CAAA;CAAwB,CAAC;AAG3I,eAAO,MAAM,WAAW,EAAE,MAAkD,CAAC;AAI7E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyDhD,CAAC"}
|