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
- Use a year >= 1800 (generic checks also cap at 3000)
- Double-check for transposed digits
- 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
- Check years for transposed digits (1080 vs 1800/1980)
- Remember PubMed coverage starts in the 1800s
- Omit optional year filters rather than guessing a floor
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
- pubmed year-from must be <= year-to
- pubmed year-from must be <= year-to
- pubmed year-from must be <= year-to
- pubmed ${label} cannot be empty
- pubmed ${label} must be a numeric PMID
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/33bba6fe68e3d196.
Report an issue: GitHub.