soon-fetch 3.1.0 → 3.1.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
@@ -13,7 +13,7 @@
13
13
  > - 🚀 request race
14
14
  > - 📝 response cache
15
15
  > - 🔤 automatic serialization of JSON
16
- > - 📏 .min size less than **5K**, smaller after zip
16
+ > - 📏 .min size less than **6K**, smaller after zip
17
17
  > - 💡 smart type tips with Typescript
18
18
 
19
19
  - [Example](#example)
@@ -573,7 +573,7 @@ const formData = toFormData({
573
573
 
574
574
  #### soon-fetch
575
575
 
576
- **极轻量的请求库,不到 5K**
576
+ **极轻量的请求库,不到 6K**
577
577
 
578
578
  > - 🌐 自动解析 rest Url 的参数
579
579
  > - ⭐ 快捷定义请求 api
@@ -582,7 +582,7 @@ const formData = toFormData({
582
582
  > - 🚀 请求竞态
583
583
  > - 📝 响应缓存
584
584
  > - 🔤 自动处理 JSON
585
- > - 📏 不到 **5K** , zip 后会更小
585
+ > - 📏 不到 **6K** , zip 后会更小
586
586
  > - 💡 用 typescript 有智能类型提醒
587
587
 
588
588
  - [示例](#示例)
package/dist/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";const e=e=>{const t=[],r=e.match(/:([^:/\d]+)\/?/g);return r&&r.forEach((e=>{t.push(e.replace(/\//g,"").replace(/:/g,""))})),t},t=(e="")=>e.endsWith("/")?e.slice(0,-1):e,r=(e="")=>e.startsWith("/")?e:"/"+e,n=(e="")=>e.startsWith("http"),o=e=>{if(!e)return[];if(e instanceof URLSearchParams||"string"==typeof e||Array.isArray(e))return Array.from(new URLSearchParams(e).entries());const t=[];return Object.keys(e).forEach((r=>{const n=e[r];(Array.isArray(n)?n:[n]).forEach((e=>{t.push([r,e??""])}))})),t},s=(s,a)=>{const{query:i,params:c,baseURL:f}=a;let p=s.trim();e(s).forEach((e=>{c&&(p=p.replace(":"+e,""+c[e]))}));const[u,l]=p.split("?"),h=new URLSearchParams([...o(l),...o(i)]);let y=((e,o)=>{if(n(e))return e;const s=n(o)?o:r(o);return t(s)+t(r(e))})(u,f);return h.size&&(y=y+"?"+h),y},a=(...e)=>{const t=new Headers;return e.forEach((e=>{e&&new Headers(e).forEach(((e,r)=>{t.set(r,e)}))})),t};function i(e,t){const r=(e??[]).filter((e=>!!e));return t&&r.push(AbortSignal.timeout(t)),r.length?AbortSignal.any(r):void 0}function c(e){return!(!e||"object"!=typeof e||(e instanceof Blob||e instanceof ArrayBuffer||e instanceof FormData||e instanceof File||e instanceof DataView||e instanceof URLSearchParams||e instanceof ReadableStream||(t=e,t instanceof Int8Array||t instanceof Uint8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array||t instanceof BigInt64Array||t instanceof BigUint64Array)));var t}function f(e){const t=new FormData;return e&&"object"==typeof e&&!Array.isArray(e)&&Object.entries(e).forEach((([e,r])=>{let n;n=r instanceof Blob?r:JSON.stringify(r),t.append(e,n)})),t}function p(...e){const t=Object.assign({},...e),r=a(...e.map((e=>e?.headers)));return t.headers=r,t.signal=i(e.map((e=>e?.signal)),t.timeout),t}function u(e){const{url:t,options:r,baseURL:n,baseOptions:o}=e,a=p(o,r),f=s(t,{...a,baseURL:n}),u=a?.body,l=c(u);a.body=l?JSON.stringify(u):u,l&&a.headers.append("Content-Type","application/json");const h=new AbortController;return a.signal=i([a.signal,h.signal]),{url:f,options:a,is_body_json:l,abortController:h}}const l=["get","post","put","delete","patch"];function h(e,t){const r={};return e.forEach((e=>{r[e]=t(e)})),r}function y(t){const r=(r,n,o)=>{const s=!!e(r).length;return(...e)=>{const a=[...e],{hasBody:i,hasQuery:c,isFormData:p}=o||{},u=s?a.shift():void 0,l=c?a.shift():void 0;let h=i?a.shift():void 0;p&&(h=f(h));const y=a.shift();return t(r,n,u,l,h,y,o?.options)}},n={};return l.forEach((e=>{const t=e.toUpperCase();n[t]=t=>({Send:n=>r(t,e,{options:n}),Body:()=>({Send:n=>r(t,e,{hasBody:!0,options:n})}),FormData:()=>({Send:n=>r(t,e,{hasBody:!0,isFormData:!0,options:n})}),Query:()=>({Send:n=>r(t,e,{hasQuery:!0,options:n}),Body:()=>({Send:n=>r(t,e,{hasBody:!0,hasQuery:!0,options:n})}),FormData:()=>({Send:n=>r(t,e,{hasBody:!0,hasQuery:!0,isFormData:!0,options:n})})})})})),n}function d(e,t){t&&(t.pop()?.abort("race abort"),t.push(e))}function m(e){if(Array.isArray(e))return e.map(m);if("object"==typeof e&&null!==e){const t={};return Object.keys(e).sort().forEach((r=>{t[r]=m(e[r])})),t}return e}function g(e){const{url:t,options:r}=e,{headers:n,method:o,body:s,query:a,params:i}=r??{},c=m(Object.fromEntries(new Headers(n).entries()??[]));return(o??"get").toLowerCase()+t+JSON.stringify(m(a)??"")+JSON.stringify(m(i)??"")+JSON.stringify(c)+("object"==typeof s&&null!=s?JSON.stringify(m(s)):s??"")}function b(){const e={},t=[];setInterval((()=>{const r=Date.now();for(let n=t.length-1;n>=0;n--)t[n].expiredTime<r&&(delete e[t[n].key],t.splice(n,1))}),6e4);const r=e=>e instanceof Response?e.clone():"function"==typeof e||e instanceof Promise?e:structuredClone(e);function n(r){delete e[r];for(let e=t.length-1;e>=0;e--)if(t[e].key===r){t.splice(e,1);break}}return{get:function(t){const o=e[t];if(void 0!==o)return o.expiredTime>Date.now()?r(o.data):void n(t)},set:function(n,o,s){e[n]={data:r(o),expiredTime:s},t.push({key:n,expiredTime:s})},remove:n}}function A(){const e={},t=t=>e[t]=void 0;return{get:t=>e[t],set:(r,n)=>{e[r]=n,n.finally((()=>t(r)))}}}exports.createCache=b,exports.createShare=A,exports.createShortApi=y,exports.createShortMethods=h,exports.createSilentRefresh=function(e){let t=[],r=!1;return(n,o)=>{t.push({success:n,fail:o}),r||(r=!0,e().then((()=>{t.forEach((e=>e.success()))})).catch((e=>{t.forEach((e=>e.fail()))})).finally((()=>{r=!1,t=[]})))}},exports.createSoon=function(e,t){const r=b(),n=A(),o=(o,s)=>new Promise(((a,i)=>{const c=e(o,s),f=u({url:o,options:s,...c}),p=g(f),{abortController:l}=f,h=new AbortController;h.signal.addEventListener("abort",(()=>{i(h.signal.reason)}));const y=t({parsed:{...f,requestKey:p}});if(f.options?.share){const e=n.get(p);if(e)return a(e)}if(d(f.options.share?h:l,f.options?.aborts),f.options?.staleTime){const e=r.get(p);if(void 0!==e)return a(e)}const m=y(o,s);f.options?.share&&n.set(p,m),m.then((e=>{a(e),f.options?.staleTime&&r.set(p,e,(new Date).getTime()+f.options.staleTime)})).catch((e=>i(e)))})),s=y(((e,t,r,n,s,a,i)=>o(e,{...i,...a,method:t,params:r,query:n,body:s}))),a=h([...l,"head","options"],(e=>(t,r)=>o(t,{...r,method:e})));return{request:o,...s,...a}},exports.deepSort=m,exports.genRequestKey=g,exports.isBodyJson=c,exports.mergeHeaders=a,exports.mergeOptions=p,exports.mergeSignals=i,exports.mergeUrl=s,exports.parseUrlOptions=function(e){const{url:t,options:r}=u(e);return[t,r]},exports.parseWithBase=u,exports.raceAbort=d,exports.toFormData=f;
1
+ "use strict";const t=t=>{const e=[],r=t.match(/:([^:/\d]+)\/?/g);return r&&r.forEach((t=>{e.push(t.replace(/\//g,"").replace(/:/g,""))})),e},e=(t="")=>t.endsWith("/")?t.slice(0,-1):t,r=(t="")=>t.startsWith("/")?t:"/"+t,n=(t="")=>t.startsWith("http"),o=t=>{if(!t)return[];if(t instanceof URLSearchParams||"string"==typeof t||Array.isArray(t))return Array.from(new URLSearchParams(t).entries());const e=[];return Object.keys(t).forEach((r=>{const n=t[r];(Array.isArray(n)?n:[n]).forEach((t=>{e.push([r,t??""])}))})),e},s=(s,a)=>{const{query:i,params:c,baseURL:f}=a;let p=s.trim();t(s).forEach((t=>{c&&(p=p.replace(":"+t,""+c[t]))}));const[u,l]=p.split("?"),y=new URLSearchParams([...o(l),...o(i)]);let h=((t,o)=>{if(n(t))return t;const s=n(o)?o:r(o);return e(s)+e(r(t))})(u,f);return y.size&&(h=h+"?"+y),h},a=(...t)=>{const e=new Headers;return t.forEach((t=>{t&&new Headers(t).forEach(((t,r)=>{e.set(r,t)}))})),e};function i(t,e){const r=(t??[]).filter((t=>!!t));return e&&r.push(AbortSignal.timeout(e)),r.length?AbortSignal.any(r):void 0}function c(t){return!(!t||"object"!=typeof t||(t instanceof Blob||t instanceof ArrayBuffer||t instanceof FormData||t instanceof File||t instanceof DataView||t instanceof URLSearchParams||t instanceof ReadableStream||(e=t,e instanceof Int8Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array||e instanceof BigInt64Array||e instanceof BigUint64Array)));var e}function f(t){const e=new FormData;return t&&"object"==typeof t&&!Array.isArray(t)&&Object.entries(t).forEach((([t,r])=>{if(null==r||"function"==typeof r)return;let n;n=r instanceof Blob?r:"object"==typeof r?JSON.stringify(r):String(r),e.append(t,n)})),e}function p(...t){const e=Object.assign({},...t),r=a(...t.map((t=>t?.headers)));return e.headers=r,e.signal=i(t.map((t=>t?.signal)),e.timeout),e}function u(t){const{url:e,options:r,baseURL:n,baseOptions:o}=t,a=p(o,r),f=s(e,{...a,baseURL:n}),u=a?.body,l=c(u);a.body=l?JSON.stringify(u):u,l&&a.headers.append("Content-Type","application/json");const y=new AbortController;return a.signal=i([a.signal,y.signal]),{url:f,options:a,is_body_json:l,abortController:y}}const l=["get","post","put","delete","patch"];function y(t,e){const r={};return t.forEach((t=>{r[t]=e(t)})),r}function h(e){const r=(r,n,o)=>{const s=!!t(r).length;return(...t)=>{const a=[...t],{hasBody:i,hasQuery:c,isFormData:p}=o||{},u=s?a.shift():void 0,l=c?a.shift():void 0;let y=i?a.shift():void 0;p&&(y=f(y));const h=a.shift();return e(r,n,u,l,y,h,o?.options)}},n={};return l.forEach((t=>{const e=t.toUpperCase();n[e]=e=>({Send:n=>r(e,t,{options:n}),Body:()=>({Send:n=>r(e,t,{hasBody:!0,options:n})}),FormData:()=>({Send:n=>r(e,t,{hasBody:!0,isFormData:!0,options:n})}),Query:()=>({Send:n=>r(e,t,{hasQuery:!0,options:n}),Body:()=>({Send:n=>r(e,t,{hasBody:!0,hasQuery:!0,options:n})}),FormData:()=>({Send:n=>r(e,t,{hasBody:!0,hasQuery:!0,isFormData:!0,options:n})})})})})),n}function d(t,e){e&&(e.pop()?.abort("race abort"),e.push(t))}function m(t){if(Array.isArray(t))return t.map(m);if("object"==typeof t&&null!==t){const e={};return Object.keys(t).sort().forEach((r=>{e[r]=m(t[r])})),e}return t}function g(t){const{url:e,options:r}=t,{headers:n,method:o,body:s,query:a,params:i}=r??{},c=m(Object.fromEntries(new Headers(n).entries()??[]));return(o??"get").toLowerCase()+e+JSON.stringify(m(a)??"")+JSON.stringify(m(i)??"")+JSON.stringify(c)+("object"==typeof s&&null!=s?JSON.stringify(m(s)):s??"")}function b(){const t={},e=[];setInterval((()=>{const r=Date.now();for(let n=e.length-1;n>=0;n--)e[n].expiredTime<r&&(delete t[e[n].key],e.splice(n,1))}),6e4);const r=t=>{if(t instanceof Response)return t.clone();if("function"==typeof t||t instanceof Promise)return t;try{return structuredClone(t)}catch(e){return JSON.parse(JSON.stringify(t))}};function n(r){delete t[r];for(let t=e.length-1;t>=0;t--)if(e[t].key===r){e.splice(t,1);break}}return{get:function(e){const o=t[e];if(void 0!==o)return o.expiredTime>Date.now()?r(o.data):void n(e)},set:function(n,o,s){t[n]={data:r(o),expiredTime:s},e.push({key:n,expiredTime:s})},remove:n}}function S(){const t={},e=e=>t[e]=void 0;return{get:e=>t[e],set:(r,n)=>{t[r]=n,n.finally((()=>e(r)))}}}exports.createCache=b,exports.createShare=S,exports.createShortApi=h,exports.createShortMethods=y,exports.createSilentRefresh=function(t){let e=[],r=!1;return(n,o)=>{e.push({success:n,fail:o}),r||(r=!0,t().then((()=>{e.forEach((t=>t.success()))})).catch((t=>{e.forEach((t=>t.fail()))})).finally((()=>{r=!1,e=[]})))}},exports.createSoon=function(t,e){const r=b(),n=S(),o=(o,s)=>new Promise(((a,i)=>{const c=t(o,s),f=u({url:o,options:s,...c}),p=g(f),{abortController:l}=f,y=new AbortController;y.signal.addEventListener("abort",(()=>{i(y.signal.reason)}));const h=e({parsed:{...f,requestKey:p}});if(f.options?.share){const t=n.get(p);if(t)return a(t)}if(d(f.options.share?y:l,f.options?.aborts),f.options?.staleTime){const t=r.get(p);if(void 0!==t)return a(t)}const m=h(o,s);f.options?.share&&n.set(p,m),m.then((t=>{a(t),f.options?.staleTime&&r.set(p,t,(new Date).getTime()+f.options.staleTime)})).catch((t=>i(t)))})),s=h(((t,e,r,n,s,a,i)=>o(t,{...i,...a,method:e,params:r,query:n,body:s}))),a=y([...l,"head","options"],(t=>(e,r)=>o(e,{...r,method:t})));return{request:o,...s,...a}},exports.deepSort=m,exports.genRequestKey=g,exports.isBodyJson=c,exports.mergeHeaders=a,exports.mergeOptions=p,exports.mergeSignals=i,exports.mergeUrl=s,exports.parseUrlOptions=function(t){const{url:e,options:r}=u(t);return[e,r]},exports.parseWithBase=u,exports.raceAbort=d,exports.toFormData=f;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- const t=t=>{const e=[],n=t.match(/:([^:/\d]+)\/?/g);return n&&n.forEach((t=>{e.push(t.replace(/\//g,"").replace(/:/g,""))})),e},e=(t="")=>t.endsWith("/")?t.slice(0,-1):t,n=(t="")=>t.startsWith("/")?t:"/"+t,r=(t="")=>t.startsWith("http"),o=t=>{if(!t)return[];if(t instanceof URLSearchParams||"string"==typeof t||Array.isArray(t))return Array.from(new URLSearchParams(t).entries());const e=[];return Object.keys(t).forEach((n=>{const r=t[n];(Array.isArray(r)?r:[r]).forEach((t=>{e.push([n,t??""])}))})),e},s=(s,a)=>{const{query:i,params:c,baseURL:f}=a;let u=s.trim();t(s).forEach((t=>{c&&(u=u.replace(":"+t,""+c[t]))}));const[l,p]=u.split("?"),y=new URLSearchParams([...o(p),...o(i)]);let h=((t,o)=>{if(r(t))return t;const s=r(o)?o:n(o);return e(s)+e(n(t))})(l,f);return y.size&&(h=h+"?"+y),h},a=(...t)=>{const e=new Headers;return t.forEach((t=>{t&&new Headers(t).forEach(((t,n)=>{e.set(n,t)}))})),e};function i(t,e){const n=(t??[]).filter((t=>!!t));return e&&n.push(AbortSignal.timeout(e)),n.length?AbortSignal.any(n):void 0}function c(t){return!(!t||"object"!=typeof t||(t instanceof Blob||t instanceof ArrayBuffer||t instanceof FormData||t instanceof File||t instanceof DataView||t instanceof URLSearchParams||t instanceof ReadableStream||(e=t,e instanceof Int8Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array||e instanceof BigInt64Array||e instanceof BigUint64Array)));var e}function f(t){const e=new FormData;return t&&"object"==typeof t&&!Array.isArray(t)&&Object.entries(t).forEach((([t,n])=>{let r;r=n instanceof Blob?n:JSON.stringify(n),e.append(t,r)})),e}function u(...t){const e=Object.assign({},...t),n=a(...t.map((t=>t?.headers)));return e.headers=n,e.signal=i(t.map((t=>t?.signal)),e.timeout),e}function l(t){const{url:e,options:n,baseURL:r,baseOptions:o}=t,a=u(o,n),f=s(e,{...a,baseURL:r}),l=a?.body,p=c(l);a.body=p?JSON.stringify(l):l,p&&a.headers.append("Content-Type","application/json");const y=new AbortController;return a.signal=i([a.signal,y.signal]),{url:f,options:a,is_body_json:p,abortController:y}}function p(t){const{url:e,options:n}=l(t);return[e,n]}const y=["get","post","put","delete","patch"];function h(t,e){const n={};return t.forEach((t=>{n[t]=e(t)})),n}function d(e){const n=(n,r,o)=>{const s=!!t(n).length;return(...t)=>{const a=[...t],{hasBody:i,hasQuery:c,isFormData:u}=o||{},l=s?a.shift():void 0,p=c?a.shift():void 0;let y=i?a.shift():void 0;u&&(y=f(y));const h=a.shift();return e(n,r,l,p,y,h,o?.options)}},r={};return y.forEach((t=>{const e=t.toUpperCase();r[e]=e=>({Send:r=>n(e,t,{options:r}),Body:()=>({Send:r=>n(e,t,{hasBody:!0,options:r})}),FormData:()=>({Send:r=>n(e,t,{hasBody:!0,isFormData:!0,options:r})}),Query:()=>({Send:r=>n(e,t,{hasQuery:!0,options:r}),Body:()=>({Send:r=>n(e,t,{hasBody:!0,hasQuery:!0,options:r})}),FormData:()=>({Send:r=>n(e,t,{hasBody:!0,hasQuery:!0,isFormData:!0,options:r})})})})})),r}function m(t,e){e&&(e.pop()?.abort("race abort"),e.push(t))}function g(t){if(Array.isArray(t))return t.map(g);if("object"==typeof t&&null!==t){const e={};return Object.keys(t).sort().forEach((n=>{e[n]=g(t[n])})),e}return t}function b(t){const{url:e,options:n}=t,{headers:r,method:o,body:s,query:a,params:i}=n??{},c=g(Object.fromEntries(new Headers(r).entries()??[]));return(o??"get").toLowerCase()+e+JSON.stringify(g(a)??"")+JSON.stringify(g(i)??"")+JSON.stringify(c)+("object"==typeof s&&null!=s?JSON.stringify(g(s)):s??"")}function A(){const t={},e=[];setInterval((()=>{const n=Date.now();for(let r=e.length-1;r>=0;r--)e[r].expiredTime<n&&(delete t[e[r].key],e.splice(r,1))}),6e4);const n=t=>t instanceof Response?t.clone():"function"==typeof t||t instanceof Promise?t:structuredClone(t);function r(n){delete t[n];for(let t=e.length-1;t>=0;t--)if(e[t].key===n){e.splice(t,1);break}}return{get:function(e){const o=t[e];if(void 0!==o)return o.expiredTime>Date.now()?n(o.data):void r(e)},set:function(r,o,s){t[r]={data:n(o),expiredTime:s},e.push({key:r,expiredTime:s})},remove:r}}function S(){const t={},e=e=>t[e]=void 0;return{get:e=>t[e],set:(n,r)=>{t[n]=r,r.finally((()=>e(n)))}}}function w(t){let e=[],n=!1;return(r,o)=>{e.push({success:r,fail:o}),n||(n=!0,t().then((()=>{e.forEach((t=>t.success()))})).catch((t=>{e.forEach((t=>t.fail()))})).finally((()=>{n=!1,e=[]})))}}function E(t,e){const n=A(),r=S(),o=(o,s)=>new Promise(((a,i)=>{const c=t(o,s),f=l({url:o,options:s,...c}),u=b(f),{abortController:p}=f,y=new AbortController;y.signal.addEventListener("abort",(()=>{i(y.signal.reason)}));const h=e({parsed:{...f,requestKey:u}});if(f.options?.share){const t=r.get(u);if(t)return a(t)}if(m(f.options.share?y:p,f.options?.aborts),f.options?.staleTime){const t=n.get(u);if(void 0!==t)return a(t)}const d=h(o,s);f.options?.share&&r.set(u,d),d.then((t=>{a(t),f.options?.staleTime&&n.set(u,t,(new Date).getTime()+f.options.staleTime)})).catch((t=>i(t)))})),s=d(((t,e,n,r,s,a,i)=>o(t,{...i,...a,method:e,params:n,query:r,body:s}))),a=h([...y,"head","options"],(t=>(e,n)=>o(e,{...n,method:t})));return{request:o,...s,...a}}export{A as createCache,S as createShare,d as createShortApi,h as createShortMethods,w as createSilentRefresh,E as createSoon,g as deepSort,b as genRequestKey,c as isBodyJson,a as mergeHeaders,u as mergeOptions,i as mergeSignals,s as mergeUrl,p as parseUrlOptions,l as parseWithBase,m as raceAbort,f as toFormData};
1
+ const t=t=>{const e=[],n=t.match(/:([^:/\d]+)\/?/g);return n&&n.forEach((t=>{e.push(t.replace(/\//g,"").replace(/:/g,""))})),e},e=(t="")=>t.endsWith("/")?t.slice(0,-1):t,n=(t="")=>t.startsWith("/")?t:"/"+t,r=(t="")=>t.startsWith("http"),o=t=>{if(!t)return[];if(t instanceof URLSearchParams||"string"==typeof t||Array.isArray(t))return Array.from(new URLSearchParams(t).entries());const e=[];return Object.keys(t).forEach((n=>{const r=t[n];(Array.isArray(r)?r:[r]).forEach((t=>{e.push([n,t??""])}))})),e},s=(s,a)=>{const{query:i,params:c,baseURL:f}=a;let u=s.trim();t(s).forEach((t=>{c&&(u=u.replace(":"+t,""+c[t]))}));const[p,l]=u.split("?"),y=new URLSearchParams([...o(l),...o(i)]);let h=((t,o)=>{if(r(t))return t;const s=r(o)?o:n(o);return e(s)+e(n(t))})(p,f);return y.size&&(h=h+"?"+y),h},a=(...t)=>{const e=new Headers;return t.forEach((t=>{t&&new Headers(t).forEach(((t,n)=>{e.set(n,t)}))})),e};function i(t,e){const n=(t??[]).filter((t=>!!t));return e&&n.push(AbortSignal.timeout(e)),n.length?AbortSignal.any(n):void 0}function c(t){return!(!t||"object"!=typeof t||(t instanceof Blob||t instanceof ArrayBuffer||t instanceof FormData||t instanceof File||t instanceof DataView||t instanceof URLSearchParams||t instanceof ReadableStream||(e=t,e instanceof Int8Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array||e instanceof BigInt64Array||e instanceof BigUint64Array)));var e}function f(t){const e=new FormData;return t&&"object"==typeof t&&!Array.isArray(t)&&Object.entries(t).forEach((([t,n])=>{if(null==n||"function"==typeof n)return;let r;r=n instanceof Blob?n:"object"==typeof n?JSON.stringify(n):String(n),e.append(t,r)})),e}function u(...t){const e=Object.assign({},...t),n=a(...t.map((t=>t?.headers)));return e.headers=n,e.signal=i(t.map((t=>t?.signal)),e.timeout),e}function p(t){const{url:e,options:n,baseURL:r,baseOptions:o}=t,a=u(o,n),f=s(e,{...a,baseURL:r}),p=a?.body,l=c(p);a.body=l?JSON.stringify(p):p,l&&a.headers.append("Content-Type","application/json");const y=new AbortController;return a.signal=i([a.signal,y.signal]),{url:f,options:a,is_body_json:l,abortController:y}}function l(t){const{url:e,options:n}=p(t);return[e,n]}const y=["get","post","put","delete","patch"];function h(t,e){const n={};return t.forEach((t=>{n[t]=e(t)})),n}function d(e){const n=(n,r,o)=>{const s=!!t(n).length;return(...t)=>{const a=[...t],{hasBody:i,hasQuery:c,isFormData:u}=o||{},p=s?a.shift():void 0,l=c?a.shift():void 0;let y=i?a.shift():void 0;u&&(y=f(y));const h=a.shift();return e(n,r,p,l,y,h,o?.options)}},r={};return y.forEach((t=>{const e=t.toUpperCase();r[e]=e=>({Send:r=>n(e,t,{options:r}),Body:()=>({Send:r=>n(e,t,{hasBody:!0,options:r})}),FormData:()=>({Send:r=>n(e,t,{hasBody:!0,isFormData:!0,options:r})}),Query:()=>({Send:r=>n(e,t,{hasQuery:!0,options:r}),Body:()=>({Send:r=>n(e,t,{hasBody:!0,hasQuery:!0,options:r})}),FormData:()=>({Send:r=>n(e,t,{hasBody:!0,hasQuery:!0,isFormData:!0,options:r})})})})})),r}function m(t,e){e&&(e.pop()?.abort("race abort"),e.push(t))}function g(t){if(Array.isArray(t))return t.map(g);if("object"==typeof t&&null!==t){const e={};return Object.keys(t).sort().forEach((n=>{e[n]=g(t[n])})),e}return t}function b(t){const{url:e,options:n}=t,{headers:r,method:o,body:s,query:a,params:i}=n??{},c=g(Object.fromEntries(new Headers(r).entries()??[]));return(o??"get").toLowerCase()+e+JSON.stringify(g(a)??"")+JSON.stringify(g(i)??"")+JSON.stringify(c)+("object"==typeof s&&null!=s?JSON.stringify(g(s)):s??"")}function A(){const t={},e=[];setInterval((()=>{const n=Date.now();for(let r=e.length-1;r>=0;r--)e[r].expiredTime<n&&(delete t[e[r].key],e.splice(r,1))}),6e4);const n=t=>{if(t instanceof Response)return t.clone();if("function"==typeof t||t instanceof Promise)return t;try{return structuredClone(t)}catch(e){return JSON.parse(JSON.stringify(t))}};function r(n){delete t[n];for(let t=e.length-1;t>=0;t--)if(e[t].key===n){e.splice(t,1);break}}return{get:function(e){const o=t[e];if(void 0!==o)return o.expiredTime>Date.now()?n(o.data):void r(e)},set:function(r,o,s){t[r]={data:n(o),expiredTime:s},e.push({key:r,expiredTime:s})},remove:r}}function S(){const t={},e=e=>t[e]=void 0;return{get:e=>t[e],set:(n,r)=>{t[n]=r,r.finally((()=>e(n)))}}}function w(t){let e=[],n=!1;return(r,o)=>{e.push({success:r,fail:o}),n||(n=!0,t().then((()=>{e.forEach((t=>t.success()))})).catch((t=>{e.forEach((t=>t.fail()))})).finally((()=>{n=!1,e=[]})))}}function E(t,e){const n=A(),r=S(),o=(o,s)=>new Promise(((a,i)=>{const c=t(o,s),f=p({url:o,options:s,...c}),u=b(f),{abortController:l}=f,y=new AbortController;y.signal.addEventListener("abort",(()=>{i(y.signal.reason)}));const h=e({parsed:{...f,requestKey:u}});if(f.options?.share){const t=r.get(u);if(t)return a(t)}if(m(f.options.share?y:l,f.options?.aborts),f.options?.staleTime){const t=n.get(u);if(void 0!==t)return a(t)}const d=h(o,s);f.options?.share&&r.set(u,d),d.then((t=>{a(t),f.options?.staleTime&&n.set(u,t,(new Date).getTime()+f.options.staleTime)})).catch((t=>i(t)))})),s=d(((t,e,n,r,s,a,i)=>o(t,{...i,...a,method:e,params:n,query:r,body:s}))),a=h([...y,"head","options"],(t=>(e,n)=>o(e,{...n,method:t})));return{request:o,...s,...a}}export{A as createCache,S as createShare,d as createShortApi,h as createShortMethods,w as createSilentRefresh,E as createSoon,g as deepSort,b as genRequestKey,c as isBodyJson,a as mergeHeaders,u as mergeOptions,i as mergeSignals,s as mergeUrl,l as parseUrlOptions,p as parseWithBase,m as raceAbort,f as toFormData};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "soon-fetch",
3
- "version": "3.1.0",
4
- "description": "a 5Kb request lib alternative to axios with timeout, request reusing, race, response cache ...",
3
+ "version": "3.1.2",
4
+ "description": "a request lib alternative to axios with timeout, request reusing, race, response cache ...",
5
5
  "homepage": "https://github.com/leafio/soon-fetch",
6
6
  "main": "./dist/index.cjs.js",
7
7
  "module": "/dist/index.js",