Skip to content

Commit da78be1

Browse files
thorwebdevsoedirgo
andauthored
feat(typegen): add generic Table and Enum helpers. (#654)
* feat: add Table and Enum helper types to typegen. * feat(typegen): make helper types generic over schema --------- Co-authored-by: Bobbie Soedirgo <[email protected]>
1 parent fc147f7 commit da78be1

File tree

2 files changed

+242
-1
lines changed

2 files changed

+242
-1
lines changed

src/server/templates/typescript.ts

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,88 @@ export interface Database {
411411
}
412412
}`
413413
})}
414-
}`
414+
}
415+
416+
export type Tables<
417+
PublicTableNameOrOptions extends
418+
| keyof (Database["public"]["Tables"] & Database["public"]["Views"])
419+
| { schema: keyof Database },
420+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
421+
? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
422+
Database[PublicTableNameOrOptions["schema"]]["Views"])
423+
: never = never
424+
> = PublicTableNameOrOptions extends { schema: keyof Database }
425+
? (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
426+
Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends {
427+
Row: infer R
428+
}
429+
? R
430+
: never
431+
: PublicTableNameOrOptions extends keyof (Database["public"]["Tables"] &
432+
Database["public"]["Views"])
433+
? (Database["public"]["Tables"] &
434+
Database["public"]["Views"])[PublicTableNameOrOptions] extends {
435+
Row: infer R
436+
}
437+
? R
438+
: never
439+
: never
440+
441+
export type TablesInsert<
442+
PublicTableNameOrOptions extends
443+
| keyof Database["public"]["Tables"]
444+
| { schema: keyof Database },
445+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
446+
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
447+
: never = never
448+
> = PublicTableNameOrOptions extends { schema: keyof Database }
449+
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
450+
Insert: infer I
451+
}
452+
? I
453+
: never
454+
: PublicTableNameOrOptions extends keyof Database["public"]["Tables"]
455+
? Database["public"]["Tables"][PublicTableNameOrOptions] extends {
456+
Insert: infer I
457+
}
458+
? I
459+
: never
460+
: never
461+
462+
export type TablesUpdate<
463+
PublicTableNameOrOptions extends
464+
| keyof Database["public"]["Tables"]
465+
| { schema: keyof Database },
466+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
467+
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
468+
: never = never
469+
> = PublicTableNameOrOptions extends { schema: keyof Database }
470+
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
471+
Update: infer U
472+
}
473+
? U
474+
: never
475+
: PublicTableNameOrOptions extends keyof Database["public"]["Tables"]
476+
? Database["public"]["Tables"][PublicTableNameOrOptions] extends {
477+
Update: infer U
478+
}
479+
? U
480+
: never
481+
: never
482+
483+
export type Enums<
484+
PublicEnumNameOrOptions extends
485+
| keyof Database["public"]["Enums"]
486+
| { schema: keyof Database },
487+
EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database }
488+
? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"]
489+
: never = never
490+
> = PublicEnumNameOrOptions extends { schema: keyof Database }
491+
? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName]
492+
: PublicEnumNameOrOptions extends keyof Database["public"]["Enums"]
493+
? Database["public"]["Enums"][PublicEnumNameOrOptions]
494+
: never
495+
`
415496

416497
output = prettier.format(output, {
417498
parser: 'typescript',

test/server/typegen.ts

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,86 @@ test('typegen', async () => {
363363
}
364364
}
365365
}
366+
367+
export type Tables<
368+
PublicTableNameOrOptions extends
369+
| keyof (Database["public"]["Tables"] & Database["public"]["Views"])
370+
| { schema: keyof Database },
371+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
372+
? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
373+
Database[PublicTableNameOrOptions["schema"]]["Views"])
374+
: never = never
375+
> = PublicTableNameOrOptions extends { schema: keyof Database }
376+
? (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
377+
Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends {
378+
Row: infer R
379+
}
380+
? R
381+
: never
382+
: PublicTableNameOrOptions extends keyof (Database["public"]["Tables"] &
383+
Database["public"]["Views"])
384+
? (Database["public"]["Tables"] &
385+
Database["public"]["Views"])[PublicTableNameOrOptions] extends {
386+
Row: infer R
387+
}
388+
? R
389+
: never
390+
: never
391+
392+
export type TablesInsert<
393+
PublicTableNameOrOptions extends
394+
| keyof Database["public"]["Tables"]
395+
| { schema: keyof Database },
396+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
397+
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
398+
: never = never
399+
> = PublicTableNameOrOptions extends { schema: keyof Database }
400+
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
401+
Insert: infer I
402+
}
403+
? I
404+
: never
405+
: PublicTableNameOrOptions extends keyof Database["public"]["Tables"]
406+
? Database["public"]["Tables"][PublicTableNameOrOptions] extends {
407+
Insert: infer I
408+
}
409+
? I
410+
: never
411+
: never
412+
413+
export type TablesUpdate<
414+
PublicTableNameOrOptions extends
415+
| keyof Database["public"]["Tables"]
416+
| { schema: keyof Database },
417+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
418+
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
419+
: never = never
420+
> = PublicTableNameOrOptions extends { schema: keyof Database }
421+
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
422+
Update: infer U
423+
}
424+
? U
425+
: never
426+
: PublicTableNameOrOptions extends keyof Database["public"]["Tables"]
427+
? Database["public"]["Tables"][PublicTableNameOrOptions] extends {
428+
Update: infer U
429+
}
430+
? U
431+
: never
432+
: never
433+
434+
export type Enums<
435+
PublicEnumNameOrOptions extends
436+
| keyof Database["public"]["Enums"]
437+
| { schema: keyof Database },
438+
EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database }
439+
? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"]
440+
: never = never
441+
> = PublicEnumNameOrOptions extends { schema: keyof Database }
442+
? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName]
443+
: PublicEnumNameOrOptions extends keyof Database["public"]["Enums"]
444+
? Database["public"]["Enums"][PublicEnumNameOrOptions]
445+
: never
366446
"
367447
`)
368448
})
@@ -747,6 +827,86 @@ test('typegen w/ one-to-one relationships', async () => {
747827
}
748828
}
749829
}
830+
831+
export type Tables<
832+
PublicTableNameOrOptions extends
833+
| keyof (Database["public"]["Tables"] & Database["public"]["Views"])
834+
| { schema: keyof Database },
835+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
836+
? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
837+
Database[PublicTableNameOrOptions["schema"]]["Views"])
838+
: never = never
839+
> = PublicTableNameOrOptions extends { schema: keyof Database }
840+
? (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
841+
Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends {
842+
Row: infer R
843+
}
844+
? R
845+
: never
846+
: PublicTableNameOrOptions extends keyof (Database["public"]["Tables"] &
847+
Database["public"]["Views"])
848+
? (Database["public"]["Tables"] &
849+
Database["public"]["Views"])[PublicTableNameOrOptions] extends {
850+
Row: infer R
851+
}
852+
? R
853+
: never
854+
: never
855+
856+
export type TablesInsert<
857+
PublicTableNameOrOptions extends
858+
| keyof Database["public"]["Tables"]
859+
| { schema: keyof Database },
860+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
861+
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
862+
: never = never
863+
> = PublicTableNameOrOptions extends { schema: keyof Database }
864+
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
865+
Insert: infer I
866+
}
867+
? I
868+
: never
869+
: PublicTableNameOrOptions extends keyof Database["public"]["Tables"]
870+
? Database["public"]["Tables"][PublicTableNameOrOptions] extends {
871+
Insert: infer I
872+
}
873+
? I
874+
: never
875+
: never
876+
877+
export type TablesUpdate<
878+
PublicTableNameOrOptions extends
879+
| keyof Database["public"]["Tables"]
880+
| { schema: keyof Database },
881+
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
882+
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
883+
: never = never
884+
> = PublicTableNameOrOptions extends { schema: keyof Database }
885+
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
886+
Update: infer U
887+
}
888+
? U
889+
: never
890+
: PublicTableNameOrOptions extends keyof Database["public"]["Tables"]
891+
? Database["public"]["Tables"][PublicTableNameOrOptions] extends {
892+
Update: infer U
893+
}
894+
? U
895+
: never
896+
: never
897+
898+
export type Enums<
899+
PublicEnumNameOrOptions extends
900+
| keyof Database["public"]["Enums"]
901+
| { schema: keyof Database },
902+
EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database }
903+
? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"]
904+
: never = never
905+
> = PublicEnumNameOrOptions extends { schema: keyof Database }
906+
? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName]
907+
: PublicEnumNameOrOptions extends keyof Database["public"]["Enums"]
908+
? Database["public"]["Enums"][PublicEnumNameOrOptions]
909+
: never
750910
"
751911
`)
752912
})

0 commit comments

Comments
 (0)