Skip to content

Commit e26266a

Browse files
authored
non-nullable relationship if inner join (#458)
1 parent 6f5d570 commit e26266a

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

src/select-query-parser.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,9 @@ type ConstructFieldDefinition<
231231
? Child | null
232232
: Relationships extends unknown[]
233233
? HasFKey<Field['hint'], Relationships> extends true
234-
? Child | null
234+
? Field extends { inner: true }
235+
? Child
236+
: Child | null
235237
: Child[]
236238
: Child[]
237239
: never
@@ -260,7 +262,9 @@ type ConstructFieldDefinition<
260262
? Child | null
261263
: Relationships extends unknown[]
262264
? HasFKeyToFRel<Field['original'], Relationships> extends true
263-
? Child | null
265+
? Field extends { inner: true }
266+
? Child
267+
: Child | null
264268
: Child[]
265269
: Child[]
266270
: never
@@ -351,7 +355,7 @@ type ParseField<Input extends string> = Input extends ''
351355
? EatWhitespace<Remainder> extends `!inner${infer Remainder}`
352356
? ParseEmbeddedResource<EatWhitespace<Remainder>> extends [infer Fields, `${infer Remainder}`]
353357
? // `field!inner(nodes)`
354-
[{ name: Name; original: Name; children: Fields }, EatWhitespace<Remainder>]
358+
[{ name: Name; original: Name; children: Fields; inner: true }, EatWhitespace<Remainder>]
355359
: CreateParserErrorIfRequired<
356360
ParseEmbeddedResource<EatWhitespace<Remainder>>,
357361
'Expected embedded resource after `!inner`'
@@ -364,7 +368,10 @@ type ParseField<Input extends string> = Input extends ''
364368
`${infer Remainder}`
365369
]
366370
? // `field!hint!inner(nodes)`
367-
[{ name: Name; original: Name; hint: Hint; children: Fields }, EatWhitespace<Remainder>]
371+
[
372+
{ name: Name; original: Name; hint: Hint; children: Fields; inner: true },
373+
EatWhitespace<Remainder>
374+
]
368375
: CreateParserErrorIfRequired<
369376
ParseEmbeddedResource<EatWhitespace<Remainder>>,
370377
'Expected embedded resource after `!inner`'

test/index.test-d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ const postgrest = new PostgrestClient<Database>(REST_URL)
149149
expectType<Database['public']['Tables']['users']['Row'] | null>(message.user)
150150
}
151151

152+
// !inner relationship
153+
{
154+
const { data: message, error } = await postgrest
155+
.from('messages')
156+
.select('user:users!inner(*)')
157+
.single()
158+
if (error) {
159+
throw new Error(error.message)
160+
}
161+
expectType<Database['public']['Tables']['users']['Row']>(message.user)
162+
}
163+
152164
// one-to-many relationship
153165
{
154166
const { data: user, error } = await postgrest.from('users').select('messages(*)').single()

0 commit comments

Comments
 (0)