@route-forge/core 0.3.0 → 1.0.2

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.
@@ -1,7 +1,64 @@
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
+
1
57
  /**
2
58
  * @route-forge/core 核心类型定义
3
59
  * @see .docs/SPEC.md §4.1.3a, §4.1.1
4
60
  */
61
+
5
62
  /**
6
63
  * 路由元信息(后端 /_forge/routes/{level} 返回的单条路由结构)
7
64
  */
@@ -35,6 +92,8 @@ interface LevelRoutesResponse {
35
92
  * GET /_forge/routes 返回此结构
36
93
  */
37
94
  interface SummaryResponse {
95
+ /** manifest 协议版本号(DESIGN.md §6.3),默认 1;前端可据此做向前兼容 */
96
+ schemaVersion?: number;
38
97
  levels: Record<string, {
39
98
  description: string;
40
99
  load: 'lazy' | 'eager';
@@ -104,12 +163,23 @@ interface ApiCallParams {
104
163
  [paramName: string]: unknown;
105
164
  /** 显式指定路径参数(优先级最高,解决路径参数名与 query/body/headers 冲突的场景) */
106
165
  params?: Record<string, unknown>;
107
- /** 查询参数,序列化到 URL query string */
108
- query?: Record<string, unknown>;
109
- /** 请求体,按 method 决定是否发送 */
166
+ /**
167
+ * 查询参数(对象 → query string)或路径参数(string | number → 填充 {query} 占位符)
168
+ * @see .docs/SPEC.md §4.1.3 参数智能解析
169
+ */
170
+ query?: Record<string, unknown> | string | number;
171
+ /**
172
+ * 请求体(非基元值 → body)或路径参数(string | number → 填充 {body} 占位符)
173
+ */
110
174
  body?: unknown;
111
- /** 自定义请求头(与拦截器叠加) */
112
- headers?: Record<string, string>;
175
+ /**
176
+ * 自定义请求头(对象 → headers)或路径参数(string | number → 填充 {headers} 占位符)
177
+ */
178
+ headers?: Record<string, string> | string | number;
179
+ /**
180
+ * 单次请求超时覆盖(毫秒);不传时使用 createRouteForge({ timeout }) 全局值
181
+ */
182
+ timeout?: number;
113
183
  }
114
184
  /**
115
185
  * 缓存存储介质
@@ -165,12 +235,26 @@ interface RouteForge {
165
235
  route(level: string, name: string, params?: Record<string, unknown>): string;
166
236
  /** route() 的语义别名,适用于链接生成等场景 */
167
237
  url(level: string, name: string, params?: Record<string, unknown>): string;
168
- /** 失效指定层级缓存;不传参失效全部 */
169
- invalidate(level?: string): void;
238
+ /**
239
+ * 失效缓存:
240
+ * - invalidate():失效全部层级
241
+ * - invalidate('admin'):失效指定层级
242
+ * - invalidate(['admin', 'manage']):批量失效指定层级
243
+ */
244
+ invalidate(level?: string | string[]): void;
170
245
  /** 检查指定层级路由是否已加载并缓存;不传参检查全部 */
171
246
  isLoaded(level?: string): boolean;
172
- /** 检查指定层级下某条路由是否存在(需该层级缓存已加载) */
247
+ /** 检查指定层级下某路由是否存在(需该层级缓存已加载) */
173
248
  hasRoute(level: string, name: string): boolean;
249
+ /**
250
+ * 查询加载中标识状态
251
+ */
252
+ isLoading(): boolean;
253
+ /**
254
+ * 订阅加载状态变更
255
+ * @returns 取消订阅函数
256
+ */
257
+ onLoadingChange(cb: LoadingChangeCallback): () => void;
174
258
  /**
175
259
  * 获取路由元信息快照(深拷贝,修改返回值不影响内部缓存)。
176
260
  * - getRoutes(level):返回指定层级下全部路由
@@ -201,13 +285,19 @@ interface RouteForgeOptions {
201
285
  ttl?: number;
202
286
  storage?: CacheStorage;
203
287
  };
204
- auth?: {
205
- state?: () => boolean;
206
- levels?: Record<string, boolean>;
207
- };
208
288
  interceptors?: {
209
- request?: Array<[((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
210
- response?: Array<[((r: ResponseData) => unknown | Promise<unknown>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
289
+ /**
290
+ * 声明式请求拦截器列表,支持两种形式(SPEC §4.1.1):
291
+ * - 单一函数 → 视为 onFulfilled
292
+ * - [onFulfilled?, onRejected?] 元组 → 完整拦截器定义
293
+ */
294
+ request?: Array<((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | [((c: RequestConfig) => RequestConfig | Promise<RequestConfig>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
295
+ /**
296
+ * 声明式响应拦截器列表,支持两种形式(SPEC §4.1.1):
297
+ * - 单一函数 → 视为 onFulfilled
298
+ * - [onFulfilled?, onRejected?] 元组 → 完整拦截器定义
299
+ */
300
+ response?: Array<((r: ResponseData) => unknown | Promise<unknown>) | [((r: ResponseData) => unknown | Promise<unknown>) | undefined, ((e: unknown) => unknown | Promise<unknown>) | undefined]>;
211
301
  };
212
302
  strict?: boolean;
213
303
  timeout?: number;
@@ -248,4 +338,4 @@ type ForgeApiResponse<L extends string, N extends string> = [
248
338
  response: infer R;
249
339
  } ? R : unknown) : unknown : unknown;
250
340
 
251
- 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, ForgeApiParams as e, ForgeApiResponse as f, ForgeRouteMap as g, ForgeRouteName as h, RequestConfig as i, ResponseData as j };
341
+ 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,7 +1,7 @@
1
1
  {
2
2
  "name": "@route-forge/core",
3
- "version": "0.3.0",
4
- "description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、登录态感知、拦截器",
3
+ "version": "1.0.2",
4
+ "description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、拦截器",
5
5
  "license": "MIT",
6
6
  "author": "阿杰很厉害 <506907958@qq.com>",
7
7
  "homepage": "https://github.com/xyj2156/route-forge",