import type { ChangeColumnTableName, ColumnDataType, Dialect } from "../column-builder.js"; import type { AnyColumn, Column, ColumnBaseConfig, GetColumnData, UpdateColConfig } from "../column.js"; import type { SelectedFields } from "../operations.js"; import type { ColumnsSelection, SQL, View } from "../sql/sql.js"; import type { Subquery } from "../subquery.js"; import type { Table } from "../table.js"; import type { Assume, DrizzleTypeError, Equal, IsAny, Simplify } from "../utils.js"; export type JoinType = 'inner' | 'left' | 'right' | 'full'; export type JoinNullability = 'nullable' | 'not-null'; export type ApplyNullability = TNullability extends 'nullable' ? T | null : TNullability extends 'null' ? null : T; export type ApplyNullabilityToColumn = TNullability extends 'not-null' ? TColumn : Column, ColumnBaseConfig>>; export type ApplyNotNullMapToJoins> = { [TTableName in keyof TResult & keyof TNullabilityMap & string]: ApplyNullability; } & {}; export type SelectMode = 'partial' | 'single' | 'multiple'; export type SelectResult> = TSelectMode extends 'partial' ? SelectPartialResult : TSelectMode extends 'single' ? SelectResultFields : ApplyNotNullMapToJoins, TNullabilityMap>; type IsUnion = (T extends any ? (U extends T ? false : true) : never) extends false ? false : true; type Not = T extends true ? false : true; type SelectPartialResult> = TNullability extends TNullability ? { [Key in keyof TFields]: TFields[Key] extends infer TField ? TField extends Table ? TField['_']['name'] extends keyof TNullability ? ApplyNullability, TNullability[TField['_']['name']]> : never : TField extends Column ? TField['_']['tableName'] extends keyof TNullability ? ApplyNullability, TNullability[TField['_']['tableName']]> : never : TField extends SQL | SQL.Aliased ? SelectResultField : TField extends Record ? TField[keyof TField] extends AnyColumn<{ tableName: infer TTableName extends string; }> | SQL | SQL.Aliased ? Not> extends true ? ApplyNullability, TNullability[TTableName]> : SelectPartialResult : never : never : never; } : never; export type MapColumnsToTableAlias = { [Key in keyof TColumns]: TColumns[Key] extends Column ? ChangeColumnTableName, TAlias, TDialect> : TColumns[Key]; } & {}; export type AddAliasToSelection = Simplify extends true ? any : { [Key in keyof TSelection]: TSelection[Key] extends Column ? ChangeColumnTableName : TSelection[Key] extends Table ? AddAliasToSelection : TSelection[Key] extends SQL | SQL.Aliased ? TSelection[Key] : TSelection[Key] extends ColumnsSelection ? MapColumnsToTableAlias : never; }>; export type AppendToResult, TOldSelectMode extends SelectMode> = TOldSelectMode extends 'partial' ? TResult : TOldSelectMode extends 'single' ? (TTableName extends string ? Record : TResult) & (TJoinedName extends string ? Record : TSelectedFields) : TResult & (TJoinedName extends string ? Record : TSelectedFields); export type BuildSubquerySelection> = TSelection extends never ? any : { [Key in keyof TSelection]: TSelection[Key] extends SQL ? DrizzleTypeError<'You cannot reference this field without assigning it an alias first - use `.as()`'> : TSelection[Key] extends SQL.Aliased ? TSelection[Key] : TSelection[Key] extends Table ? BuildSubquerySelection : TSelection[Key] extends Column ? ApplyNullabilityToColumn : TSelection[Key] extends ColumnsSelection ? BuildSubquerySelection : never; } & {}; type SetJoinsNullability, TValue extends JoinNullability> = { [Key in keyof TNullabilityMap]: TValue; }; export type AppendToNullabilityMap, TJoinedName extends string | undefined, TJoinType extends JoinType> = TJoinedName extends string ? 'left' extends TJoinType ? TJoinsNotNull & { [name in TJoinedName]: 'nullable'; } : 'right' extends TJoinType ? SetJoinsNullability & { [name in TJoinedName]: 'not-null'; } : 'inner' extends TJoinType ? TJoinsNotNull & { [name in TJoinedName]: 'not-null'; } : 'full' extends TJoinType ? SetJoinsNullability & { [name in TJoinedName]: 'nullable'; } : never : TJoinsNotNull; export type TableLike = Table | Subquery | View | SQL; export type GetSelectTableName = TTable extends Table ? TTable['_']['name'] : TTable extends Subquery ? TTable['_']['alias'] : TTable extends View ? TTable['_']['name'] : TTable extends SQL ? undefined : never; export type GetSelectTableSelection = TTable extends Table ? TTable['_']['columns'] : TTable extends Subquery | View ? Assume : TTable extends SQL ? {} : never; export type SelectResultField = T extends DrizzleTypeError ? T : T extends Table ? Equal extends true ? SelectResultField : never : T extends Column ? GetColumnData : T extends SQL | SQL.Aliased ? T['_']['type'] : T extends Record ? SelectResultFields : never; export type SelectResultFields = Simplify<{ [Key in keyof TSelectedFields]: SelectResultField; }>; export type SetOperator = 'union' | 'intersect' | 'except'; export {};