xn-fe-tools 1.6.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/dist/mcp/hook-metadata.json +2 -2
- package/dist/sentry/browser.d.ts +1 -0
- package/dist/sentry/react.d.ts +1 -0
- package/dist/sentry/vue2.d.ts +1 -0
- package/dist/sentry/vue3.d.ts +1 -0
- package/package.json +5 -8
- package/sentry/browser.d.ts +1 -0
- package/sentry/browser.js +1 -0
- package/sentry/react.d.ts +1 -0
- package/sentry/react.js +1 -0
- package/sentry/vue2.d.ts +1 -0
- package/sentry/vue2.js +1 -0
- package/sentry/vue3.d.ts +1 -0
- package/sentry/vue3.js +1 -0
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=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),r=(e,n)=>{const o={...e};for(const s in n){if(!Object.prototype.hasOwnProperty.call(n,s))continue;const e=n[s];if(void 0===e)continue;const a=o[s];t(e)&&t(a)?o[s]=r(a,e):o[s]=e}return o},n=e=>e>=200&&e<300,o=()=>!0,s=e=>new Promise(t=>setTimeout(t,e)),a=async e=>{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 await e.json()}catch(t){let n;try{n=await e.text()}catch{return}if(!n.trim())return;try{return JSON.parse(n)}catch(r){return}}},i=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),u=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))},c=async(e,t,r)=>!!e?.enabled&&(!(t>(e.maxRetryCount??3))&&(e.shouldRetry?await e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type)),l=(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),u=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 c=u.then.bind(u);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?l(c(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):c(e,r)},r.catchHttp=function(e){n=!0;const r=c(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return l(r,t)},r.catchBusiness=function(e){n=!0;const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return l(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return l(r,t)}return i(e)},r};class d{globalConfig={};constructor(e){e&&(this.globalConfig={...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)}async executeRequest(e,r,l=1){try{const y=e,w=y.signal;w&&(w.aborted?r.abort():w.addEventListener("abort",()=>r.abort(),{once:!0}));const b=(d=y.headers,f=y.url,p=y.method,d?"function"==typeof d?d({url:f,method:p}):d:{}),{body:v,urlParams:S}=((e,r,n)=>{if(!e)return{};if("GET"===r||"HEAD"===r||"OPTIONS"===r){if(t(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"===n&&e instanceof FormData)return{body:e};if("form"===n&&t(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"===n?{body:JSON.stringify(e)}:"text"===n?{body:String(e)}:"blob"===n&&e instanceof Blob||"arraybuffer"===n&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(y.data,y.method||"GET",y.requestType||"json"),x=((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})(y.baseURL,y.url,S),E=y.timeout;let q,P=!1,T=b;v&&"string"==typeof v&&"json"===y.requestType?T={"Content-Type":"application/json",...b}:v instanceof FormData&&(T=b);const R=new AbortController,B=()=>R.abort();r.signal.addEventListener("abort",B);const $={method:y.method||"GET",headers:T,body:v,mode:"cors",credentials:!1===y.withCredentials?"same-origin":"include",signal:R.signal},C=fetch(x,$);let G;try{if(E){const e=new Promise((e,t)=>{q=setTimeout(()=>{P=!0,R.abort(),t(i("Request timeout","timeout"))},E)});G=await Promise.race([C,e])}else G=await C}catch(g){if(q&&clearTimeout(q),P){const e=i("Request timeout","timeout");if(await c(y.retry,l,e))return r.signal.removeEventListener("abort",B),await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onNetworkError){const r=()=>{t=!0};await y.onNetworkError(u(new Error(e.message)),r)}const n=[void 0,e,!1,void 0];return n.__errorSuppressed=t,r.signal.removeEventListener("abort",B),n}throw g}finally{q&&clearTimeout(q),r.signal.removeEventListener("abort",B)}const _=y.responseType||"json";let D;try{D=await(async(e,t)=>{if(!e)throw new Error("No response received");switch(t){case"json":default:return await a(e);case"text":return await e.text();case"blob":return await e.blob();case"arraybuffer":return await e.arrayBuffer();case"formData":return await e.formData()}})(G,_)}catch(h){const e=i("Failed to parse response","network",G.status,void 0,h instanceof Error?h:new Error(String(h)));if(await c(y.retry,l,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onNetworkError){const r=()=>{t=!0};await y.onNetworkError(u(e.error||new Error(e.message)),r)}const n=[void 0,e,!1,void 0];return n.__errorSuppressed=t,n}if(!(y.validateStatus||n)(G.status)){const e=i(`HTTP Error: ${G.status} ${G.statusText}`,"http",G.status,D);if(await c(y.retry,l,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onHttpError){const r=()=>{t=!0},n=new Error(e.message);await y.onHttpError(n,G.status,D,r)}const n=[void 0,e,!1,{data:D,status:G.status,statusText:G.statusText,headers:G.headers,response:G}];return n.__errorSuppressed=t,n}if(!(y.validateResponse||o)(D)){const e=i("Business validation failed","business",G.status,D);if(await c(y.retry,l,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onBusinessError){const r=()=>{t=!0},n=new Error(e.message);await y.onBusinessError(n,D,r)}const n=[void 0,e,!1,{data:D,status:G.status,statusText:G.statusText,headers:G.headers,response:G}];return n.__errorSuppressed=t,n}let F=D;if(y.transformResponse)try{F=y.transformResponse(D)}catch(m){console.warn("[toAwaitFetch] transformResponse error:",m)}return[F,void 0,!0,{data:D,status:G.status,statusText:G.statusText,headers:G.headers,response:G}]}catch(g){const t=(e=>e instanceof DOMException&&"AbortError"===e.name)(g),n=i(t?"Request aborted":g instanceof Error?g.message:"Network error","network",void 0,void 0,g instanceof Error?g:new Error(String(g)));if(!t&&await c(e.retry,l,n))return await s(e.retry?.delay||1e3),this.executeRequest(e,r,l+1);let o=!1;if(e.onNetworkError){const t=()=>{o=!0};await e.onNetworkError(u(n.error||new Error(n.message)),t)}const a=[void 0,n,!1,void 0];return a.__errorSuppressed=o,a}var d,f,p}request(e){const t=r({...this.globalConfig},e),n=new AbortController,o=this.executeRequest(t,n);return l(o,()=>n.abort())}setGlobalConfig(e){this.globalConfig={...e}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(e){this.globalConfig=r(this.globalConfig,e)}sendGet(e,t,r){return this.request({...r,url:e,method:"GET",data:t})}sendPost(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json"})}sendPostForm(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"form"})}sendPostBlob(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json",responseType:"blob"})}sendGetBlob(e,t,r){return this.request({...r,url:e,method:"GET",data:t,responseType:"blob"})}}const f=e=>new d(e),p=new d,g=e=>{e?.cancel?.()},h=Object.assign(e=>e&&"object"==typeof e&&"url"in e?p.request(e):f(e),{create:f,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:g});function m(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 y(t){return"function"==typeof t?t():e.unref(t)}function w(t,r){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==t&&!function(t){return"function"==typeof t||e.isRef(t)}(t)&&console.warn(`[${r}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const b={};const v=new Map,S=new Map,x=new Map,E=new Set;let q=null;const P=(e,t)=>new Promise((r,n)=>{if(q)return r(q);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{q=e.target.result,r(q)},o.onerror=e=>{n(e.target.error)}});const T="1.6.0";exports.VERSION=T,exports.cancel=g,exports.createInstance=f,exports.getTableRequestGlobalConfig=function(){return{...b,pagination:{...b.pagination}}},exports.getVersion=function(){return T},exports.sendGet=(e,t,r)=>p.request({...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={...b.pagination,...e.pagination})},exports.toAwaitFetch=h,exports.useInputNumber=function(t,r){let n,o;null===t||"object"!=typeof t||e.isRef(t)?(n=t,o=r||{}):(o=t,n="");const s=()=>e.toValue(o.precision)??0,a=()=>e.toValue(o.showThousands)??!1,i=e.ref(e.toValue(n)?.toString()??""),u=e.computed(()=>{let e=i.value;if(a()){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=t=>{let r=null==t?"":t.toString().trim();const n=e.toValue(o.allowNegative)?/[^\d.-]/g:/[^\d.]/g;r=r.replace(n,""),r=r.replace(/^-/,"$#$").replace(/-/g,"").replace("$#$","-"),r.length>1&&r.startsWith("0")&&"."!==r[1]&&(r=r.replace(/^0+/,""),""===r&&(r="0")),r.startsWith("-0")&&r.length>2&&"."!==r[2]&&(r="-"+r.slice(2).replace(/^0+/,""),"-"===r&&(r="-0"));const a=s();if(a>0){r=r.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const t=r.indexOf(".");if(-1!==t){if(r.slice(t+1).length>a){const n=e.toValue(o.decimalLimitMode)??"discard";if("discard"===n)r=r.slice(0,t+a+1);else{const e=Math.pow(10,a);let o=Number(r);isNaN(o)?r=r.slice(0,t+a+1):("round"===n?o=Math.round(o*e)/e:"ceil"===n&&(o=Math.ceil(o*e)/e),r=o.toString())}}}}else r=r.replace(/\./g,"");return r};return e.watch(()=>e.toValue(n),e=>{const t=null==e?"":e.toString();t!==i.value&&(i.value=t)}),{value:i,displayValue:u,handleInput:e=>{const t=c(e);i.value=t},handleBlur:()=>{if(!i.value)return;let t=Number(i.value);const r=o.max??1/0,n=o.min??-1/0;t>r&&(t=r,i.value=r.toString()),t<n&&(t=n,i.value=n.toString());const a=e.toValue(o.autoFixed)??!1;i.value=!0===a||"pad"===a?t.toFixed(s()):"trim"===a?Number(t.toFixed(s())).toString():t.toString()},formatter:e=>u.value,parser:e=>a()?e.replace(/,/g,""):e,clean:c}},exports.useRequestCache=function(t){const{requestFn:r,cacheKey:n,cacheTime:o=3e5,storage:s="memory",params:a,transformResult:i,immediate:u=!0,storageKeyPrefix:c="req_cache_",forceRefreshOnFirst:l=!1,dbName:d="RequestCacheDB",storeName:f="request_cache",onSuccess:p,onError:g}=t,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"}})(y(s)),m=e.ref(),w=e.ref(!1),b=e.ref(null),q=()=>{const e=a?y(a):{};if("function"==typeof n)try{return n(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return n},T=async e=>{if("indexedDB"===h){try{const t=await P(d,f);return new Promise((r,n)=>{const o=t.transaction([f],"readwrite").objectStore(f).delete(`${c}${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(`${c}${e}`)},R=async(e=!1)=>{const t=q();if(!t)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const n=y(l)&&!E.has(t),s=e||n,u=a?y(a):{};if(!s&&"indexedDB"!==h){const e=v.get(t);if(e){if(Date.now()-e.timestamp<o)return m.value=i?i(e.data):e.data,p&&p(m.value),m.value;v.delete(t)}}w.value=!0,b.value=null;try{if(S.has(t)){if(p||g){const e=x.get(t);e&&(p&&e.onSuccess.push(p),g&&e.onError.push(g))}const e=await S.get(t);return m.value=i?i(e):e,m.value}if(!s&&"memory"!==h){const e=await(async e=>{if("indexedDB"===h)try{const t=await P(d,f);return new Promise(r=>{const n=t.transaction([f],"readonly").objectStore(f).get(`${c}${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(`${c}${e}`);if(r)return JSON.parse(r)}catch(r){console.warn("[useRequestCache] Read storage failed",r)}return null})(t);if(e){if(Date.now()-e.timestamp<o)return"indexedDB"!==h&&v.set(t,e),m.value=i?i(e.data):e.data,p&&p(m.value),m.value;await T(t)}}const e=r(u);S.set(t,e),x.set(t,{onSuccess:p?[p]:[],onError:g?[g]:[]});try{const r=await e,o={data:r,timestamp:Date.now()};"indexedDB"!==h&&v.set(t,o),"memory"!==h&&await(async(e,t)=>{if("indexedDB"===h){try{const r=await P(d,f);return new Promise((n,o)=>{const s=r.transaction([f],"readwrite").objectStore(f).put(t,`${c}${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(`${c}${e}`,JSON.stringify(t))}catch(n){console.warn("[useRequestCache] Write storage failed",n)}})(t,o),n&&E.add(t),m.value=i?i(r):r;const s=x.get(t);if(s&&s.onSuccess){[...s.onSuccess].forEach(e=>e(m.value))}return S.delete(t),x.delete(t),m.value}catch(R){b.value=R;const e=x.get(t);if(e&&e.onError){[...e.onError].forEach(e=>e(R))}throw S.delete(t),x.delete(t),R}}catch(R){throw b.value=R,R}finally{w.value=!1}},B=()=>R(!1);return a?e.watch(()=>y(a),()=>{B()},{deep:!0,immediate:u}):u&&B(),{data:m,loading:w,error:b,run:B,refresh:()=>R(!0),clearCache:async e=>{const t=e||q();t&&(v.delete(t),"memory"!==h&&await T(t))}}},exports.useTableRequest=function(t,r={}){const n={...b.pagination,...r.pagination},{params:o,immediate:s=b.immediate??!0,debounceDelay:a=b.debounceDelay??0,dataField:i=b.dataField??"",totalField:u=b.totalField??"",currentPageField:c=b.currentPageField??"",transformParams:l,transformResult:d,onSuccess:f,onError:p,incremental:g=b.incremental??!1}=r,{defaultPage:h=1,defaultPageSize:v=10,pageKey:S="page",pageSizeKey:x="pageSize"}=n,E=e.ref([]),q=e.ref(!1),P=e.ref(null),T=e.reactive({page:h,pageSize:v,total:0});let R=0;async function B(){const e=++R;q.value=!0,P.value=null;try{const r=o?y(o):{},n={[S]:T.page,[x]:T.pageSize};let s;s=l?l(r,{page:T.page,pageSize:T.pageSize}):{...r,...n};const a=await t(s);if(e!==R)return;if(d){const e=d(a);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;g&&T.page>h?E.value=[...E.value,...t]:E.value=t,T.total="number"==typeof e.total?e.total:e.list.length}else E.value=[],T.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=a;if(Array.isArray(e))g&&T.page>h?E.value=[...E.value,...e]:E.value=e,T.total=e.length;else if(e&&"object"==typeof e){if(i&&""!==i.trim()){const t=m(e,i)||[];g&&T.page>h?E.value=[...E.value,...t]:E.value=t}else E.value=[];u&&""!==u.trim()?T.total=m(e,u)??0:T.total=0}else E.value=[],T.total=0}if(c&&""!==c.trim()){const e=m(a,c);"number"==typeof e&&e!==T.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${T.page})不一致,已自动修正`),T.page=e)}f?.(E.value,a)}catch(r){if(e!==R)return;P.value=r instanceof Error?r:new Error(String(r)),p?.(P.value)}finally{e===R&&(q.value=!1)}}const $=a>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}(B,a):B;let C=!1;async function G(){await B()}return e.watch(()=>[T.page,T.pageSize],()=>{C||$()}),o&&(w(o,"useTableRequest"),e.watch(()=>y(o),()=>{C=!0,T.page=h,C=!1,$()},{deep:!0})),s&&B(),{data:E,loading:q,error:P,pagination:T,run:G,onPageChange:async function(e){const t=T.page!==e;T.page=e,t||await B()},onSizeChange:async function(e){const t=T.pageSize!==e,r=T.page!==h;T.pageSize=e,T.page=h,t||r||await B()},refresh:async function(){g?(C=!0,T.page=h,E.value=[],await e.nextTick(),C=!1,await B()):await G()}}};
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=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),r=(e,n)=>{const o={...e};for(const s in n){if(!Object.prototype.hasOwnProperty.call(n,s))continue;const e=n[s];if(void 0===e)continue;const a=o[s];t(e)&&t(a)?o[s]=r(a,e):o[s]=e}return o},n=e=>e>=200&&e<300,o=()=>!0,s=e=>new Promise(t=>setTimeout(t,e)),a=async e=>{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 await e.json()}catch(t){let n;try{n=await e.text()}catch{return}if(!n.trim())return;try{return JSON.parse(n)}catch(r){return}}},i=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),u=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))},c=async(e,t,r)=>!!e?.enabled&&(!(t>(e.maxRetryCount??3))&&(e.shouldRetry?await e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type)),l=(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),u=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 c=u.then.bind(u);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?l(c(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):c(e,r)},r.catchHttp=function(e){n=!0;const r=c(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return l(r,t)},r.catchBusiness=function(e){n=!0;const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return l(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return l(r,t)}return i(e)},r};class d{globalConfig={};constructor(e){e&&(this.globalConfig={...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)}async executeRequest(e,r,l=1){try{const y=e,w=y.signal;w&&(w.aborted?r.abort():w.addEventListener("abort",()=>r.abort(),{once:!0}));const b=(d=y.headers,f=y.url,p=y.method,d?"function"==typeof d?d({url:f,method:p}):d:{}),{body:v,urlParams:S}=((e,r,n)=>{if(!e)return{};if("GET"===r||"HEAD"===r||"OPTIONS"===r){if(t(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"===n&&e instanceof FormData)return{body:e};if("form"===n&&t(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"===n?{body:JSON.stringify(e)}:"text"===n?{body:String(e)}:"blob"===n&&e instanceof Blob||"arraybuffer"===n&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(y.data,y.method||"GET",y.requestType||"json"),x=((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})(y.baseURL,y.url,S),E=y.timeout;let q,P=!1,T=b;v&&"string"==typeof v&&"json"===y.requestType?T={"Content-Type":"application/json",...b}:v instanceof FormData&&(T=b);const R=new AbortController,B=()=>R.abort();r.signal.addEventListener("abort",B);const $={method:y.method||"GET",headers:T,body:v,mode:"cors",credentials:!1===y.withCredentials?"same-origin":"include",signal:R.signal},C=fetch(x,$);let G;try{if(E){const e=new Promise((e,t)=>{q=setTimeout(()=>{P=!0,R.abort(),t(i("Request timeout","timeout"))},E)});G=await Promise.race([C,e])}else G=await C}catch(g){if(q&&clearTimeout(q),P){const e=i("Request timeout","timeout");if(await c(y.retry,l,e))return r.signal.removeEventListener("abort",B),await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onNetworkError){const r=()=>{t=!0};await y.onNetworkError(u(new Error(e.message)),r)}const n=[void 0,e,!1,void 0];return n.__errorSuppressed=t,r.signal.removeEventListener("abort",B),n}throw g}finally{q&&clearTimeout(q),r.signal.removeEventListener("abort",B)}const _=y.responseType||"json";let D;try{D=await(async(e,t)=>{if(!e)throw new Error("No response received");switch(t){case"json":default:return await a(e);case"text":return await e.text();case"blob":return await e.blob();case"arraybuffer":return await e.arrayBuffer();case"formData":return await e.formData()}})(G,_)}catch(h){const e=i("Failed to parse response","network",G.status,void 0,h instanceof Error?h:new Error(String(h)));if(await c(y.retry,l,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onNetworkError){const r=()=>{t=!0};await y.onNetworkError(u(e.error||new Error(e.message)),r)}const n=[void 0,e,!1,void 0];return n.__errorSuppressed=t,n}if(!(y.validateStatus||n)(G.status)){const e=i(`HTTP Error: ${G.status} ${G.statusText}`,"http",G.status,D);if(await c(y.retry,l,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onHttpError){const r=()=>{t=!0},n=new Error(e.message);await y.onHttpError(n,G.status,D,r)}const n=[void 0,e,!1,{data:D,status:G.status,statusText:G.statusText,headers:G.headers,response:G}];return n.__errorSuppressed=t,n}if(!(y.validateResponse||o)(D)){const e=i("Business validation failed","business",G.status,D);if(await c(y.retry,l,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,r,l+1);let t=!1;if(y.onBusinessError){const r=()=>{t=!0},n=new Error(e.message);await y.onBusinessError(n,D,r)}const n=[void 0,e,!1,{data:D,status:G.status,statusText:G.statusText,headers:G.headers,response:G}];return n.__errorSuppressed=t,n}let F=D;if(y.transformResponse)try{F=y.transformResponse(D)}catch(m){console.warn("[toAwaitFetch] transformResponse error:",m)}return[F,void 0,!0,{data:D,status:G.status,statusText:G.statusText,headers:G.headers,response:G}]}catch(g){const t=(e=>e instanceof DOMException&&"AbortError"===e.name)(g),n=i(t?"Request aborted":g instanceof Error?g.message:"Network error","network",void 0,void 0,g instanceof Error?g:new Error(String(g)));if(!t&&await c(e.retry,l,n))return await s(e.retry?.delay||1e3),this.executeRequest(e,r,l+1);let o=!1;if(e.onNetworkError){const t=()=>{o=!0};await e.onNetworkError(u(n.error||new Error(n.message)),t)}const a=[void 0,n,!1,void 0];return a.__errorSuppressed=o,a}var d,f,p}request(e){const t=r({...this.globalConfig},e),n=new AbortController,o=this.executeRequest(t,n);return l(o,()=>n.abort())}setGlobalConfig(e){this.globalConfig={...e}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(e){this.globalConfig=r(this.globalConfig,e)}sendGet(e,t,r){return this.request({...r,url:e,method:"GET",data:t})}sendPost(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json"})}sendPostForm(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"form"})}sendPostBlob(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json",responseType:"blob"})}sendGetBlob(e,t,r){return this.request({...r,url:e,method:"GET",data:t,responseType:"blob"})}}const f=e=>new d(e),p=new d,g=e=>{e?.cancel?.()},h=Object.assign(e=>e&&"object"==typeof e&&"url"in e?p.request(e):f(e),{create:f,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:g});function m(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 y(t){return"function"==typeof t?t():e.unref(t)}function w(t,r){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==t&&!function(t){return"function"==typeof t||e.isRef(t)}(t)&&console.warn(`[${r}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const b={};const v=new Map,S=new Map,x=new Map,E=new Set;let q=null;const P=(e,t)=>new Promise((r,n)=>{if(q)return r(q);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{q=e.target.result,r(q)},o.onerror=e=>{n(e.target.error)}});const T="1.6.2";exports.VERSION=T,exports.cancel=g,exports.createInstance=f,exports.getTableRequestGlobalConfig=function(){return{...b,pagination:{...b.pagination}}},exports.getVersion=function(){return T},exports.sendGet=(e,t,r)=>p.request({...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={...b.pagination,...e.pagination})},exports.toAwaitFetch=h,exports.useInputNumber=function(t,r){let n,o;null===t||"object"!=typeof t||e.isRef(t)?(n=t,o=r||{}):(o=t,n="");const s=()=>e.toValue(o.precision)??0,a=()=>e.toValue(o.showThousands)??!1,i=e.ref(e.toValue(n)?.toString()??""),u=e.computed(()=>{let e=i.value;if(a()){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=t=>{let r=null==t?"":t.toString().trim();const n=e.toValue(o.allowNegative)?/[^\d.-]/g:/[^\d.]/g;r=r.replace(n,""),r=r.replace(/^-/,"$#$").replace(/-/g,"").replace("$#$","-"),r.length>1&&r.startsWith("0")&&"."!==r[1]&&(r=r.replace(/^0+/,""),""===r&&(r="0")),r.startsWith("-0")&&r.length>2&&"."!==r[2]&&(r="-"+r.slice(2).replace(/^0+/,""),"-"===r&&(r="-0"));const a=s();if(a>0){r=r.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const t=r.indexOf(".");if(-1!==t){if(r.slice(t+1).length>a){const n=e.toValue(o.decimalLimitMode)??"discard";if("discard"===n)r=r.slice(0,t+a+1);else{const e=Math.pow(10,a);let o=Number(r);isNaN(o)?r=r.slice(0,t+a+1):("round"===n?o=Math.round(o*e)/e:"ceil"===n&&(o=Math.ceil(o*e)/e),r=o.toString())}}}}else r=r.replace(/\./g,"");return r};return e.watch(()=>e.toValue(n),e=>{const t=null==e?"":e.toString();t!==i.value&&(i.value=t)}),{value:i,displayValue:u,handleInput:e=>{const t=c(e);i.value=t},handleBlur:()=>{if(!i.value)return;let t=Number(i.value);const r=o.max??1/0,n=o.min??-1/0;t>r&&(t=r,i.value=r.toString()),t<n&&(t=n,i.value=n.toString());const a=e.toValue(o.autoFixed)??!1;i.value=!0===a||"pad"===a?t.toFixed(s()):"trim"===a?Number(t.toFixed(s())).toString():t.toString()},formatter:e=>u.value,parser:e=>a()?e.replace(/,/g,""):e,clean:c}},exports.useRequestCache=function(t){const{requestFn:r,cacheKey:n,cacheTime:o=3e5,storage:s="memory",params:a,transformResult:i,immediate:u=!0,storageKeyPrefix:c="req_cache_",forceRefreshOnFirst:l=!1,dbName:d="RequestCacheDB",storeName:f="request_cache",onSuccess:p,onError:g}=t,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"}})(y(s)),m=e.ref(),w=e.ref(!1),b=e.ref(null),q=()=>{const e=a?y(a):{};if("function"==typeof n)try{return n(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return n},T=async e=>{if("indexedDB"===h){try{const t=await P(d,f);return new Promise((r,n)=>{const o=t.transaction([f],"readwrite").objectStore(f).delete(`${c}${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(`${c}${e}`)},R=async(e=!1)=>{const t=q();if(!t)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const n=y(l)&&!E.has(t),s=e||n,u=a?y(a):{};if(!s&&"indexedDB"!==h){const e=v.get(t);if(e){if(Date.now()-e.timestamp<o)return m.value=i?i(e.data):e.data,p&&p(m.value),m.value;v.delete(t)}}w.value=!0,b.value=null;try{if(S.has(t)){if(p||g){const e=x.get(t);e&&(p&&e.onSuccess.push(p),g&&e.onError.push(g))}const e=await S.get(t);return m.value=i?i(e):e,m.value}if(!s&&"memory"!==h){const e=await(async e=>{if("indexedDB"===h)try{const t=await P(d,f);return new Promise(r=>{const n=t.transaction([f],"readonly").objectStore(f).get(`${c}${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(`${c}${e}`);if(r)return JSON.parse(r)}catch(r){console.warn("[useRequestCache] Read storage failed",r)}return null})(t);if(e){if(Date.now()-e.timestamp<o)return"indexedDB"!==h&&v.set(t,e),m.value=i?i(e.data):e.data,p&&p(m.value),m.value;await T(t)}}const e=r(u);S.set(t,e),x.set(t,{onSuccess:p?[p]:[],onError:g?[g]:[]});try{const r=await e,o={data:r,timestamp:Date.now()};"indexedDB"!==h&&v.set(t,o),"memory"!==h&&await(async(e,t)=>{if("indexedDB"===h){try{const r=await P(d,f);return new Promise((n,o)=>{const s=r.transaction([f],"readwrite").objectStore(f).put(t,`${c}${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(`${c}${e}`,JSON.stringify(t))}catch(n){console.warn("[useRequestCache] Write storage failed",n)}})(t,o),n&&E.add(t),m.value=i?i(r):r;const s=x.get(t);if(s&&s.onSuccess){[...s.onSuccess].forEach(e=>e(m.value))}return S.delete(t),x.delete(t),m.value}catch(R){b.value=R;const e=x.get(t);if(e&&e.onError){[...e.onError].forEach(e=>e(R))}throw S.delete(t),x.delete(t),R}}catch(R){throw b.value=R,R}finally{w.value=!1}},B=()=>R(!1);return a?e.watch(()=>y(a),()=>{B()},{deep:!0,immediate:u}):u&&B(),{data:m,loading:w,error:b,run:B,refresh:()=>R(!0),clearCache:async e=>{const t=e||q();t&&(v.delete(t),"memory"!==h&&await T(t))}}},exports.useTableRequest=function(t,r={}){const n={...b.pagination,...r.pagination},{params:o,immediate:s=b.immediate??!0,debounceDelay:a=b.debounceDelay??0,dataField:i=b.dataField??"",totalField:u=b.totalField??"",currentPageField:c=b.currentPageField??"",transformParams:l,transformResult:d,onSuccess:f,onError:p,incremental:g=b.incremental??!1}=r,{defaultPage:h=1,defaultPageSize:v=10,pageKey:S="page",pageSizeKey:x="pageSize"}=n,E=e.ref([]),q=e.ref(!1),P=e.ref(null),T=e.reactive({page:h,pageSize:v,total:0});let R=0;async function B(){const e=++R;q.value=!0,P.value=null;try{const r=o?y(o):{},n={[S]:T.page,[x]:T.pageSize};let s;s=l?l(r,{page:T.page,pageSize:T.pageSize}):{...r,...n};const a=await t(s);if(e!==R)return;if(d){const e=d(a);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;g&&T.page>h?E.value=[...E.value,...t]:E.value=t,T.total="number"==typeof e.total?e.total:e.list.length}else E.value=[],T.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=a;if(Array.isArray(e))g&&T.page>h?E.value=[...E.value,...e]:E.value=e,T.total=e.length;else if(e&&"object"==typeof e){if(i&&""!==i.trim()){const t=m(e,i)||[];g&&T.page>h?E.value=[...E.value,...t]:E.value=t}else E.value=[];u&&""!==u.trim()?T.total=m(e,u)??0:T.total=0}else E.value=[],T.total=0}if(c&&""!==c.trim()){const e=m(a,c);"number"==typeof e&&e!==T.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${T.page})不一致,已自动修正`),T.page=e)}f?.(E.value,a)}catch(r){if(e!==R)return;P.value=r instanceof Error?r:new Error(String(r)),p?.(P.value)}finally{e===R&&(q.value=!1)}}const $=a>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}(B,a):B;let C=!1;async function G(){await B()}return e.watch(()=>[T.page,T.pageSize],()=>{C||$()}),o&&(w(o,"useTableRequest"),e.watch(()=>y(o),()=>{C=!0,T.page=h,C=!1,$()},{deep:!0})),s&&B(),{data:E,loading:q,error:P,pagination:T,run:G,onPageChange:async function(e){const t=T.page!==e;T.page=e,t||await B()},onSizeChange:async function(e){const t=T.pageSize!==e,r=T.page!==h;T.pageSize=e,T.page=h,t||r||await B()},refresh:async function(){g?(C=!0,T.page=h,E.value=[],await e.nextTick(),C=!1,await B()):await G()}}};
|
package/dist/index.es.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{unref as e,isRef as t,ref as r,reactive as n,watch as o,nextTick as s,toValue as a,computed as i}from"vue";const u=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),c=(e,t)=>{const r={...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];u(e)&&u(o)?r[n]=c(o,e):r[n]=e}return r},l=e=>e>=200&&e<300,d=()=>!0,f=e=>new Promise(t=>setTimeout(t,e)),p=async e=>{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 await e.json()}catch(t){let n;try{n=await e.text()}catch{return}if(!n.trim())return;try{return JSON.parse(n)}catch(r){return}}},g=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),h=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))},m=async(e,t,r)=>!!e?.enabled&&(!(t>(e.maxRetryCount??3))&&(e.shouldRetry?await e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type)),y=(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),u=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 c=u.then.bind(u);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?y(c(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):c(e,r)},r.catchHttp=function(e){n=!0;const r=c(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return y(r,t)},r.catchBusiness=function(e){n=!0;const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return y(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return y(r,t)}return i(e)},r};class w{globalConfig={};constructor(e){e&&(this.globalConfig={...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)}async executeRequest(e,t,r=1){try{const y=e,w=y.signal;w&&(w.aborted?t.abort():w.addEventListener("abort",()=>t.abort(),{once:!0}));const b=(n=y.headers,o=y.url,s=y.method,n?"function"==typeof n?n({url:o,method:s}):n:{}),{body:v,urlParams:S}=((e,t,r)=>{if(!e)return{};if("GET"===t||"HEAD"===t||"OPTIONS"===t){if(u(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&&u(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)}})(y.data,y.method||"GET",y.requestType||"json"),E=((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})(y.baseURL,y.url,S),P=y.timeout;let q,x=!1,T=b;v&&"string"==typeof v&&"json"===y.requestType?T={"Content-Type":"application/json",...b}:v instanceof FormData&&(T=b);const $=new AbortController,B=()=>$.abort();t.signal.addEventListener("abort",B);const R={method:y.method||"GET",headers:T,body:v,mode:"cors",credentials:!1===y.withCredentials?"same-origin":"include",signal:$.signal},C=fetch(E,R);let _;try{if(P){const e=new Promise((e,t)=>{q=setTimeout(()=>{x=!0,$.abort(),t(g("Request timeout","timeout"))},P)});_=await Promise.race([C,e])}else _=await C}catch(a){if(q&&clearTimeout(q),x){const e=g("Request timeout","timeout");if(await m(y.retry,r,e))return t.signal.removeEventListener("abort",B),await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onNetworkError){const t=()=>{n=!0};await y.onNetworkError(h(new Error(e.message)),t)}const o=[void 0,e,!1,void 0];return o.__errorSuppressed=n,t.signal.removeEventListener("abort",B),o}throw a}finally{q&&clearTimeout(q),t.signal.removeEventListener("abort",B)}const D=y.responseType||"json";let F;try{F=await(async(e,t)=>{if(!e)throw new Error("No response received");switch(t){case"json":default:return await p(e);case"text":return await e.text();case"blob":return await e.blob();case"arraybuffer":return await e.arrayBuffer();case"formData":return await e.formData()}})(_,D)}catch(i){const e=g("Failed to parse response","network",_.status,void 0,i instanceof Error?i:new Error(String(i)));if(await m(y.retry,r,e))return await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onNetworkError){const t=()=>{n=!0};await y.onNetworkError(h(e.error||new Error(e.message)),t)}const o=[void 0,e,!1,void 0];return o.__errorSuppressed=n,o}if(!(y.validateStatus||l)(_.status)){const e=g(`HTTP Error: ${_.status} ${_.statusText}`,"http",_.status,F);if(await m(y.retry,r,e))return await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onHttpError){const t=()=>{n=!0},r=new Error(e.message);await y.onHttpError(r,_.status,F,t)}const o=[void 0,e,!1,{data:F,status:_.status,statusText:_.statusText,headers:_.headers,response:_}];return o.__errorSuppressed=n,o}if(!(y.validateResponse||d)(F)){const e=g("Business validation failed","business",_.status,F);if(await m(y.retry,r,e))return await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onBusinessError){const t=()=>{n=!0},r=new Error(e.message);await y.onBusinessError(r,F,t)}const o=[void 0,e,!1,{data:F,status:_.status,statusText:_.statusText,headers:_.headers,response:_}];return o.__errorSuppressed=n,o}let G=F;if(y.transformResponse)try{G=y.transformResponse(F)}catch(c){console.warn("[toAwaitFetch] transformResponse error:",c)}return[G,void 0,!0,{data:F,status:_.status,statusText:_.statusText,headers:_.headers,response:_}]}catch(a){const n=(e=>e instanceof DOMException&&"AbortError"===e.name)(a),o=g(n?"Request aborted":a instanceof Error?a.message:"Network error","network",void 0,void 0,a instanceof Error?a:new Error(String(a)));if(!n&&await m(e.retry,r,o))return await f(e.retry?.delay||1e3),this.executeRequest(e,t,r+1);let s=!1;if(e.onNetworkError){const t=()=>{s=!0};await e.onNetworkError(h(o.error||new Error(o.message)),t)}const i=[void 0,o,!1,void 0];return i.__errorSuppressed=s,i}var n,o,s}request(e){const t=c({...this.globalConfig},e),r=new AbortController,n=this.executeRequest(t,r);return y(n,()=>r.abort())}setGlobalConfig(e){this.globalConfig={...e}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(e){this.globalConfig=c(this.globalConfig,e)}sendGet(e,t,r){return this.request({...r,url:e,method:"GET",data:t})}sendPost(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json"})}sendPostForm(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"form"})}sendPostBlob(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json",responseType:"blob"})}sendGetBlob(e,t,r){return this.request({...r,url:e,method:"GET",data:t,responseType:"blob"})}}const b=e=>new w(e),v=new w,S=(e,t,r)=>v.request({...r,url:e,method:"GET",data:t}),E=(e,t,r)=>v.sendPost(e,t,r),P=(e,t,r)=>v.sendPostForm(e,t,r),q=(e,t,r)=>v.sendPostBlob(e,t,r),x=(e,t,r)=>v.sendGetBlob(e,t,r),T=e=>{v.setGlobalConfig(e)},$=e=>{e?.cancel?.()},B=Object.assign(e=>e&&"object"==typeof e&&"url"in e?v.request(e):b(e),{create:b,sendGet:v.sendGet.bind(v),sendPost:v.sendPost.bind(v),sendPostForm:v.sendPostForm.bind(v),sendPostBlob:v.sendPostBlob.bind(v),sendGetBlob:v.sendGetBlob.bind(v),setGlobalConfig:v.setGlobalConfig.bind(v),cancel:$});function R(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 C(t){return"function"==typeof t?t():e(t)}function _(e,r){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==e&&!function(e){return"function"==typeof e||t(e)}(e)&&console.warn(`[${r}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const D={};function F(e){Object.assign(D,e),e.pagination&&(D.pagination={...D.pagination,...e.pagination})}function G(){return{...D,pagination:{...D.pagination}}}function j(e,t={}){const a={...D.pagination,...t.pagination},{params:i,immediate:u=D.immediate??!0,debounceDelay:c=D.debounceDelay??0,dataField:l=D.dataField??"",totalField:d=D.totalField??"",currentPageField:f=D.currentPageField??"",transformParams:p,transformResult:g,onSuccess:h,onError:m,incremental:y=D.incremental??!1}=t,{defaultPage:w=1,defaultPageSize:b=10,pageKey:v="page",pageSizeKey:S="pageSize"}=a,E=r([]),P=r(!1),q=r(null),x=n({page:w,pageSize:b,total:0});let T=0;async function $(){const t=++T;P.value=!0,q.value=null;try{const r=i?C(i):{},n={[v]:x.page,[S]:x.pageSize};let o;o=p?p(r,{page:x.page,pageSize:x.pageSize}):{...r,...n};const s=await e(o);if(t!==T)return;if(g){const e=g(s);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;y&&x.page>w?E.value=[...E.value,...t]:E.value=t,x.total="number"==typeof e.total?e.total:e.list.length}else E.value=[],x.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=s;if(Array.isArray(e))y&&x.page>w?E.value=[...E.value,...e]:E.value=e,x.total=e.length;else if(e&&"object"==typeof e){if(l&&""!==l.trim()){const t=R(e,l)||[];y&&x.page>w?E.value=[...E.value,...t]:E.value=t}else E.value=[];d&&""!==d.trim()?x.total=R(e,d)??0:x.total=0}else E.value=[],x.total=0}if(f&&""!==f.trim()){const e=R(s,f);"number"==typeof e&&e!==x.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${x.page})不一致,已自动修正`),x.page=e)}h?.(E.value,s)}catch(r){if(t!==T)return;q.value=r instanceof Error?r:new Error(String(r)),m?.(q.value)}finally{t===T&&(P.value=!1)}}const B=c>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}($,c):$;let F=!1;async function G(){await $()}return o(()=>[x.page,x.pageSize],()=>{F||B()}),i&&(_(i,"useTableRequest"),o(()=>C(i),()=>{F=!0,x.page=w,F=!1,B()},{deep:!0})),u&&$(),{data:E,loading:P,error:q,pagination:x,run:G,onPageChange:async function(e){const t=x.page!==e;x.page=e,t||await $()},onSizeChange:async function(e){const t=x.pageSize!==e,r=x.page!==w;x.pageSize=e,x.page=w,t||r||await $()},refresh:async function(){y?(F=!0,x.page=w,E.value=[],await s(),F=!1,await $()):await G()}}}function N(e,n){let s,u;null===e||"object"!=typeof e||t(e)?(s=e,u=n||{}):(u=e,s="");const c=()=>a(u.precision)??0,l=()=>a(u.showThousands)??!1,d=r(a(s)?.toString()??""),f=i(()=>{let e=d.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}),p=e=>{let t=null==e?"":e.toString().trim();const r=a(u.allowNegative)?/[^\d.-]/g:/[^\d.]/g;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 n=c();if(n>0){t=t.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const e=t.indexOf(".");if(-1!==e){if(t.slice(e+1).length>n){const r=a(u.decimalLimitMode)??"discard";if("discard"===r)t=t.slice(0,e+n+1);else{const o=Math.pow(10,n);let s=Number(t);isNaN(s)?t=t.slice(0,e+n+1):("round"===r?s=Math.round(s*o)/o:"ceil"===r&&(s=Math.ceil(s*o)/o),t=s.toString())}}}}else t=t.replace(/\./g,"");return t};return o(()=>a(s),e=>{const t=null==e?"":e.toString();t!==d.value&&(d.value=t)}),{value:d,displayValue:f,handleInput:e=>{const t=p(e);d.value=t},handleBlur:()=>{if(!d.value)return;let e=Number(d.value);const t=u.max??1/0,r=u.min??-1/0;e>t&&(e=t,d.value=t.toString()),e<r&&(e=r,d.value=r.toString());const n=a(u.autoFixed)??!1;d.value=!0===n||"pad"===n?e.toFixed(c()):"trim"===n?Number(e.toFixed(c())).toString():e.toString()},formatter:e=>f.value,parser:e=>l()?e.replace(/,/g,""):e,clean:p}}const O=/* @__PURE__ */new Map,k=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,z=/* @__PURE__ */new Set;let M=null;const I=(e,t)=>new Promise((r,n)=>{if(M)return r(M);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{M=e.target.result,r(M)},o.onerror=e=>{n(e.target.error)}});function L(e){const{requestFn:t,cacheKey:n,cacheTime:s=3e5,storage:a="memory",params:i,transformResult:u,immediate:c=!0,storageKeyPrefix:l="req_cache_",forceRefreshOnFirst:d=!1,dbName:f="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"}})(C(a)),y=r(),w=r(!1),b=r(null),v=()=>{const e=i?C(i):{};if("function"==typeof n)try{return n(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return n},S=async e=>{if("indexedDB"===m){try{const t=await I(f,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}`)},E=async(e=!1)=>{const r=v();if(!r)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const n=C(d)&&!z.has(r),o=e||n,a=i?C(i):{};if(!o&&"indexedDB"!==m){const e=O.get(r);if(e){if(Date.now()-e.timestamp<s)return y.value=u?u(e.data):e.data,g&&g(y.value),y.value;O.delete(r)}}w.value=!0,b.value=null;try{if(k.has(r)){if(g||h){const e=A.get(r);e&&(g&&e.onSuccess.push(g),h&&e.onError.push(h))}const e=await k.get(r);return y.value=u?u(e):e,y.value}if(!o&&"memory"!==m){const e=await(async e=>{if("indexedDB"===m)try{const t=await I(f,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<s)return"indexedDB"!==m&&O.set(r,e),y.value=u?u(e.data):e.data,g&&g(y.value),y.value;await S(r)}}const e=t(a);k.set(r,e),A.set(r,{onSuccess:g?[g]:[],onError:h?[h]:[]});try{const t=await e,o={data:t,timestamp:Date.now()};"indexedDB"!==m&&O.set(r,o),"memory"!==m&&await(async(e,t)=>{if("indexedDB"===m){try{const r=await I(f,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,o),n&&z.add(r),y.value=u?u(t):t;const s=A.get(r);if(s&&s.onSuccess){[...s.onSuccess].forEach(e=>e(y.value))}return k.delete(r),A.delete(r),y.value}catch(c){b.value=c;const e=A.get(r);if(e&&e.onError){[...e.onError].forEach(e=>e(c))}throw k.delete(r),A.delete(r),c}}catch(c){throw b.value=c,c}finally{w.value=!1}},P=()=>E(!1);return i?o(()=>C(i),()=>{P()},{deep:!0,immediate:c}):c&&P(),{data:y,loading:w,error:b,run:P,refresh:()=>E(!0),clearCache:async e=>{const t=e||v();t&&(O.delete(t),"memory"!==m&&await S(t))}}}const W="1.6.0";function H(){return W}export{W as VERSION,$ as cancel,b as createInstance,G as getTableRequestGlobalConfig,H as getVersion,S as sendGet,x as sendGetBlob,E as sendPost,q as sendPostBlob,P as sendPostForm,T as setGlobalConfig,F as setTableRequestGlobalConfig,B as toAwaitFetch,N as useInputNumber,L as useRequestCache,j as useTableRequest};
|
|
1
|
+
import{unref as e,isRef as t,ref as r,reactive as n,watch as o,nextTick as s,toValue as a,computed as i}from"vue";const u=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),c=(e,t)=>{const r={...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];u(e)&&u(o)?r[n]=c(o,e):r[n]=e}return r},l=e=>e>=200&&e<300,d=()=>!0,f=e=>new Promise(t=>setTimeout(t,e)),p=async e=>{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 await e.json()}catch(t){let n;try{n=await e.text()}catch{return}if(!n.trim())return;try{return JSON.parse(n)}catch(r){return}}},g=(e,t,r,n,o)=>({message:e,type:t,status:r,response:n,error:o}),h=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))},m=async(e,t,r)=>!!e?.enabled&&(!(t>(e.maxRetryCount??3))&&(e.shouldRetry?await e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type)),y=(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),u=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 c=u.then.bind(u);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&e.length<=2?y(c(t=>{const r=t[2],n=t[0],o=t[3];return r&&void 0!==n&&e(n,o),t}),t):c(e,r)},r.catchHttp=function(e){n=!0;const r=c(t=>{const r=t[2],n=t[1];return!r&&n&&"http"===n.type&&e(n),!r&&n&&(t.__errorSuppressed=!0),t});return y(r,t)},r.catchBusiness=function(e){n=!0;const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&"business"===r.type&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return y(r,t)},r.catchNetwork=function(e){if(n=!0,e&&"function"==typeof e){const r=c(t=>{const r=t[1],n=t[2];return!n&&r&&e(r),!n&&r&&(t.__errorSuppressed=!0),t});return y(r,t)}return i(e)},r};class w{globalConfig={};constructor(e){e&&(this.globalConfig={...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)}async executeRequest(e,t,r=1){try{const y=e,w=y.signal;w&&(w.aborted?t.abort():w.addEventListener("abort",()=>t.abort(),{once:!0}));const b=(n=y.headers,o=y.url,s=y.method,n?"function"==typeof n?n({url:o,method:s}):n:{}),{body:v,urlParams:S}=((e,t,r)=>{if(!e)return{};if("GET"===t||"HEAD"===t||"OPTIONS"===t){if(u(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&&u(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)}})(y.data,y.method||"GET",y.requestType||"json"),E=((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})(y.baseURL,y.url,S),P=y.timeout;let q,x=!1,T=b;v&&"string"==typeof v&&"json"===y.requestType?T={"Content-Type":"application/json",...b}:v instanceof FormData&&(T=b);const $=new AbortController,B=()=>$.abort();t.signal.addEventListener("abort",B);const R={method:y.method||"GET",headers:T,body:v,mode:"cors",credentials:!1===y.withCredentials?"same-origin":"include",signal:$.signal},C=fetch(E,R);let _;try{if(P){const e=new Promise((e,t)=>{q=setTimeout(()=>{x=!0,$.abort(),t(g("Request timeout","timeout"))},P)});_=await Promise.race([C,e])}else _=await C}catch(a){if(q&&clearTimeout(q),x){const e=g("Request timeout","timeout");if(await m(y.retry,r,e))return t.signal.removeEventListener("abort",B),await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onNetworkError){const t=()=>{n=!0};await y.onNetworkError(h(new Error(e.message)),t)}const o=[void 0,e,!1,void 0];return o.__errorSuppressed=n,t.signal.removeEventListener("abort",B),o}throw a}finally{q&&clearTimeout(q),t.signal.removeEventListener("abort",B)}const D=y.responseType||"json";let F;try{F=await(async(e,t)=>{if(!e)throw new Error("No response received");switch(t){case"json":default:return await p(e);case"text":return await e.text();case"blob":return await e.blob();case"arraybuffer":return await e.arrayBuffer();case"formData":return await e.formData()}})(_,D)}catch(i){const e=g("Failed to parse response","network",_.status,void 0,i instanceof Error?i:new Error(String(i)));if(await m(y.retry,r,e))return await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onNetworkError){const t=()=>{n=!0};await y.onNetworkError(h(e.error||new Error(e.message)),t)}const o=[void 0,e,!1,void 0];return o.__errorSuppressed=n,o}if(!(y.validateStatus||l)(_.status)){const e=g(`HTTP Error: ${_.status} ${_.statusText}`,"http",_.status,F);if(await m(y.retry,r,e))return await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onHttpError){const t=()=>{n=!0},r=new Error(e.message);await y.onHttpError(r,_.status,F,t)}const o=[void 0,e,!1,{data:F,status:_.status,statusText:_.statusText,headers:_.headers,response:_}];return o.__errorSuppressed=n,o}if(!(y.validateResponse||d)(F)){const e=g("Business validation failed","business",_.status,F);if(await m(y.retry,r,e))return await f(y.retry?.delay||1e3),this.executeRequest(y,t,r+1);let n=!1;if(y.onBusinessError){const t=()=>{n=!0},r=new Error(e.message);await y.onBusinessError(r,F,t)}const o=[void 0,e,!1,{data:F,status:_.status,statusText:_.statusText,headers:_.headers,response:_}];return o.__errorSuppressed=n,o}let G=F;if(y.transformResponse)try{G=y.transformResponse(F)}catch(c){console.warn("[toAwaitFetch] transformResponse error:",c)}return[G,void 0,!0,{data:F,status:_.status,statusText:_.statusText,headers:_.headers,response:_}]}catch(a){const n=(e=>e instanceof DOMException&&"AbortError"===e.name)(a),o=g(n?"Request aborted":a instanceof Error?a.message:"Network error","network",void 0,void 0,a instanceof Error?a:new Error(String(a)));if(!n&&await m(e.retry,r,o))return await f(e.retry?.delay||1e3),this.executeRequest(e,t,r+1);let s=!1;if(e.onNetworkError){const t=()=>{s=!0};await e.onNetworkError(h(o.error||new Error(o.message)),t)}const i=[void 0,o,!1,void 0];return i.__errorSuppressed=s,i}var n,o,s}request(e){const t=c({...this.globalConfig},e),r=new AbortController,n=this.executeRequest(t,r);return y(n,()=>r.abort())}setGlobalConfig(e){this.globalConfig={...e}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(e){this.globalConfig=c(this.globalConfig,e)}sendGet(e,t,r){return this.request({...r,url:e,method:"GET",data:t})}sendPost(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json"})}sendPostForm(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"form"})}sendPostBlob(e,t,r){return this.request({...r,url:e,method:"POST",data:t,requestType:"json",responseType:"blob"})}sendGetBlob(e,t,r){return this.request({...r,url:e,method:"GET",data:t,responseType:"blob"})}}const b=e=>new w(e),v=new w,S=(e,t,r)=>v.request({...r,url:e,method:"GET",data:t}),E=(e,t,r)=>v.sendPost(e,t,r),P=(e,t,r)=>v.sendPostForm(e,t,r),q=(e,t,r)=>v.sendPostBlob(e,t,r),x=(e,t,r)=>v.sendGetBlob(e,t,r),T=e=>{v.setGlobalConfig(e)},$=e=>{e?.cancel?.()},B=Object.assign(e=>e&&"object"==typeof e&&"url"in e?v.request(e):b(e),{create:b,sendGet:v.sendGet.bind(v),sendPost:v.sendPost.bind(v),sendPostForm:v.sendPostForm.bind(v),sendPostBlob:v.sendPostBlob.bind(v),sendGetBlob:v.sendGetBlob.bind(v),setGlobalConfig:v.setGlobalConfig.bind(v),cancel:$});function R(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 C(t){return"function"==typeof t?t():e(t)}function _(e,r){"undefined"!=typeof __DEV__&&__DEV__&&void 0!==e&&!function(e){return"function"==typeof e||t(e)}(e)&&console.warn(`[${r}] 检测到 params 是普通对象,参数变化将不会触发请求更新。\n请使用 computed() 或 getter 函数包装:`)}const D={};function F(e){Object.assign(D,e),e.pagination&&(D.pagination={...D.pagination,...e.pagination})}function G(){return{...D,pagination:{...D.pagination}}}function j(e,t={}){const a={...D.pagination,...t.pagination},{params:i,immediate:u=D.immediate??!0,debounceDelay:c=D.debounceDelay??0,dataField:l=D.dataField??"",totalField:d=D.totalField??"",currentPageField:f=D.currentPageField??"",transformParams:p,transformResult:g,onSuccess:h,onError:m,incremental:y=D.incremental??!1}=t,{defaultPage:w=1,defaultPageSize:b=10,pageKey:v="page",pageSizeKey:S="pageSize"}=a,E=r([]),P=r(!1),q=r(null),x=n({page:w,pageSize:b,total:0});let T=0;async function $(){const t=++T;P.value=!0,q.value=null;try{const r=i?C(i):{},n={[v]:x.page,[S]:x.pageSize};let o;o=p?p(r,{page:x.page,pageSize:x.pageSize}):{...r,...n};const s=await e(o);if(t!==T)return;if(g){const e=g(s);if(e&&"object"==typeof e&&Array.isArray(e.list)){const t=e.list;y&&x.page>w?E.value=[...E.value,...t]:E.value=t,x.total="number"==typeof e.total?e.total:e.list.length}else E.value=[],x.total=0,console.warn("[useTableRequest] transformResult 返回格式无法识别,请返回 { list: T[], total: number } 格式。")}else{const e=s;if(Array.isArray(e))y&&x.page>w?E.value=[...E.value,...e]:E.value=e,x.total=e.length;else if(e&&"object"==typeof e){if(l&&""!==l.trim()){const t=R(e,l)||[];y&&x.page>w?E.value=[...E.value,...t]:E.value=t}else E.value=[];d&&""!==d.trim()?x.total=R(e,d)??0:x.total=0}else E.value=[],x.total=0}if(f&&""!==f.trim()){const e=R(s,f);"number"==typeof e&&e!==x.page&&(console.warn(`[useTableRequest] 后端返回页码(${e})与客户端页码(${x.page})不一致,已自动修正`),x.page=e)}h?.(E.value,s)}catch(r){if(t!==T)return;q.value=r instanceof Error?r:new Error(String(r)),m?.(q.value)}finally{t===T&&(P.value=!1)}}const B=c>0?function(e,t){let r=null;return(...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{e(...n),r=null},t)}}($,c):$;let F=!1;async function G(){await $()}return o(()=>[x.page,x.pageSize],()=>{F||B()}),i&&(_(i,"useTableRequest"),o(()=>C(i),()=>{F=!0,x.page=w,F=!1,B()},{deep:!0})),u&&$(),{data:E,loading:P,error:q,pagination:x,run:G,onPageChange:async function(e){const t=x.page!==e;x.page=e,t||await $()},onSizeChange:async function(e){const t=x.pageSize!==e,r=x.page!==w;x.pageSize=e,x.page=w,t||r||await $()},refresh:async function(){y?(F=!0,x.page=w,E.value=[],await s(),F=!1,await $()):await G()}}}function N(e,n){let s,u;null===e||"object"!=typeof e||t(e)?(s=e,u=n||{}):(u=e,s="");const c=()=>a(u.precision)??0,l=()=>a(u.showThousands)??!1,d=r(a(s)?.toString()??""),f=i(()=>{let e=d.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}),p=e=>{let t=null==e?"":e.toString().trim();const r=a(u.allowNegative)?/[^\d.-]/g:/[^\d.]/g;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 n=c();if(n>0){t=t.replace(/^\./g,"").replace(/\./g,"$#$").replace(/\./g,"").replace("$#$",".");const e=t.indexOf(".");if(-1!==e){if(t.slice(e+1).length>n){const r=a(u.decimalLimitMode)??"discard";if("discard"===r)t=t.slice(0,e+n+1);else{const o=Math.pow(10,n);let s=Number(t);isNaN(s)?t=t.slice(0,e+n+1):("round"===r?s=Math.round(s*o)/o:"ceil"===r&&(s=Math.ceil(s*o)/o),t=s.toString())}}}}else t=t.replace(/\./g,"");return t};return o(()=>a(s),e=>{const t=null==e?"":e.toString();t!==d.value&&(d.value=t)}),{value:d,displayValue:f,handleInput:e=>{const t=p(e);d.value=t},handleBlur:()=>{if(!d.value)return;let e=Number(d.value);const t=u.max??1/0,r=u.min??-1/0;e>t&&(e=t,d.value=t.toString()),e<r&&(e=r,d.value=r.toString());const n=a(u.autoFixed)??!1;d.value=!0===n||"pad"===n?e.toFixed(c()):"trim"===n?Number(e.toFixed(c())).toString():e.toString()},formatter:e=>f.value,parser:e=>l()?e.replace(/,/g,""):e,clean:p}}const O=/* @__PURE__ */new Map,k=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,z=/* @__PURE__ */new Set;let M=null;const I=(e,t)=>new Promise((r,n)=>{if(M)return r(M);const o=indexedDB.open(e,1);o.onupgradeneeded=e=>{const r=e.target.result;r.objectStoreNames.contains(t)||r.createObjectStore(t)},o.onsuccess=e=>{M=e.target.result,r(M)},o.onerror=e=>{n(e.target.error)}});function L(e){const{requestFn:t,cacheKey:n,cacheTime:s=3e5,storage:a="memory",params:i,transformResult:u,immediate:c=!0,storageKeyPrefix:l="req_cache_",forceRefreshOnFirst:d=!1,dbName:f="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"}})(C(a)),y=r(),w=r(!1),b=r(null),v=()=>{const e=i?C(i):{};if("function"==typeof n)try{return n(e)}catch(t){return console.warn("[useRequestCache] Generate key failed",t),""}return n},S=async e=>{if("indexedDB"===m){try{const t=await I(f,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}`)},E=async(e=!1)=>{const r=v();if(!r)return void console.warn("[useRequestCache] Cache key is empty, skipping request");const n=C(d)&&!z.has(r),o=e||n,a=i?C(i):{};if(!o&&"indexedDB"!==m){const e=O.get(r);if(e){if(Date.now()-e.timestamp<s)return y.value=u?u(e.data):e.data,g&&g(y.value),y.value;O.delete(r)}}w.value=!0,b.value=null;try{if(k.has(r)){if(g||h){const e=A.get(r);e&&(g&&e.onSuccess.push(g),h&&e.onError.push(h))}const e=await k.get(r);return y.value=u?u(e):e,y.value}if(!o&&"memory"!==m){const e=await(async e=>{if("indexedDB"===m)try{const t=await I(f,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<s)return"indexedDB"!==m&&O.set(r,e),y.value=u?u(e.data):e.data,g&&g(y.value),y.value;await S(r)}}const e=t(a);k.set(r,e),A.set(r,{onSuccess:g?[g]:[],onError:h?[h]:[]});try{const t=await e,o={data:t,timestamp:Date.now()};"indexedDB"!==m&&O.set(r,o),"memory"!==m&&await(async(e,t)=>{if("indexedDB"===m){try{const r=await I(f,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,o),n&&z.add(r),y.value=u?u(t):t;const s=A.get(r);if(s&&s.onSuccess){[...s.onSuccess].forEach(e=>e(y.value))}return k.delete(r),A.delete(r),y.value}catch(c){b.value=c;const e=A.get(r);if(e&&e.onError){[...e.onError].forEach(e=>e(c))}throw k.delete(r),A.delete(r),c}}catch(c){throw b.value=c,c}finally{w.value=!1}},P=()=>E(!1);return i?o(()=>C(i),()=>{P()},{deep:!0,immediate:c}):c&&P(),{data:y,loading:w,error:b,run:P,refresh:()=>E(!0),clearCache:async e=>{const t=e||v();t&&(O.delete(t),"memory"!==m&&await S(t))}}}const W="1.6.2";function H(){return W}export{W as VERSION,$ as cancel,b as createInstance,G as getTableRequestGlobalConfig,H as getVersion,S as sendGet,x as sendGetBlob,E as sendPost,q as sendPostBlob,P as sendPostForm,T as setGlobalConfig,F as setTableRequestGlobalConfig,B as toAwaitFetch,N as useInputNumber,L as useRequestCache,j as useTableRequest};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../hooks/toSentrySetup/toSentrySetup'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../hooks/toSentrySetup/toReactSentrySetup'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../hooks/toSentrySetup/toVue2SentrySetup'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../hooks/toSentrySetup/toVue3SentrySetup'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xn-fe-tools",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "A powerful fetch wrapper with chaining & tuple API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs.js",
|
|
@@ -69,13 +69,15 @@
|
|
|
69
69
|
},
|
|
70
70
|
"files": [
|
|
71
71
|
"dist",
|
|
72
|
+
"sentry",
|
|
72
73
|
"docs/tools",
|
|
73
74
|
"docs/rules"
|
|
74
75
|
],
|
|
75
76
|
"sideEffects": false,
|
|
76
77
|
"scripts": {
|
|
77
78
|
"dev": "vite",
|
|
78
|
-
"build": "vite build && tsc --emitDeclarationOnly && pnpm build:metadata && pnpm build:mcp",
|
|
79
|
+
"build": "vite build && tsc --emitDeclarationOnly && pnpm build:sentry-types && pnpm build:metadata && pnpm build:mcp",
|
|
80
|
+
"build:sentry-types": "node scripts/generate-sentry-types.mjs",
|
|
79
81
|
"build:metadata": "tsx scripts/generate-metadata.ts",
|
|
80
82
|
"build:mcp": "node scripts/build-mcp.mjs",
|
|
81
83
|
"build:docs": "vitepress build docs && node scripts/post-build-docs.js",
|
|
@@ -96,8 +98,7 @@
|
|
|
96
98
|
"release:major": "node scripts/release.js major",
|
|
97
99
|
"addHook": "node scripts/add-hook.js",
|
|
98
100
|
"removeHook": "node scripts/remove-hook.js",
|
|
99
|
-
"prepublishOnly": "node scripts/prepublish.js"
|
|
100
|
-
"prepare": "simple-git-hooks"
|
|
101
|
+
"prepublishOnly": "node scripts/prepublish.js"
|
|
101
102
|
},
|
|
102
103
|
"keywords": [
|
|
103
104
|
"vue",
|
|
@@ -118,9 +119,6 @@
|
|
|
118
119
|
"optional": true
|
|
119
120
|
}
|
|
120
121
|
},
|
|
121
|
-
"simple-git-hooks": {
|
|
122
|
-
"pre-commit": "npm run test:run && npm run type-check && npm run build"
|
|
123
|
-
},
|
|
124
122
|
"devDependencies": {
|
|
125
123
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
126
124
|
"@types/node": "^22.9.4",
|
|
@@ -133,7 +131,6 @@
|
|
|
133
131
|
"eslint": "^9.39.1",
|
|
134
132
|
"jsdom": "^27.2.0",
|
|
135
133
|
"prettier": "^3.6.2",
|
|
136
|
-
"simple-git-hooks": "^2.13.1",
|
|
137
134
|
"terser": "^5.36.0",
|
|
138
135
|
"tsx": "^4.19.4",
|
|
139
136
|
"typescript": "^5.9.3",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/browser'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/browser.es.js'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/react'
|
package/sentry/react.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/react.es.js'
|
package/sentry/vue2.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/vue2'
|
package/sentry/vue2.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/vue2.es.js'
|
package/sentry/vue3.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/vue3'
|
package/sentry/vue3.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../dist/sentry/vue3.es.js'
|