UNPKG

axios-multi-api

Version:

Fast, lightweight and reusable data fetching

2 lines 8.4 kB
var b=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var O=(r,e)=>{for(var s in e)b(r,s,{get:e[s],enumerable:!0})},U=(r,e,s,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of H(e))!T.call(r,n)&&n!==s&&b(r,n,{get:()=>e[n],enumerable:!(t=x(e,n))||t.enumerable});return r};var S=r=>U(b({},"__esModule",{value:!0}),r);var Q={};O(Q,{createApiFetcher:()=>j,fetchf:()=>k});module.exports=S(Q);async function P(r,e){if(!e)return r;let s=Array.isArray(e)?e:[e],t={...r};for(let n of s)t=await n(t);return t}async function C(r,e){if(!e)return r;let s=Array.isArray(e)?e:[e],t=r;for(let n of s)t=await n(t);return t}var g=class extends Error{response;request;config;status;statusText;constructor(e,s,t){super(e),this.name="ResponseError",this.message=e,this.status=t.status,this.statusText=t.statusText,this.request=s,this.config=s,this.response=t}};function D(r,e){if(!e)return r;if(e instanceof URLSearchParams){let o=e.toString();return r.includes("?")?`${r}&${o}`:o?`${r}?${o}`:r}let s=[],t=function(o,a){a=typeof a=="function"?a():a,a=a===null||a===void 0?"":a,s[s.length]=encodeURIComponent(o)+"="+encodeURIComponent(a)},n=(o,a)=>{let i,c,p;if(o)if(Array.isArray(a))for(i=0,c=a.length;i<c;i++)n(o+"["+(typeof a[i]=="object"&&a[i]?i:"")+"]",a[i]);else if(typeof a=="object"&&a!==null)for(p in a)n(o+"["+p+"]",a[p]);else t(o,a);else if(Array.isArray(a))for(i=0,c=a.length;i<c;i++)t(a[i].name,a[i].value);else for(p in a)n(p,a[p]);return s},u=n("",e).join("&").replace(/%5B%5D/g,"[]");return r.includes("?")?`${r}&${u}`:u?`${r}?${u}`:r}function F(r,e){return e?r.replace(/:[a-zA-Z]+/gi,s=>{let t=s.substring(1);return String(e[t]?e[t]:s)}):r}function E(r){if(r==null)return!1;let e=typeof r;if(e==="string"||e==="number"||e==="boolean")return!0;if(e!=="object")return!1;if(Array.isArray(r))return!0;if(Buffer.isBuffer(r)||r instanceof Date)return!1;let s=Object.getPrototypeOf(r);return s===Object.prototype||s===null||typeof r.toJSON=="function"}async function I(r){return new Promise(e=>setTimeout(()=>e(!0),r))}var w="application/json",h=class{requestInstance;baseURL="";timeout=3e4;cancellable=!1;rejectCancelled=!1;strategy="reject";method="get";flattenResponse=!1;defaultResponse=null;fetcher;logger;onError;requestsQueue;retry={retries:0,delay:1e3,maxDelay:3e4,backoff:1.5,retryOn:[408,409,425,429,500,502,503,504],shouldRetry:async()=>!0};config;constructor({fetcher:e=null,timeout:s=null,rejectCancelled:t=!1,strategy:n=null,flattenResponse:l=null,defaultResponse:u={},logger:o=null,onError:a=null,...i}){this.fetcher=e,this.timeout=s??this.timeout,this.strategy=n||this.strategy,this.cancellable=i.cancellable||this.cancellable,this.rejectCancelled=t||this.rejectCancelled,this.flattenResponse=l||this.flattenResponse,this.defaultResponse=u,this.logger=o||(globalThis?globalThis.console:null)||null,this.onError=a,this.requestsQueue=new WeakMap,this.baseURL=i.baseURL||i.apiUrl||"",this.method=i.method||this.method,this.config=i,this.retry={...this.retry,...i.retry||{}},this.requestInstance=this.isCustomFetcher()?e.create({...i,baseURL:this.baseURL,timeout:this.timeout}):null}getInstance(){return this.requestInstance}buildConfig(e,s,t){let n=(t.method||this.method).toUpperCase(),l=n==="GET"||n==="HEAD",u=F(e,t.urlPathParams||this.config.urlPathParams),o=t.params||this.config.params,a=t.body||t.data||this.config.body||this.config.data,i=!!(s&&(l||a)),c;if(l||(c=a||s),this.isCustomFetcher())return{...t,method:n,url:u,params:i?s:o,data:c};let p=t.withCredentials||this.config.withCredentials?"include":t.credentials;delete t.data,delete t.withCredentials;let R=o||i?D(u,o||s):u,f=R.includes("://")?"":t.baseURL||this.baseURL;return c&&typeof c!="string"&&!(c instanceof URLSearchParams)&&E(c)&&(c=JSON.stringify(c)),{...t,credentials:p,body:c,method:n,url:f+R,headers:{Accept:w+", text/plain, */*","Content-Type":w+";charset=utf-8",...t.headers||this.config.headers||{}}}}processError(e,s){var t;this.isRequestCancelled(e)||((t=this.logger)!=null&&t.warn&&this.logger.warn("API ERROR",e),s.onError&&typeof s.onError=="function"&&s.onError(e),this.onError&&typeof this.onError=="function"&&this.onError(e))}async outputErrorResponse(e,s){let t=this.isRequestCancelled(e),n=s.strategy||this.strategy,l=typeof s.rejectCancelled<"u"?s.rejectCancelled:this.rejectCancelled,u=typeof s.defaultResponse<"u"?s.defaultResponse:this.defaultResponse;return n==="softFail"?this.outputResponse(e.response,s,e):t&&!l?u:n==="silent"?(await new Promise(()=>null),u):n==="reject"?Promise.reject(e):u}isRequestCancelled(e){return e.name==="AbortError"||e.name==="CanceledError"}isCustomFetcher(){return this.fetcher!==null}addCancellationToken(e){if(!this.cancellable&&!e.cancellable)return{};if(typeof e.cancellable<"u"&&!e.cancellable)return{};if(typeof AbortController>"u")return console.error("AbortController is unavailable."),{};let s=this.requestsQueue.get(e);s&&s.abort();let t=new AbortController;if(!this.isCustomFetcher()&&this.timeout>0){let n=setTimeout(()=>{let l=new Error(`[TimeoutError]: The ${e.url} request was aborted due to timeout`);throw l.name="TimeoutError",l.code=23,t.abort(l),clearTimeout(n),l},e.timeout||this.timeout)}return this.requestsQueue.set(e,t),{signal:t.signal}}async request(e,s=null,t=null){var q,A;let n=null,l=t||{},u=this.buildConfig(e,s,l),o={...this.addCancellationToken(u),...u},{retries:a,delay:i,backoff:c,retryOn:p,shouldRetry:R,maxDelay:y}={...this.retry,...(o==null?void 0:o.retry)||{}},f=0,m=i;for(;f<=a;)try{if(o=await P(o,o.onRequest),o=await P(o,this.config.onRequest),this.isCustomFetcher())n=await this.requestInstance.request(o);else if(n=await globalThis.fetch(o.url,o),n.config=o,n.data=await this.parseData(n),!n.ok)throw new g(`${o.url} failed! Status: ${n.status||null}`,o,n);return n=await C(n,o.onResponse),n=await C(n,this.config.onResponse),this.outputResponse(n,o)}catch(d){if(f===a||!await R(d,f)||!(p!=null&&p.includes(((q=d==null?void 0:d.response)==null?void 0:q.status)||(d==null?void 0:d.status))))return this.processError(d,o),this.outputErrorResponse(d,o);(A=this.logger)!=null&&A.warn&&this.logger.warn(`Attempt ${f+1} failed. Retrying in ${m}ms...`),await I(m),m*=c,m=Math.min(m,y),f++}return this.outputResponse(n,o)}async parseData(e){var n;if(!e.body)return null;let s=String(((n=e.headers)==null?void 0:n.get("Content-Type"))||"").split(";")[0],t;try{if(s.includes(w)||s.includes("+json"))t=await e.json();else if(s.includes("multipart/form-data"))t=await e.formData();else if(s.includes("application/octet-stream"))t=await e.blob();else if(s.includes("application/x-www-form-urlencoded"))t=await e.formData();else if(s.includes("text/"))t=await e.text();else try{t=await e.clone().json()}catch{t=await e.text()}}catch{t=null}return t}processHeaders(e){let s=e.headers;if(!s)return{};let t={};if(s instanceof Headers)s.forEach((n,l)=>{t[l]=n});else if(typeof s=="object"&&s!==null)for(let[n,l]of Object.entries(s))t[n.toLowerCase()]=l;return t}outputResponse(e,s,t=null){let n=typeof s.defaultResponse<"u"?s.defaultResponse:this.defaultResponse;return e?(s.flattenResponse||this.flattenResponse)&&typeof e.data<"u"?e.data!==null&&typeof e.data=="object"&&typeof e.data.data<"u"&&Object.keys(e.data).length===1?e.data.data:e.data:e!==null&&typeof e=="object"&&e.constructor===Object&&Object.keys(e).length===0?n:this.isCustomFetcher()?e:(t!==null&&(t==null||delete t.response,t==null||delete t.request,t==null||delete t.config),{body:e.body,blob:e.blob,json:e.json,text:e.text,clone:e.clone,bodyUsed:e.bodyUsed,arrayBuffer:e.arrayBuffer,formData:e.formData,ok:e.ok,redirected:e.redirected,type:e.type,url:e.url,status:e.status,statusText:e.statusText,error:t,data:e.data,headers:this.processHeaders(e),config:s}):n}};function j(r){let e=r.endpoints,s=new h(r);function t(){return s.getInstance()}function n(a){return console.error(`${a} endpoint must be added to 'endpoints'.`),Promise.resolve(null)}async function l(a,i={},c={},p={}){let y={...e[a]};return await s.request(y.url,i,{...y,...p,urlPathParams:c})}function u(a){return a in o?o[a]:e[a]?o.request.bind(null,a):n.bind(null,a)}let o={config:r,endpoints:e,requestHandler:s,getInstance:t,request:l};return new Proxy(o,{get:(a,i)=>u(i)})}async function k(r,e={}){return new h(e).request(r,null,e)}0&&(module.exports={createApiFetcher,fetchf}); //# sourceMappingURL=index.js.map