@route-forge/core 0.2.0 → 1.0.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/README.md +155 -3
- package/dist/codegen.cjs +31 -17
- package/dist/codegen.cjs.map +1 -1
- package/dist/codegen.d.cts +3 -2
- package/dist/codegen.d.ts +3 -2
- package/dist/codegen.js +31 -17
- package/dist/codegen.js.map +1 -1
- package/dist/index.cjs +223 -72
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -10
- package/dist/index.d.ts +4 -10
- package/dist/index.js +223 -72
- package/dist/index.js.map +1 -1
- package/dist/types-yzY9-FWd.d.cts +330 -0
- package/dist/types-yzY9-FWd.d.ts +330 -0
- package/package.json +1 -1
- package/dist/types-DpbxJ6Yk.d.cts +0 -186
- package/dist/types-DpbxJ6Yk.d.ts +0 -186
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LoadingTracker:加载中标识状态管理
|
|
3
|
+
*
|
|
4
|
+
* 通过引用计数器跟踪并发请求数。
|
|
5
|
+
* - start():计数器 +1,进入加载状态
|
|
6
|
+
* - stop():计数器 -1,归零时退出加载状态
|
|
7
|
+
* - isLoading():查询当前是否处于加载中
|
|
8
|
+
* - subscribe(cb):监听状态变化,返回取消订阅函数
|
|
9
|
+
*
|
|
10
|
+
* @see .docs/SPEC.md §4.1.8
|
|
11
|
+
*/
|
|
12
|
+
/** 状态变更回调签名 */
|
|
13
|
+
type LoadingChangeCallback = (event: LoadingChangeEvent) => void;
|
|
14
|
+
/** 状态变更事件 */
|
|
15
|
+
interface LoadingChangeEvent {
|
|
16
|
+
/** 当前是否仍处于加载中 */
|
|
17
|
+
loading: boolean;
|
|
18
|
+
/** 当前并发请求数 */
|
|
19
|
+
count: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 加载状态跟踪器
|
|
23
|
+
*
|
|
24
|
+
* 单一计数器,跟踪所有 API 请求的并发数。
|
|
25
|
+
* 不绑定任何 UI 样式,仅提供状态供框架层或业务层消费。
|
|
26
|
+
*/
|
|
27
|
+
declare class LoadingTracker {
|
|
28
|
+
/** 当前并发请求计数 */
|
|
29
|
+
private count;
|
|
30
|
+
/** 订阅者集合 */
|
|
31
|
+
private subscribers;
|
|
32
|
+
/**
|
|
33
|
+
* 开始一次加载(计数器 +1)
|
|
34
|
+
*/
|
|
35
|
+
start(): void;
|
|
36
|
+
/**
|
|
37
|
+
* 结束一次加载(计数器 -1)
|
|
38
|
+
*/
|
|
39
|
+
stop(): void;
|
|
40
|
+
/**
|
|
41
|
+
* 查询当前是否处于加载中
|
|
42
|
+
*/
|
|
43
|
+
isLoading(): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* 获取当前并发计数
|
|
46
|
+
*/
|
|
47
|
+
getCount(): number;
|
|
48
|
+
/**
|
|
49
|
+
* 订阅加载状态变更
|
|
50
|
+
* @returns 取消订阅函数
|
|
51
|
+
*/
|
|
52
|
+
subscribe(cb: LoadingChangeCallback): () => void;
|
|
53
|
+
/** 通知所有订阅者 */
|
|
54
|
+
private notify;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @route-forge/core 核心类型定义
|
|
59
|
+
* @see .docs/SPEC.md §4.1.3a, §4.1.1
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 路由元信息(后端 /_forge/routes/{level} 返回的单条路由结构)
|
|
64
|
+
*/
|
|
65
|
+
interface RouteMeta {
|
|
66
|
+
/** 路由名,如 'admin.users.show' */
|
|
67
|
+
name: string;
|
|
68
|
+
/** 路由 URI 模板,如 'admin/users/{user}' */
|
|
69
|
+
uri: string;
|
|
70
|
+
/** 支持的 HTTP 方法集合,如 ['GET','HEAD'] */
|
|
71
|
+
methods: string[];
|
|
72
|
+
/** 路径参数名列表,如 ['user'] */
|
|
73
|
+
parameters: string[];
|
|
74
|
+
/** 路径参数默认值(Laravel ->defaults()),key 为参数名,value 为默认值 */
|
|
75
|
+
parameter_defaults?: Record<string, unknown>;
|
|
76
|
+
/** 所属层级(前端填充,便于隔离缓存) */
|
|
77
|
+
level?: string;
|
|
78
|
+
/** 后端下发的缓存 TTL(秒),优先级高于本地 cache.ttl */
|
|
79
|
+
cache?: number | null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 某层级下的全部路由元信息响应
|
|
83
|
+
*/
|
|
84
|
+
interface LevelRoutesResponse {
|
|
85
|
+
level: string;
|
|
86
|
+
routes: Record<string, RouteMeta>;
|
|
87
|
+
/** 后端可选下发该层级缓存 TTL */
|
|
88
|
+
cache?: number | null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 摘要端点响应(SPEC §3.1.6)
|
|
92
|
+
* GET /_forge/routes 返回此结构
|
|
93
|
+
*/
|
|
94
|
+
interface SummaryResponse {
|
|
95
|
+
levels: Record<string, {
|
|
96
|
+
description: string;
|
|
97
|
+
load: 'lazy' | 'eager';
|
|
98
|
+
cache: number | null;
|
|
99
|
+
route_count: number;
|
|
100
|
+
}>;
|
|
101
|
+
config: {
|
|
102
|
+
strict_mode: boolean;
|
|
103
|
+
endpoint_prefix: string;
|
|
104
|
+
/** 后端下发的 URL 前缀,生成 URL 时自动拼接到路由 URI 前面(SPEC §3.1.6) */
|
|
105
|
+
url_prefix?: string;
|
|
106
|
+
};
|
|
107
|
+
unassigned: Array<{
|
|
108
|
+
name: string;
|
|
109
|
+
uri: string;
|
|
110
|
+
methods: string[];
|
|
111
|
+
parameters: string[];
|
|
112
|
+
parameter_defaults?: Record<string, unknown>;
|
|
113
|
+
}>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 请求拦截器接收/返回的配置对象(可变,返回修改后的版本)
|
|
117
|
+
*/
|
|
118
|
+
interface RequestConfig {
|
|
119
|
+
route: string;
|
|
120
|
+
level: string;
|
|
121
|
+
method: string;
|
|
122
|
+
url: string;
|
|
123
|
+
headers: Record<string, string>;
|
|
124
|
+
body?: unknown;
|
|
125
|
+
params: Record<string, unknown>;
|
|
126
|
+
meta: RouteMeta;
|
|
127
|
+
/** 请求超时毫秒数 */
|
|
128
|
+
timeout?: number;
|
|
129
|
+
/** 自定义 query 序列化函数 */
|
|
130
|
+
paramsSerializer?: (params: Record<string, unknown>) => string;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 响应拦截器首段接收的完整数据对象
|
|
134
|
+
*/
|
|
135
|
+
interface ResponseData {
|
|
136
|
+
route: string;
|
|
137
|
+
level: string;
|
|
138
|
+
method: string;
|
|
139
|
+
url: string;
|
|
140
|
+
status: number;
|
|
141
|
+
headers: Headers;
|
|
142
|
+
data: unknown;
|
|
143
|
+
config: RequestConfig;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* forge.api(level, name, params) 调用参数
|
|
147
|
+
*
|
|
148
|
+
* 参数解析规则(智能消解):
|
|
149
|
+
* 1. `params` — 显式指定路径参数,优先级最高
|
|
150
|
+
* 2. 平铺的 string | number 值 — 作为路径参数(含与 query/body/headers 同名的 key)
|
|
151
|
+
* 3. `query` (对象) — 查询参数,序列化到 URL query string
|
|
152
|
+
* 4. `body` (非 string/number) — 请求体
|
|
153
|
+
* 5. `headers` (对象) — 自定义请求头
|
|
154
|
+
*
|
|
155
|
+
* 当路径参数名与 query/body/headers 冲突时:
|
|
156
|
+
* - 值为 string | number → 智能识别为路径参数
|
|
157
|
+
* - 同时提供 params 显式指定 → params 优先,固定 key 按原定义处理
|
|
158
|
+
*/
|
|
159
|
+
interface ApiCallParams {
|
|
160
|
+
/** 路径参数:填充到 URI 模板的 {name} 占位符 */
|
|
161
|
+
[paramName: string]: unknown;
|
|
162
|
+
/** 显式指定路径参数(优先级最高,解决路径参数名与 query/body/headers 冲突的场景) */
|
|
163
|
+
params?: Record<string, unknown>;
|
|
164
|
+
/**
|
|
165
|
+
* 查询参数(对象 → query string)或路径参数(string | number → 填充 {query} 占位符)
|
|
166
|
+
* @see .docs/SPEC.md §4.1.3 参数智能解析
|
|
167
|
+
*/
|
|
168
|
+
query?: Record<string, unknown> | string | number;
|
|
169
|
+
/**
|
|
170
|
+
* 请求体(非基元值 → body)或路径参数(string | number → 填充 {body} 占位符)
|
|
171
|
+
*/
|
|
172
|
+
body?: unknown;
|
|
173
|
+
/**
|
|
174
|
+
* 自定义请求头(对象 → headers)或路径参数(string | number → 填充 {headers} 占位符)
|
|
175
|
+
*/
|
|
176
|
+
headers?: Record<string, string> | string | number;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 缓存存储介质
|
|
180
|
+
*/
|
|
181
|
+
type CacheStorage = 'memory' | 'sessionStorage' | 'localStorage';
|
|
182
|
+
/**
|
|
183
|
+
* Adapter 选择值
|
|
184
|
+
*/
|
|
185
|
+
type AdapterOption = 'auto' | 'axios' | 'builtin' | Fetcher;
|
|
186
|
+
/**
|
|
187
|
+
* Fetcher 接口(自定义 adapter)
|
|
188
|
+
* @see .docs/SPEC.md §4.3.3
|
|
189
|
+
*/
|
|
190
|
+
interface Fetcher {
|
|
191
|
+
request(config: RequestConfig): Promise<ResponseData>;
|
|
192
|
+
interceptors?: {
|
|
193
|
+
request?: InterceptorManager<RequestConfig, RequestConfig>;
|
|
194
|
+
response?: InterceptorManager<ResponseData, unknown>;
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 拦截器管理器接口(与 axios use/eject/clear API 一致)
|
|
199
|
+
*
|
|
200
|
+
* 双类型参数说明(对应 SPEC §4.1.3a):
|
|
201
|
+
* - 请求拦截:TIn = TOut = RequestConfig(不可变换类型,仅修改字段)
|
|
202
|
+
* - 响应拦截:TIn = ResponseData, TOut = unknown(首段接收 ResponseData,
|
|
203
|
+
* 后续段接收上一段返回值,返回类型由用户自行约束)
|
|
204
|
+
*/
|
|
205
|
+
interface InterceptorManager<TIn, TOut = TIn> {
|
|
206
|
+
use(onFulfilled?: (value: TIn) => TOut | Promise<TOut>, onRejected?: (error: unknown) => unknown | Promise<unknown>): number;
|
|
207
|
+
eject(id: number): void;
|
|
208
|
+
clear(): void;
|
|
209
|
+
/** 内部使用:当前已注册拦截器快照 */
|
|
210
|
+
forEach(fn: (handler: InterceptorHandler<TIn, TOut>) => void): void;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 单个拦截器内部结构
|
|
214
|
+
*/
|
|
215
|
+
interface InterceptorHandler<TIn, TOut = TIn> {
|
|
216
|
+
id: number;
|
|
217
|
+
onFulfilled?: (value: TIn) => TOut | Promise<TOut>;
|
|
218
|
+
onRejected?: (error: unknown) => unknown | Promise<unknown>;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* forge 顶层 API 形状
|
|
222
|
+
*/
|
|
223
|
+
interface RouteForge {
|
|
224
|
+
/** 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息 */
|
|
225
|
+
api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
|
|
226
|
+
/** 拉取一个或多个层级(自动并发去重) */
|
|
227
|
+
load(level: string | string[]): Promise<void>;
|
|
228
|
+
/** 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存 */
|
|
229
|
+
route(level: string, name: string, params?: Record<string, unknown>): string;
|
|
230
|
+
/** route() 的语义别名,适用于链接生成等场景 */
|
|
231
|
+
url(level: string, name: string, params?: Record<string, unknown>): string;
|
|
232
|
+
/** 失效指定层级缓存;不传参失效全部 */
|
|
233
|
+
invalidate(level?: string): void;
|
|
234
|
+
/** 检查指定层级路由是否已加载并缓存;不传参检查全部 */
|
|
235
|
+
isLoaded(level?: string): boolean;
|
|
236
|
+
/** 检查指定层级下某路由是否存在(需该层级缓存已加载) */
|
|
237
|
+
hasRoute(level: string, name: string): boolean;
|
|
238
|
+
/**
|
|
239
|
+
* 查询加载中标识状态
|
|
240
|
+
*/
|
|
241
|
+
isLoading(): boolean;
|
|
242
|
+
/**
|
|
243
|
+
* 订阅加载状态变更
|
|
244
|
+
* @returns 取消订阅函数
|
|
245
|
+
*/
|
|
246
|
+
onLoadingChange(cb: LoadingChangeCallback): () => void;
|
|
247
|
+
/**
|
|
248
|
+
* 获取路由元信息快照(深拷贝,修改返回值不影响内部缓存)。
|
|
249
|
+
* - getRoutes(level):返回指定层级下全部路由
|
|
250
|
+
* - getRoutes():返回全部层级的路由(按 level 分组)
|
|
251
|
+
*/
|
|
252
|
+
getRoutes(level: string): Record<string, RouteMeta>;
|
|
253
|
+
getRoutes(): Record<string, Record<string, RouteMeta>>;
|
|
254
|
+
/** 拦截器入口(请求 / 响应) */
|
|
255
|
+
interceptors: {
|
|
256
|
+
request: InterceptorManager<RequestConfig, RequestConfig>;
|
|
257
|
+
response: InterceptorManager<ResponseData, unknown>;
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* createRouteForge 配置项
|
|
262
|
+
* @see .docs/SPEC.md §5.2
|
|
263
|
+
*/
|
|
264
|
+
interface RouteForgeOptions {
|
|
265
|
+
endpoint: string;
|
|
266
|
+
/**
|
|
267
|
+
* 层级列表。未传时从摘要端点自动发现(SPEC §4.1.1)。
|
|
268
|
+
* 显式传入时取与后端摘要响应 levels 键的交集(前端不能声明后端不存在的层级,SPEC §5.3)。
|
|
269
|
+
*/
|
|
270
|
+
levels?: string[];
|
|
271
|
+
eager?: string[];
|
|
272
|
+
adapter?: AdapterOption;
|
|
273
|
+
cache?: {
|
|
274
|
+
ttl?: number;
|
|
275
|
+
storage?: CacheStorage;
|
|
276
|
+
};
|
|
277
|
+
interceptors?: {
|
|
278
|
+
/**
|
|
279
|
+
* 声明式请求拦截器列表,支持两种形式(SPEC §4.1.1):
|
|
280
|
+
* - 单一函数 → 视为 onFulfilled
|
|
281
|
+
* - [onFulfilled?, onRejected?] 元组 → 完整拦截器定义
|
|
282
|
+
*/
|
|
283
|
+
request?: Array<((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | [((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
|
|
284
|
+
/**
|
|
285
|
+
* 声明式响应拦截器列表,支持两种形式(SPEC §4.1.1):
|
|
286
|
+
* - 单一函数 → 视为 onFulfilled
|
|
287
|
+
* - [onFulfilled?, onRejected?] 元组 → 完整拦截器定义
|
|
288
|
+
*/
|
|
289
|
+
response?: Array<((r: ResponseData) => unknown | Promise<unknown>) | [((r: ResponseData) => unknown | Promise<unknown>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
|
|
290
|
+
};
|
|
291
|
+
strict?: boolean;
|
|
292
|
+
timeout?: number;
|
|
293
|
+
baseURL?: string;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* 二级路由类型映射(可由 codegen 生成或通过 module augmentation 增强)
|
|
297
|
+
*
|
|
298
|
+
* @example
|
|
299
|
+
* declare module '@route-forge/core' {
|
|
300
|
+
* interface ForgeRouteMap {
|
|
301
|
+
* admin: {
|
|
302
|
+
* 'users.show': { method: 'GET'; params: { user: string | number }; response: User };
|
|
303
|
+
* 'users.index': { method: 'GET'; params: {}; response: User[] };
|
|
304
|
+
* };
|
|
305
|
+
* public: {
|
|
306
|
+
* 'login.show': { method: 'GET'; params: {}; response: unknown };
|
|
307
|
+
* };
|
|
308
|
+
* }
|
|
309
|
+
* }
|
|
310
|
+
*/
|
|
311
|
+
interface ForgeRouteMap {
|
|
312
|
+
}
|
|
313
|
+
/** 从 ForgeRouteMap 推断指定层级下的路由名;未定义时回退 string */
|
|
314
|
+
type ForgeRouteName<L extends string> = [
|
|
315
|
+
keyof ForgeRouteMap
|
|
316
|
+
] extends [never] ? string : L extends keyof ForgeRouteMap ? keyof ForgeRouteMap[L] & string : string;
|
|
317
|
+
/** 从 ForgeRouteMap 推断指定路由的 params 类型;未定义时回退 ApiCallParams */
|
|
318
|
+
type ForgeApiParams<L extends string, N extends string> = [
|
|
319
|
+
keyof ForgeRouteMap
|
|
320
|
+
] extends [never] ? ApiCallParams : L extends keyof ForgeRouteMap ? N extends keyof ForgeRouteMap[L] ? (ForgeRouteMap[L][N] extends {
|
|
321
|
+
params: infer P;
|
|
322
|
+
} ? P & ApiCallParams : ApiCallParams) : ApiCallParams : ApiCallParams;
|
|
323
|
+
/** 从 ForgeRouteMap 推断指定路由的响应类型;未定义时回退 unknown */
|
|
324
|
+
type ForgeApiResponse<L extends string, N extends string> = [
|
|
325
|
+
keyof ForgeRouteMap
|
|
326
|
+
] extends [never] ? unknown : L extends keyof ForgeRouteMap ? N extends keyof ForgeRouteMap[L] ? (ForgeRouteMap[L][N] extends {
|
|
327
|
+
response: infer R;
|
|
328
|
+
} ? R : unknown) : unknown : unknown;
|
|
329
|
+
|
|
330
|
+
export { type AdapterOption as A, type CacheStorage as C, type Fetcher as F, type InterceptorManager as I, type LevelRoutesResponse as L, type RouteMeta as R, type SummaryResponse as S, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type ForgeApiParams as e, type ForgeApiResponse as f, type ForgeRouteMap as g, type ForgeRouteName as h, type LoadingChangeCallback as i, type LoadingChangeEvent as j, LoadingTracker as k, type RequestConfig as l, type ResponseData as m };
|
package/package.json
CHANGED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @route-forge/core 核心类型定义
|
|
3
|
-
* @see .docs/SPEC.md §4.1.3a, §4.1.1
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* 路由元信息(后端 /_forge/routes/{level} 返回的单条路由结构)
|
|
7
|
-
*/
|
|
8
|
-
interface RouteMeta {
|
|
9
|
-
/** 路由名,如 'admin.users.show' */
|
|
10
|
-
name: string;
|
|
11
|
-
/** 路由 URI 模板,如 'admin/users/{user}' */
|
|
12
|
-
uri: string;
|
|
13
|
-
/** 支持的 HTTP 方法集合,如 ['GET','HEAD'] */
|
|
14
|
-
methods: string[];
|
|
15
|
-
/** 路径参数名列表,如 ['user'] */
|
|
16
|
-
parameters: string[];
|
|
17
|
-
/** 所属层级(前端填充,便于隔离缓存) */
|
|
18
|
-
level?: string;
|
|
19
|
-
/** 后端下发的缓存 TTL(秒),优先级高于本地 cache.ttl */
|
|
20
|
-
cache?: number | null;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* 某层级下的全部路由元信息响应
|
|
24
|
-
*/
|
|
25
|
-
interface LevelRoutesResponse {
|
|
26
|
-
level: string;
|
|
27
|
-
routes: Record<string, RouteMeta>;
|
|
28
|
-
/** 后端可选下发该层级缓存 TTL */
|
|
29
|
-
cache?: number | null;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 摘要端点响应(SPEC §3.1.6)
|
|
33
|
-
* GET /_forge/routes 返回此结构
|
|
34
|
-
*/
|
|
35
|
-
interface SummaryResponse {
|
|
36
|
-
levels: Record<string, {
|
|
37
|
-
description: string;
|
|
38
|
-
load: 'lazy' | 'eager';
|
|
39
|
-
cache: number | null;
|
|
40
|
-
route_count: number;
|
|
41
|
-
}>;
|
|
42
|
-
config: {
|
|
43
|
-
strict_mode: boolean;
|
|
44
|
-
endpoint_prefix: string;
|
|
45
|
-
};
|
|
46
|
-
unassigned: Array<{
|
|
47
|
-
name: string;
|
|
48
|
-
uri: string;
|
|
49
|
-
methods: string[];
|
|
50
|
-
parameters: string[];
|
|
51
|
-
}>;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* 请求拦截器接收/返回的配置对象(可变,返回修改后的版本)
|
|
55
|
-
*/
|
|
56
|
-
interface RequestConfig {
|
|
57
|
-
route: string;
|
|
58
|
-
level: string;
|
|
59
|
-
method: string;
|
|
60
|
-
url: string;
|
|
61
|
-
headers: Record<string, string>;
|
|
62
|
-
body?: unknown;
|
|
63
|
-
params: Record<string, unknown>;
|
|
64
|
-
meta: RouteMeta;
|
|
65
|
-
/** 请求超时毫秒数 */
|
|
66
|
-
timeout?: number;
|
|
67
|
-
/** 自定义 query 序列化函数 */
|
|
68
|
-
paramsSerializer?: (params: Record<string, unknown>) => string;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* 响应拦截器首段接收的完整数据对象
|
|
72
|
-
*/
|
|
73
|
-
interface ResponseData {
|
|
74
|
-
route: string;
|
|
75
|
-
level: string;
|
|
76
|
-
method: string;
|
|
77
|
-
url: string;
|
|
78
|
-
status: number;
|
|
79
|
-
headers: Headers;
|
|
80
|
-
data: unknown;
|
|
81
|
-
config: RequestConfig;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* forge.api(level, name, params) 调用参数
|
|
85
|
-
*/
|
|
86
|
-
interface ApiCallParams {
|
|
87
|
-
/** 路径参数:填充到 URI 模板的 {name} 占位符 */
|
|
88
|
-
[paramName: string]: unknown;
|
|
89
|
-
/** 查询参数,序列化到 URL query string */
|
|
90
|
-
query?: Record<string, unknown>;
|
|
91
|
-
/** 请求体,按 method 决定是否发送 */
|
|
92
|
-
body?: unknown;
|
|
93
|
-
/** 自定义请求头(与拦截器叠加) */
|
|
94
|
-
headers?: Record<string, string>;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* 缓存存储介质
|
|
98
|
-
*/
|
|
99
|
-
type CacheStorage = 'memory' | 'sessionStorage' | 'localStorage';
|
|
100
|
-
/**
|
|
101
|
-
* Adapter 选择值
|
|
102
|
-
*/
|
|
103
|
-
type AdapterOption = 'auto' | 'axios' | 'builtin' | Fetcher;
|
|
104
|
-
/**
|
|
105
|
-
* Fetcher 接口(自定义 adapter)
|
|
106
|
-
* @see .docs/SPEC.md §4.3.3
|
|
107
|
-
*/
|
|
108
|
-
interface Fetcher {
|
|
109
|
-
request(config: RequestConfig): Promise<ResponseData>;
|
|
110
|
-
interceptors?: {
|
|
111
|
-
request?: InterceptorManager<RequestConfig, RequestConfig>;
|
|
112
|
-
response?: InterceptorManager<ResponseData, unknown>;
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* 拦截器管理器接口(与 axios use/eject/clear API 一致)
|
|
117
|
-
*
|
|
118
|
-
* 双类型参数说明(对应 SPEC §4.1.3a):
|
|
119
|
-
* - 请求拦截:TIn = TOut = RequestConfig(不可变换类型,仅修改字段)
|
|
120
|
-
* - 响应拦截:TIn = ResponseData, TOut = unknown(首段接收 ResponseData,
|
|
121
|
-
* 后续段接收上一段返回值,返回类型由用户自行约束)
|
|
122
|
-
*/
|
|
123
|
-
interface InterceptorManager<TIn, TOut = TIn> {
|
|
124
|
-
use(onFulfilled?: (value: TIn) => TOut | Promise<TOut>, onRejected?: (error: unknown) => unknown | Promise<unknown>): number;
|
|
125
|
-
eject(id: number): void;
|
|
126
|
-
clear(): void;
|
|
127
|
-
/** 内部使用:当前已注册拦截器快照 */
|
|
128
|
-
forEach(fn: (handler: InterceptorHandler<TIn, TOut>) => void): void;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* 单个拦截器内部结构
|
|
132
|
-
*/
|
|
133
|
-
interface InterceptorHandler<TIn, TOut = TIn> {
|
|
134
|
-
id: number;
|
|
135
|
-
onFulfilled?: (value: TIn) => TOut | Promise<TOut>;
|
|
136
|
-
onRejected?: (error: unknown) => unknown | Promise<unknown>;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* forge 顶层 API 形状
|
|
140
|
-
*/
|
|
141
|
-
interface RouteForge {
|
|
142
|
-
/** 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息 */
|
|
143
|
-
api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
|
|
144
|
-
/** 拉取一个或多个层级(自动并发去重) */
|
|
145
|
-
load(level: string | string[]): Promise<void>;
|
|
146
|
-
/** 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存 */
|
|
147
|
-
route(level: string, name: string, params?: Record<string, unknown>): string;
|
|
148
|
-
/** 失效指定层级缓存;不传参失效全部 */
|
|
149
|
-
invalidate(level?: string): void;
|
|
150
|
-
/** 拦截器入口(请求 / 响应) */
|
|
151
|
-
interceptors: {
|
|
152
|
-
request: InterceptorManager<RequestConfig, RequestConfig>;
|
|
153
|
-
response: InterceptorManager<ResponseData, unknown>;
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* createRouteForge 配置项
|
|
158
|
-
* @see .docs/SPEC.md §5.2
|
|
159
|
-
*/
|
|
160
|
-
interface RouteForgeOptions {
|
|
161
|
-
endpoint: string;
|
|
162
|
-
/**
|
|
163
|
-
* 层级列表。未传时从摘要端点自动发现(SPEC §4.1.1)。
|
|
164
|
-
* 显式传入时取与后端摘要响应 levels 键的交集(前端不能声明后端不存在的层级,SPEC §5.3)。
|
|
165
|
-
*/
|
|
166
|
-
levels?: string[];
|
|
167
|
-
eager?: string[];
|
|
168
|
-
adapter?: AdapterOption;
|
|
169
|
-
cache?: {
|
|
170
|
-
ttl?: number;
|
|
171
|
-
storage?: CacheStorage;
|
|
172
|
-
};
|
|
173
|
-
auth?: {
|
|
174
|
-
state?: () => boolean;
|
|
175
|
-
levels?: Record<string, boolean>;
|
|
176
|
-
};
|
|
177
|
-
interceptors?: {
|
|
178
|
-
request?: Array<[((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
|
|
179
|
-
response?: Array<[((r: ResponseData) => unknown | Promise<unknown>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
|
|
180
|
-
};
|
|
181
|
-
strict?: boolean;
|
|
182
|
-
timeout?: number;
|
|
183
|
-
baseURL?: string;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export type { AdapterOption as A, CacheStorage as C, Fetcher as F, InterceptorManager as I, LevelRoutesResponse as L, RouteMeta as R, SummaryResponse as S, InterceptorHandler as a, RouteForgeOptions as b, RouteForge as c, ApiCallParams as d, RequestConfig as e, ResponseData as f };
|