// deno-lint-ignore-file no-explicit-any import type { Decimal, Email, PosixDate, TaggedVariant, UUID, } from "@fabric/core"; import { variantConstructor } from "@fabric/core"; export const Field = { string: variantConstructor("StringField"), uuid: variantConstructor("UUIDField"), integer: variantConstructor("IntegerField"), float: variantConstructor("FloatField"), decimal: variantConstructor("DecimalField"), reference: variantConstructor("ReferenceField"), posixDate: variantConstructor("PosixDateField"), embedded: variantConstructor("EmbeddedField"), boolean: variantConstructor("BooleanField"), email: variantConstructor("EmailField"), } as const; export type FieldDefinition = | StringField | UUIDField | IntegerField | FloatField | DecimalField | ReferenceField | PosixDateField | EmbeddedField | EmailField | BooleanField; /** * Converts a field definition to its corresponding TypeScript type. */ //prettier-ignore export type FieldToType = TField extends StringField ? MaybeOptional : TField extends UUIDField ? MaybeOptional : TField extends IntegerField ? IntegerFieldToType : TField extends ReferenceField ? MaybeOptional : TField extends DecimalField ? MaybeOptional : TField extends FloatField ? MaybeOptional : TField extends PosixDateField ? MaybeOptional : TField extends BooleanField ? MaybeOptional : TField extends EmailField ? MaybeOptional : TField extends EmbeddedField ? MaybeOptional : never; //prettier-ignore type IntegerFieldToType = TField["hasArbitraryPrecision"] extends true ? MaybeOptional : TField["hasArbitraryPrecision"] extends false ? MaybeOptional : MaybeOptional; type MaybeOptional = TField extends { isOptional: true } ? TType | undefined : TType; interface BaseField { isOptional?: boolean; isUnique?: boolean; isIndexed?: boolean; } export interface UUIDField extends TaggedVariant<"UUIDField">, BaseField { isPrimaryKey?: boolean; } export interface PosixDateField extends TaggedVariant<"PosixDateField">, BaseField {} export interface BooleanField extends TaggedVariant<"BooleanField">, BaseField {} export interface StringField extends TaggedVariant<"StringField">, BaseField { maxLength?: number; minLength?: number; } export interface EmailField extends TaggedVariant<"EmailField">, BaseField {} export interface IntegerField extends TaggedVariant<"IntegerField">, BaseField { isUnsigned?: boolean; hasArbitraryPrecision?: boolean; } export interface FloatField extends TaggedVariant<"FloatField">, BaseField {} export interface ReferenceField extends TaggedVariant<"ReferenceField">, BaseField { targetModel: string; targetKey?: string; } export interface DecimalField extends TaggedVariant<"DecimalField">, BaseField { isUnsigned?: boolean; precision?: number; scale?: number; } export interface EmbeddedField extends TaggedVariant<"EmbeddedField">, BaseField {}