25 lines
1.2 KiB
TypeScript
25 lines
1.2 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
const RequiredSupabaseConfigSchema = z.object({
|
|
supabaseUrl: z.string({ error: 'SUPABASE_URL is required' }).trim().url('SUPABASE_URL must be a valid URL'),
|
|
supabaseServiceRoleKey: z.string({ error: 'SUPABASE_SERVICE_ROLE_KEY is required' }).trim().min(1, 'SUPABASE_SERVICE_ROLE_KEY is required'),
|
|
public: z.object({
|
|
supabaseUrl: z.string({ error: 'NUXT_PUBLIC_SUPABASE_URL is required' }).trim().url('NUXT_PUBLIC_SUPABASE_URL must be a valid URL'),
|
|
supabaseAnonKey: z.string({ error: 'NUXT_PUBLIC_SUPABASE_ANON_KEY is required' }).trim().min(1, 'NUXT_PUBLIC_SUPABASE_ANON_KEY is required'),
|
|
}),
|
|
})
|
|
|
|
export function assertRequiredSupabaseConfig(config: unknown): void {
|
|
const result = RequiredSupabaseConfigSchema.safeParse(config)
|
|
if (!result.success) {
|
|
const details = result.error.issues.map(issue => issue.message).join('; ')
|
|
throw new Error(`Invalid Supabase runtime configuration: ${details}`)
|
|
}
|
|
|
|
const serverOrigin = new URL(result.data.supabaseUrl).origin
|
|
const publicOrigin = new URL(result.data.public.supabaseUrl).origin
|
|
if (serverOrigin !== publicOrigin) {
|
|
throw new Error('Invalid Supabase runtime configuration: SUPABASE_URL and NUXT_PUBLIC_SUPABASE_URL must point to the same project')
|
|
}
|
|
}
|