UNPKG

ow

Version:

Function argument validation for humans

186 lines (178 loc) 5.61 kB
import is from '@sindresorhus/is'; import { Predicate } from './predicate.js'; export class NumberPredicate extends Predicate { /** @hidden */ constructor(options) { super('number', options); } /** Test a number to be in a specified range. @param start - Start of the range. @param end - End of the range. */ inRange(start, end) { return this.addValidator({ message: (value, label) => `Expected ${label} to be in range [${start}..${end}], got ${value}`, validator: value => is.inRange(value, [start, end]), }); } /** Test a number to be greater than the provided value. @param number - Minimum value. */ greaterThan(number) { return this.addValidator({ message: (value, label) => `Expected ${label} to be greater than ${number}, got ${value}`, validator: value => value > number, }); } /** Test a number to be greater than or equal to the provided value. @param number - Minimum value. */ greaterThanOrEqual(number) { return this.addValidator({ message: (value, label) => `Expected ${label} to be greater than or equal to ${number}, got ${value}`, validator: value => value >= number, }); } /** Test a number to be less than the provided value. @param number - Maximum value. */ lessThan(number) { return this.addValidator({ message: (value, label) => `Expected ${label} to be less than ${number}, got ${value}`, validator: value => value < number, }); } /** Test a number to be less than or equal to the provided value. @param number - Minimum value. */ lessThanOrEqual(number) { return this.addValidator({ message: (value, label) => `Expected ${label} to be less than or equal to ${number}, got ${value}`, validator: value => value <= number, }); } /** Test a number to be equal to a specified number. @param expected - Expected value to match. */ equal(expected) { return this.addValidator({ message: (value, label) => `Expected ${label} to be equal to ${expected}, got ${value}`, validator: value => value === expected, }); } /** Test if a number is an element of the provided list. @param list - List of possible values. */ oneOf(list) { return this.addValidator({ message(value, label) { let printedList = JSON.stringify(list); if (list.length > 10) { const overflow = list.length - 10; printedList = JSON.stringify(list.slice(0, 10)).replace(/]$/, `,…+${overflow} more]`); } return `Expected ${label} to be one of \`${printedList}\`, got ${value}`; }, validator: value => list.includes(value), }); } /** Test a number to be an integer. */ get integer() { return this.addValidator({ message: (value, label) => `Expected ${label} to be an integer, got ${value}`, validator: value => is.integer(value), }); } /** Test a number to be finite. */ get finite() { return this.addValidator({ message: (value, label) => `Expected ${label} to be finite, got ${value}`, validator: value => !is.infinite(value), }); } /** Test a number to be infinite. */ get infinite() { return this.addValidator({ message: (value, label) => `Expected ${label} to be infinite, got ${value}`, validator: value => is.infinite(value), }); } /** Test a number to be positive. */ get positive() { return this.addValidator({ message: (value, label) => `Expected ${label} to be positive, got ${value}`, validator: value => value > 0, }); } /** Test a number to be negative. */ get negative() { return this.addValidator({ message: (value, label) => `Expected ${label} to be negative, got ${value}`, validator: value => value < 0, }); } /** Test a number to be an integer or infinite. */ get integerOrInfinite() { return this.addValidator({ message: (value, label) => `Expected ${label} to be an integer or infinite, got ${value}`, validator: value => is.integer(value) || is.infinite(value), }); } /** Test a number to be in a valid range for a 8-bit unsigned integer. */ get uint8() { return this.integer.inRange(0, 255); } /** Test a number to be in a valid range for a 16-bit unsigned integer. */ get uint16() { return this.integer.inRange(0, 65_535); } /** Test a number to be in a valid range for a 32-bit unsigned integer. */ get uint32() { return this.integer.inRange(0, 4_294_967_295); } /** Test a number to be in a valid range for a 8-bit signed integer. */ get int8() { return this.integer.inRange(-128, 127); } /** Test a number to be in a valid range for a 16-bit signed integer. */ get int16() { return this.integer.inRange(-32_768, 32_767); } /** Test a number to be in a valid range for a 32-bit signed integer. */ get int32() { return this.integer.inRange(-2_147_483_648, 2_147_483_647); } }