@go-wind/admin-react 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.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -2
  3. package/dist/access/access-control.d.ts +39 -0
  4. package/dist/access/field-permission.d.ts +11 -0
  5. package/dist/access/index.d.ts +4 -0
  6. package/dist/access/use-access.d.ts +50 -0
  7. package/dist/admin-react.css +2 -0
  8. package/dist/admin-react.js +5432 -0
  9. package/dist/admin-react.js.map +1 -0
  10. package/dist/auth-gateway.d.ts +54 -0
  11. package/dist/components/Loading/index.d.ts +22 -0
  12. package/dist/env.d.ts +5 -0
  13. package/dist/hooks/useProTableScrollY.d.ts +22 -0
  14. package/dist/hooks/useTime.d.ts +6 -0
  15. package/dist/hooks/useTitle.d.ts +1 -0
  16. package/dist/hooks/useTokenRefresh.d.ts +26 -0
  17. package/dist/i18n/components/LocaleSwitcher/index.d.ts +1 -0
  18. package/dist/i18n/components/index.d.ts +1 -0
  19. package/dist/i18n/config/i18n.d.ts +18 -0
  20. package/dist/i18n/hooks/index.d.ts +2 -0
  21. package/dist/i18n/hooks/useI18n.d.ts +96 -0
  22. package/dist/i18n/hooks/useLocaleSync.d.ts +4 -0
  23. package/dist/i18n/index.d.ts +3 -0
  24. package/dist/i18n/utils/detector.d.ts +26 -0
  25. package/dist/i18n/utils/formatter.d.ts +38 -0
  26. package/dist/i18n/utils/index.d.ts +3 -0
  27. package/dist/i18n/utils/sync.d.ts +27 -0
  28. package/dist/index.d.ts +34 -0
  29. package/dist/locales/en-US/index.d.ts +2 -0
  30. package/dist/locales/index.d.ts +10 -0
  31. package/dist/locales/zh-CN/index.d.ts +2 -0
  32. package/dist/nprogress-CwfUlis6.js +159 -0
  33. package/dist/nprogress-CwfUlis6.js.map +1 -0
  34. package/dist/preferences/components/PreferencesPanel/AppearancePanel.d.ts +3 -0
  35. package/dist/preferences/components/PreferencesPanel/GeneralPanel.d.ts +3 -0
  36. package/dist/preferences/components/PreferencesPanel/LayoutPanel.d.ts +3 -0
  37. package/dist/preferences/components/PreferencesPanel/ShortcutKeyPanel.d.ts +3 -0
  38. package/dist/preferences/components/PreferencesPanel/index.d.ts +8 -0
  39. package/dist/preferences/components/ThemeProvider/index.d.ts +9 -0
  40. package/dist/preferences/components/index.d.ts +2 -0
  41. package/dist/preferences/config/constants.d.ts +24 -0
  42. package/dist/preferences/config/darkTheme.d.ts +32 -0
  43. package/dist/preferences/config/default.d.ts +3 -0
  44. package/dist/preferences/config/index.d.ts +4 -0
  45. package/dist/preferences/config/lightTheme.d.ts +33 -0
  46. package/dist/preferences/hooks/index.d.ts +3 -0
  47. package/dist/preferences/hooks/useLocale.d.ts +23 -0
  48. package/dist/preferences/hooks/usePreferences.d.ts +31 -0
  49. package/dist/preferences/hooks/useThemeConfig.d.ts +2 -0
  50. package/dist/preferences/index.d.ts +5 -0
  51. package/dist/preferences/store/index.d.ts +24 -0
  52. package/dist/preferences/theme-transition.d.ts +17 -0
  53. package/dist/preferences/types/app.d.ts +238 -0
  54. package/dist/preferences/types/index.d.ts +4 -0
  55. package/dist/preferences/types/layout.d.ts +78 -0
  56. package/dist/preferences/types/preferences-root.d.ts +48 -0
  57. package/dist/preferences/types/theme.d.ts +29 -0
  58. package/dist/preferences/utils/diff.d.ts +7 -0
  59. package/dist/preferences/utils/merge.d.ts +9 -0
  60. package/dist/query-client.d.ts +9 -0
  61. package/dist/rolldown-runtime-BbCBk-LD.js +19 -0
  62. package/dist/router/factory.d.ts +7 -0
  63. package/dist/router/generators/generate-menus.d.ts +13 -0
  64. package/dist/router/generators/generate-routes-backend.d.ts +12 -0
  65. package/dist/router/generators/generate-routes-frontend.d.ts +17 -0
  66. package/dist/router/generators/index.d.ts +3 -0
  67. package/dist/router/index.d.ts +5 -0
  68. package/dist/router/routes-context.d.ts +8 -0
  69. package/dist/router/types/index.d.ts +207 -0
  70. package/dist/router/utils/index.d.ts +8 -0
  71. package/dist/router/utils/inject-redirect.d.ts +6 -0
  72. package/dist/router/utils/lazy.d.ts +11 -0
  73. package/dist/router/utils/loader.d.ts +14 -0
  74. package/dist/router/utils/menu.d.ts +5 -0
  75. package/dist/router/utils/merge-route-modules.d.ts +23 -0
  76. package/dist/router/utils/reset-routes.d.ts +18 -0
  77. package/dist/router/utils/sort-routes.d.ts +5 -0
  78. package/dist/router/utils/transform-meta-to-handle.d.ts +11 -0
  79. package/dist/storage/index.d.ts +2 -0
  80. package/dist/storage/storage.class.d.ts +125 -0
  81. package/dist/storage/storage.types.d.ts +199 -0
  82. package/dist/stores/auth.d.ts +56 -0
  83. package/dist/stores/index.d.ts +2 -0
  84. package/dist/stores/user.d.ts +32 -0
  85. package/dist/transport/rest/captcha-headers.d.ts +2 -0
  86. package/dist/transport/rest/index.d.ts +8 -0
  87. package/dist/transport/rest/modules/downloader.d.ts +9 -0
  88. package/dist/transport/rest/modules/interceptor.d.ts +9 -0
  89. package/dist/transport/rest/modules/uploader.d.ts +10 -0
  90. package/dist/transport/rest/pagination.d.ts +73 -0
  91. package/dist/transport/rest/preset-interceptors.d.ts +25 -0
  92. package/dist/transport/rest/request-api.d.ts +6 -0
  93. package/dist/transport/rest/request-client.d.ts +87 -0
  94. package/dist/transport/rest/types.d.ts +38 -0
  95. package/dist/transport/rest/utils.d.ts +16 -0
  96. package/dist/transport/sse/event.d.ts +44 -0
  97. package/dist/transport/sse/index.d.ts +5 -0
  98. package/dist/transport/sse/sse_client.d.ts +76 -0
  99. package/dist/transport/sse/types.d.ts +27 -0
  100. package/dist/types.d.ts +44 -0
  101. package/dist/utils/color.d.ts +27 -0
  102. package/dist/utils/date.d.ts +5 -0
  103. package/dist/utils/diff.d.ts +6 -0
  104. package/dist/utils/index.d.ts +9 -0
  105. package/dist/utils/inference.d.ts +111 -0
  106. package/dist/utils/merge.d.ts +17 -0
  107. package/dist/utils/nprogress.d.ts +11 -0
  108. package/dist/utils/tree.d.ts +27 -0
  109. package/dist/utils/url.d.ts +11 -0
  110. package/dist/utils/utils.d.ts +37 -0
  111. package/package.json +70 -3
@@ -0,0 +1,199 @@
1
+ /**
2
+ * 存储类型
3
+ */
4
+ export type StorageType = "localStorage" | "sessionStorage";
5
+ /**
6
+ * 缓存驱逐策略
7
+ * - lru: 最近最少使用 (Least Recently Used)
8
+ * - lfu: 最不经常使用 (Least Frequently Used)
9
+ * - hybrid: 混合策略(结合 LRU 和 LFU)
10
+ */
11
+ export type EvictionStrategy = "lru" | "lfu" | "hybrid";
12
+ /**
13
+ * 存储元数据
14
+ * @description 用于跟踪每个存储项的状态信息,支持智能缓存管理
15
+ */
16
+ export interface StorageMeta {
17
+ /** 过期时间戳 (null=永久有效) */
18
+ e: number | null;
19
+ /** 原始数据大小 (bytes) */
20
+ s: number;
21
+ /** 访问次数 (用于 LFU 策略) */
22
+ a: number;
23
+ /** 最后访问时间戳 (用于 LRU 策略) */
24
+ t: number;
25
+ /** 是否已压缩 */
26
+ c: boolean;
27
+ }
28
+ /**
29
+ * 存储性能指标
30
+ * @description 用于监控存储使用情况和分析性能瓶颈
31
+ */
32
+ export interface StorageMetrics {
33
+ /** 命中次数 */
34
+ hits: number;
35
+ /** 未命中次数 */
36
+ misses: number;
37
+ /** 过期清理次数 */
38
+ expirations: number;
39
+ /** 设置操作次数 */
40
+ sets: number;
41
+ /** 错误次数 */
42
+ errors: number;
43
+ /** 配额使用量 (bytes) */
44
+ quotaUsageBytes: number;
45
+ /** 命中率 (0-1) */
46
+ hitRate: number;
47
+ }
48
+ /**
49
+ * 多标签页同步消息
50
+ * @description 用于在不同标签页之间同步存储状态
51
+ */
52
+ export interface SyncMessage {
53
+ /** 操作类型 */
54
+ type: "set" | "remove" | "clear";
55
+ /** 存储键名 */
56
+ key: string;
57
+ /** 标签页 ID */
58
+ tabId: string;
59
+ /** 时间戳 */
60
+ ts: number;
61
+ }
62
+ /**
63
+ * 存储管理器配置选项
64
+ * @description 用于初始化 StorageManager 实例时的配置参数
65
+ */
66
+ export interface StorageManagerOptions {
67
+ /** 存储键名前缀,用于隔离不同模块的数据 */
68
+ prefix?: string;
69
+ /** 存储类型:localStorage 或 sessionStorage */
70
+ storageType?: StorageType;
71
+ /** 触发压缩的阈值 (bytes),默认 1024 */
72
+ compressionThreshold?: number;
73
+ /** 缓存驱逐策略,默认 "hybrid" */
74
+ evictionStrategy?: EvictionStrategy;
75
+ /** 最大存储项数 (0=不限),默认 0 */
76
+ maxItems?: number;
77
+ /** 最大使用量 (MB),默认 10 */
78
+ maxUsageMB?: number;
79
+ /** 默认过期时间 (ms),null 表示永不过期 */
80
+ defaultTTL?: number | null;
81
+ /** 是否开启多标签页同步,默认 true */
82
+ enableSync?: boolean;
83
+ /** 指标变化回调函数 */
84
+ onMetrics?: (metrics: StorageMetrics) => void;
85
+ /** 同步事件回调函数 */
86
+ onSync?: (event: SyncMessage) => void;
87
+ }
88
+ /**
89
+ * 存储项结构(旧版,保留用于兼容)
90
+ * @deprecated 请使用 StorageValue 替代
91
+ */
92
+ export interface StorageItem<T> {
93
+ /** 过期时间戳 */
94
+ expiry?: number;
95
+ /** 存储的值 */
96
+ value: T;
97
+ }
98
+ /**
99
+ * 存储值结构
100
+ * @description 封装数据和过期信息的标准格式
101
+ */
102
+ export interface StorageValue<T> {
103
+ /** 存储的实际数据 */
104
+ data: T;
105
+ /** 过期时间戳 (null=永不过期) */
106
+ expiry: number | null;
107
+ }
108
+ /**
109
+ * 批量设置项的配置
110
+ * @description 用于在批量设置时为每个项指定独立的 TTL
111
+ */
112
+ export interface BatchSetItem<T> {
113
+ /** 要存储的值 */
114
+ value: T;
115
+ /** 过期时间 (ms),覆盖默认 TTL */
116
+ ttl?: number | null;
117
+ }
118
+ /**
119
+ * 批量获取的选项
120
+ * @description 控制批量获取操作的行为
121
+ */
122
+ export interface BatchGetOptions {
123
+ /** 是否跳过过期项(默认 true,自动清理过期数据) */
124
+ skipExpired?: boolean;
125
+ /** 是否返回原始解析结果(用于调试,默认 false) */
126
+ includeRaw?: boolean;
127
+ }
128
+ /**
129
+ * 批量操作结果
130
+ * @description 包含批量操作的执行结果统计
131
+ */
132
+ export interface BatchResult<T> {
133
+ /** 成功设置的项 */
134
+ success: Record<string, T>;
135
+ /** 失败的项及对应的错误信息 */
136
+ failed: Record<string, Error>;
137
+ /** 因过期被清理的键列表 */
138
+ expired: string[];
139
+ }
140
+ /**
141
+ * 批量操作进度回调
142
+ * @description 用于实时监控批量操作的执行进度
143
+ */
144
+ export type BatchProgressCallback = (progress: {
145
+ /** 当前已处理的项目数 */
146
+ current: number;
147
+ /** 总项目数 */
148
+ total: number;
149
+ /** 当前处理的键名 */
150
+ key: string;
151
+ /** 处理状态 */
152
+ status: "success" | "failed" | "expired";
153
+ }) => void;
154
+ /**
155
+ * 存储缓存接口
156
+ * @description 定义存储管理器的基本操作契约
157
+ */
158
+ export interface IStorageCache {
159
+ /** 清除所有存储项 */
160
+ clear(): void;
161
+ /** 清除所有过期项 */
162
+ clearExpiredItems(): void;
163
+ /**
164
+ * 获取指定索引的键名
165
+ * @param index - 索引位置
166
+ * @returns 键名或 null
167
+ */
168
+ key(index: number): string | null;
169
+ /**
170
+ * 获取存储项数量
171
+ * @returns 存储项总数
172
+ */
173
+ length(): number;
174
+ /**
175
+ * 移除指定键的存储项
176
+ * @param key - 存储键名
177
+ */
178
+ removeItem(key: string): void;
179
+ /**
180
+ * 设置存储项
181
+ * @param key - 存储键名
182
+ * @param value - 要存储的值
183
+ * @param ttl - 过期时间 (ms),可选
184
+ */
185
+ setItem<T>(key: string, value: T, ttl?: number | null): void;
186
+ /**
187
+ * 获取存储项
188
+ * @param key - 存储键名
189
+ * @param defaultValue - 默认值,当键不存在时返回
190
+ * @returns 存储的值或默认值
191
+ */
192
+ getItem<T>(key: string, defaultValue?: T | null): T | null;
193
+ /**
194
+ * 检查键是否存在且未过期
195
+ * @param key - 存储键名
196
+ * @returns 是否存在
197
+ */
198
+ hasItem(key: string): boolean;
199
+ }
@@ -0,0 +1,56 @@
1
+ import { type StoreApi } from 'zustand';
2
+ import { type AdminLoginParams } from '../auth-gateway';
3
+ import type { AdminUserInfo } from '../types';
4
+ /**
5
+ * 令牌载荷
6
+ */
7
+ export interface TokenPayload {
8
+ /**
9
+ * 令牌值
10
+ */
11
+ value: string;
12
+ /**
13
+ * 令牌过期时间
14
+ */
15
+ expiresAt?: number;
16
+ }
17
+ export interface AuthState {
18
+ accessToken: string | null;
19
+ accessTokenExpireAt: number | null;
20
+ userInfo: AdminUserInfo | null;
21
+ mfaOperationId: string | null;
22
+ loginLoading: boolean;
23
+ error: string | null;
24
+ login: (params: AdminLoginParams, onSuccess?: () => void, captcha?: {
25
+ id: string;
26
+ value: string;
27
+ }) => Promise<void>;
28
+ /**
29
+ * 完成 MFA 挑战:用 operation_id + TOTP 码调后端验证,通过则后端返回真 token,
30
+ * 复用登录成功流程(存 token / 拉用户信息 / 跳首页)。失败抛错。
31
+ */
32
+ completeMfaChallenge: (totpCode: string, onSuccess?: () => void) => Promise<void>;
33
+ /** 完成 OIDC SSO 登录:code+state 换令牌,复用登录成功流程;失败抛错 */
34
+ completeSsoLogin: (code: string, state: string, onSuccess?: () => void) => Promise<void>;
35
+ logout: (redirect?: boolean) => Promise<void>;
36
+ refreshToken: () => Promise<string>;
37
+ reauthenticate: () => void;
38
+ /** 强制登出:纯前端清除认证状态 + 跳转登录页,不调后端接口(用于 token 已失效场景) */
39
+ forceLogout: () => void;
40
+ setUserInfo: (info: AdminUserInfo) => void;
41
+ clearError: () => void;
42
+ $reset: () => void;
43
+ }
44
+ export declare const useAuthStore: import("zustand").UseBoundStore<Omit<StoreApi<AuthState>, "setState" | "persist"> & {
45
+ setState(partial: AuthState | Partial<AuthState> | ((state: AuthState) => AuthState | Partial<AuthState>), replace?: false | undefined): unknown;
46
+ setState(state: AuthState | ((state: AuthState) => AuthState), replace: true): unknown;
47
+ persist: {
48
+ setOptions: (options: Partial<import("zustand/middleware").PersistOptions<AuthState, {}, unknown>>) => void;
49
+ clearStorage: () => void;
50
+ rehydrate: () => Promise<void>;
51
+ hasHydrated: () => boolean;
52
+ onHydrate: (fn: (state: AuthState) => void) => () => void;
53
+ onFinishHydration: (fn: (state: AuthState) => void) => () => void;
54
+ getOptions: () => Partial<import("zustand/middleware").PersistOptions<AuthState, {}, unknown>>;
55
+ };
56
+ }>;
@@ -0,0 +1,2 @@
1
+ export * from './auth';
2
+ export * from './user';
@@ -0,0 +1,32 @@
1
+ import type { AdminUserBasic } from '../types';
2
+ export interface UserState {
3
+ userInfo: AdminUserBasic | null;
4
+ userRoles: string[];
5
+ accessCodes: string[];
6
+ hiddenFields: string[];
7
+ tenantId: string | null;
8
+ isLoggedIn: boolean;
9
+ setUserInfo: (info: AdminUserBasic | null) => void;
10
+ setUserRoles: (roles: string[]) => void;
11
+ setAccessCodes: (codes: string[]) => void;
12
+ setHiddenFields: (fields: string[]) => void;
13
+ isTenantUser: () => boolean;
14
+ $reset: () => void;
15
+ }
16
+ export declare const useUserStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<UserState>, "setState" | "persist"> & {
17
+ setState(partial: UserState | Partial<UserState> | ((state: UserState) => UserState | Partial<UserState>), replace?: false | undefined): unknown;
18
+ setState(state: UserState | ((state: UserState) => UserState), replace: true): unknown;
19
+ persist: {
20
+ setOptions: (options: Partial<import("zustand/middleware").PersistOptions<UserState, {
21
+ userInfo: AdminUserBasic | null;
22
+ }, unknown>>) => void;
23
+ clearStorage: () => void;
24
+ rehydrate: () => Promise<void>;
25
+ hasHydrated: () => boolean;
26
+ onHydrate: (fn: (state: UserState) => void) => () => void;
27
+ onFinishHydration: (fn: (state: UserState) => void) => () => void;
28
+ getOptions: () => Partial<import("zustand/middleware").PersistOptions<UserState, {
29
+ userInfo: AdminUserBasic | null;
30
+ }, unknown>>;
31
+ };
32
+ }>;
@@ -0,0 +1,2 @@
1
+ export declare function setCaptchaHeaders(id: string, value: string): void;
2
+ export declare function consumeCaptchaHeaders(): Record<string, string> | null;
@@ -0,0 +1,8 @@
1
+ export * from './captcha-headers';
2
+ export * from './preset-interceptors';
3
+ export * from './request-client';
4
+ export * from './types';
5
+ export * from './request-api';
6
+ export * from './utils';
7
+ export * from './pagination';
8
+ export * from 'axios';
@@ -0,0 +1,9 @@
1
+ import type { AxiosRequestConfig } from 'axios';
2
+ import type { RequestClient } from '../request-client';
3
+ import type { RequestResponse } from '../types';
4
+ declare class FileDownloader {
5
+ private client;
6
+ constructor(client: RequestClient);
7
+ download(url: string, config?: AxiosRequestConfig): Promise<RequestResponse<Blob>>;
8
+ }
9
+ export { FileDownloader };
@@ -0,0 +1,9 @@
1
+ import type { AxiosInstance } from 'axios';
2
+ import type { RequestInterceptorConfig, ResponseInterceptorConfig } from '../types';
3
+ declare class InterceptorManager {
4
+ private axiosInstance;
5
+ constructor(instance: AxiosInstance);
6
+ addRequestInterceptor({ fulfilled, rejected, }?: RequestInterceptorConfig): void;
7
+ addResponseInterceptor<T = any>({ fulfilled, rejected, }?: ResponseInterceptorConfig<T>): void;
8
+ }
9
+ export { InterceptorManager };
@@ -0,0 +1,10 @@
1
+ import type { AxiosRequestConfig, AxiosResponse } from 'axios';
2
+ import type { RequestClient } from '../request-client';
3
+ declare class FileUploader {
4
+ private client;
5
+ constructor(client: RequestClient);
6
+ upload(url: string, data: {
7
+ file: Blob | File;
8
+ } & Record<string, any>, config?: AxiosRequestConfig): Promise<AxiosResponse>;
9
+ }
10
+ export { FileUploader };
@@ -0,0 +1,73 @@
1
+ export declare class PaginationQuery {
2
+ paging?: {
3
+ page?: number;
4
+ pageSize?: number;
5
+ };
6
+ formValues?: Record<string, unknown> | null;
7
+ fieldMask?: string | string[] | null;
8
+ orderBy?: string[] | null;
9
+ isTenantUser: boolean;
10
+ constructor(data?: Partial<PaginationQuery>);
11
+ /**
12
+ * 移除对象中的 null 和 undefined 值
13
+ * @param obj - 需要清理的对象
14
+ * @returns 清理后的对象
15
+ */
16
+ private static removeNullUndefined;
17
+ /**
18
+ * key 末段是否已是 go-crud 支持的查询操作符(created_at__gte、type__not 等)。
19
+ * 这类 key 不能再叠加 __contains:go-crud 会把 `a__gte__contains`
20
+ * 解析成 `a CONTAINS value`,对时间/布尔列直接 SQL 报错(500),
21
+ * "排除"等语义也可能被静默反转。
22
+ *
23
+ * 下表与 go-crud `filter/operator_converter.go` 的 operatorMap 别名集
24
+ * 逐字对齐(含 i_* 前缀变体、数值比较长拼写/连字符拼写、is_not_null
25
+ * 拼写族、json_contains/array_contains/exists/search/exact/iexact)。
26
+ * 后端映射表变更时须同步此表;匹配前做小写归一(后端同)。此表缺项
27
+ * 会让对应后缀键被追加 __contains 而语义反转或 500(2026-09-13 修复的缺口)。
28
+ */
29
+ private static hasOperatorSuffix;
30
+ /**
31
+ * 创建列表查询 JSON 过滤字符串
32
+ *
33
+ * 后端 go-crud 的裸 `{"field": value}` 走 EQ 精确匹配;搜索框输入部分关键词
34
+ * 必须使用 `field__contains` 才是模糊匹配。这里约定:字符串值统一转
35
+ * `__contains`(contains 是完整值精确匹配的超集,对下拉枚举等完整值查询
36
+ * 结果一致),非字符串(数字/布尔)保持 EQ 精确语义。
37
+ * @param formValues - 查询表单值
38
+ * @param needCleanTenant - 是否需要清理租户字段
39
+ * @returns JSON 字符串或 undefined
40
+ */
41
+ private static makeQueryString;
42
+ /**
43
+ * 创建排序字符串
44
+ * @param orderBy - 排序字段数组
45
+ * @returns JSON 字符串或 undefined
46
+ */
47
+ private static makeOrderBy;
48
+ get noPaging(): boolean;
49
+ get orderByString(): string | undefined;
50
+ get queryString(): string | undefined;
51
+ private get formattedFieldMask();
52
+ toRawParams(): {
53
+ page: number | undefined;
54
+ pageSize: number | undefined;
55
+ noPaging: boolean;
56
+ fieldMask: string | undefined;
57
+ orderBy: string | undefined;
58
+ query: string | undefined;
59
+ sorting: undefined;
60
+ offset: undefined;
61
+ limit: undefined;
62
+ token: undefined;
63
+ filter: undefined;
64
+ filterExpr: undefined;
65
+ };
66
+ }
67
+ /**
68
+ * 分页查询结果类型
69
+ */
70
+ export type PaginationResult<T> = {
71
+ items: T[];
72
+ total: number;
73
+ };
@@ -0,0 +1,25 @@
1
+ import type { RequestClient } from './request-client';
2
+ import type { MakeErrorMessageFn, ResponseInterceptorConfig } from './types';
3
+ /**
4
+ * 认证响应拦截器:处理 401 错误,支持自动刷新 token 和重新认证
5
+ * @param client 请求客户端实例
6
+ * @param doReAuthenticate 重新认证函数,返回 Promise<void>
7
+ * @param doRefreshToken 刷新 token 函数,返回 Promise<string>,成功时返回新的 token
8
+ * @param enableRefreshToken 是否启用刷新 token 功能
9
+ * @param formatToken 格式化 token 的函数,接受原始 token 字符串,返回格式化后的 token 字符串(如添加 "Bearer " 前缀),如果返回 null 则不设置 Authorization 头
10
+ * @returns 响应拦截器配置对象
11
+ */
12
+ export declare const authenticateResponseInterceptor: ({ client, doReAuthenticate, doRefreshToken, enableRefreshToken, formatToken, }: {
13
+ client: RequestClient;
14
+ doReAuthenticate: () => Promise<void>;
15
+ doRefreshToken: () => Promise<string>;
16
+ enableRefreshToken: boolean;
17
+ formatToken: (token: string) => null | string;
18
+ }) => ResponseInterceptorConfig;
19
+ /**
20
+ * 错误消息拦截器:提取错误文本并回调
21
+ * @param makeErrorMessage 错误消息回调函数
22
+ * @param getErrorMsg 获取错误消息函数,默认为 getDefaultErrorMsg
23
+ * @returns 响应拦截器配置对象
24
+ */
25
+ export declare const errorMessageResponseInterceptor: (makeErrorMessage?: MakeErrorMessageFn, getErrorMsg?: (error: unknown) => string) => ResponseInterceptorConfig;
@@ -0,0 +1,6 @@
1
+ export declare function requestApi({ path, method, body, headers, }: {
2
+ path: string;
3
+ method: string;
4
+ body: null | string;
5
+ headers?: Record<string, string>;
6
+ }): Promise<unknown>;
@@ -0,0 +1,87 @@
1
+ import type { AxiosRequestConfig } from 'axios';
2
+ import { FileDownloader } from './modules/downloader';
3
+ import { InterceptorManager } from './modules/interceptor';
4
+ import { FileUploader } from './modules/uploader';
5
+ import type { RequestClientCallbacks, RequestClientOptions } from './types';
6
+ declare class RequestClient {
7
+ private readonly instance;
8
+ /**
9
+ * 错误消息提取函数(由应用层注入,接入 i18n;未注入时回退到 getDefaultErrorMsg)。
10
+ * 仅基于 reason 翻译,不返回后端 message。
11
+ */
12
+ private readonly getErrorMsg;
13
+ addRequestInterceptor: InterceptorManager['addRequestInterceptor'];
14
+ addResponseInterceptor: InterceptorManager['addResponseInterceptor'];
15
+ download: FileDownloader['download'];
16
+ isRefreshing: boolean;
17
+ refreshTokenQueue: ((token: string) => void)[];
18
+ upload: FileUploader['upload'];
19
+ private static _instance;
20
+ /**
21
+ * 初始化全局单例(在 bootstrap 时调用一次)
22
+ */
23
+ static init(baseURL: string, callbacks: RequestClientCallbacks): void;
24
+ /**
25
+ * 获取全局单例
26
+ */
27
+ static getInstance(): RequestClient;
28
+ /**
29
+ * 构造函数,创建 Axios 实例并注册拦截器
30
+ * @param options - Axios 请求配置
31
+ * @param callbacks - 业务回调接口(token、认证、错误处理),由应用层注入
32
+ */
33
+ constructor(options?: RequestClientOptions, callbacks?: RequestClientCallbacks);
34
+ /**
35
+ * 格式化令牌
36
+ */
37
+ private formatToken;
38
+ /**
39
+ * 注册所有内置拦截器
40
+ */
41
+ private setupInterceptors;
42
+ /**
43
+ * 请求拦截器:注入 Authorization Token
44
+ */
45
+ private useTokenInterceptor;
46
+ /**
47
+ * 请求拦截器:注入 X-Request-ID 和 XMLHttpRequest 标识
48
+ */
49
+ private useRequestIdInterceptor;
50
+ /**
51
+ * 请求拦截器:注入 Accept-Language
52
+ */
53
+ private useLocaleInterceptor;
54
+ /**
55
+ * 响应拦截器:解构响应数据(只返回 data 部分)
56
+ */
57
+ private useResponseDataInterceptor;
58
+ /**
59
+ * 401 认证拦截器:自动刷新 Token 或跳转登录页
60
+ */
61
+ private useAuthInterceptor;
62
+ /**
63
+ * 统一错误消息拦截器:提取错误文本并回调
64
+ */
65
+ private useErrorMessageInterceptor;
66
+ /**
67
+ * DELETE请求方法
68
+ */
69
+ delete<T = never>(url: string, config?: AxiosRequestConfig): Promise<T>;
70
+ /**
71
+ * GET请求方法
72
+ */
73
+ get<T = never>(url: string, config?: AxiosRequestConfig): Promise<T>;
74
+ /**
75
+ * POST请求方法
76
+ */
77
+ post<T = never>(url: string, data?: never, config?: AxiosRequestConfig): Promise<T>;
78
+ /**
79
+ * PUT请求方法
80
+ */
81
+ put<T = never>(url: string, data?: never, config?: AxiosRequestConfig): Promise<T>;
82
+ /**
83
+ * 通用的请求方法
84
+ */
85
+ request<T>(url: string, config: AxiosRequestConfig): Promise<T>;
86
+ }
87
+ export { RequestClient };
@@ -0,0 +1,38 @@
1
+ import type { AxiosResponse, CreateAxiosDefaults, InternalAxiosRequestConfig } from 'axios';
2
+ type RequestResponse<T = any> = AxiosResponse<T>;
3
+ type RequestContentType = 'application/json;charset=utf-8' | 'application/octet-stream;charset=utf-8' | 'application/x-www-form-urlencoded;charset=utf-8' | 'multipart/form-data;charset=utf-8';
4
+ type RequestClientOptions = CreateAxiosDefaults;
5
+ interface RequestInterceptorConfig {
6
+ fulfilled?: (config: InternalAxiosRequestConfig) => InternalAxiosRequestConfig<any> | Promise<InternalAxiosRequestConfig<any>>;
7
+ rejected?: (error: any) => any;
8
+ }
9
+ interface ResponseInterceptorConfig<T = any> {
10
+ fulfilled?: (response: AxiosResponse<T>) => AxiosResponse | Promise<AxiosResponse>;
11
+ rejected?: (error: any) => any;
12
+ }
13
+ type MakeErrorMessageFn = (message: string, error: any) => void;
14
+ interface HttpResponse {
15
+ code: number;
16
+ reason: string;
17
+ message: string;
18
+ metadata: object;
19
+ }
20
+ /**
21
+ * 请求客户端回调接口
22
+ * 由应用层(bootstrap)注入具体实现,基础设施层不感知业务逻辑
23
+ */
24
+ interface RequestClientCallbacks {
25
+ /** 获取当前 access token */
26
+ getToken: () => string | null;
27
+ /** 获取当前语言标识(如 zh-CN、en-US) */
28
+ getLocale?: () => string;
29
+ /** 刷新 token,返回新的 access token */
30
+ refreshToken: () => Promise<string>;
31
+ /** Token 彻底失效时的处理(登出 + 跳转登录页) */
32
+ onReAuthenticate: (redirect?: boolean) => Promise<void>;
33
+ /** 错误消息处理(弹窗、toast 等) */
34
+ onError?: (message: string) => void;
35
+ /** 从错误对象中提取用户友好的错误消息(可接入 i18n) */
36
+ getErrorMsg?: (error: unknown) => string;
37
+ }
38
+ export type { RequestClientCallbacks, HttpResponse, MakeErrorMessageFn, RequestClientOptions, RequestContentType, RequestInterceptorConfig, RequestResponse, ResponseInterceptorConfig, };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 创建更新掩码字符串
3
+ * @param keys - 字段键名数组
4
+ * @returns 逗号分隔的字符串
5
+ */
6
+ export declare function makeUpdateMask(keys: string[]): string;
7
+ /**
8
+ * 默认的请求 ID 生成器
9
+ */
10
+ export declare function defaultIdGenerator(): string;
11
+ /**
12
+ * 默认的错误消息提取(不依赖 i18n,纯逻辑 fallback)
13
+ * 仅基于 reason;不再回退到后端 message 字段(该字段后续将被移除)。
14
+ * 如需 i18n 翻译,通过 RequestClientCallbacks.getErrorMsg 注入。
15
+ */
16
+ export declare function getDefaultErrorMsg(error: unknown): string;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * SSE 事件名注册表(react 端副本)。
3
+ *
4
+ * 真相源是后端 `backend/pkg/sseevent/sseevent.go`:它把常量写进帧的 `event:` 行,
5
+ * 这里按同名注册回调,中间没有编译期检查(`SSEEventName` 带 `| string`,等于不约束)。
6
+ * 新增事件要两边同时改;已发布事件的取值不可改——改名等于对线上前端静默断流。
7
+ */
8
+ export declare const SSE_EVENT: {
9
+ /**
10
+ * 站内信收件行推送。
11
+ *
12
+ * data 为 `InternalMessageRecipient` 的 protojson:camelCase 键(`messageId` /
13
+ * `recipientUserId` / `createdAt`),`status` 是枚举名字符串(`RECEIVED` / `READ`),
14
+ * 与 REST 收件箱接口返回的形状一致。
15
+ */
16
+ readonly Notification: "notification";
17
+ /**
18
+ * AI 对话流式片段推送。
19
+ *
20
+ * data 为 `ChatChunkEvent` 的 protojson:camelCase 键(`conversationId` /
21
+ * `seq` / `delta`)。一次对话产生多个 chunk 帧,按 conversationId 归组、
22
+ * seq 顺序累积渲染;POST /admin/v1/ai/chat/completions 的同步响应携带
23
+ * 完整回复,以响应为准校正累积文本。
24
+ */
25
+ readonly AIChatChunk: "ai_chat_chunk";
26
+ /**
27
+ * AI 对话的工具调用可见化推送。
28
+ *
29
+ * data 为 `ChatToolEvent` 的 protojson:camelCase 键(`conversationId` /
30
+ * `name` / `arguments` / `result`)。模型每发起一次本地工具调用并执行完成
31
+ * 后推一帧;工具轮不进消息落库(落库的 assistant 消息只有最终答案),
32
+ * 本事件是前端展示"模型正在调工具"的唯一信息源(尽力而为,丢帧可容忍)。
33
+ */
34
+ readonly AIChatTool: "ai_chat_tool";
35
+ /**
36
+ * AI Agent 试运行实时推送。
37
+ *
38
+ * data 为 `AgentRunEvent` 的 protojson:camelCase 键(`runId` / `appId` /
39
+ * `seq` / `phase`(node_start|node_end|error|done) / `nodeId` / `summary` /
40
+ * `status`)。一次试运行产生多帧;Run 同步响应携带完整 trace 与终态,
41
+ * 以响应为准校正(尽力而为,丢帧可容忍)。streamId 与对话同为发起用户流。
42
+ */
43
+ readonly AgentRun: "ai_agent_run";
44
+ };
@@ -0,0 +1,5 @@
1
+ import { SSEClient } from './sse_client';
2
+ export * from './sse_client';
3
+ export * from './types';
4
+ export * from './event';
5
+ export declare const globalSSEClient: SSEClient;