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

  1. Pass an integer >= 1 (page numbering is 1-based)
  2. Round/validate upstream: Number.isSafeInteger(n) && n >= 1
  3. Pass null/undefined or empty string if you want the default (P1) behavior instead of 0
  4. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/343ed3fdbbffc133. Report an issue: GitHub.