@svadmin/nestjs-query 0.9.2 → 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.
- package/package.json +4 -2
- package/src/data-provider.ts +18 -107
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@svadmin/nestjs-query",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "NestJS Query DataProvider for svadmin",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
|
-
"@svadmin/core": "^0.
|
|
19
|
+
"@svadmin/core": "^0.21.1",
|
|
20
|
+
"@refinedev/nestjs-query": "^5.0.0",
|
|
21
|
+
"@svadmin/refine-adapter": "^0.9.3"
|
|
20
22
|
},
|
|
21
23
|
"license": "MIT",
|
|
22
24
|
"repository": {
|
package/src/data-provider.ts
CHANGED
|
@@ -1,108 +1,19 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
for (const f of filters) {
|
|
20
|
-
if ('field' in f) {
|
|
21
|
-
where[f.field as string] = { [mapOperator(f.operator as string)]: f.operator === 'contains' ? `%${f.value}%` : f.value };
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return where;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function buildSorting(sorters?: Sort[]): Array<{ field: string; direction: string }> {
|
|
28
|
-
return (sorters ?? []).map((s: Sort) => ({ field: s.field, direction: s.order === 'asc' ? 'ASC' : 'DESC' }));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async function gql(endpoint: string, query: string, variables: Record<string, unknown> = {}, headers: Record<string, string> = {}) {
|
|
32
|
-
const res = await fetch(endpoint, {
|
|
33
|
-
method: 'POST',
|
|
34
|
-
headers: { 'Content-Type': 'application/json', ...headers },
|
|
35
|
-
body: JSON.stringify({ query, variables }),
|
|
36
|
-
});
|
|
37
|
-
const json = await res.json();
|
|
38
|
-
if (json.errors) throw new Error((json.errors as Array<{ message: string }>).map((e) => e.message).join('\n'));
|
|
39
|
-
return json.data;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function createNestjsQueryDataProvider(endpoint: string, headers: Record<string, string> = {}): DataProvider {
|
|
43
|
-
return {
|
|
44
|
-
getApiUrl: () => endpoint,
|
|
45
|
-
|
|
46
|
-
async getList<T extends BaseRecord = BaseRecord>({ resource, pagination, sorters, filters, meta }: GetListParams): Promise<GetListResult<T>> {
|
|
47
|
-
const { current = 1, pageSize = 10 } = pagination ?? {};
|
|
48
|
-
const fields = (meta?.fields as string[])?.join('\n') || 'id';
|
|
49
|
-
const query = `query($paging: CursorPaging, $filter: ${resource}Filter, $sorting: [${resource}Sort!]) {
|
|
50
|
-
${resource}(paging: $paging, filter: $filter, sorting: $sorting) {
|
|
51
|
-
totalCount
|
|
52
|
-
nodes { ${fields} }
|
|
53
|
-
}
|
|
54
|
-
}`;
|
|
55
|
-
const data = await gql(endpoint, query, {
|
|
56
|
-
paging: { first: pageSize, offset: (current - 1) * pageSize },
|
|
57
|
-
filter: buildFilter(filters),
|
|
58
|
-
sorting: buildSorting(sorters),
|
|
59
|
-
}, headers);
|
|
60
|
-
return { data: data[resource]?.nodes ?? [], total: data[resource]?.totalCount ?? 0 };
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
async getOne<T extends BaseRecord = BaseRecord>({ resource, id, meta }: GetOneParams): Promise<GetOneResult<T>> {
|
|
64
|
-
const fields = (meta?.fields as string[])?.join('\n') || 'id';
|
|
65
|
-
const singular = resource.replace(/s$/, '');
|
|
66
|
-
const query = `query($id: ID!) { ${singular}(id: $id) { ${fields} } }`;
|
|
67
|
-
const data = await gql(endpoint, query, { id }, headers);
|
|
68
|
-
return { data: data[singular] as unknown as unknown as T };
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
async create<T extends BaseRecord = BaseRecord>({ resource, variables, meta }: CreateParams): Promise<CreateResult<T>> {
|
|
72
|
-
const fields = (meta?.fields as string[])?.join('\n') || 'id';
|
|
73
|
-
const singular = resource.replace(/s$/, '');
|
|
74
|
-
const query = `mutation($input: CreateOne${singular}Input!) { createOne${singular}(input: $input) { ${fields} } }`;
|
|
75
|
-
const data = await gql(endpoint, query, { input: { [singular.toLowerCase()]: variables } }, headers);
|
|
76
|
-
return { data: data[`createOne${singular}`] as unknown as unknown as T };
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
async update<T extends BaseRecord = BaseRecord>({ resource, id, variables, meta }: UpdateParams): Promise<UpdateResult<T>> {
|
|
80
|
-
const fields = (meta?.fields as string[])?.join('\n') || 'id';
|
|
81
|
-
const singular = resource.replace(/s$/, '');
|
|
82
|
-
const query = `mutation($input: UpdateOne${singular}Input!) { updateOne${singular}(input: $input) { ${fields} } }`;
|
|
83
|
-
const data = await gql(endpoint, query, { input: { id, update: variables } }, headers);
|
|
84
|
-
return { data: data[`updateOne${singular}`] as unknown as unknown as T };
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
async deleteOne<T extends BaseRecord = BaseRecord>({ resource, id, meta }: DeleteParams): Promise<DeleteResult<T>> {
|
|
88
|
-
const fields = (meta?.fields as string[])?.join('\n') || 'id';
|
|
89
|
-
const singular = resource.replace(/s$/, '');
|
|
90
|
-
const query = `mutation($input: DeleteOne${singular}Input!) { deleteOne${singular}(input: $input) { ${fields} } }`;
|
|
91
|
-
const data = await gql(endpoint, query, { input: { id } }, headers);
|
|
92
|
-
return { data: data[`deleteOne${singular}`] as unknown as unknown as T };
|
|
93
|
-
},
|
|
94
|
-
|
|
95
|
-
async getMany<T extends BaseRecord = BaseRecord>({ resource, ids, meta }: GetManyParams): Promise<GetManyResult<T>> {
|
|
96
|
-
const fields = (meta?.fields as string[])?.join('\n') || 'id';
|
|
97
|
-
const query = `query($filter: ${resource}Filter) { ${resource}(filter: $filter) { nodes { ${fields} } } }`;
|
|
98
|
-
const data = await gql(endpoint, query, { filter: { id: { in: ids } } }, headers);
|
|
99
|
-
return { data: data[resource]?.nodes ?? [] };
|
|
100
|
-
},
|
|
101
|
-
|
|
102
|
-
async custom<T = unknown>({ url, method, payload, headers: h }: CustomParams): Promise<CustomResult<T>> {
|
|
103
|
-
const res = await fetch(url, { method: method.toUpperCase(), headers: { 'Content-Type': 'application/json', ...headers, ...h }, body: payload ? JSON.stringify(payload) : undefined });
|
|
104
|
-
if (!res.ok) throw new Error(`Custom request failed: ${res.status}`);
|
|
105
|
-
return { data: (await res.json()) as unknown as unknown as T };
|
|
106
|
-
},
|
|
107
|
-
};
|
|
1
|
+
import type { DataProvider } from '@svadmin/core';
|
|
2
|
+
import { createRefineAdapter } from '@svadmin/refine-adapter';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates a nestjs-query data provider using the official @refinedev/nestjs-query package.
|
|
7
|
+
* Requires `@refinedev/nestjs-query` to be installed.
|
|
8
|
+
*
|
|
9
|
+
* @param args Arguments required by @refinedev/nestjs-query
|
|
10
|
+
* @returns A fully compatible svadmin DataProvider
|
|
11
|
+
*/
|
|
12
|
+
export async function createNestjsQueryDataProvider(...args: any[]): Promise<DataProvider> {
|
|
13
|
+
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
const pkg = await import('@refinedev/nestjs-query');
|
|
16
|
+
const init = (pkg as any).default || (pkg as any).dataProvider || (pkg as any).DataProvider;
|
|
17
|
+
const refineProvider = init(...args);
|
|
18
|
+
return createRefineAdapter(refineProvider);
|
|
108
19
|
}
|