- Notifications
You must be signed in to change notification settings - Fork 537
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
Bug report
- I confirm this is a bug with Supabase, not with my own application.
- I confirm I have searched the Docs, GitHub Discussions, and Discord.
Describe the bug
The improvements made to type-safety (see https://github.com/orgs/supabase/discussions/32677) can break with "too complex" types when overriding Database.
To Reproduce
- Take those 2 files
// database.ts import type { MergeDeep } from "type-fest"; import type { Database as DatabaseGenerated } from "./database-generated.types"; type Custom = { version: number; events: Array<{ type: string; [x: string]: any; }>; }; export type Database = MergeDeep< DatabaseGenerated, { public: { Tables: { foo: { Row: { bar: Custom; baz: Custom; }; Insert: { bar: Custom; baz: Custom; }; Update: { bar?: Custom; baz?: Custom; }; }; }; }; } >;// database.generated.ts export type Json = | string | number | boolean | null | { [key: string]: Json | undefined } | Json[] export type Database = { public: { Tables: { foo: { Row: { created_at: string | null bar: Json id: string baz: Json game_id: string updated_at: string | null user_id: string | null } Insert: { created_at?: string | null bar: Json id?: string baz: Json game_id: string updated_at?: string | null user_id?: string | null } Update: { created_at?: string | null bar?: Json id?: string baz?: Json game_id?: string updated_at?: string | null user_id?: string | null } } } Views: {} Functions: { } Enums: { } CompositeTypes: { [_ in never]: never } } } type PublicSchema = Database[Extract<keyof Database, "public">] export type Tables< PublicTableNameOrOptions extends | keyof (PublicSchema["Tables"] & PublicSchema["Views"]) | { schema: keyof Database }, TableName extends PublicTableNameOrOptions extends { schema: keyof Database } ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] & Database[PublicTableNameOrOptions["schema"]]["Views"]) : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { Row: infer R } ? R : never : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & PublicSchema["Views"]) ? (PublicSchema["Tables"] & PublicSchema["Views"])[PublicTableNameOrOptions] extends { Row: infer R } ? R : never : never export type TablesInsert< PublicTableNameOrOptions extends | keyof PublicSchema["Tables"] | { schema: keyof Database }, TableName extends PublicTableNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { Insert: infer I } ? I : never : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { Insert: infer I } ? I : never : never export type TablesUpdate< PublicTableNameOrOptions extends | keyof PublicSchema["Tables"] | { schema: keyof Database }, TableName extends PublicTableNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { Update: infer U } ? U : never : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { Update: infer U } ? U : never : never export type Enums< PublicEnumNameOrOptions extends | keyof PublicSchema["Enums"] | { schema: keyof Database }, EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] : never = never, > = PublicEnumNameOrOptions extends { schema: keyof Database } ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] ? PublicSchema["Enums"][PublicEnumNameOrOptions] : never export type CompositeTypes< PublicCompositeTypeNameOrOptions extends | keyof PublicSchema["CompositeTypes"] | { schema: keyof Database }, CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { schema: keyof Database } ? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] : never = never, > = PublicCompositeTypeNameOrOptions extends { schema: keyof Database } ? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] : PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"] ? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] : never- Instantiate a supabase client
const client = createClient<Database>("", "")- Use the client
const { data } = client .from("foo") .select("id, bar, baz") .eq("id", "...") .single() const bar = {} as Custom const baz = {} as Custom client .from("foo") .update({ bar, baz }) .eq("id", data.id)- TS reports an error:
Type instantiation is excessively deep and possibly infinite
Expected behavior
This error should not occur
Screenshots
If applicable, add screenshots to help explain your problem.
System information
- OS: Linux
- Version of supabase-js: 2.47.12
- Version of Node.js: 20.18.0
Additional context
Add any other context about the problem here.
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working