{"record":{"id":"bd4425e69b727d0e","repo":"jackwener/OpenCLI","slug":"label-must-be-between-min-and-max-got","errorCode":null,"errorMessage":"${label} must be between ${min} and ${max}, got ${parsed}","messagePattern":"(.+?) must be between (.+?) and (.+?), got (.+?)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/_shared/search-adapter.js","lineNumber":18,"sourceCode":"import { ArgumentError, CommandExecutionError, EmptyResultError } from '@jackwener/opencli/errors';\n\nexport function requireSearchQuery(value, label = 'keyword') {\n  const query = String(value ?? '').trim();\n  if (!query) {\n    throw new ArgumentError(`${label} cannot be empty`);\n  }\n  return query;\n}\n\nexport function requireBoundedInteger(value, defaultValue, min, max, label) {\n  const raw = value ?? defaultValue;\n  const parsed = typeof raw === 'number' ? raw : Number(raw);\n  if (!Number.isInteger(parsed)) {\n    throw new ArgumentError(`${label} must be an integer between ${min} and ${max}, got ${JSON.stringify(value)}`);\n  }\n  if (parsed < min || parsed > max) {\n    throw new ArgumentError(`${label} must be between ${min} and ${max}, got ${parsed}`);\n  }\n  return parsed;\n}\n\nexport function requireNonNegativeInteger(value, defaultValue, label) {\n  const raw = value ?? defaultValue;\n  const parsed = typeof raw === 'number' ? raw : Number(raw);\n  if (!Number.isInteger(parsed) || parsed < 0) {\n    throw new ArgumentError(`${label} must be a non-negative integer, got ${JSON.stringify(value)}`);\n  }\n  return parsed;\n}\n\nexport function unwrapBrowserResult(value) {\n  if (value && typeof value === 'object' && !Array.isArray(value) && 'session' in value && 'data' in value) {\n    return value.data;\n  }\n  return value;","sourceCodeStart":1,"sourceCodeEnd":36,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/_shared/search-adapter.js#L1-L36","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Clamp or pick a value within the documented [min, max] range, e.g. use max instead of 10000.","In scripts, clamp before calling: Math.min(Math.max(n, min), max).","Check the command's --help/docs for the allowed range and update your config to a supported value."],"exampleFix":"// before\nrequireBoundedInteger(5000, 25, 1, 100, 'limit')\n// after\nrequireBoundedInteger(Math.min(5000, 100), 25, 1, 100, 'limit')  // clamps to 100","handlingStrategy":"validation","validationCode":"const n = Number(raw);\nconst clamped = Math.min(Math.max(n, min), max);\nif (!Number.isInteger(n) || n !== clamped) throw new Error(`${label} must be within [${min}, ${max}]`);","typeGuard":"const isInRange = (v, min, max) => Number.isInteger(v) && v >= min && v <= max;","tryCatchPattern":"try {\n  const limit = requireBoundedInteger(raw, 25, 1, 100, 'limit');\n} catch (err) {\n  if (err.name === 'ArgumentError' && /must be between/.test(err.message)) {\n    console.error('Limit outside allowed range; clamping to max.');\n  }\n  throw err;\n}","preventionTips":["Clamp user/config values with Math.min/Math.max before passing bounded options.","Document the accepted range in help text and validate at config load.","Watch for 0 vs 1-based minimums and count/limit mix-ups."],"tags":["validation","range-check","argument-validation","cli"],"backgroundTag":"value-out-of-range","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}