1 | import is from '@sindresorhus/is';
|
2 | import { Predicate } from './predicate.js';
|
3 | export class NumberPredicate extends Predicate {
|
4 | |
5 |
|
6 |
|
7 | constructor(options) {
|
8 | super('number', options);
|
9 | }
|
10 | |
11 |
|
12 |
|
13 |
|
14 |
|
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 |
|
24 |
|
25 |
|
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 |
|
35 |
|
36 |
|
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 |
|
46 |
|
47 |
|
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 |
|
57 |
|
58 |
|
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 |
|
68 |
|
69 |
|
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 |
|
79 |
|
80 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
151 |
|
152 | get uint8() {
|
153 | return this.integer.inRange(0, 255);
|
154 | }
|
155 | |
156 |
|
157 |
|
158 | get uint16() {
|
159 | return this.integer.inRange(0, 65_535);
|
160 | }
|
161 | |
162 |
|
163 |
|
164 | get uint32() {
|
165 | return this.integer.inRange(0, 4_294_967_295);
|
166 | }
|
167 | |
168 |
|
169 |
|
170 | get int8() {
|
171 | return this.integer.inRange(-128, 127);
|
172 | }
|
173 | |
174 |
|
175 |
|
176 | get int16() {
|
177 | return this.integer.inRange(-32_768, 32_767);
|
178 | }
|
179 | |
180 |
|
181 |
|
182 | get int32() {
|
183 | return this.integer.inRange(-2_147_483_648, 2_147_483_647);
|
184 | }
|
185 | }
|