xn-fe-tools 1.0.0 → 1.0.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/README.md CHANGED
@@ -1,112 +1,103 @@
1
- # My Hooks
1
+ # xn-fe-tools
2
2
 
3
- 一个 Vue 3 Composition API 工具库集合,灵感来自 VueUse。
3
+ 基于 Vue 3 Composition API 的工具库,当前主力能力是 `toAwaitFetch`:一个支持链式和解构两种模式的 HTTP 请求工具,内置错误处理、重试、全局配置与取消能力。
4
4
 
5
5
  ## ✨ 特性
6
6
 
7
- - 🎯 **Tree Shakeable** - 支持按需导入,减少打包体积
8
- - 📦 **TypeScript** - 完整的 TypeScript 支持
9
- - 🚀 **轻量级** - 零依赖(除了 Vue)
10
- - 🔧 **易用** - 简单直观的 API
11
- - 📚 **文档完善** - 详细的文档和示例
7
+ - 双模式:链式调用与解构 `[data, error, success]`
8
+ - 完整错误处理:HTTP / 业务 / 网络 / 超时,支持钩子与抑制抛错
9
+ - 重试与超时:内置重试策略、可自定义 shouldRetry,支持超时与取消
10
+ - 多种请求/响应类型:JSON、FormData、Blob
11
+ - 全局配置:baseURL、headers、validateStatus、validateResponse、transformResponse
12
+ - TypeScript 全量类型定义,零外部依赖(基于原生 Fetch)
12
13
 
13
14
  ## 📦 安装
14
15
 
15
16
  ```bash
16
- npm install my-vue-hooks
17
- #
18
- pnpm add my-vue-hooks
19
- #
20
- yarn add my-vue-hooks
17
+ # npm
18
+ npm install xn-fe-tools
19
+ # pnpm
20
+ pnpm add xn-fe-tools
21
+ # yarn
22
+ yarn add xn-fe-tools
21
23
  ```
22
24
 
23
- ## 🚀 快速开始
25
+ ## 🚀 快速使用
24
26
 
25
- ```vue
26
- <script setup lang="ts">
27
- import { useCounter } from 'my-vue-hooks'
27
+ ### 解构模式
28
28
 
29
- const { count, inc, dec, reset } = useCounter(0)
30
- </script>
29
+ ```ts
30
+ import { sendGet, sendPost } from 'xn-fe-tools'
31
31
 
32
- <template>
33
- <div>
34
- <p>Count: {{ count }}</p>
35
- <button @click="inc()">+</button>
36
- <button @click="dec()">-</button>
37
- <button @click="reset()">Reset</button>
38
- </div>
39
- </template>
32
+ const [list, listError, ok] = await sendGet('/api/users')
33
+ const [created] = await sendPost('/api/users', { name: 'John' })
40
34
  ```
41
35
 
42
- ## 📖 文档
43
-
44
- 查看 [完整文档](https://your-docs-site.com) 了解更多。
45
-
46
- ## 🛠️ 开发
47
-
48
- ```bash
49
- # 安装依赖
50
- pnpm install
51
-
52
- # 开发模式
53
- pnpm dev
54
-
55
- # 构建
56
- pnpm build
57
-
58
- # 运行测试
59
- pnpm test
36
+ ### 链式模式
60
37
 
61
- # 开发文档
62
- pnpm dev:docs
38
+ ```ts
39
+ import toAwaitFetch from 'xn-fe-tools'
63
40
 
64
- # 构建文档
65
- pnpm build:docs
41
+ toAwaitFetch
42
+ .sendGet('/api/users')
43
+ .catchHttp((err) => console.error('HTTP 错误', err))
44
+ .catchBusiness((err) => console.error('业务错误', err))
45
+ .catchNetwork((err) => console.error('网络/超时错误', err))
66
46
  ```
67
47
 
68
- ## 📝 添加新 Hook
69
-
70
- 查看 [贡献指南](./docs/guide/contributing.md) 了解如何添加新的 hook。
48
+ ### 创建实例并统一配置(推荐)
71
49
 
72
- ## 🚀 发布 SDK
50
+ ```ts
51
+ import { createInstance } from 'xn-fe-tools'
52
+
53
+ const http = createInstance({
54
+ baseURL: '',
55
+ timeout: 5000,
56
+ headers: ({ url, method }) => ({
57
+ Authorization: `Bearer ${localStorage.getItem('token') || ''}`,
58
+ 'X-Request-Path': url,
59
+ 'X-Request-Method': method || 'GET',
60
+ }),
61
+ validateResponse: (res) => res.code === 200,
62
+ transformResponse: (res) => res.data,
63
+ retry: {
64
+ enabled: true,
65
+ maxRetryCount: 3,
66
+ delay: 1000,
67
+ shouldRetry: async (attempt, fetchError) => {
68
+ if (fetchError.type === 'business' && fetchError.response?.code === 401) {
69
+ return false
70
+ }
71
+ return true
72
+ },
73
+ },
74
+ mode: 'cors',
75
+ credentials: 'include',
76
+ })
77
+
78
+ const [data] = await http.sendGet('/api/users', undefined, { timeout: 2000 })
79
+ ```
73
80
 
74
- ### 快速发布
81
+ ### 取消请求
75
82
 
76
- ```bash
77
- # 发布补丁版本 (1.0.0 -> 1.0.1)
78
- pnpm release:patch
79
-
80
- # 发布次版本 (1.0.0 -> 1.1.0)
81
- pnpm release:minor
83
+ ```ts
84
+ import { sendGet } from 'xn-fe-tools'
82
85
 
83
- # 发布主版本 (1.0.0 -> 2.0.0)
84
- pnpm release:major
86
+ const request = sendGet('/api/users', undefined, { timeout: 8000 })
87
+ request.cancel()
88
+ const [, error, success] = await request // 被取消时 error.type === 'timeout' 或 'network'
85
89
  ```
86
90
 
87
- ### 手动发布
88
-
89
- 1. 更新版本号: `pnpm version:patch|minor|major`
90
- 2. 更新 CHANGELOG.md
91
- 3. 构建: `pnpm build`
92
- 4. 测试: `pnpm test:run`
93
- 5. 提交: `git commit -m "chore: release v1.0.1" && git tag v1.0.1`
94
- 6. 发布: `npm publish`
95
-
96
- 详细说明请查看 [发布指南](./RELEASE.md)。
97
91
 
98
92
  ## 📦 版本信息
99
93
 
100
- SDK 内置了版本信息,可以在代码中使用:
101
-
102
94
  ```ts
103
- import { VERSION, getVersion } from 'my-vue-hooks'
95
+ import { VERSION, getVersion } from 'xn-fe-tools'
104
96
 
105
- console.log(VERSION) // "1.0.0"
106
- console.log(getVersion()) // "1.0.0"
97
+ console.log(VERSION)
98
+ console.log(getVersion())
107
99
  ```
108
100
 
109
101
  ## 📄 License
110
102
 
111
103
  MIT
112
-
@@ -1 +1 @@
1
- {"version":3,"file":"toAwaitFetch.d.ts","sourceRoot":"","sources":["../../../src/hooks/toAwaitFetch/toAwaitFetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toAwaitFetch.d.ts","sourceRoot":"","sources":["../../../src/hooks/toAwaitFetch/toAwaitFetch.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './hooks/toAwaitFetch/toAwaitFetch.api';
1
2
  export { default as toAwaitFetch, sendGet, sendPost, sendPostForm, sendPostBlob, sendGetBlob, setGlobalConfig, cancel, createInstance, FetchInstanceImpl, } from './hooks/toAwaitFetch/toAwaitFetch';
2
3
  export { VERSION, getVersion } from './version';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,MAAM,EACN,cAAc,EACd,iBAAiB,GAClB,MAAM,mCAAmC,CAAA;AAG1C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,cAAc,uCAAuC,CAAA;AACrD,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,MAAM,EACN,cAAc,EACd,iBAAiB,GAClB,MAAM,mCAAmC,CAAA;AAG1C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=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),t=(r,o)=>{const s={...r};for(const n in o){if(!Object.prototype.hasOwnProperty.call(o,n))continue;const r=o[n];if(void 0===r)continue;const a=s[n];e(r)&&e(a)?s[n]=t(a,r):s[n]=r}return s},r=e=>e>=200&&e<300,o=()=>!0,s=e=>new Promise(t=>setTimeout(t,e)),n=(e,t,r,o,s)=>({message:e,type:t,status:r,response:o,error:s}),a=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))},i=async(e,t,r)=>!!e?.enabled&&(!(t>(e.maxRetryCount??3))&&(e.shouldRetry?await e.shouldRetry(t,r):"network"===r.type||"timeout"===r.type)),u=(e,t)=>{const r=Object.create(e);let o=!1,s=!1,n=!1;const a=e.then.bind(e),i=e.catch.bind(e),c=a(e=>{n=!0===e.__errorSuppressed,delete e.__errorSuppressed;const t=new Proxy(e,{get(e,t){if(("1"===t||"number"==typeof t&&1===t)&&(s=!0),t===Symbol.iterator){const t=e[Symbol.iterator]();return function*(){let e=0;for(const r of t)1===e&&(s=!0),yield r,e++}}return e[t]}}),r=e[1];return e[2]||!r||n||o||queueMicrotask(()=>{queueMicrotask(()=>{if(!(s||s||o||n)){const e=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw e.fetchError=r,e}})}),t});r.cancel=()=>{t&&t()};const l=c.then.bind(c);return r.then=function(e,r){return e&&"function"==typeof e&&!r&&1===e.length?u(l(t=>{const r=t[2],o=t[0];return r&&void 0!==o&&e(o),t}),t):l(e,r)},r.catchHttp=function(e){o=!0;const r=l(t=>{const r=t[2],o=t[1];return!r&&o&&"http"===o.type&&e(o),!r&&o&&(t.__errorSuppressed=!0),t});return u(r,t)},r.catchBusiness=function(e){o=!0;const r=l(t=>{const r=t[1],o=t[2];return!o&&r&&"business"===r.type&&e(r),!o&&r&&(t.__errorSuppressed=!0),t});return u(r,t)},r.catchNetwork=function(e){if(o=!0,e&&"function"==typeof e){const r=l(t=>{const r=t[1],o=t[2];return!o&&r&&e(r),!o&&r&&(t.__errorSuppressed=!0),t});return u(r,t)}return i(e)},r};class c{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(t,u,c=1){try{const y=t,m=y.signal;m&&(m.aborted?u.abort():m.addEventListener("abort",()=>u.abort(),{once:!0}));const w=(l=y.headers,d=y.url,f=y.method,l?"function"==typeof l?l({url:d,method:f}):l:{}),{body:g,urlParams:E}=((t,r,o)=>{if(!t)return{};if("GET"===r||"HEAD"===r||"OPTIONS"===r){if(e(t)){const e=new URLSearchParams;for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){const o=t[r];null!=o&&e.append(r,String(o))}return{urlParams:e.toString()}}return{}}if("form"===o&&e(t)){const e=new FormData;for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){const o=t[r];null!=o&&(o instanceof File||o instanceof Blob?e.append(r,o):e.append(r,String(o)))}return{body:e}}return"json"===o?{body:JSON.stringify(t)}:"text"===o?{body:String(t)}:"blob"===o&&t instanceof Blob||"arraybuffer"===o&&t instanceof ArrayBuffer?{body:t}:{body:String(t)}})(y.data,y.method||"GET",y.requestType||"json"),P=((e,t,r)=>{if(t.startsWith("http://")||t.startsWith("https://")){if(r){const e=t.includes("?")?"&":"?";return`${t}${e}${r}`}return t}let o=t;e&&(o=`${e.endsWith("/")?e.slice(0,-1):e}${t.startsWith("/")?t:`/${t}`}`);if(r){const e=o.includes("?")?"&":"?";o=`${o}${e}${r}`}return o})(y.baseURL,y.url,E),S=y.timeout;let G,q=!1,T=w;g&&"string"==typeof g&&"json"===y.requestType?T={"Content-Type":"application/json",...w}:g instanceof FormData&&(T=w);const x=fetch(P,{method:y.method||"GET",headers:T,body:g,mode:("websocket"===y.mode?"cors":y.mode)||"cors",credentials:y.credentials||"include",signal:u.signal});let B;if(S){const e=new Promise((e,t)=>{G=setTimeout(()=>{q=!0,u.abort(),t(n("Request timeout","timeout"))},S)});try{B=await Promise.race([x,e]),G&&clearTimeout(G)}catch(b){if(G&&clearTimeout(G),q){const e=n("Request timeout","timeout");let t=!1;if(y.onNetworkError){const r=()=>{t=!0};await y.onNetworkError(a(new Error(e.message)),r)}if(await i(y.retry,c,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,e,!1];return r.__errorSuppressed=t,r}throw b}}else B=await x;const _=y.responseType||"json";let R;try{R=await(async(e,t)=>{switch(t){case"json":default:return await e.json();case"text":return await e.text();case"blob":return await e.blob();case"arraybuffer":return await e.arrayBuffer();case"formData":return await e.formData()}})(B,_)}catch(p){const e=n("Failed to parse response","network",B.status,void 0,p instanceof Error?p:new Error(String(p)));let t=!1;if(y.onNetworkError){const r=()=>{t=!0};await y.onNetworkError(a(e.error||new Error(e.message)),r)}if(await i(y.retry,c,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,e,!1];return r.__errorSuppressed=t,r}if(!(y.validateStatus||r)(B.status)){const e=n(`HTTP Error: ${B.status} ${B.statusText}`,"http",B.status,R);let t=!1;if(y.onHttpError){const r=()=>{t=!0},o=new Error(e.message);await y.onHttpError(o,B.status,R,r)}if(await i(y.retry,c,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,e,!1];return r.__errorSuppressed=t,r}if(!(y.validateResponse||o)(R)){const e=n("Business validation failed","business",B.status,R);let t=!1;if(y.onBusinessError){const r=()=>{t=!0},o=new Error(e.message);await y.onBusinessError(o,R,r)}if(await i(y.retry,c,e))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,e,!1];return r.__errorSuppressed=t,r}let C=R;if(y.transformResponse)try{C=y.transformResponse(R)}catch(h){console.warn("[toAwaitFetch] transformResponse error:",h)}return[C,void 0,!0]}catch(b){const e=(e=>e instanceof DOMException&&"AbortError"===e.name)(b),r=n(e?"Request aborted":b instanceof Error?b.message:"Network error","network",void 0,void 0,b instanceof Error?b:new Error(String(b)));let o=!1;if(t.onNetworkError){const e=()=>{o=!0};await t.onNetworkError(a(r.error||new Error(r.message)),e)}if(!e&&await i(t.retry,c,r))return await s(t.retry?.delay||1e3),this.executeRequest(t,u,c+1);const l=[void 0,r,!1];return l.__errorSuppressed=o,l}var l,d,f}request(e){const r=t({...this.globalConfig},e),o=new AbortController,s=this.executeRequest(r,o);return u(s,()=>o.abort())}setGlobalConfig(e){this.globalConfig={...e}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(e){this.globalConfig=t(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 l=e=>new c(e),d=new c,f=e=>{e?.cancel?.()},b=Object.assign(e=>e&&"object"==typeof e&&"url"in e?d.request(e):l(e),{create:l,sendGet:d.sendGet.bind(d),sendPost:d.sendPost.bind(d),sendPostForm:d.sendPostForm.bind(d),sendPostBlob:d.sendPostBlob.bind(d),sendGetBlob:d.sendGetBlob.bind(d),setGlobalConfig:d.setGlobalConfig.bind(d),cancel:f});exports.FetchInstanceImpl=c,exports.cancel=f,exports.createInstance=l,exports.default=b,exports.sendGet=(e,t,r)=>d.request({...r,url:e,method:"GET",data:t}),exports.sendGetBlob=(e,t,r)=>d.sendGetBlob(e,t,r),exports.sendPost=(e,t,r)=>d.sendPost(e,t,r),exports.sendPostBlob=(e,t,r)=>d.sendPostBlob(e,t,r),exports.sendPostForm=(e,t,r)=>d.sendPostForm(e,t,r),exports.setGlobalConfig=e=>{d.setGlobalConfig(e)};
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=t=>!("object"!=typeof t||null===t||Array.isArray(t)||t instanceof Date||t instanceof RegExp||t instanceof File||t instanceof Blob||"undefined"!=typeof FormData&&t instanceof FormData),e=(r,s)=>{const o={...r};for(const n in s){if(!Object.prototype.hasOwnProperty.call(s,n))continue;const r=s[n];if(void 0===r)continue;const a=o[n];t(r)&&t(a)?o[n]=e(a,r):o[n]=r}return o},r=t=>t>=200&&t<300,s=()=>!0,o=t=>new Promise(e=>setTimeout(e,t)),n=async t=>{if(!(t=>{if(!t)return!0;if(204===t.status||205===t.status||304===t.status)return!0;const e=t.headers.get("content-length");return!(!e||0!==Number(e))})(t))try{return await t.json()}catch(e){let s;try{s=await t.text()}catch{return}if(!s.trim())return;try{return JSON.parse(s)}catch(r){return}}},a=(t,e,r,s,o)=>({message:t,type:e,status:r,response:s,error:o}),i=t=>{if(t instanceof Error){const e=new Error(t.message);return t.name&&(e.name=t.name),t.stack&&(e.stack=t.stack),e}return new Error(String(t))},u=async(t,e,r)=>!!t?.enabled&&(!(e>(t.maxRetryCount??3))&&(t.shouldRetry?await t.shouldRetry(e,r):"network"===r.type||"timeout"===r.type)),c=(t,e)=>{const r=Object.create(t);let s=!1,o=!1,n=!1;const a=t.then.bind(t),i=t.catch.bind(t),u=a(t=>{n=!0===t.__errorSuppressed,delete t.__errorSuppressed;const e=new Proxy(t,{get(t,e){if(("1"===e||"number"==typeof e&&1===e)&&(o=!0),e===Symbol.iterator){const e=t[Symbol.iterator]();return function*(){let t=0;for(const r of e)1===t&&(o=!0),yield r,t++}}return t[e]}}),r=t[1];return t[2]||!r||n||s||queueMicrotask(()=>{queueMicrotask(()=>{if(!(o||o||s||n)){const t=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw t.fetchError=r,t}})}),e});r.cancel=()=>{e&&e()};const l=u.then.bind(u);return r.then=function(t,r){return t&&"function"==typeof t&&!r&&1===t.length?c(l(e=>{const r=e[2],s=e[0];return r&&void 0!==s&&t(s),e}),e):l(t,r)},r.catchHttp=function(t){s=!0;const r=l(e=>{const r=e[2],s=e[1];return!r&&s&&"http"===s.type&&t(s),!r&&s&&(e.__errorSuppressed=!0),e});return c(r,e)},r.catchBusiness=function(t){s=!0;const r=l(e=>{const r=e[1],s=e[2];return!s&&r&&"business"===r.type&&t(r),!s&&r&&(e.__errorSuppressed=!0),e});return c(r,e)},r.catchNetwork=function(t){if(s=!0,t&&"function"==typeof t){const r=l(e=>{const r=e[1],s=e[2];return!s&&r&&t(r),!s&&r&&(e.__errorSuppressed=!0),e});return c(r,e)}return i(t)},r};class l{globalConfig={};constructor(t){t&&(this.globalConfig={...t}),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,c,l=1){try{const m=e,w=m.signal;w&&(w.aborted?c.abort():w.addEventListener("abort",()=>c.abort(),{once:!0}));const g=(d=m.headers,f=m.url,b=m.method,d?"function"==typeof d?d({url:f,method:b}):d:{}),{body:E,urlParams:P}=((e,r,s)=>{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 s=e[r];null!=s&&t.append(r,String(s))}return{urlParams:t.toString()}}return{}}if("form"===s&&t(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const s=e[r];null!=s&&(s instanceof File||s instanceof Blob?t.append(r,s):t.append(r,String(s)))}return{body:t}}return"json"===s?{body:JSON.stringify(e)}:"text"===s?{body:String(e)}:"blob"===s&&e instanceof Blob||"arraybuffer"===s&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(m.data,m.method||"GET",m.requestType||"json"),S=((t,e,r)=>{if(e.startsWith("http://")||e.startsWith("https://")){if(r){const t=e.includes("?")?"&":"?";return`${e}${t}${r}`}return e}let s=e;t&&(s=`${t.endsWith("/")?t.slice(0,-1):t}${e.startsWith("/")?e:`/${e}`}`);if(r){const t=s.includes("?")?"&":"?";s=`${s}${t}${r}`}return s})(m.baseURL,m.url,P),G=m.timeout;let q,x=!1,T=g;E&&"string"==typeof E&&"json"===m.requestType?T={"Content-Type":"application/json",...g}:E instanceof FormData&&(T=g);const B={method:m.method||"GET",headers:T,body:E,mode:("websocket"===m.mode?"cors":m.mode)||"cors",credentials:m.credentials||"include",signal:c.signal},_=fetch(S,B);let R;if(G){const t=new Promise((t,e)=>{q=setTimeout(()=>{x=!0,c.abort(),e(a("Request timeout","timeout"))},G)});try{R=await Promise.race([_,t]),q&&clearTimeout(q)}catch(p){if(q&&clearTimeout(q),x){const t=a("Request timeout","timeout");let e=!1;if(m.onNetworkError){const r=()=>{e=!0};await m.onNetworkError(i(new Error(t.message)),r)}if(await u(m.retry,l,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,l+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}throw p}}else R=await _;const v=m.responseType||"json";let C;try{C=await(async(t,e)=>{if(!t)throw new Error("No response received");switch(e){case"json":default:return await n(t);case"text":return await t.text();case"blob":return await t.blob();case"arraybuffer":return await t.arrayBuffer();case"formData":return await t.formData()}})(R,v)}catch(h){const t=a("Failed to parse response","network",R.status,void 0,h instanceof Error?h:new Error(String(h)));let e=!1;if(m.onNetworkError){const r=()=>{e=!0};await m.onNetworkError(i(t.error||new Error(t.message)),r)}if(await u(m.retry,l,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,l+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}if(!(m.validateStatus||r)(R.status)){const t=a(`HTTP Error: ${R.status} ${R.statusText}`,"http",R.status,C);let e=!1;if(m.onHttpError){const r=()=>{e=!0},s=new Error(t.message);await m.onHttpError(s,R.status,C,r)}if(await u(m.retry,l,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,l+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}if(!(m.validateResponse||s)(C)){const t=a("Business validation failed","business",R.status,C);let e=!1;if(m.onBusinessError){const r=()=>{e=!0},s=new Error(t.message);await m.onBusinessError(s,C,r)}if(await u(m.retry,l,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,l+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}let j=C;if(m.transformResponse)try{j=m.transformResponse(C)}catch(y){console.warn("[toAwaitFetch] transformResponse error:",y)}return[j,void 0,!0]}catch(p){const t=(t=>t instanceof DOMException&&"AbortError"===t.name)(p),r=a(t?"Request aborted":p instanceof Error?p.message:"Network error","network",void 0,void 0,p instanceof Error?p:new Error(String(p)));let s=!1;if(e.onNetworkError){const t=()=>{s=!0};await e.onNetworkError(i(r.error||new Error(r.message)),t)}if(!t&&await u(e.retry,l,r))return await o(e.retry?.delay||1e3),this.executeRequest(e,c,l+1);const n=[void 0,r,!1];return n.__errorSuppressed=s,n}var d,f,b}request(t){const r=e({...this.globalConfig},t),s=new AbortController,o=this.executeRequest(r,s);return c(o,()=>s.abort())}setGlobalConfig(t){this.globalConfig={...t}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(t){this.globalConfig=e(this.globalConfig,t)}sendGet(t,e,r){return this.request({...r,url:t,method:"GET",data:e})}sendPost(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"json"})}sendPostForm(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"form"})}sendPostBlob(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"json",responseType:"blob"})}sendGetBlob(t,e,r){return this.request({...r,url:t,method:"GET",data:e,responseType:"blob"})}}const d=t=>new l(t),f=new l,b=t=>{t?.cancel?.()},p=Object.assign(t=>t&&"object"==typeof t&&"url"in t?f.request(t):d(t),{create:d,sendGet:f.sendGet.bind(f),sendPost:f.sendPost.bind(f),sendPostForm:f.sendPostForm.bind(f),sendPostBlob:f.sendPostBlob.bind(f),sendGetBlob:f.sendGetBlob.bind(f),setGlobalConfig:f.setGlobalConfig.bind(f),cancel:b});exports.FetchInstanceImpl=l,exports.cancel=b,exports.createInstance=d,exports.default=p,exports.sendGet=(t,e,r)=>f.request({...r,url:t,method:"GET",data:e}),exports.sendGetBlob=(t,e,r)=>f.sendGetBlob(t,e,r),exports.sendPost=(t,e,r)=>f.sendPost(t,e,r),exports.sendPostBlob=(t,e,r)=>f.sendPostBlob(t,e,r),exports.sendPostForm=(t,e,r)=>f.sendPostForm(t,e,r),exports.setGlobalConfig=t=>{f.setGlobalConfig(t)};
@@ -1 +1 @@
1
- const t=t=>!("object"!=typeof t||null===t||Array.isArray(t)||t instanceof Date||t instanceof RegExp||t instanceof File||t instanceof Blob||"undefined"!=typeof FormData&&t instanceof FormData),e=(r,o)=>{const s={...r};for(const n in o){if(!Object.prototype.hasOwnProperty.call(o,n))continue;const r=o[n];if(void 0===r)continue;const a=s[n];t(r)&&t(a)?s[n]=e(a,r):s[n]=r}return s},r=t=>t>=200&&t<300,o=()=>!0,s=t=>new Promise(e=>setTimeout(e,t)),n=(t,e,r,o,s)=>({message:t,type:e,status:r,response:o,error:s}),a=t=>{if(t instanceof Error){const e=new Error(t.message);return t.name&&(e.name=t.name),t.stack&&(e.stack=t.stack),e}return new Error(String(t))},i=async(t,e,r)=>!!t?.enabled&&(!(e>(t.maxRetryCount??3))&&(t.shouldRetry?await t.shouldRetry(e,r):"network"===r.type||"timeout"===r.type)),u=(t,e)=>{const r=Object.create(t);let o=!1,s=!1,n=!1;const a=t.then.bind(t),i=t.catch.bind(t),c=a(t=>{n=!0===t.__errorSuppressed,delete t.__errorSuppressed;const e=new Proxy(t,{get(t,e){if(("1"===e||"number"==typeof e&&1===e)&&(s=!0),e===Symbol.iterator){const e=t[Symbol.iterator]();return function*(){let t=0;for(const r of e)1===t&&(s=!0),yield r,t++}}return t[e]}}),r=t[1];return t[2]||!r||n||o||queueMicrotask(()=>{queueMicrotask(()=>{if(!(s||s||o||n)){const t=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw t.fetchError=r,t}})}),e});r.cancel=()=>{e&&e()};const d=c.then.bind(c);return r.then=function(t,r){return t&&"function"==typeof t&&!r&&1===t.length?u(d(e=>{const r=e[2],o=e[0];return r&&void 0!==o&&t(o),e}),e):d(t,r)},r.catchHttp=function(t){o=!0;const r=d(e=>{const r=e[2],o=e[1];return!r&&o&&"http"===o.type&&t(o),!r&&o&&(e.__errorSuppressed=!0),e});return u(r,e)},r.catchBusiness=function(t){o=!0;const r=d(e=>{const r=e[1],o=e[2];return!o&&r&&"business"===r.type&&t(r),!o&&r&&(e.__errorSuppressed=!0),e});return u(r,e)},r.catchNetwork=function(t){if(o=!0,t&&"function"==typeof t){const r=d(e=>{const r=e[1],o=e[2];return!o&&r&&t(r),!o&&r&&(e.__errorSuppressed=!0),e});return u(r,e)}return i(t)},r};class c{globalConfig={};constructor(t){t&&(this.globalConfig={...t}),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,u,c=1){try{const y=e,m=y.signal;m&&(m.aborted?u.abort():m.addEventListener("abort",()=>u.abort(),{once:!0}));const w=(d=y.headers,l=y.url,f=y.method,d?"function"==typeof d?d({url:l,method:f}):d:{}),{body:g,urlParams:E}=((e,r,o)=>{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 o=e[r];null!=o&&t.append(r,String(o))}return{urlParams:t.toString()}}return{}}if("form"===o&&t(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const o=e[r];null!=o&&(o instanceof File||o instanceof Blob?t.append(r,o):t.append(r,String(o)))}return{body:t}}return"json"===o?{body:JSON.stringify(e)}:"text"===o?{body:String(e)}:"blob"===o&&e instanceof Blob||"arraybuffer"===o&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(y.data,y.method||"GET",y.requestType||"json"),P=((t,e,r)=>{if(e.startsWith("http://")||e.startsWith("https://")){if(r){const t=e.includes("?")?"&":"?";return`${e}${t}${r}`}return e}let o=e;t&&(o=`${t.endsWith("/")?t.slice(0,-1):t}${e.startsWith("/")?e:`/${e}`}`);if(r){const t=o.includes("?")?"&":"?";o=`${o}${t}${r}`}return o})(y.baseURL,y.url,E),q=y.timeout;let S,T=!1,G=w;g&&"string"==typeof g&&"json"===y.requestType?G={"Content-Type":"application/json",...w}:g instanceof FormData&&(G=w);const B=fetch(P,{method:y.method||"GET",headers:G,body:g,mode:("websocket"===y.mode?"cors":y.mode)||"cors",credentials:y.credentials||"include",signal:u.signal});let R;if(q){const t=new Promise((t,e)=>{S=setTimeout(()=>{T=!0,u.abort(),e(n("Request timeout","timeout"))},q)});try{R=await Promise.race([B,t]),S&&clearTimeout(S)}catch(b){if(S&&clearTimeout(S),T){const t=n("Request timeout","timeout");let e=!1;if(y.onNetworkError){const r=()=>{e=!0};await y.onNetworkError(a(new Error(t.message)),r)}if(await i(y.retry,c,t))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}throw b}}else R=await B;const _=y.responseType||"json";let C;try{C=await(async(t,e)=>{switch(e){case"json":default:return await t.json();case"text":return await t.text();case"blob":return await t.blob();case"arraybuffer":return await t.arrayBuffer();case"formData":return await t.formData()}})(R,_)}catch(h){const t=n("Failed to parse response","network",R.status,void 0,h instanceof Error?h:new Error(String(h)));let e=!1;if(y.onNetworkError){const r=()=>{e=!0};await y.onNetworkError(a(t.error||new Error(t.message)),r)}if(await i(y.retry,c,t))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}if(!(y.validateStatus||r)(R.status)){const t=n(`HTTP Error: ${R.status} ${R.statusText}`,"http",R.status,C);let e=!1;if(y.onHttpError){const r=()=>{e=!0},o=new Error(t.message);await y.onHttpError(o,R.status,C,r)}if(await i(y.retry,c,t))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}if(!(y.validateResponse||o)(C)){const t=n("Business validation failed","business",R.status,C);let e=!1;if(y.onBusinessError){const r=()=>{e=!0},o=new Error(t.message);await y.onBusinessError(o,C,r)}if(await i(y.retry,c,t))return await s(y.retry?.delay||1e3),this.executeRequest(y,u,c+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}let k=C;if(y.transformResponse)try{k=y.transformResponse(C)}catch(p){console.warn("[toAwaitFetch] transformResponse error:",p)}return[k,void 0,!0]}catch(b){const t=(t=>t instanceof DOMException&&"AbortError"===t.name)(b),r=n(t?"Request aborted":b instanceof Error?b.message:"Network error","network",void 0,void 0,b instanceof Error?b:new Error(String(b)));let o=!1;if(e.onNetworkError){const t=()=>{o=!0};await e.onNetworkError(a(r.error||new Error(r.message)),t)}if(!t&&await i(e.retry,c,r))return await s(e.retry?.delay||1e3),this.executeRequest(e,u,c+1);const d=[void 0,r,!1];return d.__errorSuppressed=o,d}var d,l,f}request(t){const r=e({...this.globalConfig},t),o=new AbortController,s=this.executeRequest(r,o);return u(s,()=>o.abort())}setGlobalConfig(t){this.globalConfig={...t}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(t){this.globalConfig=e(this.globalConfig,t)}sendGet(t,e,r){return this.request({...r,url:t,method:"GET",data:e})}sendPost(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"json"})}sendPostForm(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"form"})}sendPostBlob(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"json",responseType:"blob"})}sendGetBlob(t,e,r){return this.request({...r,url:t,method:"GET",data:e,responseType:"blob"})}}const d=t=>new c(t),l=new c,f=(t,e,r)=>l.request({...r,url:t,method:"GET",data:e}),b=(t,e,r)=>l.sendPost(t,e,r),h=(t,e,r)=>l.sendPostForm(t,e,r),p=(t,e,r)=>l.sendPostBlob(t,e,r),y=(t,e,r)=>l.sendGetBlob(t,e,r),m=t=>{l.setGlobalConfig(t)},w=t=>{t?.cancel?.()},g=Object.assign(t=>t&&"object"==typeof t&&"url"in t?l.request(t):d(t),{create:d,sendGet:l.sendGet.bind(l),sendPost:l.sendPost.bind(l),sendPostForm:l.sendPostForm.bind(l),sendPostBlob:l.sendPostBlob.bind(l),sendGetBlob:l.sendGetBlob.bind(l),setGlobalConfig:l.setGlobalConfig.bind(l),cancel:w});export{c as FetchInstanceImpl,w as cancel,d as createInstance,g as default,f as sendGet,y as sendGetBlob,b as sendPost,p as sendPostBlob,h as sendPostForm,m as setGlobalConfig};
1
+ const t=t=>!("object"!=typeof t||null===t||Array.isArray(t)||t instanceof Date||t instanceof RegExp||t instanceof File||t instanceof Blob||"undefined"!=typeof FormData&&t instanceof FormData),e=(r,s)=>{const o={...r};for(const n in s){if(!Object.prototype.hasOwnProperty.call(s,n))continue;const r=s[n];if(void 0===r)continue;const a=o[n];t(r)&&t(a)?o[n]=e(a,r):o[n]=r}return o},r=t=>t>=200&&t<300,s=()=>!0,o=t=>new Promise(e=>setTimeout(e,t)),n=async t=>{if(!(t=>{if(!t)return!0;if(204===t.status||205===t.status||304===t.status)return!0;const e=t.headers.get("content-length");return!(!e||0!==Number(e))})(t))try{return await t.json()}catch(e){let s;try{s=await t.text()}catch{return}if(!s.trim())return;try{return JSON.parse(s)}catch(r){return}}},a=(t,e,r,s,o)=>({message:t,type:e,status:r,response:s,error:o}),i=t=>{if(t instanceof Error){const e=new Error(t.message);return t.name&&(e.name=t.name),t.stack&&(e.stack=t.stack),e}return new Error(String(t))},u=async(t,e,r)=>!!t?.enabled&&(!(e>(t.maxRetryCount??3))&&(t.shouldRetry?await t.shouldRetry(e,r):"network"===r.type||"timeout"===r.type)),c=(t,e)=>{const r=Object.create(t);let s=!1,o=!1,n=!1;const a=t.then.bind(t),i=t.catch.bind(t),u=a(t=>{n=!0===t.__errorSuppressed,delete t.__errorSuppressed;const e=new Proxy(t,{get(t,e){if(("1"===e||"number"==typeof e&&1===e)&&(o=!0),e===Symbol.iterator){const e=t[Symbol.iterator]();return function*(){let t=0;for(const r of e)1===t&&(o=!0),yield r,t++}}return t[e]}}),r=t[1];return t[2]||!r||n||s||queueMicrotask(()=>{queueMicrotask(()=>{if(!(o||o||s||n)){const t=new Error(`Unhandled fetch error: ${r.message} (type: ${r.type})`);throw t.fetchError=r,t}})}),e});r.cancel=()=>{e&&e()};const d=u.then.bind(u);return r.then=function(t,r){return t&&"function"==typeof t&&!r&&1===t.length?c(d(e=>{const r=e[2],s=e[0];return r&&void 0!==s&&t(s),e}),e):d(t,r)},r.catchHttp=function(t){s=!0;const r=d(e=>{const r=e[2],s=e[1];return!r&&s&&"http"===s.type&&t(s),!r&&s&&(e.__errorSuppressed=!0),e});return c(r,e)},r.catchBusiness=function(t){s=!0;const r=d(e=>{const r=e[1],s=e[2];return!s&&r&&"business"===r.type&&t(r),!s&&r&&(e.__errorSuppressed=!0),e});return c(r,e)},r.catchNetwork=function(t){if(s=!0,t&&"function"==typeof t){const r=d(e=>{const r=e[1],s=e[2];return!s&&r&&t(r),!s&&r&&(e.__errorSuppressed=!0),e});return c(r,e)}return i(t)},r};class d{globalConfig={};constructor(t){t&&(this.globalConfig={...t}),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,c,d=1){try{const m=e,w=m.signal;w&&(w.aborted?c.abort():w.addEventListener("abort",()=>c.abort(),{once:!0}));const g=(l=m.headers,f=m.url,h=m.method,l?"function"==typeof l?l({url:f,method:h}):l:{}),{body:E,urlParams:P}=((e,r,s)=>{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 s=e[r];null!=s&&t.append(r,String(s))}return{urlParams:t.toString()}}return{}}if("form"===s&&t(e)){const t=new FormData;for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const s=e[r];null!=s&&(s instanceof File||s instanceof Blob?t.append(r,s):t.append(r,String(s)))}return{body:t}}return"json"===s?{body:JSON.stringify(e)}:"text"===s?{body:String(e)}:"blob"===s&&e instanceof Blob||"arraybuffer"===s&&e instanceof ArrayBuffer?{body:e}:{body:String(e)}})(m.data,m.method||"GET",m.requestType||"json"),S=((t,e,r)=>{if(e.startsWith("http://")||e.startsWith("https://")){if(r){const t=e.includes("?")?"&":"?";return`${e}${t}${r}`}return e}let s=e;t&&(s=`${t.endsWith("/")?t.slice(0,-1):t}${e.startsWith("/")?e:`/${e}`}`);if(r){const t=s.includes("?")?"&":"?";s=`${s}${t}${r}`}return s})(m.baseURL,m.url,P),q=m.timeout;let T,G=!1,B=g;E&&"string"==typeof E&&"json"===m.requestType?B={"Content-Type":"application/json",...g}:E instanceof FormData&&(B=g);const R={method:m.method||"GET",headers:B,body:E,mode:("websocket"===m.mode?"cors":m.mode)||"cors",credentials:m.credentials||"include",signal:c.signal},_=fetch(S,R);let C;if(q){const t=new Promise((t,e)=>{T=setTimeout(()=>{G=!0,c.abort(),e(a("Request timeout","timeout"))},q)});try{C=await Promise.race([_,t]),T&&clearTimeout(T)}catch(b){if(T&&clearTimeout(T),G){const t=a("Request timeout","timeout");let e=!1;if(m.onNetworkError){const r=()=>{e=!0};await m.onNetworkError(i(new Error(t.message)),r)}if(await u(m.retry,d,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,d+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}throw b}}else C=await _;const k=m.responseType||"json";let v;try{v=await(async(t,e)=>{if(!t)throw new Error("No response received");switch(e){case"json":default:return await n(t);case"text":return await t.text();case"blob":return await t.blob();case"arraybuffer":return await t.arrayBuffer();case"formData":return await t.formData()}})(C,k)}catch(p){const t=a("Failed to parse response","network",C.status,void 0,p instanceof Error?p:new Error(String(p)));let e=!1;if(m.onNetworkError){const r=()=>{e=!0};await m.onNetworkError(i(t.error||new Error(t.message)),r)}if(await u(m.retry,d,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,d+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}if(!(m.validateStatus||r)(C.status)){const t=a(`HTTP Error: ${C.status} ${C.statusText}`,"http",C.status,v);let e=!1;if(m.onHttpError){const r=()=>{e=!0},s=new Error(t.message);await m.onHttpError(s,C.status,v,r)}if(await u(m.retry,d,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,d+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}if(!(m.validateResponse||s)(v)){const t=a("Business validation failed","business",C.status,v);let e=!1;if(m.onBusinessError){const r=()=>{e=!0},s=new Error(t.message);await m.onBusinessError(s,v,r)}if(await u(m.retry,d,t))return await o(m.retry?.delay||1e3),this.executeRequest(m,c,d+1);const r=[void 0,t,!1];return r.__errorSuppressed=e,r}let x=v;if(m.transformResponse)try{x=m.transformResponse(v)}catch(y){console.warn("[toAwaitFetch] transformResponse error:",y)}return[x,void 0,!0]}catch(b){const t=(t=>t instanceof DOMException&&"AbortError"===t.name)(b),r=a(t?"Request aborted":b instanceof Error?b.message:"Network error","network",void 0,void 0,b instanceof Error?b:new Error(String(b)));let s=!1;if(e.onNetworkError){const t=()=>{s=!0};await e.onNetworkError(i(r.error||new Error(r.message)),t)}if(!t&&await u(e.retry,d,r))return await o(e.retry?.delay||1e3),this.executeRequest(e,c,d+1);const n=[void 0,r,!1];return n.__errorSuppressed=s,n}var l,f,h}request(t){const r=e({...this.globalConfig},t),s=new AbortController,o=this.executeRequest(r,s);return c(o,()=>s.abort())}setGlobalConfig(t){this.globalConfig={...t}}getGlobalConfig(){return{...this.globalConfig}}mergeGlobalConfig(t){this.globalConfig=e(this.globalConfig,t)}sendGet(t,e,r){return this.request({...r,url:t,method:"GET",data:e})}sendPost(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"json"})}sendPostForm(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"form"})}sendPostBlob(t,e,r){return this.request({...r,url:t,method:"POST",data:e,requestType:"json",responseType:"blob"})}sendGetBlob(t,e,r){return this.request({...r,url:t,method:"GET",data:e,responseType:"blob"})}}const l=t=>new d(t),f=new d,h=(t,e,r)=>f.request({...r,url:t,method:"GET",data:e}),b=(t,e,r)=>f.sendPost(t,e,r),p=(t,e,r)=>f.sendPostForm(t,e,r),y=(t,e,r)=>f.sendPostBlob(t,e,r),m=(t,e,r)=>f.sendGetBlob(t,e,r),w=t=>{f.setGlobalConfig(t)},g=t=>{t?.cancel?.()},E=Object.assign(t=>t&&"object"==typeof t&&"url"in t?f.request(t):l(t),{create:l,sendGet:f.sendGet.bind(f),sendPost:f.sendPost.bind(f),sendPostForm:f.sendPostForm.bind(f),sendPostBlob:f.sendPostBlob.bind(f),sendGetBlob:f.sendGetBlob.bind(f),setGlobalConfig:f.setGlobalConfig.bind(f),cancel:g});export{d as FetchInstanceImpl,g as cancel,l as createInstance,E as default,h as sendGet,m as sendGetBlob,b as sendPost,y as sendPostBlob,p as sendPostForm,w as setGlobalConfig};
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="1.0.0";exports.VERSION=e,exports.getVersion=function(){return e};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="1.0.2";exports.VERSION=e,exports.getVersion=function(){return e};
@@ -1 +1 @@
1
- const n="1.0.0";function t(){return n}export{n as VERSION,t as getVersion};
1
+ const n="1.0.2";function t(){return n}export{n as VERSION,t as getVersion};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xn-fe-tools",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "A powerful fetch wrapper with chaining & tuple API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs.js",
@@ -23,6 +23,28 @@
23
23
  "dist"
24
24
  ],
25
25
  "sideEffects": false,
26
+ "scripts": {
27
+ "dev": "vite",
28
+ "build": "vite build && tsc --emitDeclarationOnly",
29
+ "build:docs": "vitepress build docs",
30
+ "dev:docs": "vitepress dev docs",
31
+ "preview:docs": "vitepress preview docs",
32
+ "test": "vitest",
33
+ "test:run": "vitest run",
34
+ "type-check": "tsc --noEmit",
35
+ "lint": "eslint src --ext .ts,.vue",
36
+ "format": "prettier --write \"src/**/*.{ts,vue}\"",
37
+ "version": "node scripts/version.js",
38
+ "version:patch": "node scripts/version.js patch",
39
+ "version:minor": "node scripts/version.js minor",
40
+ "version:major": "node scripts/version.js major",
41
+ "release": "node scripts/release.js",
42
+ "release:patch": "node scripts/release.js patch",
43
+ "release:minor": "node scripts/release.js minor",
44
+ "release:major": "node scripts/release.js major",
45
+ "prepublishOnly": "node scripts/prepublish.js",
46
+ "prepack": "pnpm build"
47
+ },
26
48
  "keywords": [
27
49
  "vue",
28
50
  "vue3",
@@ -57,25 +79,5 @@
57
79
  "vitepress": "^1.6.3",
58
80
  "vitest": "^4.0.10",
59
81
  "vue": "^3.5.24"
60
- },
61
- "scripts": {
62
- "dev": "vite",
63
- "build": "vite build && tsc --emitDeclarationOnly",
64
- "build:docs": "vitepress build docs",
65
- "dev:docs": "vitepress dev docs",
66
- "preview:docs": "vitepress preview docs",
67
- "test": "vitest",
68
- "test:run": "vitest run",
69
- "type-check": "tsc --noEmit",
70
- "lint": "eslint src --ext .ts,.vue",
71
- "format": "prettier --write \"src/**/*.{ts,vue}\"",
72
- "version": "node scripts/version.js",
73
- "version:patch": "node scripts/version.js patch",
74
- "version:minor": "node scripts/version.js minor",
75
- "version:major": "node scripts/version.js major",
76
- "release": "node scripts/release.js",
77
- "release:patch": "node scripts/release.js patch",
78
- "release:minor": "node scripts/release.js minor",
79
- "release:major": "node scripts/release.js major"
80
82
  }
81
- }
83
+ }
@@ -1,21 +0,0 @@
1
- import { type Ref } from 'vue';
2
- export interface UseCounterOptions {
3
- min?: number;
4
- max?: number;
5
- initial?: number;
6
- }
7
- export interface UseCounterReturn {
8
- count: Ref<number>;
9
- inc: (delta?: number) => void;
10
- dec: (delta?: number) => void;
11
- set: (value: number) => void;
12
- reset: () => void;
13
- }
14
- /**
15
- * 响应式计数器
16
- * @param initialValue - 初始值
17
- * @param options - 配置选项
18
- * @returns 计数器对象
19
- */
20
- export declare function useCounter(initialValue?: number, options?: UseCounterOptions): UseCounterReturn;
21
- //# sourceMappingURL=useCounter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCounter.d.ts","sourceRoot":"","sources":["../../src/hooks/useCounter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAClB,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,YAAY,GAAE,MAAU,EACxB,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA6BlB"}
@@ -1,18 +0,0 @@
1
- import { type Ref } from 'vue';
2
- export interface UseLocalStorageOptions<T> {
3
- defaultValue?: T;
4
- serializer?: {
5
- read: (value: string) => T;
6
- write: (value: T) => string;
7
- };
8
- onError?: (error: Error) => void;
9
- }
10
- /**
11
- * 响应式 localStorage
12
- * @param key - localStorage 键名
13
- * @param initialValue - 初始值
14
- * @param options - 配置选项
15
- * @returns 响应式值
16
- */
17
- export declare function useLocalStorage<T>(key: string, initialValue: T, options?: UseLocalStorageOptions<T>): Ref<T>;
18
- //# sourceMappingURL=useLocalStorage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useLocalStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAErD,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,YAAY,CAAC,EAAE,CAAC,CAAA;IAChB,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAA;QAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;KAC5B,CAAA;IACD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,OAAO,GAAE,sBAAsB,CAAC,CAAC,CAAM,GACtC,GAAG,CAAC,CAAC,CAAC,CAoER"}
@@ -1,21 +0,0 @@
1
- import { type Ref } from 'vue';
2
- export type ToggleValue = boolean | string | number;
3
- export interface UseToggleOptions<T extends ToggleValue> {
4
- truthyValue?: T;
5
- falsyValue?: T;
6
- }
7
- export interface UseToggleReturn<T extends ToggleValue> {
8
- value: Ref<T>;
9
- toggle: () => void;
10
- setTrue: () => void;
11
- setFalse: () => void;
12
- set: (value: T) => void;
13
- }
14
- /**
15
- * 切换布尔值或两个值之间的切换
16
- * @param initialValue - 初始值
17
- * @param options - 配置选项
18
- * @returns 切换对象
19
- */
20
- export declare function useToggle<T extends ToggleValue = boolean>(initialValue?: T, options?: UseToggleOptions<T>): UseToggleReturn<T>;
21
- //# sourceMappingURL=useToggle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useToggle.d.ts","sourceRoot":"","sources":["../../src/hooks/useToggle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AAEnC,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAEnD,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,WAAW;IACrD,WAAW,CAAC,EAAE,CAAC,CAAA;IACf,UAAU,CAAC,EAAE,CAAC,CAAA;CACf;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,WAAW;IACpD,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IACb,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,GAAG,OAAO,EACvD,YAAY,GAAE,CAAc,EAC5B,OAAO,GAAE,gBAAgB,CAAC,CAAC,CAAM,GAChC,eAAe,CAAC,CAAC,CAAC,CA4BpB"}