/** * Backward-compatible shim that exposes a supabase-shaped client backed * by the local Express API (`src/lib/api.ts`). Existing components that * use `supabase.rpc(...)`, `supabase.from(view).select(...).eq(...)` and * `supabase.auth.*` keep working unchanged. */ import { api, type ApiSession } from '@/lib/api'; type Result = Promise<{ data: T | null; error: { message: string } | null }>; interface SelectBuilder extends Result { eq(column: string, value: string | number | boolean): SelectBuilder; } function makeSelectBuilder(view: string): SelectBuilder { const filters: Record = {}; const exec = () => api.fromView(view, filters); const builder = { eq(column: string, value: string | number | boolean) { filters[column] = value; return builder as SelectBuilder; }, then(onFulfilled?: Parameters['then']>[0], onRejected?: Parameters['then']>[1]) { return exec().then(onFulfilled as never, onRejected as never); }, } as unknown as SelectBuilder; return builder; } export const supabase = { auth: { async signInWithPassword(args: { email: string; password: string }) { const { data, error } = await api.auth.signInWithPassword(args); return { data: { session: data.session as ApiSession | null }, error }; }, async signOut() { return api.auth.signOut(); }, async getSession() { return api.auth.getSession(); }, onAuthStateChange( cb: (event: string, session: ApiSession | null) => void, ) { return api.auth.onAuthStateChange((event, session) => cb(event, session)); }, }, rpc(fn: string, args?: Record) { return api.rpc(fn, args); }, from(view: string) { return { select(_cols?: string) { return makeSelectBuilder(view); }, }; }, }; export default supabase;