{"record":{"id":"0de7189211a1ad86","repo":"actualbudget/actual","slug":"invalid-flagname-value-expected-an-integ","errorCode":null,"errorMessage":"Invalid ${flagName}: \"${value}\". Expected an integer.","messagePattern":"Invalid (.+?): \"(.+?)\"\\. Expected an integer\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/cli/src/utils.ts","lineNumber":17,"sourceCode":"export function isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function parseBoolFlag(value: string, flagName: string): boolean {\n  if (value !== 'true' && value !== 'false') {\n    throw new Error(\n      `Invalid ${flagName}: \"${value}\". Expected \"true\" or \"false\".`,\n    );\n  }\n  return value === 'true';\n}\n\nexport function parseIntFlag(value: string, flagName: string): number {\n  const parsed = value.trim() === '' ? NaN : Number(value);\n  if (!Number.isInteger(parsed)) {\n    throw new Error(`Invalid ${flagName}: \"${value}\". Expected an integer.`);\n  }\n  return parsed;\n}\n\nexport function parseNonNegativeIntFlag(\n  value: string,\n  flagName: string,\n): number {\n  const parsed = parseIntFlag(value, flagName);\n  if (parsed < 0) {\n    throw new Error(\n      `Invalid ${flagName}: \"${value}\". Expected a non-negative integer.`,\n    );\n  }\n  return parsed;\n}\n\nexport function parseBoolEnv(","sourceCodeStart":1,"sourceCodeEnd":35,"githubUrl":"https://github.com/actualbudget/actual/blob/d4334cb6e6123f4d3bcea1ad6166608884c7e658/packages/cli/src/utils.ts#L1-L35","documentation":"parseIntFlag parses a CLI flag string into an integer and throws when the value is empty or not an integral number (Number.isInteger fails). It rejects decimals, non-numeric strings, and blank input.","triggerScenarios":"Calling parseIntFlag (used by balance/amount query builders via buildQueryFromFlags, e.g. limit/offset flags) with values like \"10.5\", \"abc\", \"\", or \"1e3\" (1e3 parses to 1000 and would pass, but \"1.0\" would fail... actually \"1.0\" -> 1 passes; \"10.5\" fails).","commonSituations":"Typing --limit=ten, --offset=2.5, or leaving a flag value empty; locale-formatted numbers with commas like \"1,000\".","solutions":["Supply a plain integer string, e.g. --limit=50.","Remove thousands separators and whitespace from the value.","Round or validate user input before passing it to the CLI."],"exampleFix":"// before\nactual-cli query --limit=10.5\n// after\nactual-cli query --limit=10","handlingStrategy":"validation","validationCode":"function isValidIntFlag(value: string): boolean {\n  const n = value.trim() === '' ? NaN : Number(value);\n  return Number.isInteger(n);\n}","typeGuard":null,"tryCatchPattern":"let limit: number;\ntry {\n  limit = parseIntFlag(value, '--limit');\n} catch (err) {\n  console.error((err as Error).message);\n  process.exit(1);\n}","preventionTips":["Strip whitespace and thousands separators from numeric input before passing flags.","Validate numbers in scripts with /^-?\\d+$/ before invoking the CLI.","Use Number.isInteger on user input in surrounding tooling to fail fast with clearer messages."],"tags":["cli","validation","argument-parsing"],"backgroundTag":"invalid-argument-value","analyzedSha":"d4334cb6e6123f4d3bcea1ad6166608884c7e658","analyzedAt":"2026-08-29T01:02:11.213Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}