supabase / postgrest-js

Isomorphic JavaScript client for PostgREST.
https://supabase.com
MIT License
962 stars 128 forks source link

Improve error reporting on insert/upsert calls #519

Open olee opened 4 months ago

olee commented 4 months ago

I noticed that the postgrest client has issues with error highlighting on insert/upsert calls when there is a type missmatch between the expected and provided properties. I was able to trace this back to the overload defined on insert / upsert which is causing typescript to have problems with determining the correct signature if there's an error in the payload and therefore error-highlighting the whole function call:

image

As an example, if I define a function without any overload, the error highlights works way better: image

And if I define my test function with an overload the same way as it is done in the client, it breaks again: image

A solution would be either to unify both calls into a single signature (which would just mean that defaultToNull option would be defined unnecessarily for non-bulk operations) or to just split it into insert & insertBulk / upsert & upsertBulk or something like that.


Original post (less relevant than actual issue) As far as I can see, functions like `insert` and `upsert` in the query builder use a generic type `Row` for the values to insert when in fact this type should not be necessary at all. So instead of this: https://github.com/supabase/postgrest-js/blob/c9cebf8a0a5a3c8dff4a511d70fd53079781f563/src/PostgrestQueryBuilder.ts#L101-L106 It should work better if it is defined like this instead: ```ts insert( values: Relation extends { Insert: unknown } ? Relation['Insert'] : never, options?: { count?: 'exact' | 'planned' | 'estimated' } ): PostgrestFilterBuilder ``` This would improve type discovery a bit and improve error reporting. The reason I say it's not required is because the generic type is only used for the input and not used anywhere on the output.