-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtypes.ts
More file actions
218 lines (191 loc) · 6.58 KB
/
types.ts
File metadata and controls
218 lines (191 loc) · 6.58 KB
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/**
* Standard Schema type definitions.
*
* These interfaces are copied from the Standard Schema specification
* (https://standardschema.dev) to avoid external dependencies.
*
* @see https://github.com/standard-schema/standard-schema
*/
// #########################
// ### Standard Typed ###
// #########################
/**
* The Standard Typed interface. This is a base type extended by other specs.
*/
export type StandardTypedV1<Input = unknown, Output = Input> = {
/** The Standard properties. */
readonly "~standard": StandardTypedV1.Props<Input, Output>;
};
export declare namespace StandardTypedV1 {
/** The Standard Typed properties interface. */
type Props<Input = unknown, Output = Input> = {
/** The version number of the standard. */
readonly version: 1;
/** The vendor name of the schema library. */
readonly vendor: string;
/** Inferred types associated with the schema. */
readonly types?: Types<Input, Output> | undefined;
};
/** The Standard Typed types interface. */
type Types<Input = unknown, Output = Input> = {
/** The input type of the schema. */
readonly input: Input;
/** The output type of the schema. */
readonly output: Output;
};
/** Infers the input type of a Standard Typed. */
type InferInput<Schema extends StandardTypedV1> = NonNullable<
Schema["~standard"]["types"]
>["input"];
/** Infers the output type of a Standard Typed. */
type InferOutput<Schema extends StandardTypedV1> = NonNullable<
Schema["~standard"]["types"]
>["output"];
}
// ##########################
// ### Standard Schema ###
// ##########################
/**
* The Standard Schema interface.
*
* Extends StandardTypedV1 with a validate function for runtime validation.
*/
export type StandardSchemaV1<Input = unknown, Output = Input> = {
/** The Standard Schema properties. */
readonly "~standard": StandardSchemaV1.Props<Input, Output>;
};
export declare namespace StandardSchemaV1 {
/** The Standard Schema properties interface. */
type Props<Input = unknown, Output = Input> = StandardTypedV1.Props<
Input,
Output
> & {
/** Validates unknown input values. */
readonly validate: (
value: unknown,
options?: StandardSchemaV1.Options | undefined,
) => Result<Output> | Promise<Result<Output>>;
};
/** The result interface of the validate function. */
type Result<Output> = SuccessResult<Output> | FailureResult;
/** The result interface if validation succeeds. */
type SuccessResult<Output> = {
/** The typed output value. */
readonly value: Output;
/** A falsy value for `issues` indicates success. */
readonly issues?: undefined;
};
/** Options for the validate function. */
type Options = {
/** Explicit support for additional vendor-specific parameters, if needed. */
readonly libraryOptions?: Record<string, unknown> | undefined;
};
/** The result interface if validation fails. */
type FailureResult = {
/** The issues of failed validation. */
readonly issues: ReadonlyArray<Issue>;
};
/** The issue interface of the failure output. */
type Issue = {
/** The error message of the issue. */
readonly message: string;
/** The path of the issue, if any. */
readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
};
/** The path segment interface of the issue. */
type PathSegment = {
/** The key representing a path segment. */
readonly key: PropertyKey;
};
/** Infers the input type of a Standard Schema. */
type InferInput<Schema extends StandardTypedV1> =
StandardTypedV1.InferInput<Schema>;
/** Infers the output type of a Standard Schema. */
type InferOutput<Schema extends StandardTypedV1> =
StandardTypedV1.InferOutput<Schema>;
}
// ###############################
// ### Standard JSON Schema ###
// ###############################
/**
* The Standard JSON Schema interface.
*
* Extends StandardTypedV1 with methods for generating JSON Schema.
*/
export type StandardJSONSchemaV1<Input = unknown, Output = Input> = {
/** The Standard JSON Schema properties. */
readonly "~standard": StandardJSONSchemaV1.Props<Input, Output>;
};
export declare namespace StandardJSONSchemaV1 {
/** The Standard JSON Schema properties interface. */
type Props<Input = unknown, Output = Input> = StandardTypedV1.Props<
Input,
Output
> & {
/** Methods for generating the input/output JSON Schema. */
readonly jsonSchema: StandardJSONSchemaV1.Converter;
};
/** The Standard JSON Schema converter interface. */
type Converter = {
/** Converts the input type to JSON Schema. May throw if conversion is not supported. */
readonly input: (
options: StandardJSONSchemaV1.Options,
) => Record<string, unknown>;
/** Converts the output type to JSON Schema. May throw if conversion is not supported. */
readonly output: (
options: StandardJSONSchemaV1.Options,
) => Record<string, unknown>;
};
/**
* The target version of the generated JSON Schema.
*
* It is *strongly recommended* that implementers support `"draft-2020-12"` and `"draft-07"`,
* as they are both in wide use. All other targets can be implemented on a best-effort basis.
* Libraries should throw if they don't support a specified target.
*
* The `"openapi-3.0"` target is intended as a standardized specifier for OpenAPI 3.0
* which is a superset of JSON Schema `"draft-04"`.
*/
type Target =
| "draft-2020-12"
| "draft-07"
| "openapi-3.0"
// Accepts any string for future targets while preserving autocomplete
| (string & {});
/** The options for the input/output methods. */
type Options = {
/** Specifies the target version of the generated JSON Schema. */
readonly target: Target;
/** Explicit support for additional vendor-specific parameters, if needed. */
readonly libraryOptions?: Record<string, unknown> | undefined;
};
/** Infers the input type of a Standard JSON Schema. */
type InferInput<Schema extends StandardTypedV1> =
StandardTypedV1.InferInput<Schema>;
/** Infers the output type of a Standard JSON Schema. */
type InferOutput<Schema extends StandardTypedV1> =
StandardTypedV1.InferOutput<Schema>;
}
/**
* Checks if a schema has validation capability.
*/
export function hasValidate<T extends StandardTypedV1>(
schema: T,
): schema is T & StandardSchemaV1 {
return (
"validate" in schema["~standard"] &&
typeof schema["~standard"].validate === "function"
);
}
/**
* Checks if a schema has JSON Schema generation capability.
*/
export function hasJsonSchema<T extends StandardTypedV1>(
schema: T,
): schema is T & StandardJSONSchemaV1 {
return (
"jsonSchema" in schema["~standard"] &&
typeof schema["~standard"].jsonSchema === "object" &&
schema["~standard"].jsonSchema !== null
);
}