ow
Version:
Function argument validation for humans
186 lines (178 loc) • 5.61 kB
JavaScript
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);
}
}