diff --git a/package.json b/package.json index d46e8b73..2942deeb 100644 --- a/package.json +++ b/package.json @@ -39,10 +39,12 @@ "docs:json": "typedoc --json docs/v2/spec.json --excludeExternals src/index.ts", "test": "run-s format:check test:types db:clean db:run test:run db:clean && node test/smoke.cjs && node test/smoke.mjs", "test:run": "jest --runInBand --coverage", - "test:update": "run-s db:clean db:run && jest --runInBand --updateSnapshot && run-s db:clean", + "test:update": "run-s db:clean db:run db:generate-test-types && jest --runInBand --updateSnapshot && run-s db:clean", "test:types": "run-s build && tsd --files 'test/**/*.test-d.ts'", + "test:types:watch": "run-s build && tsd --files 'test/**/*.test-d.ts' --watch", "db:clean": "cd test/db && docker compose down --volumes", - "db:run": "cd test/db && docker compose up --detach && wait-for-localhost 3000" + "db:run": "cd test/db && docker compose up --detach && wait-for-localhost 3000", + "db:generate-test-types": "cd test/db && docker compose up --detach && wait-for-localhost 8080 && curl --location 'http://0.0.0.0:8080/generators/typescript?included_schemas=public,personal&detect_one_to_one_relationships=true' > ../types.generated.ts && sed -i 's/export type Json = .*/export type Json = unknown;/' ../types.generated.ts" }, "dependencies": { "@supabase/node-fetch": "^2.6.14" diff --git a/test/basic.ts b/test/basic.ts index 71d884fa..d2317cab 100644 --- a/test/basic.ts +++ b/test/basic.ts @@ -1,5 +1,5 @@ import { PostgrestClient } from '../src/index' -import { CustomUserDataType, Database } from './types' +import { CustomUserDataType, Database } from './types.override' const REST_URL = 'http://localhost:3000' const postgrest = new PostgrestClient(REST_URL) diff --git a/test/db/docker-compose.yml b/test/db/docker-compose.yml index ac2f5e1c..c2f91a1d 100644 --- a/test/db/docker-compose.yml +++ b/test/db/docker-compose.yml @@ -28,3 +28,9 @@ services: POSTGRES_PASSWORD: postgres POSTGRES_HOST: /var/run/postgresql POSTGRES_PORT: 5432 + pgmeta: + image: supabase/postgres-meta:v0.87.1 + ports: + - '8080:8080' + environment: + - PG_META_DB_URL=postgresql://postgres:postgres@db:5432/postgres diff --git a/test/filters.ts b/test/filters.ts index 3338ec37..6de5f1ca 100644 --- a/test/filters.ts +++ b/test/filters.ts @@ -1,5 +1,5 @@ import { PostgrestClient } from '../src/index' -import { Database } from './types' +import { Database } from './types.override' const postgrest = new PostgrestClient('http://localhost:3000') diff --git a/test/index.test-d.ts b/test/index.test-d.ts index 5db92c5d..b357050c 100644 --- a/test/index.test-d.ts +++ b/test/index.test-d.ts @@ -2,7 +2,8 @@ import { TypeEqual } from 'ts-expect' import { expectError, expectType } from 'tsd' import { PostgrestClient, PostgrestError } from '../src/index' import { Prettify } from '../src/types' -import { Database, Json } from './types' +import { Json } from '../src/select-query-parser/types' +import { Database } from './types.override' const REST_URL = 'http://localhost:3000' const postgrest = new PostgrestClient(REST_URL) @@ -189,8 +190,6 @@ const postgrest = new PostgrestClient(REST_URL) if (result.error) { throw new Error(result.error.message) } - // getting this w/o the cast, not sure why: - // Parameter type Json is declared too wide for argument type Json expectType(result.data.bar) expectType(result.data.baz) } diff --git a/test/override-types.test-d.ts b/test/override-types.test-d.ts index 41be1c19..dd73c13e 100644 --- a/test/override-types.test-d.ts +++ b/test/override-types.test-d.ts @@ -1,7 +1,8 @@ import { expectType } from 'tsd' import { TypeEqual } from 'ts-expect' import { PostgrestClient } from '../src' -import { CustomUserDataType, Database, Json } from './types' +import { CustomUserDataType, Database } from './types.override' +import { Json } from './types.generated' const REST_URL = 'http://localhost:54321' const postgrest = new PostgrestClient(REST_URL) diff --git a/test/relationships.ts b/test/relationships.ts index 8d2b9ba6..c826f165 100644 --- a/test/relationships.ts +++ b/test/relationships.ts @@ -1,5 +1,5 @@ import { PostgrestClient } from '../src/index' -import { Database } from './types' +import { Database } from './types.override' const REST_URL = 'http://localhost:3000' export const postgrest = new PostgrestClient(REST_URL) diff --git a/test/resource-embedding.ts b/test/resource-embedding.ts index b3cca1a8..becbc486 100644 --- a/test/resource-embedding.ts +++ b/test/resource-embedding.ts @@ -1,5 +1,5 @@ import { PostgrestClient } from '../src/index' -import { Database } from './types' +import { Database } from './types.override' const postgrest = new PostgrestClient('http://localhost:3000') diff --git a/test/returns.test-d.ts b/test/returns.test-d.ts index 040d3569..f6e5f5a8 100644 --- a/test/returns.test-d.ts +++ b/test/returns.test-d.ts @@ -1,6 +1,6 @@ import { expectType } from 'tsd' import { PostgrestBuilder, PostgrestClient } from '../src/index' -import { Database } from './types' +import { Database } from './types.override' import { TypeEqual } from 'ts-expect' const REST_URL = 'http://localhost:3000' diff --git a/test/rpc.ts b/test/rpc.ts index 8e1e263f..534fd42a 100644 --- a/test/rpc.ts +++ b/test/rpc.ts @@ -1,5 +1,5 @@ import { PostgrestClient } from '../src/index' -import { Database } from './types' +import { Database } from './types.override' const REST_URL = 'http://localhost:3000' export const postgrest = new PostgrestClient(REST_URL) diff --git a/test/select-query-parser/result.test-d.ts b/test/select-query-parser/result.test-d.ts index 508424f0..b2564258 100644 --- a/test/select-query-parser/result.test-d.ts +++ b/test/select-query-parser/result.test-d.ts @@ -1,9 +1,11 @@ -import { Database, Json } from '../types' +import { Database } from '../types.override' import { selectParams } from '../relationships' import { GetResult } from '../../src/select-query-parser/result' import { expectType } from 'tsd' import { TypeEqual } from 'ts-expect' import { SelectQueryError } from '../../src/select-query-parser/utils' +// TODO: should change this type in favor of unknown instead of the current one +import type { Json } from '../../src/select-query-parser/types' type SelectQueryFromTableResult< TableName extends keyof Database['public']['Tables'], diff --git a/test/select-query-parser/rpc.test-d.ts b/test/select-query-parser/rpc.test-d.ts index f22b915b..3f94c11f 100644 --- a/test/select-query-parser/rpc.test-d.ts +++ b/test/select-query-parser/rpc.test-d.ts @@ -1,5 +1,5 @@ import { postgrest, selectParams, RPC_NAME } from '../rpc' -import { Database } from '../types' +import { Database } from '../types.override' import { expectType } from 'tsd' import { TypeEqual } from 'ts-expect' diff --git a/test/select-query-parser/select.test-d.ts b/test/select-query-parser/select.test-d.ts index 431c84eb..11726d9f 100644 --- a/test/select-query-parser/select.test-d.ts +++ b/test/select-query-parser/select.test-d.ts @@ -3,7 +3,7 @@ import { TypeEqual } from 'ts-expect' import { Json } from '../../src/select-query-parser/types' import { SelectQueryError } from '../../src/select-query-parser/utils' import { Prettify } from '../../src/types' -import { CustomUserDataType, Database } from '../types' +import { CustomUserDataType, Database } from '../types.override' import { selectQueries } from '../relationships' // This test file is here to ensure that for a query against a specfic datatabase diff --git a/test/transforms.ts b/test/transforms.ts index 10892d8f..e60e0969 100644 --- a/test/transforms.ts +++ b/test/transforms.ts @@ -1,5 +1,5 @@ import { PostgrestClient } from '../src/index' -import { Database } from './types' +import { Database } from './types.override' import { AbortController } from 'node-abort-controller' diff --git a/test/types.ts b/test/types.generated.ts similarity index 72% rename from test/types.ts rename to test/types.generated.ts index 4efaa8fd..8f228052 100644 --- a/test/types.ts +++ b/test/types.generated.ts @@ -1,14 +1,4 @@ -export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[] - -export type CustomUserDataType = { - foo: string - bar: { - baz: number - } - en: 'ONE' | 'TWO' | 'THREE' - record: Record | null - recordNumber: Record | null -} +export type Json = unknown export type Database = { personal: { @@ -16,19 +6,19 @@ export type Database = { users: { Row: { age_range: unknown | null - data: CustomUserDataType | null + data: Json | null status: Database['public']['Enums']['user_status'] | null username: string } Insert: { age_range?: unknown | null - data?: CustomUserDataType | null + data?: Json | null status?: Database['public']['Enums']['user_status'] | null username: string } Update: { age_range?: unknown | null - data?: CustomUserDataType | null + data?: Json | null status?: Database['public']['Enums']['user_status'] | null username?: string } @@ -96,13 +86,6 @@ export type Database = { referencedRelation: 'users' referencedColumns: ['username'] }, - { - foreignKeyName: 'best_friends_first_user_fkey' - columns: ['first_user'] - isOneToOne: false - referencedRelation: 'users' - referencedColumns: ['username'] - }, { foreignKeyName: 'best_friends_second_user_fkey' columns: ['second_user'] @@ -124,13 +107,6 @@ export type Database = { referencedRelation: 'users' referencedColumns: ['username'] }, - { - foreignKeyName: 'best_friends_second_user_fkey' - columns: ['second_user'] - isOneToOne: false - referencedRelation: 'users' - referencedColumns: ['username'] - }, { foreignKeyName: 'best_friends_third_wheel_fkey' columns: ['third_wheel'] @@ -151,16 +127,50 @@ export type Database = { isOneToOne: false referencedRelation: 'users' referencedColumns: ['username'] - }, + } + ] + } + booking: { + Row: { + hotel_id: number | null + id: number + } + Insert: { + hotel_id?: number | null + id?: number + } + Update: { + hotel_id?: number | null + id?: number + } + Relationships: [ { - foreignKeyName: 'best_friends_third_wheel_fkey' - columns: ['third_wheel'] + foreignKeyName: 'booking_hotel_id_fkey' + columns: ['hotel_id'] isOneToOne: false - referencedRelation: 'users' - referencedColumns: ['username'] + referencedRelation: 'hotel' + referencedColumns: ['id'] } ] } + categories: { + Row: { + description: string | null + id: number + name: string + } + Insert: { + description?: string | null + id?: number + name: string + } + Update: { + description?: string | null + id?: number + name?: string + } + Relationships: [] + } channel_details: { Row: { details: string | null @@ -175,13 +185,6 @@ export type Database = { id?: number } Relationships: [ - { - foreignKeyName: 'channel_details_id_fkey' - columns: ['id'] - isOneToOne: true - referencedRelation: 'channels' - referencedColumns: ['id'] - }, { foreignKeyName: 'channel_details_id_fkey' columns: ['id'] @@ -226,13 +229,6 @@ export type Database = { parent_id?: number | null } Relationships: [ - { - foreignKeyName: 'collections_parent_id_fkey' - columns: ['parent_id'] - isOneToOne: false - referencedRelation: 'collections' - referencedColumns: ['id'] - }, { foreignKeyName: 'collections_parent_id_fkey' columns: ['parent_id'] @@ -242,6 +238,39 @@ export type Database = { } ] } + cornercase: { + Row: { + array_column: string[] | null + 'column whitespace': string | null + id: number + } + Insert: { + array_column?: string[] | null + 'column whitespace'?: string | null + id: number + } + Update: { + array_column?: string[] | null + 'column whitespace'?: string | null + id?: number + } + Relationships: [] + } + hotel: { + Row: { + id: number + name: string | null + } + Insert: { + id?: number + name?: string | null + } + Update: { + id?: number + name?: string | null + } + Relationships: [] + } messages: { Row: { channel_id: number @@ -265,13 +294,6 @@ export type Database = { username?: string } Relationships: [ - { - foreignKeyName: 'messages_channel_id_fkey' - columns: ['channel_id'] - isOneToOne: false - referencedRelation: 'channels' - referencedColumns: ['id'] - }, { foreignKeyName: 'messages_channel_id_fkey' columns: ['channel_id'] @@ -293,13 +315,6 @@ export type Database = { referencedRelation: 'updatable_view' referencedColumns: ['username'] }, - { - foreignKeyName: 'messages_username_fkey' - columns: ['username'] - isOneToOne: false - referencedRelation: 'users' - referencedColumns: ['username'] - }, { foreignKeyName: 'messages_username_fkey' columns: ['username'] @@ -323,20 +338,6 @@ export type Database = { product_id?: number } Relationships: [ - { - foreignKeyName: 'product_categories_category_id_fkey' - columns: ['category_id'] - isOneToOne: false - referencedRelation: 'categories' - referencedColumns: ['id'] - }, - { - foreignKeyName: 'product_categories_product_id_fkey' - columns: ['product_id'] - isOneToOne: false - referencedRelation: 'products' - referencedColumns: ['id'] - }, { foreignKeyName: 'product_categories_category_id_fkey' columns: ['category_id'] @@ -374,24 +375,6 @@ export type Database = { } Relationships: [] } - categories: { - Row: { - description: string | null - id: number - name: string - } - Insert: { - description?: string | null - id?: number - name: string - } - Update: { - description?: string | null - id?: number - name?: string - } - Relationships: [] - } shops: { Row: { address: string | null @@ -410,48 +393,6 @@ export type Database = { } Relationships: [] } - cornercase: { - Row: { - 'column whitespace': string | null - array_column: unknown | null - id: number - } - Insert: { - 'column whitespace'?: string | null - array_column?: unknown | null - id: number - } - Update: { - 'column whitespace'?: string | null - array_column?: unknown | null - id?: number - } - Relationships: [] - } - users: { - Row: { - age_range: unknown | null - catchphrase: unknown | null - data: CustomUserDataType | null - status: Database['public']['Enums']['user_status'] | null - username: string - } - Insert: { - age_range?: unknown | null - catchphrase?: unknown | null - data?: CustomUserDataType | null - status?: Database['public']['Enums']['user_status'] | null - username: string - } - Update: { - age_range?: unknown | null - catchphrase?: unknown | null - data?: CustomUserDataType | null - status?: Database['public']['Enums']['user_status'] | null - username?: string - } - Relationships: [] - } user_profiles: { Row: { id: number @@ -486,51 +427,30 @@ export type Database = { isOneToOne: false referencedRelation: 'users' referencedColumns: ['username'] - }, - { - foreignKeyName: 'user_profiles_username_fkey' - columns: ['username'] - isOneToOne: false - referencedRelation: 'users' - referencedColumns: ['username'] - } - ] - } - booking: { - Row: { - hotel_id: number | null - id: number - } - Insert: { - hotel_id?: number | null - id?: number - } - Update: { - hotel_id?: number | null - id?: number - } - Relationships: [ - { - foreignKeyName: 'booking_hotel_id_fkey' - columns: ['hotel_id'] - isOneToOne: false - referencedRelation: 'hotel' - referencedColumns: ['id'] } ] } - hotel: { + users: { Row: { - id: number - name: string | null + age_range: unknown | null + catchphrase: unknown | null + data: Json | null + status: Database['public']['Enums']['user_status'] | null + username: string } Insert: { - id?: number - name?: string | null + age_range?: unknown | null + catchphrase?: unknown | null + data?: Json | null + status?: Database['public']['Enums']['user_status'] | null + username: string } Update: { - id?: number - name?: string | null + age_range?: unknown | null + catchphrase?: unknown | null + data?: Json | null + status?: Database['public']['Enums']['user_status'] | null + username?: string } Relationships: [] } @@ -606,25 +526,27 @@ export type Database = { } } -type PublicSchema = Database[Extract] +type DefaultSchema = Database[Extract] export type Tables< - PublicTableNameOrOptions extends - | keyof (PublicSchema['Tables'] & PublicSchema['Views']) + DefaultSchemaTableNameOrOptions extends + | keyof (DefaultSchema['Tables'] & DefaultSchema['Views']) | { schema: keyof Database }, - TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof (Database[PublicTableNameOrOptions['schema']]['Tables'] & - Database[PublicTableNameOrOptions['schema']]['Views']) + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof Database + } + ? keyof (Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & + Database[DefaultSchemaTableNameOrOptions['schema']]['Views']) : never = never -> = PublicTableNameOrOptions extends { schema: keyof Database } - ? (Database[PublicTableNameOrOptions['schema']]['Tables'] & - Database[PublicTableNameOrOptions['schema']]['Views'])[TableName] extends { +> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } + ? (Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & + Database[DefaultSchemaTableNameOrOptions['schema']]['Views'])[TableName] extends { Row: infer R } ? R : never - : PublicTableNameOrOptions extends keyof (PublicSchema['Tables'] & PublicSchema['Views']) - ? (PublicSchema['Tables'] & PublicSchema['Views'])[PublicTableNameOrOptions] extends { + : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema['Tables'] & DefaultSchema['Views']) + ? (DefaultSchema['Tables'] & DefaultSchema['Views'])[DefaultSchemaTableNameOrOptions] extends { Row: infer R } ? R @@ -632,18 +554,22 @@ export type Tables< : never export type TablesInsert< - PublicTableNameOrOptions extends keyof PublicSchema['Tables'] | { schema: keyof Database }, - TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicTableNameOrOptions['schema']]['Tables'] + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema['Tables'] + | { schema: keyof Database }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] : never = never -> = PublicTableNameOrOptions extends { schema: keyof Database } - ? Database[PublicTableNameOrOptions['schema']]['Tables'][TableName] extends { +> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } + ? Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { Insert: infer I } ? I : never - : PublicTableNameOrOptions extends keyof PublicSchema['Tables'] - ? PublicSchema['Tables'][PublicTableNameOrOptions] extends { + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] + ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { Insert: infer I } ? I @@ -651,18 +577,22 @@ export type TablesInsert< : never export type TablesUpdate< - PublicTableNameOrOptions extends keyof PublicSchema['Tables'] | { schema: keyof Database }, - TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicTableNameOrOptions['schema']]['Tables'] + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema['Tables'] + | { schema: keyof Database }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] : never = never -> = PublicTableNameOrOptions extends { schema: keyof Database } - ? Database[PublicTableNameOrOptions['schema']]['Tables'][TableName] extends { +> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } + ? Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { Update: infer U } ? U : never - : PublicTableNameOrOptions extends keyof PublicSchema['Tables'] - ? PublicSchema['Tables'][PublicTableNameOrOptions] extends { + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] + ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { Update: infer U } ? U @@ -670,12 +600,42 @@ export type TablesUpdate< : never export type Enums< - PublicEnumNameOrOptions extends keyof PublicSchema['Enums'] | { schema: keyof Database }, - EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicEnumNameOrOptions['schema']]['Enums'] + DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums'] | { schema: keyof Database }, + EnumName extends DefaultSchemaEnumNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[DefaultSchemaEnumNameOrOptions['schema']]['Enums'] + : never = never +> = DefaultSchemaEnumNameOrOptions extends { schema: keyof Database } + ? Database[DefaultSchemaEnumNameOrOptions['schema']]['Enums'][EnumName] + : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums'] + ? DefaultSchema['Enums'][DefaultSchemaEnumNameOrOptions] + : never + +export type CompositeTypes< + PublicCompositeTypeNameOrOptions extends + | keyof DefaultSchema['CompositeTypes'] + | { schema: keyof Database }, + CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'] : never = never -> = PublicEnumNameOrOptions extends { schema: keyof Database } - ? Database[PublicEnumNameOrOptions['schema']]['Enums'][EnumName] - : PublicEnumNameOrOptions extends keyof PublicSchema['Enums'] - ? PublicSchema['Enums'][PublicEnumNameOrOptions] +> = PublicCompositeTypeNameOrOptions extends { schema: keyof Database } + ? Database[PublicCompositeTypeNameOrOptions['schema']]['CompositeTypes'][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema['CompositeTypes'] + ? DefaultSchema['CompositeTypes'][PublicCompositeTypeNameOrOptions] : never + +export const Constants = { + personal: { + Enums: { + user_status: ['ONLINE', 'OFFLINE'], + }, + }, + public: { + Enums: { + user_status: ['ONLINE', 'OFFLINE'], + }, + }, +} as const diff --git a/test/types.override.ts b/test/types.override.ts new file mode 100644 index 00000000..65fab3ac --- /dev/null +++ b/test/types.override.ts @@ -0,0 +1,149 @@ +import type { Database as GeneratedDatabase } from './types.generated' +import { MergeDeep } from 'type-fest' + +export type CustomUserDataType = { + foo: string + bar: { + baz: number + } + en: 'ONE' | 'TWO' | 'THREE' + record: Record | null + recordNumber: Record | null +} + +export type Database = MergeDeep< + GeneratedDatabase, + { + personal: { + Tables: { + users: { + Row: { + data: CustomUserDataType | null + } + Insert: { + data?: CustomUserDataType | null + } + Update: { + data?: CustomUserDataType | null + } + } + } + } + public: { + Tables: { + users: { + Row: { + data: CustomUserDataType | null + } + Insert: { + data?: CustomUserDataType | null + } + Update: { + data?: CustomUserDataType | null + } + } + } + } + } +> + +type DefaultSchema = Database[Extract] + +export type Tables< + DefaultSchemaTableNameOrOptions extends + | keyof (DefaultSchema['Tables'] & DefaultSchema['Views']) + | { schema: keyof Database }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof Database + } + ? keyof (Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & + Database[DefaultSchemaTableNameOrOptions['schema']]['Views']) + : never = never +> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } + ? (Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] & + Database[DefaultSchemaTableNameOrOptions['schema']]['Views'])[TableName] extends { + Row: infer R + } + ? R + : never + : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema['Tables'] & DefaultSchema['Views']) + ? (DefaultSchema['Tables'] & DefaultSchema['Views'])[DefaultSchemaTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never + +export type TablesInsert< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema['Tables'] + | { schema: keyof Database }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] + : never = never +> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } + ? Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { + Insert: infer I + } + ? I + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] + ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never + +export type TablesUpdate< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema['Tables'] + | { schema: keyof Database }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'] + : never = never +> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database } + ? Database[DefaultSchemaTableNameOrOptions['schema']]['Tables'][TableName] extends { + Update: infer U + } + ? U + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema['Tables'] + ? DefaultSchema['Tables'][DefaultSchemaTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never + +export type Enums< + DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums'] | { schema: keyof Database }, + EnumName extends DefaultSchemaEnumNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[DefaultSchemaEnumNameOrOptions['schema']]['Enums'] + : never = never +> = DefaultSchemaEnumNameOrOptions extends { schema: keyof Database } + ? Database[DefaultSchemaEnumNameOrOptions['schema']]['Enums'][EnumName] + : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema['Enums'] + ? DefaultSchema['Enums'][DefaultSchemaEnumNameOrOptions] + : never + +export type CompositeTypes< + PublicCompositeTypeNameOrOptions extends + | keyof DefaultSchema['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 DefaultSchema['CompositeTypes'] + ? DefaultSchema['CompositeTypes'][PublicCompositeTypeNameOrOptions] + : never