// This file is automatically generated. Do not edit it directly. import { createClient } from '@supabase/supabase-js'; import type { Database } from './types'; import { brokeredPreviewStorage } from './previewAuthStorage'; function isNewSupabaseApiKey(value: string): boolean { return value.startsWith('sb_publishable_') || value.startsWith('sb_secret_'); } // The public URL can be reachable only from the browser, so server requests go to the runtime URL of the same backend. function serverSupabaseUrl(publicUrl: string, supabaseKey: string): string | undefined { if (typeof window !== 'undefined' || typeof process === 'undefined') return undefined; const serverUrl = process.env['SUPABASE_URL']?.replace(/\/+$/, ''); if (!serverUrl || serverUrl === publicUrl || process.env['SUPABASE_PUBLISHABLE_KEY'] !== supabaseKey) return undefined; return serverUrl; } function createSupabaseFetch(supabaseUrl: string, supabaseKey: string): typeof fetch { const publicUrl = supabaseUrl.replace(/\/+$/, ''); const serverUrl = serverSupabaseUrl(publicUrl, supabaseKey); return (input, init) => { const headers = new Headers( typeof Request !== 'undefined' && input instanceof Request ? input.headers : undefined, ); if (init?.headers) { new Headers(init.headers).forEach((value, key) => headers.set(key, value)); } // New Supabase API keys are opaque strings, not bearer JWTs. if (isNewSupabaseApiKey(supabaseKey) && headers.get('Authorization') === `Bearer ${supabaseKey}`) { headers.delete('Authorization'); } headers.set('apikey', supabaseKey); if (serverUrl) { const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url; if (url.startsWith(`${publicUrl}/`)) { const target = serverUrl + url.slice(publicUrl.length); const request = typeof input === 'string' || input instanceof URL ? target : new Request(target, input); return fetch(request, { ...init, headers }); } } return fetch(input, { ...init, headers }); }; } function createSupabaseClient() { // Use import.meta.env for client-side (Vite build-time replacement) // Fall back to process.env for SSR (server-side rendering) const SUPABASE_URL = import.meta.env['VITE_SUPABASE_URL'] || process.env['SUPABASE_URL']; const SUPABASE_PUBLISHABLE_KEY = import.meta.env['VITE_SUPABASE_PUBLISHABLE_KEY'] || process.env['SUPABASE_PUBLISHABLE_KEY']; if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) { const missing = [ ...(!SUPABASE_URL ? ['SUPABASE_URL'] : []), ...(!SUPABASE_PUBLISHABLE_KEY ? ['SUPABASE_PUBLISHABLE_KEY'] : []), ]; const message = `Missing Supabase environment variable(s): ${missing.join(', ')}. Connect Supabase in Lovable Cloud.`; console.error(`[Supabase] ${message}`); throw new Error(message); } return createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, { global: { fetch: createSupabaseFetch(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY), }, auth: { storage: brokeredPreviewStorage(), persistSession: true, autoRefreshToken: true, }, }); } let _supabase: ReturnType | undefined; // Import the supabase client like this: // import { supabase } from "@/integrations/supabase/client"; export const supabase = new Proxy({} as ReturnType, { get(_, prop, receiver) { if (!_supabase) _supabase = createSupabaseClient(); return Reflect.get(_supabase, prop, receiver); }, });