{"record":{"id":"d1bec526702a4ef8","repo":"jackwener/OpenCLI","slug":"name-must-be-between-min-and-max-got","errorCode":null,"errorMessage":"--${name} must be between ${min} and ${max}, got ${parsed}","messagePattern":"--(.+?) must be between (.+?) and (.+?), got (.+?)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/ctrip/utils.js","lineNumber":39,"sourceCode":"        throw new ArgumentError(`--${name} must be a positive integer, got ${JSON.stringify(raw)}`);\n    }\n    if (typeof raw === 'string' && /^(0|[1-9]\\d*)$/.test(raw)) {\n        return Number(raw);\n    }\n    throw new ArgumentError(`--${name} must be a positive integer, got ${JSON.stringify(raw)}`);\n}\n\nexport function parseStrictPositiveInteger(name, raw) {\n    const parsed = parseStrictDecimalInteger(name, raw);\n    if (parsed > 0) return parsed;\n    throw new ArgumentError(`--${name} must be a positive integer, got ${JSON.stringify(raw)}`);\n}\n\nexport function parseStrictIntegerRange(name, raw, fallback, min = MIN_LIMIT, max = MAX_LIMIT) {\n    if (raw === undefined || raw === null || raw === '') return fallback;\n    const parsed = parseStrictDecimalInteger(name, raw);\n    if (parsed < min || parsed > max) {\n        throw new ArgumentError(`--${name} must be between ${min} and ${max}, got ${parsed}`);\n    }\n    return parsed;\n}\n\nexport function parseLimit(raw, fallback = 15) {\n    return parseStrictIntegerRange('limit', raw, fallback);\n}\n\nexport async function fetchSuggest(query, searchType) {\n    let response;\n    try {\n        response = await fetch(ENDPOINT, {\n            method: 'POST',\n            headers: { 'content-type': 'application/json' },\n            body: JSON.stringify({\n                keyword: query,\n                searchType,\n                platform: 'online',","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/ctrip/utils.js#L21-L57","documentation":"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.","triggerScenarios":"--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.","commonSituations":"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.","solutions":["Use a limit between 1 and 50 (the default bounds).","Paginate: run multiple calls with offset/skip logic if you need more than 50 results.","Check whether the specific command documents a different allowed range."],"exampleFix":"// before\nawait runTrainList({ from, to, date, limit: 100 });\n// after\nconst PAGE = 50;\nawait runTrainList({ from, to, date, limit: PAGE }); // paginate for more","handlingStrategy":"validation","validationCode":"const withinRange = (v, min = 1, max = 50) => { const n = Number(v); return Number.isInteger(n) && n >= min && n <= max; };\nif (!withinRange(opts.limit)) opts.limit = Math.min(Math.max(Number(opts.limit) || 15, 1), 50);","typeGuard":"const isBoundedInt = (v, min, max) => Number.isInteger(v) && v >= min && v <= max;","tryCatchPattern":"try { await run(opts); } catch (e) { if (e instanceof ArgumentError && /must be between/.test(e.message)) { opts.limit = 15; return run(opts); } throw e; }","preventionTips":["Clamp dynamic limits to [1, 50] before invoking","Remember the default cap is 50; paginate for more results","Never use 0 to mean 'unlimited' with these parsers"],"tags":["argument-validation","cli","range-check","limit"],"backgroundTag":"invalid-argument","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}