@longzai-intelligence-transport/http-adapter-taro 0.1.0 → 0.1.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.
- package/dist/index.d.ts +135 -2
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ApiError, ApiResponse, ApiResponse as ApiResponse$1, AuthStrategy, CsrfProvider, HttpAdapter, HttpAdapter as HttpAdapter$1, HttpClient, HttpClient as HttpClient$1, HttpClientConfig, HttpClientConfig as HttpClientConfig$1, RequestConfig, RequestConfig as RequestConfig$1, RequestInterceptor, RequestInterceptorContext, ResponseInterceptor, ResponseInterceptorContext, TaroAdapterConfig, TaroAdapterConfig as TaroAdapterConfig$1, TokenProvider, TokenProvider as TokenProvider$1, createAuthStrategyInterceptor, createAuthTokenInterceptor, createCsrfInterceptor, createLoggingRequestInterceptor, createLoggingResponseInterceptor, createResponseTransformerInterceptor, createRetryInterceptor, createValidationInterceptor } from "@longzai-intelligence-transport/http-core";
|
|
1
|
+
import { ApiError, ApiResponse, ApiResponse as ApiResponse$1, AuthStrategy, CreateApiFunction, CsrfProvider, CsrfProvider as CsrfProvider$1, HttpAdapter, HttpAdapter as HttpAdapter$1, HttpClient, HttpClient as HttpClient$1, HttpClientConfig, HttpClientConfig as HttpClientConfig$1, InferRouteParams, InferRouteQuery, RequestConfig, RequestConfig as RequestConfig$1, RequestInterceptor, RequestInterceptorContext, ResponseInterceptor, ResponseInterceptorContext, RouteDefinition, StreamResponseRoute, TaroAdapterConfig, TaroAdapterConfig as TaroAdapterConfig$1, TokenProvider, TokenProvider as TokenProvider$1, createAuthStrategyInterceptor, createAuthTokenInterceptor, createCsrfInterceptor, createLoggingRequestInterceptor, createLoggingResponseInterceptor, createResponseTransformerInterceptor, createRetryInterceptor, createValidationInterceptor } from "@longzai-intelligence-transport/http-core";
|
|
2
2
|
import Taro from "@tarojs/taro";
|
|
3
3
|
|
|
4
4
|
//#region src/taro.adapter.d.ts
|
|
@@ -163,4 +163,137 @@ type QueryParams = Record<string, string | number | boolean | undefined>;
|
|
|
163
163
|
*/
|
|
164
164
|
declare function createTaroHttpClient(config: HttpClientConfig$1): TaroHttpClient;
|
|
165
165
|
//#endregion
|
|
166
|
-
|
|
166
|
+
//#region src/stream-api-client.d.ts
|
|
167
|
+
/**
|
|
168
|
+
* 流式 API 客户端工厂(Taro 小程序场景)
|
|
169
|
+
*
|
|
170
|
+
* 对流式路由返回 Promise<string>(临时文件路径 tempFilePath),
|
|
171
|
+
* 对 JSON 路由复用 core createApiClientFactory。
|
|
172
|
+
* Taro 环境用 Taro.downloadFile(非 fetch),返回临时文件路径供消费方保存或预览。
|
|
173
|
+
* downloadFile 通过依赖注入提供(必填),避免顶层 import @tarojs/taro 导致测试环境加载失败。
|
|
174
|
+
*/
|
|
175
|
+
/**
|
|
176
|
+
* Taro.downloadFile 函数类型(平台无关声明)
|
|
177
|
+
*
|
|
178
|
+
* 不依赖 @tarojs/taro 的类型,由消费方注入实际实现(通常为 Taro.downloadFile)。
|
|
179
|
+
*/
|
|
180
|
+
type TaroDownloadFile = (options: {
|
|
181
|
+
/**
|
|
182
|
+
* 请求 URL
|
|
183
|
+
*/
|
|
184
|
+
url: string;
|
|
185
|
+
/**
|
|
186
|
+
* 请求头
|
|
187
|
+
*/
|
|
188
|
+
header?: Record<string, string>;
|
|
189
|
+
}) => Promise<{
|
|
190
|
+
/**
|
|
191
|
+
* 临时文件路径
|
|
192
|
+
*/
|
|
193
|
+
tempFilePath: string;
|
|
194
|
+
/**
|
|
195
|
+
* HTTP 状态码
|
|
196
|
+
*/
|
|
197
|
+
statusCode: number;
|
|
198
|
+
/**
|
|
199
|
+
* 错误信息
|
|
200
|
+
*/
|
|
201
|
+
errMsg?: string;
|
|
202
|
+
}>;
|
|
203
|
+
/**
|
|
204
|
+
* 流式路由响应类型映射(Taro 场景:临时文件路径 string)
|
|
205
|
+
*
|
|
206
|
+
* Taro.downloadFile 返回 tempFilePath(临时文件路径),消费方用 Taro.saveFile
|
|
207
|
+
* 或 saveImageToPhotosAlbum 保存。非流式路由映射为 never。
|
|
208
|
+
*
|
|
209
|
+
* @typeParam TRoute - 路由定义类型
|
|
210
|
+
*/
|
|
211
|
+
type InferStreamRouteResponse<TRoute extends RouteDefinition> = TRoute extends StreamResponseRoute ? string : never;
|
|
212
|
+
/**
|
|
213
|
+
* 流式下载函数签名
|
|
214
|
+
*
|
|
215
|
+
* 参数与 core GET 函数一致,返回 Promise<string>(tempFilePath)。
|
|
216
|
+
*
|
|
217
|
+
* @typeParam TRoute - 路由定义类型
|
|
218
|
+
*/
|
|
219
|
+
type StreamDownloadFunction<TRoute extends RouteDefinition> = InferRouteParams<TRoute> extends undefined ? InferRouteQuery<TRoute> extends undefined ? () => Promise<InferStreamRouteResponse<TRoute>> : (query?: InferRouteQuery<TRoute>) => Promise<InferStreamRouteResponse<TRoute>> : InferRouteQuery<TRoute> extends undefined ? (params: InferRouteParams<TRoute>) => Promise<InferStreamRouteResponse<TRoute>> : (params: InferRouteParams<TRoute>, query?: InferRouteQuery<TRoute>) => Promise<InferStreamRouteResponse<TRoute>>;
|
|
220
|
+
/**
|
|
221
|
+
* Taro API mapped type
|
|
222
|
+
*
|
|
223
|
+
* 流式路由映射为 StreamDownloadFunction,JSON 路由映射为 core CreateApiFunction。
|
|
224
|
+
*
|
|
225
|
+
* @typeParam TRoutes - 路由定义集合类型
|
|
226
|
+
*/
|
|
227
|
+
type TaroApi<TRoutes extends Record<string, RouteDefinition>> = { [K in keyof TRoutes]: TRoutes[K] extends StreamResponseRoute ? StreamDownloadFunction<TRoutes[K]> : CreateApiFunction<TRoutes[K]> };
|
|
228
|
+
/**
|
|
229
|
+
* 流式下载配置(Taro 环境)
|
|
230
|
+
*/
|
|
231
|
+
type StreamDownloadConfig = {
|
|
232
|
+
/**
|
|
233
|
+
* API 基础 URL
|
|
234
|
+
*/
|
|
235
|
+
baseUrl: string;
|
|
236
|
+
/**
|
|
237
|
+
* 自定义请求头
|
|
238
|
+
*/
|
|
239
|
+
headers?: Record<string, string>;
|
|
240
|
+
/**
|
|
241
|
+
* Token 提供者(用于 Authorization 头)
|
|
242
|
+
*/
|
|
243
|
+
tokenProvider?: TokenProvider$1;
|
|
244
|
+
/**
|
|
245
|
+
* CSRF 提供者(用于 X-CSRF-Token 头)
|
|
246
|
+
*/
|
|
247
|
+
csrfProvider?: CsrfProvider$1;
|
|
248
|
+
/**
|
|
249
|
+
* Taro.downloadFile 函数(依赖注入,必填)
|
|
250
|
+
*
|
|
251
|
+
* 由消费方提供(通常为 Taro.downloadFile)。测试时可注入 mock。
|
|
252
|
+
*/
|
|
253
|
+
downloadFile: TaroDownloadFile;
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* 创建流式下载函数(Taro 环境)
|
|
257
|
+
*
|
|
258
|
+
* 工厂模式:创建时绑定路由定义与配置,返回的函数调用 Taro.downloadFile 并返回 tempFilePath。
|
|
259
|
+
* 错误路径(statusCode >= 400)抛出 Error,含 statusCode 与 errMsg(Taro 环境无法直接获取
|
|
260
|
+
* 错误响应 body,消费方根据 statusCode 判断)。
|
|
261
|
+
*
|
|
262
|
+
* @typeParam TRoute - 流式路由定义类型
|
|
263
|
+
* @param route - 流式路由定义
|
|
264
|
+
* @param config - 流式下载配置
|
|
265
|
+
* @returns 流式下载函数,返回 Promise<string>(tempFilePath)
|
|
266
|
+
* @throws {@link Error} 类型断言失败时抛出
|
|
267
|
+
*/
|
|
268
|
+
declare function createStreamDownloadFunction<TRoute extends StreamResponseRoute>(route: TRoute, config: StreamDownloadConfig): StreamDownloadFunction<TRoute>;
|
|
269
|
+
/**
|
|
270
|
+
* 创建 Taro API 客户端 factory
|
|
271
|
+
*
|
|
272
|
+
* 返回的 factory 接受 routes 集合,生成 TaroApi:
|
|
273
|
+
* - JSON 路由:复用 core createApiClientFactory,走 HttpClient.request
|
|
274
|
+
* - 流式路由:走 Taro.downloadFile,返回 Promise<string>(tempFilePath)
|
|
275
|
+
*
|
|
276
|
+
* @param client - core HttpClient(用于 JSON 路由)
|
|
277
|
+
* @param streamConfig - 流式下载配置
|
|
278
|
+
* @returns API factory,接受 routes 返回 TaroApi
|
|
279
|
+
* @throws {@link Error} 类型断言失败时抛出
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* const factory = createTaroApiClientFactory(client, {
|
|
284
|
+
* baseUrl: 'https://api.example.com',
|
|
285
|
+
* tokenProvider,
|
|
286
|
+
* });
|
|
287
|
+
* const api = factory(orderRoutes);
|
|
288
|
+
*
|
|
289
|
+
* // JSON 路由:Promise<ApiResponse<Order>>
|
|
290
|
+
* const order = await api.detail({ id: '123' });
|
|
291
|
+
*
|
|
292
|
+
* // 流式路由:Promise<string>(tempFilePath)
|
|
293
|
+
* const tempPath = await api.downloadExport({ taskId: 'abc' });
|
|
294
|
+
* await Taro.saveFile({ tempFilePath: tempPath, filePath: `${wx.env.USER_DATA_PATH}/export.xlsx` });
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
declare function createTaroApiClientFactory(client: HttpClient$1, streamConfig: StreamDownloadConfig): <TRoutes extends Record<string, RouteDefinition>>(routes: TRoutes) => TaroApi<TRoutes>;
|
|
298
|
+
//#endregion
|
|
299
|
+
export { type ApiError, type ApiResponse, type AuthStrategy, type CsrfProvider, type HttpAdapter, type HttpClient, type HttpClientConfig, type InferStreamRouteResponse, type RequestConfig, type RequestInterceptor, type RequestInterceptorContext, type ResponseInterceptor, type ResponseInterceptorContext, type StreamDownloadConfig, type StreamDownloadFunction, type TaroAdapterConfig, type TaroApi, type TaroHttpClient, type TaroTokenStorageConfig, type TokenProvider, createAuthStrategyInterceptor, createAuthTokenInterceptor, createCsrfInterceptor, createLoggingRequestInterceptor, createLoggingResponseInterceptor, createResponseTransformerInterceptor, createRetryInterceptor, createStreamDownloadFunction, createTaroAdapter, createTaroApiClientFactory, createTaroHttpClient, createTaroTokenProvider, createTaroTokenSetter, createValidationInterceptor };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{buildPath as e,createApiClientFactory as t,createAuthStrategyInterceptor as n,createAuthTokenInterceptor as r,createCsrfInterceptor as i,createInterceptorExecutor as a,createLoggingRequestInterceptor as o,createLoggingResponseInterceptor as s,createRequestInterceptorsFromConfig as c,createResponseInterceptorsFromConfig as l,createResponseTransformerInterceptor as u,createRetryInterceptor as d,createValidationInterceptor as f,isLegacyConfig as p,isStreamRoute as m,isType as h,warnDeprecatedConfig as g}from"@longzai-intelligence-transport/http-core";function _(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function v(e){return e!=null}const y={GET:`GET`,POST:`POST`,PUT:`PUT`,PATCH:`PATCH`,DELETE:`DELETE`,HEAD:`HEAD`,OPTIONS:`OPTIONS`};function b(e){return e in y}function x(e){if(e!=null)return typeof e==`string`||e instanceof ArrayBuffer||_(e)?e:JSON.stringify(e)}function S(e){if(e)return e;let t=globalThis;if(_(t)&&`Taro`in t){let e=t.Taro;if(v(e))return e}throw Error(`Taro 实例未找到,请确保已安装 @tarojs/taro 或通过参数传入 Taro 实例`)}function C(e,t){let n=e?.timeout??3e4,r=S(t);return{async execute(e){let t=e.method.toUpperCase(),i=b(t)?y[t]:`GET`,a={url:e.url,method:i,header:e.headers,timeout:n,data:x(e.body)};if(e.params){let t=Object.entries(e.params).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(String(t))}`).join(`&`);a.url=`${a.url}?${t}`}let o=await r.request(a),s={};if(o.header)for(let[e,t]of Object.entries(o.header))s[e.toLowerCase()]=String(t);return{status:o.statusCode,headers:s,data:o.data}}}}function w(){let e=globalThis;if(_(e)&&`Taro`in e){let t=e.Taro;if(v(t))return t}throw Error(`Taro 未找到,请确保已安装 @tarojs/taro 或通过全局注入 Taro 实例`)}function T(e){let t=e?.tokenKey??`access_token`,n=e?.storageType??`storage`;return{getToken:async()=>{try{let e=w();return n===`asyncStorage`?(await e.getStorage({key:t})).data??null:e.getStorageSync(t)??null}catch{return null}}}}function E(e){let t=e?.tokenKey??`access_token`,n=e?.storageType??`storage`,r=async e=>{let r=w();if(e===null){n===`asyncStorage`?await r.removeStorage({key:t}):r.removeStorageSync(t);return}n===`asyncStorage`?await r.setStorage({key:t,data:e}):r.setStorageSync(t,e)};return{setToken:r,removeToken:async()=>{await r(null)}}}function D(e,t){if(!t)return e;let n=new URLSearchParams;Object.entries(t).forEach(([e,t])=>{t!==void 0&&n.append(e,String(t))});let r=n.toString();return r?`${e}?${r}`:e}function O(e,t,n,r,i){return{url:`${e}${t}`,method:n,headers:i?.headers??{},body:r,config:i,metadata:{}}}function k(e,t,n){let r=e.path;if(t&&Object.entries(t).forEach(([e,t])=>{r=r.replace(`:${e}`,String(t))}),n){let e=new URLSearchParams;Object.entries(n).forEach(([t,n])=>{n!==void 0&&e.append(t,String(n))});let t=e.toString();t&&(r=`${r}?${t}`)}return r}async function A(e,t,n,r,i,a,o){let s=O(t,i,r,a,{...o,headers:{...n,...o?.headers}});return e.execute(s)}function j(e){if(v(e))return e;throw Error(`响应类型不匹配`)}function M(e,t,n){return async(r,i,a)=>j(await A(e,t,n,`GET`,D(r,i),void 0,a))}function N(e,t,n,r){return async(i,a,o)=>j(await A(e,t,n,r,i,a,o))}function P(e,t,n){return async(r,i)=>j(await A(e,t,n,`DELETE`,r,void 0,i))}function F(e,t,n){return{get:M(e,t,n),post:N(e,t,n,`POST`),put:N(e,t,n,`PUT`),patch:N(e,t,n,`PATCH`),delete:P(e,t,n)}}function I(e){let{baseUrl:t,timeout:n=3e4,headers:r,onUnauthorized:i}=e;p(e)&&g(e);let o=c(e),s=l(e),u=C({timeout:n}),d=a({requestInterceptors:o,responseInterceptors:s,onUnauthorized:i},u);return{request:async e=>{let{route:n,params:i,query:a,body:o,config:s}=e,c=k(n,i,a);return j(await A(d,t,r,n.method,c,o,s))},...F(d,t,r)}}function L(t,n){let r=async(r,i)=>{let a=n.baseUrl+e(t.path,r,i),o={...n.headers};if(n.tokenProvider){let e=await n.tokenProvider.getToken();e!==null&&(o.Authorization=`Bearer ${e}`)}if(n.csrfProvider){let e=await n.csrfProvider.getToken();e!==null&&(o[`X-CSRF-Token`]=e)}let s=await n.downloadFile({url:a,header:o});if(s.statusCode>=400)throw Error(`流式下载失败:${s.statusCode} ${s.errMsg??``}`);return s.tempFilePath};if(h(r))return r;throw Error(`流式下载函数构建失败`)}function R(e,n){let r=t(e);return e=>{let t={...r(e)};for(let[r,i]of Object.entries(e))i&&m(i)&&(t[r]=L(i,n));if(h(t))return t;throw Error(`API 客户端构建失败`)}}export{n as createAuthStrategyInterceptor,r as createAuthTokenInterceptor,i as createCsrfInterceptor,o as createLoggingRequestInterceptor,s as createLoggingResponseInterceptor,u as createResponseTransformerInterceptor,d as createRetryInterceptor,L as createStreamDownloadFunction,C as createTaroAdapter,R as createTaroApiClientFactory,I as createTaroHttpClient,T as createTaroTokenProvider,E as createTaroTokenSetter,f as createValidationInterceptor};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longzai-intelligence-transport/http-adapter-taro",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"adapter",
|
|
6
6
|
"http",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"clean": "rimraf dist out .cache"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@longzai-intelligence-transport/http-core": "0.1.
|
|
40
|
+
"@longzai-intelligence-transport/http-core": "0.1.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@tarojs/taro": "^4.2.0",
|