xxf_react 0.8.5 → 0.8.7
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/dist/cache/CacheEntry.d.ts +28 -0
- package/dist/cache/CacheEntry.d.ts.map +1 -0
- package/dist/cache/CacheEntry.js +1 -0
- package/dist/cache/DiskCacheConfig.d.ts +56 -0
- package/dist/cache/DiskCacheConfig.d.ts.map +1 -0
- package/dist/cache/DiskCacheConfig.js +4 -0
- package/dist/cache/DiskLruCache.d.ts +69 -0
- package/dist/cache/DiskLruCache.d.ts.map +1 -0
- package/dist/cache/DiskLruCache.js +305 -0
- package/dist/cache/LruMetadata.d.ts +28 -0
- package/dist/cache/LruMetadata.d.ts.map +1 -0
- package/dist/cache/LruMetadata.js +6 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/event-bus/EventBus.d.ts +176 -0
- package/dist/event-bus/EventBus.d.ts.map +1 -0
- package/dist/event-bus/EventBus.js +278 -0
- package/dist/event-bus/EventDemo.d.ts +71 -0
- package/dist/event-bus/EventDemo.d.ts.map +1 -0
- package/dist/event-bus/EventDemo.js +76 -0
- package/dist/event-bus/EventHooks.d.ts +48 -0
- package/dist/event-bus/EventHooks.d.ts.map +1 -0
- package/dist/event-bus/EventHooks.js +73 -0
- package/dist/event-bus/index.d.ts +3 -0
- package/dist/event-bus/index.d.ts.map +1 -0
- package/dist/event-bus/index.js +2 -0
- package/dist/fetch/Fetch.d.ts +9 -0
- package/dist/fetch/Fetch.d.ts.map +1 -0
- package/dist/fetch/Fetch.js +54 -0
- package/dist/fetch/TimeoutError.d.ts +7 -0
- package/dist/fetch/TimeoutError.d.ts.map +1 -0
- package/dist/fetch/TimeoutError.js +23 -0
- package/dist/fetch/index.d.ts +3 -0
- package/dist/fetch/index.d.ts.map +1 -0
- package/dist/fetch/index.js +2 -0
- package/dist/flow/PromiseExt.d.ts +8 -0
- package/dist/flow/PromiseExt.d.ts.map +1 -0
- package/dist/flow/PromiseExt.js +50 -0
- package/dist/flow/PromiseLifecycle.d.ts +33 -0
- package/dist/flow/PromiseLifecycle.d.ts.map +1 -0
- package/dist/flow/PromiseLifecycle.js +37 -0
- package/dist/flow/PromiseLoading.d.ts +25 -0
- package/dist/flow/PromiseLoading.d.ts.map +1 -0
- package/dist/flow/PromiseLoading.js +30 -0
- package/dist/flow/index.d.ts +4 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +3 -0
- package/dist/foundation/Copy.d.ts +8 -0
- package/dist/foundation/Copy.d.ts.map +1 -0
- package/dist/foundation/Copy.js +21 -0
- package/dist/foundation/Debug.d.ts +7 -0
- package/dist/foundation/Debug.d.ts.map +1 -0
- package/dist/foundation/Debug.js +12 -0
- package/dist/foundation/LayoutSize.d.ts +5 -0
- package/dist/foundation/LayoutSize.d.ts.map +1 -0
- package/dist/foundation/LayoutSize.js +1 -0
- package/dist/foundation/PerformanceMonitor.d.ts +13 -0
- package/dist/foundation/PerformanceMonitor.d.ts.map +1 -0
- package/dist/foundation/PerformanceMonitor.js +26 -0
- package/dist/foundation/index.d.ts +5 -0
- package/dist/foundation/index.d.ts.map +1 -0
- package/dist/foundation/index.js +4 -0
- package/dist/http/api/ApiBuilder.d.ts +251 -0
- package/dist/http/api/ApiBuilder.d.ts.map +1 -0
- package/dist/http/api/ApiBuilder.js +189 -0
- package/dist/http/api/index.d.ts +2 -0
- package/dist/http/api/index.d.ts.map +1 -0
- package/dist/http/api/index.js +1 -0
- package/dist/http/cache/HttpCache.d.ts +59 -0
- package/dist/http/cache/HttpCache.d.ts.map +1 -0
- package/dist/http/cache/HttpCache.js +215 -0
- package/dist/http/cache/index.d.ts +3 -0
- package/dist/http/cache/index.d.ts.map +1 -0
- package/dist/http/cache/index.js +2 -0
- package/dist/http/client/ApiStream.d.ts +80 -0
- package/dist/http/client/ApiStream.d.ts.map +1 -0
- package/dist/http/client/ApiStream.js +190 -0
- package/dist/http/client/HttpClient.d.ts +88 -0
- package/dist/http/client/HttpClient.d.ts.map +1 -0
- package/dist/http/client/HttpClient.js +381 -0
- package/dist/http/client/index.d.ts +3 -0
- package/dist/http/client/index.d.ts.map +1 -0
- package/dist/http/client/index.js +2 -0
- package/dist/http/demo/api-builder.demo.d.ts +102 -0
- package/dist/http/demo/api-builder.demo.d.ts.map +1 -0
- package/dist/http/demo/api-builder.demo.js +343 -0
- package/dist/http/index.d.ts +52 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +61 -0
- package/dist/http/interceptor/CacheInterceptor.d.ts +112 -0
- package/dist/http/interceptor/CacheInterceptor.d.ts.map +1 -0
- package/dist/http/interceptor/CacheInterceptor.js +6 -0
- package/dist/http/interceptor/DefaultCacheInterceptor.d.ts +54 -0
- package/dist/http/interceptor/DefaultCacheInterceptor.d.ts.map +1 -0
- package/dist/http/interceptor/DefaultCacheInterceptor.js +111 -0
- package/dist/http/interceptor/index.d.ts +3 -0
- package/dist/http/interceptor/index.d.ts.map +1 -0
- package/dist/http/interceptor/index.js +2 -0
- package/dist/http/models/ApiTypes.d.ts +54 -0
- package/dist/http/models/ApiTypes.d.ts.map +1 -0
- package/dist/http/models/ApiTypes.js +4 -0
- package/dist/http/models/CacheConfig.d.ts +58 -0
- package/dist/http/models/CacheConfig.d.ts.map +1 -0
- package/dist/http/models/CacheConfig.js +4 -0
- package/dist/http/models/CacheMode.d.ts +45 -0
- package/dist/http/models/CacheMode.d.ts.map +1 -0
- package/dist/http/models/CacheMode.js +45 -0
- package/dist/http/models/HttpClientConfig.d.ts +90 -0
- package/dist/http/models/HttpClientConfig.d.ts.map +1 -0
- package/dist/http/models/HttpClientConfig.js +4 -0
- package/dist/http/models/RequestConfig.d.ts +67 -0
- package/dist/http/models/RequestConfig.d.ts.map +1 -0
- package/dist/http/models/RequestConfig.js +4 -0
- package/dist/http/models/index.d.ts +24 -0
- package/dist/http/models/index.d.ts.map +1 -0
- package/dist/http/models/index.js +16 -0
- package/dist/http/types.d.ts +13 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +14 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/layout/button/XButton.d.ts +99 -0
- package/dist/layout/button/XButton.d.ts.map +1 -0
- package/dist/layout/button/XButton.js +131 -0
- package/dist/layout/hover/XHover.d.ts +147 -0
- package/dist/layout/hover/XHover.d.ts.map +1 -0
- package/dist/layout/hover/XHover.js +128 -0
- package/dist/layout/image/XImage.d.ts +35 -0
- package/dist/layout/image/XImage.d.ts.map +1 -0
- package/dist/layout/image/XImage.effects.d.ts +16 -0
- package/dist/layout/image/XImage.effects.d.ts.map +1 -0
- package/dist/layout/image/XImage.effects.js +77 -0
- package/dist/layout/image/XImage.js +261 -0
- package/dist/layout/image/XImage.types.d.ts +130 -0
- package/dist/layout/image/XImage.types.d.ts.map +1 -0
- package/dist/layout/image/XImage.types.js +2 -0
- package/dist/layout/image/XImageGallery.d.ts +76 -0
- package/dist/layout/image/XImageGallery.d.ts.map +1 -0
- package/dist/layout/image/XImageGallery.js +94 -0
- package/dist/layout/image/index.d.ts +12 -0
- package/dist/layout/image/index.d.ts.map +1 -0
- package/dist/layout/image/index.js +4 -0
- package/dist/layout/index.d.ts +12 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +11 -0
- package/dist/layout/resize/core/ResizeObserverHook.d.ts +41 -0
- package/dist/layout/resize/core/ResizeObserverHook.d.ts.map +1 -0
- package/dist/layout/resize/core/ResizeObserverHook.js +57 -0
- package/dist/layout/resize/core/SizedLayoutContext.d.ts +23 -0
- package/dist/layout/resize/core/SizedLayoutContext.d.ts.map +1 -0
- package/dist/layout/resize/core/SizedLayoutContext.js +23 -0
- package/dist/layout/resize/core/SizedLayoutProps.d.ts +19 -0
- package/dist/layout/resize/core/SizedLayoutProps.d.ts.map +1 -0
- package/dist/layout/resize/core/SizedLayoutProps.js +1 -0
- package/dist/layout/resize/impl/SizedContainer.d.ts +45 -0
- package/dist/layout/resize/impl/SizedContainer.d.ts.map +1 -0
- package/dist/layout/resize/impl/SizedContainer.js +65 -0
- package/dist/layout/resize/impl/SizedLayout.d.ts +45 -0
- package/dist/layout/resize/impl/SizedLayout.d.ts.map +1 -0
- package/dist/layout/resize/impl/SizedLayout.js +65 -0
- package/dist/layout/spinner/XSpinner.d.ts +43 -0
- package/dist/layout/spinner/XSpinner.d.ts.map +1 -0
- package/dist/layout/spinner/XSpinner.js +47 -0
- package/dist/layout/virtualized/VirtualizedConfig.d.ts +16 -0
- package/dist/layout/virtualized/VirtualizedConfig.d.ts.map +1 -0
- package/dist/layout/virtualized/VirtualizedConfig.js +15 -0
- package/dist/layout/visibility/ElementVisibilityHooks.d.ts +13 -0
- package/dist/layout/visibility/ElementVisibilityHooks.d.ts.map +1 -0
- package/dist/layout/visibility/ElementVisibilityHooks.js +119 -0
- package/dist/media/components/XVideo.d.ts +205 -0
- package/dist/media/components/XVideo.d.ts.map +1 -0
- package/dist/media/components/XVideo.js +297 -0
- package/dist/media/components/XVideoBufferingIndicator.d.ts +13 -0
- package/dist/media/components/XVideoBufferingIndicator.d.ts.map +1 -0
- package/dist/media/components/XVideoBufferingIndicator.js +13 -0
- package/dist/media/components/XVideoErrorIndicator.d.ts +15 -0
- package/dist/media/components/XVideoErrorIndicator.d.ts.map +1 -0
- package/dist/media/components/XVideoErrorIndicator.js +19 -0
- package/dist/media/index.d.ts +7 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +7 -0
- package/dist/media/playback-queue-store.d.ts +746 -0
- package/dist/media/playback-queue-store.d.ts.map +1 -0
- package/dist/media/playback-queue-store.js +670 -0
- package/dist/media/video-play-safe.d.ts +26 -0
- package/dist/media/video-play-safe.d.ts.map +1 -0
- package/dist/media/video-play-safe.js +56 -0
- package/dist/media/video-state.d.ts +38 -0
- package/dist/media/video-state.d.ts.map +1 -0
- package/dist/media/video-state.js +125 -0
- package/dist/models/ApiPageDataFieldDTO.d.ts +9 -0
- package/dist/models/ApiPageDataFieldDTO.d.ts.map +1 -0
- package/dist/models/ApiPageDataFieldDTO.js +1 -0
- package/dist/models/ApiResponse.d.ts +29 -0
- package/dist/models/ApiResponse.d.ts.map +1 -0
- package/dist/models/ApiResponse.js +32 -0
- package/dist/models/PaginationDTO.d.ts +8 -0
- package/dist/models/PaginationDTO.d.ts.map +1 -0
- package/dist/models/PaginationDTO.js +6 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +3 -0
- package/dist/refresh/LoadMoreAsync.d.ts +36 -0
- package/dist/refresh/LoadMoreAsync.d.ts.map +1 -0
- package/dist/refresh/LoadMoreAsync.js +55 -0
- package/dist/refresh/index.d.ts +2 -0
- package/dist/refresh/index.d.ts.map +1 -0
- package/dist/refresh/index.js +2 -0
- package/dist/responsive/BrowserAdapter.d.ts +26 -0
- package/dist/responsive/BrowserAdapter.d.ts.map +1 -0
- package/dist/responsive/BrowserAdapter.js +79 -0
- package/dist/responsive/ScreenAdapter.d.ts +2 -0
- package/dist/responsive/ScreenAdapter.d.ts.map +1 -0
- package/dist/responsive/ScreenAdapter.js +5 -0
- package/dist/responsive/index.d.ts +3 -0
- package/dist/responsive/index.d.ts.map +1 -0
- package/dist/responsive/index.js +3 -0
- package/dist/sse/SSEManager.d.ts +21 -0
- package/dist/sse/SSEManager.d.ts.map +1 -0
- package/dist/sse/SSEManager.js +73 -0
- package/dist/sse/SSERegistry.d.ts +20 -0
- package/dist/sse/SSERegistry.d.ts.map +1 -0
- package/dist/sse/SSERegistry.js +36 -0
- package/dist/sse/SSEStatus.d.ts +7 -0
- package/dist/sse/SSEStatus.d.ts.map +1 -0
- package/dist/sse/SSEStatus.js +7 -0
- package/dist/sse/UseSSE.d.ts +13 -0
- package/dist/sse/UseSSE.d.ts.map +1 -0
- package/dist/sse/UseSSE.js +39 -0
- package/dist/sse/index.d.ts +5 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +5 -0
- package/dist/utils/MIME.d.ts +137 -0
- package/dist/utils/MIME.d.ts.map +1 -0
- package/dist/utils/MIME.js +192 -0
- package/dist/utils/Reload.d.ts +62 -0
- package/dist/utils/Reload.d.ts.map +1 -0
- package/dist/utils/Reload.js +66 -0
- package/dist/utils/ScrollToCenter.d.ts +72 -0
- package/dist/utils/ScrollToCenter.d.ts.map +1 -0
- package/dist/utils/ScrollToCenter.js +145 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/url-placholder.d.ts +14 -0
- package/dist/utils/url-placholder.d.ts.map +1 -0
- package/dist/utils/url-placholder.js +17 -0
- package/package.json +1 -1
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 构建器
|
|
3
|
+
*
|
|
4
|
+
* 使用 Builder 模式定义 API,类似 Android Retrofit。
|
|
5
|
+
* 采用泛型累积模式,每次 .get() / .post() 调用都返回带有累积类型的新 Builder。
|
|
6
|
+
*
|
|
7
|
+
* ## 类型安全特性
|
|
8
|
+
*
|
|
9
|
+
* - **端点名称字面量**:每个端点名称保留字面量类型(如 `'getUser'`)
|
|
10
|
+
* - **泛型累积**:链式调用累积所有端点类型 `T & Record<K, ApiEndpoint<...>>`
|
|
11
|
+
* - **Body 类型约束**:POST/PUT/PATCH 支持指定请求体类型
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* interface CreateUserDTO { name: string; email: string }
|
|
16
|
+
*
|
|
17
|
+
* const userApi = ApiBuilder.create({
|
|
18
|
+
* baseUrl: 'https://api.example.com',
|
|
19
|
+
* })
|
|
20
|
+
* .get<User>('getUser', { path: '/users/{id}' })
|
|
21
|
+
* .get<User[]>('getUsers', { path: '/users' })
|
|
22
|
+
* .post<User, CreateUserDTO>('createUser', { path: '/users' })
|
|
23
|
+
* .build()
|
|
24
|
+
*
|
|
25
|
+
* // ✅ 类型正确推断
|
|
26
|
+
* userApi.getUser({ pathParams: { id: '123' } })
|
|
27
|
+
* userApi.createUser({ body: { name: 'John', email: 'x' } })
|
|
28
|
+
*
|
|
29
|
+
* // ❌ 类型错误会被捕获
|
|
30
|
+
* userApi.unknownMethod() // Error: 方法不存在
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import ky, { type Options as KyOptions } from 'ky';
|
|
34
|
+
import { HttpClient } from '../client/HttpClient';
|
|
35
|
+
import { ApiStream } from '../client/ApiStream';
|
|
36
|
+
import type { RequestConfig, ApiOptions, CacheConfig, HttpClientConfig } from '../types';
|
|
37
|
+
/**
|
|
38
|
+
* 基础 API 调用选项(不含 body)
|
|
39
|
+
*/
|
|
40
|
+
type BaseApiOptions = Omit<ApiOptions, 'body'>;
|
|
41
|
+
/**
|
|
42
|
+
* 强制 TypeScript 展开交叉类型为单一对象类型
|
|
43
|
+
* 用于用户自定义接口类型时使用
|
|
44
|
+
*/
|
|
45
|
+
export type Simplify<T> = {
|
|
46
|
+
[K in keyof T]: T[K];
|
|
47
|
+
} & {};
|
|
48
|
+
/**
|
|
49
|
+
* 带 body 的 API 调用选项(body 必需)
|
|
50
|
+
*/
|
|
51
|
+
type WithBodyRequired<TBody> = BaseApiOptions & {
|
|
52
|
+
body: TBody;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* 带 body 的 API 调用选项(body 可选)
|
|
56
|
+
*/
|
|
57
|
+
type WithBodyOptional = BaseApiOptions & {
|
|
58
|
+
body?: unknown;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* 无 body 的 API 调用选项(GET/DELETE)
|
|
62
|
+
*/
|
|
63
|
+
type WithoutBodyOptions = BaseApiOptions & {
|
|
64
|
+
body?: never;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* API 端点函数类型(有 body 且必需 - POST/PUT/PATCH 指定了 TBody)
|
|
68
|
+
*/
|
|
69
|
+
export type ApiEndpointWithBodyRequired<TResponse, TBody> = {
|
|
70
|
+
(options: WithBodyRequired<TBody>): ApiStream<TResponse>;
|
|
71
|
+
/** 请求配置 */
|
|
72
|
+
config: RequestConfig;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* API 端点函数类型(有 body 但可选 - POST/PUT/PATCH 未指定 TBody)
|
|
76
|
+
*/
|
|
77
|
+
export type ApiEndpointWithBodyOptional<TResponse> = {
|
|
78
|
+
(options?: WithBodyOptional): ApiStream<TResponse>;
|
|
79
|
+
/** 请求配置 */
|
|
80
|
+
config: RequestConfig;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* API 端点函数类型(无 body - GET/DELETE)
|
|
84
|
+
*/
|
|
85
|
+
export type ApiEndpointWithoutBody<TResponse> = {
|
|
86
|
+
(options?: WithoutBodyOptions): ApiStream<TResponse>;
|
|
87
|
+
/** 请求配置 */
|
|
88
|
+
config: RequestConfig;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* 检测是否为 unknown 类型
|
|
92
|
+
*/
|
|
93
|
+
type IsUnknown<T> = [unknown] extends [T] ? ([T] extends [unknown] ? true : false) : false;
|
|
94
|
+
/**
|
|
95
|
+
* 检测是否为 void 类型
|
|
96
|
+
*/
|
|
97
|
+
type IsVoid<T> = [T] extends [void] ? ([void] extends [T] ? true : false) : false;
|
|
98
|
+
/**
|
|
99
|
+
* 有 body 的端点类型(根据 TBody 选择必需或可选)
|
|
100
|
+
*/
|
|
101
|
+
export type ApiEndpointWithBody<TResponse, TBody> = IsUnknown<TBody> extends true ? ApiEndpointWithBodyOptional<TResponse> : IsVoid<TBody> extends true ? ApiEndpointWithBodyOptional<TResponse> : ApiEndpointWithBodyRequired<TResponse, TBody>;
|
|
102
|
+
/**
|
|
103
|
+
* API 端点函数类型(泛型版本,用于内部和类型导出)
|
|
104
|
+
*/
|
|
105
|
+
export type ApiEndpoint<TResponse, TBody = unknown, HasBody extends boolean = false> = HasBody extends true ? ApiEndpointWithBody<TResponse, TBody> : ApiEndpointWithoutBody<TResponse>;
|
|
106
|
+
/**
|
|
107
|
+
* API 定义类型(端点集合)
|
|
108
|
+
*/
|
|
109
|
+
export type ApiDefinition = Record<string, ApiEndpoint<unknown, unknown, boolean>>;
|
|
110
|
+
/**
|
|
111
|
+
* 端点选项(构建时配置)
|
|
112
|
+
*/
|
|
113
|
+
interface EndpointOptions {
|
|
114
|
+
/** 请求路径,支持 {param} 占位符 */
|
|
115
|
+
path: string;
|
|
116
|
+
/** 请求方法 */
|
|
117
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
118
|
+
/** 请求头 */
|
|
119
|
+
headers?: Record<string, string>;
|
|
120
|
+
/** 超时时间 (ms) */
|
|
121
|
+
timeout?: number;
|
|
122
|
+
/** 重试次数 */
|
|
123
|
+
retry?: number;
|
|
124
|
+
/** 缓存配置 */
|
|
125
|
+
cache?: CacheConfig;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 空 API 类型(空记录,不允许任意属性访问)
|
|
129
|
+
*/
|
|
130
|
+
type EmptyApi = {};
|
|
131
|
+
/**
|
|
132
|
+
* API 构建器类
|
|
133
|
+
*
|
|
134
|
+
* 使用链式调用定义类型安全的 API 端点。
|
|
135
|
+
*
|
|
136
|
+
* @template T 当前已定义的端点类型集合,通过链式调用累积
|
|
137
|
+
*
|
|
138
|
+
* @remarks
|
|
139
|
+
* **类型深度限制**:由于 TypeScript 对深层交叉类型的处理限制,
|
|
140
|
+
* 当单个 builder 链式调用超过 4 个端点时,类型推断可能不够精确。
|
|
141
|
+
*
|
|
142
|
+
* 建议:
|
|
143
|
+
* - 保持单个 builder 的端点数量在 4 个以内以获得最佳类型推断
|
|
144
|
+
* - 如需更多端点,功能仍然正常,但部分类型检查可能被放宽
|
|
145
|
+
* - 可以使用导出的 `ApiEndpointWithBody`、`ApiEndpointWithoutBody` 等类型
|
|
146
|
+
* 来定义自己的接口类型,获得更精确的类型检查
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* const userApi = ApiBuilder.create({ baseUrl: '/api' })
|
|
151
|
+
* .get<User>('getUser', { path: '/users/{id}' })
|
|
152
|
+
* .post<User, CreateUserDTO>('createUser', { path: '/users' })
|
|
153
|
+
* .put<User, UpdateUserDTO>('updateUser', { path: '/users/{id}' })
|
|
154
|
+
* .build()
|
|
155
|
+
*
|
|
156
|
+
* // 类型安全调用
|
|
157
|
+
* const user = await userApi.getUser({ pathParams: { id: '1' } })
|
|
158
|
+
* const newUser = await userApi.createUser({ body: { name: 'John', email: 'j@test.com' } })
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export declare class ApiBuilder<T extends object = EmptyApi> {
|
|
162
|
+
private client;
|
|
163
|
+
private endpoints;
|
|
164
|
+
private constructor();
|
|
165
|
+
/**
|
|
166
|
+
* 创建 API 构建器
|
|
167
|
+
*
|
|
168
|
+
* @param config HTTP 客户端配置
|
|
169
|
+
* @returns 新的 ApiBuilder 实例
|
|
170
|
+
*/
|
|
171
|
+
static create(config: HttpClientConfig): ApiBuilder<object>;
|
|
172
|
+
/**
|
|
173
|
+
* 从现有 ky 实例创建
|
|
174
|
+
*
|
|
175
|
+
* @param kyInstance 已配置的 ky 实例
|
|
176
|
+
* @param config 可选的额外配置
|
|
177
|
+
* @returns 新的 ApiBuilder 实例
|
|
178
|
+
*/
|
|
179
|
+
static from(kyInstance: ReturnType<typeof ky.create>, config?: Partial<HttpClientConfig>): ApiBuilder<object>;
|
|
180
|
+
/**
|
|
181
|
+
* 定义 GET 请求
|
|
182
|
+
*
|
|
183
|
+
* @template TResponse 响应数据类型
|
|
184
|
+
* @template K 端点名称(自动推断)
|
|
185
|
+
*/
|
|
186
|
+
get<TResponse, const K extends string = string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & {
|
|
187
|
+
[P in K]: ApiEndpointWithoutBody<TResponse>;
|
|
188
|
+
}>;
|
|
189
|
+
/**
|
|
190
|
+
* 定义 POST 请求
|
|
191
|
+
*
|
|
192
|
+
* @template TResponse 响应数据类型
|
|
193
|
+
* @template TBody 请求体类型
|
|
194
|
+
* @template K 端点名称
|
|
195
|
+
*/
|
|
196
|
+
post<TResponse, TBody = void, const K extends string = string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & {
|
|
197
|
+
[P in K]: ApiEndpointWithBody<TResponse, TBody>;
|
|
198
|
+
}>;
|
|
199
|
+
/**
|
|
200
|
+
* 定义 PUT 请求
|
|
201
|
+
*
|
|
202
|
+
* @template TResponse 响应数据类型
|
|
203
|
+
* @template TBody 请求体类型
|
|
204
|
+
* @template K 端点名称
|
|
205
|
+
*/
|
|
206
|
+
put<TResponse, TBody = void, const K extends string = string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & {
|
|
207
|
+
[P in K]: ApiEndpointWithBody<TResponse, TBody>;
|
|
208
|
+
}>;
|
|
209
|
+
/**
|
|
210
|
+
* 定义 DELETE 请求
|
|
211
|
+
*
|
|
212
|
+
* @template TResponse 响应数据类型
|
|
213
|
+
* @template K 端点名称
|
|
214
|
+
*/
|
|
215
|
+
delete<TResponse, const K extends string = string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & {
|
|
216
|
+
[P in K]: ApiEndpointWithoutBody<TResponse>;
|
|
217
|
+
}>;
|
|
218
|
+
/**
|
|
219
|
+
* 定义 PATCH 请求
|
|
220
|
+
*
|
|
221
|
+
* @template TResponse 响应数据类型
|
|
222
|
+
* @template TBody 请求体类型
|
|
223
|
+
* @template K 端点名称
|
|
224
|
+
*/
|
|
225
|
+
patch<TResponse, TBody = void, const K extends string = string>(name: K, options: Omit<EndpointOptions, 'method'>): ApiBuilder<T & {
|
|
226
|
+
[P in K]: ApiEndpointWithBody<TResponse, TBody>;
|
|
227
|
+
}>;
|
|
228
|
+
/**
|
|
229
|
+
* 通用端点定义(内部方法)
|
|
230
|
+
*/
|
|
231
|
+
private endpoint;
|
|
232
|
+
/**
|
|
233
|
+
* 扩展 ky 实例(添加 hooks 等)
|
|
234
|
+
*
|
|
235
|
+
* @param options Ky 配置选项
|
|
236
|
+
* @returns 当前 Builder 实例(保留累积的类型)
|
|
237
|
+
*/
|
|
238
|
+
extend(options: KyOptions): ApiBuilder<T>;
|
|
239
|
+
/**
|
|
240
|
+
* 构建 API 服务
|
|
241
|
+
*
|
|
242
|
+
* @returns 类型安全的 API 对象
|
|
243
|
+
*/
|
|
244
|
+
build(): T;
|
|
245
|
+
/**
|
|
246
|
+
* 获取 HTTP 客户端实例(用于高级操作)
|
|
247
|
+
*/
|
|
248
|
+
getClient(): HttpClient;
|
|
249
|
+
}
|
|
250
|
+
export {};
|
|
251
|
+
//# sourceMappingURL=ApiBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiBuilder.d.ts","sourceRoot":"","sources":["../../../src/http/api/ApiBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 构建器
|
|
3
|
+
*
|
|
4
|
+
* 使用 Builder 模式定义 API,类似 Android Retrofit。
|
|
5
|
+
* 采用泛型累积模式,每次 .get() / .post() 调用都返回带有累积类型的新 Builder。
|
|
6
|
+
*
|
|
7
|
+
* ## 类型安全特性
|
|
8
|
+
*
|
|
9
|
+
* - **端点名称字面量**:每个端点名称保留字面量类型(如 `'getUser'`)
|
|
10
|
+
* - **泛型累积**:链式调用累积所有端点类型 `T & Record<K, ApiEndpoint<...>>`
|
|
11
|
+
* - **Body 类型约束**:POST/PUT/PATCH 支持指定请求体类型
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* interface CreateUserDTO { name: string; email: string }
|
|
16
|
+
*
|
|
17
|
+
* const userApi = ApiBuilder.create({
|
|
18
|
+
* baseUrl: 'https://api.example.com',
|
|
19
|
+
* })
|
|
20
|
+
* .get<User>('getUser', { path: '/users/{id}' })
|
|
21
|
+
* .get<User[]>('getUsers', { path: '/users' })
|
|
22
|
+
* .post<User, CreateUserDTO>('createUser', { path: '/users' })
|
|
23
|
+
* .build()
|
|
24
|
+
*
|
|
25
|
+
* // ✅ 类型正确推断
|
|
26
|
+
* userApi.getUser({ pathParams: { id: '123' } })
|
|
27
|
+
* userApi.createUser({ body: { name: 'John', email: 'x' } })
|
|
28
|
+
*
|
|
29
|
+
* // ❌ 类型错误会被捕获
|
|
30
|
+
* userApi.unknownMethod() // Error: 方法不存在
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import { HttpClient } from '../client/HttpClient';
|
|
34
|
+
/**
|
|
35
|
+
* API 构建器类
|
|
36
|
+
*
|
|
37
|
+
* 使用链式调用定义类型安全的 API 端点。
|
|
38
|
+
*
|
|
39
|
+
* @template T 当前已定义的端点类型集合,通过链式调用累积
|
|
40
|
+
*
|
|
41
|
+
* @remarks
|
|
42
|
+
* **类型深度限制**:由于 TypeScript 对深层交叉类型的处理限制,
|
|
43
|
+
* 当单个 builder 链式调用超过 4 个端点时,类型推断可能不够精确。
|
|
44
|
+
*
|
|
45
|
+
* 建议:
|
|
46
|
+
* - 保持单个 builder 的端点数量在 4 个以内以获得最佳类型推断
|
|
47
|
+
* - 如需更多端点,功能仍然正常,但部分类型检查可能被放宽
|
|
48
|
+
* - 可以使用导出的 `ApiEndpointWithBody`、`ApiEndpointWithoutBody` 等类型
|
|
49
|
+
* 来定义自己的接口类型,获得更精确的类型检查
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const userApi = ApiBuilder.create({ baseUrl: '/api' })
|
|
54
|
+
* .get<User>('getUser', { path: '/users/{id}' })
|
|
55
|
+
* .post<User, CreateUserDTO>('createUser', { path: '/users' })
|
|
56
|
+
* .put<User, UpdateUserDTO>('updateUser', { path: '/users/{id}' })
|
|
57
|
+
* .build()
|
|
58
|
+
*
|
|
59
|
+
* // 类型安全调用
|
|
60
|
+
* const user = await userApi.getUser({ pathParams: { id: '1' } })
|
|
61
|
+
* const newUser = await userApi.createUser({ body: { name: 'John', email: 'j@test.com' } })
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export class ApiBuilder {
|
|
65
|
+
constructor(config) {
|
|
66
|
+
this.endpoints = new Map();
|
|
67
|
+
this.client = new HttpClient(config);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 创建 API 构建器
|
|
71
|
+
*
|
|
72
|
+
* @param config HTTP 客户端配置
|
|
73
|
+
* @returns 新的 ApiBuilder 实例
|
|
74
|
+
*/
|
|
75
|
+
static create(config) {
|
|
76
|
+
return new ApiBuilder(config);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 从现有 ky 实例创建
|
|
80
|
+
*
|
|
81
|
+
* @param kyInstance 已配置的 ky 实例
|
|
82
|
+
* @param config 可选的额外配置
|
|
83
|
+
* @returns 新的 ApiBuilder 实例
|
|
84
|
+
*/
|
|
85
|
+
static from(kyInstance, config) {
|
|
86
|
+
const builder = new ApiBuilder({
|
|
87
|
+
baseUrl: '',
|
|
88
|
+
...config,
|
|
89
|
+
});
|
|
90
|
+
builder.client.setKyInstance(kyInstance);
|
|
91
|
+
return builder;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 定义 GET 请求
|
|
95
|
+
*
|
|
96
|
+
* @template TResponse 响应数据类型
|
|
97
|
+
* @template K 端点名称(自动推断)
|
|
98
|
+
*/
|
|
99
|
+
get(name, options) {
|
|
100
|
+
return this.endpoint(name, { ...options, method: 'GET' });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 定义 POST 请求
|
|
104
|
+
*
|
|
105
|
+
* @template TResponse 响应数据类型
|
|
106
|
+
* @template TBody 请求体类型
|
|
107
|
+
* @template K 端点名称
|
|
108
|
+
*/
|
|
109
|
+
post(name, options) {
|
|
110
|
+
return this.endpoint(name, { ...options, method: 'POST' });
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 定义 PUT 请求
|
|
114
|
+
*
|
|
115
|
+
* @template TResponse 响应数据类型
|
|
116
|
+
* @template TBody 请求体类型
|
|
117
|
+
* @template K 端点名称
|
|
118
|
+
*/
|
|
119
|
+
put(name, options) {
|
|
120
|
+
return this.endpoint(name, { ...options, method: 'PUT' });
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 定义 DELETE 请求
|
|
124
|
+
*
|
|
125
|
+
* @template TResponse 响应数据类型
|
|
126
|
+
* @template K 端点名称
|
|
127
|
+
*/
|
|
128
|
+
delete(name, options) {
|
|
129
|
+
return this.endpoint(name, { ...options, method: 'DELETE' });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 定义 PATCH 请求
|
|
133
|
+
*
|
|
134
|
+
* @template TResponse 响应数据类型
|
|
135
|
+
* @template TBody 请求体类型
|
|
136
|
+
* @template K 端点名称
|
|
137
|
+
*/
|
|
138
|
+
patch(name, options) {
|
|
139
|
+
return this.endpoint(name, { ...options, method: 'PATCH' });
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 通用端点定义(内部方法)
|
|
143
|
+
*/
|
|
144
|
+
endpoint(name, options) {
|
|
145
|
+
var _a;
|
|
146
|
+
const config = {
|
|
147
|
+
method: (_a = options.method) !== null && _a !== void 0 ? _a : 'GET',
|
|
148
|
+
path: options.path,
|
|
149
|
+
headers: options.headers,
|
|
150
|
+
timeout: options.timeout,
|
|
151
|
+
retry: options.retry,
|
|
152
|
+
cache: options.cache,
|
|
153
|
+
};
|
|
154
|
+
this.endpoints.set(name, config);
|
|
155
|
+
return this;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 扩展 ky 实例(添加 hooks 等)
|
|
159
|
+
*
|
|
160
|
+
* @param options Ky 配置选项
|
|
161
|
+
* @returns 当前 Builder 实例(保留累积的类型)
|
|
162
|
+
*/
|
|
163
|
+
extend(options) {
|
|
164
|
+
this.client.extendKy(options);
|
|
165
|
+
return this;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 构建 API 服务
|
|
169
|
+
*
|
|
170
|
+
* @returns 类型安全的 API 对象
|
|
171
|
+
*/
|
|
172
|
+
build() {
|
|
173
|
+
const api = {};
|
|
174
|
+
for (const [name, config] of this.endpoints) {
|
|
175
|
+
const endpoint = ((options) => {
|
|
176
|
+
return this.client.request(config, options);
|
|
177
|
+
});
|
|
178
|
+
endpoint.config = config;
|
|
179
|
+
api[name] = endpoint;
|
|
180
|
+
}
|
|
181
|
+
return api;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 获取 HTTP 客户端实例(用于高级操作)
|
|
185
|
+
*/
|
|
186
|
+
getClient() {
|
|
187
|
+
return this.client;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/http/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,QAAQ,GAChB,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ApiBuilder, } from './ApiBuilder';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 缓存(内存 + 磁盘双层)
|
|
3
|
+
*
|
|
4
|
+
* 策略:
|
|
5
|
+
* - 读取:先内存 -> 再磁盘 -> 若磁盘命中则回填内存
|
|
6
|
+
* - 写入:同时写入内存和磁盘
|
|
7
|
+
* - 容错:缓存操作失败不影响正常业务
|
|
8
|
+
* - 防污染:返回数据的深拷贝,防止上层修改影响缓存
|
|
9
|
+
*/
|
|
10
|
+
import { DiskLruCache } from '../../cache';
|
|
11
|
+
import type { CacheEntry, HttpCacheConfig } from '../types';
|
|
12
|
+
export declare class HttpCache {
|
|
13
|
+
private memoryCache;
|
|
14
|
+
private diskCache;
|
|
15
|
+
constructor(config: HttpCacheConfig);
|
|
16
|
+
/**
|
|
17
|
+
* 获取缓存
|
|
18
|
+
* @param key 缓存 key
|
|
19
|
+
* @returns 缓存条目的深拷贝,未命中或失败返回 null
|
|
20
|
+
*/
|
|
21
|
+
get<T>(key: string): Promise<CacheEntry<T> | null>;
|
|
22
|
+
/**
|
|
23
|
+
* 设置缓存(失败静默忽略,不影响业务)
|
|
24
|
+
* @param key 缓存 key
|
|
25
|
+
* @param data 数据
|
|
26
|
+
* @param ttl 过期时间 (ms)
|
|
27
|
+
*/
|
|
28
|
+
set<T>(key: string, data: T, ttl?: number): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* 删除缓存(失败静默忽略)
|
|
31
|
+
*/
|
|
32
|
+
delete(key: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* 清空所有缓存(失败静默忽略)
|
|
35
|
+
*/
|
|
36
|
+
clear(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* 仅获取内存缓存(同步,失败返回 null)
|
|
39
|
+
* @returns 缓存条目的深拷贝
|
|
40
|
+
*/
|
|
41
|
+
getFromMemory<T>(key: string): CacheEntry<T> | null;
|
|
42
|
+
/**
|
|
43
|
+
* 仅设置内存缓存(同步,失败静默忽略)
|
|
44
|
+
*/
|
|
45
|
+
setToMemory<T>(key: string, data: T, ttl?: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* 检查缓存是否存在(会检查过期,失败返回 false)
|
|
48
|
+
*/
|
|
49
|
+
has(key: string): Promise<boolean>;
|
|
50
|
+
/**
|
|
51
|
+
* 获取磁盘缓存实例(用于高级操作)
|
|
52
|
+
*/
|
|
53
|
+
getDiskCache(): DiskLruCache;
|
|
54
|
+
/**
|
|
55
|
+
* 刷新磁盘缓存元数据(失败静默忽略)
|
|
56
|
+
*/
|
|
57
|
+
flush(): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=HttpCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpCache.d.ts","sourceRoot":"","sources":["../../../src/http/cache/HttpCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG3D,qBAAa,SAAS;IAClB,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAc;gBAEnB,MAAM,EAAE,eAAe;IAcnC;;;;OAIG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAwCxD;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlE;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;OAGG;IACH,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAgBnD;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,GAAE,MAAU,GAAG,IAAI;IAc3D;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBxC;;OAEG;IACH,YAAY,IAAI,YAAY;IAI5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO/B"}
|