Skip to content
This repository was archived by the owner on Oct 9, 2025. It is now read-only.

Commit 13eef66

Browse files
committed
feat(types): replace Required/Optional/Readonly w/ Row/Insert/Update
1 parent cf6a684 commit 13eef66

File tree

3 files changed

+68
-45
lines changed

3 files changed

+68
-45
lines changed

src/PostgrestQueryBuilder.ts

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,7 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
4141
*/
4242
select<
4343
Query extends string = '*',
44-
Result = GetResult<
45-
Table['Required'] & Table['Optional'] & Table['Readonly'],
46-
Query extends '*' ? '*' : Query
47-
>
44+
Result = GetResult<Table['Row'], Query extends '*' ? '*' : Query>
4845
>(
4946
columns?: Query,
5047
{
@@ -54,7 +51,7 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
5451
head?: boolean
5552
count?: 'exact' | 'planned' | 'estimated'
5653
} = {}
57-
): PostgrestFilterBuilder<Table['Required'] & Table['Optional'] & Table['Readonly'], Result> {
54+
): PostgrestFilterBuilder<Table['Row'], Result> {
5855
const method = head ? 'HEAD' : 'GET'
5956
// Remove whitespaces except when quoted
6057
let quoted = false
@@ -92,17 +89,14 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
9289
* @param values The values to insert.
9390
* @param count Count algorithm to use to count rows in a table.
9491
*/
95-
insert<
96-
Row extends Table['Required'] &
97-
Partial<Table['Optional'] & { [_ in keyof Table['Readonly']]?: never }>
98-
>(
92+
insert<Row extends Table['Insert']>(
9993
values: Row | Row[],
10094
{
10195
count,
10296
}: {
10397
count?: 'exact' | 'planned' | 'estimated'
10498
} = {}
105-
): PostgrestFilterBuilder<Table['Required'] & Table['Optional'] & Table['Readonly'], undefined> {
99+
): PostgrestFilterBuilder<Table['Row'], undefined> {
106100
const method = 'POST'
107101

108102
const prefersHeaders = []
@@ -144,10 +138,7 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
144138
* @param options.onConflict By specifying the `on_conflict` query parameter, you can make UPSERT work on a column(s) that has a UNIQUE constraint.
145139
* @param options.ignoreDuplicates Specifies if duplicate rows should be ignored and not inserted.
146140
*/
147-
upsert<
148-
Row extends Table['Required'] &
149-
Partial<Table['Optional']> & { [_ in keyof Table['Readonly']]?: never }
150-
>(
141+
upsert<Row extends Table['Insert']>(
151142
values: Row | Row[],
152143
{
153144
onConflict,
@@ -158,7 +149,7 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
158149
count?: 'exact' | 'planned' | 'estimated'
159150
ignoreDuplicates?: boolean
160151
} = {}
161-
): PostgrestFilterBuilder<Table['Required'] & Table['Optional'] & Table['Readonly'], undefined> {
152+
): PostgrestFilterBuilder<Table['Row'], undefined> {
162153
const method = 'POST'
163154

164155
const prefersHeaders = [`resolution=${ignoreDuplicates ? 'ignore' : 'merge'}-duplicates`]
@@ -191,18 +182,14 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
191182
* @param values The values to update.
192183
* @param count Count algorithm to use to count rows in a table.
193184
*/
194-
update<
195-
Row extends Table['Readonly'] extends Record<string, unknown>
196-
? Partial<Table['Optional' | 'Required']> & { [_ in keyof Table['Readonly']]?: never }
197-
: any
198-
>(
185+
update<Row extends Table['Update']>(
199186
values: Row,
200187
{
201188
count,
202189
}: {
203190
count?: 'exact' | 'planned' | 'estimated'
204191
} = {}
205-
): PostgrestFilterBuilder<Table['Required'] & Table['Optional'] & Table['Readonly'], undefined> {
192+
): PostgrestFilterBuilder<Table['Row'], undefined> {
206193
const method = 'PATCH'
207194
const prefersHeaders = []
208195
const body = values
@@ -235,10 +222,7 @@ export default class PostgrestQueryBuilder<Table extends GenericTable> {
235222
count,
236223
}: {
237224
count?: 'exact' | 'planned' | 'estimated'
238-
} = {}): PostgrestFilterBuilder<
239-
Table['Required'] & Table['Optional'] & Table['Readonly'],
240-
undefined
241-
> {
225+
} = {}): PostgrestFilterBuilder<Table['Row'], undefined> {
242226
const method = 'DELETE'
243227
const prefersHeaders = []
244228
if (count) {

src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ export type PostgrestSingleResponse<T> =
4545
export type PostgrestMaybeSingleResponse<T> = PostgrestSingleResponse<T | undefined>
4646

4747
export type GenericTable = {
48-
Required: Record<string, unknown>
49-
Optional: Record<string, unknown>
50-
Readonly: Record<string, unknown>
48+
Row: Record<string, unknown>
49+
Insert: Record<string, unknown>
50+
Update: Record<string, unknown>
5151
}
5252

5353
export type GenericFunction = {

test/types.ts

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,67 @@ export interface Database {
44
public: {
55
Tables: {
66
users: {
7-
Required: {
7+
Row: {
88
username: string
9-
}
10-
Optional: {
119
data: Json | null
1210
age_range: string | null
1311
status: 'ONLINE' | 'OFFLINE' | null
1412
catchphrase: string | null
1513
}
16-
Readonly: {}
14+
Insert: {
15+
username: string
16+
data?: Json | null
17+
age_range?: string | null
18+
status?: 'ONLINE' | 'OFFLINE' | null
19+
catchphrase?: string | null
20+
}
21+
Update: {
22+
username?: string
23+
data?: Json | null
24+
age_range?: string | null
25+
status?: 'ONLINE' | 'OFFLINE' | null
26+
catchphrase?: string | null
27+
}
1728
}
1829
channels: {
19-
Required: {}
20-
Optional: {
30+
Row: {
2131
id: number
2232
data: Json | null
2333
slug: string | null
2434
}
25-
Readonly: {}
35+
Insert: {
36+
id?: number
37+
data?: Json | null
38+
slug?: string | null
39+
}
40+
Update: {
41+
id?: number
42+
data?: Json | null
43+
slug?: string | null
44+
}
2645
}
2746
messages: {
28-
Required: {
29-
username: string
30-
channel_id: number
31-
}
32-
Optional: {
47+
Row: {
3348
id: number
3449
data: Json | null
3550
message: string | null
51+
username: string
52+
channel_id: number
53+
}
54+
Insert: {
55+
id?: number
56+
data?: Json | null
57+
message?: string | null
58+
username: string
59+
channel_id: number
60+
}
61+
Update: {
62+
id?: number
63+
data?: Json | null
64+
message?: string | null
65+
username?: string
66+
channel_id?: number
3667
}
37-
Readonly: {}
3868
}
3969
}
4070
Functions: {
@@ -62,15 +92,24 @@ export interface Database {
6292
personal: {
6393
Tables: {
6494
users: {
65-
Required: {
95+
Row: {
6696
username: string
67-
}
68-
Optional: {
6997
data: Json | null
7098
age_range: string | null
7199
status: 'ONLINE' | 'OFFLINE' | null
72100
}
73-
Readonly: {}
101+
Insert: {
102+
username: string
103+
data?: Json | null
104+
age_range?: string | null
105+
status?: 'ONLINE' | 'OFFLINE' | null
106+
}
107+
Update: {
108+
username?: string
109+
data?: Json | null
110+
age_range?: string | null
111+
status?: 'ONLINE' | 'OFFLINE' | null
112+
}
74113
}
75114
}
76115
Functions: {

0 commit comments

Comments
 (0)