-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
schema-types.ts
197 lines (182 loc) · 4.96 KB
/
schema-types.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/**
* All schemas.
*/
export type Schema =
| Schema.Any
| Schema.Array<Schema>
| Schema.BigInt
| Schema.Boolean
| Schema.Class<any>
| Schema.Custom<any>
| Schema.Enum<any>
| Schema.Function
| Schema.Number
| Schema.Object<Record<string, Schema>, any, boolean>
| Schema.Record<Schema>
| Schema.String
| Schema.Symbol
| Schema.Tuple<readonly Schema[]>
| Schema.Union<Schema>
export namespace Schema {
/**
* The schema that allows any values.
*/
export interface Any {
/** The schema type. */
readonly type: "any"
}
/**
* The schema for arrays.
*/
export interface Array<T extends Schema> {
/** The schema type. */
readonly type: "array"
/** The schema of elements. */
readonly elements: T
/** The maximum length. */
readonly maxLength?: number
/** The minimum length. */
readonly minLength?: number
/** The flag to disallow duplicated values. */
readonly unique?: boolean
}
/**
* The schema for bigint values.
*/
export interface BigInt {
/** The schema type. */
readonly type: "bigint"
/** The maximum value. */
readonly maxValue?: bigint
/** The minimum value. */
readonly minValue?: bigint
}
/**
* The schema for arrays.
*/
export interface Boolean {
/** The schema type. */
readonly type: "boolean"
}
/**
* The schema for class instances.
*/
export interface Class<T> {
/** The schema type. */
readonly type: "class"
/** The constructor of allowed instances. */
readonly constructor: {
new (...args: any[]): T
prototype: T
name: string
}
}
/**
* The schema for user-defined checks.
*/
export interface Custom<T> {
/** The schema type. */
readonly type: "custom"
/** The name to show in error messages. */
readonly name: string
/** The check logic. */
readonly check: (x: unknown) => x is T
}
/**
* The schema for any of listed values.
*/
export interface Enum<T> {
/** The schema type. */
readonly type: "enum"
/** The allowed values. */
readonly values: readonly T[]
}
/**
* The schema for functions.
*/
export interface Function {
/** The schema type. */
readonly type: "function"
}
/**
* The schema for numbers.
*/
export interface Number {
/** The schema type. */
readonly type: "number"
/** The flag to allow `Infinity` and `-Infinity`. Infinities are disallowed by default. */
readonly allowInfinity?: boolean
/** The flag to allow `NaN`. `NaN` is disallowed by default. */
readonly allowNaN?: boolean
/** The flag to disallow non-integer values. */
readonly intOnly?: boolean
/** The maximum value. */
readonly maxValue?: number
/** The minimum value. */
readonly minValue?: number
}
/**
* The schema for plain objects.
*/
export interface Object<
TProperties extends globalThis.Record<string | number, Schema>,
TRequired extends keyof TProperties,
TAllowUnknown extends boolean
> {
/** The schema type. */
readonly type: "object"
/** The flag to allow unknown properties. */
readonly allowUnknown?: TAllowUnknown
/** The schema of known properties. */
readonly properties: TProperties
/** The name of required properties. */
readonly required?: readonly TRequired[]
}
/**
* The schema for record objects.
*/
export interface Record<T extends Schema> {
/** The schema type. */
readonly type: "record"
/** The schema of known properties. */
readonly properties: T
}
/**
* The schema for strings.
*/
export interface String {
/** The schema type. */
readonly type: "string"
/** The maximum length. */
readonly maxLength?: number
/** The minimum length. */
readonly minLength?: number
/** The allowed pattern. */
readonly pattern?: globalThis.RegExp
}
/**
* The schema for symbols.
*/
export interface Symbol {
/** The schema type. */
readonly type: "symbol"
}
/**
* The schema for tuples.
*/
export interface Tuple<T extends readonly Schema[]> {
/** The schema type. */
readonly type: "tuple"
/** The schema of elements */
readonly elements: T
}
/**
* The schema for satisfying any of listed schemas.
*/
export interface Union<T extends Schema> {
/** The schema type. */
readonly type: "union"
/** The schemas of allowed values. */
readonly schemas: readonly T[]
}
}