11/* eslint-disable @typescript-eslint/no-unsafe-function-type */
2+ type Year = `${number } ${number } ${number } ${number } `;
3+ type Month = `${number } ${number } `;
4+ type Day = `${number } ${number } `;
5+ type Hour = `${number } ${number } `;
6+ type Minute = `${number } ${number } `;
7+ type Second = `${number } ${number } `;
8+ type Milliseconds = `${number } ${number } ${number } `;
9+ type Timezone = "Z" | `${"+" | "-" } ${number } ${number } :${number } ${number } `;
10+
11+ export type ISODateTime =
12+ `${Year } -${Month } -${Day } T${Hour } :${Minute } :${Second } .${Milliseconds } ${Timezone } `;
13+
214type Methods < T > = {
315 [ P in keyof T ] : T [ P ] extends Function ? P : never ;
416} [ keyof T ] ;
@@ -9,24 +21,24 @@ type Properties<T> = Omit<MethodsAndProperties<T>, Methods<T>>;
921
1022type PrimitiveTypes = string | number | boolean | undefined | null ;
1123
12- type DateToNumber < T > = T extends Date ? number : T ;
24+ type DateToISODateTime < T > = T extends Date ? ISODateTime : T ;
1325
1426type ValueObjectValue < T > = T extends PrimitiveTypes
1527 ? T
1628 : T extends Date
17- ? number
29+ ? ISODateTime
1830 : T extends { value : infer U }
19- ? DateToNumber < U >
31+ ? DateToISODateTime < U >
2032 : T extends Array < { value : infer U } >
21- ? DateToNumber < U > [ ]
33+ ? DateToISODateTime < U > [ ]
2234 : T extends Array < infer U >
2335 ? Array < ValueObjectValue < U > >
2436 : T extends { [ K in keyof Properties < T > ] : unknown }
2537 ? {
2638 [ K in keyof Properties < T > ] : ValueObjectValue < Properties < T > [ K ] > ;
2739 }
2840 : T extends unknown
29- ? DateToNumber < T >
41+ ? DateToISODateTime < T >
3042 : never ;
3143
3244export type Primitives < T > = {
0 commit comments