@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 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
- Example valid:
6
- baseURL -> http://localhost:8080/api/
7
- endpoint -> /users
8
- `)}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}return P()},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;
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
- let t = e.startsWith("/") ? e.slice(1) : e;
74
- d = new URL(t, O).toString();
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
- return P();
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mlyrmdhnn/use-fetch",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Lightweight zero-dependency HTTP composable for Vue 3.5+",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
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