{"id":"0f389a8ac7b60820","repo":"sequelize/sequelize","slug":"parsesafeinteger-radix-argument-must-be-between","errorCode":null,"errorMessage":"parseSafeInteger() radix argument must be between ${MIN_RADIX_INCLUSIVE} and ${MAX_RADIX_INCLUSIVE}","messagePattern":"parseSafeInteger\\(\\) radix argument must be between (.+?) and (.+?)","errorType":"exception","errorClass":"RangeError","httpStatus":null,"severity":"error","filePath":"packages/utils/src/common/_internal/integer-regexp.ts","lineNumber":47,"sourceCode":"  'R',\n  'S',\n  'T',\n  'U',\n  'V',\n  'W',\n  'X',\n  'Y',\n  'Z',\n];\n\nexport const MAX_RADIX_INCLUSIVE = 36;\nexport const MIN_RADIX_INCLUSIVE = 2;\n\nconst integerRegExps: Array<RegExp | undefined> = Array.from({ length: numericSymbols.length });\n\nexport function getIsIntegerRegExp(radix: number): RegExp {\n  if (radix < MIN_RADIX_INCLUSIVE || radix > MAX_RADIX_INCLUSIVE) {\n    throw new RangeError(\n      `parseSafeInteger() radix argument must be between ${MIN_RADIX_INCLUSIVE} and ${MAX_RADIX_INCLUSIVE}`,\n    );\n  }\n\n  const existingRegExp = integerRegExps[radix];\n  if (existingRegExp) {\n    return existingRegExp;\n  }\n\n  /**\n   * Get all characters that are valid digits in this base (radix)\n   *\n   * Example: if radix = 16, characterSet will include [0, 1, ..., e, f]\n   */\n  const characterSet = numericSymbols.slice(0, radix);\n\n  /**\n   * Construct a regex that matches whether the input is a valid integer in this radix","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/sequelize/sequelize/blob/7e1deec499d5afbb8d1877c2f4d545cead1214ec/packages/utils/src/common/_internal/integer-regexp.ts#L29-L65","documentation":"Thrown at integer-regexp.ts:47 as a `RangeError` by getIsIntegerRegExp (the helper behind parseSafeInteger) when `radix` is below `MIN_RADIX_INCLUSIVE` (2) or above `MAX_RADIX_INCLUSIVE` (36). Radix must map onto the 36 available digit symbols (0-9, A-Z) defined at the top of the file, so anything outside [2,36] is rejected before building the digit-matching regex.","triggerScenarios":"Calling `parseSafeInteger(str, { radix: 1 })`, `radix: 0`, `radix: 37`, or a negative number; passing a radix derived from unvalidated user input; radix computed to NaN/0 downstream.","commonSituations":"Off-by-one when clamping radix; confusing base-1 (unary, unsupported) with base-2; misreading Number.parseInt defaults.","solutions":["Pass a radix in [2,36] — typically 10 for decimal or 16 for hex.","If radix comes from input, validate it is an integer in range before passing.","If you don't need a specific base, omit radix and let parseSafeInteger use its default."],"exampleFix":"// before\nparseSafeInteger(input, { radix: 1 });\n// after\nparseSafeInteger(input, { radix: 10 });","handlingStrategy":"validation","validationCode":"const MIN_RADIX = 2, MAX_RADIX = 36;\nif (!Number.isInteger(radix) || radix < MIN_RADIX || radix > MAX_RADIX) {\n  throw new RangeError(`radix must be an integer in [${MIN_RADIX}, ${MAX_RADIX}]`);\n}\nparseSafeInteger(input, { radix });","typeGuard":"function isValidRadix(r: unknown): r is number {\n  return typeof r === 'number' && Number.isInteger(r) && r >= 2 && r <= 36;\n}","tryCatchPattern":"try {\n  parseSafeInteger(input, { radix });\n} catch (e) {\n  if (e instanceof RangeError && /radix/.test(e.message)) {\n    // fix or default the radix\n  } else throw e;\n}","preventionTips":["Always validate radix is an integer in [2,36] before passing.","Prefer the default radix when you don't need a specific base.","Clamp or reject user-supplied radix values."],"tags":["utils","validation","rangeerror","number-parsing"],"analyzedSha":"7e1deec499d5afbb8d1877c2f4d545cead1214ec","analyzedAt":"2026-08-03T18:58:44.549Z","schemaVersion":2}