jackwener/OpenCLI · error · ArgumentError

--${name} must be between ${min} and ${max}, got ${parsed}

Error message

--${name} must be between ${min} and ${max}, got ${parsed}

What it means

Thrown by parseStrictIntegerRange when a parsed integer falls outside the allowed [min,max] window (default MIN_LIMIT=1 to MAX_LIMIT=50 for list limits). The parser accepts the integer syntactically but enforces range bounds, raising ArgumentError with the actual bounds and offending value. Used by parseFlightLimit, parseHotelLimit, parseLimit, and parseListLimit.

Source

Thrown at clis/ctrip/utils.js:39

        throw new ArgumentError(`--${name} must be a positive integer, got ${JSON.stringify(raw)}`);
    }
    if (typeof raw === 'string' && /^(0|[1-9]\d*)$/.test(raw)) {
        return Number(raw);
    }
    throw new ArgumentError(`--${name} must be a positive integer, got ${JSON.stringify(raw)}`);
}

export function parseStrictPositiveInteger(name, raw) {
    const parsed = parseStrictDecimalInteger(name, raw);
    if (parsed > 0) return parsed;
    throw new ArgumentError(`--${name} must be a positive integer, got ${JSON.stringify(raw)}`);
}

export function parseStrictIntegerRange(name, raw, fallback, min = MIN_LIMIT, max = MAX_LIMIT) {
    if (raw === undefined || raw === null || raw === '') return fallback;
    const parsed = parseStrictDecimalInteger(name, raw);
    if (parsed < min || parsed > max) {
        throw new ArgumentError(`--${name} must be between ${min} and ${max}, got ${parsed}`);
    }
    return parsed;
}

export function parseLimit(raw, fallback = 15) {
    return parseStrictIntegerRange('limit', raw, fallback);
}

export async function fetchSuggest(query, searchType) {
    let response;
    try {
        response = await fetch(ENDPOINT, {
            method: 'POST',
            headers: { 'content-type': 'application/json' },
            body: JSON.stringify({
                keyword: query,
                searchType,
                platform: 'online',

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Use a limit between 1 and 50 (the default bounds).
  2. Paginate: run multiple calls with offset/skip logic if you need more than 50 results.
  3. Check whether the specific command documents a different allowed range.

Example fix

// before
await runTrainList({ from, to, date, limit: 100 });
// after
const PAGE = 50;
await runTrainList({ from, to, date, limit: PAGE }); // paginate for more
Defensive patterns

Strategy: validation

Validate before calling

const withinRange = (v, min = 1, max = 50) => { const n = Number(v); return Number.isInteger(n) && n >= min && n <= max; };
if (!withinRange(opts.limit)) opts.limit = Math.min(Math.max(Number(opts.limit) || 15, 1), 50);

Type guard

const isBoundedInt = (v, min, max) => Number.isInteger(v) && v >= min && v <= max;

Try / catch

try { await run(opts); } catch (e) { if (e instanceof ArgumentError && /must be between/.test(e.message)) { opts.limit = 15; return run(opts); } throw e; }

Prevention

When it happens

Trigger: --limit 0 (below min) or --limit 51+ (above default max), e.g. --limit 100 requesting 100 results when the cap is 50; custom min/max ranges passed by other callers likewise reject out-of-window values.

Common situations: Users requesting large batches assuming no cap; scripts computing limits dynamically and exceeding 50; passing 0 to mean 'unlimited'; a caller supplying custom min/max that the value violates.

Related errors


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