@longzai-intelligence-transport/http-core 0.1.5 → 0.1.6

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 CHANGED
@@ -1009,6 +1009,12 @@ type CsrfInterceptorConfig = {
1009
1009
  * 令牌获取失败时的行为,默认 'warn'(输出警告)
1010
1010
  */
1011
1011
  onTokenError?: 'warn' | 'throw' | 'ignore';
1012
+ /**
1013
+ * 日志记录器实例(用于令牌获取失败时输出警告)
1014
+ *
1015
+ * 默认 undefined:警告静默(不输出)
1016
+ */
1017
+ logger?: Logger;
1012
1018
  };
1013
1019
  /**
1014
1020
  * 创建 CSRF 令牌拦截器
@@ -1308,8 +1314,9 @@ declare function isLegacyConfig(config: HttpClientConfig): boolean;
1308
1314
  * 输出 deprecation 警告
1309
1315
  *
1310
1316
  * @param config - HTTP 客户端配置
1317
+ * @param logger - 可选日志记录器实例(未传入时警告静默)
1311
1318
  */
1312
- declare function warnDeprecatedConfig(config: HttpClientConfig): void;
1319
+ declare function warnDeprecatedConfig(config: HttpClientConfig, logger?: Logger): void;
1313
1320
  //#endregion
1314
1321
  //#region src/contract/client.types.d.ts
1315
1322
  /**
@@ -1530,6 +1537,14 @@ type HttpClientConfig = {
1530
1537
  * - 不传则使用默认值(开发环境 warn)
1531
1538
  */
1532
1539
  validation?: ValidationInterceptorConfig | false;
1540
+ /**
1541
+ * 日志记录器实例
1542
+ *
1543
+ * 用于 deprecation 警告、CSRF 令牌获取失败等内部警告输出。
1544
+ * 默认 undefined:所有警告静默。
1545
+ * 消费方按运行时注入对应 preset(如 logger-preset-node / logger-preset-browser)
1546
+ */
1547
+ logger?: Logger;
1533
1548
  };
1534
1549
  //#endregion
1535
1550
  //#region src/schemas/common.schema.d.ts
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import*as e from"zod";import{CursorPaginationParamsSchema as t,OffsetPaginationParamsSchema as n,PAGINATION_DEFAULTS as r,PaginationParamsSchema as i,SortParamsSchema as a,calculateOffset as o,calculateTotalPages as s,createCompactPaginatedResultSchema as c,createPaginatedResult as l,createPaginatedResult as u,createPaginatedResultSchema as d,createPaginationDefaults as f,createSortParamsSchema as p,normalizePagination as ee}from"@longzai-intelligence/pagination";import{createOptionalStringSchema as m,defineEnumSchema as te}from"@longzai-intelligence/zod-utils";import{isSuccess as ne}from"@longzai-intelligence/shared-kernel";import h from"axios";import{createNodeLogger as g}from"@longzai-intelligence/logger-preset-node";const _=e.object({code:e.string(),message:e.string(),details:e.record(e.string(),e.unknown()).optional()}),v=t=>e.object({success:e.boolean(),data:t.optional(),message:e.string().optional(),error:_.optional(),timestamp:e.number().optional()}),re=t=>e.object({items:e.array(t),total:e.number()}),ie=e=>d(e),ae=e=>c(e),oe=v(e.void()),se=e.object({id:e.string()}),ce=i.extend({page:e.coerce.number().int().min(1).optional().default(r.page),pageSize:e.coerce.number().int().min(r.minPageSize).max(r.maxPageSize).optional().default(r.pageSize)});function le(t){let n=t?.pageSizeField??`pageSize`,r=f({page:t?.defaultPage,pageSize:t?.defaultPageSize,maxPageSize:t?.maxPageSize,minPageSize:t?.minPageSize});return e.object({page:e.coerce.number().int().min(1).optional().default(r.page),[n]:e.coerce.number().int().min(r.minPageSize).max(r.maxPageSize).optional().default(r.pageSize)})}const ue=e.object({filter:m(),sortBy:a.shape.sortBy,sortOrder:a.shape.sortOrder});function de(t){let n=p(t);return e.object({filter:m(),sortBy:n.shape.sortBy,sortOrder:n.shape.sortOrder})}const fe=e.object({startDate:m(),endDate:m()}),pe=e.object({keyword:m()});function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e){return e!=null}const x=te([`UNKNOWN`,`INVALID_PARAMETER`,`RESOURCE_NOT_FOUND`,`RESOURCE_ALREADY_EXISTS`,`OPERATION_FAILED`,`PERMISSION_DENIED`,`UNAUTHORIZED`,`TOKEN_EXPIRED`,`TOKEN_INVALID`,`LOGIN_FAILED`,`ACCOUNT_DISABLED`,`PASSWORD_INCORRECT`,`DATABASE_ERROR`,`EXTERNAL_SERVICE_ERROR`,`RATE_LIMIT_EXCEEDED`,`DUPLICATE_REQUEST`,`VALIDATION_ERROR`],`通用错误码`),S={UNKNOWN:`未知错误`,INVALID_PARAMETER:`参数无效`,RESOURCE_NOT_FOUND:`资源不存在`,RESOURCE_ALREADY_EXISTS:`资源已存在`,OPERATION_FAILED:`操作失败`,PERMISSION_DENIED:`权限不足`,UNAUTHORIZED:`未授权`,TOKEN_EXPIRED:`令牌已过期`,TOKEN_INVALID:`令牌无效`,LOGIN_FAILED:`登录失败`,ACCOUNT_DISABLED:`账户已禁用`,PASSWORD_INCORRECT:`密码错误`,DATABASE_ERROR:`数据库错误`,EXTERNAL_SERVICE_ERROR:`外部服务错误`,RATE_LIMIT_EXCEEDED:`请求频率超限`,DUPLICATE_REQUEST:`重复请求`,VALIDATION_ERROR:`参数验证失败`};function me(e){return S[e]||S.UNKNOWN}const he={UNAUTHORIZED:401,TOKEN_EXPIRED:401,TOKEN_INVALID:401,LOGIN_FAILED:401,ACCOUNT_DISABLED:401,PASSWORD_INCORRECT:401,PERMISSION_DENIED:403,RESOURCE_NOT_FOUND:404,INVALID_PARAMETER:400,VALIDATION_ERROR:400,DATABASE_ERROR:500,EXTERNAL_SERVICE_ERROR:500};function ge(e){return he[e]??400}function _e(e,t){let n=[...x.options,...e];if(b(n))return te(n,t??`错误码`);throw Error(`错误码合并失败`)}const ve=e.object({code:x,message:e.string(),data:e.unknown().nullable()});function ye(e){if(b(e))return e;throw Error(`路由定义创建失败`)}function be(e,t,n){let r=e;if(t)for(let[e,n]of Object.entries(t))r=r.replace(`:${e}`,String(n));if(n){let e=new URLSearchParams;for(let[t,r]of Object.entries(n))r!==void 0&&e.append(t,String(r));let t=e.toString();t&&(r=`${r}?${t}`)}return r}function xe(e){if(!e)return``;let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.append(n,String(r));let n=t.toString();return n?`?${n}`:``}function Se(e,t){return`${e}${t}`}function Ce(e){return`basePath`in e?typeof e.basePath==`string`:!1}function we(e){let{parent:t,prefix:n,version:r,auth:i,tags:a}=e,o=n??``,s,c,l;return t?(s=o===``?t.prefix:`${t.prefix}/${o}`,c=i??t.auth,l=a??t.tags):(s=r?o.startsWith(`/`)?`/${r}${o}`:o===``?`/${r}`:`/${r}/${o}`:o,c=i,l=a),{fullPrefix:s,finalAuth:c,finalTags:l}}function Te(e,t){let n={};for(let[r,i]of Object.entries(e))Ce(i)?n[r]=i:n[r]=t(i);return n}function Ee(e,t,n){function r(r){let i=[...n??[],...r.tags??[]],a=r.auth??t,o={...r,path:Se(e,r.path),basePath:r.path,tags:i.length>0?i:void 0,auth:a};if(b(o))return o;throw Error(`路由定义创建失败`)}return r}function De(e){let{routes:t}=e,{fullPrefix:n,finalAuth:r,finalTags:i}=we(e),a=Ee(n,r,i),o=b(n)?n:void 0;if(o===void 0)throw Error(`路径前缀类型推断失败`);let s={prefix:o,version:e.version,auth:r,tags:i,defineRoute:a};if(!t){if(b(s))return s;throw Error(`路由分组创建失败`)}let c=Te(t,e=>a(e)),l={...s,routes:Object.freeze(c)};if(b(l))return l;throw Error(`路由分组创建失败`)}function C(e){return e instanceof File}function w(e){return e instanceof Blob}function T(e,t){let n=new FormData,r=new Set(t?.fileFields??[]),i=t?.arrayFormat??`brackets`,a=(e,t)=>{if(t!=null){if(C(t)||w(t)){n.append(e,t);return}if(r.has(e)&&typeof t==`string`){n.append(e,t);return}if(Array.isArray(t)){t.forEach((t,n)=>{a(i===`indices`?`${e}[${n}]`:i===`brackets`?`${e}[]`:e,t)});return}if(typeof t==`object`&&t){y(t)&&Object.entries(t).forEach(([t,n])=>{a(`${e}[${t}]`,n)});return}n.append(e,String(t))}};return Object.entries(e).forEach(([e,t])=>{a(e,t)}),n}function E(e){return e===`formData`}function Oe(e){return{hasParams:`params`in e&&e.params!==void 0,hasQuery:`query`in e&&e.query!==void 0,hasBody:`body`in e&&e.body!==void 0}}function ke(e,t){return t&&y(e)&&!(e instanceof FormData)?T(e):e}function Ae(e,t){let n=Oe(e),r=E(e.contentType),i=e.method!==`GET`&&e.method!==`DELETE`,a=(...a)=>{let o=0,s=n.hasParams?a[o++]:void 0,c=i&&n.hasBody?a[o++]:void 0,l=n.hasQuery?a[o]:void 0,u=ke(c,r),d=b(s)?s:void 0,f=b(l)?l:void 0,p=b(u)?u:void 0;return t.request({route:e,params:d,query:f,body:p})};if(b(a))return a;throw Error(`路由函数创建失败`)}function je(e,t){let n={};for(let r in e)if(Object.prototype.hasOwnProperty.call(e,r)){let i=e[r];i&&(n[r]=Ae(i,t))}if(b(n))return n;throw Error(`API 函数集合创建失败`)}function Me(e,t){return je(e,t)}function Ne(e){return t=>Me(t,e)}const D={success(e,t){return{success:!0,data:e,message:t,timestamp:Date.now()}},data(e){return{success:!0,data:e,timestamp:Date.now()}},message(e){return{success:!0,data:void 0,message:e,timestamp:Date.now()}},fail(e,t){return{success:!1,message:e,data:t,timestamp:Date.now()}},empty(){return{success:!0,data:void 0,timestamp:Date.now()}}},Pe={empty(){return{items:[],total:0}},from(e){return{items:e,total:e.length}},withTotal(e,t){return{items:e,total:t}},paginated(e,t,n,r){return u(e,t,n,r)}};function Fe(e){return{success:e=>D.data(e),successWithMessage:(e,t)=>D.success(e,t),fail:(e,t)=>t?{success:!1,error:t,message:e,timestamp:Date.now()}:D.fail(e),empty:()=>D.empty()}}function Ie(e){return e=>D.data(e)}function Le(e){return()=>D.empty()}function Re(e){return e=>e}function ze(e){if(ne(e))return D.data(e.value);throw e.error}function O(e){return e.responseType===`stream`}function Be(e){return e.responseType!==`stream`}function k(e){let t=h.create({timeout:e?.timeout??3e4});return{async execute(e){let n=await t.request({url:e.url,method:e.method,headers:e.headers,data:e.body,params:e.query,signal:e.config?.signal,timeout:e.config?.timeout});return{status:n.status,headers:b(n.headers)?n.headers:{},data:n.data}}}}async function A(e,t){let n=e;for(let e of t)e.onRequest&&(n=await e.onRequest(n));return n}async function j(e,t,n){let r=e;for(let e=n.length-1;e>=0;e--){let i=n[e];i?.onError&&(r=await i.onError(r,t))}return r}async function M(e,t,n){let r=e;for(let e of n)e.onResponse&&(r=await e.onResponse(r,t));return r}async function N(e,t,n){let r=e;for(let e=n.length-1;e>=0;e--){let i=n[e];if(i?.onError){let e=await i.onError(r,t);if(P(e))return e;r=e}}return r}function P(e){return typeof e==`object`&&!!e&&`success`in e&&typeof e.success==`boolean`}function F(e){let t={code:`UNKNOWN_ERROR`,message:`请求失败`};return e instanceof Error&&(e.message.includes(`timeout`)?(t.code=`TIMEOUT`,t.message=`请求超时`):e.message.includes(`network`)||e.message.includes(`Network`)?(t.code=`NETWORK_ERROR`,t.message=`网络错误`):t.message=e.message),{success:!1,error:t}}async function Ve(e,t){try{return await A(e,t)}catch(n){return F(await j(n,e,t))}}async function He(e,t,n){try{return{response:await t.execute(e)}}catch(t){let r=await N(t,{status:0,headers:{},request:e},n);return P(r)?{error:r}:{error:F(r)}}}function Ue(e,t,n){let{status:r,headers:i,data:a}=e,o={status:r,headers:i,request:t},s;return s=P(a)?a:{success:!0,data:a},r===401&&n&&n(),{response:s,context:o}}async function We(e,t,n){let r=await Ve(e,t.requestInterceptors);if(!(`method`in r))return r;let i=r,a=await He(i,n,t.responseInterceptors);if(a.error)return a.error;let{response:o,context:s}=Ue(a.response,i,t.onUnauthorized);try{return await M(o,s,t.responseInterceptors)}catch(e){let n=await N(e,s,t.responseInterceptors);return P(n)?n:F(n)}}function I(e,t){return{execute:n=>We(n,e,t),executeRequestInterceptors:t=>A(t,e.requestInterceptors),executeResponseInterceptors:(t,n)=>M(t,n,e.responseInterceptors),handleRequestError:(t,n)=>j(t,n,e.requestInterceptors),handleResponseError:(t,n)=>N(t,n,e.responseInterceptors)}}function Ge(e){return{requestInterceptors:e.requestInterceptors??[],responseInterceptors:e.responseInterceptors??[],onUnauthorized:e.onUnauthorized}}function L(e,t){let n=t?.withAuth??!0,r=t?.tokenPrefix??`Bearer`,i=t?.headerName??`Authorization`;return{async onRequest(t){if(!(t.config?.withAuth??n))return t;let a=await e.getToken();return a&&(t.headers[i]=`${r} ${a}`),t}}}function R(e){return{async onRequest(t){switch(e.type){case`bearer`:{let n=await e.tokenProvider.getToken();n&&(t.headers.Authorization=`Bearer ${n}`);break}case`cookie`:t.metadata.credentials=e.credentials??`include`;break;case`custom`:{let n=e.injector({url:t.url,method:t.method,headers:t.headers,params:t.params,query:t.query,body:t.body});n.headers&&Object.assign(t.headers,n.headers);break}case`none`:break}return t}}}function Ke(e){return{type:`bearer`,tokenProvider:e}}function qe(e){return{type:`cookie`,credentials:e}}function Je(e){return{type:`custom`,injector:e}}function Ye(){return{type:`none`}}const Xe=g(`core/src/interceptors/csrf.interceptor`);function z(e,t){let n=t?.headerName??`X-CSRF-Token`,r=t?.injectAll??!1,i=t?.onTokenError??`warn`;return{async onRequest(t){return!(r||(t.route?.csrf??!1))||!(t.config?.withCsrf??!0)?t:Ze(t,e,n,i)}}}async function Ze(e,t,n,r){try{let r=await t.getToken();r&&(e.headers[n]=r)}catch(e){switch(r){case`warn`:Xe.warn(`[http-utils] CSRF 令牌获取失败:`,e);break;case`throw`:throw e;case`ignore`:break}}return e}function B(e){return{async onResponse(t,n){try{let n=e(t.data);return{success:n.success,data:n.data,message:n.message,error:n.error,timestamp:n.timestamp}}catch{return{success:!1,error:{code:`TRANSFORM_ERROR`,message:`响应转换失败`}}}}}}const V=[408,429,500,502,503,504];function Qe(e){let t=e?.maxRetries??0,n=e?.baseDelay??1e3,r=e?.retryOn??V,i=e?.retryCondition,a=typeof e?.retryDelay==`function`?e.retryDelay:t=>{let r=e?.retryDelay??n*2**t;return typeof r==`number`?r:n*2**t};return{onError(e,n){let o=Number(n.request.metadata.retryCount);return o>=t||!(i?i(e,n):r.includes(n.status))?e:(n.request.metadata.retryCount=o+1,{success:!1,error:{code:`RETRY_PENDING`,message:`请求将在 ${a(o)}ms 后重试 (${o+1}/${t})`},metadata:{retryCount:o+1,retryDelay:a(o)}})}}}function $e(e,t=1e3){return t*2**e}function H(e){let t=e?.mode??`development`,n=e?.onValidationError??`warn`,r=e?.logger,i=()=>t===!0?!0:t===!1?!1:t===`development`?process.env.NODE_ENV===`development`:!1;return{async onResponse(e,t){if(!i())return e;let a=t.request.route;if(!a||O(a))return e;let o=a.response;return o?et(e,o,t,n,r):e}}}function et(e,t,n,r,i){if(e.success&&e.data!==void 0){let a=t.safeParse(e.data);if(!a.success){let e=`响应验证失败: ${n.request.url}`;switch(r){case`warn`:i&&i.warn(e,{error:a.error});break;case`throw`:throw Error(`${e}: ${a.error}`,{cause:a.error});case`ignore`:break}}}return e}function U(e,t,n){let r=`[${new Date().toISOString()}] [${e.toUpperCase()}]`;n===void 0?logger.info(r,t):logger.info(r,t,n)}function W(e){let t=e?.level??`info`,n=e?.logBody??!1,r=e?.logger??U;return{onRequest(e){let i=Date.now();e.metadata.startTime=i;let a={method:e.method,url:e.url};return n&&e.body&&(a.body=e.body),r(t,`请求开始`,a),e},onError(e,t){let n=Date.now()-Number(t.metadata.startTime);return r(`error`,`请求失败`,{method:t.method,url:t.url,duration:`${n}ms`,error:e}),e}}}function G(e){let t=e?.level??`info`,n=e?.logResponse??!1,r=e?.logger??U;return{onResponse(e,i){let a=Date.now()-Number(i.request.metadata.startTime),o={method:i.request.method,url:i.request.url,status:i.status,duration:`${a}ms`,success:e.success};return n&&e.data&&(o.data=e.data),!e.success&&e.error?(o.error=e.error,r(`warn`,`请求完成(失败)`,o)):r(t,`请求完成`,o),e},onError(e,t){let n=Date.now()-Number(t.request.metadata.startTime);return r(`error`,`响应处理失败`,{method:t.request.method,url:t.request.url,status:t.status,duration:`${n}ms`,error:e}),e}}}function tt(e){return{request:W(e),response:G(e)}}const nt=g(`core/src/interceptors/legacy-converter.utils`);function K(e){let t=[];return e.requestInterceptors&&t.push(...e.requestInterceptors),e.authStrategy?t.push(R(e.authStrategy)):e.tokenProvider&&t.push(L(e.tokenProvider)),e.csrfProvider&&t.push(z(e.csrfProvider,{headerName:e.csrfHeaderName})),t}function q(e){let t=[];return e.validation!==!1&&t.push(H(e.validation===void 0?void 0:e.validation)),e.responseInterceptors&&t.push(...e.responseInterceptors),e.responseTransformer&&t.push(B(e.responseTransformer)),t}function J(e){return e.tokenProvider!==void 0||e.authStrategy!==void 0||e.responseTransformer!==void 0||e.csrfProvider!==void 0}function Y(e){let t=[];e.tokenProvider&&t.push(`tokenProvider (使用 createAuthTokenInterceptor)`),e.authStrategy&&t.push(`authStrategy (使用 createAuthStrategyInterceptor)`),e.responseTransformer&&t.push(`responseTransformer (使用 createResponseTransformerInterceptor)`),e.csrfProvider&&t.push(`csrfProvider (使用 createCsrfInterceptor)`),t.length>0&&nt.warn(`[http-utils] 以下配置项已弃用,将在未来版本中移除:
2
- `+t.map(e=>` - ${e}`).join(`
3
- `))}function rt(e,t,n,r,i,a){return{url:`${e}${t}`,method:n,headers:i?.headers??{},body:r,config:i,route:a,metadata:{}}}function it(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}function at(e){let{baseUrl:t,timeout:n=3e4,headers:r,onUnauthorized:i}=e;J(e)&&Y(e);let a=K(e),o=q(e),s=k({timeout:n}),c=I({requestInterceptors:a,responseInterceptors:o,onUnauthorized:i},s);return{request:async e=>{let{route:n,params:i,query:a,body:o,config:s}=e,l=rt(t,it(n,i,a),n.method,o,{...s,headers:{...r,...s?.headers}},n),u=await c.execute(l);if(b(u))return u;throw Error(`响应类型不匹配`)}}}let X=null;function ot(e){X=e}async function st(e){let t=h.create({baseURL:X?.baseUrl||``,timeout:X?.timeout||3e4,headers:e.headers});return t.interceptors.request.use(async e=>{if(X?.tokenProvider){let t=await X.tokenProvider.getToken();t&&(e.headers.Authorization=`Bearer ${t}`)}return e},e=>Promise.reject(Error(String(e)))),t.interceptors.response.use(e=>e,async e=>(e.response?.status===401&&X?.onUnauthorized&&await X.onUnauthorized(),Promise.reject(e instanceof Error?e:Error(String(e))))),t.request(e)}function ct(e,t){return setTimeout(e,t)}function Z(e){return new Promise(t=>ct(t,e))}function lt(e){return{request:async()=>{if(b(e))return e;throw Error(`模拟响应类型不匹配`)}}}function ut(e){return{request:async t=>{let n=`${t.route.method}:${t.route.path}`,r=e.get(n);if(!r){let e={success:!1,error:{code:`MOCK_NOT_FOUND`,message:`未找到模拟响应`}};if(b(e))return e;throw Error(`模拟响应创建失败`)}if(b(r))return r;throw Error(`模拟响应类型不匹配`)}}}function dt(e,t){return{request:async()=>{if(await Z(t),b(e))return e;throw Error(`模拟响应类型不匹配`)}}}async function ft(e){throw e}function pt(e){return{request:async t=>ft(e)}}function mt(e){return{request:async t=>{let n={route:t.route,params:t.params,query:t.query,body:t.body};for(let r of e){let e=!r.method||t.route.method===r.method,i=!r.path||t.route.path===r.path,a=!r.match||r.match(t.route,t.params,t.query,t.body);if(e&&i&&a){r.delay&&await Z(r.delay);let e=typeof r.response==`function`?r.response(n):r.response;if(b(e))return e;throw Error(`模拟响应类型不匹配`)}}let r={success:!1,error:{code:`MOCK_NOT_FOUND`,message:`未找到路由 ${t.route.method} ${t.route.path} 的模拟响应`}};if(b(r))return r;throw Error(`模拟响应创建失败`)}}}function Q(e,t=``){return e.issues.map(e=>ht(e,t))}function ht(e,t){let n=t+e.path.map(String).join(`.`)||t.slice(0,-1)||`root`;return e.code===`invalid_type`?_t(e,n):{path:n,message:e.message,received:void 0,expected:vt(e.code)}}function gt(e){return typeof e==`object`&&!!e&&`received`in e&&`expected`in e}function _t(e,t){return gt(e)?{path:t,message:e.message,received:e.received,expected:e.expected}:{path:t,message:e.message,received:void 0,expected:`类型不匹配`}}function vt(e){return{invalid_type:`类型不匹配`,invalid_literal:`字面量不匹配`,custom:`自定义验证失败`,invalid_union:`联合类型不匹配`,invalid_union_discriminator:`联合类型判别器无效`,invalid_enum_value:`枚举值无效`,invalid_arguments:`参数无效`,invalid_return_type:`返回类型无效`,invalid_date:`日期无效`,invalid_string:`字符串无效`,too_small:`值过小`,too_big:`值过大`,invalid_intersection_types:`交集类型无效`,not_multiple_of:`不是倍数`,not_finite:`值非有限`}[e]??`验证失败`}function $(e,t,n){if(!e){if(b(t))return{success:!0,data:t};let e={success:!0,data:void 0};if(b(e))return e;throw Error(`Schema 验证结果类型推断失败`)}let r=t??{},i=e.safeParse(r);return i.success?{success:!0,data:i.data}:{success:!1,details:Q(i.error,n)}}function yt(e,t){let n=[],r=$(e.params,t.params,`params.`);r.success||n.push(...r.details);let i=$(e.query,t.query,`query.`);i.success||n.push(...i.details);let a=$(e.body,t.body,`body.`);if(a.success||n.push(...a.details),n.length>0)return{success:!1,error:{code:`VALIDATION_ERROR`,message:`参数验证失败`,details:n}};let o={success:!0,params:r.success?r.data:void 0,query:i.success?i.data:void 0,body:a.success?a.data:void 0};if(b(o))return o;throw Error(`验证结果创建失败`)}function bt(e,t=`参数验证失败`){return{success:!1,error:{code:`VALIDATION_ERROR`,message:t,details:{validationErrors:Q(e)}},message:t}}function xt(e){return{success:!1,error:{code:e.code,message:e.message,details:{validationErrors:e.details}},message:e.message}}export{ae as ApiCompactPaginatedListDataSchema,ve as ApiErrorResponseSchema,_ as ApiErrorSchema,re as ApiListDataSchema,Pe as ApiListDataUtil,ie as ApiPaginatedListDataSchema,v as ApiResponseSchema,D as ApiResponseUtil,t as CursorPaginationParamsSchema,V as DEFAULT_RETRY_STATUS_CODES,fe as DateRangeQuerySchema,he as ERROR_HTTP_STATUS,S as ERROR_MESSAGES,oe as EmptyResponseSchema,x as ErrorCodeSchema,ue as FilterQuerySchema,se as IdParamsSchema,n as OffsetPaginationParamsSchema,i as PaginationParamsSchema,ce as PaginationQuerySchema,pe as SearchQuerySchema,be as buildPath,xe as buildQuery,o as calculateOffset,s as calculateTotalPages,Se as concatPath,Ne as createApiClientFactory,R as createAuthStrategyInterceptor,L as createAuthTokenInterceptor,k as createAxiosAdapter,st as createAxiosInstance,Ke as createBearerAuthStrategy,ut as createConfigurableMockHttpClient,qe as createCookieAuthStrategy,z as createCsrfInterceptor,Je as createCustomAuthStrategy,dt as createDelayedMockHttpClient,_e as createErrorCodeSchema,pt as createErrorMockHttpClient,Ge as createExecutorConfigFromClientConfig,de as createFilterQuerySchema,at as createHttpClient,le as createHttpPaginationSchema,I as createInterceptorExecutor,tt as createLoggingInterceptor,W as createLoggingRequestInterceptor,G as createLoggingResponseInterceptor,lt as createMockHttpClient,Ye as createNoneAuthStrategy,l as createPaginatedResult,K as createRequestInterceptorsFromConfig,q as createResponseInterceptorsFromConfig,B as createResponseTransformerInterceptor,Qe as createRetryInterceptor,mt as createRouteMock,Fe as createRouteResponseBuilder,Le as createTypedEmpty,Ie as createTypedResponse,Re as createTypedStream,bt as createValidationErrorResponse,xt as createValidationErrorResponseFromError,H as createValidationInterceptor,U as defaultLogger,ye as defineRoute,De as defineRouteGroup,$e as exponentialBackoff,Q as extractErrorDetails,me as getErrorMessage,ge as getHttpStatus,w as isBlob,C as isFile,E as isFormDataContentType,Be as isJsonRoute,J as isLegacyConfig,y as isRecord,O as isStreamRoute,b as isType,ee as normalizePagination,T as objectToFormData,ot as setHttpClientConfig,ze as unwrapResult,yt as validateRequest,Y as warnDeprecatedConfig};
1
+ import*as e from"zod";import{CursorPaginationParamsSchema as t,OffsetPaginationParamsSchema as n,PAGINATION_DEFAULTS as r,PaginationParamsSchema as i,SortParamsSchema as a,calculateOffset as o,calculateTotalPages as s,createCompactPaginatedResultSchema as c,createPaginatedResult as l,createPaginatedResult as u,createPaginatedResultSchema as d,createPaginationDefaults as f,createSortParamsSchema as p,normalizePagination as ee}from"@longzai-intelligence/pagination";import{createOptionalStringSchema as m,defineEnumSchema as h}from"@longzai-intelligence/zod-utils";import{isSuccess as te}from"@longzai-intelligence/shared-kernel";import g from"axios";const _=e.object({code:e.string(),message:e.string(),details:e.record(e.string(),e.unknown()).optional()}),v=t=>e.object({success:e.boolean(),data:t.optional(),message:e.string().optional(),error:_.optional(),timestamp:e.number().optional()}),ne=t=>e.object({items:e.array(t),total:e.number()}),re=e=>d(e),ie=e=>c(e),ae=v(e.void()),oe=e.object({id:e.string()}),se=i.extend({page:e.coerce.number().int().min(1).optional().default(r.page),pageSize:e.coerce.number().int().min(r.minPageSize).max(r.maxPageSize).optional().default(r.pageSize)});function ce(t){let n=t?.pageSizeField??`pageSize`,r=f({page:t?.defaultPage,pageSize:t?.defaultPageSize,maxPageSize:t?.maxPageSize,minPageSize:t?.minPageSize});return e.object({page:e.coerce.number().int().min(1).optional().default(r.page),[n]:e.coerce.number().int().min(r.minPageSize).max(r.maxPageSize).optional().default(r.pageSize)})}const le=e.object({filter:m(),sortBy:a.shape.sortBy,sortOrder:a.shape.sortOrder});function ue(t){let n=p(t);return e.object({filter:m(),sortBy:n.shape.sortBy,sortOrder:n.shape.sortOrder})}const de=e.object({startDate:m(),endDate:m()}),fe=e.object({keyword:m()});function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e){return e!=null}const x=h([`UNKNOWN`,`INVALID_PARAMETER`,`RESOURCE_NOT_FOUND`,`RESOURCE_ALREADY_EXISTS`,`OPERATION_FAILED`,`PERMISSION_DENIED`,`UNAUTHORIZED`,`TOKEN_EXPIRED`,`TOKEN_INVALID`,`LOGIN_FAILED`,`ACCOUNT_DISABLED`,`PASSWORD_INCORRECT`,`DATABASE_ERROR`,`EXTERNAL_SERVICE_ERROR`,`RATE_LIMIT_EXCEEDED`,`DUPLICATE_REQUEST`,`VALIDATION_ERROR`],`通用错误码`),S={UNKNOWN:`未知错误`,INVALID_PARAMETER:`参数无效`,RESOURCE_NOT_FOUND:`资源不存在`,RESOURCE_ALREADY_EXISTS:`资源已存在`,OPERATION_FAILED:`操作失败`,PERMISSION_DENIED:`权限不足`,UNAUTHORIZED:`未授权`,TOKEN_EXPIRED:`令牌已过期`,TOKEN_INVALID:`令牌无效`,LOGIN_FAILED:`登录失败`,ACCOUNT_DISABLED:`账户已禁用`,PASSWORD_INCORRECT:`密码错误`,DATABASE_ERROR:`数据库错误`,EXTERNAL_SERVICE_ERROR:`外部服务错误`,RATE_LIMIT_EXCEEDED:`请求频率超限`,DUPLICATE_REQUEST:`重复请求`,VALIDATION_ERROR:`参数验证失败`};function pe(e){return S[e]||S.UNKNOWN}const C={UNAUTHORIZED:401,TOKEN_EXPIRED:401,TOKEN_INVALID:401,LOGIN_FAILED:401,ACCOUNT_DISABLED:401,PASSWORD_INCORRECT:401,PERMISSION_DENIED:403,RESOURCE_NOT_FOUND:404,INVALID_PARAMETER:400,VALIDATION_ERROR:400,DATABASE_ERROR:500,EXTERNAL_SERVICE_ERROR:500};function me(e){return C[e]??400}function he(e,t){let n=[...x.options,...e];if(b(n))return h(n,t??`错误码`);throw Error(`错误码合并失败`)}const ge=e.object({code:x,message:e.string(),data:e.unknown().nullable()});function _e(e){if(b(e))return e;throw Error(`路由定义创建失败`)}function ve(e,t,n){let r=e;if(t)for(let[e,n]of Object.entries(t))r=r.replace(`:${e}`,String(n));if(n){let e=new URLSearchParams;for(let[t,r]of Object.entries(n))r!==void 0&&e.append(t,String(r));let t=e.toString();t&&(r=`${r}?${t}`)}return r}function ye(e){if(!e)return``;let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.append(n,String(r));let n=t.toString();return n?`?${n}`:``}function w(e,t){return`${e}${t}`}function be(e){return`basePath`in e?typeof e.basePath==`string`:!1}function xe(e){let{parent:t,prefix:n,version:r,auth:i,tags:a}=e,o=n??``,s,c,l;return t?(s=o===``?t.prefix:`${t.prefix}/${o}`,c=i??t.auth,l=a??t.tags):(s=r?o.startsWith(`/`)?`/${r}${o}`:o===``?`/${r}`:`/${r}/${o}`:o,c=i,l=a),{fullPrefix:s,finalAuth:c,finalTags:l}}function Se(e,t){let n={};for(let[r,i]of Object.entries(e))be(i)?n[r]=i:n[r]=t(i);return n}function Ce(e,t,n){function r(r){let i=[...n??[],...r.tags??[]],a=r.auth??t,o={...r,path:w(e,r.path),basePath:r.path,tags:i.length>0?i:void 0,auth:a};if(b(o))return o;throw Error(`路由定义创建失败`)}return r}function we(e){let{routes:t}=e,{fullPrefix:n,finalAuth:r,finalTags:i}=xe(e),a=Ce(n,r,i),o=b(n)?n:void 0;if(o===void 0)throw Error(`路径前缀类型推断失败`);let s={prefix:o,version:e.version,auth:r,tags:i,defineRoute:a};if(!t){if(b(s))return s;throw Error(`路由分组创建失败`)}let c=Se(t,e=>a(e)),l={...s,routes:Object.freeze(c)};if(b(l))return l;throw Error(`路由分组创建失败`)}function T(e){return e instanceof File}function E(e){return e instanceof Blob}function D(e,t){let n=new FormData,r=new Set(t?.fileFields??[]),i=t?.arrayFormat??`brackets`,a=(e,t)=>{if(t!=null){if(T(t)||E(t)){n.append(e,t);return}if(r.has(e)&&typeof t==`string`){n.append(e,t);return}if(Array.isArray(t)){t.forEach((t,n)=>{a(i===`indices`?`${e}[${n}]`:i===`brackets`?`${e}[]`:e,t)});return}if(typeof t==`object`&&t){y(t)&&Object.entries(t).forEach(([t,n])=>{a(`${e}[${t}]`,n)});return}n.append(e,String(t))}};return Object.entries(e).forEach(([e,t])=>{a(e,t)}),n}function O(e){return e===`formData`}function Te(e){return{hasParams:`params`in e&&e.params!==void 0,hasQuery:`query`in e&&e.query!==void 0,hasBody:`body`in e&&e.body!==void 0}}function Ee(e,t){return t&&y(e)&&!(e instanceof FormData)?D(e):e}function De(e,t){let n=Te(e),r=O(e.contentType),i=e.method!==`GET`&&e.method!==`DELETE`,a=(...a)=>{let o=0,s=n.hasParams?a[o++]:void 0,c=i&&n.hasBody?a[o++]:void 0,l=n.hasQuery?a[o]:void 0,u=Ee(c,r),d=b(s)?s:void 0,f=b(l)?l:void 0,p=b(u)?u:void 0;return t.request({route:e,params:d,query:f,body:p})};if(b(a))return a;throw Error(`路由函数创建失败`)}function Oe(e,t){let n={};for(let r in e)if(Object.prototype.hasOwnProperty.call(e,r)){let i=e[r];i&&(n[r]=De(i,t))}if(b(n))return n;throw Error(`API 函数集合创建失败`)}function ke(e,t){return Oe(e,t)}function Ae(e){return t=>ke(t,e)}const k={success(e,t){return{success:!0,data:e,message:t,timestamp:Date.now()}},data(e){return{success:!0,data:e,timestamp:Date.now()}},message(e){return{success:!0,data:void 0,message:e,timestamp:Date.now()}},fail(e,t){return{success:!1,message:e,data:t,timestamp:Date.now()}},empty(){return{success:!0,data:void 0,timestamp:Date.now()}}},je={empty(){return{items:[],total:0}},from(e){return{items:e,total:e.length}},withTotal(e,t){return{items:e,total:t}},paginated(e,t,n,r){return u(e,t,n,r)}};function Me(e){return{success:e=>k.data(e),successWithMessage:(e,t)=>k.success(e,t),fail:(e,t)=>t?{success:!1,error:t,message:e,timestamp:Date.now()}:k.fail(e),empty:()=>k.empty()}}function Ne(e){return e=>k.data(e)}function Pe(e){return()=>k.empty()}function Fe(e){return e=>e}function Ie(e){if(te(e))return k.data(e.value);throw e.error}function A(e){return e.responseType===`stream`}function Le(e){return e.responseType!==`stream`}function j(e){let t=g.create({timeout:e?.timeout??3e4});return{async execute(e){let n=await t.request({url:e.url,method:e.method,headers:e.headers,data:e.body,params:e.query,signal:e.config?.signal,timeout:e.config?.timeout});return{status:n.status,headers:b(n.headers)?n.headers:{},data:n.data}}}}async function M(e,t){let n=e;for(let e of t)e.onRequest&&(n=await e.onRequest(n));return n}async function N(e,t,n){let r=e;for(let e=n.length-1;e>=0;e--){let i=n[e];i?.onError&&(r=await i.onError(r,t))}return r}async function P(e,t,n){let r=e;for(let e of n)e.onResponse&&(r=await e.onResponse(r,t));return r}async function F(e,t,n){let r=e;for(let e=n.length-1;e>=0;e--){let i=n[e];if(i?.onError){let e=await i.onError(r,t);if(I(e))return e;r=e}}return r}function I(e){return typeof e==`object`&&!!e&&`success`in e&&typeof e.success==`boolean`}function L(e){let t={code:`UNKNOWN_ERROR`,message:`请求失败`};return e instanceof Error&&(e.message.includes(`timeout`)?(t.code=`TIMEOUT`,t.message=`请求超时`):e.message.includes(`network`)||e.message.includes(`Network`)?(t.code=`NETWORK_ERROR`,t.message=`网络错误`):t.message=e.message),{success:!1,error:t}}async function Re(e,t){try{return await M(e,t)}catch(n){return L(await N(n,e,t))}}async function ze(e,t,n){try{return{response:await t.execute(e)}}catch(t){let r=await F(t,{status:0,headers:{},request:e},n);return I(r)?{error:r}:{error:L(r)}}}function Be(e,t,n){let{status:r,headers:i,data:a}=e,o={status:r,headers:i,request:t},s;return s=I(a)?a:{success:!0,data:a},r===401&&n&&n(),{response:s,context:o}}async function Ve(e,t,n){let r=await Re(e,t.requestInterceptors);if(!(`method`in r))return r;let i=r,a=await ze(i,n,t.responseInterceptors);if(a.error)return a.error;let{response:o,context:s}=Be(a.response,i,t.onUnauthorized);try{return await P(o,s,t.responseInterceptors)}catch(e){let n=await F(e,s,t.responseInterceptors);return I(n)?n:L(n)}}function R(e,t){return{execute:n=>Ve(n,e,t),executeRequestInterceptors:t=>M(t,e.requestInterceptors),executeResponseInterceptors:(t,n)=>P(t,n,e.responseInterceptors),handleRequestError:(t,n)=>N(t,n,e.requestInterceptors),handleResponseError:(t,n)=>F(t,n,e.responseInterceptors)}}function He(e){return{requestInterceptors:e.requestInterceptors??[],responseInterceptors:e.responseInterceptors??[],onUnauthorized:e.onUnauthorized}}function z(e,t){let n=t?.withAuth??!0,r=t?.tokenPrefix??`Bearer`,i=t?.headerName??`Authorization`;return{async onRequest(t){if(!(t.config?.withAuth??n))return t;let a=await e.getToken();return a&&(t.headers[i]=`${r} ${a}`),t}}}function B(e){return{async onRequest(t){switch(e.type){case`bearer`:{let n=await e.tokenProvider.getToken();n&&(t.headers.Authorization=`Bearer ${n}`);break}case`cookie`:t.metadata.credentials=e.credentials??`include`;break;case`custom`:{let n=e.injector({url:t.url,method:t.method,headers:t.headers,params:t.params,query:t.query,body:t.body});n.headers&&Object.assign(t.headers,n.headers);break}case`none`:break}return t}}}function Ue(e){return{type:`bearer`,tokenProvider:e}}function We(e){return{type:`cookie`,credentials:e}}function Ge(e){return{type:`custom`,injector:e}}function Ke(){return{type:`none`}}function V(e,t){let n=t?.headerName??`X-CSRF-Token`,r=t?.injectAll??!1,i=t?.onTokenError??`warn`,a=t?.logger;return{async onRequest(t){return!(r||(t.route?.csrf??!1))||!(t.config?.withCsrf??!0)?t:qe(t,e,n,i,a)}}}async function qe(e,t,n,r,i){try{let r=await t.getToken();r&&(e.headers[n]=r)}catch(e){switch(r){case`warn`:i?.warn(`[http-utils] CSRF 令牌获取失败:`,{error:e});break;case`throw`:throw e;case`ignore`:break}}return e}function H(e){return{async onResponse(t,n){try{let n=e(t.data);return{success:n.success,data:n.data,message:n.message,error:n.error,timestamp:n.timestamp}}catch{return{success:!1,error:{code:`TRANSFORM_ERROR`,message:`响应转换失败`}}}}}}const U=[408,429,500,502,503,504];function Je(e){let t=e?.maxRetries??0,n=e?.baseDelay??1e3,r=e?.retryOn??U,i=e?.retryCondition,a=typeof e?.retryDelay==`function`?e.retryDelay:t=>{let r=e?.retryDelay??n*2**t;return typeof r==`number`?r:n*2**t};return{onError(e,n){let o=Number(n.request.metadata.retryCount);return o>=t||!(i?i(e,n):r.includes(n.status))?e:(n.request.metadata.retryCount=o+1,{success:!1,error:{code:`RETRY_PENDING`,message:`请求将在 ${a(o)}ms 后重试 (${o+1}/${t})`},metadata:{retryCount:o+1,retryDelay:a(o)}})}}}function Ye(e,t=1e3){return t*2**e}function W(e){let t=e?.mode??`development`,n=e?.onValidationError??`warn`,r=e?.logger,i=()=>t===!0?!0:t===!1?!1:t===`development`?process.env.NODE_ENV===`development`:!1;return{async onResponse(e,t){if(!i())return e;let a=t.request.route;if(!a||A(a))return e;let o=a.response;return o?Xe(e,o,t,n,r):e}}}function Xe(e,t,n,r,i){if(e.success&&e.data!==void 0){let a=t.safeParse(e.data);if(!a.success){let e=`响应验证失败: ${n.request.url}`;switch(r){case`warn`:i&&i.warn(e,{error:a.error});break;case`throw`:throw Error(`${e}: ${a.error}`,{cause:a.error});case`ignore`:break}}}return e}function G(e,t,n){let r=`[${new Date().toISOString()}] [${e.toUpperCase()}]`;n===void 0?console.log(r,t):console.log(r,t,n)}function K(e){let t=e?.level??`info`,n=e?.logBody??!1,r=e?.logger??G;return{onRequest(e){let i=Date.now();e.metadata.startTime=i;let a={method:e.method,url:e.url};return n&&e.body&&(a.body=e.body),r(t,`请求开始`,a),e},onError(e,t){let n=Date.now()-Number(t.metadata.startTime);return r(`error`,`请求失败`,{method:t.method,url:t.url,duration:`${n}ms`,error:e}),e}}}function q(e){let t=e?.level??`info`,n=e?.logResponse??!1,r=e?.logger??G;return{onResponse(e,i){let a=Date.now()-Number(i.request.metadata.startTime),o={method:i.request.method,url:i.request.url,status:i.status,duration:`${a}ms`,success:e.success};return n&&e.data&&(o.data=e.data),!e.success&&e.error?(o.error=e.error,r(`warn`,`请求完成(失败)`,o)):r(t,`请求完成`,o),e},onError(e,t){let n=Date.now()-Number(t.request.metadata.startTime);return r(`error`,`响应处理失败`,{method:t.request.method,url:t.request.url,status:t.status,duration:`${n}ms`,error:e}),e}}}function Ze(e){return{request:K(e),response:q(e)}}function J(e){let t=[];return e.requestInterceptors&&t.push(...e.requestInterceptors),e.authStrategy?t.push(B(e.authStrategy)):e.tokenProvider&&t.push(z(e.tokenProvider)),e.csrfProvider&&t.push(V(e.csrfProvider,{headerName:e.csrfHeaderName,logger:e.logger})),t}function Y(e){let t=[];return e.validation!==!1&&t.push(W(e.validation===void 0?void 0:e.validation)),e.responseInterceptors&&t.push(...e.responseInterceptors),e.responseTransformer&&t.push(H(e.responseTransformer)),t}function Qe(e){return e.tokenProvider!==void 0||e.authStrategy!==void 0||e.responseTransformer!==void 0||e.csrfProvider!==void 0}function $e(e,t){let n=[];e.tokenProvider&&n.push(`tokenProvider (使用 createAuthTokenInterceptor)`),e.authStrategy&&n.push(`authStrategy (使用 createAuthStrategyInterceptor)`),e.responseTransformer&&n.push(`responseTransformer (使用 createResponseTransformerInterceptor)`),e.csrfProvider&&n.push(`csrfProvider (使用 createCsrfInterceptor)`),n.length>0&&t?.warn(`[http-utils] 以下配置项已弃用,将在未来版本中移除:
2
+ `+n.map(e=>` - ${e}`).join(`
3
+ `))}function et(e,t,n,r,i,a){return{url:`${e}${t}`,method:n,headers:i?.headers??{},body:r,config:i,route:a,metadata:{}}}function tt(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}function nt(e){let{baseUrl:t,timeout:n=3e4,headers:r,onUnauthorized:i}=e;Qe(e)&&$e(e,e.logger);let a=J(e),o=Y(e),s=j({timeout:n}),c=R({requestInterceptors:a,responseInterceptors:o,onUnauthorized:i},s);return{request:async e=>{let{route:n,params:i,query:a,body:o,config:s}=e,l=et(t,tt(n,i,a),n.method,o,{...s,headers:{...r,...s?.headers}},n),u=await c.execute(l);if(b(u))return u;throw Error(`响应类型不匹配`)}}}let X=null;function rt(e){X=e}async function it(e){let t=g.create({baseURL:X?.baseUrl||``,timeout:X?.timeout||3e4,headers:e.headers});return t.interceptors.request.use(async e=>{if(X?.tokenProvider){let t=await X.tokenProvider.getToken();t&&(e.headers.Authorization=`Bearer ${t}`)}return e},e=>Promise.reject(Error(String(e)))),t.interceptors.response.use(e=>e,async e=>(e.response?.status===401&&X?.onUnauthorized&&await X.onUnauthorized(),Promise.reject(e instanceof Error?e:Error(String(e))))),t.request(e)}function at(e,t){return setTimeout(e,t)}function Z(e){return new Promise(t=>at(t,e))}function ot(e){return{request:async()=>{if(b(e))return e;throw Error(`模拟响应类型不匹配`)}}}function st(e){return{request:async t=>{let n=`${t.route.method}:${t.route.path}`,r=e.get(n);if(!r){let e={success:!1,error:{code:`MOCK_NOT_FOUND`,message:`未找到模拟响应`}};if(b(e))return e;throw Error(`模拟响应创建失败`)}if(b(r))return r;throw Error(`模拟响应类型不匹配`)}}}function ct(e,t){return{request:async()=>{if(await Z(t),b(e))return e;throw Error(`模拟响应类型不匹配`)}}}async function lt(e){throw e}function ut(e){return{request:async t=>lt(e)}}function dt(e){return{request:async t=>{let n={route:t.route,params:t.params,query:t.query,body:t.body};for(let r of e){let e=!r.method||t.route.method===r.method,i=!r.path||t.route.path===r.path,a=!r.match||r.match(t.route,t.params,t.query,t.body);if(e&&i&&a){r.delay&&await Z(r.delay);let e=typeof r.response==`function`?r.response(n):r.response;if(b(e))return e;throw Error(`模拟响应类型不匹配`)}}let r={success:!1,error:{code:`MOCK_NOT_FOUND`,message:`未找到路由 ${t.route.method} ${t.route.path} 的模拟响应`}};if(b(r))return r;throw Error(`模拟响应创建失败`)}}}function Q(e,t=``){return e.issues.map(e=>ft(e,t))}function ft(e,t){let n=t+e.path.map(String).join(`.`)||t.slice(0,-1)||`root`;return e.code===`invalid_type`?mt(e,n):{path:n,message:e.message,received:void 0,expected:ht(e.code)}}function pt(e){return typeof e==`object`&&!!e&&`received`in e&&`expected`in e}function mt(e,t){return pt(e)?{path:t,message:e.message,received:e.received,expected:e.expected}:{path:t,message:e.message,received:void 0,expected:`类型不匹配`}}function ht(e){return{invalid_type:`类型不匹配`,invalid_literal:`字面量不匹配`,custom:`自定义验证失败`,invalid_union:`联合类型不匹配`,invalid_union_discriminator:`联合类型判别器无效`,invalid_enum_value:`枚举值无效`,invalid_arguments:`参数无效`,invalid_return_type:`返回类型无效`,invalid_date:`日期无效`,invalid_string:`字符串无效`,too_small:`值过小`,too_big:`值过大`,invalid_intersection_types:`交集类型无效`,not_multiple_of:`不是倍数`,not_finite:`值非有限`}[e]??`验证失败`}function $(e,t,n){if(!e){if(b(t))return{success:!0,data:t};let e={success:!0,data:void 0};if(b(e))return e;throw Error(`Schema 验证结果类型推断失败`)}let r=t??{},i=e.safeParse(r);return i.success?{success:!0,data:i.data}:{success:!1,details:Q(i.error,n)}}function gt(e,t){let n=[],r=$(e.params,t.params,`params.`);r.success||n.push(...r.details);let i=$(e.query,t.query,`query.`);i.success||n.push(...i.details);let a=$(e.body,t.body,`body.`);if(a.success||n.push(...a.details),n.length>0)return{success:!1,error:{code:`VALIDATION_ERROR`,message:`参数验证失败`,details:n}};let o={success:!0,params:r.success?r.data:void 0,query:i.success?i.data:void 0,body:a.success?a.data:void 0};if(b(o))return o;throw Error(`验证结果创建失败`)}function _t(e,t=`参数验证失败`){return{success:!1,error:{code:`VALIDATION_ERROR`,message:t,details:{validationErrors:Q(e)}},message:t}}function vt(e){return{success:!1,error:{code:e.code,message:e.message,details:{validationErrors:e.details}},message:e.message}}export{ie as ApiCompactPaginatedListDataSchema,ge as ApiErrorResponseSchema,_ as ApiErrorSchema,ne as ApiListDataSchema,je as ApiListDataUtil,re as ApiPaginatedListDataSchema,v as ApiResponseSchema,k as ApiResponseUtil,t as CursorPaginationParamsSchema,U as DEFAULT_RETRY_STATUS_CODES,de as DateRangeQuerySchema,C as ERROR_HTTP_STATUS,S as ERROR_MESSAGES,ae as EmptyResponseSchema,x as ErrorCodeSchema,le as FilterQuerySchema,oe as IdParamsSchema,n as OffsetPaginationParamsSchema,i as PaginationParamsSchema,se as PaginationQuerySchema,fe as SearchQuerySchema,ve as buildPath,ye as buildQuery,o as calculateOffset,s as calculateTotalPages,w as concatPath,Ae as createApiClientFactory,B as createAuthStrategyInterceptor,z as createAuthTokenInterceptor,j as createAxiosAdapter,it as createAxiosInstance,Ue as createBearerAuthStrategy,st as createConfigurableMockHttpClient,We as createCookieAuthStrategy,V as createCsrfInterceptor,Ge as createCustomAuthStrategy,ct as createDelayedMockHttpClient,he as createErrorCodeSchema,ut as createErrorMockHttpClient,He as createExecutorConfigFromClientConfig,ue as createFilterQuerySchema,nt as createHttpClient,ce as createHttpPaginationSchema,R as createInterceptorExecutor,Ze as createLoggingInterceptor,K as createLoggingRequestInterceptor,q as createLoggingResponseInterceptor,ot as createMockHttpClient,Ke as createNoneAuthStrategy,l as createPaginatedResult,J as createRequestInterceptorsFromConfig,Y as createResponseInterceptorsFromConfig,H as createResponseTransformerInterceptor,Je as createRetryInterceptor,dt as createRouteMock,Me as createRouteResponseBuilder,Pe as createTypedEmpty,Ne as createTypedResponse,Fe as createTypedStream,_t as createValidationErrorResponse,vt as createValidationErrorResponseFromError,W as createValidationInterceptor,G as defaultLogger,_e as defineRoute,we as defineRouteGroup,Ye as exponentialBackoff,Q as extractErrorDetails,pe as getErrorMessage,me as getHttpStatus,E as isBlob,T as isFile,O as isFormDataContentType,Le as isJsonRoute,Qe as isLegacyConfig,y as isRecord,A as isStreamRoute,b as isType,ee as normalizePagination,D as objectToFormData,rt as setHttpClientConfig,Ie as unwrapResult,gt as validateRequest,$e as warnDeprecatedConfig};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@longzai-intelligence-transport/http-core",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "keywords": [
5
5
  "api",
6
6
  "contract",
@@ -37,7 +37,6 @@
37
37
  "clean": "rimraf dist out .cache"
38
38
  },
39
39
  "dependencies": {
40
- "@longzai-intelligence/logger-preset-node": "^0.0.9",
41
40
  "@longzai-intelligence/pagination": "^0.1.0",
42
41
  "@longzai-intelligence/zod-utils": "^0.0.4",
43
42
  "axios": "^1.17.0"