@mlyrmdhnn/use-fetch 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/dist/index.js +16 -5
- package/dist/index.mjs +6 -6
- package/package.json +1 -1
- package/readme.md +0 -20
package/dist/index.js
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("vue");var t=e=>new Promise(t=>setTimeout(t,e)),n=e=>{let t={};return Object.entries(e||{}).forEach(([e,n])=>{n!=null&&(t[e]=String(n))}),new URLSearchParams(t).toString()},r=e=>{let t=sessionStorage.getItem(e);return t?JSON.parse(t):null},i=(e,t)=>{sessionStorage.setItem(e,JSON.stringify(t))},a={baseURL:`your domain`,headers:{},statusHooks:[]},o=e=>({baseURL:e?.baseURL??`your domain`??``,headers:e?.headers??{},statusHooks:[]}),s={baseURL(e){a.baseURL=e},getBaseURL(){return a.baseURL},headers(e){a.headers={...a.headers,...e}},getHeaders(){return a.headers},onError(e,t){a.statusHooks.push({status:e,fn:t})}},c=[],l=async(e,t)=>{for(let n of c)n.status===e&&await n.fn(t)},u=new Map,d=(e,t,n)=>`${t}:${e}:${JSON.stringify(n)}`,f=e=>u.get(e),p=(e,t)=>{u.set(e,t)},m=e=>{u.delete(e)},h=async({endpoint:e,options:o,controller:s,instanceConfig:c,instanceRequestInterceptors:u,instanceResponseInterceptors:h,instanceErrorInterceptors:g})=>{let _=c??a,{method:v=`GET`,params:y={},payload:b=null,credentials:x=!1,headers:S={},timeout:C=1e4,retry:w=0,retryDelay:T=1e3,cache:E=!1,cacheKey:D,baseURL:O=_.baseURL,dedup:k=!1}=o,A=u??[],j=h??[],M=g??[],N=n(y),P=async()=>{let n=0;for(;n<=w;)try{let t=typeof b==`function`?await b():b,n=t instanceof FormData,o=E&&r(D);if(o)return o;s=new AbortController;let u=setTimeout(()=>s.abort(),C),d={method:v,headers:{Accept:`application/json`,...n?{}:{"Content-Type":`application/json`},"X-Requested-With":`XMLHttpRequest`,...a.headers,..._.headers,...S},credentials:x?`include`:`same-origin`,signal:s.signal,body:v===`GET`?void 0:n?t:JSON.stringify(t)};for(let e of A)d=await e.fn(d);let f=``;try{let t=e.startsWith(`/`)?e.slice(1):e;f=new URL(t,O).toString()}catch{throw Error(`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("vue");var t=e=>new Promise(t=>setTimeout(t,e)),n=e=>{let t={};return Object.entries(e||{}).forEach(([e,n])=>{n!=null&&(t[e]=String(n))}),new URLSearchParams(t).toString()},r=e=>{let t=sessionStorage.getItem(e);return t?JSON.parse(t):null},i=(e,t)=>{sessionStorage.setItem(e,JSON.stringify(t))},a={baseURL:`your domain`,headers:{},statusHooks:[]},o=e=>({baseURL:e?.baseURL??`your domain`??``,headers:e?.headers??{},statusHooks:[]}),s={baseURL(e){a.baseURL=e},getBaseURL(){return a.baseURL},headers(e){a.headers={...a.headers,...e}},getHeaders(){return a.headers},onError(e,t){a.statusHooks.push({status:e,fn:t})}},c=[],l=async(e,t)=>{for(let n of c)n.status===e&&await n.fn(t)},u=new Map,d=(e,t,n)=>`${t}:${e}:${JSON.stringify(n)}`,f=e=>u.get(e),p=(e,t)=>{u.set(e,t)},m=e=>{u.delete(e)},h=async({endpoint:e,options:o,controller:s,instanceConfig:c,instanceRequestInterceptors:u,instanceResponseInterceptors:h,instanceErrorInterceptors:g})=>{let _=c??a,{method:v=`GET`,params:y={},payload:b=null,credentials:x=!1,headers:S={},timeout:C=1e4,retry:w=0,retryDelay:T=1e3,cache:E=!1,cacheKey:D,baseURL:O=_.baseURL,dedup:k=!1}=o,A=u??[],j=h??[],M=g??[],N=n(y),P=async()=>{let n=0;for(;n<=w;)try{let t=typeof b==`function`?await b():b,n=t instanceof FormData,o=E&&r(D);if(o)return o;s=new AbortController;let u=setTimeout(()=>s.abort(),C),d={method:v,headers:{Accept:`application/json`,...n?{}:{"Content-Type":`application/json`},"X-Requested-With":`XMLHttpRequest`,...a.headers,..._.headers,...S},credentials:x?`include`:`same-origin`,signal:s.signal,body:v===`GET`?void 0:n?t:JSON.stringify(t)};for(let e of A)d=await e.fn(d);let f=``;try{if(e.startsWith(`http://`)||e.startsWith(`https://`))f=e;else{let t=e.startsWith(`/`)?e.slice(1):e;f=new URL(t,O).toString()}}catch{throw Error(`
|
|
2
2
|
[useFetch] Failed to create URL.
|
|
3
3
|
Base URL : ${O}
|
|
4
4
|
Endpoint : ${e}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
`)}let p=await fetch(`${f}${N?`?${N}`:``}`,d);clearTimeout(u);let m=await p.json();for(let e of j)m=await e.fn(m);if(!p.ok){await l(p.status,m);let e=c?.statusHooks??[];for(let t of e)t.status===p.status&&await t.fn(m);throw m}return E&&i(D,m),m}catch(e){if(n++,n<=w){await t(T);continue}let r=e;for(let e of M)r=await e.fn(r);throw r}};if(k&&v===`GET`){let t=d(e,v,y),n=f(t);if(n)return n;let r=P().finally(()=>m(t));return p(t,r),r}throw O?!e||e.trim()===``?Error(`[useFetch] endpoint is required.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
|
|
9
|
+
useFetch('/users')
|
|
10
|
+
`):Error(`[useFetch] Failed to build URL.\n\n baseURL : ${O}\n endpoint: ${e}\n\nMake sure baseURL ends with '/' and endpoint starts with '/':\n\n useFetch.baseURL('https://your-api.com/api/')\n useFetch('/users')\n`):Error(`[useFetch] baseURL is not set.
|
|
11
|
+
|
|
12
|
+
Please set it in main.ts:
|
|
13
|
+
|
|
14
|
+
useFetch.baseURL('https://your-api.com/api/')
|
|
15
|
+
|
|
16
|
+
or pass it per request:
|
|
17
|
+
|
|
18
|
+
useFetch('/users', { baseURL: 'https://your-api.com/api/' })
|
|
19
|
+
`)},g=0,_=()=>{let e=[],t=[],n=[];return{interceptor:{request:{use(t){let n=++g;return e.push({id:n,fn:t}),n},eject(t){let n=e.findIndex(e=>e.id===t);n!==-1&&e.splice(n,1)}},response:{use(e){let n=++g;return t.push({id:n,fn:e}),n},eject(e){let n=t.findIndex(t=>t.id===e);n!==-1&&t.splice(n,1)}},error:{use(e){let t=++g;return n.push({id:t,fn:e}),t},eject(e){let t=n.findIndex(t=>t.id===e);t!==-1&&n.splice(t,1)}}},requestInterceptors:e,responseInterceptors:t,errorInterceptors:n}},{interceptor:v,requestInterceptors:y,responseInterceptors:b,errorInterceptors:x}=_(),S=(t,n)=>{if(t)if((0,e.isRef)(t)){(0,e.watch)(t,n,{deep:!0});return}else if((0,e.isReactive)(t)){(0,e.watch)(t,n,{deep:!0});return}else (0,e.watch)(()=>t,n,{deep:!0})};function C(t,n={},r,i){let{immediate:a=!0,watchParams:o=!1,pagination:s=!1,pick:c=``,transform:l,cacheKey:u=t,onBeforeRequest:d,onSuccess:f,onError:p,onFinally:m,...g}=n,_=(0,e.ref)(null),v=(0,e.ref)(null),y=(0,e.ref)(!1),b=(0,e.ref)(`idle`),x=(0,e.ref)([]),C=(0,e.ref)(0),w=(0,e.ref)(0),T=(0,e.ref)(0),E=(0,e.ref)(1),D=new AbortController,O=async()=>{try{y.value=!0,b.value=`pending`,v.value=null,d?.(n.payload);let e=await h({endpoint:t,controller:D,options:{...g,endpoint:t,cacheKey:u},instanceConfig:r,instanceRequestInterceptors:i?.requestInterceptors,instanceResponseInterceptors:i?.responseInterceptors,instanceErrorInterceptors:i?.errorInterceptors});if(s)return _.value=e.result.data,x.value=e.result.links,C.value=e.result.from,w.value=e.result.to,T.value=e.result.total,E.value=e.result.current_page,b.value=`success`,f?.(e),e;let a=c?e[c]:e;return l&&(a=l(a)),_.value=a,b.value=`success`,f?.(a),a}catch(e){b.value=`error`,v.value=e,p?.(e)}finally{y.value=!1,m?.()}};return a&&O(),o&&S(n.params,()=>O()),{data:_,error:v,pending:y,status:b,links:x,from:C,to:w,total:T,currentPage:E,execute:O,refresh:()=>O(),clear:()=>{_.value=null,v.value=null,b.value=`idle`},abort:()=>D.abort()}}function w(e,t={}){return C(e,t)}var T=w;T.baseURL=s.baseURL,T.headers=s.headers,T.interceptor=v,T.onError=s.onError,T.create=e=>{let t=o(e),n=_(),r=(e,r={})=>C(e,r,t,n);return r.baseURL=e=>{t.baseURL=e},r.headers=e=>{t.headers={...t.headers,...e}},r.onError=(e,n)=>{t.statusHooks.push({status:e,fn:n})},r.interceptor=n.interceptor,r},exports.useFetch=T;
|
package/dist/index.mjs
CHANGED
|
@@ -70,16 +70,16 @@ var i = (e) => new Promise((t) => setTimeout(t, e)), a = (e) => {
|
|
|
70
70
|
for (let e of A) u = await e.fn(u);
|
|
71
71
|
let d = "";
|
|
72
72
|
try {
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
if (e.startsWith("http://") || e.startsWith("https://")) d = e;
|
|
74
|
+
else {
|
|
75
|
+
let t = e.startsWith("/") ? e.slice(1) : e;
|
|
76
|
+
d = new URL(t, O).toString();
|
|
77
|
+
}
|
|
75
78
|
} catch {
|
|
76
79
|
throw Error(`
|
|
77
80
|
[useFetch] Failed to create URL.
|
|
78
81
|
Base URL : ${O}
|
|
79
82
|
Endpoint : ${e}
|
|
80
|
-
Example valid:
|
|
81
|
-
baseURL -> http://localhost:8080/api/
|
|
82
|
-
endpoint -> /users
|
|
83
83
|
`);
|
|
84
84
|
}
|
|
85
85
|
let m = await fetch(`${d}${N ? `?${N}` : ""}`, u);
|
|
@@ -109,7 +109,7 @@ var i = (e) => new Promise((t) => setTimeout(t, e)), a = (e) => {
|
|
|
109
109
|
let r = P().finally(() => _(t));
|
|
110
110
|
return g(t, r), r;
|
|
111
111
|
}
|
|
112
|
-
|
|
112
|
+
throw O ? !e || e.trim() === "" ? Error("[useFetch] endpoint is required.\n\nExample:\n\n useFetch('/users')\n") : Error(`[useFetch] Failed to build URL.\n\n baseURL : ${O}\n endpoint: ${e}\n\nMake sure baseURL ends with '/' and endpoint starts with '/':\n\n useFetch.baseURL('https://your-api.com/api/')\n useFetch('/users')\n`) : Error("[useFetch] baseURL is not set.\n\nPlease set it in main.ts:\n\n useFetch.baseURL('https://your-api.com/api/')\n\nor pass it per request:\n\n useFetch('/users', { baseURL: 'https://your-api.com/api/' })\n");
|
|
113
113
|
}, y = 0, b = () => {
|
|
114
114
|
let e = [], t = [], n = [];
|
|
115
115
|
return {
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -59,26 +59,6 @@ useFetch.baseURL("https://your-api.com/api/");
|
|
|
59
59
|
|
|
60
60
|
---
|
|
61
61
|
|
|
62
|
-
## Project Structure
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
lib/
|
|
66
|
-
└── fetch/
|
|
67
|
-
├── cache.ts # SessionStorage cache handler
|
|
68
|
-
├── config.ts # Global config & instance factory
|
|
69
|
-
├── core.ts # Core fetch logic
|
|
70
|
-
├── dedup.ts # Request deduplication
|
|
71
|
-
├── helpers.ts # Utility functions
|
|
72
|
-
├── interceptor.ts # Global & instance interceptors
|
|
73
|
-
├── statusHooks.ts # HTTP status code hooks
|
|
74
|
-
├── types.ts # TypeScript types & interfaces
|
|
75
|
-
└── watcher.ts # Reactive params watcher
|
|
76
|
-
http/
|
|
77
|
-
└── useFetch.ts # Main composable entry point
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
62
|
## Basic Usage
|
|
83
63
|
|
|
84
64
|
### JavaScript
|