handy online tools for AT Protocol boat.kelinci.net
atproto bluesky atcute typescript solidjs
at trunk 26 lines 835 B view raw
1import * as v from '@badrap/valita'; 2 3export type ToValidator<T> = T extends readonly [infer Head, ...infer Rest] 4 ? Rest extends [] 5 ? v.TupleType<[ToValidator<Head>]> 6 : v.TupleType<[ToValidator<Head>, ...ToValidatorTuple<Rest>]> 7 : T extends ReadonlyArray<infer E> 8 ? v.ArrayType<ToValidator<E>> 9 : T extends object 10 ? ToObjectValidator<T> 11 : v.Type<T>; 12 13// Helper type for converting tuple types 14type ToValidatorTuple<T extends readonly unknown[]> = T extends readonly [infer Head, ...infer Rest] 15 ? Rest extends [] 16 ? [ToValidator<Head>] 17 : [ToValidator<Head>, ...ToValidatorTuple<Rest>] 18 : []; 19 20// Helper type for converting object types 21type ToObjectValidator<T extends object> = v.ObjectType< 22 { 23 [K in keyof T]-?: undefined extends T[K] ? v.Optional<Exclude<T[K], undefined>> : ToValidator<T[K]>; 24 }, 25 undefined 26>;