@svadmin/supabase 0.11.3 → 0.11.7

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/supabase",
3
- "version": "0.11.3",
3
+ "version": "0.11.7",
4
4
  "description": "Supabase adapters — DataProvider, AuthProvider, LiveProvider, AuditHandler",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -24,10 +24,10 @@
24
24
  }
25
25
  },
26
26
  "peerDependencies": {
27
- "@svadmin/core": "^0.27.1",
28
- "@supabase/supabase-js": "^2.0.0",
29
- "@refinedev/supabase": "^5.0.0",
30
- "@supacloud/js": "^0.12.0"
27
+ "@svadmin/core": "^0.34.1",
28
+ "@supabase/supabase-js": "^2.111.0",
29
+ "@refinedev/supabase": "^6.0.2",
30
+ "@supacloud/js": "^0.21.0"
31
31
  },
32
32
  "license": "MIT",
33
33
  "author": "zuohuadong",
@@ -55,6 +55,9 @@
55
55
  }
56
56
  },
57
57
  "dependencies": {
58
- "@svadmin/refine-adapter": "^0.9.4"
58
+ "@svadmin/refine-adapter": "^0.10.0"
59
+ },
60
+ "devDependencies": {
61
+ "@supabase/supabase-js": "^2.111.0"
59
62
  }
60
63
  }
@@ -1,8 +1,21 @@
1
1
  // Supabase AuthProvider
2
- import type { SupabaseClient } from '@supabase/supabase-js';
2
+ import type { SupabaseClient, User } from '@supabase/supabase-js';
3
3
  import type { AuthProvider, Identity, AuthActionResult, CheckResult } from '@svadmin/core';
4
4
  import { audit } from '@svadmin/core';
5
5
 
6
+ export interface SupabasePermissionResolverContext {
7
+ client: SupabaseClient;
8
+ user: User;
9
+ }
10
+
11
+ export type SupabasePermissionResolver = (
12
+ context: SupabasePermissionResolverContext,
13
+ ) => Promise<unknown> | unknown;
14
+
15
+ export interface SupabaseAuthProviderOptions {
16
+ getPermissions?: SupabasePermissionResolver;
17
+ }
18
+
6
19
  const INVALID_REFRESH_TOKEN_MESSAGES = [
7
20
  'refresh token is not valid',
8
21
  'invalid refresh token',
@@ -23,7 +36,20 @@ async function clearInvalidSession(client: SupabaseClient): Promise<void> {
23
36
  await client.auth.signOut({ scope: 'local' });
24
37
  }
25
38
 
26
- export function createSupabaseAuthProvider(client: SupabaseClient): AuthProvider {
39
+ async function currentPermissionUser(client: SupabaseClient): Promise<User | null> {
40
+ const { data: { user }, error } = await client.auth.getUser();
41
+ if (error && isInvalidRefreshTokenError(error)) {
42
+ await clearInvalidSession(client);
43
+ return null;
44
+ }
45
+ if (error) throw error;
46
+ return user ?? null;
47
+ }
48
+
49
+ export function createSupabaseAuthProvider(
50
+ client: SupabaseClient,
51
+ options: SupabaseAuthProviderOptions = {},
52
+ ): AuthProvider {
27
53
  return {
28
54
  async login({ email, password }: Record<string, unknown>): Promise<AuthActionResult> {
29
55
  const { data, error } = await client.auth.signInWithPassword({
@@ -90,12 +116,10 @@ export function createSupabaseAuthProvider(client: SupabaseClient): AuthProvider
90
116
  },
91
117
 
92
118
  async getPermissions(): Promise<unknown> {
93
- const { data: { user }, error } = await client.auth.getUser();
94
- if (error && isInvalidRefreshTokenError(error)) {
95
- await clearInvalidSession(client);
96
- return null;
97
- }
98
- return user?.user_metadata?.role ?? 'user';
119
+ if (!options.getPermissions) return null;
120
+ const user = await currentPermissionUser(client);
121
+ if (!user) return null;
122
+ return options.getPermissions({ client, user });
99
123
  },
100
124
 
101
125
  async register({ email, password, ...rest }: Record<string, unknown>): Promise<AuthActionResult> {
@@ -10,14 +10,15 @@ import { dataProvider as refineDataProvider } from '@refinedev/supabase';
10
10
  * @param args Arguments required by @refinedev/supabase
11
11
  * @returns A fully compatible svadmin DataProvider
12
12
  */
13
- export function createSupabaseDataProvider(...args: any[]): DataProvider {
14
- const init: any = refineDataProvider;
15
- if (typeof init !== 'function') {
13
+ export function createSupabaseDataProvider(
14
+ ...args: Parameters<typeof refineDataProvider>
15
+ ): DataProvider {
16
+ if (typeof refineDataProvider !== 'function') {
16
17
  throw new Error(
17
18
  '[svadmin/supabase] Failed to resolve @refinedev/supabase data provider. ' +
18
19
  'Ensure the package is installed correctly: bun add @refinedev/supabase'
19
20
  );
20
21
  }
21
- const refineProvider = init(...args);
22
+ const refineProvider = refineDataProvider(...args);
22
23
  return createRefineAdapter(refineProvider);
23
24
  }
package/src/index.ts CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  export { createSupabaseDataProvider } from './data-provider';
4
4
  export { createSupabaseAuthProvider } from './auth-provider';
5
+ export type {
6
+ SupabaseAuthProviderOptions,
7
+ SupabasePermissionResolver,
8
+ SupabasePermissionResolverContext,
9
+ } from './auth-provider';
5
10
  export { createSupabaseLiveProvider } from './live-provider';
6
11
  export { createSupabaseAuditHandler } from './audit-handler';
7
12
  export {