everkit-supabase
v0.1.1
Published
Reusable, app-agnostic Supabase foundation for React Native / Expo apps: a client factory, an auth gate, and a canonical profiles model. Each app injects its own config.
Maintainers
Readme
everkit-supabase
Reusable, app-agnostic Supabase foundation for React Native / Expo apps:
a client factory, auth, an auth gate, and a canonical profiles model. Sibling of
everkit-ui: everkit-ui owns the shared UI, this owns the
shared backend wiring so each app stops hand-copying it.
Each app injects its own config; the package stores no secrets and never reads
process.env itself.
What it provides
- Client factory —
createSupabaseClient(config)builds a singleton client with SecureStore session storage,autoRefreshToken+persistSession, and optional AppState foreground auto-refresh.isSupabaseConfigured(config)is a pure guard, andExpoSecureStoreAdapteris the SecureStore adapter (exported for reuse). - Auth — the
AuthRepositorycontract plusSupabaseAuthRepository(email, Apple, Google id-token, password reset, optional account deletion) and pure session mappers. - Auth gate —
useAuthGateand the pureresolveAuthRedirectfor signed-in / signed-out / onboarding routing. - Profiles — the canonical
UserProfilebase model, theProfileRepositorycontract plusSupabaseProfileRepository,ProfileMapper, andbuildProfilesMigrationSql()to provision an identical base table + RLS + signup trigger.
Usage
Each app injects its own config (this package never reads process.env):
// Option A — read config from process.env (AppState refresh on by default)
import { createSupabaseClient, isSupabaseConfigured } from 'everkit-supabase'
const config = {
url: process.env.EXPO_PUBLIC_SUPABASE_URL,
anonKey: process.env.EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY,
}
export const supabaseConfigured = isSupabaseConfigured(config)
export const getSupabaseClient = () => createSupabaseClient(config)// Option B — read config from your app-config module (interval-based refresh)
import { createSupabaseClient } from 'everkit-supabase'
import { appConfig } from '../config/appConfig'
export const supabase = createSupabaseClient({
url: appConfig.supabaseUrl,
anonKey: appConfig.supabaseAnonKey,
enableAppStateAutoRefresh: false,
})Develop
npm install
npm run typecheck # tsc --noEmit
npm test # node --test (pure config helper)
npm run build # react-native-builder-bob -> dist/Peer dependencies
@supabase/supabase-js (>=2.95), expo-secure-store (>=15), react-native (>=0.81).
