{"record":{"id":"2542d487205d41f8","repo":"jackwener/OpenCLI","slug":"eastmoney-convertible-limit-must-be-an-integer-b","errorCode":null,"errorMessage":"eastmoney convertible --limit must be an integer between 1 and 100","messagePattern":"eastmoney convertible --limit must be an integer between 1 and 100","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/eastmoney/convertible.js","lineNumber":50,"sourceCode":"  if (value === '-') return value;\n  throw new CommandExecutionError(`eastmoney convertible returned malformed ${field} for ${bondCode || 'unknown bond'}`);\n}\n\nfunction normalizeEastmoneyString(value, field, bondCode) {\n  if (isEastmoneyScalar(value)) return String(value);\n  throw new CommandExecutionError(`eastmoney convertible returned malformed ${field} for ${bondCode || 'unknown bond'}`);\n}\n\nfunction normalizeEastmoneyIdentityString(value, field, bondCode) {\n  if (typeof value === 'string' && value.trim()) return value;\n  throw new CommandExecutionError(`eastmoney convertible returned malformed ${field} for ${bondCode || 'unknown bond'}`);\n}\n\nexport function parseConvertibleLimit(value) {\n  if (value === undefined || value === null || value === '') return 20;\n  if (typeof value === 'number') {\n    if (Number.isInteger(value) && value >= 1 && value <= 100) return value;\n    throw new ArgumentError('eastmoney convertible --limit must be an integer between 1 and 100');\n  }\n  const raw = String(value).trim();\n  if (!/^\\d+$/.test(raw)) throw new ArgumentError('eastmoney convertible --limit must be an integer between 1 and 100');\n  const parsed = Number(raw);\n  if (parsed < 1 || parsed > 100) throw new ArgumentError('eastmoney convertible --limit must be an integer between 1 and 100');\n  return parsed;\n}\n\nexport function extractConvertibleDiff(data) {\n  if (!data || typeof data !== 'object' || Array.isArray(data)) {\n    throw new CommandExecutionError('eastmoney convertible returned a malformed response envelope');\n  }\n  if (!data.data || typeof data.data !== 'object' || Array.isArray(data.data)) {\n    throw new CommandExecutionError('eastmoney convertible returned a malformed data envelope');\n  }\n  const diff = data.data.diff;\n  if (!Array.isArray(diff)) {\n    throw new CommandExecutionError('eastmoney convertible returned malformed diff data');","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/eastmoney/convertible.js#L32-L68","documentation":"parseConvertibleLimit() normalizes the --limit option (default 20, valid range 1–100). When given a number it must be an integer within 1..100; otherwise it throws ArgumentError. Line 50 fires when a numeric value is passed that is a non-integer (e.g. 2.5) or out of range (0, -1, 101, NaN).","triggerScenarios":"--limit=0, --limit=101, --limit=2.5, or programmatically passing NaN (which is typeof 'number', fails Number.isInteger) to the convertible command.","commonSituations":"Scripting the CLI with a computed limit that divides to a float; off-by-one when wanting 'all rows' and passing 0 or a huge number; NaN leaking from parseInt on bad input.","solutions":["Pass an integer between 1 and 100 inclusive.","Use Math.round/Math.floor on computed values before passing.","Omit --limit entirely to use the default of 20.","Clamp user input to the 1..100 range in your own code first."],"exampleFix":"// before\nconst limit = Math.ceil(total / pages); // may be float or out of range\n// after\nconst limit = Math.min(100, Math.max(1, Math.round(total / pages) || 20));","handlingStrategy":"validation","validationCode":"function validLimit(n) { return Number.isInteger(n) && n >= 1 && n <= 100; }\nif (!validLimit(limit)) limit = 20;","typeGuard":"const isValidLimit = (v) => (typeof v === 'number' && Number.isInteger(v) && v >= 1 && v <= 100) || (typeof v === 'string' && /^\\d+$/.test(v.trim()) && Number(v) >= 1 && Number(v) <= 100);","tryCatchPattern":"try {\n  rows = await eastmoneyConvertible({ limit });\n} catch (e) {\n  if (e instanceof ArgumentError && /--limit/.test(e.message)) {\n    console.error('Invalid --limit: use an integer 1-100 (default 20).');\n  } else throw e;\n}","preventionTips":["Clamp computed limits: Math.min(100, Math.max(1, Math.round(n)))","Use integer arithmetic when deriving limits from page math","Omit --limit to accept the default of 20","Guard NaN inputs before invoking (Number.isNaN check)"],"tags":["validation","argument","cli","limit"],"backgroundTag":"invalid-argument-value","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}