UNPKG

skex

Version:

A modern schema validation and filtration library with great TypeScript support.

145 lines (82 loc) 2.88 kB
/* IMPORT */ import Primitive from './primitive'; import Nillable from './nillable'; import Nullable from './nullable'; import Optional from './optional'; import Registry from '../registry'; import {anyOf, noneOf} from '../tests'; import {isFinite, isInteger, isNaN, isNumber, resolve} from '../utils'; import type {NumberState, FunctionMaybe, Tests} from '../types'; /* MAIN */ class Number extends Primitive<number, number, NumberState<number, number>> { /* PUBLIC API */ filter ( value: unknown, defaultable: false, quiet: true ): boolean; filter ( value: unknown, defaultable?: boolean, quiet?: false ): number; filter ( value: unknown, defaultable?: boolean, quiet?: boolean ): number | boolean; filter ( value: unknown, defaultable: boolean = true, quiet: boolean = false ): number | boolean { return super._filter ( value, TESTS, defaultable, quiet ); } test ( value: unknown ): value is number { return isNumber ( value ) && !isNaN ( value ) && super._test ( value, TESTS ); } /* GENERAL TESTS API */ anyOf ( values: number[] ): Number { return this.with ({ anyOf: values }); } noneOf ( values: number[] ): Number { return this.with ({ noneOf: values }); } nillable (): Nillable<number> { return new Nillable ({ nillable: this }); } nullable (): Nullable<number> { return new Nullable ({ nullable: this }); } optional (): Optional<number> { return new Optional ({ optional: this }); } /* SPECIFIC TESTS API */ finite (): Number { return this.with ({ finite: true }); } gt ( value: FunctionMaybe<number> ): Number { return this.with ({ gt: value }); } gte ( value: FunctionMaybe<number> ): Number { return this.with ({ gte: value }); } integer (): Number { return this.with ({ integer: true }); } lt ( value: FunctionMaybe<number> ): Number { return this.with ({ lt: value }); } lte ( value: FunctionMaybe<number> ): Number { return this.with ({ lte: value }); } max ( value: FunctionMaybe<number> ): Number { return this.with ({ lte: value }); } min ( value: FunctionMaybe<number> ): Number { return this.with ({ gte: value }); } multipleOf ( value: FunctionMaybe<number> ): Number { return this.with ({ multipleOf: value }); } } /* UTILITIES */ const TESTS: Tests<number, NumberState<number, number>> = { anyOf, noneOf, finite: value => isFinite ( value ), gt: ( value, gt ) => value > resolve ( gt ), gte: ( value, gte ) => value >= resolve ( gte ), integer: value => isInteger ( value ), lt: ( value, lt ) => value < resolve ( lt ), lte: ( value, lte ) => value <= resolve ( lte ), multipleOf: ( value, multipleOf ) => ( value % resolve ( multipleOf ) ) === 0 }; /* INIT */ Registry.register ( 'number', Number ); /* EXPORT */ export default Number;