xxf_react 0.6.7 → 0.6.9

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 (74) hide show
  1. package/README.md +18 -13
  2. package/dist/foundation/Copy.d.ts +8 -0
  3. package/dist/foundation/Copy.d.ts.map +1 -0
  4. package/dist/foundation/Copy.js +21 -0
  5. package/dist/foundation/index.d.ts +2 -0
  6. package/dist/foundation/index.d.ts.map +1 -1
  7. package/dist/foundation/index.js +2 -0
  8. package/dist/http/api/ApiBuilder.d.ts +115 -0
  9. package/dist/http/api/ApiBuilder.d.ts.map +1 -0
  10. package/dist/http/api/ApiBuilder.js +128 -0
  11. package/dist/http/api/index.d.ts +2 -0
  12. package/dist/http/api/index.d.ts.map +1 -0
  13. package/dist/http/api/index.js +1 -0
  14. package/dist/http/cache/DiskLruCache.d.ts +66 -0
  15. package/dist/http/cache/DiskLruCache.d.ts.map +1 -0
  16. package/dist/http/cache/DiskLruCache.js +254 -0
  17. package/dist/http/cache/HttpCache.d.ts +59 -0
  18. package/dist/http/cache/HttpCache.d.ts.map +1 -0
  19. package/dist/http/cache/HttpCache.js +215 -0
  20. package/dist/http/cache/index.d.ts +3 -0
  21. package/dist/http/cache/index.d.ts.map +1 -0
  22. package/dist/http/cache/index.js +2 -0
  23. package/dist/http/client/ApiStream.d.ts +80 -0
  24. package/dist/http/client/ApiStream.d.ts.map +1 -0
  25. package/dist/http/client/ApiStream.js +190 -0
  26. package/dist/http/client/HttpClient.d.ts +88 -0
  27. package/dist/http/client/HttpClient.d.ts.map +1 -0
  28. package/dist/http/client/HttpClient.js +381 -0
  29. package/dist/http/client/index.d.ts +3 -0
  30. package/dist/http/client/index.d.ts.map +1 -0
  31. package/dist/http/client/index.js +2 -0
  32. package/dist/http/index.d.ts +42 -0
  33. package/dist/http/index.d.ts.map +1 -0
  34. package/dist/http/index.js +45 -0
  35. package/dist/http/models/ApiTypes.d.ts +54 -0
  36. package/dist/http/models/ApiTypes.d.ts.map +1 -0
  37. package/dist/http/models/ApiTypes.js +4 -0
  38. package/dist/http/models/CacheConfig.d.ts +58 -0
  39. package/dist/http/models/CacheConfig.d.ts.map +1 -0
  40. package/dist/http/models/CacheConfig.js +4 -0
  41. package/dist/http/models/CacheEntry.d.ts +28 -0
  42. package/dist/http/models/CacheEntry.d.ts.map +1 -0
  43. package/dist/http/models/CacheEntry.js +1 -0
  44. package/dist/http/models/CacheInterceptor.d.ts +112 -0
  45. package/dist/http/models/CacheInterceptor.d.ts.map +1 -0
  46. package/dist/http/models/CacheInterceptor.js +6 -0
  47. package/dist/http/models/CacheMode.d.ts +45 -0
  48. package/dist/http/models/CacheMode.d.ts.map +1 -0
  49. package/dist/http/models/CacheMode.js +45 -0
  50. package/dist/http/models/DiskCacheConfig.d.ts +56 -0
  51. package/dist/http/models/DiskCacheConfig.d.ts.map +1 -0
  52. package/dist/http/models/DiskCacheConfig.js +4 -0
  53. package/dist/http/models/HttpClientConfig.d.ts +77 -0
  54. package/dist/http/models/HttpClientConfig.d.ts.map +1 -0
  55. package/dist/http/models/HttpClientConfig.js +4 -0
  56. package/dist/http/models/LruMetadata.d.ts +28 -0
  57. package/dist/http/models/LruMetadata.d.ts.map +1 -0
  58. package/dist/http/models/LruMetadata.js +6 -0
  59. package/dist/http/models/RequestConfig.d.ts +67 -0
  60. package/dist/http/models/RequestConfig.d.ts.map +1 -0
  61. package/dist/http/models/RequestConfig.js +4 -0
  62. package/dist/http/models/index.d.ts +24 -0
  63. package/dist/http/models/index.d.ts.map +1 -0
  64. package/dist/http/models/index.js +16 -0
  65. package/dist/http/types.d.ts +13 -0
  66. package/dist/http/types.d.ts.map +1 -0
  67. package/dist/http/types.js +14 -0
  68. package/dist/index.d.ts +1 -0
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +1 -0
  71. package/dist/layout/hover/XHover.d.ts +1 -1
  72. package/dist/layout/hover/XHover.d.ts.map +1 -1
  73. package/dist/layout/hover/XHover.js +4 -4
  74. package/package.json +14 -4
@@ -0,0 +1,112 @@
1
+ /**
2
+ * 缓存拦截器相关类型
3
+ *
4
+ * 用于根据响应内容动态决定是否缓存
5
+ */
6
+ import type { CacheKeyRequest } from './CacheConfig';
7
+ /**
8
+ * 缓存拦截器上下文
9
+ *
10
+ * 包含响应的完整信息,供拦截器判断是否应该缓存
11
+ *
12
+ * @template T 响应数据类型
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * cacheInterceptor: (ctx) => {
17
+ * // 可以访问响应数据、HTTP 状态码、响应头等
18
+ * console.log(ctx.data) // 响应数据
19
+ * console.log(ctx.status) // HTTP 状态码
20
+ * console.log(ctx.headers) // 响应头
21
+ * console.log(ctx.request) // 请求信息
22
+ * console.log(ctx.cacheKey) // 缓存 key
23
+ * }
24
+ * ```
25
+ */
26
+ export interface CacheInterceptorContext<T = unknown> {
27
+ /** 响应数据(已解析的 JSON) */
28
+ data: T;
29
+ /** HTTP 状态码 */
30
+ status: number;
31
+ /** 响应头 */
32
+ headers: Headers;
33
+ /** 请求信息(用于调试或高级判断) */
34
+ request: CacheKeyRequest;
35
+ /** 缓存 key(用于调试或高级判断) */
36
+ cacheKey: string;
37
+ }
38
+ /**
39
+ * 缓存拦截器返回结果
40
+ *
41
+ * 当需要更精细控制时使用对象形式返回
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * // 简单返回 boolean
46
+ * cacheInterceptor: (ctx) => ctx.status === 200
47
+ *
48
+ * // 返回对象,可以覆盖 TTL
49
+ * cacheInterceptor: (ctx) => ({
50
+ * shouldCache: true,
51
+ * ttl: 10 * 60 * 1000, // 覆盖为 10 分钟
52
+ * })
53
+ * ```
54
+ */
55
+ export interface CacheInterceptorResult {
56
+ /** 是否允许缓存 */
57
+ shouldCache: boolean;
58
+ /**
59
+ * 可选:覆盖缓存 TTL (ms)
60
+ * 如果不指定,使用请求配置中的 ttl
61
+ */
62
+ ttl?: number;
63
+ }
64
+ /**
65
+ * 缓存拦截器
66
+ *
67
+ * 在响应返回后、写入缓存前调用,用于根据响应内容决定是否缓存。
68
+ *
69
+ * ## 常见场景
70
+ * - 只缓存 HTTP 200 响应
71
+ * - 只缓存业务 code 为成功的响应
72
+ * - 根据响应头决定是否缓存
73
+ * - 根据响应内容动态调整缓存时间
74
+ *
75
+ * ## 返回值
76
+ * - `true`:允许缓存
77
+ * - `false`:不缓存
78
+ * - `CacheInterceptorResult`:精细控制(是否缓存 + 可选覆盖 TTL)
79
+ * - `Promise<...>`:支持异步判断
80
+ *
81
+ * @template T 响应数据类型
82
+ * @param context 拦截器上下文,包含响应的完整信息
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * // 示例 1:只缓存 HTTP 200
87
+ * cacheInterceptor: (ctx) => ctx.status === 200
88
+ *
89
+ * // 示例 2:检查业务 code
90
+ * cacheInterceptor: (ctx) => {
91
+ * const res = ctx.data as { code?: number }
92
+ * return res.code === 200
93
+ * }
94
+ *
95
+ * // 示例 3:检查响应头
96
+ * cacheInterceptor: (ctx) => {
97
+ * return ctx.headers.get('X-Cacheable') !== 'false'
98
+ * }
99
+ *
100
+ * // 示例 4:动态 TTL
101
+ * cacheInterceptor: (ctx) => {
102
+ * const res = ctx.data as { code?: number; cacheTtl?: number }
103
+ * if (res.code !== 200) return false
104
+ * return {
105
+ * shouldCache: true,
106
+ * ttl: res.cacheTtl ?? 5 * 60 * 1000,
107
+ * }
108
+ * }
109
+ * ```
110
+ */
111
+ export type CacheInterceptor<T = unknown> = (context: CacheInterceptorContext<T>) => boolean | CacheInterceptorResult | Promise<boolean | CacheInterceptorResult>;
112
+ //# sourceMappingURL=CacheInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheInterceptor.d.ts","sourceRoot":"","sources":["../../../src/http/models/CacheInterceptor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,OAAO;IAChD,sBAAsB;IACtB,IAAI,EAAE,CAAC,CAAA;IACP,eAAe;IACf,MAAM,EAAE,MAAM,CAAA;IACd,UAAU;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB;IACtB,OAAO,EAAE,eAAe,CAAA;IACxB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,sBAAsB;IACnC,aAAa;IACb,WAAW,EAAE,OAAO,CAAA;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CACxC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAClC,OAAO,GAAG,sBAAsB,GAAG,OAAO,CAAC,OAAO,GAAG,sBAAsB,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 缓存拦截器相关类型
3
+ *
4
+ * 用于根据响应内容动态决定是否缓存
5
+ */
6
+ export {};
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 缓存模式枚举
3
+ *
4
+ * 定义了 6 种缓存策略,覆盖各种业务场景
5
+ */
6
+ export declare enum CacheMode {
7
+ /**
8
+ * 先从本地缓存拿,然后从服务器拿
9
+ * - 可能 yield 两次(先缓存后网络)
10
+ * - 适用于:需要快速展示旧数据,同时更新最新数据
11
+ */
12
+ FirstCache = "firstCache",
13
+ /**
14
+ * 先从服务器获取,没网络则读缓存
15
+ * - yield 1 次
16
+ * - 适用于:优先保证数据最新,网络异常时降级
17
+ */
18
+ FirstRemote = "firstRemote",
19
+ /**
20
+ * 只从服务器拿(默认模式)
21
+ * - yield 1 次
22
+ * - 适用于:实时性要求高的数据
23
+ */
24
+ OnlyRemote = "onlyRemote",
25
+ /**
26
+ * 只从缓存拿
27
+ * - yield 0-1 次(无缓存时不 yield)
28
+ * - 适用于:离线场景、纯本地数据
29
+ */
30
+ OnlyCache = "onlyCache",
31
+ /**
32
+ * 有缓存返回缓存,否则请求网络
33
+ * - yield 1 次
34
+ * - 适用于:缓存优先,减少网络请求
35
+ */
36
+ IfCache = "ifCache",
37
+ /**
38
+ * 读上次缓存,后台静默更新
39
+ * - yield 1 次(返回缓存或网络)
40
+ * - 有缓存时后台同步网络但不 yield
41
+ * - 适用于:SWR(stale-while-revalidate)策略
42
+ */
43
+ LastCache = "lastCache"
44
+ }
45
+ //# sourceMappingURL=CacheMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheMode.d.ts","sourceRoot":"","sources":["../../../src/http/models/CacheMode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,oBAAY,SAAS;IACjB;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,WAAW,gBAAgB;IAE3B;;;;OAIG;IACH,UAAU,eAAe;IAEzB;;;;OAIG;IACH,SAAS,cAAc;IAEvB;;;;OAIG;IACH,OAAO,YAAY;IAEnB;;;;;OAKG;IACH,SAAS,cAAc;CAC1B"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 缓存模式枚举
3
+ *
4
+ * 定义了 6 种缓存策略,覆盖各种业务场景
5
+ */
6
+ export var CacheMode;
7
+ (function (CacheMode) {
8
+ /**
9
+ * 先从本地缓存拿,然后从服务器拿
10
+ * - 可能 yield 两次(先缓存后网络)
11
+ * - 适用于:需要快速展示旧数据,同时更新最新数据
12
+ */
13
+ CacheMode["FirstCache"] = "firstCache";
14
+ /**
15
+ * 先从服务器获取,没网络则读缓存
16
+ * - yield 1 次
17
+ * - 适用于:优先保证数据最新,网络异常时降级
18
+ */
19
+ CacheMode["FirstRemote"] = "firstRemote";
20
+ /**
21
+ * 只从服务器拿(默认模式)
22
+ * - yield 1 次
23
+ * - 适用于:实时性要求高的数据
24
+ */
25
+ CacheMode["OnlyRemote"] = "onlyRemote";
26
+ /**
27
+ * 只从缓存拿
28
+ * - yield 0-1 次(无缓存时不 yield)
29
+ * - 适用于:离线场景、纯本地数据
30
+ */
31
+ CacheMode["OnlyCache"] = "onlyCache";
32
+ /**
33
+ * 有缓存返回缓存,否则请求网络
34
+ * - yield 1 次
35
+ * - 适用于:缓存优先,减少网络请求
36
+ */
37
+ CacheMode["IfCache"] = "ifCache";
38
+ /**
39
+ * 读上次缓存,后台静默更新
40
+ * - yield 1 次(返回缓存或网络)
41
+ * - 有缓存时后台同步网络但不 yield
42
+ * - 适用于:SWR(stale-while-revalidate)策略
43
+ */
44
+ CacheMode["LastCache"] = "lastCache";
45
+ })(CacheMode || (CacheMode = {}));
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 缓存存储配置
3
+ */
4
+ /**
5
+ * DiskLruCache 配置
6
+ *
7
+ * 用于配置基于 IndexedDB 的磁盘 LRU 缓存
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const diskCache = new DiskLruCache({
12
+ * dbName: 'my-app-cache',
13
+ * storeName: 'http-cache',
14
+ * maxSize: 500,
15
+ * cleanupThreshold: 0.1,
16
+ * })
17
+ * ```
18
+ */
19
+ export interface DiskLruCacheConfig {
20
+ /** IndexedDB 数据库名 */
21
+ dbName: string;
22
+ /** 存储名(ObjectStore 名称) */
23
+ storeName: string;
24
+ /** 最大条目数 */
25
+ maxSize: number;
26
+ /**
27
+ * 清理阈值
28
+ *
29
+ * 超过 maxSize * (1 + cleanupThreshold) 后触发清理
30
+ * 默认 0.1,即超过 110% 时清理到 100%
31
+ */
32
+ cleanupThreshold?: number;
33
+ }
34
+ /**
35
+ * HttpCache 配置
36
+ *
37
+ * 用于配置 HTTP 缓存(内存 + 磁盘双层)
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * const cache = new HttpCache({
42
+ * memoryMaxSize: 100,
43
+ * diskMaxSize: 500,
44
+ * dbName: 'my-app-cache',
45
+ * })
46
+ * ```
47
+ */
48
+ export interface HttpCacheConfig {
49
+ /** 内存缓存最大条目数 */
50
+ memoryMaxSize: number;
51
+ /** 磁盘缓存最大条目数 */
52
+ diskMaxSize: number;
53
+ /** IndexedDB 数据库名 */
54
+ dbName: string;
55
+ }
56
+ //# sourceMappingURL=DiskCacheConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiskCacheConfig.d.ts","sourceRoot":"","sources":["../../../src/http/models/DiskCacheConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,kBAAkB;IAC/B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY;IACZ,OAAO,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC5B,gBAAgB;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;CACjB"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 缓存存储配置
3
+ */
4
+ export {};
@@ -0,0 +1,77 @@
1
+ /**
2
+ * HTTP 客户端配置
3
+ */
4
+ import type { CacheConfig } from './CacheConfig';
5
+ import type { CacheInterceptor } from './CacheInterceptor';
6
+ /**
7
+ * HTTP 客户端配置
8
+ *
9
+ * 用于创建 HttpClient 或 ApiBuilder 时的全局配置
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const api = ApiBuilder.create({
14
+ * baseUrl: 'https://api.example.com',
15
+ * timeout: 10000,
16
+ * headers: { 'X-App-Version': '1.0.0' },
17
+ * defaultCache: {
18
+ * mode: CacheMode.FirstRemote,
19
+ * ttl: 5 * 60 * 1000,
20
+ * },
21
+ * cacheInterceptor: (ctx) => ctx.status === 200,
22
+ * })
23
+ * ```
24
+ */
25
+ export interface HttpClientConfig {
26
+ /** 基础 URL */
27
+ baseUrl: string;
28
+ /** 默认请求头 */
29
+ headers?: Record<string, string>;
30
+ /** 默认超时时间 (ms),默认 30000 */
31
+ timeout?: number;
32
+ /** 默认重试次数,默认 2 */
33
+ retry?: number;
34
+ /** 内存缓存最大条目数,默认 100 */
35
+ memoryCacheMaxSize?: number;
36
+ /** 磁盘缓存最大条目数,默认 500 */
37
+ diskCacheMaxSize?: number;
38
+ /** IndexedDB 数据库名,默认 'xxf-http-cache' */
39
+ dbName?: string;
40
+ /** 默认参与缓存 key 的 header,默认 ['Authorization'] */
41
+ defaultKeyHeaders?: string[];
42
+ /**
43
+ * 全局默认缓存配置
44
+ *
45
+ * 如果不设置,默认为 OnlyRemote(不缓存)
46
+ * 单个接口的 cache 配置会覆盖此全局配置
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * defaultCache: {
51
+ * mode: CacheMode.FirstRemote,
52
+ * ttl: 5 * 60 * 1000,
53
+ * }
54
+ * ```
55
+ */
56
+ defaultCache?: Partial<CacheConfig>;
57
+ /**
58
+ * 全局缓存拦截器
59
+ *
60
+ * 在响应返回后、写入缓存前调用,用于根据响应内容决定是否缓存。
61
+ * 只有当缓存模式需要写入缓存时才会调用此拦截器。
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * // 只缓存 HTTP 200 且业务 code 为 200 的响应
66
+ * cacheInterceptor: (ctx) => {
67
+ * if (ctx.status !== 200) return false
68
+ * const res = ctx.data as { code?: number }
69
+ * return res.code === 200
70
+ * }
71
+ * ```
72
+ *
73
+ * @see CacheInterceptor 查看更多示例
74
+ */
75
+ cacheInterceptor?: CacheInterceptor;
76
+ }
77
+ //# sourceMappingURL=HttpClientConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClientConfig.d.ts","sourceRoot":"","sources":["../../../src/http/models/HttpClientConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,gBAAgB;IAC7B,aAAa;IACb,OAAO,EAAE,MAAM,CAAA;IAEf,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAEhC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd,uBAAuB;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAEnC;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACtC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * HTTP 客户端配置
3
+ */
4
+ export {};
@@ -0,0 +1,28 @@
1
+ /**
2
+ * LRU 缓存元数据
3
+ *
4
+ * 用于 DiskLruCache 内部管理缓存条目的访问顺序
5
+ */
6
+ /**
7
+ * LRU 元数据条目
8
+ *
9
+ * 单个缓存条目的元数据信息
10
+ */
11
+ export interface LruMetadataEntry {
12
+ /** 最后访问时间 (ms) */
13
+ accessTime: number;
14
+ /** 数据大小估算 (可选,用于未来扩展) */
15
+ size?: number;
16
+ }
17
+ /**
18
+ * LRU 元数据
19
+ *
20
+ * 存储在 IndexedDB 中的元数据,用于 LRU 淘汰算法
21
+ */
22
+ export interface LruMetadata {
23
+ /** 所有缓存 key 及其元数据 */
24
+ entries: Record<string, LruMetadataEntry>;
25
+ /** 总条目数 */
26
+ count: number;
27
+ }
28
+ //# sourceMappingURL=LruMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LruMetadata.d.ts","sourceRoot":"","sources":["../../../src/http/models/LruMetadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC7B,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;IACzC,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;CAChB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * LRU 缓存元数据
3
+ *
4
+ * 用于 DiskLruCache 内部管理缓存条目的访问顺序
5
+ */
6
+ export {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 请求配置相关类型
3
+ */
4
+ import type { CacheConfig } from './CacheConfig';
5
+ /**
6
+ * 请求配置
7
+ *
8
+ * 用于定义单个 API 端点的配置
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * .get<User>('getUser', {
13
+ * path: '/users/{id}',
14
+ * headers: { 'Accept': 'application/json' },
15
+ * timeout: 5000,
16
+ * cache: { mode: CacheMode.IfCache, ttl: 60000 },
17
+ * })
18
+ * ```
19
+ */
20
+ export interface RequestConfig {
21
+ /** 请求方法 */
22
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
23
+ /** 请求路径,支持路径参数如 /users/{id} */
24
+ path: string;
25
+ /** 请求头 */
26
+ headers?: Record<string, string>;
27
+ /** 超时时间 (ms) */
28
+ timeout?: number;
29
+ /** 缓存配置 */
30
+ cache?: CacheConfig;
31
+ /** 重试次数 */
32
+ retry?: number;
33
+ }
34
+ /**
35
+ * API 调用选项
36
+ *
37
+ * 用于调用 API 时传入的运行时参数
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * // 完整示例
42
+ * await api.getUser({
43
+ * pathParams: { id: '123' },
44
+ * query: { include: 'profile' },
45
+ * headers: { 'X-Request-Id': 'abc' },
46
+ * cache: { mode: CacheMode.OnlyRemote }, // 本次调用强制不缓存
47
+ * })
48
+ *
49
+ * // POST 请求
50
+ * await api.createUser({
51
+ * body: { name: 'John', email: 'john@example.com' },
52
+ * })
53
+ * ```
54
+ */
55
+ export interface ApiOptions {
56
+ /** URL 路径参数,用于替换路径中的 {param} */
57
+ pathParams?: Record<string, string | number>;
58
+ /** 查询参数,会自动过滤 undefined 和 null */
59
+ query?: Record<string, string | number | boolean | undefined>;
60
+ /** 请求体(用于 POST/PUT/PATCH) */
61
+ body?: unknown;
62
+ /** 覆盖缓存配置(优先级最高) */
63
+ cache?: Partial<CacheConfig>;
64
+ /** 覆盖请求头 */
65
+ headers?: Record<string, string>;
66
+ }
67
+ //# sourceMappingURL=RequestConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestConfig.d.ts","sourceRoot":"","sources":["../../../src/http/models/RequestConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,aAAa;IAC1B,WAAW;IACX,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnD,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU;IACV,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW;IACX,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,UAAU;IACvB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAA;IAC5C,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAA;IAC7D,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC5B,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 请求配置相关类型
3
+ */
4
+ export {};
@@ -0,0 +1,24 @@
1
+ /**
2
+ * HTTP 网络框架类型定义
3
+ *
4
+ * 按功能模块拆分:
5
+ * - CacheMode: 缓存模式枚举
6
+ * - CacheEntry: 缓存条目结构
7
+ * - ApiTypes: API 响应相关类型
8
+ * - CacheConfig: 缓存配置
9
+ * - CacheInterceptor: 缓存拦截器
10
+ * - HttpClientConfig: HTTP 客户端配置
11
+ * - RequestConfig: 请求配置
12
+ * - DiskCacheConfig: 磁盘缓存配置
13
+ * - LruMetadata: LRU 元数据
14
+ */
15
+ export { CacheMode } from './CacheMode';
16
+ export type { CacheEntry } from './CacheEntry';
17
+ export type { ApiResult, ApiCallback } from './ApiTypes';
18
+ export type { CacheConfig, CacheKeyRequest } from './CacheConfig';
19
+ export type { CacheInterceptor, CacheInterceptorContext, CacheInterceptorResult, } from './CacheInterceptor';
20
+ export type { HttpClientConfig } from './HttpClientConfig';
21
+ export type { RequestConfig, ApiOptions } from './RequestConfig';
22
+ export type { DiskLruCacheConfig, HttpCacheConfig } from './DiskCacheConfig';
23
+ export type { LruMetadataEntry, LruMetadata } from './LruMetadata';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/models/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAGjE,YAAY,EACR,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,GACzB,MAAM,oBAAoB,CAAA;AAG3B,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAG1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGhE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAG5E,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * HTTP 网络框架类型定义
3
+ *
4
+ * 按功能模块拆分:
5
+ * - CacheMode: 缓存模式枚举
6
+ * - CacheEntry: 缓存条目结构
7
+ * - ApiTypes: API 响应相关类型
8
+ * - CacheConfig: 缓存配置
9
+ * - CacheInterceptor: 缓存拦截器
10
+ * - HttpClientConfig: HTTP 客户端配置
11
+ * - RequestConfig: 请求配置
12
+ * - DiskCacheConfig: 磁盘缓存配置
13
+ * - LruMetadata: LRU 元数据
14
+ */
15
+ // 缓存模式
16
+ export { CacheMode } from './CacheMode';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * HTTP 网络框架类型定义
3
+ *
4
+ * 统一导出入口,保持向后兼容
5
+ * 实际类型定义在 models/ 目录下按功能拆分
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { CacheMode, type HttpClientConfig } from 'xxf_react/http'
10
+ * ```
11
+ */
12
+ export { CacheMode, type CacheEntry, type ApiResult, type ApiCallback, type CacheConfig, type CacheKeyRequest, type CacheInterceptor, type CacheInterceptorContext, type CacheInterceptorResult, type HttpClientConfig, type RequestConfig, type ApiOptions, type DiskLruCacheConfig, type HttpCacheConfig, type LruMetadataEntry, type LruMetadata, } from './models';
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/http/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAEH,SAAS,EAET,KAAK,UAAU,EAEf,KAAK,SAAS,EACd,KAAK,WAAW,EAEhB,KAAK,WAAW,EAChB,KAAK,eAAe,EAEpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAE3B,KAAK,gBAAgB,EAErB,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,kBAAkB,EACvB,KAAK,eAAe,EAEpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACnB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * HTTP 网络框架类型定义
3
+ *
4
+ * 统一导出入口,保持向后兼容
5
+ * 实际类型定义在 models/ 目录下按功能拆分
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { CacheMode, type HttpClientConfig } from 'xxf_react/http'
10
+ * ```
11
+ */
12
+ export {
13
+ // 缓存模式枚举
14
+ CacheMode, } from './models';
package/dist/index.d.ts CHANGED
@@ -9,5 +9,6 @@ export * from './responsive';
9
9
  export * from './foundation';
10
10
  export * from './layout';
11
11
  export * from './event-bus';
12
+ export * from './http';
12
13
  export declare function initXXF(): void;
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAG5B,wBAAgB,OAAO,SAGtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AAGvB,wBAAgB,OAAO,SAGtB"}
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ export * from './responsive';
11
11
  export * from './foundation';
12
12
  export * from './layout';
13
13
  export * from './event-bus';
14
+ export * from './http';
14
15
  ///框架初始化函数,调用后会初始化一些全局功能
15
16
  export function initXXF() {
16
17
  initPromiseErrorExtension();
@@ -142,6 +142,6 @@ export interface XHoverProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onMou
142
142
  * </XHover>
143
143
  * ```
144
144
  */
145
- export declare function XHover({ children, hoverDelay, onEnter, onHover, onLeave, hoverLayer, disabled, as: Component, style, ...rest }: XHoverProps): React.JSX.Element;
145
+ export declare const XHover: React.ForwardRefExoticComponent<XHoverProps & React.RefAttributes<HTMLElement>>;
146
146
  export default XHover;
147
147
  //# sourceMappingURL=XHover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"XHover.d.ts","sourceRoot":"","sources":["../../../src/layout/hover/XHover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAA2C,SAAS,EAAE,cAAc,EAAC,MAAM,OAAO,CAAA;AAEhG;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;IACtG;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAA;IAEnB;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAEtC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,MAAM,SAAS,CAAA;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,wBAAgB,MAAM,CAAC,EACnB,QAAQ,EACR,UAAc,EACd,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,QAAgB,EAChB,EAAE,EAAE,SAAiB,EACrB,KAAK,EACL,GAAG,IAAI,EACV,EAAE,WAAW,qBA0Eb;AAED,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"XHover.d.ts","sourceRoot":"","sources":["../../../src/layout/hover/XHover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAuD,SAAS,EAAE,cAAc,EAAC,MAAM,OAAO,CAAA;AAE5G;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,cAAc,CAAC;IACtG;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAA;IAEnB;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAEtC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,MAAM,SAAS,CAAA;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,eAAO,MAAM,MAAM,iFAyFjB,CAAA;AAEF,eAAe,MAAM,CAAA"}
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useRef, useEffect, useState } from 'react';
1
+ import React, { forwardRef, useCallback, useRef, useEffect, useState } from 'react';
2
2
  /**
3
3
  * 悬浮触发组件
4
4
  *
@@ -63,7 +63,7 @@ import React, { useCallback, useRef, useEffect, useState } from 'react';
63
63
  * </XHover>
64
64
  * ```
65
65
  */
66
- export function XHover({ children, hoverDelay = 0, onEnter, onHover, onLeave, hoverLayer, disabled = false, as: Component = 'div', style, ...rest }) {
66
+ export const XHover = forwardRef(function XHover({ children, hoverDelay = 0, onEnter, onHover, onLeave, hoverLayer, disabled = false, as: Component = 'div', style, ...rest }, ref) {
67
67
  const timerRef = useRef(null);
68
68
  const hasTriggeredRef = useRef(false);
69
69
  // 只有 hoverLayer 存在时才需要状态
@@ -121,8 +121,8 @@ export function XHover({ children, hoverDelay = 0, onEnter, onHover, onLeave, ho
121
121
  const containerStyle = hoverLayer
122
122
  ? { position: 'relative', ...style }
123
123
  : style;
124
- return (React.createElement(Component, { ...rest, style: containerStyle, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave },
124
+ return (React.createElement(Component, { ref: ref, ...rest, style: containerStyle, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave },
125
125
  children,
126
126
  hoverLayer && showLayer && hoverLayer()));
127
- }
127
+ });
128
128
  export default XHover;