jackwener/OpenCLI · error · ArgumentError

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

Error message

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

What it means

The second stage of requireBoundedInteger: the value parsed as a valid integer but lies outside the allowed [min, max] range, so it throws ArgumentError '<label> must be between <min> and <max>, got <parsed>'. This enforces sane bounds for options like page size or limit.

Source

Thrown at clis/_shared/search-adapter.js:18

import { ArgumentError, CommandExecutionError, EmptyResultError } from '@jackwener/opencli/errors';

export function requireSearchQuery(value, label = 'keyword') {
  const query = String(value ?? '').trim();
  if (!query) {
    throw new ArgumentError(`${label} cannot be empty`);
  }
  return query;
}

export function requireBoundedInteger(value, defaultValue, min, max, label) {
  const raw = value ?? defaultValue;
  const parsed = typeof raw === 'number' ? raw : Number(raw);
  if (!Number.isInteger(parsed)) {
    throw new ArgumentError(`${label} must be an integer between ${min} and ${max}, got ${JSON.stringify(value)}`);
  }
  if (parsed < min || parsed > max) {
    throw new ArgumentError(`${label} must be between ${min} and ${max}, got ${parsed}`);
  }
  return parsed;
}

export function requireNonNegativeInteger(value, defaultValue, label) {
  const raw = value ?? defaultValue;
  const parsed = typeof raw === 'number' ? raw : Number(raw);
  if (!Number.isInteger(parsed) || parsed < 0) {
    throw new ArgumentError(`${label} must be a non-negative integer, got ${JSON.stringify(value)}`);
  }
  return parsed;
}

export function unwrapBrowserResult(value) {
  if (value && typeof value === 'object' && !Array.isArray(value) && 'session' in value && 'data' in value) {
    return value.data;
  }
  return value;

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Clamp or pick a value within the documented [min, max] range, e.g. use max instead of 10000.
  2. In scripts, clamp before calling: Math.min(Math.max(n, min), max).
  3. Check the command's --help/docs for the allowed range and update your config to a supported value.

Example fix

// before
requireBoundedInteger(5000, 25, 1, 100, 'limit')
// after
requireBoundedInteger(Math.min(5000, 100), 25, 1, 100, 'limit')  // clamps to 100
Defensive patterns

Strategy: validation

Validate before calling

const n = Number(raw);
const clamped = Math.min(Math.max(n, min), max);
if (!Number.isInteger(n) || n !== clamped) throw new Error(`${label} must be within [${min}, ${max}]`);

Type guard

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

Try / catch

try {
  const limit = requireBoundedInteger(raw, 25, 1, 100, 'limit');
} catch (err) {
  if (err.name === 'ArgumentError' && /must be between/.test(err.message)) {
    console.error('Limit outside allowed range; clamping to max.');
  }
  throw err;
}

Prevention

When it happens

Trigger: Calling requireBoundedInteger with an integer outside [min, max], e.g. limit 0 when min is 1, or 10000 when max is 100; negative values; values from config that exceed API caps.

Common situations: Users requesting very large result sets beyond the upstream API maximum; off-by-one mistakes passing count instead of limit or a 1-based value where 0-based is expected; stale config from an older API version with different caps.

Related errors


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