import type { Assume, Column, MakeColumnConfig, QueryPromise, SelectedFields, SelectedFieldsOrdered, Subquery, Table, TableConfig, UpdateTableConfig, ValidateShape, entityKind, } from "drizzle-orm"; import { TypedQueryBuilder } from "drizzle-orm/query-builders/query-builder"; import type { AddAliasToSelection, AppendToNullabilityMap, AppendToResult, BuildSubquerySelection, GetSelectTableName, GetSelectTableSelection, JoinNullability, JoinType, SelectMode, SelectResult, SetOperator, } from "drizzle-orm/query-builders/select.types"; import type { ColumnsSelection, Placeholder, Query, SQL, View, } from "drizzle-orm/sql"; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.ts#L54 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.ts#L50 */ export type SelectBuilder< TSelection extends SelectedFields | undefined, TResultType extends "sync" | "async", TRunResult, TBuilderMode extends "db" | "qb" = "db", > = { from: ( source: TFrom, ) => CreateSelectFromBuilderMode< TBuilderMode, GetSelectTableName, TResultType, TRunResult, TSelection extends undefined ? GetSelectTableSelection : TSelection, TSelection extends undefined ? "single" : "partial" >; }; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.ts#L126 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.ts#L130 */ export abstract class SelectQueryBuilderBase< THKT extends SelectHKTBase, TTableName extends string | undefined, TResultType extends "sync" | "async", TRunResult, TSelection extends ColumnsSelection, TSelectMode extends SelectMode, TNullabilityMap extends Record< string, JoinNullability > = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult< TSelection, TSelectMode, TNullabilityMap >[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection< TSelection, TNullabilityMap >, > extends TypedQueryBuilder { declare [entityKind]: string; declare _: { readonly hkt: THKT; readonly tableName: TTableName; readonly resultType: TResultType; readonly runResult: TRunResult; readonly selection: TSelection; readonly selectMode: TSelectMode; readonly nullabilityMap: TNullabilityMap; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; readonly result: TResult; readonly selectedFields: TSelectedFields; }; declare leftJoin: JoinFn; declare rightJoin: JoinFn; declare innerJoin: JoinFn; declare fullJoin: JoinFn; private declare setOperator: >( rightSelection: | (( setOperators: GetSetOperators, ) => SetOperatorRightSelect) | SetOperatorRightSelect, ) => SelectWithout; declare union: typeof this.setOperator; declare unionAll: typeof this.setOperator; declare intersect: typeof this.setOperator; declare intersectAll: typeof this.setOperator; declare except: typeof this.setOperator; declare exceptAll: typeof this.setOperator; declare where: ( where: ((aliases: TSelection) => SQL | undefined) | SQL | undefined, ) => SelectWithout; declare having: ( having: | ((aliases: this["_"]["selection"]) => SQL | undefined) | SQL | undefined, ) => SelectWithout; declare groupBy: ( ...columns: (Column | SQL)[] ) => SelectWithout; declare orderBy: ( ...columns: (Column | SQL)[] ) => SelectWithout; declare limit: ( limit: number | Placeholder, ) => SelectWithout; declare offset: ( offset: number | Placeholder, ) => SelectWithout; declare toSQL: () => Query; declare as: ( alias: TAlias, ) => SubqueryWithSelection; declare $dynamic: () => SelectDynamic; } /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.ts#L803 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.ts#L903 */ export type SelectBase< TTableName extends string | undefined, TResultType extends "sync" | "async", TRunResult, TSelection extends ColumnsSelection, TSelectMode extends SelectMode = "single", TNullabilityMap extends Record< string, JoinNullability > = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection< TSelection, TNullabilityMap >, > = SelectQueryBuilderBase< SelectHKT, TTableName, TResultType, TRunResult, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, // @ts-ignore TResult, TSelectedFields > & QueryPromise; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L31 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L30 */ export type SelectJoinConfig = { on: SQL; table: Table | Subquery | View | SQL; alias: string | undefined; joinType: JoinType; }; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L38 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L30 */ export type BuildAliasTable< tableOrView extends Table | View, alias extends string, > = tableOrView extends Table ? TableWithColumns< UpdateTableConfig< tableOrView["_"]["config"], { name: alias; columns: MapColumnsToTableAlias; } > > : tableOrView extends View ? ViewWithSelection< alias, tableOrView["_"]["existing"], MapColumnsToTableAlias > : never; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L52 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L52 */ export type SelectConfig = { withList?: Subquery[]; fields: Record; fieldsFlat?: SelectedFieldsOrdered; where?: SQL; having?: SQL; table: Table | Subquery | View | SQL; limit?: number | Placeholder; offset?: number | Placeholder; joins?: SelectJoinConfig[]; orderBy?: (Column | SQL | SQL.Aliased)[]; groupBy?: (Column | SQL | SQL.Aliased)[]; distinct?: boolean; setOperators: { rightSelect: TypedQueryBuilder; type: SetOperator; isAll: boolean; orderBy?: (Column | SQL | SQL.Aliased)[]; limit?: number | Placeholder; offset?: number | Placeholder; }[]; }; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L75 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L82 */ export type Join< T extends AnySelectQueryBuilder, TDynamic extends boolean, TJoinType extends JoinType, TJoinedTable extends Table | Subquery | View | SQL, TJoinedName extends GetSelectTableName = GetSelectTableName, > = T extends any ? SelectWithout< SelectKind< T["_"]["hkt"], T["_"]["tableName"], T["_"]["resultType"], T["_"]["runResult"], AppendToResult< T["_"]["tableName"], T["_"]["selection"], TJoinedName, TJoinedTable extends Table ? TJoinedTable["_"]["columns"] : TJoinedTable extends Subquery | View ? Assume< TJoinedTable["_"]["selectedFields"], SelectedFields > : never, T["_"]["selectMode"] >, T["_"]["selectMode"] extends "partial" ? T["_"]["selectMode"] : "multiple", AppendToNullabilityMap< T["_"]["nullabilityMap"], TJoinedName, TJoinType >, T["_"]["dynamic"], T["_"]["excludedMethods"] >, TDynamic, T["_"]["excludedMethods"] > : never; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L106 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L111 */ export type JoinFn< T extends AnySelectQueryBuilder, TDynamic extends boolean, TJoinType extends JoinType, > = < TJoinedTable extends Table | Subquery | View | SQL, TJoinedName extends GetSelectTableName = GetSelectTableName, >( table: TJoinedTable, on: ((aliases: T["_"]["selection"]) => SQL | undefined) | SQL | undefined, ) => Join; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/query-builders/select.types.ts#L75 */ type MapColumnsToTableAlias< TColumns extends ColumnsSelection, TAlias extends string, > = { [Key in keyof TColumns]: TColumns[Key] extends Column ? Column["_"], TAlias>> : TColumns[Key]; } & {}; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L124 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L146 */ export type SelectHKTBase = { tableName: string | undefined; resultType: "sync" | "async"; runResult: unknown; selection: unknown; selectMode: SelectMode; nullabilityMap: unknown; dynamic: boolean; excludedMethods: string; result: unknown; selectedFields: unknown; _type: unknown; }; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L138 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L158 */ export type SelectKind< T extends SelectHKTBase, TTableName extends string | undefined, TResultType extends "sync" | "async", TRunResult, TSelection extends ColumnsSelection, TSelectMode extends SelectMode, TNullabilityMap extends Record, TDynamic extends boolean, TExcludedMethods extends string, TResult = SelectResult[], TSelectedFields = BuildSubquerySelection, > = (T & { tableName: TTableName; resultType: TResultType; runResult: TRunResult; selection: TSelection; selectMode: TSelectMode; nullabilityMap: TNullabilityMap; dynamic: TDynamic; excludedMethods: TExcludedMethods; result: TResult; selectedFields: TSelectedFields; })["_type"]; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L163 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L179 */ export interface SelectQueryBuilderHKT extends SelectHKTBase { _type: SelectQueryBuilderBase< SelectQueryBuilderHKT, this["tableName"], this["resultType"], this["runResult"], Assume, this["selectMode"], Assume>, this["dynamic"], this["excludedMethods"], Assume, Assume >; } /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L179 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L193 */ export interface SelectHKT extends SelectHKTBase { _type: SelectBase< this["tableName"], this["resultType"], this["runResult"], Assume, this["selectMode"], Assume>, this["dynamic"], this["excludedMethods"], Assume, Assume >; } export type SetOperatorExcludedMethods = | "leftJoin" | "rightJoin" | "innerJoin" | "fullJoin" | "where" | "having" | "groupBy"; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L204 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L206 */ export type CreateSelectFromBuilderMode< TBuilderMode extends "db" | "qb", TTableName extends string | undefined, TResultType extends "sync" | "async", TRunResult, TSelection extends ColumnsSelection, TSelectMode extends SelectMode, > = TBuilderMode extends "db" ? SelectBase : SelectQueryBuilderBase< SelectQueryBuilderHKT, TTableName, TResultType, TRunResult, TSelection, TSelectMode >; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/query-builders/select.types.ts#L227 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/query-builders/select.types.ts#L224 */ type SelectWithout< T extends AnySelectQueryBuilder, TDynamic extends boolean, K extends keyof T & string, TResetExcluded extends boolean = false, > = TDynamic extends true ? T : Omit< SelectKind< T["_"]["hkt"], T["_"]["tableName"], T["_"]["resultType"], T["_"]["runResult"], T["_"]["selection"], T["_"]["selectMode"], T["_"]["nullabilityMap"], TDynamic, TResetExcluded extends true ? K : T["_"]["excludedMethods"] | K, T["_"]["result"], T["_"]["selectedFields"] >, TResetExcluded extends true ? K : T["_"]["excludedMethods"] | K >; export type SelectDynamic = SelectKind< T["_"]["hkt"], T["_"]["tableName"], T["_"]["resultType"], T["_"]["runResult"], T["_"]["selection"], T["_"]["selectMode"], T["_"]["nullabilityMap"], true, never, T["_"]["result"], T["_"]["selectedFields"] >; export type AnySelectQueryBuilder = SelectQueryBuilderBase< any, any, any, any, any, any, any, any, any, any, any >; export type AnySetOperatorInterface = SetOperatorInterface< any, any, any, any, any, any, any, any, any >; export interface SetOperatorInterface< TTableName extends string | undefined, TResultType extends "sync" | "async", TRunResult, TSelection extends ColumnsSelection, TSelectMode extends SelectMode = "single", TNullabilityMap extends Record< string, JoinNullability > = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult< TSelection, TSelectMode, TNullabilityMap >[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection< TSelection, TNullabilityMap >, > { _: { readonly hkt: SelectHKTBase; readonly tableName: TTableName; readonly resultType: TResultType; readonly runResult: TRunResult; readonly selection: TSelection; readonly selectMode: TSelectMode; readonly nullabilityMap: TNullabilityMap; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; readonly result: TResult; readonly selectedFields: TSelectedFields; }; } export type SetOperatorWithResult = SetOperatorInterface< any, any, any, any, any, any, any, any, TResult, any >; export type SetOperatorRightSelect< TValue extends SetOperatorWithResult, TResult extends any[], > = TValue extends SetOperatorInterface< any, any, any, any, any, any, any, any, infer TValueResult, any > ? ValidateShape< TValueResult[number], TResult[number], TypedQueryBuilder > : TValue; export type SetOperatorRestSelect< TValue extends readonly SetOperatorWithResult[], TResult extends any[], > = TValue extends [infer First, ...infer Rest] ? First extends SetOperatorInterface< any, any, any, any, any, any, any, any, infer TValueResult, any > ? Rest extends AnySetOperatorInterface[] ? [ ValidateShape< TValueResult[number], TResult[number], TypedQueryBuilder >, ...SetOperatorRestSelect, ] : ValidateShape< TValueResult[number], TResult[number], TypedQueryBuilder[] > : never : TValue; export type CreateSetOperatorFn = < TTableName extends string | undefined, TResultType extends "sync" | "async", TRunResult, TSelection extends ColumnsSelection, TValue extends SetOperatorWithResult, TRest extends SetOperatorWithResult[], TSelectMode extends SelectMode = "single", TNullabilityMap extends Record< string, JoinNullability > = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult< TSelection, TSelectMode, TNullabilityMap >[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection< TSelection, TNullabilityMap >, >( leftSelect: SetOperatorInterface< TTableName, TResultType, TRunResult, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields >, rightSelect: SetOperatorRightSelect, ...restSelects: SetOperatorRestSelect ) => SelectWithout< SelectBase< TTableName, TResultType, TRunResult, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields >, false, SetOperatorExcludedMethods, true >; export type GetSetOperators = { union: CreateSetOperatorFn; intersect: CreateSetOperatorFn; except: CreateSetOperatorFn; unionAll: CreateSetOperatorFn; }; export type SubqueryWithSelection< TSelection extends ColumnsSelection, TAlias extends string, > = Subquery> & AddAliasToSelection; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/table.ts#L49 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/table.ts#L43 */ export type TableWithColumns = Table & { [key in keyof T["columns"]]: T["columns"][key]; }; /** * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/sqlite-core/view.ts#L154 * https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/pg-core/view.ts#L305 */ export type ViewWithSelection< TName extends string, TExisting extends boolean, TSelection extends ColumnsSelection, > = View & TSelection;