import type { Many, One, Relations, Table } from 'drizzle-orm'; type ToWire = T extends Date ? string : T; type WireFormat = { [K in keyof T]: ToWire; }; type ExtractTables = { [K in keyof TSchema as TSchema[K] extends Table ? K : never]: TSchema[K]; }; type FindRelationConfig = { [K in keyof TSchema]: TSchema[K] extends Relations ? TConfig : never; }[keyof TSchema]; type MapRelation = T extends One ? { entity: N; type: 'one'; required: TIsNullable; } : T extends Many ? { entity: N; type: 'many'; } : never; type InferRelationDefs = { [K in keyof FindRelationConfig]: MapRelation[K]>; }; type ScalarFilterOps = { eq?: T | null; ne?: T | null; lt?: T | null; lte?: T | null; gt?: T | null; gte?: T | null; like?: string | null; notLike?: string | null; ilike?: string | null; notIlike?: string | null; inArray?: T[] | null; notInArray?: T[] | null; isNull?: boolean | null; isNotNull?: boolean | null; }; type ScalarColumnFilters = { [K in keyof TFields]?: ScalarFilterOps>; }; type ManyRelationFilter = { some?: TFilter; every?: TFilter; none?: TFilter; }; type IsResolvableRelation = TRel extends { entity: infer E; } ? E extends string ? KeyForDbName extends keyof ExtractTables ? true : false : false : false; type Prev = T extends [unknown, ...infer Rest] ? Rest : []; type InferRelationFilterFields = { [K in keyof TRels as IsResolvableRelation extends true ? K : never]?: TRels[K] extends { entity: infer E; type: infer TRelType; } ? E extends string ? KeyForDbName extends infer RK ? RK extends keyof ExtractTables ? ExtractTables[RK] extends infer TTarget ? TTarget extends Table ? TRelType extends 'many' ? ManyRelationFilter>> : InferEntityFilters> : never : never : never : never : never : never; }; type InferEntityFilters = ScalarColumnFilters> & (TDepth extends [] ? {} : InferRelationFilterFields>, TDepth>) & { OR?: InferEntityFilters[]; }; type InferInsertInput = T extends Table ? WireFormat : never; type InferUpdateInput = T extends Table ? { [K in keyof T['$inferInsert']]?: ToWire | null; } : never; type InferOrderBy = T extends Table ? { [K in keyof T['$inferSelect']]?: { direction: 'asc' | 'desc'; priority: number; }; } : never; type ExcludedNames = TConfig extends { tables: { exclude: readonly (infer T)[]; }; } ? T : never; type NumberToTuple = T['length'] extends N ? T : T['length'] extends 5 ? T : NumberToTuple; type ExtractFilterDepth = TConfig extends { limitRelationDepth: infer D; } ? D extends number ? number extends D ? [0] : NumberToTuple : [0] : [0]; type TableDbName = T extends Table ? TConfig['name'] extends string ? TConfig['name'] : string : string; type DbNameToKey = { [K in keyof ExtractTables]: TableDbName[K]>; }; type KeyForDbName = { [K in keyof DbNameToKey]: DbNameToKey[K] extends TDbName ? K : never; }[keyof DbNameToKey]; type ResolveRelationEntity = KeyForDbName extends infer K ? (K extends string ? K : TDbName) : TDbName; type ResolveRelationDefs = { [K in keyof TRels]: TRels[K] extends { entity: infer E; type: infer T; } ? E extends string ? Omit & { entity: ResolveRelationEntity; type: T; } : TRels[K] : TRels[K]; }; type BuildEntityDef = T extends Table ? { fields: WireFormat; relations: ResolveRelationDefs>>; filters: InferEntityFilters; insertInput: InferInsertInput; updateInput: InferUpdateInput; orderBy: InferOrderBy; } : never; export type InferEntityDefs> = { [K in keyof ExtractTables as K extends ExcludedNames ? never : K extends string ? K : never]: BuildEntityDef[K], ExtractFilterDepth>; }; export {};