Open tonven opened 3 months ago
This is how my supabase.ts file looks like:
export type Json =
| string
| number
| boolean
| null
| { [key: string]: Json | undefined }
| Json[]
export type Database = {
graphql_public: {
Tables: {
[_ in never]: never
}
Views: {
[_ in never]: never
}
Functions: {
graphql: {
Args: {
operationName?: string
query?: string
variables?: Json
extensions?: Json
}
Returns: Json
}
}
Enums: {
[_ in never]: never
}
CompositeTypes: {
[_ in never]: never
}
}
public: {
Tables: {
group_invites: {
Row: {
accepted_at: string | null
created_at: string
group_id: string
id: string
invited_by: string
roles: string[]
user_id: string | null
}
Insert: {
accepted_at?: string | null
created_at?: string
group_id: string
id?: string
invited_by: string
roles?: string[]
user_id?: string | null
}
Update: {
accepted_at?: string | null
created_at?: string
group_id?: string
id?: string
invited_by?: string
roles?: string[]
user_id?: string | null
}
Relationships: [
{
foreignKeyName: "group_invites_group_id_fkey"
columns: ["group_id"]
isOneToOne: false
referencedRelation: "groups"
referencedColumns: ["id"]
},
{
foreignKeyName: "group_invites_invited_by_fkey"
columns: ["invited_by"]
isOneToOne: false
referencedRelation: "users"
referencedColumns: ["id"]
},
{
foreignKeyName: "group_invites_user_id_fkey"
columns: ["user_id"]
isOneToOne: false
referencedRelation: "users"
referencedColumns: ["id"]
},
]
}
group_users: {
Row: {
created_at: string
group_id: string
id: string
metadata: Json
role: string
updated_at: string
user_id: string
}
Insert: {
created_at?: string
group_id: string
id?: string
metadata?: Json
role?: string
updated_at?: string
user_id: string
}
Update: {
created_at?: string
group_id?: string
id?: string
metadata?: Json
role?: string
updated_at?: string
user_id?: string
}
Relationships: [
{
foreignKeyName: "group_users_group_id_fkey"
columns: ["group_id"]
isOneToOne: false
referencedRelation: "groups"
referencedColumns: ["id"]
},
{
foreignKeyName: "group_users_user_id_fkey"
columns: ["user_id"]
isOneToOne: false
referencedRelation: "users"
referencedColumns: ["id"]
},
]
}
groups: {
Row: {
created_at: string
id: string
metadata: Json
updated_at: string
}
Insert: {
created_at?: string
id?: string
metadata?: Json
updated_at?: string
}
Update: {
created_at?: string
id?: string
metadata?: Json
updated_at?: string
}
Relationships: []
}
profiles: {
Row: {
first_name: string | null
id: string
last_name: string | null
}
Insert: {
first_name?: string | null
id: string
last_name?: string | null
}
Update: {
first_name?: string | null
id?: string
last_name?: string | null
}
Relationships: [
{
foreignKeyName: "profiles_id_fkey"
columns: ["id"]
isOneToOne: true
referencedRelation: "users"
referencedColumns: ["id"]
},
]
}
}
Views: {
[_ in never]: never
}
Functions: {
db_pre_request: {
Args: Record<PropertyKey, never>
Returns: undefined
}
get_user_claims: {
Args: Record<PropertyKey, never>
Returns: Json
}
jwt_is_expired: {
Args: Record<PropertyKey, never>
Returns: boolean
}
user_has_group_role: {
Args: {
group_id: string
group_role: string
}
Returns: boolean
}
user_is_group_member: {
Args: {
group_id: string
}
Returns: boolean
}
}
Enums: {
[_ in never]: never
}
CompositeTypes: {
[_ in never]: never
}
}
storage: {
Tables: {
buckets: {
Row: {
allowed_mime_types: string[] | null
avif_autodetection: boolean | null
created_at: string | null
file_size_limit: number | null
id: string
name: string
owner: string | null
owner_id: string | null
public: boolean | null
updated_at: string | null
}
Insert: {
allowed_mime_types?: string[] | null
avif_autodetection?: boolean | null
created_at?: string | null
file_size_limit?: number | null
id: string
name: string
owner?: string | null
owner_id?: string | null
public?: boolean | null
updated_at?: string | null
}
Update: {
allowed_mime_types?: string[] | null
avif_autodetection?: boolean | null
created_at?: string | null
file_size_limit?: number | null
id?: string
name?: string
owner?: string | null
owner_id?: string | null
public?: boolean | null
updated_at?: string | null
}
Relationships: []
}
migrations: {
Row: {
executed_at: string | null
hash: string
id: number
name: string
}
Insert: {
executed_at?: string | null
hash: string
id: number
name: string
}
Update: {
executed_at?: string | null
hash?: string
id?: number
name?: string
}
Relationships: []
}
objects: {
Row: {
bucket_id: string | null
created_at: string | null
id: string
last_accessed_at: string | null
metadata: Json | null
name: string | null
owner: string | null
owner_id: string | null
path_tokens: string[] | null
updated_at: string | null
version: string | null
}
Insert: {
bucket_id?: string | null
created_at?: string | null
id?: string
last_accessed_at?: string | null
metadata?: Json | null
name?: string | null
owner?: string | null
owner_id?: string | null
path_tokens?: string[] | null
updated_at?: string | null
version?: string | null
}
Update: {
bucket_id?: string | null
created_at?: string | null
id?: string
last_accessed_at?: string | null
metadata?: Json | null
name?: string | null
owner?: string | null
owner_id?: string | null
path_tokens?: string[] | null
updated_at?: string | null
version?: string | null
}
Relationships: [
{
foreignKeyName: "objects_bucketId_fkey"
columns: ["bucket_id"]
isOneToOne: false
referencedRelation: "buckets"
referencedColumns: ["id"]
},
]
}
s3_multipart_uploads: {
Row: {
bucket_id: string
created_at: string
id: string
in_progress_size: number
key: string
owner_id: string | null
upload_signature: string
version: string
}
Insert: {
bucket_id: string
created_at?: string
id: string
in_progress_size?: number
key: string
owner_id?: string | null
upload_signature: string
version: string
}
Update: {
bucket_id?: string
created_at?: string
id?: string
in_progress_size?: number
key?: string
owner_id?: string | null
upload_signature?: string
version?: string
}
Relationships: [
{
foreignKeyName: "s3_multipart_uploads_bucket_id_fkey"
columns: ["bucket_id"]
isOneToOne: false
referencedRelation: "buckets"
referencedColumns: ["id"]
},
]
}
s3_multipart_uploads_parts: {
Row: {
bucket_id: string
created_at: string
etag: string
id: string
key: string
owner_id: string | null
part_number: number
size: number
upload_id: string
version: string
}
Insert: {
bucket_id: string
created_at?: string
etag: string
id?: string
key: string
owner_id?: string | null
part_number: number
size?: number
upload_id: string
version: string
}
Update: {
bucket_id?: string
created_at?: string
etag?: string
id?: string
key?: string
owner_id?: string | null
part_number?: number
size?: number
upload_id?: string
version?: string
}
Relationships: [
{
foreignKeyName: "s3_multipart_uploads_parts_bucket_id_fkey"
columns: ["bucket_id"]
isOneToOne: false
referencedRelation: "buckets"
referencedColumns: ["id"]
},
{
foreignKeyName: "s3_multipart_uploads_parts_upload_id_fkey"
columns: ["upload_id"]
isOneToOne: false
referencedRelation: "s3_multipart_uploads"
referencedColumns: ["id"]
},
]
}
}
Views: {
[_ in never]: never
}
Functions: {
can_insert_object: {
Args: {
bucketid: string
name: string
owner: string
metadata: Json
}
Returns: undefined
}
extension: {
Args: {
name: string
}
Returns: string
}
filename: {
Args: {
name: string
}
Returns: string
}
foldername: {
Args: {
name: string
}
Returns: string[]
}
get_size_by_bucket: {
Args: Record<PropertyKey, never>
Returns: {
size: number
bucket_id: string
}[]
}
list_multipart_uploads_with_delimiter: {
Args: {
bucket_id: string
prefix_param: string
delimiter_param: string
max_keys?: number
next_key_token?: string
next_upload_token?: string
}
Returns: {
key: string
id: string
created_at: string
}[]
}
list_objects_with_delimiter: {
Args: {
bucket_id: string
prefix_param: string
delimiter_param: string
max_keys?: number
start_after?: string
next_token?: string
}
Returns: {
name: string
id: string
metadata: Json
updated_at: string
}[]
}
search: {
Args: {
prefix: string
bucketname: string
limits?: number
levels?: number
offsets?: number
search?: string
sortcolumn?: string
sortorder?: string
}
Returns: {
name: string
id: string
updated_at: string
created_at: string
last_accessed_at: string
metadata: Json
}[]
}
}
Enums: {
[_ in never]: never
}
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
There was a problem with errors being ignored in certain cases of resolution errors. Can you try with 1.0.7 and see if it works or gives a better error message?
Hi. Thank you for response. I run it again it generates only import { z } from "zod"; without any warnings.
@TomasHubelbauer after I run it again, actually I got error and this info :)
Error: Some schemas can't be generated due to direct or indirect missing dependencies: dbPreRequestArgsSchema getUserClaimsArgsSchema jwtIsExpiredArgsSchema
Any ideas what should I do?
Unfortunately the underlying library doesn't provide any detail about the schemas that failed. What I did was comment all their fields out until there was no error and then added them back in. Primitive types are not going to be problematic, but I found some edge cases with compound types that proved to be the errors. Once you've found what the edge cases are, I can try and see if I can help add support for them.
Thank you for such fast response! All these dependencies comes from this library: https://github.com/point-source/supabase-tenant-rbac Can it be that definition are missing there?
@TomasHubelbauer any ideas? Or maybe I can do more to give more input?
Is it possible to share your database.ts
or is it not public?
@TomasHubelbauer I shared it several messages up :)
Sorry, my bad! I reproduced your issue and the problem is definitely with the arguments of the three functions it reports now.
There are four usages of PropertyKey
, but no definition. I am not sure how that extension you link works, but most likely PropertyKey
is defined in a schema different from public
or it is a built-in (otherwise its definition should be included in CompositeTypes
or supabase.ts
and everything should work).
This library can't fix that issue, because it is a form of malformed input in a sense.
To fix your problem, I think you could manually add a definition of PropertyKey
into CompositeTypes
and then run this library/CLI tool on it. Unless you specifically need types for that as well, you might be able to define an empty composite type. If you are using those three functions in your code, you could also forcibly cast whatever the input to them is to any so the call works with the empty composite type.
Hopefully this is of some sort of help to you, sorry I can't help more. 🙏
Sorry, my bad! I reproduced your issue and the problem is definitely with the arguments of the three functions it reports now.
There are four usages of
PropertyKey
, but no definition. I am not sure how that extension you link works, but most likelyPropertyKey
is defined in a schema different frompublic
or it is a built-in (otherwise its definition should be included inCompositeTypes
orsupabase.ts
and everything should work).This library can't fix that issue, because it is a form of malformed input in a sense.
To fix your problem, I think you could manually add a definition of
PropertyKey
intoCompositeTypes
and then run this library/CLI tool on it. Unless you specifically need types for that as well, you might be able to define an empty composite type. If you are using those three functions in your code, you could also forcibly cast whatever the input to them is to any so the call works with the empty composite type.Hopefully this is of some sort of help to you, sorry I can't help more. 🙏
Thank you for reply!
When I run
pnpm supabase-to-zod --input types/supabase.ts --output types/schemas.ts
on my supabase.ts file, which is not empty and looks correct, I get this schemas.ts:// Generated by ts-to-zod import { z } from "zod";
Is it not strange that file contains ts-to-zod? Does someone had this issue?Thanks.