import type * as t from '@sinclair/typebox'; import type { Assume, Column, DrizzleTypeError, SelectedFieldsFlat, Simplify, Table, View } from 'drizzle-orm'; import type { GetTypeboxType, HandleColumn } from './column.types.js'; import type { ColumnIsGeneratedAlwaysAs, GetSelection } from './utils.js'; export interface Conditions { never: (column?: Column) => boolean; optional: (column: Column) => boolean; nullable: (column: Column) => boolean; } type BuildRefineField = T extends t.TSchema ? ((schema: T) => t.TSchema) | t.TSchema : never; export type BuildRefine> = { [K in keyof TColumns as TColumns[K] extends Column | SelectedFieldsFlat | Table | View ? K : never]?: TColumns[K] extends Column ? BuildRefineField> : BuildRefine>; }; type HandleRefinement = TRefinement extends (schema: any) => t.TSchema ? (TColumn['_']['notNull'] extends true ? ReturnType : t.TUnion<[ReturnType, t.TNull]>) extends infer TSchema ? TType extends 'update' ? t.TOptional> : TSchema : t.TSchema : TRefinement; type IsRefinementDefined | undefined, TKey extends string | symbol | number> = TRefinements extends object ? TRefinements[TKey] extends t.TSchema | ((schema: any) => any) ? true : false : false; export type BuildSchema, TRefinements extends Record | undefined> = t.TObject extends true ? never : K]: TColumns[K] extends infer TColumn extends Column ? IsRefinementDefined extends true ? Assume, t.TSchema> : HandleColumn : TColumns[K] extends infer TObject extends SelectedFieldsFlat | Table | View ? BuildSchema, TRefinements extends object ? TRefinements[K & keyof TRefinements] : undefined> : t.TAny; }>>; export type NoUnknownKeys, TCompare extends Record> = { [K in keyof TRefinement]: K extends keyof TCompare ? TRefinement[K] extends t.TSchema ? TRefinement[K] : TRefinement[K] extends Record ? NoUnknownKeys : TRefinement[K] : DrizzleTypeError<`Found unknown key in refinement: "${K & string}"`>; }; export {};