Skip to content

Commit a480556

Browse files
committed
HKT-based PG delete builder
1 parent ec38c02 commit a480556

File tree

2 files changed

+88
-31
lines changed

2 files changed

+88
-31
lines changed

drizzle-orm/src/pg-core/async/db.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ import type { Cache } from '~/cache/core/cache.ts';
33
import { entityKind } from '~/entity.ts';
44
import type { PgAsyncSession, PgAsyncTransaction } from '~/pg-core/async/session.ts';
55
import type { PgDialect } from '~/pg-core/dialect.ts';
6-
import { PgDeleteBase, PgInsertBuilder, PgUpdateBuilder, QueryBuilder } from '~/pg-core/query-builders/index.ts';
6+
import {
7+
PgDeleteBase,
8+
type PgDeleteHKT,
9+
PgInsertBuilder,
10+
PgUpdateBuilder,
11+
QueryBuilder,
12+
} from '~/pg-core/query-builders/index.ts';
713
import type { PgQueryResultHKT, PgQueryResultKind, PgTransactionConfig } from '~/pg-core/session.ts';
814
import type { PgTable } from '~/pg-core/table.ts';
915
import type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';
@@ -421,7 +427,7 @@ export class PgAsyncDatabase<
421427
* .returning();
422428
* ```
423429
*/
424-
function delete_<TTable extends PgTable>(table: TTable): PgDeleteBase<TTable, TQueryResult> {
430+
function delete_<TTable extends PgTable>(table: TTable): PgDeleteBase<PgDeleteHKT, TTable, TQueryResult> {
425431
return new PgDeleteBase(table, self.session, self.dialect, queries);
426432
}
427433

@@ -638,7 +644,7 @@ export class PgAsyncDatabase<
638644
* .returning();
639645
* ```
640646
*/
641-
delete<TTable extends PgTable>(table: TTable): PgDeleteBase<TTable, TQueryResult> {
647+
delete<TTable extends PgTable>(table: TTable): PgDeleteBase<PgDeleteHKT, TTable, TQueryResult> {
642648
return new PgDeleteBase(table, this.session, this.dialect);
643649
}
644650

drizzle-orm/src/pg-core/query-builders/delete.ts

Lines changed: 79 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type { ColumnsSelection, Query, SQL, SQLWrapper } from '~/sql/sql.ts';
1212
import type { Subquery } from '~/subquery.ts';
1313
import { getTableName, Table } from '~/table.ts';
1414
import { tracer } from '~/tracing.ts';
15-
import { type NeonAuthToken, orderSelectedFields } from '~/utils.ts';
15+
import { type Assume, type NeonAuthToken, orderSelectedFields } from '~/utils.ts';
1616
import type { PgAsyncPreparedQuery, PgAsyncSession } from '../async/session.ts';
1717
import type { PgColumn } from '../columns/common.ts';
1818
import { extractUsedTable } from '../utils.ts';
@@ -24,7 +24,8 @@ export type PgDeleteWithout<
2424
K extends keyof T & string,
2525
> = TDynamic extends true ? T
2626
: Omit<
27-
PgDeleteBase<
27+
PgDeleteKind<
28+
T['_']['hkt'],
2829
T['_']['table'],
2930
T['_']['queryResult'],
3031
T['_']['selectedFields'],
@@ -40,7 +41,7 @@ export type PgDelete<
4041
TQueryResult extends PgQueryResultHKT = PgQueryResultHKT,
4142
TSelectedFields extends ColumnsSelection | undefined = undefined,
4243
TReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,
43-
> = PgDeleteBase<TTable, TQueryResult, TSelectedFields, TReturning, true, never>;
44+
> = PgDeleteBase<PgDeleteHKT, TTable, TQueryResult, TSelectedFields, TReturning, true, never>;
4445

4546
export interface PgDeleteConfig {
4647
where?: SQL | undefined;
@@ -53,35 +54,39 @@ export interface PgDeleteConfig {
5354
export type PgDeleteReturningAll<
5455
T extends AnyPgDeleteBase,
5556
TDynamic extends boolean,
56-
> = PgDeleteWithout<
57-
PgDeleteBase<
58-
T['_']['table'],
59-
T['_']['queryResult'],
60-
T['_']['table']['_']['columns'],
61-
T['_']['table']['$inferSelect'],
57+
> = T extends any ? PgDeleteWithout<
58+
PgDeleteKind<
59+
T['_']['hkt'],
60+
T['_']['table'],
61+
T['_']['queryResult'],
62+
T['_']['table']['_']['columns'],
63+
T['_']['table']['$inferSelect'],
64+
TDynamic,
65+
T['_']['excludedMethods']
66+
>,
6267
TDynamic,
63-
T['_']['excludedMethods']
64-
>,
65-
TDynamic,
66-
'returning'
67-
>;
68+
'returning'
69+
>
70+
: never;
6871

6972
export type PgDeleteReturning<
7073
T extends AnyPgDeleteBase,
7174
TDynamic extends boolean,
7275
TSelectedFields extends SelectedFieldsFlat,
73-
> = PgDeleteWithout<
74-
PgDeleteBase<
75-
T['_']['table'],
76-
T['_']['queryResult'],
77-
TSelectedFields,
78-
SelectResultFields<TSelectedFields>,
76+
> = T extends any ? PgDeleteWithout<
77+
PgDeleteKind<
78+
T['_']['hkt'],
79+
T['_']['table'],
80+
T['_']['queryResult'],
81+
TSelectedFields,
82+
SelectResultFields<TSelectedFields>,
83+
TDynamic,
84+
T['_']['excludedMethods']
85+
>,
7986
TDynamic,
80-
T['_']['excludedMethods']
81-
>,
82-
TDynamic,
83-
'returning'
84-
>;
87+
'returning'
88+
>
89+
: never;
8590

8691
export type PgDeletePrepare<T extends AnyPgDeleteBase> = PgAsyncPreparedQuery<
8792
PreparedQueryConfig & {
@@ -90,16 +95,59 @@ export type PgDeletePrepare<T extends AnyPgDeleteBase> = PgAsyncPreparedQuery<
9095
}
9196
>;
9297

93-
export type PgDeleteDynamic<T extends AnyPgDeleteBase> = PgDelete<
98+
export type PgDeleteDynamic<T extends AnyPgDeleteBase> = PgDeleteKind<
99+
T['_']['hkt'],
94100
T['_']['table'],
95101
T['_']['queryResult'],
96102
T['_']['selectedFields'],
97-
T['_']['returning']
103+
T['_']['returning'],
104+
true,
105+
never
98106
>;
99107

100-
export type AnyPgDeleteBase = PgDeleteBase<any, any, any, any, any, any>;
108+
export type AnyPgDeleteBase = PgDeleteBase<any, any, any, any, any, any, any>;
109+
110+
export interface PgDeleteHKTBase {
111+
table: unknown;
112+
queryResult: unknown;
113+
selectedFields: unknown;
114+
returning: unknown;
115+
dynamic: boolean;
116+
excludedMethods: string;
117+
_type: unknown;
118+
}
119+
120+
export interface PgDeleteHKT extends PgDeleteHKTBase {
121+
_type: PgDeleteBase<
122+
PgDeleteHKT,
123+
Assume<this['table'], PgTable>,
124+
Assume<this['queryResult'], PgQueryResultHKT>,
125+
Assume<this['selectedFields'], ColumnsSelection | undefined>,
126+
Assume<this['returning'], Record<string, unknown> | undefined>,
127+
this['dynamic'],
128+
this['excludedMethods']
129+
>;
130+
}
131+
132+
export type PgDeleteKind<
133+
T extends PgDeleteHKTBase,
134+
TTable extends PgTable,
135+
TQueryResult extends PgQueryResultHKT,
136+
TSelectedFields extends ColumnsSelection | undefined = undefined,
137+
TReturning extends Record<string, unknown> | undefined = undefined,
138+
TDynamic extends boolean = false,
139+
TExcludedMethods extends string = never,
140+
> = (T & {
141+
table: TTable;
142+
queryResult: TQueryResult;
143+
selectedFields: TSelectedFields;
144+
returning: TReturning;
145+
dynamic: TDynamic;
146+
excludedMethods: TExcludedMethods;
147+
})['_type'];
101148

102149
export interface PgDeleteBase<
150+
THKT extends PgDeleteHKTBase,
103151
TTable extends PgTable,
104152
TQueryResult extends PgQueryResultHKT,
105153
TSelectedFields extends ColumnsSelection | undefined = undefined,
@@ -117,6 +165,7 @@ export interface PgDeleteBase<
117165
{
118166
readonly _: {
119167
readonly dialect: 'pg';
168+
readonly hkt: THKT;
120169
readonly table: TTable;
121170
readonly queryResult: TQueryResult;
122171
readonly selectedFields: TSelectedFields;
@@ -128,6 +177,8 @@ export interface PgDeleteBase<
128177
}
129178

130179
export class PgDeleteBase<
180+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
181+
THKT extends PgDeleteHKTBase,
131182
TTable extends PgTable,
132183
TQueryResult extends PgQueryResultHKT,
133184
TSelectedFields extends ColumnsSelection | undefined = undefined,

0 commit comments

Comments
 (0)