-
Notifications
You must be signed in to change notification settings - Fork 5
/
string.ts
84 lines (72 loc) · 1.87 KB
/
string.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import {
createFail,
InternalRuntype,
isFail,
propagateFail,
Runtype,
setupInternalRuntype,
} from './runtype'
const stringRuntype = setupInternalRuntype<string>(
(v, failOrThrow) => {
if (typeof v === 'string') {
return v
}
return createFail(failOrThrow, 'expected a string', v)
},
{ isPure: true },
)
/**
* A string.
*
* Options:
*
* trim .. when true, remove leading and trailing spaces from the string
* trimming is applied before the optional length and regex checks
* minLength .. reject strings that are shorter than that
* maxLength .. reject strings that are longer than that
* match .. reject strings that do not match against provided RegExp
*/
export function string(options?: {
trim?: boolean
minLength?: number
maxLength?: number
match?: RegExp
}): Runtype<string> {
if (!options) {
return stringRuntype
}
const { minLength, maxLength, trim, match } = options
const isPure = !trim // trim modifies the string
return setupInternalRuntype(
(v, failOrThrow) => {
const r: string = (stringRuntype as InternalRuntype<any>)(v, failOrThrow)
if (isFail(r)) {
return propagateFail(failOrThrow, r, v)
}
const s = trim ? r.trim() : r
if (minLength !== undefined && s.length < minLength) {
return createFail(
failOrThrow,
`expected the string length to be at least ${minLength}`,
v,
)
}
if (maxLength !== undefined && s.length > maxLength) {
return createFail(
failOrThrow,
`expected the string length to not exceed ${maxLength}`,
v,
)
}
if (match !== undefined && !match.test(s)) {
return createFail(
failOrThrow,
`expected the string to match ${match}`,
v,
)
}
return s
},
{ isPure },
)
}