cdp-mcp 0.2.1 → 0.4.0

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 (96) hide show
  1. package/README.md +28 -303
  2. package/bin.js +23 -0
  3. package/contract.d.ts +1 -0
  4. package/contract.js +2 -0
  5. package/index.d.ts +1 -0
  6. package/index.js +2 -0
  7. package/package.json +31 -73
  8. package/dist/contract.d.ts +0 -11
  9. package/dist/contract.js +0 -11
  10. package/dist/contract.js.map +0 -1
  11. package/dist/index.d.ts +0 -18
  12. package/dist/index.js +0 -402
  13. package/dist/index.js.map +0 -1
  14. package/dist/locator.d.ts +0 -108
  15. package/dist/locator.js +0 -176
  16. package/dist/locator.js.map +0 -1
  17. package/dist/server.d.ts +0 -2
  18. package/dist/server.js +0 -41
  19. package/dist/server.js.map +0 -1
  20. package/dist/session/browser.d.ts +0 -29
  21. package/dist/session/browser.js +0 -409
  22. package/dist/session/browser.js.map +0 -1
  23. package/dist/session/buffers.d.ts +0 -48
  24. package/dist/session/buffers.js +0 -43
  25. package/dist/session/buffers.js.map +0 -1
  26. package/dist/session/pause.d.ts +0 -21
  27. package/dist/session/pause.js +0 -99
  28. package/dist/session/pause.js.map +0 -1
  29. package/dist/session/state.d.ts +0 -53
  30. package/dist/session/state.js +0 -93
  31. package/dist/session/state.js.map +0 -1
  32. package/dist/sourcemap/loader.d.ts +0 -4
  33. package/dist/sourcemap/loader.js +0 -138
  34. package/dist/sourcemap/loader.js.map +0 -1
  35. package/dist/sourcemap/normalize.d.ts +0 -2
  36. package/dist/sourcemap/normalize.js +0 -59
  37. package/dist/sourcemap/normalize.js.map +0 -1
  38. package/dist/sourcemap/store.d.ts +0 -57
  39. package/dist/sourcemap/store.js +0 -185
  40. package/dist/sourcemap/store.js.map +0 -1
  41. package/dist/tools/_locator_runtime.d.ts +0 -31
  42. package/dist/tools/_locator_runtime.js +0 -243
  43. package/dist/tools/_locator_runtime.js.map +0 -1
  44. package/dist/tools/_register.d.ts +0 -2
  45. package/dist/tools/_register.js +0 -30
  46. package/dist/tools/_register.js.map +0 -1
  47. package/dist/tools/breakpoints.d.ts +0 -4
  48. package/dist/tools/breakpoints.js +0 -164
  49. package/dist/tools/breakpoints.js.map +0 -1
  50. package/dist/tools/console.d.ts +0 -2
  51. package/dist/tools/console.js +0 -48
  52. package/dist/tools/console.js.map +0 -1
  53. package/dist/tools/dom.d.ts +0 -2
  54. package/dist/tools/dom.js +0 -309
  55. package/dist/tools/dom.js.map +0 -1
  56. package/dist/tools/execution.d.ts +0 -29
  57. package/dist/tools/execution.js +0 -89
  58. package/dist/tools/execution.js.map +0 -1
  59. package/dist/tools/forms.d.ts +0 -8
  60. package/dist/tools/forms.js +0 -256
  61. package/dist/tools/forms.js.map +0 -1
  62. package/dist/tools/inspect.d.ts +0 -2
  63. package/dist/tools/inspect.js +0 -178
  64. package/dist/tools/inspect.js.map +0 -1
  65. package/dist/tools/nav.d.ts +0 -2
  66. package/dist/tools/nav.js +0 -136
  67. package/dist/tools/nav.js.map +0 -1
  68. package/dist/tools/network.d.ts +0 -2
  69. package/dist/tools/network.js +0 -137
  70. package/dist/tools/network.js.map +0 -1
  71. package/dist/tools/session.d.ts +0 -2
  72. package/dist/tools/session.js +0 -76
  73. package/dist/tools/session.js.map +0 -1
  74. package/dist/tools/source.d.ts +0 -2
  75. package/dist/tools/source.js +0 -63
  76. package/dist/tools/source.js.map +0 -1
  77. package/dist/tools/storage.d.ts +0 -2
  78. package/dist/tools/storage.js +0 -296
  79. package/dist/tools/storage.js.map +0 -1
  80. package/dist/util/browser-resolve.d.ts +0 -19
  81. package/dist/util/browser-resolve.js +0 -263
  82. package/dist/util/browser-resolve.js.map +0 -1
  83. package/dist/util/errors.d.ts +0 -7
  84. package/dist/util/errors.js +0 -12
  85. package/dist/util/errors.js.map +0 -1
  86. package/dist/util/format.d.ts +0 -20
  87. package/dist/util/format.js +0 -65
  88. package/dist/util/format.js.map +0 -1
  89. package/dist/util/log.d.ts +0 -6
  90. package/dist/util/log.js +0 -34
  91. package/dist/util/log.js.map +0 -1
  92. package/docs/chromium-sandboxing.md +0 -197
  93. package/docs/known-chromium-gaps.md +0 -138
  94. package/docs/launchd-service.md +0 -217
  95. package/docs/local-l3-e2e-setup.md +0 -199
  96. package/docs/systemd-service.md +0 -233
package/dist/index.js DELETED
@@ -1,402 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createServer } from "node:http";
3
- import { realpathSync } from "node:fs";
4
- import { pathToFileURL } from "node:url";
5
- import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
6
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
- import { buildServer } from "./server.js";
8
- import { getSession, sessionState } from "./session/state.js";
9
- import { log } from "./util/log.js";
10
- const LOOPBACK_HOSTS = new Set(["127.0.0.1", "localhost", "::1"]);
11
- function isLoopbackHost(host) {
12
- return LOOPBACK_HOSTS.has(host);
13
- }
14
- function parseArgs(args) {
15
- let port;
16
- let host = "127.0.0.1";
17
- let allowRemote = process.env.CDP_MCP_ALLOW_REMOTE === "1";
18
- for (let index = 0; index < args.length; index += 1) {
19
- const arg = args[index];
20
- if (!arg) {
21
- continue;
22
- }
23
- if (arg === "--help" || arg === "-h") {
24
- process.stderr.write([
25
- "Usage:",
26
- " cdp-mcp # stdio MCP transport",
27
- " cdp-mcp --port 9719 # SSE MCP transport on 127.0.0.1:9719",
28
- " cdp-mcp --host 0.0.0.0 --port 9719 --allow-remote",
29
- "",
30
- "SSE mode caveats:",
31
- " - Single-client only: concurrent /sse connections race on a",
32
- " shared browser session (sessionState is process-global).",
33
- " - Non-loopback bind requires --allow-remote (or",
34
- " CDP_MCP_ALLOW_REMOTE=1). MCP tools include in-page eval and",
35
- " server-filesystem writes; exposing them remotely without",
36
- " further auth is a deliberate operator decision.",
37
- " - Host / Origin headers are validated against the loopback",
38
- " aliases (127.0.0.1, localhost, [::1]) to block",
39
- " DNS-rebinding. On non-loopback binds the operator has",
40
- " accepted exposure via --allow-remote, and we cannot",
41
- " enumerate every reachable hostname/IP, so the checks",
42
- " are skipped — front the server with a reverse proxy if",
43
- " you need per-Host policy.",
44
- "",
45
- ].join("\n"));
46
- process.exit(0);
47
- }
48
- if (arg === "--port") {
49
- const value = args[index + 1];
50
- if (!value)
51
- throw new Error("--port requires a value");
52
- port = parsePort(value);
53
- index += 1;
54
- continue;
55
- }
56
- if (arg.startsWith("--port=")) {
57
- port = parsePort(arg.slice("--port=".length));
58
- continue;
59
- }
60
- if (arg === "--host") {
61
- const value = args[index + 1];
62
- if (!value)
63
- throw new Error("--host requires a value");
64
- host = value;
65
- index += 1;
66
- continue;
67
- }
68
- if (arg.startsWith("--host=")) {
69
- host = arg.slice("--host=".length);
70
- continue;
71
- }
72
- if (arg === "--allow-remote") {
73
- allowRemote = true;
74
- continue;
75
- }
76
- throw new Error(`Unknown argument: ${arg}`);
77
- }
78
- if (port === undefined) {
79
- return { transport: "stdio" };
80
- }
81
- if (!isLoopbackHost(host) && !allowRemote) {
82
- throw new Error(`Refusing to bind SSE transport on non-loopback host '${host}' without --allow-remote (or CDP_MCP_ALLOW_REMOTE=1). MCP tools include in-page eval and server-filesystem writes; remote exposure is opt-in.`);
83
- }
84
- return {
85
- transport: "sse",
86
- host,
87
- port,
88
- allowRemote,
89
- };
90
- }
91
- function parsePort(raw) {
92
- const port = Number(raw);
93
- if (!Number.isInteger(port) || port < 1 || port > 65535) {
94
- throw new Error(`Invalid --port value: ${raw}`);
95
- }
96
- return port;
97
- }
98
- const DEFAULT_SSE_KEEPALIVE_MS = 25_000;
99
- // SSE streams sit idle between tool calls, and HTTP clients enforce a
100
- // body-idle timeout (e.g. undici inside GitHub Copilot CLI tears the stream
101
- // down after ~12 min with "Body Timeout Error"). A periodic SSE comment frame
102
- // (`: ...\n\n`) is a no-op per the spec but resets that idle timer. Tunable via
103
- // CDP_MCP_SSE_KEEPALIVE_MS (non-negative integer ms; 0 disables). See issue #1.
104
- function getKeepaliveMs() {
105
- const raw = process.env.CDP_MCP_SSE_KEEPALIVE_MS;
106
- if (raw === undefined || raw === "")
107
- return DEFAULT_SSE_KEEPALIVE_MS;
108
- const value = Number(raw);
109
- if (!Number.isInteger(value) || value < 0) {
110
- log.warn("invalid CDP_MCP_SSE_KEEPALIVE_MS; using default", { value: raw, default: DEFAULT_SSE_KEEPALIVE_MS });
111
- return DEFAULT_SSE_KEEPALIVE_MS;
112
- }
113
- return value;
114
- }
115
- async function main() {
116
- const mode = parseArgs(process.argv.slice(2));
117
- if (mode.transport === "sse") {
118
- await runSseServer(mode);
119
- return;
120
- }
121
- await runStdioServer();
122
- }
123
- async function runStdioServer() {
124
- const server = buildServer();
125
- const transport = new StdioServerTransport();
126
- await server.connect(transport);
127
- log.info("cdp-mcp server started", { pid: process.pid });
128
- const shutdown = async (signal) => {
129
- log.info(`shutdown signal: ${signal}`);
130
- try {
131
- const session = getSession();
132
- if (session)
133
- await sessionState.close();
134
- }
135
- catch (e) {
136
- log.warn("error during shutdown", { error: String(e) });
137
- }
138
- try {
139
- await server.close();
140
- }
141
- catch (e) {
142
- log.warn("error closing server", { error: String(e) });
143
- }
144
- process.exit(0);
145
- };
146
- process.on("SIGINT", () => void shutdown("SIGINT"));
147
- process.on("SIGTERM", () => void shutdown("SIGTERM"));
148
- installProcessErrorHandlers();
149
- }
150
- async function runSseServer(mode) {
151
- const clients = new Map();
152
- // Host/Origin validation is a DNS-rebinding defense — it bites only
153
- // on loopback binds, where an attacker page can be tricked into
154
- // reaching 127.0.0.1 via a rebound DNS name. On non-loopback binds
155
- // the operator has explicitly accepted exposure via --allow-remote,
156
- // and we cannot statically enumerate every hostname/IP the host
157
- // might be reached by (LAN IP, hostname, mDNS, VPN, …) — so we skip
158
- // both checks and treat --allow-remote as the gate.
159
- const validateHostOrigin = isLoopbackHost(mode.host);
160
- const allowedHosts = validateHostOrigin ? buildAllowedHosts(mode.host, mode.port) : new Set();
161
- const allowedOrigins = validateHostOrigin ? buildAllowedOrigins(mode.host, mode.port) : new Set();
162
- const httpServer = createServer((req, res) => {
163
- void handleSseRequest({
164
- req,
165
- res,
166
- clients,
167
- host: mode.host,
168
- port: mode.port,
169
- validateHostOrigin,
170
- allowedHosts,
171
- allowedOrigins,
172
- });
173
- });
174
- await listen(httpServer, mode);
175
- log.info("cdp-mcp SSE server started", {
176
- pid: process.pid,
177
- url: `http://${mode.host}:${mode.port}/sse`,
178
- allowRemote: mode.allowRemote,
179
- });
180
- if (!isLoopbackHost(mode.host)) {
181
- log.warn("SSE bound to non-loopback host — exposing in-page eval + filesystem-write tools without auth (operator opted in via --allow-remote)", { host: mode.host, port: mode.port });
182
- }
183
- // Close SSE transports BEFORE the HTTP server: Node's server.close()
184
- // waits for in-flight requests to drain, and /sse connections are
185
- // long-lived by design — closing the HTTP server first would hang
186
- // SIGINT / SIGTERM indefinitely.
187
- const shutdown = async (signal) => {
188
- log.info(`shutdown signal: ${signal}`);
189
- await closeSseClients(clients);
190
- await closeHttpServer(httpServer);
191
- try {
192
- const session = getSession();
193
- if (session)
194
- await sessionState.close();
195
- }
196
- catch (e) {
197
- log.warn("error during shutdown", { error: String(e) });
198
- }
199
- process.exit(0);
200
- };
201
- process.on("SIGINT", () => void shutdown("SIGINT"));
202
- process.on("SIGTERM", () => void shutdown("SIGTERM"));
203
- installProcessErrorHandlers();
204
- }
205
- function installProcessErrorHandlers() {
206
- process.on("uncaughtException", (err) => {
207
- log.error("uncaughtException", { error: String(err), stack: err.stack });
208
- });
209
- process.on("unhandledRejection", (reason) => {
210
- log.error("unhandledRejection", { reason: String(reason) });
211
- });
212
- }
213
- export async function handleSseRequest({ req, res, clients, host, port, validateHostOrigin, allowedHosts, allowedOrigins, }) {
214
- try {
215
- // DNS-rebinding defense for loopback binds: validate Host (and
216
- // Origin if present) before the SDK touches the request. The MCP
217
- // SDK's SSEServerTransport does not gate either header by default.
218
- // Skipped on non-loopback binds — see runSseServer for rationale.
219
- if (validateHostOrigin) {
220
- const headerHost = req.headers.host;
221
- if (!headerHost || !allowedHosts.has(headerHost)) {
222
- log.warn("rejecting SSE request with disallowed Host header", {
223
- host: headerHost,
224
- bindHost: host,
225
- });
226
- respondText(res, 403, "forbidden\n");
227
- return;
228
- }
229
- // Origin is only sent by browsers (and is `null` for sandboxed
230
- // iframes / file://). Checking it when present is the
231
- // cross-origin defense layer; the Host check above is what
232
- // catches non-browser callers and Origin-omitting browsers.
233
- const originHeader = req.headers.origin;
234
- if (originHeader && !allowedOrigins.has(originHeader)) {
235
- log.warn("rejecting SSE request with disallowed Origin header", { origin: originHeader });
236
- respondText(res, 403, "forbidden\n");
237
- return;
238
- }
239
- }
240
- const url = new URL(req.url ?? "/", `http://${req.headers.host ?? `${host}:${port}`}`);
241
- if (req.method === "GET" && url.pathname === "/sse") {
242
- await startSseConnection({ res, clients });
243
- return;
244
- }
245
- if (req.method === "POST" && url.pathname === "/messages") {
246
- await handleSseMessage({ req, res, clients, sessionId: url.searchParams.get("sessionId") });
247
- return;
248
- }
249
- respondText(res, 404, "not found\n");
250
- }
251
- catch (e) {
252
- log.error("SSE request failed", { error: String(e) });
253
- if (!res.headersSent) {
254
- respondText(res, 500, "internal server error\n");
255
- }
256
- else {
257
- res.end();
258
- }
259
- }
260
- }
261
- // Called only on loopback binds (see runSseServer). The set covers the
262
- // three loopback aliases a browser or CLI might use to reach a 127.0.0.1
263
- // / localhost / ::1 server; anything else implies DNS-rebinding.
264
- function buildAllowedHosts(bindHost, port) {
265
- const hosts = new Set([
266
- `${bindHost}:${port}`,
267
- `127.0.0.1:${port}`,
268
- `localhost:${port}`,
269
- `[::1]:${port}`,
270
- ]);
271
- return hosts;
272
- }
273
- function buildAllowedOrigins(bindHost, port) {
274
- const origins = new Set();
275
- for (const hostPort of buildAllowedHosts(bindHost, port)) {
276
- origins.add(`http://${hostPort}`);
277
- origins.add(`https://${hostPort}`);
278
- }
279
- return origins;
280
- }
281
- async function startSseConnection({ res, clients, }) {
282
- const transport = new SSEServerTransport("/messages", res);
283
- const server = buildServer();
284
- // Assigned after connect() (below) so the keepalive never writes before the
285
- // SDK has sent the SSE response headers; cleared here on disconnect.
286
- let keepalive;
287
- transport.onclose = () => {
288
- if (keepalive)
289
- clearInterval(keepalive);
290
- const client = clients.get(transport.sessionId);
291
- clients.delete(transport.sessionId);
292
- void client?.server.close().catch((e) => {
293
- log.warn("error closing MCP server for SSE client", { sessionId: transport.sessionId, error: String(e) });
294
- });
295
- };
296
- transport.onerror = (e) => {
297
- log.warn("SSE transport error", { sessionId: transport.sessionId, error: String(e) });
298
- };
299
- clients.set(transport.sessionId, { server, transport });
300
- await server.connect(transport);
301
- // connect() has now written the SSE headers + endpoint event, so it's safe
302
- // to interleave keepalive comment frames on the stream.
303
- const keepaliveMs = getKeepaliveMs();
304
- if (keepaliveMs > 0) {
305
- keepalive = setInterval(() => {
306
- if (res.writableEnded)
307
- return;
308
- try {
309
- res.write(": keepalive\n\n");
310
- }
311
- catch (e) {
312
- log.warn("SSE keepalive write failed", { sessionId: transport.sessionId, error: String(e) });
313
- }
314
- }, keepaliveMs);
315
- // Don't let the keepalive timer alone keep the process alive.
316
- keepalive.unref();
317
- }
318
- log.info("SSE client connected", { sessionId: transport.sessionId });
319
- }
320
- async function handleSseMessage({ req, res, clients, sessionId, }) {
321
- if (!sessionId) {
322
- respondText(res, 400, "missing sessionId\n");
323
- return;
324
- }
325
- const client = clients.get(sessionId);
326
- if (!client) {
327
- respondText(res, 404, "unknown sessionId\n");
328
- return;
329
- }
330
- await client.transport.handlePostMessage(req, res);
331
- }
332
- async function listen(server, mode) {
333
- await new Promise((resolve, reject) => {
334
- const onError = (e) => {
335
- server.off("listening", onListening);
336
- reject(e);
337
- };
338
- const onListening = () => {
339
- server.off("error", onError);
340
- resolve();
341
- };
342
- server.once("error", onError);
343
- server.once("listening", onListening);
344
- server.listen(mode.port, mode.host);
345
- });
346
- }
347
- async function closeHttpServer(server) {
348
- await new Promise((resolve, reject) => {
349
- server.close((e) => {
350
- if (e) {
351
- reject(e);
352
- return;
353
- }
354
- resolve();
355
- });
356
- }).catch((e) => {
357
- log.warn("error closing HTTP server", { error: String(e) });
358
- });
359
- }
360
- async function closeSseClients(clients) {
361
- const entries = [...clients.entries()];
362
- clients.clear();
363
- await Promise.all(entries.map(async ([sessionId, client]) => {
364
- try {
365
- await client.transport.close();
366
- }
367
- catch (e) {
368
- log.warn("error closing SSE transport", { sessionId, error: String(e) });
369
- }
370
- try {
371
- await client.server.close();
372
- }
373
- catch (e) {
374
- log.warn("error closing MCP server", { sessionId, error: String(e) });
375
- }
376
- }));
377
- }
378
- function respondText(res, statusCode, body) {
379
- res.writeHead(statusCode, { "Content-Type": "text/plain; charset=utf-8" });
380
- res.end(body);
381
- }
382
- // Only run the server when executed as the CLI entry point — not when this
383
- // module is imported (e.g. by the SSE transport tests). `realpathSync`
384
- // resolves the npm bin symlink so the comparison holds for global installs.
385
- function isRunAsMain() {
386
- const entry = process.argv[1];
387
- if (!entry)
388
- return false;
389
- try {
390
- return import.meta.url === pathToFileURL(realpathSync(entry)).href;
391
- }
392
- catch {
393
- return false;
394
- }
395
- }
396
- if (isRunAsMain()) {
397
- main().catch((err) => {
398
- log.error("fatal", { error: String(err), stack: err?.stack });
399
- process.exit(1);
400
- });
401
- }
402
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/locator.d.ts DELETED
@@ -1,108 +0,0 @@
1
- /**
2
- * Canonical `LocatorSpec` contract for cdp-mcp.
3
- *
4
- * This module is the single source of truth for the structured element-locator
5
- * shape that `locate`, `wait_for`, and the form-driving tools accept. It is
6
- * deliberately **side-effect free** and depends only on `zod`, so external
7
- * consumers can import it (via `cdp-mcp/contract`) to produce and validate specs
8
- * without pulling in the CLI/server. Tool code re-imports these symbols rather
9
- * than redefining them, so the published contract can never silently drift from
10
- * what the tools actually accept.
11
- */
12
- import { z } from "zod";
13
- /**
14
- * Error thrown by {@link normalizeLocator} / {@link parseLocator} for an invalid
15
- * spec. `code` mirrors the cdp-mcp tool error codes so tool handlers can re-wrap it
16
- * structurally: `"missing_arg"` when a spec is under-specified for its strategy,
17
- * `"invalid_locator"` for an unsupported strategy.
18
- */
19
- export declare class LocatorError extends Error {
20
- readonly code: string;
21
- constructor(message: string, code?: string);
22
- }
23
- /** The locator strategies cdp-mcp understands. `css` is the default when a selector is given. */
24
- export declare const locatorBySchema: z.ZodEnum<["css", "text", "role", "test_id", "testId", "label", "placeholder", "name"]>;
25
- /**
26
- * The raw Zod shape for a LocatorSpec. Spread into tool input schemas
27
- * (`{ ...locatorShape, ... }`) so the field docs stay identical everywhere.
28
- */
29
- export declare const locatorShape: {
30
- by: z.ZodOptional<z.ZodEnum<["css", "text", "role", "test_id", "testId", "label", "placeholder", "name"]>>;
31
- selector: z.ZodOptional<z.ZodString>;
32
- css: z.ZodOptional<z.ZodString>;
33
- text: z.ZodOptional<z.ZodString>;
34
- role: z.ZodOptional<z.ZodString>;
35
- name: z.ZodOptional<z.ZodString>;
36
- test_id: z.ZodOptional<z.ZodString>;
37
- testId: z.ZodOptional<z.ZodString>;
38
- label: z.ZodOptional<z.ZodString>;
39
- placeholder: z.ZodOptional<z.ZodString>;
40
- exact: z.ZodOptional<z.ZodBoolean>;
41
- };
42
- /** A standalone `ZodObject` for a LocatorSpec — external consumers can `.parse()`/`.safeParse()`. */
43
- export declare const locatorSchema: z.ZodObject<{
44
- by: z.ZodOptional<z.ZodEnum<["css", "text", "role", "test_id", "testId", "label", "placeholder", "name"]>>;
45
- selector: z.ZodOptional<z.ZodString>;
46
- css: z.ZodOptional<z.ZodString>;
47
- text: z.ZodOptional<z.ZodString>;
48
- role: z.ZodOptional<z.ZodString>;
49
- name: z.ZodOptional<z.ZodString>;
50
- test_id: z.ZodOptional<z.ZodString>;
51
- testId: z.ZodOptional<z.ZodString>;
52
- label: z.ZodOptional<z.ZodString>;
53
- placeholder: z.ZodOptional<z.ZodString>;
54
- exact: z.ZodOptional<z.ZodBoolean>;
55
- }, "strip", z.ZodTypeAny, {
56
- css?: string | undefined;
57
- text?: string | undefined;
58
- role?: string | undefined;
59
- test_id?: string | undefined;
60
- testId?: string | undefined;
61
- label?: string | undefined;
62
- placeholder?: string | undefined;
63
- name?: string | undefined;
64
- exact?: boolean | undefined;
65
- by?: "css" | "text" | "role" | "test_id" | "testId" | "label" | "placeholder" | "name" | undefined;
66
- selector?: string | undefined;
67
- }, {
68
- css?: string | undefined;
69
- text?: string | undefined;
70
- role?: string | undefined;
71
- test_id?: string | undefined;
72
- testId?: string | undefined;
73
- label?: string | undefined;
74
- placeholder?: string | undefined;
75
- name?: string | undefined;
76
- exact?: boolean | undefined;
77
- by?: "css" | "text" | "role" | "test_id" | "testId" | "label" | "placeholder" | "name" | undefined;
78
- selector?: string | undefined;
79
- }>;
80
- export type LocatorBy = z.infer<typeof locatorBySchema>;
81
- export interface LocatorSpec {
82
- by?: LocatorBy;
83
- selector?: string;
84
- css?: string;
85
- text?: string;
86
- role?: string;
87
- name?: string;
88
- test_id?: string;
89
- testId?: string;
90
- label?: string;
91
- placeholder?: string;
92
- exact?: boolean;
93
- }
94
- /**
95
- * Validate and canonicalize a spec: infer `by` from selector/css, enforce the
96
- * required field for the chosen strategy, and fold the `name` fallback into the
97
- * strategy-specific field. Throws {@link LocatorError} on an under-specified spec.
98
- */
99
- export declare function normalizeLocator(input: LocatorSpec): LocatorSpec;
100
- /** Validate an unknown value as a LocatorSpec (shape + strategy requirements). */
101
- export declare function parseLocator(input: unknown): LocatorSpec;
102
- /**
103
- * Serialize a LocatorSpec to a stable, normalized JSON string. Equivalent specs
104
- * serialize identically regardless of which alias the caller used — e.g.
105
- * `{ css: ".x" }` and `{ selector: ".x" }` both yield `{"by":"css","selector":".x"}`
106
- * — so the output is safe to use as a cache key or for equality checks.
107
- */
108
- export declare function serializeLocator(spec: LocatorSpec): string;