Skip to content

Commit

Permalink
feat: query parser: handle empty embedded resources ()
Browse files Browse the repository at this point in the history
Closes #445.
  • Loading branch information
bnjmnt4n authored and steve-chavez committed Feb 29, 2024
1 parent e6a64c6 commit 14910bf
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
15 changes: 10 additions & 5 deletions src/select-query-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,8 @@ type ConstructFieldDefinition<
Field['children'],
unknown
>
: Field extends { children: [] }
? {}
: Field extends { name: string; original: string; hint: string; children: unknown[] }
? {
[_ in Field['name']]: GetResultHelper<
Expand Down Expand Up @@ -460,19 +462,22 @@ type ParseJsonAccessor<Input extends string> = Input extends `->${infer Remainde

/**
* Parses an embedded resource, which is an opening `(`, followed by a sequence of
* nodes, separated by `,`, then a closing `)`.
* 0 or more nodes separated by `,`, then a closing `)`.
*
* Returns a tuple of ["Parsed fields", "Remainder of text"], an error,
* or the original string input indicating that no opening `(` was found.
*/
type ParseEmbeddedResource<Input extends string> = Input extends `(${infer Remainder}`
? ParseNodes<EatWhitespace<Remainder>> extends [infer Fields, `${infer Remainder}`]
? EatWhitespace<Remainder> extends `)${infer Remainder}`
? Fields extends []
? ParserError<'Expected fields after `(`'>
: [Fields, EatWhitespace<Remainder>]
? [Fields, EatWhitespace<Remainder>]
: ParserError<`Expected ")"`>
: ParseNodes<EatWhitespace<Remainder>>
: // If no nodes were detected, check for `)` for empty embedded resources `()`.
ParseNodes<EatWhitespace<Remainder>> extends ParserError<string>
? EatWhitespace<Remainder> extends `)${infer Remainder}`
? [[], EatWhitespace<Remainder>]
: ParseNodes<EatWhitespace<Remainder>>
: ParserError<'Expected embedded resource fields or `)`'>
: Input

/**
Expand Down
9 changes: 9 additions & 0 deletions test/index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,15 @@ const postgrest = new PostgrestClient<Database>(REST_URL)
)
}

// embedded resource with no fields
{
const { data, error } = await postgrest.from('messages').select('message, users()').single()
if (error) {
throw new Error(error.message)
}
expectType<{ message: string | null }>(data)
}

// json accessor in select query
{
const { data, error } = await postgrest
Expand Down

0 comments on commit 14910bf

Please sign in to comment.