postgrest-js
postgrest-js copied to clipboard
Typing issue when querying children
Bug report
- [x] I confirm this is a bug with Supabase, not with my own application. (well, I hope!)
- [x] I confirm I have searched the Docs, GitHub Discussions, and Discord.
Describe the bug
I believe there's a typing issue when querying children of a row. I'm relatively new so this could possibly be user error, but I received no feedback via Discord nor StackOverflow.
To Reproduce
I have the following generated (from supabase-cli) type for my collections table:
export interface Database {
public: {
Tables: {
collections: {
Row: {
created_at: string
description: string | null
id: string
parent_id: string | null
short_title: string | null
title: string | null
website: string | null
}
Insert: {
created_at?: string
description?: string | null
id?: string
parent_id?: string | null
short_title?: string | null
title?: string | null
website?: string | null
}
Update: {
created_at?: string
description?: string | null
id?: string
parent_id?: string | null
short_title?: string | null
title?: string | null
website?: string | null
}
Relationships: [
{
foreignKeyName: "collections_parent_id_fkey"
columns: ["parent_id"]
isOneToOne: false
referencedRelation: "collections"
referencedColumns: ["id"]
}
]
}
I'm grabbing a particular collection like so:
const { data: collection } = await supabase
.from('collections')
.select(`*, collections(*)`)
.eq(`id`, params.id)
.single()
And this is the typing that's been inferred:
const collection: {
created_at: string;
description: string | null;
id: string;
parent_id: string | null;
short_title: string | null;
title: string | null;
website: string | null;
collections: {
created_at: string;
... 5 more ...;
website: string | null;
} | null;
} | null
Expected behavior
In particular, collections is typed as an object, not an array of objects. However, if I coerce the typing to be any, collections is an array as expected, so this is just an issue with the generated type. Any clues on what I've done wrong or how to fix things?
System information
- OS: Windows
- Browser: Chrome
- Version of supabase-js: 2.38.5
- Version of Node.js: 10.1.0
- Dev environment: GitHub Codespaces
I've noticed this as well.
From what I understand, on a self-referential relationship on a relation collection, when encountering a query like *, collection(*), PostgREST actually prioritizes the foreign relationship (i.e. from-many reference), since the local reference (i.e. to-one reference) can be specified with the column name e.g. *, parent_id(*).
The source for this is at select-query-parser.ts.