94
return { content: undefined, error: undefined };
95
}
97
>
getJSONSchema(): IJSONSchema {
98
return {};
99
}
101
>
102
>
export function vUndefined(): ValidatorBase<undefined> {
103
return new UndefinedValidator();
104
}
106
>
export function vUnknown(): ValidatorBase<unknown> {
107
return vUnchecked();
108
}
110
>
export type ObjectProperties = Record<string, unknown>;
111
>
112
>
export class Optional<T extends IValidator<unknown>> {
113
>
constructor(public readonly validator: T) { }
114
>
}
115
>
116
>
export function vOptionalProp<T>(validator: IValidator<T>): Optional<IValidator<T>> {
117
return new Optional(validator);
118
}
120
>
type ExtractOptionalKeys<T> = {
121
>
[K in keyof T]: T[K] extends Optional<IValidator<unknown>> ? K : never;
122
>
}[keyof T];
123
>
124
>
type ExtractRequiredKeys<T> = {
125
>
[K in keyof T]: T[K] extends Optional<IValidator<unknown>> ? never : K;
126
>
}[keyof T];
127
>
128
>
export type vObjType<T extends Record<string, IValidator<unknown> | Optional<IValidator<unknown>>>> = {
129
>
[K in ExtractRequiredKeys<T>]: T[K] extends IValidator<infer U> ? U : never;
130
>
} & {
131
>
[K in ExtractOptionalKeys<T>]?: T[K] extends Optional<IValidator<infer U>> ? U : never;
132
>
};
133
>
134
>
class ObjValidator<T extends Record<string, IValidator<unknown> | Optional<IValidator<unknown>>>> extends ValidatorBase<vObjType<T>> {
135
>
constructor(private readonly properties: T) {
136
super();
137
}
139
>
validate(content: unknown): { content: vObjType<T>; error: undefined } | { content: undefined; error: ValidationError } {
140
if (typeof content !== 'object' || content === null) {
141
return { content: undefined, error: { message: 'Expected object' } };