@route-forge/core 1.2.2 → 1.3.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.
@@ -146,6 +146,15 @@ interface ResponseData {
146
146
  data: unknown;
147
147
  config: RequestConfig;
148
148
  }
149
+ /**
150
+ * forge.api() 返回的可取消请求对象。
151
+ * 继承 Promise,附加 abort() 方法用于取消请求。
152
+ * 内部自动创建 AbortController,用户无需手动管理。
153
+ */
154
+ interface ForgeRequest<T = unknown> extends Promise<T> {
155
+ /** 取消请求。调用后请求将被中止,Promise reject 为 RequestAbortedError */
156
+ abort(): void;
157
+ }
149
158
  /**
150
159
  * forge.api(level, name, params) 调用参数
151
160
  *
@@ -182,14 +191,6 @@ interface ApiCallParams {
182
191
  * 单次请求超时覆盖(毫秒);不传时使用 createRouteForge({ timeout }) 全局值
183
192
  */
184
193
  timeout?: number;
185
- /**
186
- * 请求取消信号(AbortSignal);调用 AbortController.abort() 即可取消请求
187
- * @example
188
- * const controller = new AbortController();
189
- * forge.api('admin', 'users.index', { signal: controller.signal });
190
- * controller.abort(); // 取消请求
191
- */
192
- signal?: AbortSignal;
193
194
  }
194
195
  /**
195
196
  * 缓存存储介质
@@ -238,7 +239,7 @@ interface InterceptorHandler<TIn, TOut = TIn> {
238
239
  */
239
240
  interface RouteForge {
240
241
  /** 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息 */
241
- api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
242
+ api(level: string, name: string, params?: ApiCallParams): ForgeRequest;
242
243
  /** 拉取一个或多个层级(自动并发去重) */
243
244
  load(level: string | string[]): Promise<void>;
244
245
  /** 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存 */
@@ -256,14 +257,9 @@ interface RouteForge {
256
257
  isLoaded(level?: string): boolean;
257
258
  /** 检查指定层级下某路由是否存在(需该层级缓存已加载) */
258
259
  hasRoute(level: string, name: string): boolean;
259
- /**
260
- * 查询加载中标识状态
261
- */
260
+ /** 查询加载中标识状态 */
262
261
  isLoading(): boolean;
263
- /**
264
- * 订阅加载状态变更
265
- * @returns 取消订阅函数
266
- */
262
+ /** 订阅加载状态变更,返回取消订阅函数 */
267
263
  onLoadingChange(cb: LoadingChangeCallback): () => void;
268
264
  /**
269
265
  * 获取路由元信息快照(深拷贝,修改返回值不影响内部缓存)。
@@ -278,16 +274,24 @@ interface RouteForge {
278
274
  response: InterceptorManager<ResponseData, unknown>;
279
275
  };
280
276
  /**
281
- * Promise,auto-discovery + eager load 完成后 resolve。
282
- * 推荐用法:await forge.ready 后再调用 route() / hasRoute() 等同步方法。
277
+ * auto-discovery + eager load 完成后 resolve。
278
+ * 始终返回 Promise<this>,resolve 值为 forge 实例自身,支持链式调用。
279
+ *
280
+ * - 无参:返回 Promise,适合 async/await
281
+ * - 有参:回调内部走 then/catch,仍返回 Promise
283
282
  */
284
- ready: Promise<void>;
283
+ ready(): Promise<RouteForge>;
284
+ ready(onFulfilled: (forge: RouteForge) => void, onRejected?: (error: unknown) => void): Promise<RouteForge>;
285
285
  /**
286
- * 订阅指定层级路由元数据加载完成事件。
287
- * 框架层(Vue/React)用于驱动响应式状态更新。
288
- * @returns 取消订阅函数
286
+ * 绑定 level(+ 可选 prefix),返回 BoundForge。
287
+ * 唯一入口 — Vue/React/IIFE 共享同一套 API 表面。
288
+ *
289
+ * - use():不绑定,返回 RouteForge 自身
290
+ * - use(level):绑定 level
291
+ * - use(level, prefix):绑定 level + prefix
289
292
  */
290
- onLevelLoaded(level: string, cb: () => void): () => void;
293
+ use(): RouteForge;
294
+ use<L extends string>(level: L, prefix?: string): BoundForge;
291
295
  }
292
296
  /**
293
297
  * createRouteForge 配置项
@@ -369,46 +373,35 @@ type ForgeApiResponse<L extends string, N extends string> = [
369
373
  response: infer R;
370
374
  } ? R : unknown) : unknown : unknown;
371
375
  /**
372
- * 已绑定 level 时的共享方法集。
373
- * @typeParam L - 层级名(string literal)
374
- * @typeParam LevelLoaded - 框架层加载状态类型(Vue: Ref<boolean>, React: boolean)
376
+ * 已绑定 level 的 forge 对象。
377
+ * `forge.use(level, prefix?)` 返回,Vue/React/IIFE 共享同一 API 表面。
378
+ *
379
+ * @typeParam LL - levelLoaded 的类型:core 默认 Promise<void>,Vue 替换为 Ref<boolean>
375
380
  */
376
- interface BoundForgeMethods<L extends string = string, LevelLoaded = unknown> {
377
- /** 指定层级的路由元数据是否已加载完成(类型由框架层决定) */
378
- levelLoaded: LevelLoaded;
379
- api(name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): Promise<ForgeApiResponse<L, ForgeRouteName<L>>>;
380
- route(name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): string;
381
- url(name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): string;
382
- load(level: string | string[]): Promise<void>;
383
- invalidate(level?: string | string[]): void;
384
- isLoaded(level?: string): boolean;
385
- hasRoute(level: string, name: string): boolean;
386
- /** 查询加载中标识状态 */
387
- isLoading(): boolean;
388
- /** 订阅加载状态变更,返回取消订阅函数 */
389
- onLoadingChange(cb: LoadingChangeCallback): () => void;
390
- /** 获取指定层级下全部路由元信息(深拷贝,修改不影响内部缓存) */
391
- getRoutes(level: string): Record<string, RouteMeta>;
392
- }
393
- /** 已绑定 level — 可直接调用(= api 快捷方式),无需传 level */
394
- interface BoundForgeTyped<L extends string, LevelLoaded = unknown> extends BoundForgeMethods<L, LevelLoaded> {
395
- /** 当前绑定的 level 值 */
396
- readonly level: L;
397
- /** 路由名前缀(仅在传入 prefix 时存在) */
381
+ interface BoundForge<LL = Promise<void>> {
382
+ /** 直接调用 = api 快捷方式,自动带绑定的 level */
383
+ (name: string, params?: ApiCallParams): ForgeRequest;
384
+ /** 当前绑定的 level */
385
+ readonly level: string;
386
+ /** 绑定的路由名前缀(仅传入 prefix 时存在) */
398
387
  readonly prefix?: string;
399
- /** 直接调用 = forge.api() 快捷方式,自动带绑定的 level */
400
- (name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): Promise<ForgeApiResponse<L, ForgeRouteName<L>>>;
401
- }
402
- /** 未绑定 level 直接调用需要传 level(不提供 route/url/hasRoute/getRoutes 等同步方法) */
403
- interface ForgeInstanceTyped {
404
- ready: Promise<void>;
405
- api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
406
- load(level: string | string[]): Promise<void>;
407
- invalidate(level?: string | string[]): void;
408
- isLoaded(level?: string): boolean;
388
+ /** level 加载状态(core: Promise<void>,Vue: Ref<boolean>) */
389
+ levelLoaded: LL;
390
+ api(name: string, params?: ApiCallParams): ForgeRequest;
391
+ route(name: string, params?: Record<string, unknown>): string;
392
+ url(name: string, params?: Record<string, unknown>): string;
393
+ hasRoute(name: string): boolean;
394
+ getRoutes(): Record<string, RouteMeta>;
395
+ load(): Promise<void>;
396
+ invalidate(): void;
397
+ isLoaded(): boolean;
409
398
  isLoading(): boolean;
410
399
  onLoadingChange(cb: LoadingChangeCallback): () => void;
411
- onLevelLoaded(level: string, cb: () => void): () => void;
400
+ /** 等待绑定的 level 加载完成,resolve 值为自身(BoundForge),保证可安全调用 */
401
+ onLevelLoaded(): Promise<BoundForge<LL>>;
402
+ onLevelLoaded(onFulfilled: (bound: BoundForge<LL>) => void, onRejected?: (error: unknown) => void): Promise<BoundForge<LL>>;
403
+ /** 在已绑定 level 基础上追加/替换 prefix,返回新的 BoundForge */
404
+ useRoutePrefix(prefix: string): BoundForge<LL>;
412
405
  }
413
406
  /** call 函数签名 — 未绑定 level,需要显式传入 */
414
407
  interface UseForgeApiCall {
@@ -451,4 +444,4 @@ interface UseForgeByPrefixReturn {
451
444
  route: (suffix: string, params?: Record<string, unknown>) => string;
452
445
  }
453
446
 
454
- export { type AdapterOption as A, type BoundForgeMethods as B, 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 UseForgeApiBoundCall as U, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type BoundForgeTyped as e, type ForgeApiParams as f, type ForgeApiResponse as g, type ForgeInstanceTyped as h, type ForgeRouteMap as i, type ForgeRouteName as j, type LoadingChangeCallback as k, type LoadingChangeEvent as l, LoadingTracker as m, type RequestConfig as n, type ResponseData as o, type UseForgeApiBoundReturn as p, type UseForgeApiCall as q, type UseForgeApiReturn as r, type UseForgeByPrefixReturn as s };
447
+ export { type AdapterOption as A, type BoundForge as B, 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 UseForgeApiBoundCall as U, 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 ForgeRequest as g, type ForgeRouteMap as h, type ForgeRouteName as i, type LoadingChangeCallback as j, type LoadingChangeEvent as k, LoadingTracker as l, type RequestConfig as m, type ResponseData as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q, type UseForgeByPrefixReturn as r };
@@ -146,6 +146,15 @@ interface ResponseData {
146
146
  data: unknown;
147
147
  config: RequestConfig;
148
148
  }
149
+ /**
150
+ * forge.api() 返回的可取消请求对象。
151
+ * 继承 Promise,附加 abort() 方法用于取消请求。
152
+ * 内部自动创建 AbortController,用户无需手动管理。
153
+ */
154
+ interface ForgeRequest<T = unknown> extends Promise<T> {
155
+ /** 取消请求。调用后请求将被中止,Promise reject 为 RequestAbortedError */
156
+ abort(): void;
157
+ }
149
158
  /**
150
159
  * forge.api(level, name, params) 调用参数
151
160
  *
@@ -182,14 +191,6 @@ interface ApiCallParams {
182
191
  * 单次请求超时覆盖(毫秒);不传时使用 createRouteForge({ timeout }) 全局值
183
192
  */
184
193
  timeout?: number;
185
- /**
186
- * 请求取消信号(AbortSignal);调用 AbortController.abort() 即可取消请求
187
- * @example
188
- * const controller = new AbortController();
189
- * forge.api('admin', 'users.index', { signal: controller.signal });
190
- * controller.abort(); // 取消请求
191
- */
192
- signal?: AbortSignal;
193
194
  }
194
195
  /**
195
196
  * 缓存存储介质
@@ -238,7 +239,7 @@ interface InterceptorHandler<TIn, TOut = TIn> {
238
239
  */
239
240
  interface RouteForge {
240
241
  /** 通过层级 + 路由名调用 API;level 用于确定加载哪个层级的路由元信息 */
241
- api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
242
+ api(level: string, name: string, params?: ApiCallParams): ForgeRequest;
242
243
  /** 拉取一个或多个层级(自动并发去重) */
243
244
  load(level: string | string[]): Promise<void>;
244
245
  /** 仅生成 URL,不发请求;level 用于定位路由所在的层级缓存 */
@@ -256,14 +257,9 @@ interface RouteForge {
256
257
  isLoaded(level?: string): boolean;
257
258
  /** 检查指定层级下某路由是否存在(需该层级缓存已加载) */
258
259
  hasRoute(level: string, name: string): boolean;
259
- /**
260
- * 查询加载中标识状态
261
- */
260
+ /** 查询加载中标识状态 */
262
261
  isLoading(): boolean;
263
- /**
264
- * 订阅加载状态变更
265
- * @returns 取消订阅函数
266
- */
262
+ /** 订阅加载状态变更,返回取消订阅函数 */
267
263
  onLoadingChange(cb: LoadingChangeCallback): () => void;
268
264
  /**
269
265
  * 获取路由元信息快照(深拷贝,修改返回值不影响内部缓存)。
@@ -278,16 +274,24 @@ interface RouteForge {
278
274
  response: InterceptorManager<ResponseData, unknown>;
279
275
  };
280
276
  /**
281
- * Promise,auto-discovery + eager load 完成后 resolve。
282
- * 推荐用法:await forge.ready 后再调用 route() / hasRoute() 等同步方法。
277
+ * auto-discovery + eager load 完成后 resolve。
278
+ * 始终返回 Promise<this>,resolve 值为 forge 实例自身,支持链式调用。
279
+ *
280
+ * - 无参:返回 Promise,适合 async/await
281
+ * - 有参:回调内部走 then/catch,仍返回 Promise
283
282
  */
284
- ready: Promise<void>;
283
+ ready(): Promise<RouteForge>;
284
+ ready(onFulfilled: (forge: RouteForge) => void, onRejected?: (error: unknown) => void): Promise<RouteForge>;
285
285
  /**
286
- * 订阅指定层级路由元数据加载完成事件。
287
- * 框架层(Vue/React)用于驱动响应式状态更新。
288
- * @returns 取消订阅函数
286
+ * 绑定 level(+ 可选 prefix),返回 BoundForge。
287
+ * 唯一入口 — Vue/React/IIFE 共享同一套 API 表面。
288
+ *
289
+ * - use():不绑定,返回 RouteForge 自身
290
+ * - use(level):绑定 level
291
+ * - use(level, prefix):绑定 level + prefix
289
292
  */
290
- onLevelLoaded(level: string, cb: () => void): () => void;
293
+ use(): RouteForge;
294
+ use<L extends string>(level: L, prefix?: string): BoundForge;
291
295
  }
292
296
  /**
293
297
  * createRouteForge 配置项
@@ -369,46 +373,35 @@ type ForgeApiResponse<L extends string, N extends string> = [
369
373
  response: infer R;
370
374
  } ? R : unknown) : unknown : unknown;
371
375
  /**
372
- * 已绑定 level 时的共享方法集。
373
- * @typeParam L - 层级名(string literal)
374
- * @typeParam LevelLoaded - 框架层加载状态类型(Vue: Ref<boolean>, React: boolean)
376
+ * 已绑定 level 的 forge 对象。
377
+ * `forge.use(level, prefix?)` 返回,Vue/React/IIFE 共享同一 API 表面。
378
+ *
379
+ * @typeParam LL - levelLoaded 的类型:core 默认 Promise<void>,Vue 替换为 Ref<boolean>
375
380
  */
376
- interface BoundForgeMethods<L extends string = string, LevelLoaded = unknown> {
377
- /** 指定层级的路由元数据是否已加载完成(类型由框架层决定) */
378
- levelLoaded: LevelLoaded;
379
- api(name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): Promise<ForgeApiResponse<L, ForgeRouteName<L>>>;
380
- route(name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): string;
381
- url(name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): string;
382
- load(level: string | string[]): Promise<void>;
383
- invalidate(level?: string | string[]): void;
384
- isLoaded(level?: string): boolean;
385
- hasRoute(level: string, name: string): boolean;
386
- /** 查询加载中标识状态 */
387
- isLoading(): boolean;
388
- /** 订阅加载状态变更,返回取消订阅函数 */
389
- onLoadingChange(cb: LoadingChangeCallback): () => void;
390
- /** 获取指定层级下全部路由元信息(深拷贝,修改不影响内部缓存) */
391
- getRoutes(level: string): Record<string, RouteMeta>;
392
- }
393
- /** 已绑定 level — 可直接调用(= api 快捷方式),无需传 level */
394
- interface BoundForgeTyped<L extends string, LevelLoaded = unknown> extends BoundForgeMethods<L, LevelLoaded> {
395
- /** 当前绑定的 level 值 */
396
- readonly level: L;
397
- /** 路由名前缀(仅在传入 prefix 时存在) */
381
+ interface BoundForge<LL = Promise<void>> {
382
+ /** 直接调用 = api 快捷方式,自动带绑定的 level */
383
+ (name: string, params?: ApiCallParams): ForgeRequest;
384
+ /** 当前绑定的 level */
385
+ readonly level: string;
386
+ /** 绑定的路由名前缀(仅传入 prefix 时存在) */
398
387
  readonly prefix?: string;
399
- /** 直接调用 = forge.api() 快捷方式,自动带绑定的 level */
400
- (name: ForgeRouteName<L>, params?: ForgeApiParams<L, ForgeRouteName<L>>): Promise<ForgeApiResponse<L, ForgeRouteName<L>>>;
401
- }
402
- /** 未绑定 level 直接调用需要传 level(不提供 route/url/hasRoute/getRoutes 等同步方法) */
403
- interface ForgeInstanceTyped {
404
- ready: Promise<void>;
405
- api(level: string, name: string, params?: ApiCallParams): Promise<unknown>;
406
- load(level: string | string[]): Promise<void>;
407
- invalidate(level?: string | string[]): void;
408
- isLoaded(level?: string): boolean;
388
+ /** level 加载状态(core: Promise<void>,Vue: Ref<boolean>) */
389
+ levelLoaded: LL;
390
+ api(name: string, params?: ApiCallParams): ForgeRequest;
391
+ route(name: string, params?: Record<string, unknown>): string;
392
+ url(name: string, params?: Record<string, unknown>): string;
393
+ hasRoute(name: string): boolean;
394
+ getRoutes(): Record<string, RouteMeta>;
395
+ load(): Promise<void>;
396
+ invalidate(): void;
397
+ isLoaded(): boolean;
409
398
  isLoading(): boolean;
410
399
  onLoadingChange(cb: LoadingChangeCallback): () => void;
411
- onLevelLoaded(level: string, cb: () => void): () => void;
400
+ /** 等待绑定的 level 加载完成,resolve 值为自身(BoundForge),保证可安全调用 */
401
+ onLevelLoaded(): Promise<BoundForge<LL>>;
402
+ onLevelLoaded(onFulfilled: (bound: BoundForge<LL>) => void, onRejected?: (error: unknown) => void): Promise<BoundForge<LL>>;
403
+ /** 在已绑定 level 基础上追加/替换 prefix,返回新的 BoundForge */
404
+ useRoutePrefix(prefix: string): BoundForge<LL>;
412
405
  }
413
406
  /** call 函数签名 — 未绑定 level,需要显式传入 */
414
407
  interface UseForgeApiCall {
@@ -451,4 +444,4 @@ interface UseForgeByPrefixReturn {
451
444
  route: (suffix: string, params?: Record<string, unknown>) => string;
452
445
  }
453
446
 
454
- export { type AdapterOption as A, type BoundForgeMethods as B, 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 UseForgeApiBoundCall as U, type InterceptorHandler as a, type RouteForgeOptions as b, type RouteForge as c, type ApiCallParams as d, type BoundForgeTyped as e, type ForgeApiParams as f, type ForgeApiResponse as g, type ForgeInstanceTyped as h, type ForgeRouteMap as i, type ForgeRouteName as j, type LoadingChangeCallback as k, type LoadingChangeEvent as l, LoadingTracker as m, type RequestConfig as n, type ResponseData as o, type UseForgeApiBoundReturn as p, type UseForgeApiCall as q, type UseForgeApiReturn as r, type UseForgeByPrefixReturn as s };
447
+ export { type AdapterOption as A, type BoundForge as B, 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 UseForgeApiBoundCall as U, 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 ForgeRequest as g, type ForgeRouteMap as h, type ForgeRouteName as i, type LoadingChangeCallback as j, type LoadingChangeEvent as k, LoadingTracker as l, type RequestConfig as m, type ResponseData as n, type UseForgeApiBoundReturn as o, type UseForgeApiCall as p, type UseForgeApiReturn as q, type UseForgeByPrefixReturn as r };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@route-forge/core",
3
- "version": "1.2.2",
3
+ "version": "1.3.1",
4
4
  "description": "框架无关的命名路由客户端核心:分级懒加载、隔离缓存、并发去重、拦截器",
5
5
  "license": "MIT",
6
6
  "author": "阿杰很厉害 <506907958@qq.com>",