import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm'; import type { z } from 'zod'; import type { GetBaseColumn, GetEnumValuesFromColumn, GetZodType, HandleColumn } from './column.types.js'; import type { GetSelection, RemoveNever } from './utils.js'; export interface Conditions { never: (column?: Column) => boolean; optional: (column: Column) => boolean; nullable: (column: Column) => boolean; } export type BuildRefineColumns> = Simplify, GetBaseColumn> extends infer TSchema extends z.ZodTypeAny ? TSchema : z.ZodAny : TColumns[K] extends infer TObject extends SelectedFieldsFlat | Table | View ? BuildRefineColumns> : TColumns[K]; }>>; export type BuildRefine> = BuildRefineColumns extends infer TBuildColumns ? { [K in keyof TBuildColumns]?: TBuildColumns[K] extends z.ZodTypeAny ? ((schema: TBuildColumns[K]) => z.ZodTypeAny) | z.ZodTypeAny : TBuildColumns[K] extends Record ? Simplify> : never; } : never; type HandleRefinement z.ZodTypeAny), TColumn extends Column> = TRefinement extends (schema: any) => z.ZodTypeAny ? (TColumn['_']['notNull'] extends true ? ReturnType : z.ZodNullable>) extends infer TSchema ? TType extends 'update' ? z.ZodOptional> : TSchema : z.ZodTypeAny : TRefinement; type IsRefinementDefined = TKey extends keyof TRefinements ? TRefinements[TKey] extends z.ZodTypeAny | ((schema: any) => any) ? true : false : false; export type BuildSchema, TRefinements extends Record | undefined> = z.ZodObject> extends true ? HandleRefinement], TColumn> : HandleColumn : HandleColumn : TColumns[K] extends infer TObject extends SelectedFieldsFlat | Table | View ? BuildSchema, TRefinements extends object ? TRefinements[Assume] extends infer TNestedRefinements extends object ? TNestedRefinements : undefined : undefined> : z.ZodAny; }>>, 'strip'>; export type NoUnknownKeys, TCompare extends Record> = { [K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends Record ? NoUnknownKeys : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`>; }; export {};