Skip to content

Commit 92e9fba

Browse files
authored
Merge pull request #948 from supabase/feat/add-internal-supabase-options-schema
feat(typegen): add postgrest_version parameter to typegen
2 parents e570d61 + 076d58a commit 92e9fba

File tree

5 files changed

+842
-139
lines changed

5 files changed

+842
-139
lines changed

src/server/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export const GENERATE_TYPES_DEFAULT_SCHEMA =
4545
process.env.PG_META_GENERATE_TYPES_DEFAULT_SCHEMA || 'public'
4646
export const GENERATE_TYPES_DETECT_ONE_TO_ONE_RELATIONSHIPS =
4747
process.env.PG_META_GENERATE_TYPES_DETECT_ONE_TO_ONE_RELATIONSHIPS === 'true'
48+
export const POSTGREST_VERSION = process.env.PG_META_POSTGREST_VERSION
4849
export const GENERATE_TYPES_SWIFT_ACCESS_CONTROL = process.env
4950
.PG_META_GENERATE_TYPES_SWIFT_ACCESS_CONTROL
5051
? (process.env.PG_META_GENERATE_TYPES_SWIFT_ACCESS_CONTROL as AccessControl)

src/server/routes/generators/typescript.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default async (fastify: FastifyInstance) => {
1111
excluded_schemas?: string
1212
included_schemas?: string
1313
detect_one_to_one_relationships?: string
14+
postgrest_version?: string
1415
}
1516
}>('/', async (request, reply) => {
1617
const config = createConnectionConfig(request)
@@ -19,6 +20,7 @@ export default async (fastify: FastifyInstance) => {
1920
const includedSchemas =
2021
request.query.included_schemas?.split(',').map((schema) => schema.trim()) ?? []
2122
const detectOneToOneRelationships = request.query.detect_one_to_one_relationships === 'true'
23+
const postgrestVersion = request.query.postgrest_version
2224

2325
const pgMeta: PostgresMeta = new PostgresMeta(config)
2426
const { data: generatorMeta, error: generatorMetaError } = await getGeneratorMetadata(pgMeta, {
@@ -34,6 +36,7 @@ export default async (fastify: FastifyInstance) => {
3436
return applyTypescriptTemplate({
3537
...generatorMeta,
3638
detectOneToOneRelationships,
39+
postgrestVersion,
3740
})
3841
})
3942
}

src/server/server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
PG_CONNECTION,
1414
PG_META_HOST,
1515
PG_META_PORT,
16+
POSTGREST_VERSION,
1617
} from './constants.js'
1718
import { apply as applyTypescriptTemplate } from './templates/typescript.js'
1819
import { apply as applyGoTemplate } from './templates/go.js'
@@ -129,6 +130,7 @@ async function getTypeOutput(): Promise<string | null> {
129130
),
130131
types: types!,
131132
detectOneToOneRelationships: GENERATE_TYPES_DETECT_ONE_TO_ONE_RELATIONSHIPS,
133+
postgrestVersion: POSTGREST_VERSION,
132134
}
133135

134136
switch (GENERATE_TYPES?.toLowerCase()) {

src/server/templates/typescript.ts

Lines changed: 66 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ export const apply = async ({
2121
functions,
2222
types,
2323
detectOneToOneRelationships,
24+
postgrestVersion,
2425
}: GeneratorMetadata & {
2526
detectOneToOneRelationships: boolean
27+
postgrestVersion?: string
2628
}): Promise<string> => {
2729
const columnsByTableId = Object.fromEntries<PostgresColumn[]>(
2830
[...tables, ...foreignTables, ...views, ...materializedViews].map((t) => [t.id, []])
@@ -32,10 +34,19 @@ export const apply = async ({
3234
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
3335
.forEach((c) => columnsByTableId[c.table_id].push(c))
3436

37+
const internal_supabase_schema = postgrestVersion
38+
? `// Allows to automatically instanciate createClient with right options
39+
// instead of createClient<Database, { PostgrestVersion: 'XX' }>(URL, KEY)
40+
__InternalSupabase: {
41+
PostgrestVersion: '${postgrestVersion}'
42+
}`
43+
: ''
44+
3545
let output = `
3646
export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[]
3747
3848
export type Database = {
49+
${internal_supabase_schema}
3950
${schemas
4051
.sort(({ name: a }, { name: b }) => a.localeCompare(b))
4152
.map((schema) => {
@@ -433,110 +444,110 @@ export type Database = {
433444
})}
434445
}
435446
436-
type DefaultSchema = Database[Extract<keyof Database, ${JSON.stringify(GENERATE_TYPES_DEFAULT_SCHEMA)}>]
447+
type DatabaseWithoutInternals = Omit<Database, '__InternalSupabase'>
448+
449+
type DefaultSchema = DatabaseWithoutInternals[Extract<keyof Database, ${JSON.stringify(GENERATE_TYPES_DEFAULT_SCHEMA)}>]
437450
438451
export type Tables<
439452
DefaultSchemaTableNameOrOptions extends
440453
| keyof (DefaultSchema["Tables"] & DefaultSchema["Views"])
441-
| { schema: keyof Database },
454+
| { schema: keyof DatabaseWithoutInternals },
442455
TableName extends DefaultSchemaTableNameOrOptions extends {
443-
schema: keyof Database
456+
schema: keyof DatabaseWithoutInternals
444457
}
445-
? keyof (Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
446-
Database[DefaultSchemaTableNameOrOptions["schema"]]["Views"])
447-
: never = never,
448-
> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database }
449-
? (Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
450-
Database[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends {
458+
? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
459+
DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])
460+
: never = never
461+
> = DefaultSchemaTableNameOrOptions extends { schema: keyof DatabaseWithoutInternals }
462+
? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] &
463+
DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends {
451464
Row: infer R
452465
}
453466
? R
454467
: never
455-
: DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] &
456-
DefaultSchema["Views"])
457-
? (DefaultSchema["Tables"] &
458-
DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends {
459-
Row: infer R
460-
}
461-
? R
462-
: never
468+
: DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] & DefaultSchema["Views"])
469+
? (DefaultSchema["Tables"] & DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends {
470+
Row: infer R
471+
}
472+
? R
463473
: never
474+
: never
464475
465476
export type TablesInsert<
466477
DefaultSchemaTableNameOrOptions extends
467478
| keyof DefaultSchema["Tables"]
468-
| { schema: keyof Database },
479+
| { schema: keyof DatabaseWithoutInternals },
469480
TableName extends DefaultSchemaTableNameOrOptions extends {
470-
schema: keyof Database
481+
schema: keyof DatabaseWithoutInternals
471482
}
472-
? keyof Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
473-
: never = never,
474-
> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database }
475-
? Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
483+
? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
484+
: never = never
485+
> = DefaultSchemaTableNameOrOptions extends { schema: keyof DatabaseWithoutInternals }
486+
? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
476487
Insert: infer I
477488
}
478489
? I
479490
: never
480491
: DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"]
481-
? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
482-
Insert: infer I
483-
}
484-
? I
485-
: never
492+
? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
493+
Insert: infer I
494+
}
495+
? I
486496
: never
497+
: never
487498
488499
export type TablesUpdate<
489500
DefaultSchemaTableNameOrOptions extends
490501
| keyof DefaultSchema["Tables"]
491-
| { schema: keyof Database },
502+
| { schema: keyof DatabaseWithoutInternals },
492503
TableName extends DefaultSchemaTableNameOrOptions extends {
493-
schema: keyof Database
504+
schema: keyof DatabaseWithoutInternals
494505
}
495-
? keyof Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
496-
: never = never,
497-
> = DefaultSchemaTableNameOrOptions extends { schema: keyof Database }
498-
? Database[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
506+
? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"]
507+
: never = never
508+
> = DefaultSchemaTableNameOrOptions extends { schema: keyof DatabaseWithoutInternals }
509+
? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends {
499510
Update: infer U
500511
}
501512
? U
502513
: never
503514
: DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"]
504-
? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
505-
Update: infer U
506-
}
507-
? U
508-
: never
515+
? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends {
516+
Update: infer U
517+
}
518+
? U
509519
: never
520+
: never
510521
511522
export type Enums<
512523
DefaultSchemaEnumNameOrOptions extends
513524
| keyof DefaultSchema["Enums"]
514-
| { schema: keyof Database },
525+
| { schema: keyof DatabaseWithoutInternals },
515526
EnumName extends DefaultSchemaEnumNameOrOptions extends {
516-
schema: keyof Database
527+
schema: keyof DatabaseWithoutInternals
517528
}
518-
? keyof Database[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"]
519-
: never = never,
520-
> = DefaultSchemaEnumNameOrOptions extends { schema: keyof Database }
521-
? Database[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName]
529+
? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"]
530+
: never = never
531+
> = DefaultSchemaEnumNameOrOptions extends { schema: keyof DatabaseWithoutInternals }
532+
? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName]
522533
: DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"]
523-
? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions]
524-
: never
534+
? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions]
535+
: never
525536
526537
export type CompositeTypes<
527538
PublicCompositeTypeNameOrOptions extends
528539
| keyof DefaultSchema["CompositeTypes"]
529-
| { schema: keyof Database },
540+
| { schema: keyof DatabaseWithoutInternals },
530541
CompositeTypeName extends PublicCompositeTypeNameOrOptions extends {
531-
schema: keyof Database
542+
schema: keyof DatabaseWithoutInternals
532543
}
533-
? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
534-
: never = never,
535-
> = PublicCompositeTypeNameOrOptions extends { schema: keyof Database }
536-
? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
544+
? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
545+
: never = never
546+
> = PublicCompositeTypeNameOrOptions extends { schema: keyof DatabaseWithoutInternals }
547+
? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
537548
: PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"]
538-
? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
539-
: never
549+
? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
550+
: never
540551
541552
export const Constants = {
542553
${schemas

0 commit comments

Comments
 (0)