-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvalidators.ts
59 lines (50 loc) · 1.48 KB
/
validators.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import Joi, { type Schema } from 'joi';
// * types
import type { Resolver } from './languages';
const validate = (input: unknown, schema: Schema) => {
const { error } = schema.validate(input, { abortEarly: true });
if (error) throw new Error(error.details[0].message);
};
export const resolverValidator = (resolver: Resolver) => {
if (typeof resolver === 'string') {
return validate(resolver, Joi.string().min(1).label('resolver'));
}
validate(
resolver,
Joi.object().keys().min(1).message('"resolver" can not be an empty object').label('resolver')
);
validate(
resolver,
Joi.object({
inline: Joi.string().min(1).label('resolver.inline'),
block: Joi.string().min(1).label('resolver.block'),
})
);
};
export const stringLiteralsValidator = (stringLiterals?: string[]) => {
validate(
stringLiterals,
Joi.array()
.min(1)
.items(
Joi.string()
.min(1)
.messages({ 'string.empty': 'empty strings are not allowed as string literlas' })
)
.label('stringLiterals')
);
};
export const excludeValidator = (exclude?: RegExp[]) => {
const errorMessage = 'only RegExp objects are allowed as exclude items';
validate(
exclude,
Joi.array()
.items(
Joi.object()
.instance(RegExp)
.messages({ 'object.base': errorMessage, 'object.instance': errorMessage })
)
.min(1)
.messages({ 'array.min': '"exclude" must contain at least 1 item' })
);
};