import type { Table } from "../schema/table.js"; import type { InferTable } from "./index.js"; import type { SQLChunk } from "../core/sql.js"; import type { OrderByObject, WhereCondition } from "../core/query.js"; export type SchemaConfig = Record>; type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; type GetTableRef = C extends { references?: infer R; } ? (NonNullable extends { table: infer T; } ? T : never) : never; type GetBackRelName = C extends { references?: infer R; } ? (NonNullable extends { backRelationName: infer B extends string; } ? B : never) : never; type GetRelName = C extends { references?: infer R; } ? (NonNullable extends { relationName: infer N extends string; } ? N : never) : never; export type GetColumns = TTable extends Table ? C : never; export type ExtractOneRelations = { [ColName in keyof GetColumns as GetTableRef[ColName]> extends keyof TSchema ? (GetRelName[ColName]> extends string ? GetRelName[ColName]> : GetTableRef[ColName]>) : never]: GetTableRef[ColName]> extends keyof TSchema ? { type: "one"; targetTable: GetTableRef[ColName]>; sourceColumn: ColName; } : never; }; export type ExtractManyRelations = UnionToIntersection<{ [OtherTable in keyof TSchema]: { [ColName in keyof GetColumns as GetTableRef[ColName]> extends TTableName ? (GetBackRelName[ColName]> extends string ? GetBackRelName[ColName]> : OtherTable) : never]: { type: "many"; targetTable: OtherTable; targetColumn: ColName; }; }; }[keyof TSchema]>; type GetOtherFK> = { [K in keyof GetColumns]: K extends TCol1 ? never : GetTableRef[K]> extends keyof TSchema ? GetTableRef[K]> : never; }[keyof GetColumns]; export type ExtractManyToManyRelations = UnionToIntersection<{ [Junction in keyof TSchema]: { [ColName in keyof GetColumns as GetTableRef[ColName]> extends TTableName ? ([GetOtherFK] extends [never] ? never : (GetBackRelName[ColName]> extends string ? GetBackRelName[ColName]> : GetOtherFK)) : never]: { type: "manyToMany"; targetTable: GetOtherFK; }; }; }[keyof TSchema]>; export type ExtractTableRelations = ExtractOneRelations & ExtractManyRelations & ExtractManyToManyRelations; export type TargetTable> = ExtractTableRelations[K] extends { targetTable: infer T; } ? T extends keyof TSchema ? T : never : never; export type WithConfig = { [K in keyof ExtractTableRelations]?: true | { columns?: Partial]>, boolean>>; with?: WithConfig>; limit?: number; offset?: number; orderBy?: OrderByObject]>> | SQLChunk; where?: WhereCondition]>>; }; }; export type FindManyArgs = { columns?: Partial, boolean>>; where?: WhereCondition>; limit?: number; offset?: number; orderBy?: OrderByObject> | SQLChunk; with?: WithConfig; }; type Prettify = { [K in keyof T]: T[K]; } & {}; type HasTrue = true extends C[keyof C] ? true : false; type ApplyColumns = TArgs extends { columns: infer C; } ? (HasTrue extends true ? { [K in keyof TTableProps as (K extends keyof C ? (C[K] extends true ? K : never) : never)]: TTableProps[K]; } : { [K in keyof TTableProps as (K extends keyof C ? (C[K] extends false ? never : K) : K)]: TTableProps[K]; }) : TTableProps; export type FindManyResult = Prettify>, TArgs> & (TArgs extends { with: infer W; } ? { [K in keyof W & keyof ExtractTableRelations]: ExtractTableRelations[K] extends { type: "one"; } ? FindManyResult, W[K] extends FindManyArgs ? W[K] : undefined> | null : FindManyResult, W[K] extends FindManyArgs ? W[K] : undefined>[]; } : {})>; export type MergeWith = TArgs extends { with: infer W; } ? Omit & { with: W & { [P in K]: keyof TSubArgs extends never ? true : TSubArgs; }; } : TArgs & { with: { [P in K]: keyof TSubArgs extends never ? true : TSubArgs; }; }; export {}; //# sourceMappingURL=relations.d.ts.map