@yss123/cage-client 0.0.0-stage → 0.1.0
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/LICENSE +21 -0
- package/README.md +18 -2
- package/dist/index.d.ts +82 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 shunshunyue and Cage contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @yss123/cage-client
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
笼子前端 SDK 运行时:请求、错误码、can()、查询 hooks
|
|
4
|
+
|
|
5
|
+
Cage 是通过 TypeScript 声明业务、由框架统一执行权限和数据规则的中后台框架。此包是框架的一部分。
|
|
6
|
+
|
|
7
|
+
## 使用
|
|
8
|
+
|
|
9
|
+
```powershell
|
|
10
|
+
pnpm add @yss123/cage-client
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
首次使用建议通过脚手架创建完整项目,所需依赖由模板统一配置。需要 Node.js 24 或更新版本。
|
|
14
|
+
|
|
15
|
+
- [完整使用说明](https://github.com/shunshunyue/cage/blob/main/docs/使用说明.md)
|
|
16
|
+
- [框架源码与范例](https://github.com/shunshunyue/cage)
|
|
17
|
+
- [问题反馈](https://github.com/shunshunyue/cage/issues)
|
|
18
|
+
|
|
19
|
+
许可证:[MIT](https://github.com/shunshunyue/cage/blob/main/LICENSE)。
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type QueryKey, type UseQueryOptions } from '@tanstack/react-query';
|
|
2
|
+
import type { z } from 'zod';
|
|
3
|
+
/** 所有接口都可能返回的通用错误码 */
|
|
4
|
+
export type CommonError = 'UNAUTHENTICATED' | 'FORBIDDEN' | 'INVALID_INPUT' | 'RATE_LIMITED' | 'INTERNAL' | 'NETWORK';
|
|
5
|
+
export type CageResult<T, E extends string = never> = {
|
|
6
|
+
ok: true;
|
|
7
|
+
data: T;
|
|
8
|
+
code?: undefined;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
code: E | CommonError;
|
|
12
|
+
domainCode?: string;
|
|
13
|
+
detail?: unknown;
|
|
14
|
+
status: number;
|
|
15
|
+
requestId?: string;
|
|
16
|
+
data?: undefined;
|
|
17
|
+
};
|
|
18
|
+
export interface ClientOptions {
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
fetch?: typeof fetch;
|
|
21
|
+
/** 会话失效时调用(例如跳转登录页) */
|
|
22
|
+
onUnauthenticated?: () => void;
|
|
23
|
+
}
|
|
24
|
+
export declare class CageClient {
|
|
25
|
+
private readonly opts;
|
|
26
|
+
private csrfToken;
|
|
27
|
+
constructor(opts?: ClientOptions);
|
|
28
|
+
private get f();
|
|
29
|
+
private url;
|
|
30
|
+
csrf(refresh?: boolean): Promise<string>;
|
|
31
|
+
private handle;
|
|
32
|
+
/** 写请求:自动附带幂等键和 CSRF 令牌。返回值和错误码都有类型。 */
|
|
33
|
+
post<T, E extends string = never>(path: string, body?: unknown, o?: {
|
|
34
|
+
idempotencyKey?: string;
|
|
35
|
+
}): Promise<CageResult<T, E>>;
|
|
36
|
+
get<T>(path: string, query?: Record<string, unknown>): Promise<CageResult<T, 'NOT_FOUND'>>;
|
|
37
|
+
login(username: string, password: string): Promise<CageResult<{
|
|
38
|
+
ok: true;
|
|
39
|
+
}, never>>;
|
|
40
|
+
logout(): Promise<CageResult<unknown, never>>;
|
|
41
|
+
}
|
|
42
|
+
/** 默认实例 */
|
|
43
|
+
export declare const client: CageClient;
|
|
44
|
+
export declare function configureClient(opts: ClientOptions): CageClient;
|
|
45
|
+
export declare function setCapabilities(list: string[]): void;
|
|
46
|
+
/** 登录后调用一次(client.login 已自动调用) */
|
|
47
|
+
export declare function loadMe(c?: CageClient): Promise<CageResult<{
|
|
48
|
+
user: any;
|
|
49
|
+
capabilities: string[];
|
|
50
|
+
}, "NOT_FOUND">>;
|
|
51
|
+
export declare const currentUser: () => {
|
|
52
|
+
id: string;
|
|
53
|
+
username: string;
|
|
54
|
+
name: string;
|
|
55
|
+
deptId: string;
|
|
56
|
+
} | null;
|
|
57
|
+
/** 当前用户有没有某个能力点(只用于界面显示) */
|
|
58
|
+
export declare function can(capability: string): boolean;
|
|
59
|
+
/** React:能力变化时自动重新渲染 */
|
|
60
|
+
export declare function useCan(capability: string): boolean;
|
|
61
|
+
export declare class CageQueryError extends Error {
|
|
62
|
+
readonly result: Extract<CageResult<unknown, string>, {
|
|
63
|
+
ok: false;
|
|
64
|
+
}>;
|
|
65
|
+
constructor(result: Extract<CageResult<unknown, string>, {
|
|
66
|
+
ok: false;
|
|
67
|
+
}>);
|
|
68
|
+
}
|
|
69
|
+
export interface Page<T> {
|
|
70
|
+
items: T[];
|
|
71
|
+
total: number;
|
|
72
|
+
page: number;
|
|
73
|
+
pageSize: number;
|
|
74
|
+
}
|
|
75
|
+
/** 详情或任意 GET:响应用 schema 校验 */
|
|
76
|
+
export declare function useCageQuery<T>(key: QueryKey, path: string, schema?: z.ZodType<T>, options?: Omit<UseQueryOptions<T>, 'queryKey' | 'queryFn'> & {
|
|
77
|
+
query?: Record<string, unknown>;
|
|
78
|
+
}): import("@tanstack/react-query").UseQueryResult<T, Error>;
|
|
79
|
+
/** 列表:分页、排序、过滤参数统一 */
|
|
80
|
+
export declare function useCageList<T>(key: QueryKey, path: string, params?: Record<string, unknown>, itemSchema?: z.ZodType<T>): import("@tanstack/react-query").UseQueryResult<Page<T>, Error>;
|
|
81
|
+
/** 命令:成功后让相关查询失效 */
|
|
82
|
+
export declare function useCageCommand<A extends unknown[], T, E extends string>(fn: (...args: A) => Promise<CageResult<T, E>>, invalidate?: QueryKey[]): import("@tanstack/react-query").UseMutationResult<CageResult<T, E>, Error, A, unknown>;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// @yss123/cage-client:前端 SDK 运行时。生成的 contracts 包在它上面:请求、错误码、can()、查询 hooks。
|
|
2
|
+
// can() 只影响按钮显示;就算有人绕过前端直接调接口,内核第 3 关一样会拒绝。
|
|
3
|
+
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
4
|
+
import { useSyncExternalStore } from 'react';
|
|
5
|
+
function uuid() {
|
|
6
|
+
const c = globalThis.crypto;
|
|
7
|
+
if (c?.randomUUID)
|
|
8
|
+
return c.randomUUID();
|
|
9
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (ch) => {
|
|
10
|
+
const r = (Math.random() * 16) | 0;
|
|
11
|
+
return (ch === 'x' ? r : (r & 0x3) | 0x8).toString(16);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export class CageClient {
|
|
15
|
+
opts;
|
|
16
|
+
csrfToken = null;
|
|
17
|
+
constructor(opts = {}) {
|
|
18
|
+
this.opts = opts;
|
|
19
|
+
}
|
|
20
|
+
get f() {
|
|
21
|
+
return this.opts.fetch ?? ((...a) => fetch(...a));
|
|
22
|
+
}
|
|
23
|
+
url(path, query) {
|
|
24
|
+
const base = this.opts.baseUrl ?? '';
|
|
25
|
+
const qs = query
|
|
26
|
+
? Object.entries(query)
|
|
27
|
+
.filter(([, v]) => v !== undefined && v !== null && v !== '')
|
|
28
|
+
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
|
|
29
|
+
.join('&')
|
|
30
|
+
: '';
|
|
31
|
+
return `${base}${path}${qs ? `?${qs}` : ''}`;
|
|
32
|
+
}
|
|
33
|
+
async csrf(refresh = false) {
|
|
34
|
+
if (this.csrfToken && !refresh)
|
|
35
|
+
return this.csrfToken;
|
|
36
|
+
const r = await this.f(this.url('/auth/csrf'), { credentials: 'include' });
|
|
37
|
+
this.csrfToken = (await r.json()).token;
|
|
38
|
+
return this.csrfToken;
|
|
39
|
+
}
|
|
40
|
+
async handle(res) {
|
|
41
|
+
const text = await res.text();
|
|
42
|
+
let body = null;
|
|
43
|
+
try {
|
|
44
|
+
body = text ? JSON.parse(text) : null;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
body = text;
|
|
48
|
+
}
|
|
49
|
+
if (res.ok)
|
|
50
|
+
return { ok: true, data: body };
|
|
51
|
+
if (res.status === 401)
|
|
52
|
+
this.opts.onUnauthenticated?.();
|
|
53
|
+
return { ok: false, code: body?.code ?? 'INTERNAL', domainCode: body?.domainCode, detail: body?.detail, status: res.status, requestId: body?.requestId };
|
|
54
|
+
}
|
|
55
|
+
/** 写请求:自动附带幂等键和 CSRF 令牌。返回值和错误码都有类型。 */
|
|
56
|
+
async post(path, body = {}, o = {}) {
|
|
57
|
+
const key = o.idempotencyKey ?? uuid();
|
|
58
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
59
|
+
try {
|
|
60
|
+
const res = await this.f(this.url(path), {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
credentials: 'include',
|
|
63
|
+
headers: { 'content-type': 'application/json', 'idempotency-key': key, 'x-csrf-token': await this.csrf(attempt > 0) },
|
|
64
|
+
body: JSON.stringify(body ?? {}),
|
|
65
|
+
});
|
|
66
|
+
const r = await this.handle(res);
|
|
67
|
+
// CSRF 令牌过期:刷新后用同一个幂等键重试一次
|
|
68
|
+
if (!r.ok && r.status === 403 && r.detail === 'CSRF' && attempt === 0)
|
|
69
|
+
continue;
|
|
70
|
+
return r;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
if (attempt === 1)
|
|
74
|
+
return { ok: false, code: 'NETWORK', status: 0 };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { ok: false, code: 'NETWORK', status: 0 };
|
|
78
|
+
}
|
|
79
|
+
async get(path, query) {
|
|
80
|
+
try {
|
|
81
|
+
const res = await this.f(this.url(path, query), { credentials: 'include' });
|
|
82
|
+
return this.handle(res);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return { ok: false, code: 'NETWORK', status: 0 };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async login(username, password) {
|
|
89
|
+
const r = await this.post('/auth/login', { username, password });
|
|
90
|
+
if (r.ok) {
|
|
91
|
+
this.csrfToken = null;
|
|
92
|
+
await loadMe(this);
|
|
93
|
+
}
|
|
94
|
+
return r;
|
|
95
|
+
}
|
|
96
|
+
async logout() {
|
|
97
|
+
const r = await this.post('/auth/logout');
|
|
98
|
+
setCapabilities([]);
|
|
99
|
+
this.csrfToken = null;
|
|
100
|
+
return r;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** 默认实例 */
|
|
104
|
+
export const client = new CageClient();
|
|
105
|
+
export function configureClient(opts) {
|
|
106
|
+
Object.assign(client, new CageClient(opts));
|
|
107
|
+
return client;
|
|
108
|
+
}
|
|
109
|
+
// ---------------- 能力判断 ----------------
|
|
110
|
+
let caps = new Set();
|
|
111
|
+
let me = null;
|
|
112
|
+
const listeners = new Set();
|
|
113
|
+
export function setCapabilities(list) {
|
|
114
|
+
caps = new Set(list);
|
|
115
|
+
for (const l of listeners)
|
|
116
|
+
l();
|
|
117
|
+
}
|
|
118
|
+
/** 登录后调用一次(client.login 已自动调用) */
|
|
119
|
+
export async function loadMe(c = client) {
|
|
120
|
+
const r = await c.get('/api/me');
|
|
121
|
+
me = r.ok ? r.data : null;
|
|
122
|
+
setCapabilities(r.ok ? r.data.capabilities : []);
|
|
123
|
+
return r;
|
|
124
|
+
}
|
|
125
|
+
export const currentUser = () => me?.user ?? null;
|
|
126
|
+
/** 当前用户有没有某个能力点(只用于界面显示) */
|
|
127
|
+
export function can(capability) {
|
|
128
|
+
return caps.has(capability);
|
|
129
|
+
}
|
|
130
|
+
/** React:能力变化时自动重新渲染 */
|
|
131
|
+
export function useCan(capability) {
|
|
132
|
+
return useSyncExternalStore((cb) => {
|
|
133
|
+
listeners.add(cb);
|
|
134
|
+
return () => listeners.delete(cb);
|
|
135
|
+
}, () => caps.has(capability), () => false);
|
|
136
|
+
}
|
|
137
|
+
// ---------------- 查询 hooks(TanStack Query) ----------------
|
|
138
|
+
export class CageQueryError extends Error {
|
|
139
|
+
result;
|
|
140
|
+
constructor(result) {
|
|
141
|
+
super(result.code);
|
|
142
|
+
this.result = result;
|
|
143
|
+
this.name = 'CageQueryError';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** 详情或任意 GET:响应用 schema 校验 */
|
|
147
|
+
export function useCageQuery(key, path, schema, options = {}) {
|
|
148
|
+
const { query, ...rest } = options;
|
|
149
|
+
return useQuery({
|
|
150
|
+
queryKey: query ? [...key, query] : key,
|
|
151
|
+
queryFn: async () => {
|
|
152
|
+
const r = await client.get(path, query);
|
|
153
|
+
if (!r.ok)
|
|
154
|
+
throw new CageQueryError(r);
|
|
155
|
+
return schema ? schema.parse(r.data) : r.data;
|
|
156
|
+
},
|
|
157
|
+
...rest,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/** 列表:分页、排序、过滤参数统一 */
|
|
161
|
+
export function useCageList(key, path, params = {}, itemSchema) {
|
|
162
|
+
return useQuery({
|
|
163
|
+
queryKey: [...key, params],
|
|
164
|
+
queryFn: async () => {
|
|
165
|
+
const r = await client.get(path, params);
|
|
166
|
+
if (!r.ok)
|
|
167
|
+
throw new CageQueryError(r);
|
|
168
|
+
return itemSchema ? { ...r.data, items: r.data.items.map((i) => itemSchema.parse(i)) } : r.data;
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/** 命令:成功后让相关查询失效 */
|
|
173
|
+
export function useCageCommand(fn, invalidate = []) {
|
|
174
|
+
const qc = useQueryClient();
|
|
175
|
+
return useMutation({
|
|
176
|
+
mutationFn: async (args) => fn(...args),
|
|
177
|
+
onSuccess: (r) => {
|
|
178
|
+
if (r.ok)
|
|
179
|
+
for (const k of invalidate)
|
|
180
|
+
void qc.invalidateQueries({ queryKey: k });
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yss123/cage-client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "笼子前端 SDK 运行时:请求、错误码、can()、查询 hooks",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"@tanstack/react-query": "^5.0.0",
|
|
19
|
+
"react": ">=18",
|
|
20
|
+
"zod": "^4.0.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@tanstack/react-query": "^5.85.5",
|
|
24
|
+
"@types/react": "^19.1.12",
|
|
25
|
+
"react": "^19.1.1",
|
|
26
|
+
"zod": "^4.1.5"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/shunshunyue/cage.git",
|
|
32
|
+
"directory": "packages/client"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/shunshunyue/cage#readme",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/shunshunyue/cage/issues"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public",
|
|
40
|
+
"registry": "https://registry.npmjs.org/"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=24"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -p tsconfig.json",
|
|
47
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
48
|
+
}
|
|
6
49
|
}
|