import { castNumber } from "./cast-number" export function transformNullableFormValue( value: T, nullify = true ): T | undefined | null { if (typeof value === "string" && value.trim() === "") { return nullify ? null : undefined } if (Array.isArray(value) && value.length === 0) { return nullify ? null : undefined } return value } type Nullable = { [K in keyof T]: T[K] | null } type Optional = { [K in keyof T]: T[K] | undefined } export function transformNullableFormData< T extends Record, K extends boolean = true >(data: T, nullify: K = true as K): K extends true ? Nullable : Optional { return Object.entries(data).reduce((acc, [key, value]) => { return { ...acc, [key]: transformNullableFormValue(value, nullify), } }, {} as K extends true ? Nullable : Optional) } export function transformNullableFormNumber( value?: string | number, nullify: K = true as K ): K extends true ? number | null : number | undefined { if ( typeof value === "undefined" || (typeof value === "string" && value.trim() === "") ) { return (nullify ? null : undefined) as K extends true ? number | null : number | undefined } if (typeof value === "string") { return castNumber(value) } return value } type NullableNumbers = Record type OptionalNumbers = Record export function transformNullableFormNumbers< T extends Record, K extends boolean = true >( data: T, nullify: K = true as K ): K extends true ? NullableNumbers : OptionalNumbers { return Object.entries(data).reduce((acc, [key, value]) => { return { ...acc, [key]: transformNullableFormNumber(value, nullify), } }, {} as K extends true ? NullableNumbers : OptionalNumbers) }