handy online tools for AT Protocol
boat.kelinci.net
atproto
bluesky
atcute
typescript
solidjs
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>;