jackwener/OpenCLI · error · ArgumentError

--page must be between ${ARTICLES_MIN_PAGE} and ${ARTICLES_M

Error message

--page must be between ${ARTICLES_MIN_PAGE} and ${ARTICLES_MAX_PAGE}, got ${parsed}

What it means

This ArgumentError is thrown by parseArticlesPage when --page is an integer but outside the allowed [ARTICLES_MIN_PAGE, ARTICLES_MAX_PAGE] range. It is a range guard preventing nonsense pagination values from being sent upstream.

Source

Thrown at clis/toutiao/utils.js:20

 * Shared helpers for the toutiao adapter.
 */
import { ArgumentError, CommandExecutionError } from '@jackwener/opencli/errors';

const ARTICLES_MIN_PAGE = 1;
const ARTICLES_MAX_PAGE = 4;
const HOT_MIN_LIMIT = 1;
const HOT_MAX_LIMIT = 50;
const RECOMMEND_MIN_LIMIT = 1;
const RECOMMEND_MAX_LIMIT = 50;

export function parseArticlesPage(raw, fallback = 1) {
    if (raw === undefined || raw === null || raw === '') return fallback;
    const parsed = Number(raw);
    if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
        throw new ArgumentError(`--page must be an integer between ${ARTICLES_MIN_PAGE} and ${ARTICLES_MAX_PAGE}, got ${JSON.stringify(raw)}`);
    }
    if (parsed < ARTICLES_MIN_PAGE || parsed > ARTICLES_MAX_PAGE) {
        throw new ArgumentError(`--page must be between ${ARTICLES_MIN_PAGE} and ${ARTICLES_MAX_PAGE}, got ${parsed}`);
    }
    return parsed;
}

export function parseRecommendLimit(raw, fallback = 20) {
    if (raw === undefined || raw === null || raw === '') return fallback;
    const parsed = Number(raw);
    if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
        throw new ArgumentError(`--limit must be an integer between ${RECOMMEND_MIN_LIMIT} and ${RECOMMEND_MAX_LIMIT}, got ${JSON.stringify(raw)}`);
    }
    if (parsed < RECOMMEND_MIN_LIMIT || parsed > RECOMMEND_MAX_LIMIT) {
        throw new ArgumentError(`--limit must be between ${RECOMMEND_MIN_LIMIT} and ${RECOMMEND_MAX_LIMIT}, got ${parsed}`);
    }
    return parsed;
}

export function parseRecommendCategory(raw, fallback = '__all__') {
    if (raw === undefined || raw === null || raw === '') return fallback;

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Use a page value within the documented range, starting at ARTICLES_MIN_PAGE (typically 1).
  2. Clamp the value: Math.min(ARTICLES_MAX_PAGE, Math.max(ARTICLES_MIN_PAGE, n)) before passing.
  3. Stop pagination loops when the range error is raised — it means you have gone past the last valid page.
  4. Check the CLI help/docs for the current min/max constants.

Example fix

// before
for (let p = 0; p < 1000; p++) await articles({ page: p });
// after
const MAX = 100; // ARTICLES_MAX_PAGE
for (let p = 1; p <= MAX; p++) await articles({ page: p });
Defensive patterns

Strategy: validation

Validate before calling

const ARTICLES_MIN_PAGE = 1, ARTICLES_MAX_PAGE = 100; // match library constants
function clampPage(n) {
  return Math.min(ARTICLES_MAX_PAGE, Math.max(ARTICLES_MIN_PAGE, n));
}

Type guard

function isPageInRange(n) {
  return Number.isInteger(n) && n >= ARTICLES_MIN_PAGE && n <= ARTICLES_MAX_PAGE;
}

Try / catch

try {
  await articles({ page: p });
} catch (e) {
  if (e instanceof ArgumentError && e.message.startsWith('--page must be between')) {
    console.error('Page out of range; clamping to valid range.');
    return articles({ page: clampPage(p) });
  }
  throw e;
}

Prevention

When it happens

Trigger: Running an article command with `--page 0`, `--page -3`, or `--page 99999999` — any integer below ARTICLES_MIN_PAGE or above ARTICLES_MAX_PAGE.

Common situations: Off-by-one assumptions that pages start at 0; brute-force pagination loops without a bound check; scripts generating page numbers from unbounded computations.

Related errors


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