@svadmin/refine-adapter 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +88 -0
  2. package/package.json +7 -2
  3. package/src/index.ts +19 -12
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # @svadmin/refine-adapter
2
+
3
+ > Bridge any [@refinedev](https://github.com/refinedev/refine) data provider to svadmin
4
+
5
+ [![npm](https://img.shields.io/npm/v/@svadmin/refine-adapter?color=ff3e00&label=npm)](https://www.npmjs.com/package/@svadmin/refine-adapter)
6
+
7
+ ## Why?
8
+
9
+ [Refine](https://refine.dev/) has a rich ecosystem of battle-tested data providers for services like Supabase, Appwrite, Hasura, Strapi, Airtable, NestJS, and more. `@svadmin/refine-adapter` lets you use **any** of those providers inside svadmin — zero rewrite required.
10
+
11
+ Since Refine's `DataProvider` interface closely mirrors svadmin's `DataProvider`, the adapter is a thin bridge that binds method calls and forwards optional methods when present.
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ bun add @svadmin/refine-adapter @svadmin/core
17
+ ```
18
+
19
+ If your app is powered by Vite and also uses `@svadmin/ui` or `@svadmin/supabase`, exclude svadmin packages from `optimizeDeps` to avoid dev-time pre-bundling issues:
20
+
21
+ ```ts
22
+ optimizeDeps: {
23
+ exclude: ['@svadmin/core', '@svadmin/ui', '@svadmin/supabase'],
24
+ }
25
+ ```
26
+
27
+ Then install the Refine data provider you want to use, e.g.:
28
+
29
+ ```bash
30
+ bun add @refinedev/supabase
31
+ bun add @refinedev/strapi-v4
32
+ bun add @refinedev/appwrite
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ ```typescript
38
+ import { createRefineAdapter } from '@svadmin/refine-adapter';
39
+ import { dataProvider as createRefineSupabase } from '@refinedev/supabase';
40
+ import { createClient } from '@supabase/supabase-js';
41
+
42
+ const supabaseClient = createClient(SUPABASE_URL, SUPABASE_KEY);
43
+ const refineProvider = createRefineSupabase(supabaseClient);
44
+
45
+ // Bridge it to svadmin
46
+ const dataProvider = createRefineAdapter(refineProvider);
47
+ ```
48
+
49
+ Then pass `dataProvider` to `<AdminApp>` or `setDataProvider()` as usual.
50
+
51
+ ## Supported Methods
52
+
53
+ | Method | Required | Description |
54
+ |--------|----------|-------------|
55
+ | `getList` | ✅ | List with pagination, sorting, filtering |
56
+ | `getOne` | ✅ | Get single record |
57
+ | `create` | ✅ | Create record |
58
+ | `update` | ✅ | Update record |
59
+ | `deleteOne` | ✅ | Delete record |
60
+ | `getApiUrl` | ✅ | Return API base URL |
61
+ | `getMany` | Optional | Bulk get |
62
+ | `createMany` | Optional | Bulk create |
63
+ | `updateMany` | Optional | Bulk update |
64
+ | `deleteMany` | Optional | Bulk delete |
65
+ | `custom` | Optional | Custom endpoint |
66
+
67
+ Optional methods are only wired if the underlying Refine provider implements them.
68
+
69
+ ## Which Svadmin Providers Use This?
70
+
71
+ The following `@svadmin/*` packages internally use `@svadmin/refine-adapter` to bridge their corresponding `@refinedev/*` provider:
72
+
73
+ | svadmin Package | Refine Package |
74
+ |-----------------|---------------|
75
+ | `@svadmin/supabase` | `@refinedev/supabase` |
76
+ | `@svadmin/appwrite` | `@refinedev/appwrite` |
77
+ | `@svadmin/strapi` | `@refinedev/strapi-v4` |
78
+ | `@svadmin/hasura` | `@refinedev/hasura` |
79
+ | `@svadmin/graphql` | `@refinedev/graphql` |
80
+ | `@svadmin/airtable` | `@refinedev/airtable` |
81
+ | `@svadmin/medusa` | `@refinedev/medusa` |
82
+ | `@svadmin/nestjs-query` | `@refinedev/nestjs-query` |
83
+ | `@svadmin/nestjsx-crud` | `@refinedev/nestjsx-crud` |
84
+ | `@svadmin/simple-rest` | `@refinedev/simple-rest` |
85
+
86
+ ## License
87
+
88
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/refine-adapter",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "Universal Refine DataProvider adapter for svadmin",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -16,12 +16,17 @@
16
16
  }
17
17
  },
18
18
  "peerDependencies": {
19
- "@svadmin/core": "^0.21.0"
19
+ "@svadmin/core": "^0.23.5"
20
20
  },
21
21
  "license": "MIT",
22
22
  "repository": {
23
23
  "type": "git",
24
24
  "url": "https://github.com/zuohuadong/svadmin.git",
25
25
  "directory": "packages/refine-adapter"
26
+ },
27
+ "peerDependenciesMeta": {
28
+ "@svadmin/core": {
29
+ "optional": true
30
+ }
26
31
  }
27
32
  }
package/src/index.ts CHANGED
@@ -6,17 +6,24 @@ import type { DataProvider as SvadminDataProvider } from '@svadmin/core';
6
6
  * definition of @svadmin/core.
7
7
  */
8
8
  export function createRefineAdapter(refineProvider: any): SvadminDataProvider {
9
- return {
9
+ if (!refineProvider || typeof refineProvider !== 'object') {
10
+ throw new Error('[svadmin] createRefineAdapter: expected a valid Refine DataProvider object, got ' + String(refineProvider));
11
+ }
12
+ const adapter: SvadminDataProvider = {
10
13
  getApiUrl: () => refineProvider.getApiUrl(),
11
- getList: refineProvider.getList,
12
- getOne: refineProvider.getOne,
13
- create: refineProvider.create,
14
- update: refineProvider.update,
15
- deleteOne: refineProvider.deleteOne,
16
- getMany: refineProvider.getMany,
17
- createMany: refineProvider.createMany,
18
- updateMany: refineProvider.updateMany,
19
- deleteMany: refineProvider.deleteMany,
20
- custom: refineProvider.custom,
21
- } as SvadminDataProvider;
14
+ getList: refineProvider.getList.bind(refineProvider),
15
+ getOne: refineProvider.getOne.bind(refineProvider),
16
+ create: refineProvider.create.bind(refineProvider),
17
+ update: refineProvider.update.bind(refineProvider),
18
+ deleteOne: refineProvider.deleteOne.bind(refineProvider),
19
+ };
20
+
21
+ // Only attach optional methods if they actually exist
22
+ if (refineProvider.getMany) adapter.getMany = refineProvider.getMany.bind(refineProvider);
23
+ if (refineProvider.createMany) adapter.createMany = refineProvider.createMany.bind(refineProvider);
24
+ if (refineProvider.updateMany) adapter.updateMany = refineProvider.updateMany.bind(refineProvider);
25
+ if (refineProvider.deleteMany) adapter.deleteMany = refineProvider.deleteMany.bind(refineProvider);
26
+ if (refineProvider.custom) adapter.custom = refineProvider.custom.bind(refineProvider);
27
+
28
+ return adapter;
22
29
  }