{"record":{"id":"7ceb8d3d33fffbce","repo":"actualbudget/actual","slug":"invalid-flagname-value-expected-a-non-ne","errorCode":null,"errorMessage":"Invalid ${flagName}: \"${value}\". Expected a non-negative integer.","messagePattern":"Invalid (.+?): \"(.+?)\"\\. Expected a non-negative integer\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/cli/src/utils.ts","lineNumber":28,"sourceCode":"  }\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(\n  raw: string | undefined,\n  source: string,\n): boolean | undefined {\n  if (raw === undefined) return undefined;\n  const lower = raw.toLowerCase();\n  if (raw === '1' || lower === 'true') return true;\n  if (raw === '0' || lower === 'false') return false;\n  throw new Error(\n    `Invalid ${source}: \"${raw}\". Expected \"true\", \"false\", \"1\", or \"0\".`,\n  );\n}","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/actualbudget/actual/blob/d4334cb6e6123f4d3bcea1ad6166608884c7e658/packages/cli/src/utils.ts#L10-L46","documentation":"parseNonNegativeIntFlag wraps parseIntFlag and additionally rejects negative integers. It throws when the parsed value is less than 0.","triggerScenarios":"Calling parseNonNegativeIntFlag with a negative value such as \"-1\" or \"-5\"; it is invoked by parseNonNegativeIntEnv for environment-sourced values.","commonSituations":"Setting an env var like ACTUAL_LIMIT=-1 intending \"unlimited\"; offset/limit flags computed from arithmetic that went negative.","solutions":["Provide a zero or positive integer value.","Use the documented way to express \"no limit\" (omit the flag) instead of a negative sentinel.","Clamp computed values with Math.max(0, value) before passing."],"exampleFix":"// before\nconst limit = parseNonNegativeIntFlag('-1', '--limit');\n// after\nconst limit = parseNonNegativeIntFlag(String(Math.max(0, n)), '--limit');","handlingStrategy":"validation","validationCode":"function isValidNonNegativeInt(value: string): boolean {\n  const n = Number(value);\n  return Number.isInteger(n) && n >= 0;\n}","typeGuard":null,"tryCatchPattern":"let limit: number;\ntry {\n  limit = parseNonNegativeIntFlag(value, '--limit');\n} catch (err) {\n  console.error((err as Error).message);\n  process.exit(1);\n}","preventionTips":["Clamp computed values with Math.max(0, n) before passing them.","Never use negative sentinels like -1 for \"unlimited\"; omit the flag instead.","Validate env-derived numbers with /^\\d+$/ before use."],"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"}