Skip to content

Commit 1687056

Browse files
authored
fix(postgrest): add incoming major 14 support (#1807)
1 parent d547072 commit 1687056

File tree

10 files changed

+59
-46
lines changed

10 files changed

+59
-46
lines changed

packages/core/postgrest-js/src/PostgrestTransformBuilder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import PostgrestBuilder from './PostgrestBuilder'
22
import PostgrestFilterBuilder, { InvalidMethodError } from './PostgrestFilterBuilder'
33
import { GetResult } from './select-query-parser/result'
4-
import { CheckMatchingArrayTypes, MaxAffectedEnabled } from './types/types'
4+
import { CheckMatchingArrayTypes } from './types/types'
55
import { ClientServerOptions, GenericSchema } from './types/common/common'
6+
import type { MaxAffectedEnabled } from './types/feature-flags'
67

78
export default class PostgrestTransformBuilder<
89
ClientOptions extends ClientServerOptions,

packages/core/postgrest-js/src/select-query-parser/result.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ import {
2424
ResolveRelationship,
2525
SelectQueryError,
2626
} from './utils'
27-
28-
export type SpreadOnManyEnabled<PostgrestVersion extends string | undefined> =
29-
PostgrestVersion extends `13${string}` ? true : false
27+
import type { SpreadOnManyEnabled } from '../types/feature-flags'
3028

3129
/**
3230
* Main entry point for constructing the result type of a PostgREST query.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
type IsPostgrest13<PostgrestVersion extends string | undefined> =
2+
PostgrestVersion extends `13${string}` ? true : false
3+
type IsPostgrest14<PostgrestVersion extends string | undefined> =
4+
PostgrestVersion extends `14${string}` ? true : false
5+
6+
type IsPostgrestVersionGreaterThan12<PostgrestVersion extends string | undefined> =
7+
IsPostgrest13<PostgrestVersion> extends true
8+
? true
9+
: IsPostgrest14<PostgrestVersion> extends true
10+
? true
11+
: false
12+
13+
export type MaxAffectedEnabled<PostgrestVersion extends string | undefined> =
14+
IsPostgrestVersionGreaterThan12<PostgrestVersion> extends true ? true : false
15+
16+
export type SpreadOnManyEnabled<PostgrestVersion extends string | undefined> =
17+
IsPostgrestVersionGreaterThan12<PostgrestVersion> extends true ? true : false

packages/core/postgrest-js/src/types/types.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ export type DatabaseWithOptions<Database, Options extends ClientServerOptions> =
3535
options: Options
3636
}
3737

38-
export type MaxAffectedEnabled<PostgrestVersion extends string | undefined> =
39-
PostgrestVersion extends `13${string}` ? true : false
40-
4138
// https://twitter.com/mattpocockuk/status/1622730173446557697
4239
export type Prettify<T> = { [K in keyof T]: T[K] } & {}
4340

packages/core/postgrest-js/test/db/docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# docker-compose.yml
22
services:
3-
rest13:
4-
image: postgrest/postgrest:v13.0.0
3+
rest14:
4+
image: postgrest/postgrest:v14.0
55
ports:
66
- '3001:3000'
77
environment:

packages/core/postgrest-js/test/index.test-d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { PostgrestClient, PostgrestError } from '../src/index'
33
import { Prettify } from '../src/types/types'
44
import { Json } from '../src/select-query-parser/types'
55
import { Database } from './types.override'
6-
import { Database as DatabaseWithOptions } from './types.override-with-options-postgrest13'
6+
import { Database as DatabaseWithOptions } from './types.override-with-options-postgrest14'
77

88
const REST_URL = 'http://localhost:3000'
99
const postgrest = new PostgrestClient<Database>(REST_URL)

packages/core/postgrest-js/test/max-affected.test.ts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { PostgrestClient } from '../src/index'
22
import { Database } from './types.override'
3-
import { Database as DatabasePostgrest13 } from './types.override-with-options-postgrest13'
3+
import { Database as DatabasePostgrest14 } from './types.override-with-options-postgrest14'
44
import { expectType, TypeEqual } from './types'
55
import { InvalidMethodError } from '../src/PostgrestFilterBuilder'
66
import { z } from 'zod'
77
import { RequiredDeep } from 'type-fest'
88

9-
const REST_URL_13 = 'http://localhost:3001'
10-
const postgrest13 = new PostgrestClient<DatabasePostgrest13>(REST_URL_13)
11-
const postgrest12 = new PostgrestClient<Database>(REST_URL_13)
9+
const REST_URL_14 = 'http://localhost:3001'
10+
const postgrest14 = new PostgrestClient<DatabasePostgrest14>(REST_URL_14)
11+
const postgrest12 = new PostgrestClient<Database>(REST_URL_14)
1212

1313
const MessageRowSchema = z.object({
1414
channel_id: z.number(),
@@ -28,22 +28,22 @@ describe('maxAffected', () => {
2828
expectType<InvalidMethodError<'maxAffected method only available on postgrest 13+'>>(resUpdate)
2929
})
3030
test('types: maxAffected should show type warning on non update / delete', async () => {
31-
const resSelect = postgrest13.from('messages').select('*').maxAffected(10)
32-
const resInsert = postgrest13
31+
const resSelect = postgrest14.from('messages').select('*').maxAffected(10)
32+
const resInsert = postgrest14
3333
.from('messages')
3434
.insert({ message: 'foo', username: 'supabot', channel_id: 1 })
3535
.maxAffected(10)
36-
const resUpsert = postgrest13
36+
const resUpsert = postgrest14
3737
.from('messages')
3838
.upsert({ id: 3, message: 'foo', username: 'supabot', channel_id: 2 })
3939
.maxAffected(10)
40-
const resUpdate = postgrest13
40+
const resUpdate = postgrest14
4141
.from('messages')
4242
.update({ channel_id: 2 })
4343
.eq('message', 'foo')
4444
.maxAffected(1)
4545
.select()
46-
const resDelete = postgrest13
46+
const resDelete = postgrest14
4747
.from('messages')
4848
.delete()
4949
.eq('message', 'foo')
@@ -70,14 +70,14 @@ describe('maxAffected', () => {
7070

7171
test('update should fail when maxAffected is exceeded', async () => {
7272
// First create multiple rows
73-
await postgrest13.from('messages').insert([
73+
await postgrest14.from('messages').insert([
7474
{ message: 'test1', username: 'supabot', channel_id: 1 },
7575
{ message: 'test1', username: 'supabot', channel_id: 1 },
7676
{ message: 'test1', username: 'supabot', channel_id: 1 },
7777
])
7878

7979
// Try to update all rows with maxAffected=2
80-
const result = await postgrest13
80+
const result = await postgrest14
8181
.from('messages')
8282
.update({ message: 'updated' })
8383
.eq('message', 'test1')
@@ -88,17 +88,17 @@ describe('maxAffected', () => {
8888
expect(error?.code).toBe('PGRST124')
8989

9090
// cleanup
91-
await postgrest13.from('messages').delete().eq('message', 'test1')
91+
await postgrest14.from('messages').delete().eq('message', 'test1')
9292
})
9393

9494
test('update should succeed when within maxAffected limit', async () => {
9595
// First create a single row
96-
await postgrest13
96+
await postgrest14
9797
.from('messages')
9898
.insert([{ message: 'test2', username: 'supabot', channel_id: 1 }])
9999

100100
// Try to update with maxAffected=2
101-
const { data, error } = await postgrest13
101+
const { data, error } = await postgrest14
102102
.from('messages')
103103
.update({ message: 'updated' })
104104
.eq('message', 'test2')
@@ -116,19 +116,19 @@ describe('maxAffected', () => {
116116
expect(data?.[0].message).toBe('updated')
117117

118118
// cleanup
119-
await postgrest13.from('messages').delete().eq('message', 'updated')
119+
await postgrest14.from('messages').delete().eq('message', 'updated')
120120
})
121121

122122
test('delete should fail when maxAffected is exceeded', async () => {
123123
// First create multiple rows
124-
await postgrest13.from('messages').insert([
124+
await postgrest14.from('messages').insert([
125125
{ message: 'test3', username: 'supabot', channel_id: 1 },
126126
{ message: 'test3', username: 'supabot', channel_id: 1 },
127127
{ message: 'test3', username: 'supabot', channel_id: 1 },
128128
])
129129

130130
// Try to delete all rows with maxAffected=2
131-
const { error } = await postgrest13
131+
const { error } = await postgrest14
132132
.from('messages')
133133
.delete()
134134
.eq('message', 'test3')
@@ -138,17 +138,17 @@ describe('maxAffected', () => {
138138
expect(error?.code).toBe('PGRST124')
139139

140140
// cleanup
141-
await postgrest13.from('messages').delete().eq('message', 'test3')
141+
await postgrest14.from('messages').delete().eq('message', 'test3')
142142
})
143143

144144
test('delete should succeed when within maxAffected limit', async () => {
145145
// First create a single row
146-
await postgrest13
146+
await postgrest14
147147
.from('messages')
148148
.insert([{ message: 'test4', username: 'supabot', channel_id: 1 }])
149149

150150
// Try to delete with maxAffected=2
151-
const { data, error } = await postgrest13
151+
const { data, error } = await postgrest14
152152
.from('messages')
153153
.delete()
154154
.eq('message', 'test4')
@@ -162,9 +162,9 @@ describe('maxAffected', () => {
162162

163163
test('should be able to use .maxAffected with setof records returning rpc', async () => {
164164
// First create a user that will be returned by the RPC
165-
await postgrest13.from('users').insert([{ username: 'testuser', status: 'ONLINE' }])
165+
await postgrest14.from('users').insert([{ username: 'testuser', status: 'ONLINE' }])
166166
// Call the RPC function that returns a set of records
167-
const { data, error } = await postgrest13
167+
const { data, error } = await postgrest14
168168
.rpc('set_users_offline', { name_param: 'testuser' })
169169
.maxAffected(1)
170170
.select()
@@ -182,19 +182,19 @@ describe('maxAffected', () => {
182182
])
183183

184184
// cleanup
185-
await postgrest13.from('users').delete().eq('username', 'testuser')
185+
await postgrest14.from('users').delete().eq('username', 'testuser')
186186
})
187187

188188
test('should fail when rpc returns more results than maxAffected', async () => {
189189
// First create multiple users that will be returned by the RPC
190-
await postgrest13.from('users').insert([
190+
await postgrest14.from('users').insert([
191191
{ username: 'testuser1', status: 'ONLINE' },
192192
{ username: 'testuser2', status: 'ONLINE' },
193193
{ username: 'testuser3', status: 'ONLINE' },
194194
])
195195

196196
// Call the RPC function that returns a set of records
197-
const { data, error } = await postgrest13
197+
const { data, error } = await postgrest14
198198
.rpc('set_users_offline', { name_param: 'testuser%' })
199199
.maxAffected(1)
200200
.select()
@@ -204,6 +204,6 @@ describe('maxAffected', () => {
204204
expect(data).toBeNull()
205205

206206
// cleanup
207-
await postgrest13.from('users').delete().in('username', ['testuser1', 'testuser2', 'testuser3'])
207+
await postgrest14.from('users').delete().in('username', ['testuser1', 'testuser2', 'testuser3'])
208208
})
209209
})

packages/core/postgrest-js/test/relationships-spread-operations.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { PostgrestClient } from '../src/index'
22
import { Database } from './types.override'
3-
import { Database as DatabaseWithOptions13 } from './types.override-with-options-postgrest13'
3+
import { Database as DatabaseWithOptions13 } from './types.override-with-options-postgrest14'
44
import { expectType, TypeEqual } from './types'
55
import { z } from 'zod'
66

77
const REST_URL = 'http://localhost:3000'
88
const postgrest = new PostgrestClient<Database>(REST_URL)
9-
const REST_URL_13 = 'http://localhost:3001'
10-
const postgrest13 = new PostgrestClient<Database, { PostgrestVersion: '13' }>(REST_URL_13)
11-
const postgrest13FromDatabaseTypes = new PostgrestClient<DatabaseWithOptions13>(REST_URL_13)
9+
const REST_URL_14 = 'http://localhost:3001'
10+
const postgrest14 = new PostgrestClient<Database, { PostgrestVersion: '13' }>(REST_URL_14)
11+
const postgrest14FromDatabaseTypes = new PostgrestClient<DatabaseWithOptions13>(REST_URL_14)
1212

1313
test('select with aggregate count and spread', async () => {
1414
const res = await postgrest
@@ -326,8 +326,8 @@ test('select with spread on nested relation', async () => {
326326
ExpectedSchema.parse(res.data)
327327
})
328328

329-
test('select spread on many relation postgrest13', async () => {
330-
const res = await postgrest13
329+
test('select spread on many relation postgrest14', async () => {
330+
const res = await postgrest14
331331
.from('channels')
332332
.select('channel_id:id, ...messages(id, message)')
333333
.limit(1)
@@ -360,8 +360,8 @@ test('select spread on many relation postgrest13', async () => {
360360
ExpectedSchema.parse(res.data)
361361
})
362362

363-
test('select spread on many relation postgrest13FromDatabaseTypes', async () => {
364-
const res = await postgrest13FromDatabaseTypes
363+
test('select spread on many relation postgrest14FromDatabaseTypes', async () => {
364+
const res = await postgrest14FromDatabaseTypes
365365
.from('channels')
366366
.select('channel_id:id, ...messages(id, message)')
367367
.limit(1)

packages/core/postgrest-js/test/types.generated-with-options-postgrest13.ts renamed to packages/core/postgrest-js/test/types.generated-with-options-postgrest14.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export type Database = OriginalDatabase & {
55
// This is a dummy non existent schema to allow automatically passing down options
66
// to the instanciated client at type levels from the introspected database
77
__InternalSupabase: {
8-
PostgrestVersion: '13.0.12'
8+
PostgrestVersion: '14.0'
99
}
1010
}
1111

packages/core/postgrest-js/test/types.override-with-options-postgrest13.ts renamed to packages/core/postgrest-js/test/types.override-with-options-postgrest14.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Database as GeneratedDatabase } from './types.generated-with-options-postgrest13'
1+
import type { Database as GeneratedDatabase } from './types.generated-with-options-postgrest14'
22
import { MergeDeep } from 'type-fest'
33

44
export type CustomUserDataType = {

0 commit comments

Comments
 (0)