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 +68 -77
- package/dist/hooks/toAwaitFetch/toAwaitFetch.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/toAwaitFetch/toAwaitFetch.cjs.js +1 -1
- package/dist/toAwaitFetch/toAwaitFetch.es.js +1 -1
- package/dist/version.cjs.js +1 -1
- package/dist/version.es.js +1 -1
- package/package.json +24 -22
- package/dist/hooks/useCounter.d.ts +0 -21
- package/dist/hooks/useCounter.d.ts.map +0 -1
- package/dist/hooks/useLocalStorage.d.ts +0 -18
- package/dist/hooks/useLocalStorage.d.ts.map +0 -1
- package/dist/hooks/useToggle.d.ts +0 -21
- package/dist/hooks/useToggle.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,112 +1,103 @@
|
|
|
1
|
-
#
|
|
1
|
+
# xn-fe-tools
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
基于 Vue 3 Composition API 的工具库,当前主力能力是 `toAwaitFetch`:一个支持链式和解构两种模式的 HTTP 请求工具,内置错误处理、重试、全局配置与取消能力。
|
|
4
4
|
|
|
5
5
|
## ✨ 特性
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
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
|
|
17
|
-
|
|
18
|
-
pnpm
|
|
19
|
-
|
|
20
|
-
yarn
|
|
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
|
-
|
|
26
|
-
<script setup lang="ts">
|
|
27
|
-
import { useCounter } from 'my-vue-hooks'
|
|
27
|
+
### 解构模式
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
```ts
|
|
30
|
+
import { sendGet, sendPost } from 'xn-fe-tools'
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
38
|
+
```ts
|
|
39
|
+
import toAwaitFetch from 'xn-fe-tools'
|
|
63
40
|
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
查看 [贡献指南](./docs/guide/contributing.md) 了解如何添加新的 hook。
|
|
48
|
+
### 创建实例并统一配置(推荐)
|
|
71
49
|
|
|
72
|
-
|
|
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
|
-
```
|
|
77
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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 '
|
|
95
|
+
import { VERSION, getVersion } from 'xn-fe-tools'
|
|
104
96
|
|
|
105
|
-
console.log(VERSION)
|
|
106
|
-
console.log(getVersion())
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,aAAa,EAEb,kBAAkB,EAGlB,aAAa,EACb,YAAY,EAGZ,WAAW,EACX,YAAY,EAGZ,mBAAmB,EAMnB,WAAW,EACX,YAAY,EACb,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,UAAU,qBAAqB,CAAC,QAAQ,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG,CAAE,SAAQ,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC;IACzG;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;OAEG;IACH,iBAAiB,CAAC,EAAE,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;CAC/D;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
|
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,
|
|
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};
|
package/dist/version.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="1.0.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="1.0.2";exports.VERSION=e,exports.getVersion=function(){return e};
|
package/dist/version.es.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const n="1.0.
|
|
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.
|
|
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"}
|