jackwener/OpenCLI · error · ArgumentError

pubmed ${label} must be >= 1800

Error message

pubmed ${label} must be >= 1800

What it means

requireYear treats year filters as optional (empty passes through as undefined) but otherwise validates via requireBoundedInt and enforces a floor of 1800, since PubMed indexing effectively starts in the 19th century. Years below 1800 throw ArgumentError 'pubmed <label> must be >= 1800' (called by yearFrom/yearTo).

Source

Thrown at clis/pubmed/utils.js:48

        throw new ArgumentError(`pubmed ${label} must be a positive integer`);
    }
    const n = Number(text);
    if (!Number.isSafeInteger(n) || n < 1) {
        throw new ArgumentError(`pubmed ${label} must be a positive integer`);
    }
    if (n > maxValue) {
        throw new ArgumentError(`pubmed ${label} must be <= ${maxValue}`);
    }
    return n;
}

export function requireYear(value, label) {
    if (value === undefined || value === null || value === '') {
        return undefined;
    }
    const year = requireBoundedInt(value, 1900, 3000, label);
    if (year < 1800) {
        throw new ArgumentError(`pubmed ${label} must be >= 1800`);
    }
    return year;
}

export function requireChoice(value, choices, label, defaultValue) {
    const text = String(value ?? defaultValue).trim();
    if (!choices.includes(text)) {
        throw new ArgumentError(`pubmed ${label} must be one of: ${choices.join(', ')}`);
    }
    return text;
}

export function buildEutilsUrl(tool, params = {}) {
    const searchParams = new URLSearchParams();
    searchParams.set('db', 'pubmed');
    if (!params.retmode) {
        searchParams.set('retmode', 'json');
    }

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Use a year >= 1800 (generic checks also cap at 3000)
  2. Double-check for transposed digits
  3. Omit the year filter if it is not needed

Example fix

// before
--year-from 1492
// after
--year-from 1950
Defensive patterns

Strategy: validation

Validate before calling

function checkYear(y) {
  if (y === undefined || y === null || y === '') return undefined;
  const n = Number(String(y).trim());
  if (!Number.isSafeInteger(n) || n < 1800 || n > 3000) {
    throw new Error(`year '${y}' out of range (1800-3000)`);
  }
  return n;
}
checkYear(yearFrom);

Type guard

function isPlausibleYear(v) {
  const n = Number(v);
  return Number.isSafeInteger(n) && n >= 1800 && n <= 3000;
}

Try / catch

try {
  await pubmedSearch(query, { yearFrom, yearTo });
} catch (err) {
  if (err instanceof ArgumentError && /must be >= 1800/.test(err.message)) {
    console.error(`Year '${yearFrom}' predates PubMed coverage; use >= 1800`);
    process.exitCode = 2;
  } else { throw err; }
}

Prevention

When it happens

Trigger: `--year-from 1492`, `--year-to 999`, or any transposed-digit year like 1080 that passes the generic integer checks but is < 1800.

Common situations: Typos (1080 vs 1800/1980), using historical or event years that predate PubMed coverage, expecting non-publication dates to work.

Related errors


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