@svadmin/rest 0.2.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/README.md +26 -0
- package/package.json +65 -0
- package/src/data-provider.ts +39 -0
- package/src/index.ts +2 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# @svadmin/rest
|
|
2
|
+
|
|
3
|
+
Generic REST data provider for svadmin, bridging the official
|
|
4
|
+
[`@refinedev/rest`](https://www.npmjs.com/package/@refinedev/rest) package.
|
|
5
|
+
|
|
6
|
+
Use it when your API does not follow the Simple REST envelope but you still want
|
|
7
|
+
declarative resource routing.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
bun add @svadmin/rest @refinedev/rest @nestjsx/crud-request
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { createRestDataProvider } from '@svadmin/rest';
|
|
19
|
+
|
|
20
|
+
const dataProvider = await createRestDataProvider('https://api.example.test');
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
All arguments are forwarded to `@refinedev/rest`; the result is adapted to the
|
|
24
|
+
svadmin `DataProvider` contract.
|
|
25
|
+
|
|
26
|
+
See `docs/architecture/admin-platform.md` for the platform model.
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@svadmin/rest",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Generic REST adapters — bridge @refinedev/rest to a svadmin DataProvider",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"files": [
|
|
8
|
+
"src/**/*.ts",
|
|
9
|
+
"!src/**/*.test.*",
|
|
10
|
+
"!src/**/*.spec.*",
|
|
11
|
+
"!src/**/vitest.config.*",
|
|
12
|
+
"!src/**/setupTest.*"
|
|
13
|
+
],
|
|
14
|
+
"main": "src/index.ts",
|
|
15
|
+
"types": "src/index.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./src/index.ts",
|
|
19
|
+
"default": "./src/index.ts"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"svadmin": {
|
|
23
|
+
"capabilities": [
|
|
24
|
+
"data",
|
|
25
|
+
"rest",
|
|
26
|
+
"custom-endpoints"
|
|
27
|
+
],
|
|
28
|
+
"core": "^0.55.0",
|
|
29
|
+
"stability": "experimental",
|
|
30
|
+
"migration": null
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@svadmin/core": "^0.58.0",
|
|
34
|
+
"@refinedev/rest": "^2.1.1",
|
|
35
|
+
"@nestjsx/crud-request": "^5.0.0-alpha.3"
|
|
36
|
+
},
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"author": "zuohuadong",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/vibeunion/svadmin.git",
|
|
42
|
+
"directory": "packages/rest"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/vibeunion/svadmin#readme",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/vibeunion/svadmin/issues"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@svadmin/core": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"@refinedev/rest": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
55
|
+
"@nestjsx/crud-request": {
|
|
56
|
+
"optional": true
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@svadmin/refine-adapter": "^0.12.2"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@refinedev/rest": "^2.1.1"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { DataProvider } from '@svadmin/core';
|
|
2
|
+
import { createRefineAdapter } from '@svadmin/refine-adapter';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates a data provider from the official `@refinedev/rest` package.
|
|
6
|
+
* Requires `@refinedev/rest` (and its peer `@nestjsx/crud-request`) to be
|
|
7
|
+
* installed. The generic provider is useful for custom REST endpoints that do
|
|
8
|
+
* not match the Simple REST envelope.
|
|
9
|
+
*
|
|
10
|
+
* @param args Arguments required by `@refinedev/rest`
|
|
11
|
+
* @returns A fully compatible svadmin DataProvider
|
|
12
|
+
*/
|
|
13
|
+
export async function createRestDataProvider(...args: unknown[]): Promise<DataProvider> {
|
|
14
|
+
const pkg = await import('@refinedev/rest');
|
|
15
|
+
const init = resolveInitializer(pkg);
|
|
16
|
+
const created = init(...args);
|
|
17
|
+
const refineProvider = isProviderBundle(created)
|
|
18
|
+
? created.dataProvider
|
|
19
|
+
: created;
|
|
20
|
+
return createRefineAdapter(refineProvider);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type RestDataProviderArgs = unknown[];
|
|
24
|
+
|
|
25
|
+
function resolveInitializer(pkg: unknown): (...args: unknown[]) => unknown {
|
|
26
|
+
if (typeof pkg !== 'object' || pkg === null) throw new TypeError('Invalid REST provider module');
|
|
27
|
+
const exports = pkg as Record<string, unknown>;
|
|
28
|
+
for (const key of ['createDataProvider', 'default', 'dataProvider', 'DataProvider']) {
|
|
29
|
+
const candidate = exports[key];
|
|
30
|
+
if (typeof candidate === 'function') return candidate as (...args: unknown[]) => unknown;
|
|
31
|
+
}
|
|
32
|
+
throw new Error('[svadmin] Failed to resolve @refinedev/rest. Ensure the package is installed correctly.');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function isProviderBundle(value: unknown): value is { dataProvider: unknown } {
|
|
36
|
+
return typeof value === 'object'
|
|
37
|
+
&& value !== null
|
|
38
|
+
&& 'dataProvider' in value;
|
|
39
|
+
}
|
package/src/index.ts
ADDED