Skip to content

Commit ca83c0d

Browse files
committed
feat: add validation functions for type and value checking
1 parent 8ab236c commit ca83c0d

File tree

2 files changed

+174
-0
lines changed

2 files changed

+174
-0
lines changed

src/validate/conditions.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* // Null Checking
3+
* is.not.null(value) // value is not null or undefined
4+
* is.null(value) // value is null or undefined
5+
*
6+
* // Type Checking // value is not null and of the specified type
7+
* is.string(value) // value is a string
8+
* is.number(value) // value is a number
9+
* is.object(value) // value is an object
10+
* is.function(value) // value is a function
11+
* is.array(value) // value is an array
12+
* is.boolean(value) // value is a boolean
13+
* is.regexp(value) // value is a regular expression
14+
* is.date(value) // value is a date
15+
* is.instanceOf(value, constructor) // value is an instance of the constructor
16+
* is.symbol(value) // value is a symbol
17+
* is.type(value, type) // value is of the specified type
18+
*
19+
* // Value Checking // value is not null and of the specified type
20+
* is.equal(value, other) // value is equal to other
21+
* is.not.equal(value, other) // value is not equal to other
22+
* is.empty(value) // value is a string or an array and is empty
23+
* is.not.empty(value) // value is a string or an array and is not empty
24+
* is.truthy(value) // value is truthy
25+
* is.falsy(value) // value is falsy
26+
* is.between(value, min, max) // value is between min and max
27+
* is.not.between(value, min, max) // value is not between min and max
28+
* is.greater(value, other) // value is greater than other
29+
* is.less(value, other) // value is not greater than other
30+
* is.oneOf(value, array) // value is one of the elements in the array
31+
*/
32+
33+
const is = {
34+
null: (val) => val == null,
35+
not: {
36+
null: (val) => val != null
37+
},
38+
string: (val) => val != null && typeof val === 'string',
39+
number: (val) => val != null && typeof val === 'number',
40+
object: (val) => val != null && typeof val === 'object' && !Array.isArray(val),
41+
function: (val) => val != null && typeof val === 'function',
42+
array: (val) => Array.isArray(val),
43+
boolean: (val) => val === true || val === false,
44+
regexp: (val) => val instanceof RegExp,
45+
date: (val) => val instanceof Date,
46+
instanceOf: (val, ctor) => val instanceof ctor,
47+
symbol: (val) => typeof val === 'symbol',
48+
type: (val, type) => typeof val === type,
49+
equal: (val, other) => val === other,
50+
empty: (val) => (typeof val === 'string' || Array.isArray(val)) && val.length === 0,
51+
true: (val) => val === true || val === "true",
52+
false: (val) => val === false || val === "false",
53+
between: (val, min, max) => val > min && val < max,
54+
greater: (val, other) => val > other,
55+
less: (val, other) => val < other,
56+
oneOf: (val, arr) => arr.includes(val)
57+
};
58+
59+
// Negated checks
60+
is.not.equal = (val, other) => !is.equal(val, other);
61+
is.not.empty = (val) => !is.empty(val);
62+
is.not.between = (val, min, max) => !is.between(val, min, max);
63+
64+
export { is };
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import { assertEquals } from "https://deno.land/[email protected]/testing/asserts.ts";
2+
import { is } from "../../../src/validate/conditions.js";
3+
4+
Deno.test("is.null / is.not.null", () => {
5+
assertEquals(is.null(null), true);
6+
assertEquals(is.null(""), false);
7+
assertEquals(is.not.null(null), false);
8+
assertEquals(is.not.null("something"), true);
9+
});
10+
11+
Deno.test("is.string", () => {
12+
assertEquals(is.string("test"), true);
13+
assertEquals(is.string(123), false);
14+
});
15+
16+
Deno.test("is.number", () => {
17+
assertEquals(is.number(123), true);
18+
assertEquals(is.number("123"), false);
19+
});
20+
21+
Deno.test("is.object", () => {
22+
assertEquals(is.object({}), true);
23+
assertEquals(is.object([]), false);
24+
});
25+
26+
Deno.test("is.function", () => {
27+
assertEquals(is.function(() => {}), true);
28+
assertEquals(is.function({}), false);
29+
});
30+
31+
Deno.test("is.array", () => {
32+
assertEquals(is.array([]), true);
33+
assertEquals(is.array({}), false);
34+
});
35+
36+
Deno.test("is.boolean", () => {
37+
assertEquals(is.boolean(true), true);
38+
assertEquals(is.boolean("true"), false);
39+
});
40+
41+
Deno.test("is.regexp", () => {
42+
assertEquals(is.regexp(/abc/), true);
43+
assertEquals(is.regexp("abc"), false);
44+
});
45+
46+
Deno.test("is.date", () => {
47+
assertEquals(is.date(new Date()), true);
48+
assertEquals(is.date("2021-01-01"), false);
49+
});
50+
51+
Deno.test("is.instanceOf", () => {
52+
class Example {}
53+
assertEquals(is.instanceOf(new Example(), Example), true);
54+
assertEquals(is.instanceOf({}, Example), false);
55+
});
56+
57+
Deno.test("is.symbol", () => {
58+
assertEquals(is.symbol(Symbol()), true);
59+
assertEquals(is.symbol("not a symbol"), false);
60+
});
61+
62+
Deno.test("is.type", () => {
63+
assertEquals(is.type("hello", "string"), true);
64+
assertEquals(is.type(123, "string"), false);
65+
});
66+
67+
Deno.test("is.equal / is.not.equal", () => {
68+
assertEquals(is.equal(5, 5), true);
69+
assertEquals(is.equal(5, "5"), false);
70+
assertEquals(is.not.equal(5, 6), true);
71+
assertEquals(is.not.equal(5, 5), false);
72+
});
73+
74+
Deno.test("is.empty / is.not.empty", () => {
75+
assertEquals(is.empty(""), true);
76+
assertEquals(is.empty([]), true);
77+
assertEquals(is.empty("abc"), false);
78+
assertEquals(is.not.empty([]), false);
79+
assertEquals(is.not.empty(["item"]), true);
80+
});
81+
82+
Deno.test("is.truthy / is.falsy", () => {
83+
assertEquals(is.true(1 == 1), true);
84+
assertEquals(is.true("true"), true);
85+
assertEquals(is.true(1 == 0), false);
86+
assertEquals(is.true(null), false);
87+
88+
assertEquals(is.false(1 != 1), true);
89+
assertEquals(is.false("false"), true);
90+
assertEquals(is.false(1 == 0), true);
91+
assertEquals(is.false(null), false);
92+
});
93+
94+
Deno.test("is.between / is.not.between", () => {
95+
assertEquals(is.between(5, 1, 10), true);
96+
assertEquals(is.between(15, 1, 10), false);
97+
assertEquals(is.not.between(15, 1, 10), true);
98+
assertEquals(is.not.between(5, 1, 10), false);
99+
});
100+
101+
Deno.test("is.greater / is.less", () => {
102+
assertEquals(is.greater(10, 5), true);
103+
assertEquals(is.less(3, 4), true);
104+
});
105+
106+
Deno.test("is.oneOf", () => {
107+
assertEquals(is.oneOf("apple", ["apple", "banana"]), true);
108+
assertEquals(is.oneOf("pear", ["apple", "banana"]), false);
109+
});
110+

0 commit comments

Comments
 (0)