


















@@ -13,16 +13,43 @@ export function registerBrowserElementCommands(
1313browser: Command,
1414parentOpts: (cmd: Command) => BrowserParentOpts,
1515) {
16+const parseDecimalNumber = (value: string): number | undefined => {
17+const trimmed = value.trim();
18+if (!/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$/.test(trimmed)) {
19+return undefined;
20+}
21+const parsed = Number(trimmed);
22+return Number.isFinite(parsed) ? parsed : undefined;
23+};
24+1625const parseRequiredNumber = (value: string, label: string): number | undefined => {
17-const parsed = Number(value);
18-if (!Number.isFinite(parsed)) {
26+const parsed = parseDecimalNumber(value);
27+if (parsed === undefined) {
1928defaultRuntime.error(danger(`Invalid ${label}: must be a finite number`));
2029defaultRuntime.exit(1);
2130return undefined;
2231}
2332return parsed;
2433};
253435+const parseNonNegativeIntegerOption = (value: string, flag: string): number => {
36+const trimmed = value.trim();
37+const parsed = /^\d+$/.test(trimmed) ? Number(trimmed) : Number.NaN;
38+if (!Number.isSafeInteger(parsed)) {
39+throw new Error(`${flag} must be a non-negative integer.`);
40+}
41+return parsed;
42+};
43+44+const parsePositiveIntegerOption = (value: string, flag: string): number => {
45+const trimmed = value.trim();
46+const parsed = /^\d+$/.test(trimmed) ? Number(trimmed) : Number.NaN;
47+if (!Number.isSafeInteger(parsed) || parsed < 1) {
48+throw new Error(`${flag} must be a positive integer.`);
49+}
50+return parsed;
51+};
52+2653const runElementAction = async (params: {
2754cmd: Command;
2855body: Record<string, unknown>;
@@ -93,7 +120,9 @@ export function registerBrowserElementCommands(
93120.option("--target-id <id>", "CDP target id (or unique prefix)")
94121.option("--double", "Double click", false)
95122.option("--button <left|right|middle>", "Mouse button to use")
96-.option("--delay-ms <ms>", "Delay between mouse down/up", (v: string) => Number(v))
123+.option("--delay-ms <ms>", "Delay between mouse down/up", (v: string) =>
124+parseNonNegativeIntegerOption(v, "--delay-ms"),
125+)
97126.action(async (xRaw: string, yRaw: string, opts, cmd) => {
98127const x = parseRequiredNumber(xRaw, "x");
99128const y = parseRequiredNumber(yRaw, "y");
@@ -178,7 +207,7 @@ export function registerBrowserElementCommands(
178207.argument("<ref>", "Ref id from snapshot")
179208.option("--target-id <id>", "CDP target id (or unique prefix)")
180209.option("--timeout-ms <ms>", "How long to wait for scroll (default: 20000)", (v: string) =>
181-Number(v),
210+parsePositiveIntegerOption(v, "--timeout-ms"),
182211)
183212.action(async (ref: string | undefined, opts, cmd) => {
184213const refValue = requireRef(ref);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。