jackwener/OpenCLI · error · ArgumentError
--page must be a positive decimal integer, got: ${value}
Error message
--page must be a positive decimal integer, got: ${value} What it means
parsePageArg validates the --page argument as a positive safe integer. When a number is passed that is not a safe integer >= 1 (0, negative, fractional, NaN, Infinity, or beyond Number.MAX_SAFE_INTEGER), it throws this ArgumentError. null/empty returns null (meaning default P1 behavior).
Source
Thrown at clis/bilibili/utils.js:88
}
}
res.resume();
reject(new Error(`Cannot resolve BV ID from short URL: ${trimmed}`));
});
req.on('error', reject);
req.setTimeout(4000, () => { req.destroy(); reject(new Error(`Timeout resolving short URL: ${trimmed}`)); });
});
}
/**
* 解析 --page 选集序号(分P / 视频选集)。
* 缺省/空串 → null(不下钻,保持整集默认 P1 旧行为)。
* 非正十进制整数 → 抛 ArgumentError(参数错误,不静默吞)。
*/
export function parsePageArg(value) {
if (value == null || value === '') return null;
if (typeof value === 'number') {
if (Number.isSafeInteger(value) && value >= 1) return value;
throw new ArgumentError(`--page must be a positive decimal integer, got: ${value}`);
}
if (typeof value !== 'string' || !/^[1-9]\d*$/.test(value)) {
throw new ArgumentError(`--page must be a positive decimal integer, got: ${String(value)}`);
}
const n = Number(value);
if (!Number.isSafeInteger(n)) {
throw new ArgumentError(`--page is too large: ${value}`);
}
return n;
}
function readApiPositiveInteger(value, label) {
if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 1) {
return value;
}
if (typeof value === 'string' && /^[1-9]\d*$/.test(value)) {
const n = Number(value);
if (Number.isSafeInteger(n)) return n;View on GitHub (pinned to 49907e53dc)
Solutions
- Pass an integer >= 1 (page numbering is 1-based)
- Round/validate upstream: Number.isSafeInteger(n) && n >= 1
- Pass null/undefined or empty string if you want the default (P1) behavior instead of 0
- Fix off-by-one arithmetic in the calling script
Example fix
// before const page = Math.floor(totalParts / 2); // could be 0 await parsePageArg(page); // after const page = Math.max(1, Math.floor(totalParts / 2)); await parsePageArg(page);
Defensive patterns
Strategy: validation
Validate before calling
function safePage(n) {
return (Number.isSafeInteger(n) && n >= 1) ? n : null; // null = use default
}
const page = safePage(rawPage); Type guard
function isPositiveSafeInteger(v) {
return typeof v === 'number' && Number.isSafeInteger(v) && v >= 1;
} Try / catch
try {
const page = parsePageArg(value);
} catch (err) {
if (err instanceof ArgumentError && /--page/.test(err.message)) {
console.error(`Invalid --page '${value}'; defaulting to P1`);
const page = null;
} else throw err;
} Prevention
- Page numbers are 1-based; guard loops with Math.max(1, ...)
- Use Number.isSafeInteger checks before passing computed page numbers
- Pass null/undefined (or omit) rather than 0 for the default part
- Parse CLI input with parseInt(value, 10), never parseFloat
When it happens
Trigger: Calling parsePageArg(0), parsePageArg(-1), parsePageArg(1.5), parsePageArg(NaN/Infinity), or a number larger than Number.MAX_SAFE_INTEGER.
Common situations: Computing the page number with a formula that yields 0 or a float (e.g. an off-by-one loop, division); a config value defaulting to 0; parsing user input with parseFloat instead of integer parsing upstream.
Related errors
- bilibili unfollow target must be a valid space.bilibili.com/
- --page must be a positive decimal integer, got: ${String(val
- --page is too large: ${value}
- archive snapshots url cannot be empty
- archive snapshots limit must be a positive integer
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/343ed3fdbbffc133.
Report an issue: GitHub.