UNPKG

5.61 kBJavaScriptView Raw
1import is from '@sindresorhus/is';
2import { Predicate } from './predicate.js';
3export class NumberPredicate extends Predicate {
4 /**
5 @hidden
6 */
7 constructor(options) {
8 super('number', options);
9 }
10 /**
11 Test a number to be in a specified range.
12
13 @param start - Start of the range.
14 @param end - End of the range.
15 */
16 inRange(start, end) {
17 return this.addValidator({
18 message: (value, label) => `Expected ${label} to be in range [${start}..${end}], got ${value}`,
19 validator: value => is.inRange(value, [start, end]),
20 });
21 }
22 /**
23 Test a number to be greater than the provided value.
24
25 @param number - Minimum value.
26 */
27 greaterThan(number) {
28 return this.addValidator({
29 message: (value, label) => `Expected ${label} to be greater than ${number}, got ${value}`,
30 validator: value => value > number,
31 });
32 }
33 /**
34 Test a number to be greater than or equal to the provided value.
35
36 @param number - Minimum value.
37 */
38 greaterThanOrEqual(number) {
39 return this.addValidator({
40 message: (value, label) => `Expected ${label} to be greater than or equal to ${number}, got ${value}`,
41 validator: value => value >= number,
42 });
43 }
44 /**
45 Test a number to be less than the provided value.
46
47 @param number - Maximum value.
48 */
49 lessThan(number) {
50 return this.addValidator({
51 message: (value, label) => `Expected ${label} to be less than ${number}, got ${value}`,
52 validator: value => value < number,
53 });
54 }
55 /**
56 Test a number to be less than or equal to the provided value.
57
58 @param number - Minimum value.
59 */
60 lessThanOrEqual(number) {
61 return this.addValidator({
62 message: (value, label) => `Expected ${label} to be less than or equal to ${number}, got ${value}`,
63 validator: value => value <= number,
64 });
65 }
66 /**
67 Test a number to be equal to a specified number.
68
69 @param expected - Expected value to match.
70 */
71 equal(expected) {
72 return this.addValidator({
73 message: (value, label) => `Expected ${label} to be equal to ${expected}, got ${value}`,
74 validator: value => value === expected,
75 });
76 }
77 /**
78 Test if a number is an element of the provided list.
79
80 @param list - List of possible values.
81 */
82 oneOf(list) {
83 return this.addValidator({
84 message(value, label) {
85 let printedList = JSON.stringify(list);
86 if (list.length > 10) {
87 const overflow = list.length - 10;
88 printedList = JSON.stringify(list.slice(0, 10)).replace(/]$/, `,…+${overflow} more]`);
89 }
90 return `Expected ${label} to be one of \`${printedList}\`, got ${value}`;
91 },
92 validator: value => list.includes(value),
93 });
94 }
95 /**
96 Test a number to be an integer.
97 */
98 get integer() {
99 return this.addValidator({
100 message: (value, label) => `Expected ${label} to be an integer, got ${value}`,
101 validator: value => is.integer(value),
102 });
103 }
104 /**
105 Test a number to be finite.
106 */
107 get finite() {
108 return this.addValidator({
109 message: (value, label) => `Expected ${label} to be finite, got ${value}`,
110 validator: value => !is.infinite(value),
111 });
112 }
113 /**
114 Test a number to be infinite.
115 */
116 get infinite() {
117 return this.addValidator({
118 message: (value, label) => `Expected ${label} to be infinite, got ${value}`,
119 validator: value => is.infinite(value),
120 });
121 }
122 /**
123 Test a number to be positive.
124 */
125 get positive() {
126 return this.addValidator({
127 message: (value, label) => `Expected ${label} to be positive, got ${value}`,
128 validator: value => value > 0,
129 });
130 }
131 /**
132 Test a number to be negative.
133 */
134 get negative() {
135 return this.addValidator({
136 message: (value, label) => `Expected ${label} to be negative, got ${value}`,
137 validator: value => value < 0,
138 });
139 }
140 /**
141 Test a number to be an integer or infinite.
142 */
143 get integerOrInfinite() {
144 return this.addValidator({
145 message: (value, label) => `Expected ${label} to be an integer or infinite, got ${value}`,
146 validator: value => is.integer(value) || is.infinite(value),
147 });
148 }
149 /**
150 Test a number to be in a valid range for a 8-bit unsigned integer.
151 */
152 get uint8() {
153 return this.integer.inRange(0, 255);
154 }
155 /**
156 Test a number to be in a valid range for a 16-bit unsigned integer.
157 */
158 get uint16() {
159 return this.integer.inRange(0, 65_535);
160 }
161 /**
162 Test a number to be in a valid range for a 32-bit unsigned integer.
163 */
164 get uint32() {
165 return this.integer.inRange(0, 4_294_967_295);
166 }
167 /**
168 Test a number to be in a valid range for a 8-bit signed integer.
169 */
170 get int8() {
171 return this.integer.inRange(-128, 127);
172 }
173 /**
174 Test a number to be in a valid range for a 16-bit signed integer.
175 */
176 get int16() {
177 return this.integer.inRange(-32_768, 32_767);
178 }
179 /**
180 Test a number to be in a valid range for a 32-bit signed integer.
181 */
182 get int32() {
183 return this.integer.inRange(-2_147_483_648, 2_147_483_647);
184 }
185}