{"id":"c917e1bf3d5942ea","repo":"sindresorhus/is","slug":"expected-value-which-is-positive-integer-receiv","errorCode":null,"errorMessage":"Expected value which is `positive integer`, received value of type `${is(value)}`.","messagePattern":"Expected value which is `positive integer`, received value of type `(.+?)`\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"source/index.ts","lineNumber":1842,"sourceCode":"\t\tthrow new TypeError(message ?? typeErrorMessage('Observable', value));\n\t}\n}\n\nexport function assertOddInteger(value: number, message?: string): asserts value is number {\n\tif (!isOddInteger(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('odd integer', value));\n\t}\n}\n\nexport function assertPlainObject<Value = unknown>(value: unknown, message?: string): asserts value is Record<PropertyKey, Value> {\n\tif (!isPlainObject(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('plain object', value));\n\t}\n}\n\nexport function assertPositiveInteger(value: unknown, message?: string): asserts value is number {\n\tif (!isPositiveInteger(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('positive integer', value));\n\t}\n}\n\nexport function assertPositiveNumber(value: unknown, message?: string): asserts value is number {\n\tif (!isPositiveNumber(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('positive number', value));\n\t}\n}\n\nexport function assertPrimitive(value: unknown, message?: string): asserts value is Primitive {\n\tif (!isPrimitive(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('primitive', value));\n\t}\n}\n\nexport function assertPromise<T = unknown>(value: unknown, message?: string): asserts value is Promise<T> {\n\tif (!isPromise(value)) {\n\t\tthrow new TypeError(message ?? typeErrorMessage('Promise', value));","sourceCodeStart":1824,"sourceCodeEnd":1860,"githubUrl":"https://github.com/sindresorhus/is/blob/7821031c66cdeb7256a0feb2d506535f9e84fcaf/source/index.ts#L1824-L1860","documentation":"Thrown by `assert.positiveInteger()` when the value is not an integer strictly greater than zero. Both conditions are checked at runtime: non-numbers, floats, zero, negative integers, NaN, and Infinity all fail. Used to guard counts, sizes, IDs, and limits that must be whole and positive.","triggerScenarios":"Calling `assert.positiveInteger(value)` with 0 (zero is not positive), -1, 2.5, NaN, Infinity, a numeric string like '5', or undefined for an unset parameter.","commonSituations":"Pagination/limit parameters arriving as strings from query strings; a default of 0 used where a minimum of 1 is required; array-length math producing 0 for empty inputs; NaN from parsing a missing env var like `Number(process.env.WORKERS)`.","solutions":["If zero is legitimately valid in your domain, use `assert.integer()` plus a `>= 0` check (or the library's non-negative variant) instead.","Convert string inputs with `Number.parseInt(raw, 10)` before asserting, and handle NaN from failed parses.","Apply a floor/default before asserting: `const limit = Math.max(1, Math.trunc(requested))`.","Trace where 0 or a negative slipped in — often an empty collection or an uninitialized counter."],"exampleFix":"// before\nconst limit = Number(req.query.limit); // '0' or undefined → 0 or NaN\nassert.positiveInteger(limit);\n// after\nconst limit = Math.max(1, Number.parseInt(req.query.limit ?? '10', 10) || 10);\nassert.positiveInteger(limit);","handlingStrategy":"validation","validationCode":"if (!Number.isInteger(value) || value <= 0) {\n  throw new RangeError(`Expected positive integer, got ${value}`);\n}","typeGuard":"function isPositiveInteger(value: unknown): value is number {\n  return typeof value === 'number' && Number.isInteger(value) && value > 0;\n}","tryCatchPattern":"try {\n  ow(value, ow.number.positive.integer);\n} catch (error) {\n  if (error instanceof ArgumentError) {\n    throw new RangeError(`Count/size must be a positive integer: ${error.message}`);\n  }\n  throw error;\n}","preventionTips":["Positive means > 0 — zero fails; handle the zero case explicitly before calling","Parse string inputs with Number.parseInt(s, 10) and verify the result with Number.isInteger","Guard computed indexes/counts: division and averaging silently produce floats","Clamp or reject before the call rather than relying on the library error for user-facing messages"],"tags":["type-check","assertion","number-validation","integer","input-validation"],"analyzedSha":"7821031c66cdeb7256a0feb2d506535f9e84fcaf","analyzedAt":"2026-07-31T18:34:06.268Z","schemaVersion":2}