@svadmin/nestjs-query 0.9.3 → 0.9.5

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 (2) hide show
  1. package/package.json +15 -2
  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",
3
+ "version": "0.9.5",
4
4
  "description": "NestJS Query DataProvider for svadmin",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -16,12 +16,25 @@
16
16
  }
17
17
  },
18
18
  "peerDependencies": {
19
- "@svadmin/core": "^0.19.4"
19
+ "@svadmin/core": "^0.23.3",
20
+ "@refinedev/nestjs-query": "^5.0.0",
21
+ "@svadmin/refine-adapter": "^0.9.3"
20
22
  },
21
23
  "license": "MIT",
22
24
  "repository": {
23
25
  "type": "git",
24
26
  "url": "https://github.com/zuohuadong/svadmin.git",
25
27
  "directory": "packages/nestjs-query"
28
+ },
29
+ "peerDependenciesMeta": {
30
+ "@svadmin/core": {
31
+ "optional": true
32
+ },
33
+ "@refinedev/nestjs-query": {
34
+ "optional": true
35
+ },
36
+ "@svadmin/refine-adapter": {
37
+ "optional": true
38
+ }
26
39
  }
27
40
  }
@@ -1,108 +1,19 @@
1
- import type {
2
- DataProvider, GetListParams, GetListResult, GetOneParams, GetOneResult,
3
- CreateParams, CreateResult, UpdateParams, UpdateResult, DeleteParams, DeleteResult,
4
- GetManyParams, GetManyResult, CustomParams, CustomResult, Sort, Filter, BaseRecord
5
- } from '@svadmin/core';
6
-
7
- // Nestjs-query uses GraphQL with auto-generated queries
8
- function mapOperator(op: string): string {
9
- const map: Record<string, string> = {
10
- eq: 'eq', ne: 'neq', lt: 'lt', gt: 'gt', lte: 'lte', gte: 'gte',
11
- contains: 'like', in: 'in', null: 'is',
12
- };
13
- return map[op] ?? 'eq';
14
- }
15
-
16
- function buildFilter(filters?: Filter[]): Record<string, unknown> {
17
- if (!filters?.length) return {};
18
- const where: Record<string, unknown> = {};
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
  }