import { StringKey } from '../../../types.js'; import { IsPropertyReadOptional, IsPropertyReadRequired, IsPropertyWriteOptional, IsPropertyWriteRequired, } from '../../types/properties.js'; import { BooleanType } from '../definitions/boolean.js'; import { DateType } from '../definitions/date.js'; import { JsonType } from '../definitions/json.js'; import { NumberType } from '../definitions/number.js'; import { RecordType } from '../definitions/record.js'; import { SetType } from '../definitions/set.js'; import { StringType } from '../definitions/string.js'; import { DataType } from './index.js'; /** * Database encoded value for a given data type. */ export type Encoded = T extends DataType ? T extends BooleanType ? boolean : T extends DateType ? string : T extends JsonType ? any : T extends NumberType ? number : T extends RecordType ? EncodedRecord : T extends SetType ? Record : T extends StringType ? StringWithOptions : // TODO: use never here? any : any; type EncodedRecord = T extends RecordType ? { [K in StringKey as IsPropertyReadRequired< T['properties'][K] > extends true ? K : never]: Encoded; } & { [K in StringKey as IsPropertyReadOptional< T['properties'][K] > extends true ? K : never]?: Encoded | null | undefined; } : any; /** * JS decoded value for a given data type. */ export type Decoded = T extends DataType ? T extends BooleanType ? boolean : T extends DateType ? Date : T extends JsonType ? any : T extends NumberType ? number : T extends RecordType ? DecodedRecord : T extends SetType ? Set> : T extends StringType ? StringWithOptions : // TODO: use never here? any : any; type DecodedRecord = T extends RecordType ? { [K in keyof T['properties'] as IsPropertyReadRequired< T['properties'][K] > extends true ? K : never]: Decoded; } & { [K in keyof T['properties'] as IsPropertyReadOptional< T['properties'][K] > extends true ? K : never]?: Decoded | null | undefined; } : any; /** * JS decoded value for inserts */ export type WriteDecoded = T extends DataType ? T extends BooleanType ? boolean : T extends DateType ? Date | number | string : T extends JsonType ? any : T extends NumberType ? number : T extends RecordType ? WriteDecodedRecord : T extends SetType ? Set> | WriteDecoded[] : T extends StringType ? StringWithOptions : // TODO: use never here? any : any; type WriteDecodedRecord = T extends RecordType ? { [K in keyof T['properties'] as IsPropertyWriteRequired< T['properties'][K] > extends true ? K : never]: WriteDecoded; } & { [K in keyof T['properties'] as IsPropertyWriteOptional< T['properties'][K] > extends true ? K : never]?: WriteDecoded | null | undefined; } : any; /** * String type with value options applied */ type StringWithOptions = T extends StringType ? Options['enum'] extends ReadonlyArray ? E : string : never;