{"id":"54bd8739453381fd","repo":"sindresorhus/is","slug":"invalid-range-json-stringify-range","errorCode":null,"errorMessage":"Invalid range: ${JSON.stringify(range)}","messagePattern":"Invalid range: (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"source/index.ts","lineNumber":686,"sourceCode":"\t\t&& (value as HTMLElement).nodeType === NODE_TYPE_ELEMENT\n\t\t&& isString((value as HTMLElement).nodeName)\n\t\t&& !isPlainObject(value)\n\t\t&& DOM_PROPERTIES_TO_CHECK.every(property => property in value);\n}\n\nexport function isInfinite<Input>(value: Input): value is NumericGuardResult<Input, PositiveInfinity | NegativeInfinity>;\nexport function isInfinite(value: unknown): boolean {\n\treturn value === Number.POSITIVE_INFINITY || value === Number.NEGATIVE_INFINITY;\n}\n\nexport function isInRange(value: number, range: number | [number, number]): value is number {\n\tif (isNumber(range)) {\n\t\treturn value >= Math.min(0, range) && value <= Math.max(range, 0);\n\t}\n\n\tif (isArray(range) && range.length === 2) {\n\t\tif (Number.isNaN(range[0]) || Number.isNaN(range[1])) {\n\t\t\tthrow new TypeError(`Invalid range: ${JSON.stringify(range)}`);\n\t\t}\n\n\t\treturn value >= Math.min(...range) && value <= Math.max(...range);\n\t}\n\n\tthrow new TypeError(`Invalid range: ${JSON.stringify(range)}`);\n}\n\nexport function isInt16Array(value: unknown): value is Int16Array {\n\treturn getObjectType(value) === 'Int16Array';\n}\n\nexport function isInt32Array(value: unknown): value is Int32Array {\n\treturn getObjectType(value) === 'Int32Array';\n}\n\nexport function isInt8Array(value: unknown): value is Int8Array {\n\treturn getObjectType(value) === 'Int8Array';","sourceCodeStart":668,"sourceCodeEnd":704,"githubUrl":"https://github.com/sindresorhus/is/blob/7821031c66cdeb7256a0feb2d506535f9e84fcaf/source/index.ts#L668-L704","documentation":"Thrown by `isInRange` (source/index.ts:679) when a two-element range array contains `NaN` in either position. Since comparisons against `NaN` are always false, a NaN bound would make the range check silently meaningless, so the library fails fast instead.","triggerScenarios":"Calling `isInRange(value, [min, max])` where `min` or `max` is `NaN` — e.g. `isInRange(5, [Number.parseInt('abc', 10), 10])` or a bound computed from `0/0` or a failed numeric conversion.","commonSituations":"Range bounds parsed from strings (env vars, query params, config) with `parseInt`/`Number` that fail and yield NaN; arithmetic on undefined fields (`undefined * 2`); spreadsheet/CSV imports with blank cells.","solutions":["Validate/parse the bounds before building the range; check `Number.isNaN` on each parsed bound and fail with a clearer domain error.","Trace where the NaN originates (usually a failed string→number conversion) and fix the source data or parsing.","Provide explicit defaults for optional bounds instead of letting them fall through as NaN."],"exampleFix":"// before\nconst max = Number(process.env.MAX); // env unset -> NaN\nisInRange(n, [0, max]); // throws\n\n// after\nconst max = Number(process.env.MAX ?? '100');\nif (Number.isNaN(max)) throw new Error('MAX must be numeric');\nisInRange(n, [0, max]);","handlingStrategy":"validation","validationCode":"function isValidRange(range) {\n  return Array.isArray(range) && range.length === 2 &&\n    range.every(n => typeof n === 'number' && !Number.isNaN(n)) &&\n    range[0] <= range[1];\n}\nif (!isValidRange(range)) throw new TypeError('Range must be [min, max] with min <= max');","typeGuard":"function isRange(v: unknown): v is [number, number] {\n  return Array.isArray(v) && v.length === 2 && v.every(n => typeof n === 'number') && v[0] <= v[1];\n}","tryCatchPattern":null,"preventionTips":["Always pass ranges as a two-element `[min, max]` array with `min <= max`","Normalize dynamic ranges before use: `const [lo, hi] = a <= b ? [a, b] : [b, a]`","Guard against NaN/undefined entries when the bounds come from user input or config"],"tags":["validation","range","nan","numbers"],"analyzedSha":"7821031c66cdeb7256a0feb2d506535f9e84fcaf","analyzedAt":"2026-07-31T18:34:06.268Z","schemaVersion":2}