|
1 | | -export declare type Discriminate<T, TField extends keyof T, TValue extends T[TField]> = T extends { |
| 1 | +declare type Discriminate<T, TField extends keyof T, TValue extends T[TField]> = T extends { |
2 | 2 | [field in TField]: TValue; |
3 | 3 | } ? T : never; |
4 | | -export declare type SDEnum<T extends string> = { |
| 4 | +export declare type SafeSchemaEnum<T extends string> = { |
5 | 5 | [key in T]: number; |
6 | 6 | } & { |
7 | 7 | flag: 'enum'; |
8 | 8 | }; |
9 | | -export declare type SDBitmask<T> = { |
| 9 | +export declare type SafeSchemaBitmask<T> = { |
10 | 10 | [keyT in keyof T]-?: number; |
11 | 11 | } & { |
12 | 12 | flag: 'bitmask'; |
13 | 13 | }; |
14 | | -export declare type SDArray<TElements> = { |
| 14 | +export declare type SafeSchemaArray<TElements> = { |
15 | 15 | elements: TElements; |
16 | 16 | flag: 'array-uint8' | 'array-uint16'; |
17 | 17 | }; |
18 | | -export declare type SDTypeLookupElements<TElements extends { |
| 18 | +export declare type SafeSchemaTypeLookupElements<TElements extends { |
19 | 19 | type: string; |
20 | 20 | }> = { |
21 | 21 | elements: { |
22 | | - [key in TElements['type']]: SDTypeLookup<TElements, key>; |
| 22 | + [key in TElements['type']]: SafeSchemaTypeLookup<TElements, key>; |
23 | 23 | }; |
24 | 24 | flag: 'type-lookup'; |
25 | 25 | }; |
26 | | -export declare type SDTypeLookup<TItem extends { |
| 26 | +export declare type SafeSchemaTypeLookup<TItem extends { |
27 | 27 | type: string; |
28 | | -}, TKey extends TItem['type']> = SDSimpleObject<Omit<Discriminate<TItem, 'type', TKey>, 'type'>>; |
29 | | -export declare type SDTypeElement<TItem extends { |
| 28 | +}, TKey extends TItem['type']> = SafeSchemaSimpleObject<Omit<Discriminate<TItem, 'type', TKey>, 'type'>>; |
| 29 | +export declare type SafeSchemaTypeElement<TItem extends { |
30 | 30 | type: string; |
31 | | -}> = SDSimpleObject<Omit<TItem, 'type'>>; |
32 | | -export declare type SDSimpleObject<TItem> = { |
| 31 | +}> = SafeSchemaSimpleObject<Omit<TItem, 'type'>>; |
| 32 | +export declare type SafeSchemaSimpleObject<TItem> = { |
33 | 33 | [keyT in OptionalPropertyOf<TItem>]: { |
34 | | - element: SDElement<Required<TItem>, keyT>; |
| 34 | + element: SafeSchemaElement<Required<TItem>, keyT>; |
35 | 35 | flag: 'optional'; |
36 | 36 | }; |
37 | 37 | } & { |
38 | | - [keyT in RequiredPropertyOf<TItem>]: SDElement<Required<TItem>, keyT>; |
| 38 | + [keyT in RequiredPropertyOf<TItem>]: SafeSchemaElement<Required<TItem>, keyT>; |
39 | 39 | }; |
40 | 40 | declare type OptionalPropertyOf<T> = Exclude<{ |
41 | 41 | [K in keyof T]: T extends Record<K, T[K]> ? never : K; |
42 | 42 | }[keyof T], undefined>; |
43 | 43 | declare type RequiredPropertyOf<T> = Exclude<{ |
44 | 44 | [K in keyof T]: T extends Record<K, T[K]> ? K : never; |
45 | 45 | }[keyof T], undefined>; |
46 | | -declare type Simple<T> = T extends string ? 'string' | SDEnum<T> : T extends number ? 'uint8' | 'uint16' | 'uint32' | 'int8' | 'int16' | 'int32' | 'float32' | 'float64' : T extends boolean ? 'boolean' : never; |
47 | | -export declare type SDElement<T, TKey extends keyof T> = T[TKey] extends string | boolean | number ? Simple<T[TKey]> : T[TKey] extends Array<any> ? T[TKey][number] extends string | boolean | number ? SDArray<Simple<T[TKey][number]>> : T[TKey][number] extends { |
| 46 | +declare type SafeSchemaSimple<T> = T extends string ? 'string' | SafeSchemaEnum<T> : T extends number ? 'uint8' | 'uint16' | 'uint32' | 'int8' | 'int16' | 'int32' | 'float32' | 'float64' : T extends boolean ? 'boolean' : never; |
| 47 | +export declare type SafeSchemaElement<T, TKey extends keyof T> = T[TKey] extends string | boolean | number ? SafeSchemaSimple<T[TKey]> : T[TKey] extends Array<any> ? T[TKey][number] extends string | boolean | number ? SafeSchemaArray<SafeSchemaSimple<T[TKey][number]>> : T[TKey][number] extends { |
48 | 48 | type: string; |
49 | | -} ? SDArray<SDTypeLookupElements<T[TKey][number]>> | SDArray<SDSimpleObject<T[TKey][number]>> : SDArray<SDSimpleObject<T[TKey][number]>> : T[TKey] extends { |
| 49 | +} ? SafeSchemaArray<SafeSchemaTypeLookupElements<T[TKey][number]>> | SafeSchemaArray<SafeSchemaSimpleObject<T[TKey][number]>> : SafeSchemaArray<SafeSchemaSimpleObject<T[TKey][number]>> : T[TKey] extends { |
50 | 50 | [key in keyof T[TKey]]: boolean; |
51 | | -} ? SDBitmask<T[TKey]> : T[TKey] extends { |
| 51 | +} ? SafeSchemaBitmask<T[TKey]> : T[TKey] extends { |
52 | 52 | type: string; |
53 | | -} ? SDTypeLookupElements<T[TKey]> | SDSimpleObject<T[TKey]> : T[TKey] extends {} ? SDSimpleObject<T[TKey]> : never; |
| 53 | +} ? SafeSchemaTypeLookupElements<T[TKey]> | SafeSchemaSimpleObject<T[TKey]> : T[TKey] extends {} ? SafeSchemaSimpleObject<T[TKey]> : never; |
| 54 | +export declare type SafeSchema<T> = T extends string | boolean | number ? SafeSchemaSimple<T> : T extends Array<any> ? T[number] extends string | boolean | number ? SafeSchemaArray<SafeSchemaSimple<T[number]>> : T[number] extends { |
| 55 | + type: string; |
| 56 | +} ? SafeSchemaArray<SafeSchemaTypeLookupElements<T[number]>> | SafeSchemaArray<SafeSchemaSimpleObject<T[number]>> : SafeSchemaArray<SafeSchemaSimpleObject<T[number]>> : T extends { |
| 57 | + [key in keyof T]: boolean; |
| 58 | +} ? SafeSchemaBitmask<T> | SafeSchemaSimpleObject<T> : T extends { |
| 59 | + type: string; |
| 60 | +} ? SafeSchemaTypeLookupElements<T> | SafeSchemaSimpleObject<T> : T extends {} ? SafeSchemaSimpleObject<T> : never; |
54 | 61 | export declare type ABFlags = { |
55 | 62 | flag: 'enum'; |
56 | 63 | } | { |
|
0 commit comments