/* eslint-disable @typescript-eslint/no-unsafe-function-type */ type Year = `${number}${number}${number}${number}`; type Month = `${number}${number}`; type Day = `${number}${number}`; type Hour = `${number}${number}`; type Minute = `${number}${number}`; type Second = `${number}${number}`; type Milliseconds = `${number}${number}${number}`; type Timezone = "Z" | `${"+" | "-"}${number}${number}:${number}${number}`; export type ISODateTime = `${Year}-${Month}-${Day}T${Hour}:${Minute}:${Second}.${Milliseconds}${Timezone}`; type Methods = { [P in keyof T]: T[P] extends Function ? P : never; }[keyof T]; type MethodsAndProperties = { [key in keyof T]: T[key] }; type Properties = Omit, Methods>; type PrimitiveTypes = string | number | boolean | undefined | null; type DateToISODateTime = T extends Date ? ISODateTime : T; type ValueObjectValue = T extends PrimitiveTypes ? T : T extends Date ? ISODateTime : T extends { value: infer U } ? DateToISODateTime : T extends Array<{ value: infer U }> ? DateToISODateTime[] : T extends Array ? Array> : T extends { [K in keyof Properties]: unknown } ? { [K in keyof Properties]: ValueObjectValue[K]>; } : T extends unknown ? DateToISODateTime : never; export type Primitives = { [key in keyof Properties]: ValueObjectValue; };