186 lines
6.1 KiB
TypeScript
186 lines
6.1 KiB
TypeScript
import type { Command } from "commander";
|
|
|
|
import { resolveBrowserControlUrl } from "../browser/client.js";
|
|
import {
|
|
browserCookies,
|
|
browserCookiesClear,
|
|
browserCookiesSet,
|
|
browserStorageClear,
|
|
browserStorageGet,
|
|
browserStorageSet,
|
|
} from "../browser/client-actions.js";
|
|
import { danger } from "../globals.js";
|
|
import { defaultRuntime } from "../runtime.js";
|
|
import type { BrowserParentOpts } from "./browser-cli-shared.js";
|
|
|
|
export function registerBrowserCookiesAndStorageCommands(
|
|
browser: Command,
|
|
parentOpts: (cmd: Command) => BrowserParentOpts,
|
|
) {
|
|
const cookies = browser.command("cookies").description("Read/write cookies");
|
|
|
|
cookies
|
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
.action(async (opts, cmd) => {
|
|
const parent = parentOpts(cmd);
|
|
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
const profile = parent?.browserProfile;
|
|
try {
|
|
const result = await browserCookies(baseUrl, {
|
|
targetId: opts.targetId?.trim() || undefined,
|
|
profile,
|
|
});
|
|
if (parent?.json) {
|
|
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
return;
|
|
}
|
|
defaultRuntime.log(JSON.stringify(result.cookies ?? [], null, 2));
|
|
} catch (err) {
|
|
defaultRuntime.error(danger(String(err)));
|
|
defaultRuntime.exit(1);
|
|
}
|
|
});
|
|
|
|
cookies
|
|
.command("set")
|
|
.description("Set a cookie (requires --url or domain+path)")
|
|
.argument("<name>", "Cookie name")
|
|
.argument("<value>", "Cookie value")
|
|
.requiredOption("--url <url>", "Cookie URL scope (recommended)")
|
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
.action(async (name: string, value: string, opts, cmd) => {
|
|
const parent = parentOpts(cmd);
|
|
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
const profile = parent?.browserProfile;
|
|
try {
|
|
const result = await browserCookiesSet(baseUrl, {
|
|
targetId: opts.targetId?.trim() || undefined,
|
|
cookie: { name, value, url: opts.url },
|
|
profile,
|
|
});
|
|
if (parent?.json) {
|
|
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
return;
|
|
}
|
|
defaultRuntime.log(`cookie set: ${name}`);
|
|
} catch (err) {
|
|
defaultRuntime.error(danger(String(err)));
|
|
defaultRuntime.exit(1);
|
|
}
|
|
});
|
|
|
|
cookies
|
|
.command("clear")
|
|
.description("Clear all cookies")
|
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
.action(async (opts, cmd) => {
|
|
const parent = parentOpts(cmd);
|
|
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
const profile = parent?.browserProfile;
|
|
try {
|
|
const result = await browserCookiesClear(baseUrl, {
|
|
targetId: opts.targetId?.trim() || undefined,
|
|
profile,
|
|
});
|
|
if (parent?.json) {
|
|
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
return;
|
|
}
|
|
defaultRuntime.log("cookies cleared");
|
|
} catch (err) {
|
|
defaultRuntime.error(danger(String(err)));
|
|
defaultRuntime.exit(1);
|
|
}
|
|
});
|
|
|
|
const storage = browser.command("storage").description("Read/write localStorage/sessionStorage");
|
|
|
|
function registerStorageKind(kind: "local" | "session") {
|
|
const cmd = storage.command(kind).description(`${kind}Storage commands`);
|
|
|
|
cmd
|
|
.command("get")
|
|
.description(`Get ${kind}Storage (all keys or one key)`)
|
|
.argument("[key]", "Key (optional)")
|
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
.action(async (key: string | undefined, opts, cmd2) => {
|
|
const parent = parentOpts(cmd2);
|
|
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
const profile = parent?.browserProfile;
|
|
try {
|
|
const result = await browserStorageGet(baseUrl, {
|
|
kind,
|
|
key: key?.trim() || undefined,
|
|
targetId: opts.targetId?.trim() || undefined,
|
|
profile,
|
|
});
|
|
if (parent?.json) {
|
|
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
return;
|
|
}
|
|
defaultRuntime.log(JSON.stringify(result.values ?? {}, null, 2));
|
|
} catch (err) {
|
|
defaultRuntime.error(danger(String(err)));
|
|
defaultRuntime.exit(1);
|
|
}
|
|
});
|
|
|
|
cmd
|
|
.command("set")
|
|
.description(`Set a ${kind}Storage key`)
|
|
.argument("<key>", "Key")
|
|
.argument("<value>", "Value")
|
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
.action(async (key: string, value: string, opts, cmd2) => {
|
|
const parent = parentOpts(cmd2);
|
|
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
const profile = parent?.browserProfile;
|
|
try {
|
|
const result = await browserStorageSet(baseUrl, {
|
|
kind,
|
|
key,
|
|
value,
|
|
targetId: opts.targetId?.trim() || undefined,
|
|
profile,
|
|
});
|
|
if (parent?.json) {
|
|
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
return;
|
|
}
|
|
defaultRuntime.log(`${kind}Storage set: ${key}`);
|
|
} catch (err) {
|
|
defaultRuntime.error(danger(String(err)));
|
|
defaultRuntime.exit(1);
|
|
}
|
|
});
|
|
|
|
cmd
|
|
.command("clear")
|
|
.description(`Clear all ${kind}Storage keys`)
|
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
.action(async (opts, cmd2) => {
|
|
const parent = parentOpts(cmd2);
|
|
const baseUrl = resolveBrowserControlUrl(parent?.url);
|
|
const profile = parent?.browserProfile;
|
|
try {
|
|
const result = await browserStorageClear(baseUrl, {
|
|
kind,
|
|
targetId: opts.targetId?.trim() || undefined,
|
|
profile,
|
|
});
|
|
if (parent?.json) {
|
|
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
return;
|
|
}
|
|
defaultRuntime.log(`${kind}Storage cleared`);
|
|
} catch (err) {
|
|
defaultRuntime.error(danger(String(err)));
|
|
defaultRuntime.exit(1);
|
|
}
|
|
});
|
|
}
|
|
|
|
registerStorageKind("local");
|
|
registerStorageKind("session");
|
|
}
|