Skip to content

Refine Adapter

The @svadmin/refine-adapter package provides a universal bridge that wraps any official Refine data provider so it can be used as a svadmin DataProvider.

Refine has a mature ecosystem of 10+ production-grade data providers for backends like Supabase, Hasura, Strapi, Appwrite, GraphQL, REST, and more. Rather than re-implementing these integrations from scratch, svadmin can leverage them directly via this adapter.

Terminal window
bun add @svadmin/refine-adapter @svadmin/core
# Plus the Refine provider you want:
bun add @refinedev/supabase

If your app runs on Vite and also uses @svadmin/ui or @svadmin/supabase, exclude svadmin packages from optimizeDeps to avoid dev-time pre-bundling errors:

optimizeDeps: {
exclude: ['@svadmin/core', '@svadmin/ui', '@svadmin/supabase'],
}
import { createRefineAdapter } from '@svadmin/refine-adapter';
import { dataProvider as createRefineSupabase } from '@refinedev/supabase';
import { createClient } from '@supabase/supabase-js';
const supabaseClient = createClient(SUPABASE_URL, SUPABASE_KEY);
const refineProvider = createRefineSupabase(supabaseClient);
// Wrap the Refine provider for svadmin
const dataProvider = createRefineAdapter(refineProvider);

Then pass dataProvider to <AdminApp> or setDataProvider():

<AdminApp {dataProvider} {resources} title="My Admin" />

Refine’s DataProvider interface closely mirrors svadmin’s DataProvider. The adapter:

  1. Binds the 5 required methods (getList, getOne, create, update, deleteOne, getApiUrl).
  2. Conditionally attaches optional methods (getMany, createMany, updateMany, deleteMany, custom) only if the underlying Refine provider implements them.

This means you get the full feature set of whatever Refine provider you choose — including its sorting, filtering, pagination, and bulk operation support.

You don’t need to use this package directly if you’re already using one of the @svadmin/* provider packages. The following packages internally use @svadmin/refine-adapter:

svadmin PackageBridgesRefine Package
@svadmin/supabaseSupabase data/auth/live@refinedev/supabase
@svadmin/appwriteAppwrite data/auth/live@refinedev/appwrite
@svadmin/strapiStrapi CMS@refinedev/strapi-v4
@svadmin/hasuraHasura GraphQL@refinedev/hasura
@svadmin/graphqlGeneric GraphQL@refinedev/graphql
@svadmin/airtableAirtable@refinedev/airtable
@svadmin/medusaMedusa Commerce@refinedev/medusa
@svadmin/nestjs-queryNestJS GraphQL@refinedev/nestjs-query
@svadmin/nestjsx-crudNestJS CRUD@refinedev/nestjsx-crud
@svadmin/simple-restREST API@refinedev/simple-rest

Use createRefineAdapter directly when you want to use a Refine provider that svadmin doesn’t have a dedicated package for yet:

import { createRefineAdapter } from '@svadmin/refine-adapter';
import { dataProvider as createRefineDirectus } from '@tspvivek/refine-directus';
const directusProvider = createRefineDirectus('https://my-directus.example.com');
const dataProvider = createRefineAdapter(directusProvider);

Some svadmin providers connect directly without Refine, because they use non-Refine backends or offer deeper integration:

PackageReason
@svadmin/drizzleDirect database access via Drizzle ORM (no HTTP API)
@svadmin/elysiaType-safe via Eden Treaty, infers ResourceTypeMap from Elysia routes
@svadmin/pocketbaseDirect PocketBase SDK integration with auth + live
@svadmin/firebaseDirect Firebase SDK with Firestore serialization