{"record":{"id":"6f7b56fc0aa7eb31","repo":"jackwener/OpenCLI","slug":"label-must-be-an-integer-got-json-stringify","errorCode":null,"errorMessage":"${label} must be an integer, got ${JSON.stringify(value)}","messagePattern":"(.+?) must be an integer, got (.+?)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/linkedin/search.js","lineNumber":78,"sourceCode":"    const values = parseCsvArg(input);\n    const resolved = values.map(value => {\n        const key = value.toLowerCase();\n        const mapped = mapping[key];\n        if (!mapped)\n            throw new ArgumentError(`Unsupported ${label}: ${value}`);\n        return mapped;\n    });\n    return [...new Set(resolved)];\n}\nfunction normalizeWhitespace(value) {\n    return String(value ?? '').replace(/\\s+/g, ' ').trim();\n}\nfunction parseIntegerArg(value, label, fallback, min, max = Infinity) {\n    if (value === undefined || value === null || value === '')\n        return fallback;\n    const parsed = Number(value);\n    if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {\n        throw new ArgumentError(`${label} must be an integer, got ${JSON.stringify(value)}`);\n    }\n    if (parsed < min || parsed > max) {\n        const range = Number.isFinite(max) ? `between ${min} and ${max}` : `at least ${min}`;\n        throw new ArgumentError(`${label} must be ${range}, got ${parsed}`);\n    }\n    return parsed;\n}\nfunction decodeLinkedinRedirect(url) {\n    if (!url)\n        return '';\n    try {\n        const parsed = new URL(url);\n        if (parsed.pathname === '/redir/redirect/') {\n            return parsed.searchParams.get('url') || url;\n        }\n    }\n    catch { }\n    return url;","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/linkedin/search.js#L60-L96","documentation":"parseIntegerArg coerces an argument to Number and requires a finite integer; non-numeric or fractional values throw ArgumentError(`${label} must be an integer, got ${JSON.stringify(value)}`). It backs the limit and start arguments of the LinkedIn search commands, guaranteeing they are whole numbers before being sent upstream.","triggerScenarios":"Calling a search command with --limit or --start set to a non-integer string ('twenty', '10.5'), a quoted empty-ish value that isn't caught by the undefined/null/'' check (e.g. spaces or 'null' as text), or an object/array in programmatic use.","commonSituations":"Shell passing quoted floats or decimals; YAML/JSON config with a string value like '25%'; copying '10,000' with a thousands separator; passing NaN-producing expressions like '1e3.5' or undefined variables rendered as the literal string 'undefined'.","solutions":["Pass a whole number: --limit 25 --start 0.","Remove thousands separators, units, and percent signs ('10,000' -> 10000).","Omit the argument entirely to use the fallback default.","Validate/Number() the value in the calling script before invoking."],"exampleFix":"// before\nnode cli.js linkedin search-jobs --limit 10.5\n// ArgumentError: limit must be an integer, got \"10.5\"\n// after\nnode cli.js linkedin search-jobs --limit 10","handlingStrategy":"validation","validationCode":"function toInt(v, fallback){ if (v === undefined || v === null || v === '') return fallback; const n = Number(String(v).replace(/[,_%\\s]/g,'')); if (!Number.isInteger(n)) throw new Error(`--${label} must be an integer`); return n; }","typeGuard":"function isInt(v){ return typeof v === 'number' ? Number.isInteger(v) : Number.isFinite(Number(v)) && Number.isInteger(Number(v)); }","tryCatchPattern":"try { await search({limit, start}) } catch (e) { if (e instanceof ArgumentError && /must be an integer/.test(e.message)) { console.error(`fix argument: ${e.message}`); process.exitCode = 2; } else throw e; }","preventionTips":["Strip units, commas, and percent signs from config values before use.","Coerce config/CLI values with Number() early in your wrapper.","Omit limit/start to use safe defaults instead of guessing values.","Add schema validation (e.g. zod integer()) on arguments in wrapper scripts."],"tags":["argument-error","type-error","integer-validation","linkedin"],"backgroundTag":"invalid-argument-type","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}