@svadmin/supabase 0.0.6 → 0.4.1
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 +2 -2
- package/src/data-provider.ts +21 -21
- package/src/live-provider.ts +24 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@svadmin/supabase",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Supabase adapters — DataProvider, AuthProvider, LiveProvider, AuditHandler",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
|
-
"@svadmin/core": "0.
|
|
19
|
+
"@svadmin/core": "^0.4.1",
|
|
20
20
|
"@supabase/supabase-js": "^2.0.0"
|
|
21
21
|
},
|
|
22
22
|
"license": "MIT",
|
package/src/data-provider.ts
CHANGED
|
@@ -5,7 +5,7 @@ import type {
|
|
|
5
5
|
CreateParams, CreateResult, UpdateParams, UpdateResult, DeleteParams, DeleteResult,
|
|
6
6
|
GetManyParams, GetManyResult, CreateManyParams, CreateManyResult,
|
|
7
7
|
UpdateManyParams, UpdateManyResult, DeleteManyParams, DeleteManyResult,
|
|
8
|
-
CustomParams, CustomResult,
|
|
8
|
+
CustomParams, CustomResult, BaseRecord,
|
|
9
9
|
} from '@svadmin/core';
|
|
10
10
|
|
|
11
11
|
export function createSupabaseDataProvider(client: SupabaseClient, apiUrl?: string): DataProvider {
|
|
@@ -14,7 +14,7 @@ export function createSupabaseDataProvider(client: SupabaseClient, apiUrl?: stri
|
|
|
14
14
|
return {
|
|
15
15
|
getApiUrl: () => resolvedApiUrl,
|
|
16
16
|
|
|
17
|
-
async getList<
|
|
17
|
+
async getList<TData extends BaseRecord = BaseRecord>({ resource, pagination, sorters, filters, meta }: GetListParams): Promise<GetListResult<TData>> {
|
|
18
18
|
const { current = 1, pageSize = 10 } = pagination ?? {};
|
|
19
19
|
const from = (current - 1) * pageSize;
|
|
20
20
|
const to = from + pageSize - 1;
|
|
@@ -46,60 +46,60 @@ export function createSupabaseDataProvider(client: SupabaseClient, apiUrl?: stri
|
|
|
46
46
|
|
|
47
47
|
const { data, count, error } = await query;
|
|
48
48
|
if (error) throw error;
|
|
49
|
-
return { data: (data ?? []) as
|
|
49
|
+
return { data: (data ?? []) as unknown as TData[], total: count ?? 0 };
|
|
50
50
|
},
|
|
51
51
|
|
|
52
|
-
async getOne<
|
|
52
|
+
async getOne<TData extends BaseRecord = BaseRecord>({ resource, id, meta }: GetOneParams): Promise<GetOneResult<TData>> {
|
|
53
53
|
const select = (meta?.select as string) ?? '*';
|
|
54
54
|
const { data, error } = await client.from(resource).select(select).eq('id', id).single();
|
|
55
55
|
if (error) throw error;
|
|
56
|
-
return { data: data as
|
|
56
|
+
return { data: data as unknown as TData };
|
|
57
57
|
},
|
|
58
58
|
|
|
59
|
-
async create<
|
|
59
|
+
async create<TData extends BaseRecord = BaseRecord, TVariables = unknown>({ resource, variables }: CreateParams<TVariables>): Promise<CreateResult<TData>> {
|
|
60
60
|
const { data, error } = await client.from(resource).insert(variables).select().single();
|
|
61
61
|
if (error) throw error;
|
|
62
|
-
return { data: data as
|
|
62
|
+
return { data: data as TData };
|
|
63
63
|
},
|
|
64
64
|
|
|
65
|
-
async update<
|
|
65
|
+
async update<TData extends BaseRecord = BaseRecord, TVariables = unknown>({ resource, id, variables }: UpdateParams<TVariables>): Promise<UpdateResult<TData>> {
|
|
66
66
|
const { data, error } = await client.from(resource).update(variables).eq('id', id).select().single();
|
|
67
67
|
if (error) throw error;
|
|
68
|
-
return { data: data as
|
|
68
|
+
return { data: data as TData };
|
|
69
69
|
},
|
|
70
70
|
|
|
71
|
-
async deleteOne<
|
|
71
|
+
async deleteOne<TData extends BaseRecord = BaseRecord, TVariables = unknown>({ resource, id }: DeleteParams<TVariables>): Promise<DeleteResult<TData>> {
|
|
72
72
|
const { data, error } = await client.from(resource).delete().eq('id', id).select().single();
|
|
73
73
|
if (error) throw error;
|
|
74
|
-
return { data: data as
|
|
74
|
+
return { data: data as TData };
|
|
75
75
|
},
|
|
76
76
|
|
|
77
|
-
async getMany<
|
|
77
|
+
async getMany<TData extends BaseRecord = BaseRecord>({ resource, ids, meta }: GetManyParams): Promise<GetManyResult<TData>> {
|
|
78
78
|
const select = (meta?.select as string) ?? '*';
|
|
79
79
|
const { data, error } = await client.from(resource).select(select).in('id', ids);
|
|
80
80
|
if (error) throw error;
|
|
81
|
-
return { data: (data ?? []) as
|
|
81
|
+
return { data: (data ?? []) as unknown as TData[] };
|
|
82
82
|
},
|
|
83
83
|
|
|
84
|
-
async createMany<
|
|
84
|
+
async createMany<TData extends BaseRecord = BaseRecord, TVariables = unknown>({ resource, variables }: CreateManyParams<TVariables>): Promise<CreateManyResult<TData>> {
|
|
85
85
|
const { data, error } = await client.from(resource).insert(variables).select();
|
|
86
86
|
if (error) throw error;
|
|
87
|
-
return { data: (data ?? []) as
|
|
87
|
+
return { data: (data ?? []) as TData[] };
|
|
88
88
|
},
|
|
89
89
|
|
|
90
|
-
async updateMany<
|
|
90
|
+
async updateMany<TData extends BaseRecord = BaseRecord, TVariables = unknown>({ resource, ids, variables }: UpdateManyParams<TVariables>): Promise<UpdateManyResult<TData>> {
|
|
91
91
|
const { data, error } = await client.from(resource).update(variables).in('id', ids).select();
|
|
92
92
|
if (error) throw error;
|
|
93
|
-
return { data: (data ?? []) as
|
|
93
|
+
return { data: (data ?? []) as TData[] };
|
|
94
94
|
},
|
|
95
95
|
|
|
96
|
-
async deleteMany<
|
|
96
|
+
async deleteMany<TData extends BaseRecord = BaseRecord, TVariables = unknown>({ resource, ids }: DeleteManyParams<TVariables>): Promise<DeleteManyResult<TData>> {
|
|
97
97
|
const { data, error } = await client.from(resource).delete().in('id', ids).select();
|
|
98
98
|
if (error) throw error;
|
|
99
|
-
return { data: (data ?? []) as
|
|
99
|
+
return { data: (data ?? []) as TData[] };
|
|
100
100
|
},
|
|
101
101
|
|
|
102
|
-
async custom<
|
|
102
|
+
async custom<TData = unknown, TVariables = unknown>({ url, method, payload, headers }: CustomParams<TVariables>): Promise<CustomResult<TData>> {
|
|
103
103
|
const response = await fetch(url, {
|
|
104
104
|
method: method.toUpperCase(),
|
|
105
105
|
headers: { 'Content-Type': 'application/json', ...headers },
|
|
@@ -107,7 +107,7 @@ export function createSupabaseDataProvider(client: SupabaseClient, apiUrl?: stri
|
|
|
107
107
|
});
|
|
108
108
|
if (!response.ok) throw new Error(`Custom request failed: ${response.status}`);
|
|
109
109
|
const data = await response.json();
|
|
110
|
-
return { data: data as
|
|
110
|
+
return { data: data as TData };
|
|
111
111
|
},
|
|
112
112
|
};
|
|
113
113
|
}
|
package/src/live-provider.ts
CHANGED
|
@@ -5,10 +5,18 @@ import type { LiveProvider, LiveEvent } from '@svadmin/core';
|
|
|
5
5
|
export function createSupabaseLiveProvider(client: SupabaseClient): LiveProvider {
|
|
6
6
|
const channels = new Map<string, RealtimeChannel>();
|
|
7
7
|
|
|
8
|
+
function getOrCreateChannel(resource: string): RealtimeChannel {
|
|
9
|
+
let channel = channels.get(resource);
|
|
10
|
+
if (!channel) {
|
|
11
|
+
channel = client.channel(`live-${resource}`);
|
|
12
|
+
channels.set(resource, channel);
|
|
13
|
+
}
|
|
14
|
+
return channel;
|
|
15
|
+
}
|
|
16
|
+
|
|
8
17
|
return {
|
|
9
18
|
subscribe({ resource, callback }) {
|
|
10
|
-
const channel =
|
|
11
|
-
.channel(`live-${resource}`)
|
|
19
|
+
const channel = getOrCreateChannel(resource)
|
|
12
20
|
.on(
|
|
13
21
|
'postgres_changes',
|
|
14
22
|
{ event: '*', schema: 'public', table: resource },
|
|
@@ -20,6 +28,11 @@ export function createSupabaseLiveProvider(client: SupabaseClient): LiveProvider
|
|
|
20
28
|
});
|
|
21
29
|
}
|
|
22
30
|
)
|
|
31
|
+
.on('broadcast', { event: 'live-event' }, ({ payload: broadcastPayload }) => {
|
|
32
|
+
if (broadcastPayload) {
|
|
33
|
+
callback(broadcastPayload as LiveEvent);
|
|
34
|
+
}
|
|
35
|
+
})
|
|
23
36
|
.subscribe();
|
|
24
37
|
|
|
25
38
|
channels.set(resource, channel);
|
|
@@ -29,5 +42,14 @@ export function createSupabaseLiveProvider(client: SupabaseClient): LiveProvider
|
|
|
29
42
|
channels.delete(resource);
|
|
30
43
|
};
|
|
31
44
|
},
|
|
45
|
+
|
|
46
|
+
publish(event: LiveEvent) {
|
|
47
|
+
const channel = getOrCreateChannel(event.resource);
|
|
48
|
+
channel.send({
|
|
49
|
+
type: 'broadcast',
|
|
50
|
+
event: 'live-event',
|
|
51
|
+
payload: event,
|
|
52
|
+
});
|
|
53
|
+
},
|
|
32
54
|
};
|
|
33
55
|
}
|