@svadmin/refine-adapter 0.10.14 → 0.11.6

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 +3 -3
  2. package/src/index.ts +39 -19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svadmin/refine-adapter",
3
- "version": "0.10.14",
3
+ "version": "0.11.6",
4
4
  "description": "Universal Refine DataProvider adapter for svadmin",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -20,12 +20,12 @@
20
20
  }
21
21
  },
22
22
  "peerDependencies": {
23
- "@svadmin/core": "^0.49.1"
23
+ "@svadmin/core": "^0.52.0"
24
24
  },
25
25
  "license": "MIT",
26
26
  "repository": {
27
27
  "type": "git",
28
- "url": "https://github.com/vibeunion/svadmin.git",
28
+ "url": "git+https://github.com/vibeunion/svadmin.git",
29
29
  "directory": "packages/refine-adapter"
30
30
  },
31
31
  "peerDependenciesMeta": {
package/src/index.ts CHANGED
@@ -1,12 +1,14 @@
1
+ import { definedOptions } from '@svadmin/core/options';
1
2
  import type { DataProvider as SvadminDataProvider } from '@svadmin/core';
3
+ import { withValidatedResponses, type DataTransport } from '@svadmin/core/schema';
2
4
 
3
5
  type RequiredRefineDataProvider = Pick<
4
- SvadminDataProvider,
6
+ DataTransport,
5
7
  'getList' | 'getOne' | 'create' | 'update' | 'deleteOne'
6
8
  >;
7
9
 
8
10
  type OptionalRefineDataProvider = Partial<
9
- Pick<SvadminDataProvider, 'getApiUrl' | 'getMany' | 'createMany' | 'updateMany' | 'deleteMany' | 'custom'>
11
+ Pick<DataTransport, 'getApiUrl' | 'getMany' | 'createMany' | 'updateMany' | 'deleteMany' | 'custom'>
10
12
  >;
11
13
 
12
14
  export type RefineDataProviderLike = RequiredRefineDataProvider & OptionalRefineDataProvider;
@@ -31,7 +33,7 @@ function isObjectLike(value: unknown): value is Record<PropertyKey, unknown> {
31
33
  return typeof value === 'object' && value !== null;
32
34
  }
33
35
 
34
- function assertRefineDataProvider(value: unknown): asserts value is RefineDataProviderLike {
36
+ function requireRefineDataProvider(value: unknown): Record<PropertyKey, unknown> {
35
37
  if (!isObjectLike(value)) {
36
38
  throw new Error('[svadmin] createRefineAdapter: expected a valid Refine DataProvider object, got ' + String(value));
37
39
  }
@@ -41,6 +43,12 @@ function assertRefineDataProvider(value: unknown): asserts value is RefineDataPr
41
43
  throw new Error(`[svadmin] createRefineAdapter: missing required Refine DataProvider method "${method}"`);
42
44
  }
43
45
  }
46
+ for (const method of [...optionalMethods, 'getApiUrl']) {
47
+ if (value[method] !== undefined && typeof value[method] !== 'function') {
48
+ throw new Error(`[svadmin] createRefineAdapter: invalid optional Refine DataProvider method "${method}"`);
49
+ }
50
+ }
51
+ return value;
44
52
  }
45
53
 
46
54
  /**
@@ -49,29 +57,41 @@ function assertRefineDataProvider(value: unknown): asserts value is RefineDataPr
49
57
  * definition of @svadmin/core, except for the current page property.
50
58
  */
51
59
  export function createRefineAdapter(refineProvider: unknown): SvadminDataProvider {
52
- assertRefineDataProvider(refineProvider);
60
+ const source = requireRefineDataProvider(refineProvider);
61
+ function method(name: keyof RefineDataProviderLike) {
62
+ const handler = source[name];
63
+ if (typeof handler !== 'function') throw new TypeError(`Refine DataProvider method "${name}" is unavailable`);
64
+ return handler;
65
+ }
66
+ async function call(name: keyof RefineDataProviderLike, params: unknown): Promise<unknown> {
67
+ const result: unknown = await Reflect.apply(method(name), source, [params]);
68
+ return result;
69
+ }
53
70
 
54
- const adapter: SvadminDataProvider = {
55
- getApiUrl: () => refineProvider.getApiUrl?.() ?? '',
71
+ const transport: DataTransport = {
72
+ getApiUrl: () => {
73
+ if (source['getApiUrl'] === undefined) return '';
74
+ const result: unknown = Reflect.apply(method('getApiUrl'), source, []);
75
+ if (typeof result !== 'string') throw new TypeError('Refine DataProvider getApiUrl must return a string');
76
+ return result;
77
+ },
56
78
  getList(params) {
57
79
  const pagination = params.pagination?.current === undefined
58
80
  ? params.pagination
59
81
  : { ...params.pagination, currentPage: params.pagination.current };
60
- return refineProvider.getList({ ...params, pagination });
82
+ return call('getList', definedOptions({ ...params, pagination }));
61
83
  },
62
- getOne: refineProvider.getOne.bind(refineProvider),
63
- create: refineProvider.create.bind(refineProvider),
64
- update: refineProvider.update.bind(refineProvider),
65
- deleteOne: refineProvider.deleteOne.bind(refineProvider),
84
+ getOne: params => call('getOne', params),
85
+ create: params => call('create', params),
86
+ update: params => call('update', params),
87
+ deleteOne: params => call('deleteOne', params),
66
88
  };
67
89
 
68
- // Only attach optional methods if they actually exist
69
- for (const method of optionalMethods) {
70
- const handler = refineProvider[method];
71
- if (typeof handler === 'function') {
72
- adapter[method] = handler.bind(refineProvider) as never;
73
- }
74
- }
90
+ if (source['getMany'] !== undefined) transport.getMany = params => call('getMany', params);
91
+ if (source['createMany'] !== undefined) transport.createMany = params => call('createMany', params);
92
+ if (source['updateMany'] !== undefined) transport.updateMany = params => call('updateMany', params);
93
+ if (source['deleteMany'] !== undefined) transport.deleteMany = params => call('deleteMany', params);
94
+ if (source['custom'] !== undefined) transport.custom = params => call('custom', params);
75
95
 
76
- return adapter;
96
+ return withValidatedResponses(transport);
77
97
  }