xn-fe-tools 1.6.3 → 1.7.0

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.
@@ -41,6 +41,28 @@ export interface UseRequestCacheReturn<T> {
41
41
  /** 清除指定 key 的缓存,如果不传则清除当前自动生成的 key */
42
42
  clearCache: (key?: string) => Promise<void>;
43
43
  }
44
+ /** 缓存快照条目,由 getRequestCache 返回 */
45
+ export interface CacheSnapshot {
46
+ /** 缓存的原始 key(不含 storageKeyPrefix) */
47
+ key: string;
48
+ /** 缓存的原始数据(未经 transformResult 处理) */
49
+ data: unknown;
50
+ /** 写入时间戳(毫秒) */
51
+ timestamp: number;
52
+ /** 所在 storage 策略 */
53
+ storage: CacheStrategy;
54
+ /** 是否已过期(但尚未被清除) */
55
+ isExpired: boolean;
56
+ }
57
+ /** clearRequestCache / getRequestCache 的过滤条件 */
58
+ export interface RequestCacheFilter {
59
+ /** 指定要操作的 key 列表,不传则匹配所有 */
60
+ keys?: string[];
61
+ /** 按 storage 策略过滤,不传则匹配所有 */
62
+ storage?: CacheStrategy | CacheStrategy[];
63
+ /** 按 storageKeyPrefix 过滤,不传则匹配所有 */
64
+ storageKeyPrefix?: string;
65
+ }
44
66
  /**
45
67
  * 支持缓存的请求 Hook
46
68
  *
@@ -53,4 +75,14 @@ export interface UseRequestCacheReturn<T> {
53
75
  * @param options 配置选项
54
76
  */
55
77
  export declare function useRequestCache<T = any, P = any, R = any>(options: UseRequestCacheOptions<T, P, R>): UseRequestCacheReturn<T>;
78
+ /**
79
+ * 清除缓存注册表中匹配的缓存条目。
80
+ * 不传 filter 时清除全部;孤儿缓存(已卸载实例写入的持久化缓存)不在清除范围内,会等待自然过期。
81
+ */
82
+ export declare function clearRequestCache(filter?: RequestCacheFilter): Promise<void>;
83
+ /**
84
+ * 获取缓存注册表中匹配的缓存快照列表。
85
+ * 不传 filter 时返回全部;返回的 data 为原始数据,未经 transformResult 处理。
86
+ */
87
+ export declare function getRequestCache(filter?: RequestCacheFilter): Promise<CacheSnapshot[]>;
56
88
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRequestCache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAW,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIlE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,cAAc,GAAG,gBAAgB,GAAG,WAAW,CAAA;AACtF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC,CAAA;AAEnE,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IAC/D,WAAW;IACX,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAEpC,kCAAkC;IAClC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAE9B,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;IAEzC,gCAAgC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAE5B,wBAAwB;IACxB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;IAEhC,qBAAqB;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAE/C,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,cAAc;IACd,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAE7B,cAAc;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;CAC/B;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IAEf,oBAAoB;IACpB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAEjC,oBAAoB;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAErC,sCAAsC;IACtC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AA8CD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACvD,OAAO,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACvC,qBAAqB,CAAC,CAAC,CAAC,CAoT1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRequestCache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAC1C,OAAO,EAAW,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIlE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,cAAc,GAAG,gBAAgB,GAAG,WAAW,CAAA;AACtF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC,CAAA;AAEnE,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IAC/D,WAAW;IACX,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAEpC,kCAAkC;IAClC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAA;IAE9B,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAA;IAEzC,gCAAgC;IAChC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAE5B,wBAAwB;IACxB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;IAEhC,qBAAqB;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAEzB,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAE/C,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB,cAAc;IACd,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAE7B,cAAc;IACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;CAC/B;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IAEf,oBAAoB;IACpB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAEjC,oBAAoB;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;IAErC,sCAAsC;IACtC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,IAAI,EAAE,OAAO,CAAA;IACb,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB;IACpB,OAAO,EAAE,aAAa,CAAA;IACtB,oBAAoB;IACpB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,6BAA6B;IAC7B,OAAO,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE,CAAA;IACzC,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AA4GD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACvD,OAAO,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACvC,qBAAqB,CAAC,CAAC,CAAC,CAwT1B;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA0B3F"}
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=Object.defineProperty,t=Object.defineProperties,r=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,a=(t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,l=(e,t)=>{for(var r in t||(t={}))o.call(t,r)&&a(e,r,t[r]);if(n)for(var r of n(t))s.call(t,r)&&a(e,r,t[r]);return e},i=(e,n)=>t(e,r(n)),u=(e,t,r)=>new Promise((n,o)=>{var s=e=>{try{l(r.next(e))}catch(t){o(t)}},a=e=>{try{l(r.throw(e))}catch(t){o(t)}},l=e=>e.done?n(e.value):Promise.resolve(e.value).then(s,a);l((r=r.apply(e,t)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("vue"),d=e=>!("object"!=typeof e||null===e||Array.isArray(e)||e instanceof Date||e instanceof RegExp||e instanceof File||e instanceof Blob||"undefined"!=typeof FormData&&e instanceof FormData),f=(e,t)=>{const r=l({},e);for(const n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const e=t[n];if(void 0===e)continue;const o=r[n];d(e)&&d(o)?r[n]=f(o,e):r[n]=e}return r},p=e=>e>=200&&e<300,y=()=>!0,g=e=>new Promise(t=>setTimeout(t,e)),h=e=>u(null,null,function*(){if(!(e=>{if(!e)return!0;if(204===e.status||205===e.status||304===e.status)return!0;const t=e.headers.get("content-length");return!(!t||0!==Number(t))})(e))try{return yield e.json()}catch(t){let o;try{o=yield e.text()}catch(r){return}if(!o.trim())return;try{return JSON.parse(o)}catch(n){return}}}),m=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),b=e=>{if(e instanceof Error){const t=new Error(e.message);return e.name&&(t.name=e.name),e.stack&&(t.stack=e.stack),t}return new Error(String(e))},v=(e,t,r)=>u(null,null,function*(){var n;return!!(null==e?void 0:e.enabled)&&(!(t>(null!=(n=e.maxRetryCount)?n:3))&&(e.shouldRetry?yield e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type))}),w=(e,t)=>{const r=Object.create(e);let n=!1,o=!1,s=!1;const a=e.then.bind(e),l=e.catch.bind(e),i=a(e=>{s=!0===e.__errorSuppressed,delete e.__errorSuppressed;const t=new Proxy(e,{get(e,t){if(("1"===t||"number"==typeof t&&1===t)&&(o=!0),t===Symbol.iterator){const t=e[Symbol.iterator]();return function*(){let e=0;for(const r of t)1===e&&(o=!0),yield r,e++}}return e[t]}}),r=e[1];return e[2]||!r||s||n||queueMicrotask(()=>{queueMicrotask(()=>{if(!(o||o||n||s)){const e=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw e.fetchError=r,e}})}),t});r.cancel=()=>{t&&t()};const u=i.then.bind(i);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?w(u(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):u(e,r)},r.catchHttp=function(e){n=!0;const r=u(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return w(r,t)},r.catchBusiness=function(e){n=!0;const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return w(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return w(r,t)}return l(e)},r};class S{constructor(e){var t;a(this,"symbol"!=typeof(t="globalConfig")?t+"":t,{}),e&&(this.globalConfig=l({},e)),this.request=this.request.bind(this),this.sendGet=this.sendGet.bind(this),this.sendPost=this.sendPost.bind(this),this.sendPostForm=this.sendPostForm.bind(this),this.sendPostBlob=this.sendPostBlob.bind(this),this.sendGetBlob=this.sendGetBlob.bind(this),this.setGlobalConfig=this.setGlobalConfig.bind(this)}executeRequest(e,t,r=1){return u(this,null,function*(){var n,o,s,a,i,c,f,w;try{const i=e,P=i.signal;P&&(P.aborted?t.abort():P.addEventListener("abort",()=>t.abort(),{once:!0}));const q=(c=i.headers,f=i.url,w=i.method,c?"function"==typeof c?c({url:f,method:w}):c:{}),{body:T,urlParams:R}=((e,t,r)=>{if(!e)return{};if("GET"===t||"HEAD"===t||"OPTIONS"===t){if(d(e)){const t=new URLSearchParams;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&t.append(r,String(n))}return{urlParams:t.toString()}}return{}}if("form"===r&&e instanceof FormData)return{body:e};if("form"===r&&d(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&(n instanceof File||n instanceof Blob?t.append(r,n):t.append(r,String(n)))}return{body:t}}return"json"===r?{body:JSON.stringify(e)}:"text"===r?{body:String(e)}:"blob"===r&&e instanceof Blob||"arraybuffer"===r&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(i.data,i.method||"GET",i.requestType||"json"),B=((e,t,r)=>{if(t.startsWith("http://")||t.startsWith("https://")){if(r){const e=t.includes("?")?"&":"?";return`${t}${e}${r}`}return t}let n=t;e&&(n=`${e.endsWith("/")?e.slice(0,-1):e}${t.startsWith("/")?t:`/${t}`}`);if(r){const e=n.includes("?")?"&":"?";n=`${n}${e}${r}`}return n})(i.baseURL,i.url,R),$=i.timeout;let C,O=!1,j=q;T&&"string"==typeof T&&"json"===i.requestType?j=l({"Content-Type":"application/json"},q):T instanceof FormData&&(j=q);const D=new AbortController,G=()=>D.abort();t.signal.addEventListener("abort",G);const _={method:i.method||"GET",headers:j,body:T,mode:"cors",credentials:!1===i.withCredentials?"same-origin":"include",signal:D.signal},F=fetch(B,_);let N;try{if($){const e=new Promise((e,t)=>{C=setTimeout(()=>{O=!0,D.abort(),t(m("Request timeout","timeout"))},$)});N=yield Promise.race([F,e])}else N=yield F}catch(S){if(C&&clearTimeout(C),O){const e=m("Request timeout","timeout");if(yield v(i.retry,r,e))return t.signal.removeEventListener("abort",G),yield g((null==(n=i.retry)?void 0:n.delay)||1e3),this.executeRequest(i,t,r+1);let o=!1;if(i.onNetworkError){const t=()=>{o=!0};yield i.onNetworkError(b(new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=o,t.signal.removeEventListener("abort",G),s}throw S}finally{C&&clearTimeout(C),t.signal.removeEventListener("abort",G)}const k=i.responseType||"json";let A;try{A=yield((e,t)=>u(null,null,function*(){if(!e)throw new Error("No response received");switch(t){case"json":default:return yield h(e);case"text":return yield e.text();case"blob":return yield e.blob();case"arraybuffer":return yield e.arrayBuffer();case"formData":return yield e.formData()}}))(N,k)}catch(x){const e=m("Failed to parse response","network",N.status,void 0,x instanceof Error?x:new Error(String(x)));if(yield v(i.retry,r,e))return yield g((null==(o=i.retry)?void 0:o.delay)||1e3),this.executeRequest(i,t,r+1);let n=!1;if(i.onNetworkError){const t=()=>{n=!0};yield i.onNetworkError(b(e.error||new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=n,s}if(!(i.validateStatus||p)(N.status)){const e=m(`HTTP Error: ${N.status} ${N.statusText}`,"http",N.status,A);if(yield v(i.retry,r,e))return yield g((null==(s=i.retry)?void 0:s.delay)||1e3),this.executeRequest(i,t,r+1);let n=!1;if(i.onHttpError){const t=()=>{n=!0},r=new Error(e.message);yield i.onHttpError(r,N.status,A,t)}const o=[void 0,e,!1,{data:A,status:N.status,statusText:N.statusText,headers:N.headers,response:N}];return o.__errorSuppressed=n,o}if(!(i.validateResponse||y)(A)){const e=m("Business validation failed","business",N.status,A);if(yield v(i.retry,r,e))return yield g((null==(a=i.retry)?void 0:a.delay)||1e3),this.executeRequest(i,t,r+1);let n=!1;if(i.onBusinessError){const t=()=>{n=!0},r=new Error(e.message);yield i.onBusinessError(r,A,t)}const o=[void 0,e,!1,{data:A,status:N.status,statusText:N.statusText,headers:N.headers,response:N}];return o.__errorSuppressed=n,o}let I=A;if(i.transformResponse)try{I=i.transformResponse(A)}catch(E){console.warn("[toAwaitFetch] transformResponse error:",E)}return[I,void 0,!0,{data:A,status:N.status,statusText:N.statusText,headers:N.headers,response:N}]}catch(S){const n=(e=>e instanceof DOMException&&"AbortError"===e.name)(S),o=m(n?"Request aborted":S instanceof Error?S.message:"Network error","network",void 0,void 0,S instanceof Error?S:new Error(String(S)));if(!n&&(yield v(e.retry,r,o)))return yield g((null==(i=e.retry)?void 0:i.delay)||1e3),this.executeRequest(e,t,r+1);let s=!1;if(e.onNetworkError){const t=()=>{s=!0};yield e.onNetworkError(b(o.error||new Error(o.message)),t)}const a=[void 0,o,!1,void 0];return a.__errorSuppressed=s,a}})}request(e){const t=f(l({},this.globalConfig),e),r=new AbortController,n=this.executeRequest(t,r);return w(n,()=>r.abort())}setGlobalConfig(e){this.globalConfig=l({},e)}getGlobalConfig(){return l({},this.globalConfig)}mergeGlobalConfig(e){this.globalConfig=f(this.globalConfig,e)}sendGet(e,t,r){return this.request(i(l({},r),{url:e,method:"GET",data:t}))}sendPost(e,t,r){return this.request(i(l({},r),{url:e,method:"POST",data:t,requestType:"json"}))}sendPostForm(e,t,r){return this.request(i(l({},r),{url:e,method:"POST",data:t,requestType:"form"}))}sendPostBlob(e,t,r){return this.request(i(l({},r),{url:e,method:"POST",data:t,requestType:"json",responseType:"blob"}))}sendGetBlob(e,t,r){return this.request(i(l({},r),{url:e,method:"GET",data:t,responseType:"blob"}))}}const x=e=>new S(e),E=new S,P=e=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)},q=Object.assign(e=>e&&"object"==typeof e&&"url"in e?E.request(e):x(e),{create:x,sendGet:E.sendGet.bind(E),sendPost:E.sendPost.bind(E),sendPostForm:E.sendPostForm.bind(E),sendPostBlob:E.sendPostBlob.bind(E),sendGetBlob:E.sendGetBlob.bind(E),setGlobalConfig:E.setGlobalConfig.bind(E),cancel:P});function T(e,t){if(!e||!t)return;const r=t.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean);let n=e;for(const o of r){if(null==n)return;n=n[o]}return n}function R(e){return"function"==typeof e?e():c.unref(e)}function B(e,t){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==e&&!function(e){return"function"==typeof e||c.isRef(e)}(e)&&console.warn(`[${t}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const $={};const C=new Map,O=new Map,j=new Map,D=new Set;let G=null;const _=(e,t)=>new Promise((r,n)=>{if(G)return r(G);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{G=e.target.result,r(G)},o.onerror=e=>{n(e.target.error)}});const F="1.6.3";exports.VERSION=F,exports.cancel=P,exports.createInstance=x,exports.getTableRequestGlobalConfig=function(){return i(l({},$),{pagination:l({},$.pagination)})},exports.getVersion=function(){return F},exports.sendGet=(e,t,r)=>E.request(i(l({},r),{url:e,method:"GET",data:t})),exports.sendGetBlob=(e,t,r)=>E.sendGetBlob(e,t,r),exports.sendPost=(e,t,r)=>E.sendPost(e,t,r),exports.sendPostBlob=(e,t,r)=>E.sendPostBlob(e,t,r),exports.sendPostForm=(e,t,r)=>E.sendPostForm(e,t,r),exports.setGlobalConfig=e=>{E.setGlobalConfig(e)},exports.setTableRequestGlobalConfig=function(e){Object.assign($,e),e.pagination&&($.pagination=l(l({},$.pagination),e.pagination))},exports.toAwaitFetch=q,exports.useInputNumber=function(e,t){var r,n;let o,s;null===e||"object"!=typeof e||c.isRef(e)?(o=e,s=t||{}):(s=e,o="");const a=()=>{var e;return null!=(e=c.toValue(s.precision))?e:0},l=()=>{var e;return null!=(e=c.toValue(s.showThousands))&&e},i=c.ref(null!=(n=null==(r=c.toValue(o))?void 0:r.toString())?n:""),u=c.computed(()=>{let e=i.value;if(l()){const[t,r]=e.split(".");let n=t.replace(/\B(?=(\d{3})+(?!\d))/g,",");return r?n+=`.${r}`:e.includes(".")&&(n+="."),n}return e}),d=e=>{let t=null==e?"":e.toString().trim();const r=null!=(n=c.toValue(s.allowNegative))&&n?/[^\d.-]/g:/[^\d.]/g;var n;t=t.replace(r,""),t=t.replace(/^-/,"$#$").replace(/-/g,"").replace("$#$","-"),t.length>1&&t.startsWith("0")&&"."!==t[1]&&(t=t.replace(/^0+/,""),""===t&&(t="0")),t.startsWith("-0")&&t.length>2&&"."!==t[2]&&(t="-"+t.slice(2).replace(/^0+/,""),"-"===t&&(t="-0"));const o=a();if(o>0){t=t.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const e=t.indexOf(".");if(-1!==e){if(t.slice(e+1).length>o){const r=(()=>{var e;return null!=(e=c.toValue(s.decimalLimitMode))?e:"discard"})();if("discard"===r)t=t.slice(0,e+o+1);else{const n=Math.pow(10,o);let s=Number(t);isNaN(s)?t=t.slice(0,e+o+1):("round"===r?s=Math.round(s*n)/n:"ceil"===r&&(s=Math.ceil(s*n)/n),t=s.toString())}}}}else t=t.replace(/\./g,"");return t};return c.watch(()=>c.toValue(o),e=>{const t=null==e?"":e.toString();t!==i.value&&(i.value=t)}),{value:i,displayValue:u,handleInput:e=>{const t=d(e);i.value=t},handleBlur:()=>{var e,t;if(!i.value)return;let r=Number(i.value);const n=null!=(e=s.max)?e:1/0,o=null!=(t=s.min)?t:-1/0;r>n&&(r=n,i.value=n.toString()),r<o&&(r=o,i.value=o.toString());const l=(()=>{var e;return null!=(e=c.toValue(s.autoFixed))&&e})();i.value=!0===l||"pad"===l?r.toFixed(a()):"trim"===l?Number(r.toFixed(a())).toString():r.toString()},formatter:e=>u.value,parser:e=>l()?e.replace(/,/g,""):e,clean:d}},exports.useRequestCache=function(e){const{requestFn:t,cacheKey:r,cacheTime:n=3e5,storage:o="memory",params:s,transformResult:a,immediate:l=!0,storageKeyPrefix:i="req_cache_",forceRefreshOnFirst:d=!1,dbName:f="RequestCacheDB",storeName:p="request_cache",onSuccess:y,onError:g}=e,h=(e=>{if("undefined"==typeof window)return"memory";try{if("localStorage"===e&&!window.localStorage)throw new Error;if("sessionStorage"===e&&!window.sessionStorage)throw new Error;if("indexedDB"===e&&!window.indexedDB)throw new Error;return e}catch(t){return console.warn(`[useRequestCache] ${e} is not supported in this environment, falling back to 'memory' mode.`),"memory"}})(R(o)),m=c.ref(),b=c.ref(!1),v=c.ref(null),w=()=>{const e=s?R(s):{};if("function"==typeof r)try{return r(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return r},S=e=>u(null,null,function*(){if("indexedDB"===h){try{const t=yield _(f,p);return new Promise((r,n)=>{const o=t.transaction([p],"readwrite").objectStore(p).delete(`${i}${e}`);o.onsuccess=()=>r(),o.onerror=()=>n(o.error)})}catch(r){console.warn("[useRequestCache] IndexedDB delete failed",r)}return}const t="localStorage"===h?localStorage:"sessionStorage"===h?sessionStorage:null;t&&t.removeItem(`${i}${e}`)}),x=(e=!1)=>u(null,null,function*(){const r=w();if(!r)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const o=R(d)&&!D.has(r),l=e||o,c=s?R(s):{};if(!l&&"indexedDB"!==h){const e=C.get(r);if(e){if(Date.now()-e.timestamp<n)return m.value=a?a(e.data):e.data,y&&y(m.value),m.value;C.delete(r)}}b.value=!0,v.value=null;try{if(O.has(r)){if(y||g){const e=j.get(r);e&&(y&&e.onSuccess.push(y),g&&e.onError.push(g))}const e=yield O.get(r);return m.value=a?a(e):e,m.value}if(!l&&"memory"!==h){const e=yield(e=>u(null,null,function*(){if("indexedDB"===h)try{const t=yield _(f,p);return new Promise(r=>{const n=t.transaction([p],"readonly").objectStore(p).get(`${i}${e}`);n.onsuccess=()=>r(n.result||null),n.onerror=()=>r(null)})}catch(r){return console.warn("[useRequestCache] IndexedDB read failed",r),null}const t="localStorage"===h?localStorage:"sessionStorage"===h?sessionStorage:null;if(!t)return null;try{const r=t.getItem(`${i}${e}`);if(r)return JSON.parse(r)}catch(r){console.warn("[useRequestCache] Read storage failed",r)}return null}))(r);if(e){if(Date.now()-e.timestamp<n)return"indexedDB"!==h&&C.set(r,e),m.value=a?a(e.data):e.data,y&&y(m.value),m.value;yield S(r)}}const e=t(c);O.set(r,e),j.set(r,{onSuccess:y?[y]:[],onError:g?[g]:[]});try{const t=yield e,n={data:t,timestamp:Date.now()};"indexedDB"!==h&&C.set(r,n),"memory"!==h&&(yield((e,t)=>u(null,null,function*(){if("indexedDB"===h){try{const r=yield _(f,p);return new Promise((n,o)=>{const s=r.transaction([p],"readwrite").objectStore(p).put(t,`${i}${e}`);s.onsuccess=()=>n(),s.onerror=()=>o(s.error)})}catch(n){console.warn("[useRequestCache] IndexedDB write failed",n)}return}const r="localStorage"===h?localStorage:"sessionStorage"===h?sessionStorage:null;if(r)try{r.setItem(`${i}${e}`,JSON.stringify(t))}catch(n){console.warn("[useRequestCache] Write storage failed",n)}}))(r,n)),o&&D.add(r),m.value=a?a(t):t;const s=j.get(r);if(s&&s.onSuccess){[...s.onSuccess].forEach(e=>e(m.value))}return O.delete(r),j.delete(r),m.value}catch(x){v.value=x;const e=j.get(r);if(e&&e.onError){[...e.onError].forEach(e=>e(x))}throw O.delete(r),j.delete(r),x}}catch(x){throw v.value=x,x}finally{b.value=!1}}),E=()=>x(!1);return s?c.watch(()=>R(s),()=>{E()},{deep:!0,immediate:l}):l&&E(),{data:m,loading:b,error:v,run:E,refresh:()=>x(!0),clearCache:e=>u(null,null,function*(){const t=e||w();t&&(C.delete(t),"memory"!==h&&(yield S(t)))})}},exports.useTableRequest=function(e,t={}){var r,n,o,s,a,i;const d=l(l({},$.pagination),t.pagination),{params:f,immediate:p=null==(r=$.immediate)||r,debounceDelay:y=(null!=(n=$.debounceDelay)?n:0),dataField:g=(null!=(o=$.dataField)?o:""),totalField:h=(null!=(s=$.totalField)?s:""),currentPageField:m=(null!=(a=$.currentPageField)?a:""),transformParams:b,transformResult:v,onSuccess:w,onError:S,incremental:x=null!=(i=$.incremental)&&i}=t,{defaultPage:E=1,defaultPageSize:P=10,pageKey:q="page",pageSizeKey:C="pageSize"}=d,O=c.ref([]),j=c.ref(!1),D=c.ref(null),G=c.reactive({page:E,pageSize:P,total:0});let _=0;function F(){return u(this,null,function*(){var t;const r=++_;j.value=!0,D.value=null;try{const n=f?R(f):{},o={[q]:G.page,[C]:G.pageSize};let s;s=b?b(n,{page:G.page,pageSize:G.pageSize}):l(l({},n),o);const a=yield e(s);if(r!==_)return;if(v){const e=v(a);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;x&&G.page>E?O.value=[...O.value,...t]:O.value=t,G.total="number"==typeof e.total?e.total:e.list.length}else O.value=[],G.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=a;if(Array.isArray(e))x&&G.page>E?O.value=[...O.value,...e]:O.value=e,G.total=e.length;else if(e&&"object"==typeof e){if(g&&""!==g.trim()){const t=T(e,g)||[];x&&G.page>E?O.value=[...O.value,...t]:O.value=t}else O.value=[];h&&""!==h.trim()?G.total=null!=(t=T(e,h))?t:0:G.total=0}else O.value=[],G.total=0}if(m&&""!==m.trim()){const e=T(a,m);"number"==typeof e&&e!==G.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${G.page})不一致,已自动修正`),G.page=e)}null==w||w(O.value,a)}catch(n){if(r!==_)return;D.value=n instanceof Error?n:new Error(String(n)),null==S||S(D.value)}finally{r===_&&(j.value=!1)}})}const N=y>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}(F,y):F;let k=!1;function A(){return u(this,null,function*(){yield F()})}return c.watch(()=>[G.page,G.pageSize],()=>{k||N()}),f&&(B(f,"useTableRequest"),c.watch(()=>R(f),()=>{k=!0,G.page=E,k=!1,N()},{deep:!0})),p&&F(),{data:O,loading:j,error:D,pagination:G,run:A,onPageChange:function(e){return u(this,null,function*(){const t=G.page!==e;G.page=e,t||(yield F())})},onSizeChange:function(e){return u(this,null,function*(){const t=G.pageSize!==e,r=G.page!==E;G.pageSize=e,G.page=E,t||r||(yield F())})},refresh:function(){return u(this,null,function*(){x?(k=!0,G.page=E,O.value=[],yield c.nextTick(),k=!1,yield F()):yield A()})}}};
1
+ "use strict";var e=Object.defineProperty,t=Object.defineProperties,r=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,a=(t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,l=(e,t)=>{for(var r in t||(t={}))o.call(t,r)&&a(e,r,t[r]);if(n)for(var r of n(t))s.call(t,r)&&a(e,r,t[r]);return e},i=(e,n)=>t(e,r(n)),u=(e,t,r)=>new Promise((n,o)=>{var s=e=>{try{l(r.next(e))}catch(t){o(t)}},a=e=>{try{l(r.throw(e))}catch(t){o(t)}},l=e=>e.done?n(e.value):Promise.resolve(e.value).then(s,a);l((r=r.apply(e,t)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("vue"),d=e=>!("object"!=typeof e||null===e||Array.isArray(e)||e instanceof Date||e instanceof RegExp||e instanceof File||e instanceof Blob||"undefined"!=typeof FormData&&e instanceof FormData),f=(e,t)=>{const r=l({},e);for(const n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const e=t[n];if(void 0===e)continue;const o=r[n];d(e)&&d(o)?r[n]=f(o,e):r[n]=e}return r},p=e=>e>=200&&e<300,g=()=>!0,y=e=>new Promise(t=>setTimeout(t,e)),h=e=>u(null,null,function*(){if(!(e=>{if(!e)return!0;if(204===e.status||205===e.status||304===e.status)return!0;const t=e.headers.get("content-length");return!(!t||0!==Number(t))})(e))try{return yield e.json()}catch(t){let o;try{o=yield e.text()}catch(r){return}if(!o.trim())return;try{return JSON.parse(o)}catch(n){return}}}),m=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),b=e=>{if(e instanceof Error){const t=new Error(e.message);return e.name&&(t.name=e.name),e.stack&&(t.stack=e.stack),t}return new Error(String(e))},v=(e,t,r)=>u(null,null,function*(){var n;return!!(null==e?void 0:e.enabled)&&(!(t>(null!=(n=e.maxRetryCount)?n:3))&&(e.shouldRetry?yield e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type))}),w=(e,t)=>{const r=Object.create(e);let n=!1,o=!1,s=!1;const a=e.then.bind(e),l=e.catch.bind(e),i=a(e=>{s=!0===e.__errorSuppressed,delete e.__errorSuppressed;const t=new Proxy(e,{get(e,t){if(("1"===t||"number"==typeof t&&1===t)&&(o=!0),t===Symbol.iterator){const t=e[Symbol.iterator]();return function*(){let e=0;for(const r of t)1===e&&(o=!0),yield r,e++}}return e[t]}}),r=e[1];return e[2]||!r||s||n||queueMicrotask(()=>{queueMicrotask(()=>{if(!(o||o||n||s)){const e=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw e.fetchError=r,e}})}),t});r.cancel=()=>{t&&t()};const u=i.then.bind(i);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?w(u(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):u(e,r)},r.catchHttp=function(e){n=!0;const r=u(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return w(r,t)},r.catchBusiness=function(e){n=!0;const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return w(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return w(r,t)}return l(e)},r};class S{constructor(e){var t;a(this,"symbol"!=typeof(t="globalConfig")?t+"":t,{}),e&&(this.globalConfig=l({},e)),this.request=this.request.bind(this),this.sendGet=this.sendGet.bind(this),this.sendPost=this.sendPost.bind(this),this.sendPostForm=this.sendPostForm.bind(this),this.sendPostBlob=this.sendPostBlob.bind(this),this.sendGetBlob=this.sendGetBlob.bind(this),this.setGlobalConfig=this.setGlobalConfig.bind(this)}executeRequest(e,t,r=1){return u(this,null,function*(){var n,o,s,a,i,c,f,w;try{const i=e,E=i.signal;E&&(E.aborted?t.abort():E.addEventListener("abort",()=>t.abort(),{once:!0}));const q=(c=i.headers,f=i.url,w=i.method,c?"function"==typeof c?c({url:f,method:w}):c:{}),{body:T,urlParams:R}=((e,t,r)=>{if(!e)return{};if("GET"===t||"HEAD"===t||"OPTIONS"===t){if(d(e)){const t=new URLSearchParams;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&t.append(r,String(n))}return{urlParams:t.toString()}}return{}}if("form"===r&&e instanceof FormData)return{body:e};if("form"===r&&d(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&(n instanceof File||n instanceof Blob?t.append(r,n):t.append(r,String(n)))}return{body:t}}return"json"===r?{body:JSON.stringify(e)}:"text"===r?{body:String(e)}:"blob"===r&&e instanceof Blob||"arraybuffer"===r&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(i.data,i.method||"GET",i.requestType||"json"),$=((e,t,r)=>{if(t.startsWith("http://")||t.startsWith("https://")){if(r){const e=t.includes("?")?"&":"?";return`${t}${e}${r}`}return t}let n=t;e&&(n=`${e.endsWith("/")?e.slice(0,-1):e}${t.startsWith("/")?t:`/${t}`}`);if(r){const e=n.includes("?")?"&":"?";n=`${n}${e}${r}`}return n})(i.baseURL,i.url,R),B=i.timeout;let C,O=!1,j=q;T&&"string"==typeof T&&"json"===i.requestType?j=l({"Content-Type":"application/json"},q):T instanceof FormData&&(j=q);const D=new AbortController,N=()=>D.abort();t.signal.addEventListener("abort",N);const F={method:i.method||"GET",headers:j,body:T,mode:"cors",credentials:!1===i.withCredentials?"same-origin":"include",signal:D.signal},G=fetch($,F);let _;try{if(B){const e=new Promise((e,t)=>{C=setTimeout(()=>{O=!0,D.abort(),t(m("Request timeout","timeout"))},B)});_=yield Promise.race([G,e])}else _=yield G}catch(S){if(C&&clearTimeout(C),O){const e=m("Request timeout","timeout");if(yield v(i.retry,r,e))return t.signal.removeEventListener("abort",N),yield y((null==(n=i.retry)?void 0:n.delay)||1e3),this.executeRequest(i,t,r+1);let o=!1;if(i.onNetworkError){const t=()=>{o=!0};yield i.onNetworkError(b(new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=o,t.signal.removeEventListener("abort",N),s}throw S}finally{C&&clearTimeout(C),t.signal.removeEventListener("abort",N)}const k=i.responseType||"json";let A;try{A=yield((e,t)=>u(null,null,function*(){if(!e)throw new Error("No response received");switch(t){case"json":default:return yield h(e);case"text":return yield e.text();case"blob":return yield e.blob();case"arraybuffer":return yield e.arrayBuffer();case"formData":return yield e.formData()}}))(_,k)}catch(x){const e=m("Failed to parse response","network",_.status,void 0,x instanceof Error?x:new Error(String(x)));if(yield v(i.retry,r,e))return yield y((null==(o=i.retry)?void 0:o.delay)||1e3),this.executeRequest(i,t,r+1);let n=!1;if(i.onNetworkError){const t=()=>{n=!0};yield i.onNetworkError(b(e.error||new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=n,s}if(!(i.validateStatus||p)(_.status)){const e=m(`HTTP Error: ${_.status} ${_.statusText}`,"http",_.status,A);if(yield v(i.retry,r,e))return yield y((null==(s=i.retry)?void 0:s.delay)||1e3),this.executeRequest(i,t,r+1);let n=!1;if(i.onHttpError){const t=()=>{n=!0},r=new Error(e.message);yield i.onHttpError(r,_.status,A,t)}const o=[void 0,e,!1,{data:A,status:_.status,statusText:_.statusText,headers:_.headers,response:_}];return o.__errorSuppressed=n,o}if(!(i.validateResponse||g)(A)){const e=m("Business validation failed","business",_.status,A);if(yield v(i.retry,r,e))return yield y((null==(a=i.retry)?void 0:a.delay)||1e3),this.executeRequest(i,t,r+1);let n=!1;if(i.onBusinessError){const t=()=>{n=!0},r=new Error(e.message);yield i.onBusinessError(r,A,t)}const o=[void 0,e,!1,{data:A,status:_.status,statusText:_.statusText,headers:_.headers,response:_}];return o.__errorSuppressed=n,o}let I=A;if(i.transformResponse)try{I=i.transformResponse(A)}catch(P){console.warn("[toAwaitFetch] transformResponse error:",P)}return[I,void 0,!0,{data:A,status:_.status,statusText:_.statusText,headers:_.headers,response:_}]}catch(S){const n=(e=>e instanceof DOMException&&"AbortError"===e.name)(S),o=m(n?"Request aborted":S instanceof Error?S.message:"Network error","network",void 0,void 0,S instanceof Error?S:new Error(String(S)));if(!n&&(yield v(e.retry,r,o)))return yield y((null==(i=e.retry)?void 0:i.delay)||1e3),this.executeRequest(e,t,r+1);let s=!1;if(e.onNetworkError){const t=()=>{s=!0};yield e.onNetworkError(b(o.error||new Error(o.message)),t)}const a=[void 0,o,!1,void 0];return a.__errorSuppressed=s,a}})}request(e){const t=f(l({},this.globalConfig),e),r=new AbortController,n=this.executeRequest(t,r);return w(n,()=>r.abort())}setGlobalConfig(e){this.globalConfig=l({},e)}getGlobalConfig(){return l({},this.globalConfig)}mergeGlobalConfig(e){this.globalConfig=f(this.globalConfig,e)}sendGet(e,t,r){return this.request(i(l({},r),{url:e,method:"GET",data:t}))}sendPost(e,t,r){return this.request(i(l({},r),{url:e,method:"POST",data:t,requestType:"json"}))}sendPostForm(e,t,r){return this.request(i(l({},r),{url:e,method:"POST",data:t,requestType:"form"}))}sendPostBlob(e,t,r){return this.request(i(l({},r),{url:e,method:"POST",data:t,requestType:"json",responseType:"blob"}))}sendGetBlob(e,t,r){return this.request(i(l({},r),{url:e,method:"GET",data:t,responseType:"blob"}))}}const x=e=>new S(e),P=new S,E=e=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)},q=Object.assign(e=>e&&"object"==typeof e&&"url"in e?P.request(e):x(e),{create:x,sendGet:P.sendGet.bind(P),sendPost:P.sendPost.bind(P),sendPostForm:P.sendPostForm.bind(P),sendPostBlob:P.sendPostBlob.bind(P),sendGetBlob:P.sendGetBlob.bind(P),setGlobalConfig:P.setGlobalConfig.bind(P),cancel:E});function T(e,t){if(!e||!t)return;const r=t.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean);let n=e;for(const o of r){if(null==n)return;n=n[o]}return n}function R(e){return"function"==typeof e?e():c.unref(e)}function $(e,t){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==e&&!function(e){return"function"==typeof e||c.isRef(e)}(e)&&console.warn(`[${t}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const B={};const C=new Map,O=new Map,j=new Map,D=new Set,N=new Map;let F=null;const G=(e,t)=>new Promise((r,n)=>{if(F)return r(F);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{F=e.target.result,r(F)},o.onerror=e=>{n(e.target.error)}});function _(e,t){return u(this,null,function*(){const{storage:r,storageKeyPrefix:n,dbName:o,storeName:s}=t;if("indexedDB"===r)try{const t=yield G(o,s);return new Promise(r=>{const o=t.transaction([s],"readonly").objectStore(s).get(`${n}${e}`);o.onsuccess=()=>r(o.result||null),o.onerror=()=>r(null)})}catch(l){return null}const a="localStorage"===r?localStorage:"sessionStorage"===r?sessionStorage:null;if(!a)return null;try{const t=a.getItem(`${n}${e}`);if(t)return JSON.parse(t)}catch(l){}return null})}function k(e,t,r){if(!r)return!0;if(r.keys&&!r.keys.includes(e))return!1;if(r.storage){if(!(Array.isArray(r.storage)?r.storage:[r.storage]).includes(t.storage))return!1}return void 0===r.storageKeyPrefix||t.storageKeyPrefix===r.storageKeyPrefix}const A="1.7.0";exports.VERSION=A,exports.cancel=E,exports.clearRequestCache=function(e){return u(this,null,function*(){const t=[...N.entries()].filter(([t,r])=>k(t,r,e));yield Promise.all(t.map(([,e])=>e.clearFn()))})},exports.createInstance=x,exports.getRequestCache=function(e){return u(this,null,function*(){var t;const r=[];for(const[n,o]of N.entries()){if(!k(n,o,e))continue;let s=null;s="memory"===o.storage?null!=(t=C.get(n))?t:null:yield _(n,o),s&&r.push({key:n,data:s.data,timestamp:s.timestamp,storage:o.storage,isExpired:Date.now()-s.timestamp>=o.cacheTime})}return r})},exports.getTableRequestGlobalConfig=function(){return i(l({},B),{pagination:l({},B.pagination)})},exports.getVersion=function(){return A},exports.sendGet=(e,t,r)=>P.request(i(l({},r),{url:e,method:"GET",data:t})),exports.sendGetBlob=(e,t,r)=>P.sendGetBlob(e,t,r),exports.sendPost=(e,t,r)=>P.sendPost(e,t,r),exports.sendPostBlob=(e,t,r)=>P.sendPostBlob(e,t,r),exports.sendPostForm=(e,t,r)=>P.sendPostForm(e,t,r),exports.setGlobalConfig=e=>{P.setGlobalConfig(e)},exports.setTableRequestGlobalConfig=function(e){Object.assign(B,e),e.pagination&&(B.pagination=l(l({},B.pagination),e.pagination))},exports.toAwaitFetch=q,exports.useInputNumber=function(e,t){var r,n;let o,s;null===e||"object"!=typeof e||c.isRef(e)?(o=e,s=t||{}):(s=e,o="");const a=()=>{var e;return null!=(e=c.toValue(s.precision))?e:0},l=()=>{var e;return null!=(e=c.toValue(s.showThousands))&&e},i=c.ref(null!=(n=null==(r=c.toValue(o))?void 0:r.toString())?n:""),u=c.computed(()=>{let e=i.value;if(l()){const[t,r]=e.split(".");let n=t.replace(/\B(?=(\d{3})+(?!\d))/g,",");return r?n+=`.${r}`:e.includes(".")&&(n+="."),n}return e}),d=e=>{let t=null==e?"":e.toString().trim();const r=null!=(n=c.toValue(s.allowNegative))&&n?/[^\d.-]/g:/[^\d.]/g;var n;t=t.replace(r,""),t=t.replace(/^-/,"$#$").replace(/-/g,"").replace("$#$","-"),t.length>1&&t.startsWith("0")&&"."!==t[1]&&(t=t.replace(/^0+/,""),""===t&&(t="0")),t.startsWith("-0")&&t.length>2&&"."!==t[2]&&(t="-"+t.slice(2).replace(/^0+/,""),"-"===t&&(t="-0"));const o=a();if(o>0){t=t.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const e=t.indexOf(".");if(-1!==e){if(t.slice(e+1).length>o){const r=(()=>{var e;return null!=(e=c.toValue(s.decimalLimitMode))?e:"discard"})();if("discard"===r)t=t.slice(0,e+o+1);else{const n=Math.pow(10,o);let s=Number(t);isNaN(s)?t=t.slice(0,e+o+1):("round"===r?s=Math.round(s*n)/n:"ceil"===r&&(s=Math.ceil(s*n)/n),t=s.toString())}}}}else t=t.replace(/\./g,"");return t};return c.watch(()=>c.toValue(o),e=>{const t=null==e?"":e.toString();t!==i.value&&(i.value=t)}),{value:i,displayValue:u,handleInput:e=>{const t=d(e);i.value=t},handleBlur:()=>{var e,t;if(!i.value)return;let r=Number(i.value);const n=null!=(e=s.max)?e:1/0,o=null!=(t=s.min)?t:-1/0;r>n&&(r=n,i.value=n.toString()),r<o&&(r=o,i.value=o.toString());const l=(()=>{var e;return null!=(e=c.toValue(s.autoFixed))&&e})();i.value=!0===l||"pad"===l?r.toFixed(a()):"trim"===l?Number(r.toFixed(a())).toString():r.toString()},formatter:e=>u.value,parser:e=>l()?e.replace(/,/g,""):e,clean:d}},exports.useRequestCache=function(e){const{requestFn:t,cacheKey:r,cacheTime:n=3e5,storage:o="memory",params:s,transformResult:a,immediate:l=!0,storageKeyPrefix:i="req_cache_",forceRefreshOnFirst:d=!1,dbName:f="RequestCacheDB",storeName:p="request_cache",onSuccess:g,onError:y}=e,h=(e=>{if("undefined"==typeof window)return"memory";try{if("localStorage"===e&&!window.localStorage)throw new Error;if("sessionStorage"===e&&!window.sessionStorage)throw new Error;if("indexedDB"===e&&!window.indexedDB)throw new Error;return e}catch(t){return console.warn(`[useRequestCache] ${e} is not supported in this environment, falling back to 'memory' mode.`),"memory"}})(R(o)),m=c.ref(),b=c.ref(!1),v=c.ref(null),w=()=>{const e=s?R(s):{};if("function"==typeof r)try{return r(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return r},S=e=>u(null,null,function*(){if("indexedDB"===h){try{const t=yield G(f,p);return new Promise((r,n)=>{const o=t.transaction([p],"readwrite").objectStore(p).delete(`${i}${e}`);o.onsuccess=()=>r(),o.onerror=()=>n(o.error)})}catch(r){console.warn("[useRequestCache] IndexedDB delete failed",r)}return}const t="localStorage"===h?localStorage:"sessionStorage"===h?sessionStorage:null;t&&t.removeItem(`${i}${e}`)}),x=(e=!1)=>u(null,null,function*(){const r=w();if(!r)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const o=R(d)&&!D.has(r),l=e||o,c=s?R(s):{};if(!l&&"indexedDB"!==h){const e=C.get(r);if(e){if(Date.now()-e.timestamp<n)return m.value=a?a(e.data):e.data,g&&g(m.value),m.value;C.delete(r)}}b.value=!0,v.value=null;try{if(O.has(r)){if(g||y){const e=j.get(r);e&&(g&&e.onSuccess.push(g),y&&e.onError.push(y))}const e=yield O.get(r);return m.value=a?a(e):e,m.value}if(!l&&"memory"!==h){const e=yield(e=>u(null,null,function*(){if("indexedDB"===h)try{const t=yield G(f,p);return new Promise(r=>{const n=t.transaction([p],"readonly").objectStore(p).get(`${i}${e}`);n.onsuccess=()=>r(n.result||null),n.onerror=()=>r(null)})}catch(r){return console.warn("[useRequestCache] IndexedDB read failed",r),null}const t="localStorage"===h?localStorage:"sessionStorage"===h?sessionStorage:null;if(!t)return null;try{const r=t.getItem(`${i}${e}`);if(r)return JSON.parse(r)}catch(r){console.warn("[useRequestCache] Read storage failed",r)}return null}))(r);if(e){if(Date.now()-e.timestamp<n)return"indexedDB"!==h&&C.set(r,e),N.set(r,{storage:h,storageKeyPrefix:i,dbName:f,storeName:p,cacheTime:n,clearFn:()=>E(r)}),m.value=a?a(e.data):e.data,g&&g(m.value),m.value;yield S(r)}}const e=t(c);O.set(r,e),j.set(r,{onSuccess:g?[g]:[],onError:y?[y]:[]});try{const t=yield e,s={data:t,timestamp:Date.now()};"indexedDB"!==h&&C.set(r,s),"memory"!==h&&(yield((e,t)=>u(null,null,function*(){if("indexedDB"===h){try{const r=yield G(f,p);return new Promise((n,o)=>{const s=r.transaction([p],"readwrite").objectStore(p).put(t,`${i}${e}`);s.onsuccess=()=>n(),s.onerror=()=>o(s.error)})}catch(n){console.warn("[useRequestCache] IndexedDB write failed",n)}return}const r="localStorage"===h?localStorage:"sessionStorage"===h?sessionStorage:null;if(r)try{r.setItem(`${i}${e}`,JSON.stringify(t))}catch(n){console.warn("[useRequestCache] Write storage failed",n)}}))(r,s)),N.set(r,{storage:h,storageKeyPrefix:i,dbName:f,storeName:p,cacheTime:n,clearFn:()=>E(r)}),o&&D.add(r),m.value=a?a(t):t;const l=j.get(r);if(l&&l.onSuccess){[...l.onSuccess].forEach(e=>e(m.value))}return O.delete(r),j.delete(r),m.value}catch(x){v.value=x;const e=j.get(r);if(e&&e.onError){[...e.onError].forEach(e=>e(x))}throw O.delete(r),j.delete(r),x}}catch(x){throw v.value=x,x}finally{b.value=!1}}),P=()=>x(!1),E=e=>u(null,null,function*(){const t=e||w();t&&(C.delete(t),N.delete(t),"memory"!==h&&(yield S(t)))});return s?c.watch(()=>R(s),()=>{P()},{deep:!0,immediate:l}):l&&P(),{data:m,loading:b,error:v,run:P,refresh:()=>x(!0),clearCache:E}},exports.useTableRequest=function(e,t={}){var r,n,o,s,a,i;const d=l(l({},B.pagination),t.pagination),{params:f,immediate:p=null==(r=B.immediate)||r,debounceDelay:g=(null!=(n=B.debounceDelay)?n:0),dataField:y=(null!=(o=B.dataField)?o:""),totalField:h=(null!=(s=B.totalField)?s:""),currentPageField:m=(null!=(a=B.currentPageField)?a:""),transformParams:b,transformResult:v,onSuccess:w,onError:S,incremental:x=null!=(i=B.incremental)&&i}=t,{defaultPage:P=1,defaultPageSize:E=10,pageKey:q="page",pageSizeKey:C="pageSize"}=d,O=c.ref([]),j=c.ref(!1),D=c.ref(null),N=c.reactive({page:P,pageSize:E,total:0});let F=0;function G(){return u(this,null,function*(){var t;const r=++F;j.value=!0,D.value=null;try{const n=f?R(f):{},o={[q]:N.page,[C]:N.pageSize};let s;s=b?b(n,{page:N.page,pageSize:N.pageSize}):l(l({},n),o);const a=yield e(s);if(r!==F)return;if(v){const e=v(a);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;x&&N.page>P?O.value=[...O.value,...t]:O.value=t,N.total="number"==typeof e.total?e.total:e.list.length}else O.value=[],N.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=a;if(Array.isArray(e))x&&N.page>P?O.value=[...O.value,...e]:O.value=e,N.total=e.length;else if(e&&"object"==typeof e){if(y&&""!==y.trim()){const t=T(e,y)||[];x&&N.page>P?O.value=[...O.value,...t]:O.value=t}else O.value=[];h&&""!==h.trim()?N.total=null!=(t=T(e,h))?t:0:N.total=0}else O.value=[],N.total=0}if(m&&""!==m.trim()){const e=T(a,m);"number"==typeof e&&e!==N.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${N.page})不一致,已自动修正`),N.page=e)}null==w||w(O.value,a)}catch(n){if(r!==F)return;D.value=n instanceof Error?n:new Error(String(n)),null==S||S(D.value)}finally{r===F&&(j.value=!1)}})}const _=g>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}(G,g):G;let k=!1;function A(){return u(this,null,function*(){yield G()})}return c.watch(()=>[N.page,N.pageSize],()=>{k||_()}),f&&($(f,"useTableRequest"),c.watch(()=>R(f),()=>{k=!0,N.page=P,k=!1,_()},{deep:!0})),p&&G(),{data:O,loading:j,error:D,pagination:N,run:A,onPageChange:function(e){return u(this,null,function*(){const t=N.page!==e;N.page=e,t||(yield G())})},onSizeChange:function(e){return u(this,null,function*(){const t=N.pageSize!==e,r=N.page!==P;N.pageSize=e,N.page=P,t||r||(yield G())})},refresh:function(){return u(this,null,function*(){x?(k=!0,N.page=P,O.value=[],yield c.nextTick(),k=!1,yield G()):yield A()})}}};
package/dist/index.es.js CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=Object.defineProperties,r=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,a=(t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,i=(e,t)=>{for(var r in t||(t={}))o.call(t,r)&&a(e,r,t[r]);if(n)for(var r of n(t))s.call(t,r)&&a(e,r,t[r]);return e},l=(e,n)=>t(e,r(n)),u=(e,t,r)=>new Promise((n,o)=>{var s=e=>{try{i(r.next(e))}catch(t){o(t)}},a=e=>{try{i(r.throw(e))}catch(t){o(t)}},i=e=>e.done?n(e.value):Promise.resolve(e.value).then(s,a);i((r=r.apply(e,t)).next())});import{unref as c,isRef as d,ref as f,reactive as p,watch as y,nextTick as g,toValue as h,computed as m}from"vue";const b=e=>!("object"!=typeof e||null===e||Array.isArray(e)||e instanceof Date||e instanceof RegExp||e instanceof File||e instanceof Blob||"undefined"!=typeof FormData&&e instanceof FormData),v=(e,t)=>{const r=i({},e);for(const n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const e=t[n];if(void 0===e)continue;const o=r[n];b(e)&&b(o)?r[n]=v(o,e):r[n]=e}return r},w=e=>e>=200&&e<300,S=()=>!0,E=e=>new Promise(t=>setTimeout(t,e)),P=e=>u(null,null,function*(){if(!(e=>{if(!e)return!0;if(204===e.status||205===e.status||304===e.status)return!0;const t=e.headers.get("content-length");return!(!t||0!==Number(t))})(e))try{return yield e.json()}catch(t){let o;try{o=yield e.text()}catch(r){return}if(!o.trim())return;try{return JSON.parse(o)}catch(n){return}}}),q=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),x=e=>{if(e instanceof Error){const t=new Error(e.message);return e.name&&(t.name=e.name),e.stack&&(t.stack=e.stack),t}return new Error(String(e))},T=(e,t,r)=>u(null,null,function*(){var n;return!!(null==e?void 0:e.enabled)&&(!(t>(null!=(n=e.maxRetryCount)?n:3))&&(e.shouldRetry?yield e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type))}),$=(e,t)=>{const r=Object.create(e);let n=!1,o=!1,s=!1;const a=e.then.bind(e),i=e.catch.bind(e),l=a(e=>{s=!0===e.__errorSuppressed,delete e.__errorSuppressed;const t=new Proxy(e,{get(e,t){if(("1"===t||"number"==typeof t&&1===t)&&(o=!0),t===Symbol.iterator){const t=e[Symbol.iterator]();return function*(){let e=0;for(const r of t)1===e&&(o=!0),yield r,e++}}return e[t]}}),r=e[1];return e[2]||!r||s||n||queueMicrotask(()=>{queueMicrotask(()=>{if(!(o||o||n||s)){const e=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw e.fetchError=r,e}})}),t});r.cancel=()=>{t&&t()};const u=l.then.bind(l);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?$(u(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):u(e,r)},r.catchHttp=function(e){n=!0;const r=u(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return $(r,t)},r.catchBusiness=function(e){n=!0;const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return $(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return $(r,t)}return i(e)},r};class B{constructor(e){var t;a(this,"symbol"!=typeof(t="globalConfig")?t+"":t,{}),e&&(this.globalConfig=i({},e)),this.request=this.request.bind(this),this.sendGet=this.sendGet.bind(this),this.sendPost=this.sendPost.bind(this),this.sendPostForm=this.sendPostForm.bind(this),this.sendPostBlob=this.sendPostBlob.bind(this),this.sendGetBlob=this.sendGetBlob.bind(this),this.setGlobalConfig=this.setGlobalConfig.bind(this)}executeRequest(e,t,r=1){return u(this,null,function*(){var n,o,s,a,l,c,d,f;try{const l=e,h=l.signal;h&&(h.aborted?t.abort():h.addEventListener("abort",()=>t.abort(),{once:!0}));const m=(c=l.headers,d=l.url,f=l.method,c?"function"==typeof c?c({url:d,method:f}):c:{}),{body:v,urlParams:$}=((e,t,r)=>{if(!e)return{};if("GET"===t||"HEAD"===t||"OPTIONS"===t){if(b(e)){const t=new URLSearchParams;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&t.append(r,String(n))}return{urlParams:t.toString()}}return{}}if("form"===r&&e instanceof FormData)return{body:e};if("form"===r&&b(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&(n instanceof File||n instanceof Blob?t.append(r,n):t.append(r,String(n)))}return{body:t}}return"json"===r?{body:JSON.stringify(e)}:"text"===r?{body:String(e)}:"blob"===r&&e instanceof Blob||"arraybuffer"===r&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(l.data,l.method||"GET",l.requestType||"json"),B=((e,t,r)=>{if(t.startsWith("http://")||t.startsWith("https://")){if(r){const e=t.includes("?")?"&":"?";return`${t}${e}${r}`}return t}let n=t;e&&(n=`${e.endsWith("/")?e.slice(0,-1):e}${t.startsWith("/")?t:`/${t}`}`);if(r){const e=n.includes("?")?"&":"?";n=`${n}${e}${r}`}return n})(l.baseURL,l.url,$),R=l.timeout;let C,j=!1,D=m;v&&"string"==typeof v&&"json"===l.requestType?D=i({"Content-Type":"application/json"},m):v instanceof FormData&&(D=m);const O=new AbortController,_=()=>O.abort();t.signal.addEventListener("abort",_);const F={method:l.method||"GET",headers:D,body:v,mode:"cors",credentials:!1===l.withCredentials?"same-origin":"include",signal:O.signal},G=fetch(B,F);let N;try{if(R){const e=new Promise((e,t)=>{C=setTimeout(()=>{j=!0,O.abort(),t(q("Request timeout","timeout"))},R)});N=yield Promise.race([G,e])}else N=yield G}catch(p){if(C&&clearTimeout(C),j){const e=q("Request timeout","timeout");if(yield T(l.retry,r,e))return t.signal.removeEventListener("abort",_),yield E((null==(n=l.retry)?void 0:n.delay)||1e3),this.executeRequest(l,t,r+1);let o=!1;if(l.onNetworkError){const t=()=>{o=!0};yield l.onNetworkError(x(new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=o,t.signal.removeEventListener("abort",_),s}throw p}finally{C&&clearTimeout(C),t.signal.removeEventListener("abort",_)}const k=l.responseType||"json";let A;try{A=yield((e,t)=>u(null,null,function*(){if(!e)throw new Error("No response received");switch(t){case"json":default:return yield P(e);case"text":return yield e.text();case"blob":return yield e.blob();case"arraybuffer":return yield e.arrayBuffer();case"formData":return yield e.formData()}}))(N,k)}catch(y){const e=q("Failed to parse response","network",N.status,void 0,y instanceof Error?y:new Error(String(y)));if(yield T(l.retry,r,e))return yield E((null==(o=l.retry)?void 0:o.delay)||1e3),this.executeRequest(l,t,r+1);let n=!1;if(l.onNetworkError){const t=()=>{n=!0};yield l.onNetworkError(x(e.error||new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=n,s}if(!(l.validateStatus||w)(N.status)){const e=q(`HTTP Error: ${N.status} ${N.statusText}`,"http",N.status,A);if(yield T(l.retry,r,e))return yield E((null==(s=l.retry)?void 0:s.delay)||1e3),this.executeRequest(l,t,r+1);let n=!1;if(l.onHttpError){const t=()=>{n=!0},r=new Error(e.message);yield l.onHttpError(r,N.status,A,t)}const o=[void 0,e,!1,{data:A,status:N.status,statusText:N.statusText,headers:N.headers,response:N}];return o.__errorSuppressed=n,o}if(!(l.validateResponse||S)(A)){const e=q("Business validation failed","business",N.status,A);if(yield T(l.retry,r,e))return yield E((null==(a=l.retry)?void 0:a.delay)||1e3),this.executeRequest(l,t,r+1);let n=!1;if(l.onBusinessError){const t=()=>{n=!0},r=new Error(e.message);yield l.onBusinessError(r,A,t)}const o=[void 0,e,!1,{data:A,status:N.status,statusText:N.statusText,headers:N.headers,response:N}];return o.__errorSuppressed=n,o}let z=A;if(l.transformResponse)try{z=l.transformResponse(A)}catch(g){console.warn("[toAwaitFetch] transformResponse error:",g)}return[z,void 0,!0,{data:A,status:N.status,statusText:N.statusText,headers:N.headers,response:N}]}catch(p){const n=(e=>e instanceof DOMException&&"AbortError"===e.name)(p),o=q(n?"Request aborted":p instanceof Error?p.message:"Network error","network",void 0,void 0,p instanceof Error?p:new Error(String(p)));if(!n&&(yield T(e.retry,r,o)))return yield E((null==(l=e.retry)?void 0:l.delay)||1e3),this.executeRequest(e,t,r+1);let s=!1;if(e.onNetworkError){const t=()=>{s=!0};yield e.onNetworkError(x(o.error||new Error(o.message)),t)}const a=[void 0,o,!1,void 0];return a.__errorSuppressed=s,a}})}request(e){const t=v(i({},this.globalConfig),e),r=new AbortController,n=this.executeRequest(t,r);return $(n,()=>r.abort())}setGlobalConfig(e){this.globalConfig=i({},e)}getGlobalConfig(){return i({},this.globalConfig)}mergeGlobalConfig(e){this.globalConfig=v(this.globalConfig,e)}sendGet(e,t,r){return this.request(l(i({},r),{url:e,method:"GET",data:t}))}sendPost(e,t,r){return this.request(l(i({},r),{url:e,method:"POST",data:t,requestType:"json"}))}sendPostForm(e,t,r){return this.request(l(i({},r),{url:e,method:"POST",data:t,requestType:"form"}))}sendPostBlob(e,t,r){return this.request(l(i({},r),{url:e,method:"POST",data:t,requestType:"json",responseType:"blob"}))}sendGetBlob(e,t,r){return this.request(l(i({},r),{url:e,method:"GET",data:t,responseType:"blob"}))}}const R=e=>new B(e),C=new B,j=(e,t,r)=>C.request(l(i({},r),{url:e,method:"GET",data:t})),D=(e,t,r)=>C.sendPost(e,t,r),O=(e,t,r)=>C.sendPostForm(e,t,r),_=(e,t,r)=>C.sendPostBlob(e,t,r),F=(e,t,r)=>C.sendGetBlob(e,t,r),G=e=>{C.setGlobalConfig(e)},N=e=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)},k=Object.assign(e=>e&&"object"==typeof e&&"url"in e?C.request(e):R(e),{create:R,sendGet:C.sendGet.bind(C),sendPost:C.sendPost.bind(C),sendPostForm:C.sendPostForm.bind(C),sendPostBlob:C.sendPostBlob.bind(C),sendGetBlob:C.sendGetBlob.bind(C),setGlobalConfig:C.setGlobalConfig.bind(C),cancel:N});function A(e,t){if(!e||!t)return;const r=t.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean);let n=e;for(const o of r){if(null==n)return;n=n[o]}return n}function z(e){return"function"==typeof e?e():c(e)}function M(e,t){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==e&&!function(e){return"function"==typeof e||d(e)}(e)&&console.warn(`[${t}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const I={};function L(e){Object.assign(I,e),e.pagination&&(I.pagination=i(i({},I.pagination),e.pagination))}function W(){return l(i({},I),{pagination:i({},I.pagination)})}function H(e,t={}){var r,n,o,s,a,l;const c=i(i({},I.pagination),t.pagination),{params:d,immediate:h=null==(r=I.immediate)||r,debounceDelay:m=(null!=(n=I.debounceDelay)?n:0),dataField:b=(null!=(o=I.dataField)?o:""),totalField:v=(null!=(s=I.totalField)?s:""),currentPageField:w=(null!=(a=I.currentPageField)?a:""),transformParams:S,transformResult:E,onSuccess:P,onError:q,incremental:x=null!=(l=I.incremental)&&l}=t,{defaultPage:T=1,defaultPageSize:$=10,pageKey:B="page",pageSizeKey:R="pageSize"}=c,C=f([]),j=f(!1),D=f(null),O=p({page:T,pageSize:$,total:0});let _=0;function F(){return u(this,null,function*(){var t;const r=++_;j.value=!0,D.value=null;try{const n=d?z(d):{},o={[B]:O.page,[R]:O.pageSize};let s;s=S?S(n,{page:O.page,pageSize:O.pageSize}):i(i({},n),o);const a=yield e(s);if(r!==_)return;if(E){const e=E(a);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;x&&O.page>T?C.value=[...C.value,...t]:C.value=t,O.total="number"==typeof e.total?e.total:e.list.length}else C.value=[],O.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=a;if(Array.isArray(e))x&&O.page>T?C.value=[...C.value,...e]:C.value=e,O.total=e.length;else if(e&&"object"==typeof e){if(b&&""!==b.trim()){const t=A(e,b)||[];x&&O.page>T?C.value=[...C.value,...t]:C.value=t}else C.value=[];v&&""!==v.trim()?O.total=null!=(t=A(e,v))?t:0:O.total=0}else C.value=[],O.total=0}if(w&&""!==w.trim()){const e=A(a,w);"number"==typeof e&&e!==O.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${O.page})不一致,已自动修正`),O.page=e)}null==P||P(C.value,a)}catch(n){if(r!==_)return;D.value=n instanceof Error?n:new Error(String(n)),null==q||q(D.value)}finally{r===_&&(j.value=!1)}})}const G=m>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}(F,m):F;let N=!1;function k(){return u(this,null,function*(){yield F()})}return y(()=>[O.page,O.pageSize],()=>{N||G()}),d&&(M(d,"useTableRequest"),y(()=>z(d),()=>{N=!0,O.page=T,N=!1,G()},{deep:!0})),h&&F(),{data:C,loading:j,error:D,pagination:O,run:k,onPageChange:function(e){return u(this,null,function*(){const t=O.page!==e;O.page=e,t||(yield F())})},onSizeChange:function(e){return u(this,null,function*(){const t=O.pageSize!==e,r=O.page!==T;O.pageSize=e,O.page=T,t||r||(yield F())})},refresh:function(){return u(this,null,function*(){x?(N=!0,O.page=T,C.value=[],yield g(),N=!1,yield F()):yield k()})}}}function J(e,t){var r,n;let o,s;null===e||"object"!=typeof e||d(e)?(o=e,s=t||{}):(s=e,o="");const a=()=>{var e;return null!=(e=h(s.precision))?e:0},i=()=>{var e;return null!=(e=h(s.showThousands))&&e},l=f(null!=(n=null==(r=h(o))?void 0:r.toString())?n:""),u=m(()=>{let e=l.value;if(i()){const[t,r]=e.split(".");let n=t.replace(/\B(?=(\d{3})+(?!\d))/g,",");return r?n+=`.${r}`:e.includes(".")&&(n+="."),n}return e}),c=e=>{let t=null==e?"":e.toString().trim();const r=null!=(n=h(s.allowNegative))&&n?/[^\d.-]/g:/[^\d.]/g;var n;t=t.replace(r,""),t=t.replace(/^-/,"$#$").replace(/-/g,"").replace("$#$","-"),t.length>1&&t.startsWith("0")&&"."!==t[1]&&(t=t.replace(/^0+/,""),""===t&&(t="0")),t.startsWith("-0")&&t.length>2&&"."!==t[2]&&(t="-"+t.slice(2).replace(/^0+/,""),"-"===t&&(t="-0"));const o=a();if(o>0){t=t.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const e=t.indexOf(".");if(-1!==e){if(t.slice(e+1).length>o){const r=(()=>{var e;return null!=(e=h(s.decimalLimitMode))?e:"discard"})();if("discard"===r)t=t.slice(0,e+o+1);else{const n=Math.pow(10,o);let s=Number(t);isNaN(s)?t=t.slice(0,e+o+1):("round"===r?s=Math.round(s*n)/n:"ceil"===r&&(s=Math.ceil(s*n)/n),t=s.toString())}}}}else t=t.replace(/\./g,"");return t};return y(()=>h(o),e=>{const t=null==e?"":e.toString();t!==l.value&&(l.value=t)}),{value:l,displayValue:u,handleInput:e=>{const t=c(e);l.value=t},handleBlur:()=>{var e,t;if(!l.value)return;let r=Number(l.value);const n=null!=(e=s.max)?e:1/0,o=null!=(t=s.min)?t:-1/0;r>n&&(r=n,l.value=n.toString()),r<o&&(r=o,l.value=o.toString());const i=(()=>{var e;return null!=(e=h(s.autoFixed))&&e})();l.value=!0===i||"pad"===i?r.toFixed(a()):"trim"===i?Number(r.toFixed(a())).toString():r.toString()},formatter:e=>u.value,parser:e=>i()?e.replace(/,/g,""):e,clean:c}}const K=/* @__PURE__ */new Map,V=/* @__PURE__ */new Map,U=/* @__PURE__ */new Map,Q=/* @__PURE__ */new Set;let X=null;const Y=(e,t)=>new Promise((r,n)=>{if(X)return r(X);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{X=e.target.result,r(X)},o.onerror=e=>{n(e.target.error)}});function Z(e){const{requestFn:t,cacheKey:r,cacheTime:n=3e5,storage:o="memory",params:s,transformResult:a,immediate:i=!0,storageKeyPrefix:l="req_cache_",forceRefreshOnFirst:c=!1,dbName:d="RequestCacheDB",storeName:p="request_cache",onSuccess:g,onError:h}=e,m=(e=>{if("undefined"==typeof window)return"memory";try{if("localStorage"===e&&!window.localStorage)throw new Error;if("sessionStorage"===e&&!window.sessionStorage)throw new Error;if("indexedDB"===e&&!window.indexedDB)throw new Error;return e}catch(t){return console.warn(`[useRequestCache] ${e} is not supported in this environment, falling back to 'memory' mode.`),"memory"}})(z(o)),b=f(),v=f(!1),w=f(null),S=()=>{const e=s?z(s):{};if("function"==typeof r)try{return r(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return r},E=e=>u(null,null,function*(){if("indexedDB"===m){try{const t=yield Y(d,p);return new Promise((r,n)=>{const o=t.transaction([p],"readwrite").objectStore(p).delete(`${l}${e}`);o.onsuccess=()=>r(),o.onerror=()=>n(o.error)})}catch(r){console.warn("[useRequestCache] IndexedDB delete failed",r)}return}const t="localStorage"===m?localStorage:"sessionStorage"===m?sessionStorage:null;t&&t.removeItem(`${l}${e}`)}),P=(e=!1)=>u(null,null,function*(){const r=S();if(!r)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const o=z(c)&&!Q.has(r),i=e||o,f=s?z(s):{};if(!i&&"indexedDB"!==m){const e=K.get(r);if(e){if(Date.now()-e.timestamp<n)return b.value=a?a(e.data):e.data,g&&g(b.value),b.value;K.delete(r)}}v.value=!0,w.value=null;try{if(V.has(r)){if(g||h){const e=U.get(r);e&&(g&&e.onSuccess.push(g),h&&e.onError.push(h))}const e=yield V.get(r);return b.value=a?a(e):e,b.value}if(!i&&"memory"!==m){const e=yield(e=>u(null,null,function*(){if("indexedDB"===m)try{const t=yield Y(d,p);return new Promise(r=>{const n=t.transaction([p],"readonly").objectStore(p).get(`${l}${e}`);n.onsuccess=()=>r(n.result||null),n.onerror=()=>r(null)})}catch(r){return console.warn("[useRequestCache] IndexedDB read failed",r),null}const t="localStorage"===m?localStorage:"sessionStorage"===m?sessionStorage:null;if(!t)return null;try{const r=t.getItem(`${l}${e}`);if(r)return JSON.parse(r)}catch(r){console.warn("[useRequestCache] Read storage failed",r)}return null}))(r);if(e){if(Date.now()-e.timestamp<n)return"indexedDB"!==m&&K.set(r,e),b.value=a?a(e.data):e.data,g&&g(b.value),b.value;yield E(r)}}const e=t(f);V.set(r,e),U.set(r,{onSuccess:g?[g]:[],onError:h?[h]:[]});try{const t=yield e,n={data:t,timestamp:Date.now()};"indexedDB"!==m&&K.set(r,n),"memory"!==m&&(yield((e,t)=>u(null,null,function*(){if("indexedDB"===m){try{const r=yield Y(d,p);return new Promise((n,o)=>{const s=r.transaction([p],"readwrite").objectStore(p).put(t,`${l}${e}`);s.onsuccess=()=>n(),s.onerror=()=>o(s.error)})}catch(n){console.warn("[useRequestCache] IndexedDB write failed",n)}return}const r="localStorage"===m?localStorage:"sessionStorage"===m?sessionStorage:null;if(r)try{r.setItem(`${l}${e}`,JSON.stringify(t))}catch(n){console.warn("[useRequestCache] Write storage failed",n)}}))(r,n)),o&&Q.add(r),b.value=a?a(t):t;const s=U.get(r);if(s&&s.onSuccess){[...s.onSuccess].forEach(e=>e(b.value))}return V.delete(r),U.delete(r),b.value}catch(y){w.value=y;const e=U.get(r);if(e&&e.onError){[...e.onError].forEach(e=>e(y))}throw V.delete(r),U.delete(r),y}}catch(y){throw w.value=y,y}finally{v.value=!1}}),q=()=>P(!1);return s?y(()=>z(s),()=>{q()},{deep:!0,immediate:i}):i&&q(),{data:b,loading:v,error:w,run:q,refresh:()=>P(!0),clearCache:e=>u(null,null,function*(){const t=e||S();t&&(K.delete(t),"memory"!==m&&(yield E(t)))})}}const ee="1.6.3";function te(){return ee}export{ee as VERSION,N as cancel,R as createInstance,W as getTableRequestGlobalConfig,te as getVersion,j as sendGet,F as sendGetBlob,D as sendPost,_ as sendPostBlob,O as sendPostForm,G as setGlobalConfig,L as setTableRequestGlobalConfig,k as toAwaitFetch,J as useInputNumber,Z as useRequestCache,H as useTableRequest};
1
+ var e=Object.defineProperty,t=Object.defineProperties,r=Object.getOwnPropertyDescriptors,n=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,a=(t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,i=(e,t)=>{for(var r in t||(t={}))o.call(t,r)&&a(e,r,t[r]);if(n)for(var r of n(t))s.call(t,r)&&a(e,r,t[r]);return e},l=(e,n)=>t(e,r(n)),u=(e,t,r)=>new Promise((n,o)=>{var s=e=>{try{i(r.next(e))}catch(t){o(t)}},a=e=>{try{i(r.throw(e))}catch(t){o(t)}},i=e=>e.done?n(e.value):Promise.resolve(e.value).then(s,a);i((r=r.apply(e,t)).next())});import{unref as c,isRef as d,ref as f,reactive as p,watch as y,nextTick as g,toValue as h,computed as m}from"vue";const b=e=>!("object"!=typeof e||null===e||Array.isArray(e)||e instanceof Date||e instanceof RegExp||e instanceof File||e instanceof Blob||"undefined"!=typeof FormData&&e instanceof FormData),v=(e,t)=>{const r=i({},e);for(const n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const e=t[n];if(void 0===e)continue;const o=r[n];b(e)&&b(o)?r[n]=v(o,e):r[n]=e}return r},w=e=>e>=200&&e<300,S=()=>!0,E=e=>new Promise(t=>setTimeout(t,e)),P=e=>u(null,null,function*(){if(!(e=>{if(!e)return!0;if(204===e.status||205===e.status||304===e.status)return!0;const t=e.headers.get("content-length");return!(!t||0!==Number(t))})(e))try{return yield e.json()}catch(t){let o;try{o=yield e.text()}catch(r){return}if(!o.trim())return;try{return JSON.parse(o)}catch(n){return}}}),x=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),q=e=>{if(e instanceof Error){const t=new Error(e.message);return e.name&&(t.name=e.name),e.stack&&(t.stack=e.stack),t}return new Error(String(e))},T=(e,t,r)=>u(null,null,function*(){var n;return!!(null==e?void 0:e.enabled)&&(!(t>(null!=(n=e.maxRetryCount)?n:3))&&(e.shouldRetry?yield e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type))}),$=(e,t)=>{const r=Object.create(e);let n=!1,o=!1,s=!1;const a=e.then.bind(e),i=e.catch.bind(e),l=a(e=>{s=!0===e.__errorSuppressed,delete e.__errorSuppressed;const t=new Proxy(e,{get(e,t){if(("1"===t||"number"==typeof t&&1===t)&&(o=!0),t===Symbol.iterator){const t=e[Symbol.iterator]();return function*(){let e=0;for(const r of t)1===e&&(o=!0),yield r,e++}}return e[t]}}),r=e[1];return e[2]||!r||s||n||queueMicrotask(()=>{queueMicrotask(()=>{if(!(o||o||n||s)){const e=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw e.fetchError=r,e}})}),t});r.cancel=()=>{t&&t()};const u=l.then.bind(l);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?$(u(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):u(e,r)},r.catchHttp=function(e){n=!0;const r=u(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return $(r,t)},r.catchBusiness=function(e){n=!0;const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return $(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=u(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return $(r,t)}return i(e)},r};class B{constructor(e){var t;a(this,"symbol"!=typeof(t="globalConfig")?t+"":t,{}),e&&(this.globalConfig=i({},e)),this.request=this.request.bind(this),this.sendGet=this.sendGet.bind(this),this.sendPost=this.sendPost.bind(this),this.sendPostForm=this.sendPostForm.bind(this),this.sendPostBlob=this.sendPostBlob.bind(this),this.sendGetBlob=this.sendGetBlob.bind(this),this.setGlobalConfig=this.setGlobalConfig.bind(this)}executeRequest(e,t,r=1){return u(this,null,function*(){var n,o,s,a,l,c,d,f;try{const l=e,h=l.signal;h&&(h.aborted?t.abort():h.addEventListener("abort",()=>t.abort(),{once:!0}));const m=(c=l.headers,d=l.url,f=l.method,c?"function"==typeof c?c({url:d,method:f}):c:{}),{body:v,urlParams:$}=((e,t,r)=>{if(!e)return{};if("GET"===t||"HEAD"===t||"OPTIONS"===t){if(b(e)){const t=new URLSearchParams;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&t.append(r,String(n))}return{urlParams:t.toString()}}return{}}if("form"===r&&e instanceof FormData)return{body:e};if("form"===r&&b(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const n=e[r];null!=n&&(n instanceof File||n instanceof Blob?t.append(r,n):t.append(r,String(n)))}return{body:t}}return"json"===r?{body:JSON.stringify(e)}:"text"===r?{body:String(e)}:"blob"===r&&e instanceof Blob||"arraybuffer"===r&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(l.data,l.method||"GET",l.requestType||"json"),B=((e,t,r)=>{if(t.startsWith("http://")||t.startsWith("https://")){if(r){const e=t.includes("?")?"&":"?";return`${t}${e}${r}`}return t}let n=t;e&&(n=`${e.endsWith("/")?e.slice(0,-1):e}${t.startsWith("/")?t:`/${t}`}`);if(r){const e=n.includes("?")?"&":"?";n=`${n}${e}${r}`}return n})(l.baseURL,l.url,$),R=l.timeout;let C,D=!1,j=m;v&&"string"==typeof v&&"json"===l.requestType?j=i({"Content-Type":"application/json"},m):v instanceof FormData&&(j=m);const O=new AbortController,N=()=>O.abort();t.signal.addEventListener("abort",N);const _={method:l.method||"GET",headers:j,body:v,mode:"cors",credentials:!1===l.withCredentials?"same-origin":"include",signal:O.signal},F=fetch(B,_);let G;try{if(R){const e=new Promise((e,t)=>{C=setTimeout(()=>{D=!0,O.abort(),t(x("Request timeout","timeout"))},R)});G=yield Promise.race([F,e])}else G=yield F}catch(p){if(C&&clearTimeout(C),D){const e=x("Request timeout","timeout");if(yield T(l.retry,r,e))return t.signal.removeEventListener("abort",N),yield E((null==(n=l.retry)?void 0:n.delay)||1e3),this.executeRequest(l,t,r+1);let o=!1;if(l.onNetworkError){const t=()=>{o=!0};yield l.onNetworkError(q(new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=o,t.signal.removeEventListener("abort",N),s}throw p}finally{C&&clearTimeout(C),t.signal.removeEventListener("abort",N)}const k=l.responseType||"json";let A;try{A=yield((e,t)=>u(null,null,function*(){if(!e)throw new Error("No response received");switch(t){case"json":default:return yield P(e);case"text":return yield e.text();case"blob":return yield e.blob();case"arraybuffer":return yield e.arrayBuffer();case"formData":return yield e.formData()}}))(G,k)}catch(y){const e=x("Failed to parse response","network",G.status,void 0,y instanceof Error?y:new Error(String(y)));if(yield T(l.retry,r,e))return yield E((null==(o=l.retry)?void 0:o.delay)||1e3),this.executeRequest(l,t,r+1);let n=!1;if(l.onNetworkError){const t=()=>{n=!0};yield l.onNetworkError(q(e.error||new Error(e.message)),t)}const s=[void 0,e,!1,void 0];return s.__errorSuppressed=n,s}if(!(l.validateStatus||w)(G.status)){const e=x(`HTTP Error: ${G.status} ${G.statusText}`,"http",G.status,A);if(yield T(l.retry,r,e))return yield E((null==(s=l.retry)?void 0:s.delay)||1e3),this.executeRequest(l,t,r+1);let n=!1;if(l.onHttpError){const t=()=>{n=!0},r=new Error(e.message);yield l.onHttpError(r,G.status,A,t)}const o=[void 0,e,!1,{data:A,status:G.status,statusText:G.statusText,headers:G.headers,response:G}];return o.__errorSuppressed=n,o}if(!(l.validateResponse||S)(A)){const e=x("Business validation failed","business",G.status,A);if(yield T(l.retry,r,e))return yield E((null==(a=l.retry)?void 0:a.delay)||1e3),this.executeRequest(l,t,r+1);let n=!1;if(l.onBusinessError){const t=()=>{n=!0},r=new Error(e.message);yield l.onBusinessError(r,A,t)}const o=[void 0,e,!1,{data:A,status:G.status,statusText:G.statusText,headers:G.headers,response:G}];return o.__errorSuppressed=n,o}let z=A;if(l.transformResponse)try{z=l.transformResponse(A)}catch(g){console.warn("[toAwaitFetch] transformResponse error:",g)}return[z,void 0,!0,{data:A,status:G.status,statusText:G.statusText,headers:G.headers,response:G}]}catch(p){const n=(e=>e instanceof DOMException&&"AbortError"===e.name)(p),o=x(n?"Request aborted":p instanceof Error?p.message:"Network error","network",void 0,void 0,p instanceof Error?p:new Error(String(p)));if(!n&&(yield T(e.retry,r,o)))return yield E((null==(l=e.retry)?void 0:l.delay)||1e3),this.executeRequest(e,t,r+1);let s=!1;if(e.onNetworkError){const t=()=>{s=!0};yield e.onNetworkError(q(o.error||new Error(o.message)),t)}const a=[void 0,o,!1,void 0];return a.__errorSuppressed=s,a}})}request(e){const t=v(i({},this.globalConfig),e),r=new AbortController,n=this.executeRequest(t,r);return $(n,()=>r.abort())}setGlobalConfig(e){this.globalConfig=i({},e)}getGlobalConfig(){return i({},this.globalConfig)}mergeGlobalConfig(e){this.globalConfig=v(this.globalConfig,e)}sendGet(e,t,r){return this.request(l(i({},r),{url:e,method:"GET",data:t}))}sendPost(e,t,r){return this.request(l(i({},r),{url:e,method:"POST",data:t,requestType:"json"}))}sendPostForm(e,t,r){return this.request(l(i({},r),{url:e,method:"POST",data:t,requestType:"form"}))}sendPostBlob(e,t,r){return this.request(l(i({},r),{url:e,method:"POST",data:t,requestType:"json",responseType:"blob"}))}sendGetBlob(e,t,r){return this.request(l(i({},r),{url:e,method:"GET",data:t,responseType:"blob"}))}}const R=e=>new B(e),C=new B,D=(e,t,r)=>C.request(l(i({},r),{url:e,method:"GET",data:t})),j=(e,t,r)=>C.sendPost(e,t,r),O=(e,t,r)=>C.sendPostForm(e,t,r),N=(e,t,r)=>C.sendPostBlob(e,t,r),_=(e,t,r)=>C.sendGetBlob(e,t,r),F=e=>{C.setGlobalConfig(e)},G=e=>{var t;null==(t=null==e?void 0:e.cancel)||t.call(e)},k=Object.assign(e=>e&&"object"==typeof e&&"url"in e?C.request(e):R(e),{create:R,sendGet:C.sendGet.bind(C),sendPost:C.sendPost.bind(C),sendPostForm:C.sendPostForm.bind(C),sendPostBlob:C.sendPostBlob.bind(C),sendGetBlob:C.sendGetBlob.bind(C),setGlobalConfig:C.setGlobalConfig.bind(C),cancel:G});function A(e,t){if(!e||!t)return;const r=t.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean);let n=e;for(const o of r){if(null==n)return;n=n[o]}return n}function z(e){return"function"==typeof e?e():c(e)}function M(e,t){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==e&&!function(e){return"function"==typeof e||d(e)}(e)&&console.warn(`[${t}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const I={};function K(e){Object.assign(I,e),e.pagination&&(I.pagination=i(i({},I.pagination),e.pagination))}function L(){return l(i({},I),{pagination:i({},I.pagination)})}function W(e,t={}){var r,n,o,s,a,l;const c=i(i({},I.pagination),t.pagination),{params:d,immediate:h=null==(r=I.immediate)||r,debounceDelay:m=(null!=(n=I.debounceDelay)?n:0),dataField:b=(null!=(o=I.dataField)?o:""),totalField:v=(null!=(s=I.totalField)?s:""),currentPageField:w=(null!=(a=I.currentPageField)?a:""),transformParams:S,transformResult:E,onSuccess:P,onError:x,incremental:q=null!=(l=I.incremental)&&l}=t,{defaultPage:T=1,defaultPageSize:$=10,pageKey:B="page",pageSizeKey:R="pageSize"}=c,C=f([]),D=f(!1),j=f(null),O=p({page:T,pageSize:$,total:0});let N=0;function _(){return u(this,null,function*(){var t;const r=++N;D.value=!0,j.value=null;try{const n=d?z(d):{},o={[B]:O.page,[R]:O.pageSize};let s;s=S?S(n,{page:O.page,pageSize:O.pageSize}):i(i({},n),o);const a=yield e(s);if(r!==N)return;if(E){const e=E(a);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;q&&O.page>T?C.value=[...C.value,...t]:C.value=t,O.total="number"==typeof e.total?e.total:e.list.length}else C.value=[],O.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=a;if(Array.isArray(e))q&&O.page>T?C.value=[...C.value,...e]:C.value=e,O.total=e.length;else if(e&&"object"==typeof e){if(b&&""!==b.trim()){const t=A(e,b)||[];q&&O.page>T?C.value=[...C.value,...t]:C.value=t}else C.value=[];v&&""!==v.trim()?O.total=null!=(t=A(e,v))?t:0:O.total=0}else C.value=[],O.total=0}if(w&&""!==w.trim()){const e=A(a,w);"number"==typeof e&&e!==O.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${O.page})不一致,已自动修正`),O.page=e)}null==P||P(C.value,a)}catch(n){if(r!==N)return;j.value=n instanceof Error?n:new Error(String(n)),null==x||x(j.value)}finally{r===N&&(D.value=!1)}})}const F=m>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}(_,m):_;let G=!1;function k(){return u(this,null,function*(){yield _()})}return y(()=>[O.page,O.pageSize],()=>{G||F()}),d&&(M(d,"useTableRequest"),y(()=>z(d),()=>{G=!0,O.page=T,G=!1,F()},{deep:!0})),h&&_(),{data:C,loading:D,error:j,pagination:O,run:k,onPageChange:function(e){return u(this,null,function*(){const t=O.page!==e;O.page=e,t||(yield _())})},onSizeChange:function(e){return u(this,null,function*(){const t=O.pageSize!==e,r=O.page!==T;O.pageSize=e,O.page=T,t||r||(yield _())})},refresh:function(){return u(this,null,function*(){q?(G=!0,O.page=T,C.value=[],yield g(),G=!1,yield _()):yield k()})}}}function H(e,t){var r,n;let o,s;null===e||"object"!=typeof e||d(e)?(o=e,s=t||{}):(s=e,o="");const a=()=>{var e;return null!=(e=h(s.precision))?e:0},i=()=>{var e;return null!=(e=h(s.showThousands))&&e},l=f(null!=(n=null==(r=h(o))?void 0:r.toString())?n:""),u=m(()=>{let e=l.value;if(i()){const[t,r]=e.split(".");let n=t.replace(/\B(?=(\d{3})+(?!\d))/g,",");return r?n+=`.${r}`:e.includes(".")&&(n+="."),n}return e}),c=e=>{let t=null==e?"":e.toString().trim();const r=null!=(n=h(s.allowNegative))&&n?/[^\d.-]/g:/[^\d.]/g;var n;t=t.replace(r,""),t=t.replace(/^-/,"$#$").replace(/-/g,"").replace("$#$","-"),t.length>1&&t.startsWith("0")&&"."!==t[1]&&(t=t.replace(/^0+/,""),""===t&&(t="0")),t.startsWith("-0")&&t.length>2&&"."!==t[2]&&(t="-"+t.slice(2).replace(/^0+/,""),"-"===t&&(t="-0"));const o=a();if(o>0){t=t.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const e=t.indexOf(".");if(-1!==e){if(t.slice(e+1).length>o){const r=(()=>{var e;return null!=(e=h(s.decimalLimitMode))?e:"discard"})();if("discard"===r)t=t.slice(0,e+o+1);else{const n=Math.pow(10,o);let s=Number(t);isNaN(s)?t=t.slice(0,e+o+1):("round"===r?s=Math.round(s*n)/n:"ceil"===r&&(s=Math.ceil(s*n)/n),t=s.toString())}}}}else t=t.replace(/\./g,"");return t};return y(()=>h(o),e=>{const t=null==e?"":e.toString();t!==l.value&&(l.value=t)}),{value:l,displayValue:u,handleInput:e=>{const t=c(e);l.value=t},handleBlur:()=>{var e,t;if(!l.value)return;let r=Number(l.value);const n=null!=(e=s.max)?e:1/0,o=null!=(t=s.min)?t:-1/0;r>n&&(r=n,l.value=n.toString()),r<o&&(r=o,l.value=o.toString());const i=(()=>{var e;return null!=(e=h(s.autoFixed))&&e})();l.value=!0===i||"pad"===i?r.toFixed(a()):"trim"===i?Number(r.toFixed(a())).toString():r.toString()},formatter:e=>u.value,parser:e=>i()?e.replace(/,/g,""):e,clean:c}}const J=/* @__PURE__ */new Map,V=/* @__PURE__ */new Map,U=/* @__PURE__ */new Map,Q=/* @__PURE__ */new Set,X=/* @__PURE__ */new Map;let Y=null;const Z=(e,t)=>new Promise((r,n)=>{if(Y)return r(Y);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{Y=e.target.result,r(Y)},o.onerror=e=>{n(e.target.error)}});function ee(e,t){return u(this,null,function*(){const{storage:r,storageKeyPrefix:n,dbName:o,storeName:s}=t;if("indexedDB"===r)try{const t=yield Z(o,s);return new Promise(r=>{const o=t.transaction([s],"readonly").objectStore(s).get(`${n}${e}`);o.onsuccess=()=>r(o.result||null),o.onerror=()=>r(null)})}catch(i){return null}const a="localStorage"===r?localStorage:"sessionStorage"===r?sessionStorage:null;if(!a)return null;try{const t=a.getItem(`${n}${e}`);if(t)return JSON.parse(t)}catch(i){}return null})}function te(e,t,r){if(!r)return!0;if(r.keys&&!r.keys.includes(e))return!1;if(r.storage){if(!(Array.isArray(r.storage)?r.storage:[r.storage]).includes(t.storage))return!1}return void 0===r.storageKeyPrefix||t.storageKeyPrefix===r.storageKeyPrefix}function re(e){const{requestFn:t,cacheKey:r,cacheTime:n=3e5,storage:o="memory",params:s,transformResult:a,immediate:i=!0,storageKeyPrefix:l="req_cache_",forceRefreshOnFirst:c=!1,dbName:d="RequestCacheDB",storeName:p="request_cache",onSuccess:g,onError:h}=e,m=(e=>{if("undefined"==typeof window)return"memory";try{if("localStorage"===e&&!window.localStorage)throw new Error;if("sessionStorage"===e&&!window.sessionStorage)throw new Error;if("indexedDB"===e&&!window.indexedDB)throw new Error;return e}catch(t){return console.warn(`[useRequestCache] ${e} is not supported in this environment, falling back to 'memory' mode.`),"memory"}})(z(o)),b=f(),v=f(!1),w=f(null),S=()=>{const e=s?z(s):{};if("function"==typeof r)try{return r(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return r},E=e=>u(null,null,function*(){if("indexedDB"===m){try{const t=yield Z(d,p);return new Promise((r,n)=>{const o=t.transaction([p],"readwrite").objectStore(p).delete(`${l}${e}`);o.onsuccess=()=>r(),o.onerror=()=>n(o.error)})}catch(r){console.warn("[useRequestCache] IndexedDB delete failed",r)}return}const t="localStorage"===m?localStorage:"sessionStorage"===m?sessionStorage:null;t&&t.removeItem(`${l}${e}`)}),P=(e=!1)=>u(null,null,function*(){const r=S();if(!r)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const o=z(c)&&!Q.has(r),i=e||o,f=s?z(s):{};if(!i&&"indexedDB"!==m){const e=J.get(r);if(e){if(Date.now()-e.timestamp<n)return b.value=a?a(e.data):e.data,g&&g(b.value),b.value;J.delete(r)}}v.value=!0,w.value=null;try{if(V.has(r)){if(g||h){const e=U.get(r);e&&(g&&e.onSuccess.push(g),h&&e.onError.push(h))}const e=yield V.get(r);return b.value=a?a(e):e,b.value}if(!i&&"memory"!==m){const e=yield(e=>u(null,null,function*(){if("indexedDB"===m)try{const t=yield Z(d,p);return new Promise(r=>{const n=t.transaction([p],"readonly").objectStore(p).get(`${l}${e}`);n.onsuccess=()=>r(n.result||null),n.onerror=()=>r(null)})}catch(r){return console.warn("[useRequestCache] IndexedDB read failed",r),null}const t="localStorage"===m?localStorage:"sessionStorage"===m?sessionStorage:null;if(!t)return null;try{const r=t.getItem(`${l}${e}`);if(r)return JSON.parse(r)}catch(r){console.warn("[useRequestCache] Read storage failed",r)}return null}))(r);if(e){if(Date.now()-e.timestamp<n)return"indexedDB"!==m&&J.set(r,e),X.set(r,{storage:m,storageKeyPrefix:l,dbName:d,storeName:p,cacheTime:n,clearFn:()=>q(r)}),b.value=a?a(e.data):e.data,g&&g(b.value),b.value;yield E(r)}}const e=t(f);V.set(r,e),U.set(r,{onSuccess:g?[g]:[],onError:h?[h]:[]});try{const t=yield e,s={data:t,timestamp:Date.now()};"indexedDB"!==m&&J.set(r,s),"memory"!==m&&(yield((e,t)=>u(null,null,function*(){if("indexedDB"===m){try{const r=yield Z(d,p);return new Promise((n,o)=>{const s=r.transaction([p],"readwrite").objectStore(p).put(t,`${l}${e}`);s.onsuccess=()=>n(),s.onerror=()=>o(s.error)})}catch(n){console.warn("[useRequestCache] IndexedDB write failed",n)}return}const r="localStorage"===m?localStorage:"sessionStorage"===m?sessionStorage:null;if(r)try{r.setItem(`${l}${e}`,JSON.stringify(t))}catch(n){console.warn("[useRequestCache] Write storage failed",n)}}))(r,s)),X.set(r,{storage:m,storageKeyPrefix:l,dbName:d,storeName:p,cacheTime:n,clearFn:()=>q(r)}),o&&Q.add(r),b.value=a?a(t):t;const i=U.get(r);if(i&&i.onSuccess){[...i.onSuccess].forEach(e=>e(b.value))}return V.delete(r),U.delete(r),b.value}catch(y){w.value=y;const e=U.get(r);if(e&&e.onError){[...e.onError].forEach(e=>e(y))}throw V.delete(r),U.delete(r),y}}catch(y){throw w.value=y,y}finally{v.value=!1}}),x=()=>P(!1),q=e=>u(null,null,function*(){const t=e||S();t&&(J.delete(t),X.delete(t),"memory"!==m&&(yield E(t)))});return s?y(()=>z(s),()=>{x()},{deep:!0,immediate:i}):i&&x(),{data:b,loading:v,error:w,run:x,refresh:()=>P(!0),clearCache:q}}function ne(e){return u(this,null,function*(){const t=[...X.entries()].filter(([t,r])=>te(t,r,e));yield Promise.all(t.map(([,e])=>e.clearFn()))})}function oe(e){return u(this,null,function*(){var t;const r=[];for(const[n,o]of X.entries()){if(!te(n,o,e))continue;let s=null;s="memory"===o.storage?null!=(t=J.get(n))?t:null:yield ee(n,o),s&&r.push({key:n,data:s.data,timestamp:s.timestamp,storage:o.storage,isExpired:Date.now()-s.timestamp>=o.cacheTime})}return r})}const se="1.7.0";function ae(){return se}export{se as VERSION,G as cancel,ne as clearRequestCache,R as createInstance,oe as getRequestCache,L as getTableRequestGlobalConfig,ae as getVersion,D as sendGet,_ as sendGetBlob,j as sendPost,N as sendPostBlob,O as sendPostForm,F as setGlobalConfig,K as setTableRequestGlobalConfig,k as toAwaitFetch,H as useInputNumber,re as useRequestCache,W as useTableRequest};
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.6.3",
3
- "generatedAt": "2026-03-17T05:44:45.403Z",
2
+ "version": "1.7.0",
3
+ "generatedAt": "2026-03-20T03:13:18.627Z",
4
4
  "hooks": [
5
5
  {
6
6
  "name": "toAwaitFetch",
@@ -43,7 +43,7 @@
43
43
  {
44
44
  "name": "useRequestCache",
45
45
  "description": "用于处理请求缓存的 Hook,支持内存缓存、持久化缓存(LocalStorage/SessionStorage)、请求去重(并发共享)和结果转换。",
46
- "typeDefinitions": "export type CacheStrategy = 'memory' | 'localStorage' | 'sessionStorage' | 'indexedDB'\n\nexport type CacheKeyGenerator<P> = string | ((params: P) => string)\n\nexport interface UseRequestCacheOptions<T = any, P = any, R = any> {\n /** 请求函数 */\n requestFn: (params: P) => Promise<R>\n \n /** 缓存唯一标记,用于区分不同请求。可以是字符串或生成函数 */\n cacheKey: CacheKeyGenerator<P>\n \n /** 缓存时间(毫秒),默认 5 分钟 (300000ms) */\n cacheTime?: number\n \n /** Storage 策略,默认为 'memory' */\n storage?: MaybeRefOrGetter<CacheStrategy>\n \n /** 请求参数(响应式或普通对象),用于生成动态 key */\n params?: MaybeRefOrGetter<P>\n \n /** 结果转换函数,在返回数据前进行转换 */\n transformResult?: (data: R) => T\n \n /** 是否立即执行,默认 true */\n immediate?: boolean\n\n /** 手动指定的 storage key 前缀,默认 'req_cache_' */\n storageKeyPrefix?: string\n\n /** 首次请求是否强制更新(跳过缓存),默认为 false */\n forceRefreshOnFirst?: MaybeRefOrGetter<boolean>\n\n /** IndexedDB 数据库名称,仅在 storage 为 'indexedDB' 时有效,默认 'RequestCacheDB' */\n dbName?: string\n\n /** IndexedDB 存储对象名称,仅在 storage 为 'indexedDB' 时有效,默认 'request_cache' */\n storeName?: string\n\n /** 请求成功的回调 */\n onSuccess?: (data: T) => void\n\n /** 请求失败的回调 */\n onError?: (error: any) => void\n}\n\nexport interface UseRequestCacheReturn<T> {\n data: Ref<T | undefined>\n loading: Ref<boolean>\n error: Ref<any>\n \n /** 执行请求 (优先使用缓存) */\n run: () => Promise<T | undefined>\n \n /** 刷新(忽略缓存,强制请求) */\n refresh: () => Promise<T | undefined>\n \n /** 清除指定 key 的缓存,如果不传则清除当前自动生成的 key */\n clearCache: (key?: string) => Promise<void>\n}",
46
+ "typeDefinitions": "export type CacheStrategy = 'memory' | 'localStorage' | 'sessionStorage' | 'indexedDB'\n\nexport type CacheKeyGenerator<P> = string | ((params: P) => string)\n\nexport interface UseRequestCacheOptions<T = any, P = any, R = any> {\n /** 请求函数 */\n requestFn: (params: P) => Promise<R>\n \n /** 缓存唯一标记,用于区分不同请求。可以是字符串或生成函数 */\n cacheKey: CacheKeyGenerator<P>\n \n /** 缓存时间(毫秒),默认 5 分钟 (300000ms) */\n cacheTime?: number\n \n /** Storage 策略,默认为 'memory' */\n storage?: MaybeRefOrGetter<CacheStrategy>\n \n /** 请求参数(响应式或普通对象),用于生成动态 key */\n params?: MaybeRefOrGetter<P>\n \n /** 结果转换函数,在返回数据前进行转换 */\n transformResult?: (data: R) => T\n \n /** 是否立即执行,默认 true */\n immediate?: boolean\n\n /** 手动指定的 storage key 前缀,默认 'req_cache_' */\n storageKeyPrefix?: string\n\n /** 首次请求是否强制更新(跳过缓存),默认为 false */\n forceRefreshOnFirst?: MaybeRefOrGetter<boolean>\n\n /** IndexedDB 数据库名称,仅在 storage 为 'indexedDB' 时有效,默认 'RequestCacheDB' */\n dbName?: string\n\n /** IndexedDB 存储对象名称,仅在 storage 为 'indexedDB' 时有效,默认 'request_cache' */\n storeName?: string\n\n /** 请求成功的回调 */\n onSuccess?: (data: T) => void\n\n /** 请求失败的回调 */\n onError?: (error: any) => void\n}\n\nexport interface UseRequestCacheReturn<T> {\n data: Ref<T | undefined>\n loading: Ref<boolean>\n error: Ref<any>\n \n /** 执行请求 (优先使用缓存) */\n run: () => Promise<T | undefined>\n \n /** 刷新(忽略缓存,强制请求) */\n refresh: () => Promise<T | undefined>\n \n /** 清除指定 key 的缓存,如果不传则清除当前自动生成的 key */\n clearCache: (key?: string) => Promise<void>\n}\n\nexport interface CacheSnapshot {\n /** 缓存的原始 key(不含 storageKeyPrefix) */\n key: string\n /** 缓存的原始数据(未经 transformResult 处理) */\n data: unknown\n /** 写入时间戳(毫秒) */\n timestamp: number\n /** 所在 storage 策略 */\n storage: CacheStrategy\n /** 是否已过期(但尚未被清除) */\n isExpired: boolean\n}\n\nexport interface RequestCacheFilter {\n /** 指定要操作的 key 列表,不传则匹配所有 */\n keys?: string[]\n /** 按 storage 策略过滤,不传则匹配所有 */\n storage?: CacheStrategy | CacheStrategy[]\n /** 按 storageKeyPrefix 过滤,不传则匹配所有 */\n storageKeyPrefix?: string\n}",
47
47
  "templates": {
48
48
  "default": "<script setup lang=\"ts\">\nimport { useRequestCache } from 'xn-fe-tools'\nimport { ref, computed } from 'vue'\n\n// 模拟请求函数\nconst fetchUserInfo = async (params: { id: number }) => {\n return new Promise(resolve =>\n setTimeout(() => {\n resolve({ id: params.id, name: `User ${params.id}`, role: 'admin' })\n }, 500)\n )\n}\n\nconst userId = ref(1)\n\nconst { data, loading, run, refresh } = useRequestCache({\n // 请求函数\n requestFn: fetchUserInfo,\n // 参数 (响应式)\n params: computed(() => ({ id: userId.value })),\n // 缓存 Key (动态)\n cacheKey: params => `user-info-${params.id}`,\n // 缓存时间 5 分钟\n cacheTime: 5 * 60 * 1000,\n // 自动执行\n immediate: true,\n})\n</script>\n\n<template>\n <div>\n <div v-if=\"loading\">Loading...</div>\n <div v-else>\n <pre>{{ data }}</pre>\n </div>\n\n <button @click=\"userId++\">Next User (New Request)</button>\n <button @click=\"userId--\">Prev User (Cached?)</button>\n <button @click=\"refresh\">Force Refresh</button>\n </div>\n</template>"
49
49
  },
@@ -79,19 +79,21 @@ function useRequestCache<T, P, R = any>(
79
79
 
80
80
  ### Options
81
81
 
82
- | 参数 | 类型 | 默认值 | 说明 |
83
- | --------------------- | --------------------------------- | -------------- | ---------------------------------------------------------------- |
84
- | `requestFn` | `(params: P) => Promise<R>` | - | **必填**。实际发起请求的异步函数。 |
85
- | `cacheKey` | `string \| (params: P) => string` | - | **必填**。缓存唯一标识。如果是函数,则根据 params 生成。 |
86
- | `params` | `MaybeRefOrGetter<P>` | - | 请求参数。如果是响应式数据,变化时会自动触发请求。 |
87
- | `cacheTime` | `number` | `300000` | 缓存有效期(毫秒),默认 5 分钟。 |
88
- | `storage` | `MaybeRefOrGetter<CacheStrategy>` | `'memory'` | 缓存存储策略('memory' \| 'localStorage' \| 'sessionStorage')。 |
89
- | `storageKeyPrefix` | `string` | `'req_cache_'` | 存储空间的 Key 前缀。 |
90
- | `immediate` | `boolean` | `true` | 是否初始化时立即执行。 |
91
- | `transformResult` | `(data: R) => T` | - | 数据转换函数,将原始响应 `R` 转换为结果 `T`。 |
92
- | `forceRefreshOnFirst` | `MaybeRefOrGetter<boolean>` | `false` | 首次请求是否强制更新(跳过缓存,即使持久化存储中有值)。 |
93
- | `onSuccess` | `(data: T) => void` | - | 请求成功的回调。 |
94
- | `onError` | `(error: any) => void` | - | 请求失败的回调。 |
82
+ | 参数 | 类型 | 默认值 | 说明 |
83
+ | --------------------- | --------------------------------- | ----------------- | ---------------------------------------------------------------- |
84
+ | `requestFn` | `(params: P) => Promise<R>` | - | **必填**。实际发起请求的异步函数。 |
85
+ | `cacheKey` | `string \| (params: P) => string` | - | **必填**。缓存唯一标识。如果是函数,则根据 params 生成。 |
86
+ | `params` | `MaybeRefOrGetter<P>` | - | 请求参数。如果是响应式数据,变化时会自动触发请求。 |
87
+ | `cacheTime` | `number` | `300000` | 缓存有效期(毫秒),默认 5 分钟。 |
88
+ | `storage` | `MaybeRefOrGetter<CacheStrategy>` | `'memory'` | 缓存存储策略('memory' \| 'localStorage' \| 'sessionStorage' \| 'indexedDB')。 |
89
+ | `storageKeyPrefix` | `string` | `'req_cache_'` | 存储空间的 Key 前缀。 |
90
+ | `immediate` | `boolean` | `true` | 是否初始化时立即执行。 |
91
+ | `transformResult` | `(data: R) => T` | - | 数据转换函数,将原始响应 `R` 转换为结果 `T`。 |
92
+ | `forceRefreshOnFirst` | `MaybeRefOrGetter<boolean>` | `false` | 首次请求是否强制更新(跳过缓存,即使持久化存储中有值)。 |
93
+ | `dbName` | `string` | `'RequestCacheDB'` | IndexedDB 数据库名称,仅 `storage: 'indexedDB'` 时有效。 |
94
+ | `storeName` | `string` | `'request_cache'` | IndexedDB 存储对象名称,仅 `storage: 'indexedDB'` 时有效。 |
95
+ | `onSuccess` | `(data: T) => void` | - | 请求成功的回调。 |
96
+ | `onError` | `(error: any) => void` | - | 请求失败的回调。 |
95
97
 
96
98
  ### Return
97
99
 
@@ -104,6 +106,44 @@ function useRequestCache<T, P, R = any>(
104
106
  | `refresh` | `() => Promise<T>` | 强制刷新(忽略缓存)。 |
105
107
  | `clearCache` | `(key?: string) => Promise<void>` | 清除指定 Key 的缓存。 |
106
108
 
109
+ ### 全局管理函数 <Badge type="tip" text="v1.7.0+" />
110
+
111
+ 与 `useRequestCache` 实例方法不同,以下函数作用于**模块级注册表**,可跨组件操作所有已发起过请求的缓存条目。
112
+
113
+ #### `clearRequestCache(filter?)`
114
+
115
+ 清除注册表中匹配的缓存。不传 `filter` 时清除全部。
116
+
117
+ ```ts
118
+ function clearRequestCache(filter?: RequestCacheFilter): Promise<void>
119
+ ```
120
+
121
+ #### `getRequestCache(filter?)`
122
+
123
+ 获取注册表中匹配的缓存快照列表。不传 `filter` 时返回全部。
124
+
125
+ ```ts
126
+ function getRequestCache(filter?: RequestCacheFilter): Promise<CacheSnapshot[]>
127
+ ```
128
+
129
+ #### RequestCacheFilter
130
+
131
+ | 参数 | 类型 | 说明 |
132
+ | ------------------ | --------------------------------------- | ----------------------------------------- |
133
+ | `keys` | `string[]` | 指定要操作的 key 列表,不传则匹配所有。 |
134
+ | `storage` | `CacheStrategy \| CacheStrategy[]` | 按 storage 策略过滤,不传则匹配所有。 |
135
+ | `storageKeyPrefix` | `string` | 按 storageKeyPrefix 过滤,不传则匹配所有。|
136
+
137
+ #### CacheSnapshot
138
+
139
+ | 属性 | 类型 | 说明 |
140
+ | ----------- | --------------- | ---------------------------------------------- |
141
+ | `key` | `string` | 缓存的原始 key(不含 storageKeyPrefix)。 |
142
+ | `data` | `unknown` | 缓存的原始数据(**未经** `transformResult` 处理)。 |
143
+ | `timestamp` | `number` | 写入时间戳(毫秒)。 |
144
+ | `storage` | `CacheStrategy` | 所在 storage 策略。 |
145
+ | `isExpired` | `boolean` | 是否已过期但尚未被清除。 |
146
+
107
147
  ## 高级用法
108
148
 
109
149
  ### 封装通用枚举选择器组件
@@ -204,6 +244,66 @@ const { data } = useRequestCache({
204
244
  })
205
245
  ```
206
246
 
247
+ ### 全局缓存管理 <Badge type="tip" text="v1.7.0+" />
248
+
249
+ `clearRequestCache` 和 `getRequestCache` 是独立的模块级函数,不依附于任何组件实例,可在路由守卫、登出逻辑、调试工具等场景中使用。
250
+
251
+ **登出时清空所有缓存:**
252
+
253
+ ```ts
254
+ import { clearRequestCache } from 'xn-fe-tools'
255
+
256
+ async function logout() {
257
+ await clearRequestCache() // 清除全部
258
+ router.push('/login')
259
+ }
260
+ ```
261
+
262
+ **只清除持久化存储(保留内存缓存):**
263
+
264
+ ```ts
265
+ await clearRequestCache({ storage: ['localStorage', 'sessionStorage'] })
266
+ ```
267
+
268
+ **按业务模块前缀批量清除:**
269
+
270
+ ```ts
271
+ // 不同模块使用不同 storageKeyPrefix
272
+ useRequestCache({ ..., storageKeyPrefix: 'order_' })
273
+ useRequestCache({ ..., storageKeyPrefix: 'user_' })
274
+
275
+ // 只清除订单模块的缓存
276
+ await clearRequestCache({ storageKeyPrefix: 'order_' })
277
+ ```
278
+
279
+ **查看当前所有缓存状态(调试用):**
280
+
281
+ ```ts
282
+ import { getRequestCache } from 'xn-fe-tools'
283
+
284
+ const snapshots = await getRequestCache()
285
+ console.table(
286
+ snapshots.map(s => ({
287
+ key: s.key,
288
+ storage: s.storage,
289
+ isExpired: s.isExpired,
290
+ age: `${Math.round((Date.now() - s.timestamp) / 1000)}s`,
291
+ }))
292
+ )
293
+ ```
294
+
295
+ **获取指定 key 的缓存并判断是否过期:**
296
+
297
+ ```ts
298
+ const [snapshot] = await getRequestCache({ keys: ['user-profile'] })
299
+
300
+ if (snapshot?.isExpired) {
301
+ console.log('缓存已过期,下次访问将重新请求')
302
+ }
303
+ ```
304
+
305
+ > **注意**:全局函数只能感知**已注册的缓存**,即调用过 `run()` 且成功写入缓存的条目。组件卸载后未主动调用 `clearCache` 的条目仍保留在注册表中,但其 localStorage/sessionStorage 数据本身并不随组件生命周期消失(孤儿缓存)。孤儿缓存不会出现在 `getRequestCache` 返回列表中,但会在 `cacheTime` 到期后自然失效。
306
+
207
307
  ### 成功与失败的回调 (Dedupe 友好)
208
308
 
209
309
  `useRequestCache` 支持在请求成功或失败时触发回调。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xn-fe-tools",
3
- "version": "1.6.3",
3
+ "version": "1.7.0",
4
4
  "description": "A powerful fetch wrapper with chaining & tuple API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",