You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

wretch

Package Overview
Dependencies
Maintainers
1
Versions
85
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

wretch - npm Package Compare versions

Comparing version
2.11.0
to
2.11.1
+1
-1
dist/bundle/wretch.all.min.cjs

@@ -1,2 +0,2 @@

"use strict";const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function n(e){return/^application\/.*json.*/.test(e)}const s=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,n])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(n)?t[o]=r?[...i,...n]:n:t[o]="object"==typeof i&&"object"==typeof n?s(i,n,r):n,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const n=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!n)throw new Error(e+" is not defined");return r&&n?new n(...o):n}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:n,_options:i,_config:l,_catchers:a,_resolvers:u,_middlewares:h,_addons:f}=e,d=new Map(a),p=s(l.options,i);let y=n;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(h)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(n,p),g=new Error,m=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=g,r.stack=r.stack+"\nCAUSE: "+g.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{throw r.message="string"==typeof t?t:e.statusText,t&&(o&&"string"==typeof t?(r.text=t,r.json=JSON.parse(t)):r[l.errorType]=t),r}))}return e})),b=o=>n=>(o?m.then((e=>e&&e[o]())).then((e=>n?n(e):e)):m.then((e=>n?n(e):e))).catch((o=>{const n=Object.prototype.hasOwnProperty.call(o,t),s=n?o[t]:o,i=(null==s?void 0:s.status)&&d.get(s.status)||d.get(null==s?void 0:s.name)||n&&d.has(t)&&d.get(t);if(i)return i(s,e);const c=d.get(r);if(c)return c(s,e);throw s})),w={_wretchReq:e,_fetchReq:_,_sharedState:o,res:b(null),json:b("json"),blob:b("blob"),formData:b("formData"),arrayBuffer:b("arrayBuffer"),text:b("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},T=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),w);return u.reduce(((t,r)=>r(t,e)),T)},a={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:s(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:s(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:s(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let s=this.url(t).options({method:e});const i=o(s._options.headers),c=this._config.polyfill("FormData",0),a="object"==typeof r&&!(c&&r instanceof c)&&(!s._options.headers||!i||n(i));return s=r?a?s.json(r,i):s.body(r):s,l(s._deferred.reduce(((e,t)=>t(e,e._url,e._options)),s))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||n(r)&&r||"application/json").body(JSON.stringify(e))}},u=()=>({beforeRequest(e,t,r){const o=e._config.polyfill("AbortController",0,1);!t.signal&&o&&(t.signal=o.signal);const n={ref:null,clear(){n.ref&&(clearTimeout(n.ref),n.ref=null)}};return r.abort={timeout:n,fetchController:o},e},wretch:{signal(e){return{...this,_options:{...this._options,signal:e.signal}}}},resolver:{setTimeout(e,t=this._sharedState.abort.fetchController){const{timeout:r}=this._sharedState.abort;return r.clear(),r.ref=setTimeout((()=>t.abort()),e),this},controller(){return[this._sharedState.abort.fetchController,this]},onAbort(e){return this.error("AbortError",e)}}});function h(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}const f=e=>t=>(r,o)=>{const n=e.polyfill("URL");let s;try{s=new n(r)}catch(e){s=null}if((null==s?void 0:s.username)||(null==s?void 0:s.password)){const e=h(`${decodeURIComponent(s.username)}:${decodeURIComponent(s.password)}`);o.headers={...o.headers,Authorization:`Basic ${e}`},s.username="",s.password="",r=s.toString()}return t(r,o)},d={beforeRequest:e=>e.middlewares([f(e._config)]),wretch:{basicAuth(e,t){const r=h(`${e}:${t}`);return this.auth(`Basic ${r}`)}}};function p(e,t=0,r,o=r.polyfill("FormData",1,1),n=[]){return Object.entries(e).forEach((([e,s])=>{let i=n.reduce(((e,t)=>e?`${e}[${t}]`:t),null);if(i=i?`${i}[${e}]`:e,s instanceof Array||globalThis.FileList&&s instanceof FileList)for(const e of s)o.append(i,e);else!t||"object"!=typeof s||t instanceof Array&&t.includes(e)?o.append(i,s):null!==s&&p(s,t,r,o,[...n,e])})),o}const y={wretch:{formData(e,t=0){return this.body(p(e,t,this._config))}}};function _(e,t){return encodeURIComponent(e)+"="+encodeURIComponent("object"==typeof t?JSON.stringify(t):""+t)}const g={wretch:{formUrl(e){return this.body("string"==typeof e?e:(t=e,Object.keys(t).map((e=>{const r=t[e];return r instanceof Array?r.map((t=>_(e,t))).join("&"):_(e,r)})).join("&"))).content("application/x-www-form-urlencoded");var t}}},m=()=>{const e=new Map;let t=null;const r=(r,o,n,s)=>{if(!r.getEntriesByName)return 0;const i=r.getEntriesByName(o);return i&&i.length>0?(n(i.reverse()[0]),s.clearMeasures&&s.clearMeasures(o),e.delete(o),e.size<1&&(t.disconnect(),s.clearResourceTimings&&s.clearResourceTimings()),1):0};return{resolver:{perfs(o){return this._fetchReq.then((()=>((o,n,s)=>{if(!o||!n)return;const i=s.polyfill("performance",0);((o,n)=>(!t&&o&&n&&(t=new n((t=>{e.forEach(((e,n)=>{r(t,n,e,o)}))})),o.clearResourceTimings&&o.clearResourceTimings()),t))(i,s.polyfill("PerformanceObserver",0))&&(r(i,o,n,i)||(e.size<1&&t.observe({entryTypes:["resource","measure"]}),e.set(o,n)))})(this._wretchReq._url,o,this._wretchReq._config))).catch((()=>{})),this}}}};function b(e){return void 0!==e?e:""}const w=(e,t,r,o,n)=>{let s;if("string"==typeof t)s=t;else{const e=n.polyfill("URLSearchParams",1,1);for(const r in t){const n=t[r];if(!o||null!=n)if(t[r]instanceof Array)for(const t of n)e.append(r,b(t));else e.append(r,b(n))}s=e.toString()}const i=e.split("?");return s?r||i.length<2?i[0]+"?"+s:e+"&"+s:r?i[0]:e},T={wretch:{query(e,t=0,r=0){return{...this,_url:w(this._url,e,t,r,this._config)}}}},v=()=>{function e(e){return t=>(r,o)=>{let n=0,s=0;return t(r,o).then((t=>{try{const r=t.headers.get("content-length");s=r?+r:null;const o=new TransformStream({transform(t,r){n+=t.length,s<n&&(s=n),e.progress&&e.progress(n,s),r.enqueue(t)}});return new Response(t.body.pipeThrough(o),t)}catch(e){return t}}))}}return{beforeRequest:(t,r,o)=>t.middlewares([e(o)]),resolver:{progress(e){return this._sharedState.progress=e,this}}}};function j(e="",t={}){return{...a,_url:e,_options:t}.addon(u()).addon(d).addon(y).addon(g).addon(m()).addon(T).addon(v())}j.default=j,j.options=function(e,t=0){i.options=t?e:s(i.options,e)},j.errorType=function(e){i.errorType=e},j.polyfills=function(e,t=0){i.polyfills=t?e:s(i.polyfills,e)},j.WretchError=c,module.exports=j;
"use strict";const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function n(e){return/^application\/.*json.*/.test(e)}const s=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,n])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(n)?t[o]=r?[...i,...n]:n:t[o]="object"==typeof i&&"object"==typeof n?s(i,n,r):n,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const n=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!n)throw new Error(e+" is not defined");return r&&n?new n(...o):n}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:n,_options:i,_config:l,_catchers:a,_resolvers:u,_middlewares:h,_addons:f}=e,d=new Map(a),p=s(l.options,i);let y=n;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(h)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(n,p),g=new Error,m=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=g,r.stack=r.stack+"\nCAUSE: "+g.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{if(r.message="string"==typeof t?t:e.statusText,t)if(o&&"string"==typeof t){r.text=t;try{r.json=JSON.parse(t)}catch(e){}}else r[l.errorType]=t;throw r}))}return e})),b=o=>n=>(o?m.then((e=>e&&e[o]())).then((e=>n?n(e):e)):m.then((e=>n?n(e):e))).catch((o=>{const n=Object.prototype.hasOwnProperty.call(o,t),s=n?o[t]:o,i=(null==s?void 0:s.status)&&d.get(s.status)||d.get(null==s?void 0:s.name)||n&&d.has(t)&&d.get(t);if(i)return i(s,e);const c=d.get(r);if(c)return c(s,e);throw s})),w={_wretchReq:e,_fetchReq:_,_sharedState:o,res:b(null),json:b("json"),blob:b("blob"),formData:b("formData"),arrayBuffer:b("arrayBuffer"),text:b("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},T=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),w);return u.reduce(((t,r)=>r(t,e)),T)},a={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:s(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:s(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:s(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let s=this.url(t).options({method:e});const i=o(s._options.headers),c=this._config.polyfill("FormData",0),a="object"==typeof r&&!(c&&r instanceof c)&&(!s._options.headers||!i||n(i));return s=r?a?s.json(r,i):s.body(r):s,l(s._deferred.reduce(((e,t)=>t(e,e._url,e._options)),s))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||n(r)&&r||"application/json").body(JSON.stringify(e))}},u=()=>({beforeRequest(e,t,r){const o=e._config.polyfill("AbortController",0,1);!t.signal&&o&&(t.signal=o.signal);const n={ref:null,clear(){n.ref&&(clearTimeout(n.ref),n.ref=null)}};return r.abort={timeout:n,fetchController:o},e},wretch:{signal(e){return{...this,_options:{...this._options,signal:e.signal}}}},resolver:{setTimeout(e,t=this._sharedState.abort.fetchController){const{timeout:r}=this._sharedState.abort;return r.clear(),r.ref=setTimeout((()=>t.abort()),e),this},controller(){return[this._sharedState.abort.fetchController,this]},onAbort(e){return this.error("AbortError",e)}}});function h(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}const f=e=>t=>(r,o)=>{const n=e.polyfill("URL");let s;try{s=new n(r)}catch(e){s=null}if((null==s?void 0:s.username)||(null==s?void 0:s.password)){const e=h(`${decodeURIComponent(s.username)}:${decodeURIComponent(s.password)}`);o.headers={...o.headers,Authorization:`Basic ${e}`},s.username="",s.password="",r=s.toString()}return t(r,o)},d={beforeRequest:e=>e.middlewares([f(e._config)]),wretch:{basicAuth(e,t){const r=h(`${e}:${t}`);return this.auth(`Basic ${r}`)}}};function p(e,t=0,r,o=r.polyfill("FormData",1,1),n=[]){return Object.entries(e).forEach((([e,s])=>{let i=n.reduce(((e,t)=>e?`${e}[${t}]`:t),null);if(i=i?`${i}[${e}]`:e,s instanceof Array||globalThis.FileList&&s instanceof FileList)for(const e of s)o.append(i,e);else!t||"object"!=typeof s||t instanceof Array&&t.includes(e)?o.append(i,s):null!==s&&p(s,t,r,o,[...n,e])})),o}const y={wretch:{formData(e,t=0){return this.body(p(e,t,this._config))}}};function _(e,t){return encodeURIComponent(e)+"="+encodeURIComponent("object"==typeof t?JSON.stringify(t):""+t)}const g={wretch:{formUrl(e){return this.body("string"==typeof e?e:(t=e,Object.keys(t).map((e=>{const r=t[e];return r instanceof Array?r.map((t=>_(e,t))).join("&"):_(e,r)})).join("&"))).content("application/x-www-form-urlencoded");var t}}},m=()=>{const e=new Map;let t=null;const r=(r,o,n,s)=>{if(!r.getEntriesByName)return 0;const i=r.getEntriesByName(o);return i&&i.length>0?(n(i.reverse()[0]),s.clearMeasures&&s.clearMeasures(o),e.delete(o),e.size<1&&(t.disconnect(),s.clearResourceTimings&&s.clearResourceTimings()),1):0};return{resolver:{perfs(o){return this._fetchReq.then((()=>((o,n,s)=>{if(!o||!n)return;const i=s.polyfill("performance",0);((o,n)=>(!t&&o&&n&&(t=new n((t=>{e.forEach(((e,n)=>{r(t,n,e,o)}))})),o.clearResourceTimings&&o.clearResourceTimings()),t))(i,s.polyfill("PerformanceObserver",0))&&(r(i,o,n,i)||(e.size<1&&t.observe({entryTypes:["resource","measure"]}),e.set(o,n)))})(this._wretchReq._url,o,this._wretchReq._config))).catch((()=>{})),this}}}};function b(e){return void 0!==e?e:""}const w=(e,t,r,o,n)=>{let s;if("string"==typeof t)s=t;else{const e=n.polyfill("URLSearchParams",1,1);for(const r in t){const n=t[r];if(!o||null!=n)if(t[r]instanceof Array)for(const t of n)e.append(r,b(t));else e.append(r,b(n))}s=e.toString()}const i=e.split("?");return s?r||i.length<2?i[0]+"?"+s:e+"&"+s:r?i[0]:e},T={wretch:{query(e,t=0,r=0){return{...this,_url:w(this._url,e,t,r,this._config)}}}},v=()=>{function e(e){return t=>(r,o)=>{let n=0,s=0;return t(r,o).then((t=>{try{const r=t.headers.get("content-length");s=r?+r:null;const o=new TransformStream({transform(t,r){n+=t.length,s<n&&(s=n),e.progress&&e.progress(n,s),r.enqueue(t)}});return new Response(t.body.pipeThrough(o),t)}catch(e){return t}}))}}return{beforeRequest:(t,r,o)=>t.middlewares([e(o)]),resolver:{progress(e){return this._sharedState.progress=e,this}}}};function j(e="",t={}){return{...a,_url:e,_options:t}.addon(u()).addon(d).addon(y).addon(g).addon(m()).addon(T).addon(v())}j.default=j,j.options=function(e,t=0){i.options=t?e:s(i.options,e)},j.errorType=function(e){i.errorType=e},j.polyfills=function(e,t=0){i.polyfills=t?e:s(i.polyfills,e)},j.WretchError=c,module.exports=j;
//# sourceMappingURL=wretch.all.min.cjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"wretch.all.min.cjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/addons/abort.ts","../../src/addons/basicAuth.ts","../../src/addons/formData.ts","../../src/addons/formUrl.ts","../../src/addons/perfs.ts","../../src/addons/queryString.ts","../../src/addons/progress.ts","../../src/index.all.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import type { Wretch, WretchAddon, WretchErrorCallback, WretchResponseChain } from \"../types.js\"\n\nexport interface AbortWretch {\n /**\n * Associates a custom controller with the request.\n *\n * Useful when you need to use\n * your own AbortController, otherwise wretch will create a new controller itself.\n *\n * ```js\n * const controller = new AbortController()\n *\n * // Associates the same controller with multiple requests\n * wretch(\"url1\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n * wretch(\"url2\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n *\n * // Aborts both requests\n * controller.abort()\n * ```\n *\n * @param controller - An instance of AbortController\n */\n signal: <T extends AbortWretch, C, R>(this: T & Wretch<T, C, R>, controller: AbortController) => this\n}\n\nexport interface AbortResolver {\n /**\n * Aborts the request after a fixed time.\n *\n * If you use a custom AbortController associated with the request, pass it as the second argument.\n *\n * ```js\n * // 1 second timeout\n * wretch(\"...\").addon(AbortAddon()).get().setTimeout(1000).json(_ =>\n * // will not be called if the request timeouts\n * )\n * ```\n *\n * @param time - Time in milliseconds\n * @param controller - An instance of AbortController\n */\n setTimeout: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, time: number, controller?: AbortController) => this\n /**\n * Returns the provided or generated AbortController plus the wretch response chain as a pair.\n *\n * ```js\n * // We need the controller outside the chain\n * const [c, w] = wretch(\"url\")\n * .addon(AbortAddon())\n * .get()\n * .controller()\n *\n * // Resume with the chain\n * w.onAbort(_ => console.log(\"ouch\")).json()\n *\n * // Later on…\n * c.abort()\n * ```\n */\n controller: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>) => [any, this]\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, cb: WretchErrorCallback<T, C, R>) => this\n}\n\n/**\n * Adds the ability to abort requests using AbortController and signals under the hood.\n *\n *\n * _Only compatible with browsers that support\n * [AbortControllers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Otherwise, you could use a (partial)\n * [polyfill](https://www.npmjs.com/package/abortcontroller-polyfill)._\n *\n * ```js\n * import AbortAddon from \"wretch/addons/abort\"\n *\n * const [c, w] = wretch(\"...\")\n * .addon(AbortAddon())\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .controller();\n *\n * w.text((_) => console.log(\"should never be called\"));\n * c.abort();\n *\n * // Or :\n *\n * const controller = new AbortController();\n *\n * wretch(\"...\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .text((_) => console.log(\"should never be called\"));\n *\n * controller.abort();\n * ```\n */\nconst abort: () => WretchAddon<AbortWretch, AbortResolver> = () => {\n return {\n beforeRequest(wretch, options, state) {\n const fetchController = wretch._config.polyfill(\"AbortController\", false, true)\n if (!options[\"signal\"] && fetchController) {\n options[\"signal\"] = fetchController.signal\n }\n const timeout = {\n ref: null,\n clear() {\n if (timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n state.abort = {\n timeout,\n fetchController\n }\n return wretch\n },\n wretch: {\n signal(controller) {\n return { ...this, _options: { ...this._options, signal: controller.signal } }\n },\n },\n resolver: {\n setTimeout(time, controller = this._sharedState.abort.fetchController) {\n const { timeout } = this._sharedState.abort\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return this\n },\n controller() { return [this._sharedState.abort.fetchController, this] },\n onAbort(cb) { return this.error(\"AbortError\", cb) }\n },\n }\n}\n\nexport default abort\n","import type { Config, ConfiguredMiddleware, Wretch, WretchAddon } from \"../types.js\"\n\nfunction utf8ToBase64(input: string) {\n const utf8Bytes = new TextEncoder().encode(input)\n return btoa(String.fromCharCode(...utf8Bytes))\n}\n\nexport interface BasicAuthAddon {\n /**\n * Sets the `Authorization` header to `Basic ` + <base64 encoded credentials>.\n * Additionally, allows using URLs with credentials in them.\n *\n * ```js\n * const user = \"user\"\n * const pass = \"pass\"\n *\n * // Automatically sets the Authorization header to \"Basic \" + <base64 encoded credentials>\n * wretch(\"...\").addon(BasicAuthAddon).basicAuth(user, pass).get()\n *\n * // Allows using URLs with credentials in them\n * wretch(`https://${user}:${pass}@...`).addon(BasicAuthAddon).get()\n * ```\n *\n * @param username - Username to use for basic auth\n * @param password - Password to use for basic auth\n */\n basicAuth<T extends BasicAuthAddon, C, R>(\n this: T & Wretch<T, C, R>,\n username: string,\n password: string\n ): this\n}\n\nconst makeBasicAuthMiddleware: (config: Config) => ConfiguredMiddleware = config => next => (url, opts) => {\n const _URL = config.polyfill(\"URL\")\n let parsedUrl: URL | null\n try {\n parsedUrl = new _URL(url)\n } catch {\n parsedUrl = null\n }\n\n if (parsedUrl?.username || parsedUrl?.password) {\n const basicAuthBase64 = utf8ToBase64(\n `${decodeURIComponent(parsedUrl.username)}:${decodeURIComponent(parsedUrl.password)}`,\n )\n opts.headers = {\n ...opts.headers,\n Authorization: `Basic ${basicAuthBase64}`,\n }\n parsedUrl.username = \"\"\n parsedUrl.password = \"\"\n url = parsedUrl.toString()\n }\n\n return next(url, opts)\n}\n\n\n/**\n * Adds the ability to use basic auth with the `Authorization` header.\n *\n * ```js\n * import BasicAuthAddon from \"wretch/addons/basicAuth\"\n *\n * wretch().addon(BasicAuthAddon)\n * ```\n */\nconst basicAuth: WretchAddon<BasicAuthAddon> = {\n beforeRequest(wretch) {\n return wretch.middlewares([makeBasicAuthMiddleware(wretch._config)])\n },\n wretch: {\n basicAuth(username, password) {\n const basicAuthBase64 = utf8ToBase64(`${username}:${password}`)\n return this.auth(`Basic ${basicAuthBase64}`)\n },\n },\n}\n\nexport default basicAuth\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction convertFormData(\n formObject: object,\n recursive: string[] | boolean = false,\n config: Config,\n formData = config.polyfill(\"FormData\", true, true),\n ancestors = [] as string[],\n) {\n Object.entries(formObject).forEach(([key, value]) => {\n let formKey = ancestors.reduce((acc, ancestor) => (\n acc ? `${acc}[${ancestor}]` : ancestor\n ), null)\n formKey = formKey ? `${formKey}[${key}]` : key\n if (value instanceof Array || (globalThis.FileList && value instanceof FileList)) {\n for (const item of value as File[])\n formData.append(formKey, item)\n } else if (\n recursive &&\n typeof value === \"object\" &&\n (\n !(recursive instanceof Array) ||\n !recursive.includes(key)\n )\n ) {\n if (value !== null) {\n convertFormData(value, recursive, config, formData, [...ancestors, key])\n }\n } else {\n formData.append(formKey, value)\n }\n })\n\n return formData\n}\n\nexport interface FormDataAddon {\n /**\n * Converts the javascript object to a FormData and sets the request body.\n *\n * ```js\n * const form = {\n * hello: \"world\",\n * duck: \"Muscovy\",\n * };\n *\n * wretch(\"...\").addons(FormDataAddon).formData(form).post();\n * ```\n *\n * The `recursive` argument when set to `true` will enable recursion through all\n * nested objects and produce `object[key]` keys. It can be set to an array of\n * string to exclude specific keys.\n *\n * > Warning: Be careful to exclude `Blob` instances in the Browser, and\n * > `ReadableStream` and `Buffer` instances when using the node.js compatible\n * > `form-data` package.\n *\n * ```js\n * const form = {\n * duck: \"Muscovy\",\n * duckProperties: {\n * beak: {\n * color: \"yellow\",\n * },\n * legs: 2,\n * },\n * ignored: {\n * key: 0,\n * },\n * };\n *\n * // Will append the following keys to the FormData payload:\n * // \"duck\", \"duckProperties[beak][color]\", \"duckProperties[legs]\"\n * wretch(\"...\").addons(FormDataAddon).formData(form, [\"ignored\"]).post();\n * ```\n *\n * > Note: This addon does not support specifying a custom `filename`.\n * > If you need to do so, you can use the `body` method directly:\n * > ```js\n * > const form = new FormData();\n * > form.append(\"hello\", \"world\", \"hello.txt\");\n * > wretch(\"...\").body(form).post();\n * > ```\n * > See: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#example\n *\n * @param formObject - An object which will be converted to a FormData\n * @param recursive - If `true`, will recurse through all nested objects. Can be set as an array of string to exclude specific keys.\n */\n formData<T extends FormDataAddon, C, R>(this: T & Wretch<T, C, R>, formObject: object, recursive?: string[] | boolean): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormData and use it as a request body.\n *\n * ```js\n * import FormDataAddon from \"wretch/addons/formData\"\n *\n * wretch().addon(FormDataAddon)\n * ```\n */\nconst formData: WretchAddon<FormDataAddon> = {\n wretch: {\n formData(formObject, recursive = false) {\n return this.body(convertFormData(formObject, recursive, this._config))\n }\n }\n}\n\nexport default formData\n","import type { Wretch, WretchAddon } from \"../types.js\"\n\nfunction encodeQueryValue(key: string, value: unknown) {\n return encodeURIComponent(key) +\n \"=\" +\n encodeURIComponent(\n typeof value === \"object\" ?\n JSON.stringify(value) :\n \"\" + value\n )\n}\nfunction convertFormUrl(formObject: object) {\n return Object.keys(formObject)\n .map(key => {\n const value = formObject[key]\n if (value instanceof Array) {\n return value.map(v => encodeQueryValue(key, v)).join(\"&\")\n }\n return encodeQueryValue(key, value)\n })\n .join(\"&\")\n}\n\nexport interface FormUrlAddon {\n /**\n * Converts the input parameter to an url encoded string and sets the content-type\n * header and body. If the input argument is already a string, skips the conversion\n * part.\n *\n * ```js\n * const form = { a: 1, b: { c: 2 } };\n * const alreadyEncodedForm = \"a=1&b=%7B%22c%22%3A2%7D\";\n *\n * // Automatically sets the content-type header to \"application/x-www-form-urlencoded\"\n * wretch(\"...\").addon(FormUrlAddon).formUrl(form).post();\n * wretch(\"...\").addon(FormUrlAddon).formUrl(alreadyEncodedForm).post();\n * ```\n *\n * @param input - An object to convert into an url encoded string or an already encoded string\n */\n formUrl<T extends FormUrlAddon, C, R>(this: T & Wretch<T, C, R>, input: (object | string)): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormUrl and use it as a request body.\n *\n * ```js\n * import FormUrlAddon from \"wretch/addons/formUrl\"\n *\n * wretch().addon(FormUrlAddon)\n * ```\n */\nconst formUrl: WretchAddon<FormUrlAddon> = {\n wretch: {\n formUrl(input) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n }\n}\n\nexport default formUrl\n","import type { WretchResponseChain, WretchAddon, Config } from \"../types.js\"\n\nexport type PerfCallback = (timing: any) => void\n\nexport interface PerfsAddon {\n /**\n * Performs a callback on the API performance timings of the request.\n *\n * Warning: Still experimental on browsers and node.js\n */\n perfs: <T, C extends PerfsAddon, R>(this: C & WretchResponseChain<T, C, R>, cb?: PerfCallback) => this,\n}\n\n/**\n * Adds the ability to measure requests using the Performance Timings API.\n *\n * Uses the Performance API\n * ([browsers](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) &\n * [node.js](https://nodejs.org/api/perf_hooks.html)) to expose timings related to\n * the underlying request.\n *\n * Browser timings are very accurate, node.js only contains raw measures.\n *\n * ```js\n * import PerfsAddon from \"wretch/addons/perfs\"\n *\n * // Use perfs() before the response types (text, json, ...)\n * wretch(\"...\")\n * .addon(PerfsAddon())\n * .get()\n * .perfs((timings) => {\n * // Will be called when the timings are ready.\n * console.log(timings.startTime);\n * })\n * .res();\n *\n * ```\n *\n * For node.js, there is a little extra work to do :\n *\n * ```js\n * // Node.js only\n * const { performance, PerformanceObserver } = require(\"perf_hooks\");\n *\n * wretch.polyfills({\n * fetch: function (url, opts) {\n * performance.mark(url + \" - begin\");\n * return fetch(url, opts).then(res => {\n * performance.mark(url + \" - end\");\n * setTimeout(() => performance.measure(res.url, url + \" - begin\", url + \" - end\"), 0);\n * return res;\n * });\n * },\n * // other polyfills…\n * performance: performance,\n * PerformanceObserver: PerformanceObserver,\n * });\n * ```\n */\nconst perfs: () => WretchAddon<unknown, PerfsAddon> = () => {\n const callbacks = new Map<string, PerfCallback>()\n let observer /*: PerformanceObserver | null*/ = null\n\n const onMatch = (\n entries /*: PerformanceObserverEntryList */,\n name: string,\n callback: PerfCallback,\n performance: typeof globalThis.performance\n ) => {\n if (!entries.getEntriesByName)\n return false\n const matches = entries.getEntriesByName(name)\n if (matches && matches.length > 0) {\n callback(matches.reverse()[0])\n if (performance.clearMeasures)\n performance.clearMeasures(name)\n callbacks.delete(name)\n\n if (callbacks.size < 1) {\n observer.disconnect()\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n }\n\n const initObserver = (\n performance: (typeof globalThis.performance) | null | undefined,\n performanceObserver /*: (typeof PerformanceObserver) | null | undefined */\n ) => {\n if (!observer && performance && performanceObserver) {\n observer = new performanceObserver(entries => {\n callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, performance)\n })\n })\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n\n return observer\n }\n\n const monitor = (\n name: string | null | undefined,\n callback: PerfCallback | null | undefined,\n config: Config\n ) => {\n if (!name || !callback)\n return\n\n const performance = config.polyfill(\"performance\", false)\n const performanceObserver = config.polyfill(\"PerformanceObserver\", false)\n\n if (!initObserver(performance, performanceObserver))\n return\n\n if (!onMatch(performance, name, callback, performance)) {\n if (callbacks.size < 1)\n observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n callbacks.set(name, callback)\n }\n }\n\n return {\n resolver: {\n perfs(cb) {\n this._fetchReq\n .then(() =>\n monitor(this._wretchReq._url, cb, this._wretchReq._config)\n )\n .catch(() => {/* swallow */ })\n return this\n },\n }\n }\n}\n\nexport default perfs\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction stringify(value?: string | null): string | null {\n return typeof value !== \"undefined\" ? value : \"\"\n}\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean, omitUndefinedOrNullValues: boolean, config: Config) => {\n let queryString: string\n\n if (typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = config.polyfill(\"URLSearchParams\", true, true)\n for (const key in qp) {\n const value = qp[key]\n if (omitUndefinedOrNullValues && (value === null || value === undefined)) continue\n if (qp[key] instanceof Array) {\n for (const val of value)\n usp.append(key, stringify(val))\n } else {\n usp.append(key, stringify(value))\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n\n if (!queryString)\n return replace ? split[0] : url\n\n if (replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nexport interface QueryStringAddon {\n /**\n * Converts a javascript object to query parameters, then appends this query string\n * to the current url. String values are used as the query string verbatim.\n *\n * Pass `true` as the second argument to replace existing query parameters.\n * Pass `true` as the third argument to completely omit the key=value pair for undefined or null values.\n *\n * ```\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * let w = wretch(\"http://example.com\").addon(QueryStringAddon);\n * // url is http://example.com\n * w = w.query({ a: 1, b: 2 });\n * // url is now http://example.com?a=1&b=2\n * w = w.query({ c: 3, d: [4, 5] });\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5\n * w = w.query(\"five&six&seven=eight\");\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5&five&six&seven=eight\n * w = w.query({ reset: true }, true);\n * // url is now http://example.com?reset=true\n * ```\n *\n * ##### **Note that .query is not meant to handle complex cases with nested objects.**\n *\n * For this kind of usage, you can use `wretch` in conjunction with other libraries\n * (like [`qs`](https://github.com/ljharb/qs)).\n *\n * ```js\n * // Using wretch with qs\n *\n * const queryObject = { some: { nested: \"objects\" } };\n * const w = wretch(\"https://example.com/\").addon(QueryStringAddon)\n *\n * // Use .qs inside .query :\n *\n * w.query(qs.stringify(queryObject));\n *\n * // Use .defer :\n *\n * const qsWretch = w.defer((w, url, { qsQuery, qsOptions }) => (\n * qsQuery ? w.query(qs.stringify(qsQuery, qsOptions)) : w\n * ));\n *\n * qsWretch\n * .url(\"https://example.com/\")\n * .options({ qs: { query: queryObject } });\n * ```\n *\n * @param qp - An object which will be converted, or a string which will be used verbatim.\n */\n query<T extends QueryStringAddon, C, R>(this: T & Wretch<T, C, R>, qp: object | string, replace?: boolean, omitUndefinedOrNullValues?: boolean): this\n}\n\n/**\n * Adds the ability to append query parameters from a javascript object.\n *\n * ```js\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * wretch().addon(QueryAddon)\n * ```\n */\nconst queryString: WretchAddon<QueryStringAddon> = {\n wretch: {\n query(qp, replace = false, omitUndefinedOrNullValues = false) {\n return { ...this, _url: appendQueryParams(this._url, qp, replace, omitUndefinedOrNullValues, this._config) }\n }\n }\n}\n\nexport default queryString\n","import type { ConfiguredMiddleware, WretchAddon, WretchResponseChain } from \"../types.js\"\n\nexport interface ProgressResolver {\n /**\n * Provides a way to register a callback to be invoked one or multiple times during the download.\n * The callback receives the current progress as two arguments, the number of bytes loaded and the total number of bytes to load.\n *\n * _Under the hood: this method adds a middleware to the chain that will intercept the response and replace the body with a new one that will emit the progress event._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n *\n * @param onProgress - A callback that will be called one or multiple times with the number of bytes loaded and the total number of bytes to load.\n */\n progress: <T, C extends ProgressResolver, R>(\n this: C & WretchResponseChain<T, C, R>,\n onProgress: (loaded: number, total: number) => void\n ) => this\n}\n\n/**\n * Adds the ability to monitor progress when downloading a response.\n *\n * _Compatible with all platforms implementing the [TransformStream WebAPI](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility)._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n */\nconst progress: () => WretchAddon<unknown, ProgressResolver> = () => {\n function transformMiddleware(state: Record<any, any>) : ConfiguredMiddleware {\n return next => (url, opts) => {\n let loaded = 0\n let total = 0\n return next(url, opts).then(response => {\n try {\n const contentLength = response.headers.get(\"content-length\")\n total = contentLength ? +contentLength : null\n const transform = new TransformStream({\n transform(chunk, controller) {\n loaded += chunk.length\n if (total < loaded) {\n total = loaded\n }\n if (state.progress) {\n state.progress(loaded, total)\n }\n controller.enqueue(chunk)\n }\n })\n return new Response(response.body.pipeThrough(transform), response)\n } catch (e) {\n return response\n }\n })\n }\n }\n\n return {\n beforeRequest(wretch, _, state) {\n return wretch.middlewares([transformMiddleware(state)])\n },\n resolver: {\n progress(onProgress: (loaded: number, total: number) => void) {\n this._sharedState.progress = onProgress\n return this\n }\n },\n }\n}\n\nexport default progress\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport * as Addons from \"./addons/index.js\"\nimport { WretchError } from \"./resolver.js\"\n\nfunction factory(_url = \"\", _options = {}) {\n return { ...core, _url, _options }\n .addon(Addons.abortAddon())\n .addon(Addons.basicAuthAddon)\n .addon(Addons.formDataAddon)\n .addon(Addons.formUrlAddon)\n .addon(Addons.perfsAddon())\n .addon(Addons.queryStringAddon)\n .addon(Addons.progressAddon())\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","abort","state","fetchController","signal","ref","clearTimeout","controller","setTimeout","time","onAbort","utf8ToBase64","input","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","makeBasicAuthMiddleware","next","_URL","parsedUrl","username","password","basicAuthBase64","decodeURIComponent","toString","basicAuth","convertFormData","formObject","recursive","ancestors","forEach","formKey","ancestor","globalThis","FileList","item","append","includes","encodeQueryValue","encodeURIComponent","formUrl","keys","map","v","join","perfs","callbacks","observer","onMatch","performance","getEntriesByName","matches","reverse","clearMeasures","size","disconnect","clearResourceTimings","performanceObserver","initObserver","observe","entryTypes","monitor","appendQueryParams","qp","omitUndefinedOrNullValues","queryString","usp","val","query","progress","transformMiddleware","loaded","total","contentLength","transform","TransformStream","chunk","enqueue","Response","pipeThrough","e","onProgress","factory","Addons.abortAddon","Addons.basicAuthAddon","Addons.formDataAddon","Addons.formUrlAddon","Addons.perfsAddon","Addons.queryStringAddon","Addons.progressAddon"],"mappings":"aAAO,MACMA,EAAsB,eACtBC,EAAcC,SACdC,EAAmBD,SCDhB,SAAAE,EAAmBC,EAAuB,UACxD,MAAMC,EAAoBD,aAAmBE,MAAQC,OAAOC,YAAYJ,GAAWA,EACnF,OAEI,QAFGK,EAAAF,OAAOG,QAAQL,GAAmBM,MAAK,EAAEC,KAC9CA,EAAEC,gBAAkBd,EAAoBc,uBACtC,IAAAJ,OAAA,EAAAA,EAAA,EACN,CAEM,SAAUK,EAAiBC,GAC/B,MAAO,yBAAyBC,KAAKD,EACvC,CAEO,MAAME,EAAM,SAAUC,EAAaC,EAAaC,EAAuB,GAC5E,OAAOb,OAAOG,QAAQS,GAAKE,QAAO,CAACC,GAAMC,EAAKC,MAC5C,MAAMT,EAAQG,EAAIK,GASlB,OARIjB,MAAMmB,QAAQV,IAAUT,MAAMmB,QAAQD,GACxCF,EAAIC,GAAOH,EAAc,IAAIL,KAAUS,GAAYA,EAEnDF,EAAIC,GADsB,iBAAVR,GAA0C,iBAAbS,EAClCP,EAAIF,EAAOS,EAAUJ,GAErBI,EAGNF,CAAG,GACT,IAAKJ,GACV,ECrBMQ,EAAiB,CAErBC,QAAS,CAAE,EAEXC,UAAW,OAEXC,UAAW,CAQV,EACDC,SAASC,EAAWC,EAAmB,EAAMC,EAAoB,KAAUC,GACzE,MAAMC,EAAMC,KAAKP,UAAUE,KACR,oBAATM,KAAuBA,KAAKN,GAAK,QACtB,oBAAXO,OAAyBA,OAAOP,GAAK,MAC/C,GAAIC,IAAYG,EAAK,MAAM,IAAII,MAAMR,EAAI,mBACzC,OAAOE,GAAYE,EAAM,IAAIA,KAAOD,GAAQC,CAC7C,GCjBG,MAAOK,UAAoBD,OAQ1B,MAAME,EAAyBC,IACpC,MAAMC,EAAcpC,OAAOqC,OAAO,MAElCF,EAASA,EAAOG,QAAQxB,QAAO,CAACyB,EAAGC,IACjCA,EAAMC,eACND,EAAMC,cAAcF,EAAGJ,EAAOO,SAAUN,IACrCG,GACLJ,GAEA,MACEQ,KAAMC,EACNF,SAAUG,EACVC,QAAS3B,EACT4B,UAAWA,EACXC,WAAYC,EACZC,aAAcC,EACdb,QAASc,GACPjB,EAEEkB,EAAW,IAAIC,IAAIP,GACnBQ,EAAe7C,EAAIS,EAAOC,QAASyB,GAGzC,IAAIW,EAAWZ,EACf,MAAMa,ECpCwB,CAACN,GAAyCO,GACjEP,EAAYQ,aAAY,CAAC5C,EAAK6C,IAASA,EAAK7C,IAAM2C,IAAkBA,EDmCzDG,CAAiBV,EAAjBU,EAA8B,CAACjB,EAAKxB,KACpDoC,EAAWZ,EACJzB,EAAOI,SAAS,QAAhBJ,CAAyByB,EAAKxB,KAFrByC,CAGfjB,EAAKW,GAEFO,EAAiB,IAAI9B,MACrB+B,EAAkDN,EACrDO,OAAMC,IACL,KAAM,CAAExE,CAACA,GAAcwE,EAAO,IAE/BC,MAAKC,UACJ,IAAKA,EAASC,GAAI,CAChB,MAAMC,EAAM,IAAIpC,EAQhB,GANAoC,EAAW,MAAIP,EACfO,EAAIC,MAAQD,EAAIC,MAAQ,YAAcR,EAAeQ,MACrDD,EAAIF,SAAWA,EACfE,EAAIE,OAASJ,EAASI,OACtBF,EAAIzB,IAAMY,EAEY,WAAlBW,EAASK,KACX,MAAMH,EAGR,MAAMI,EAAqC,SAArBtD,EAAOE,WAAgF,sBAApB,QAApCnB,EAAAiE,EAAStE,QAAQ6E,IAAI,uBAAe,IAAAxE,OAAA,EAAAA,EAAEyE,MAAM,KAAK,IAMtG,OAJGxD,EAAOE,UACNoD,EAAgBN,EAASS,OACvBT,EAAShD,EAAOE,aAFAwD,QAAQC,QAAQX,EAASY,OAI5Bb,MAAMa,IAUvB,MATAV,EAAIW,QAA0B,iBAATD,EAAoBA,EAAOZ,EAASc,WACtDF,IACEN,GAAiC,iBAATM,GACzBV,EAAIO,KAAOG,EACXV,EAAIa,KAAOC,KAAKC,MAAML,IAEtBV,EAAIlD,EAAOE,WAAa0D,GAGtBV,CAAG,GAEZ,CACD,OAAOF,CAAQ,IA0BbkB,EAAyBC,GAAWC,IAAMD,EAE9BvB,EAAgBG,MAAKsB,GAAKA,GAAKA,EAAEF,OAAYpB,MAAKsB,GAAKD,EAAKA,EAAGC,GAAKA,IAEpEzB,EAAgBG,MAAKsB,GAAKD,EAAKA,EAAGC,GAAYA,KA1B/CxB,OAAMK,IACnB,MAAMoB,EAAiBzF,OAAO0F,UAAUC,eAAeC,KAAKvB,EAAK5E,GAC3DwE,EAAQwB,EAAiBpB,EAAI5E,GAAe4E,EAE5CwB,GACH5B,eAAAA,EAAOM,SAAUlB,EAASqB,IAAIT,EAAMM,SACrClB,EAASqB,IAAIT,aAAA,EAAAA,EAAO6B,OAClBL,GAAkBpC,EAAS0C,IAAItG,IAAgB4D,EAASqB,IAAIjF,GAGhE,GAAIoG,EACF,OAAOA,EAAQ5B,EAAO9B,GAExB,MAAM6D,EAAkB3C,EAASqB,IAAI/E,GACrC,GAAIqG,EACF,OAAOA,EAAgB/B,EAAO9B,GAEhC,MAAM8B,CAAK,IAWTgC,EAAkD,CACtDC,WAAY/D,EACZsB,YACA0C,aAAc/D,EACdR,IAAKyD,EAA2B,MAChCH,KAAMG,EAAgB,QACtBe,KAAMf,EAAiB,QACvBgB,SAAUhB,EAAqB,YAC/BiB,YAAajB,EAAwB,eACrCT,KAAMS,EAAmB,QACzBpB,MAAMsC,EAAShB,GAEb,OADAlC,EAASmD,IAAID,EAAShB,GACf1D,IACR,EACD4E,WAAWlB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC7CmB,aAAanB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC/CoB,UAAUpB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC5CqB,SAASrB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC3CsB,QAAQtB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC1CuB,cAAcvB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAChDwB,WAAWxB,GAAM,OAAO1D,KAAKoC,MAAMxE,EAAa8F,EAAK,GAGjDyB,EAAoG5D,EAAOtC,QAAO,CAACmG,EAAOzE,KAAW,IACtIyE,KAC2B,mBAAnBzE,EAAMN,SAA2BM,EAAMN,SAA0D+E,GAASzE,EAAMN,YACzH+D,GAEJ,OAAOhD,EAAUnC,QAAO,CAACmG,EAAOC,IAAMA,EAAED,EAAO9E,IAAS6E,EAAsB,EE1InEG,EAAe,CAC1BxE,KAAM,GACND,SAAU,CAAE,EACZI,QAAS3B,EACT4B,UAAW,IAAIO,IACfN,WAAY,GACZoE,UAAW,GACXlE,aAAc,GACdZ,QAAS,GACTE,MAAMA,GACJ,MAAO,IAAKX,KAAMS,QAAS,IAAIT,KAAKS,QAASE,MAAWA,EAAML,OAC/D,EACDd,UAAUA,GACR,MAAO,IACFQ,KACHiB,QAAS,IACJjB,KAAKiB,QACRzB,aAGL,EACDC,UAAUA,EAAW+F,EAAU,GAC7B,MAAO,IACFxF,KACHiB,QAAS,IACJjB,KAAKiB,QACRxB,UAAW+F,EAAU/F,EAAYZ,EAAImB,KAAKiB,QAAQxB,UAAWA,IAGlE,EACDsB,IAAID,EAAM0E,EAAU,GAClB,GAAIA,EACF,MAAO,IAAKxF,KAAMc,QACpB,MAAMgC,EAAQ9C,KAAKc,KAAKgC,MAAM,KAC9B,MAAO,IACF9C,KACHc,KAAMgC,EAAM2C,OAAS,EACnB3C,EAAM,GAAKhC,EAAO,IAAMgC,EAAM,GAC9B9C,KAAKc,KAAOA,EAEjB,EACDvB,QAAQA,EAASiG,EAAU,GACzB,MAAO,IAAKxF,KAAMa,SAAU2E,EAAUjG,EAAUV,EAAImB,KAAKa,SAAUtB,GACpE,EACDvB,QAAQ0H,GACN,MAAM1H,EACH0H,EACCxH,MAAMmB,QAAQqG,GAAgBvH,OAAOC,YAAYsH,GAC/C,YAAaA,EAAevH,OAAOC,YAAasH,EAAyBpH,WACvEoH,EAHU,CAAE,EAIpB,MAAO,IAAK1F,KAAMa,SAAUhC,EAAImB,KAAKa,SAAU,CAAE7C,YAClD,EACD2H,OAAOC,GACL,OAAO5F,KAAKhC,QAAQ,CAAE6H,OAAQD,GAC/B,EACDE,QAAQF,GACN,OAAO5F,KAAKhC,QAAQ,CAAEL,CAACA,GAAsBiI,GAC9C,EACDG,KAAKH,GACH,OAAO5F,KAAKhC,QAAQ,CAAEgI,cAAeJ,GACtC,EACD5B,QAAQU,EAASV,GACf,MAAMiC,EAAS,IAAIxE,IAAIzB,KAAKkB,WAE5B,OADA+E,EAAOtB,IAAID,EAASV,GACb,IAAKhE,KAAMkB,UAAW+E,EAC9B,EACD9B,gBAAgBH,GACd,OAAOhE,KAAKgE,QAAQlG,EAAkBkG,EACvC,EAEDf,QAAqB5C,EAAU6F,EAAiB,GAC9C,MAAO,IAAKlG,KAAMmB,WAAY+E,EAAQ,CAAC7F,GAAY,IAAIL,KAAKmB,WAAYd,GACzE,EACD8F,MAAMC,EAAUF,EAAiB,GAC/B,MAAO,IACFlG,KACHuF,UAAWW,EAAQ,CAACE,GAAY,IAAIpG,KAAKuF,UAAWa,GAEvD,EACD9E,YAAYA,EAAa4E,EAAQ,GAC/B,MAAO,IACFlG,KACHqB,aAAc6E,EAAQ5E,EAAc,IAAItB,KAAKqB,gBAAiBC,GAEjE,EACD+E,MAAMC,EAAiBtG,KAAKa,SAASyF,OAAQvF,EAAM,GAAImC,EAAO,MAC5D,IAAIqD,EAAOvG,KAAKe,IAAIA,GAAKxB,QAAQ,CAAE+G,WAEnC,MAAME,EAAczI,EAAmBwI,EAAK1F,SAAS7C,SAC/CyI,EAAgBzG,KAAKiB,QAAQvB,SAAS,WAAY,GAClDgH,EACY,iBAATxD,KACLuD,GAAiBvD,aAAgBuD,MACjCF,EAAK1F,SAAS7C,UAAYwI,GAAe9H,EAAiB8H,IAK9D,OAJAD,EACGrD,EACCwD,EAAUH,EAAKlD,KAAKH,EAAMsD,GACxBD,EAAKrD,KAAKA,GAFNqD,EAGHlG,EACLkG,EACGhB,UACAtG,QAAO,CAACC,EAAa6C,IAASA,EAAK7C,EAAKA,EAAI4B,KAAM5B,EAAI2B,WAAW0F,GAEvE,EACD1D,IAAI9B,EAAM,IACR,OAAOf,KAAKqG,MAAM,MAAOtF,EAC1B,EACD4F,OAAO5F,EAAM,IACX,OAAOf,KAAKqG,MAAM,SAAUtF,EAC7B,EACD6F,IAAI1D,EAAMnC,EAAM,IACd,OAAOf,KAAKqG,MAAM,MAAOtF,EAAKmC,EAC/B,EACD2D,KAAK3D,EAAMnC,EAAM,IACf,OAAOf,KAAKqG,MAAM,OAAQtF,EAAKmC,EAChC,EACD4D,MAAM5D,EAAMnC,EAAM,IAChB,OAAOf,KAAKqG,MAAM,QAAStF,EAAKmC,EACjC,EACD6D,KAAKhG,EAAM,IACT,OAAOf,KAAKqG,MAAM,OAAQtF,EAC3B,EACDC,KAAKD,EAAM,IACT,OAAOf,KAAKqG,MAAM,UAAWtF,EAC9B,EACDmC,KAAK8D,GACH,MAAO,IAAKhH,KAAMa,SAAU,IAAKb,KAAKa,SAAUqC,KAAM8D,GACvD,EACD3D,KAAK4D,EAAUT,GACb,MAAMU,EAAqBnJ,EAAmBiC,KAAKa,SAAS7C,SAC5D,OAAOgC,KAAK8F,QACVU,GACA9H,EAAiBwI,IAAuBA,GL1IrB,oBK4InBhE,KAAKI,KAAK6D,UAAUF,GACvB,GChCGG,EAAuD,KACpD,CACLxG,cAAcN,EAAQf,EAAS8H,GAC7B,MAAMC,EAAkBhH,EAAOW,QAAQvB,SAAS,kBAAmB,EAAO,IACrEH,EAAgB,QAAK+H,IACxB/H,EAAgB,OAAI+H,EAAgBC,QAEtC,MAAMvC,EAAU,CACdwC,IAAK,KACLtB,QACMlB,EAAQwC,MACVC,aAAazC,EAAQwC,KACrBxC,EAAQwC,IAAM,KAEjB,GAMH,OAJAH,EAAMD,MAAQ,CACZpC,UACAsC,mBAEKhH,CACR,EACDA,OAAQ,CACNiH,OAAOG,GACL,MAAO,IAAK1H,KAAMa,SAAU,IAAKb,KAAKa,SAAU0G,OAAQG,EAAWH,QACpE,GAEHlH,SAAU,CACRsH,WAAWC,EAAMF,EAAa1H,KAAKsE,aAAa8C,MAAME,iBACpD,MAAMtC,QAAEA,GAAYhF,KAAKsE,aAAa8C,MAGtC,OAFApC,EAAQkB,QACRlB,EAAQwC,IAAMG,YAAW,IAAMD,EAAWN,SAASQ,GAC5C5H,IACR,EACD0H,aAAe,MAAO,CAAC1H,KAAKsE,aAAa8C,MAAME,gBAAiBtH,KAAO,EACvE6H,QAAQnE,GAAM,OAAO1D,KAAKoC,MAAM,aAAcsB,EAAK,KC9IzD,SAASoE,EAAaC,GACpB,MAAMC,GAAY,IAAIC,aAAcC,OAAOH,GAC3C,OAAOI,KAAKC,OAAOC,gBAAgBL,GACrC,CA4BA,MAAMM,EAAoEhJ,GAAUiJ,GAAQ,CAACxH,EAAKC,KAChG,MAAMwH,EAAOlJ,EAAOI,SAAS,OAC7B,IAAI+I,EACJ,IACEA,EAAY,IAAID,EAAKzH,EACtB,CAAC,MAAA1C,GACAoK,EAAY,IACb,CAED,IAAIA,aAAA,EAAAA,EAAWC,YAAYD,aAAA,EAAAA,EAAWE,UAAU,CAC9C,MAAMC,EAAkBd,EACtB,GAAGe,mBAAmBJ,EAAUC,aAAaG,mBAAmBJ,EAAUE,aAE5E3H,EAAKhD,QAAU,IACVgD,EAAKhD,QACRgI,cAAe,SAAS4C,KAE1BH,EAAUC,SAAW,GACrBD,EAAUE,SAAW,GACrB5H,EAAM0H,EAAUK,UACjB,CAED,OAAOP,EAAKxH,EAAKC,EAAK,EAalB+H,EAAyC,CAC7CnI,cAAcN,GACLA,EAAOgB,YAAY,CAACgH,EAAwBhI,EAAOW,WAE5DX,OAAQ,CACNyI,UAAUL,EAAUC,GAClB,MAAMC,EAAkBd,EAAa,GAAGY,KAAYC,KACpD,OAAO3I,KAAK+F,KAAK,SAAS6C,IAC3B,IC1EL,SAASI,EACPC,EACAC,EAAgC,EAChC5J,EACAkF,EAAWlF,EAAOI,SAAS,WAAY,EAAM,GAC7CyJ,EAAY,IA0BZ,OAxBAhL,OAAOG,QAAQ2K,GAAYG,SAAQ,EAAEjK,EAAKR,MACxC,IAAI0K,EAAUF,EAAUlK,QAAO,CAACC,EAAKoK,IACnCpK,EAAM,GAAGA,KAAOoK,KAAcA,GAC7B,MAEH,GADAD,EAAUA,EAAU,GAAGA,KAAWlK,KAASA,EACvCR,aAAiBT,OAAUqL,WAAWC,UAAY7K,aAAiB6K,SACrE,IAAK,MAAMC,KAAQ9K,EACjB6F,EAASkF,OAAOL,EAASI,QAE3BP,GACiB,iBAAVvK,GAEHuK,aAAqBhL,OACtBgL,EAAUS,SAASxK,GAOtBqF,EAASkF,OAAOL,EAAS1K,GAJX,OAAVA,GACFqK,EAAgBrK,EAAOuK,EAAW5J,EAAQkF,EAAU,IAAI2E,EAAWhK,GAItE,IAGIqF,CACT,CAkEA,MAAMA,EAAuC,CAC3ClE,OAAQ,CACNkE,SAASyE,EAAYC,EAAY,GAC/B,OAAOlJ,KAAKkD,KAAK8F,EAAgBC,EAAYC,EAAWlJ,KAAKiB,SAC9D,ICtGL,SAAS2I,EAAiBzK,EAAaR,GACrC,OAAOkL,mBAAmB1K,GACxB,IACA0K,mBACmB,iBAAVlL,EACL2E,KAAK6D,UAAUxI,GACf,GAAKA,EAEb,CA0CA,MAAMmL,EAAqC,CACzCxJ,OAAQ,CACNwJ,QAAQ/B,GACN,OAAO/H,KACJkD,KAAsB,iBAAV6E,EAAqBA,GA7ClBkB,EA6CyClB,EA5CxD5J,OAAO4L,KAAKd,GAChBe,KAAI7K,IACH,MAAMR,EAAQsK,EAAW9J,GACzB,OAAIR,aAAiBT,MACZS,EAAMqL,KAAIC,GAAKL,EAAiBzK,EAAK8K,KAAIC,KAAK,KAEhDN,EAAiBzK,EAAKR,EAAM,IAEpCuL,KAAK,OAqCDpE,QAAQ,qCA9CjB,IAAwBmD,CA+CnB,ICCCkB,EAAgD,KACpD,MAAMC,EAAY,IAAI3I,IACtB,IAAI4I,EAA4C,KAEhD,MAAMC,EAAU,CACdhM,EACA2F,EACAmC,EACAmE,KAEA,IAAKjM,EAAQkM,iBACX,OAAO,EACT,MAAMC,EAAUnM,EAAQkM,iBAAiBvG,GACzC,OAAIwG,GAAWA,EAAQhF,OAAS,GAC9BW,EAASqE,EAAQC,UAAU,IACvBH,EAAYI,eACdJ,EAAYI,cAAc1G,GAC5BmG,EAAUzD,OAAO1C,GAEbmG,EAAUQ,KAAO,IACnBP,EAASQ,aACLN,EAAYO,sBACdP,EAAYO,wBAGT,GAEF,CAAK,EA0Cd,MAAO,CACLzK,SAAU,CACR8J,MAAMzG,GAMJ,OALA1D,KAAK4B,UACFS,MAAK,IAzBE,EACd4B,EACAmC,EACA9G,KAEA,IAAK2E,IAASmC,EACZ,OAEF,MAAMmE,EAAcjL,EAAOI,SAAS,cAAe,GA1BhC,EACnB6K,EACAQ,MAEKV,GAAYE,GAAeQ,IAC9BV,EAAW,IAAIU,GAAoBzM,IACjC8L,EAAUhB,SAAQ,CAAChD,EAAUnC,KAC3BqG,EAAQhM,EAAS2F,EAAMmC,EAAUmE,EAAY,GAC7C,IAEAA,EAAYO,sBACdP,EAAYO,wBAITT,GAcFW,CAAaT,EAFUjL,EAAOI,SAAS,sBAAuB,MAK9D4K,EAAQC,EAAatG,EAAMmC,EAAUmE,KACpCH,EAAUQ,KAAO,GACnBP,EAASY,QAAQ,CAAEC,WAAY,CAAC,WAAY,aAC9Cd,EAAUzF,IAAIV,EAAMmC,IACrB,EAQO+E,CAAQnL,KAAKqE,WAAWvD,KAAM4C,EAAI1D,KAAKqE,WAAWpD,WAEnDkB,OAAM,SACFnC,IACR,GAEJ,ECzIH,SAASmH,EAAUxI,GACjB,YAAwB,IAAVA,EAAwBA,EAAQ,EAChD,CAEA,MAAMyM,EAAoB,CAACrK,EAAasK,EAAqB7F,EAAkB8F,EAAoChM,KACjH,IAAIiM,EAEJ,GAAkB,iBAAPF,EACTE,EAAcF,MACT,CACL,MAAMG,EAAMlM,EAAOI,SAAS,kBAAmB,EAAM,GACrD,IAAK,MAAMP,KAAOkM,EAAI,CACpB,MAAM1M,EAAQ0M,EAAGlM,GACjB,IAAImM,GAAyB,MAAK3M,EAClC,GAAI0M,EAAGlM,aAAgBjB,MACrB,IAAK,MAAMuN,KAAO9M,EAChB6M,EAAI9B,OAAOvK,EAAKgI,EAAUsE,SAE5BD,EAAI9B,OAAOvK,EAAKgI,EAAUxI,GAE7B,CACD4M,EAAcC,EAAI1C,UACnB,CAED,MAAMhG,EAAQ/B,EAAI+B,MAAM,KAExB,OAAKyI,EAGD/F,GAAW1C,EAAM2C,OAAS,EACrB3C,EAAM,GAAK,IAAMyI,EAEnBxK,EAAM,IAAMwK,EALV/F,EAAU1C,EAAM,GAAK/B,CAKA,EAkE1BwK,EAA6C,CACjDjL,OAAQ,CACNoL,MAAML,EAAI7F,EAAU,EAAO8F,EAA4B,GACrD,MAAO,IAAKtL,KAAMc,KAAMsK,EAAkBpL,KAAKc,KAAMuK,EAAI7F,EAAS8F,EAA2BtL,KAAKiB,SACnG,IC5DC0K,EAAyD,KAC7D,SAASC,EAAoBvE,GAC3B,OAAOkB,GAAQ,CAACxH,EAAKC,KACnB,IAAI6K,EAAS,EACTC,EAAQ,EACZ,OAAOvD,EAAKxH,EAAKC,GAAMqB,MAAKC,IAC1B,IACE,MAAMyJ,EAAgBzJ,EAAStE,QAAQ6E,IAAI,kBAC3CiJ,EAAQC,GAAiBA,EAAgB,KACzC,MAAMC,EAAY,IAAIC,gBAAgB,CACpCD,UAAUE,EAAOxE,GACfmE,GAAUK,EAAMzG,OACZqG,EAAQD,IACVC,EAAQD,GAENxE,EAAMsE,UACRtE,EAAMsE,SAASE,EAAQC,GAEzBpE,EAAWyE,QAAQD,EACpB,IAEH,OAAO,IAAIE,SAAS9J,EAASY,KAAKmJ,YAAYL,GAAY1J,EAC3D,CAAC,MAAOgK,GACP,OAAOhK,CACR,IACD,CAEL,CAED,MAAO,CACL1B,cAAa,CAACN,EAAQqD,EAAG0D,IAChB/G,EAAOgB,YAAY,CAACsK,EAAoBvE,KAEjDhH,SAAU,CACRsL,SAASY,GAEP,OADAvM,KAAKsE,aAAaqH,SAAWY,EACtBvM,IACR,GAEJ,EC9EH,SAASwM,EAAQ1L,EAAO,GAAID,EAAW,CAAA,GACrC,MAAO,IAAKyE,EAAMxE,OAAMD,YACrBF,MAAM8L,KACN9L,MAAM+L,GACN/L,MAAMgM,GACNhM,MAAMiM,GACNjM,MAAMkM,KACNlM,MAAMmM,GACNnM,MAAMoM,IACX,CAEAP,EAAiB,QAAIA,EACrBA,EAAQjN,iBX2BmBA,EAAwBiG,EAAU,GAC3DlG,EAAOC,QAAUiG,EAAUjG,EAAUV,EAAIS,EAAOC,QAASA,EAC3D,EW5BAiN,EAAQhN,UX8EF,SAAuBA,GAC3BF,EAAOE,UAAYA,CACrB,EW/EAgN,EAAQ/M,mBXmDqBA,EAAmB+F,EAAU,GACxDlG,EAAOG,UAAY+F,EAAU/F,EAAYZ,EAAIS,EAAOG,UAAWA,EACjE,EWpDA+M,EAAQpM,YAAcA"}
{"version":3,"file":"wretch.all.min.cjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/addons/abort.ts","../../src/addons/basicAuth.ts","../../src/addons/formData.ts","../../src/addons/formUrl.ts","../../src/addons/perfs.ts","../../src/addons/queryString.ts","../../src/addons/progress.ts","../../src/index.all.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import type { Wretch, WretchAddon, WretchErrorCallback, WretchResponseChain } from \"../types.js\"\n\nexport interface AbortWretch {\n /**\n * Associates a custom controller with the request.\n *\n * Useful when you need to use\n * your own AbortController, otherwise wretch will create a new controller itself.\n *\n * ```js\n * const controller = new AbortController()\n *\n * // Associates the same controller with multiple requests\n * wretch(\"url1\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n * wretch(\"url2\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n *\n * // Aborts both requests\n * controller.abort()\n * ```\n *\n * @param controller - An instance of AbortController\n */\n signal: <T extends AbortWretch, C, R>(this: T & Wretch<T, C, R>, controller: AbortController) => this\n}\n\nexport interface AbortResolver {\n /**\n * Aborts the request after a fixed time.\n *\n * If you use a custom AbortController associated with the request, pass it as the second argument.\n *\n * ```js\n * // 1 second timeout\n * wretch(\"...\").addon(AbortAddon()).get().setTimeout(1000).json(_ =>\n * // will not be called if the request timeouts\n * )\n * ```\n *\n * @param time - Time in milliseconds\n * @param controller - An instance of AbortController\n */\n setTimeout: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, time: number, controller?: AbortController) => this\n /**\n * Returns the provided or generated AbortController plus the wretch response chain as a pair.\n *\n * ```js\n * // We need the controller outside the chain\n * const [c, w] = wretch(\"url\")\n * .addon(AbortAddon())\n * .get()\n * .controller()\n *\n * // Resume with the chain\n * w.onAbort(_ => console.log(\"ouch\")).json()\n *\n * // Later on…\n * c.abort()\n * ```\n */\n controller: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>) => [any, this]\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, cb: WretchErrorCallback<T, C, R>) => this\n}\n\n/**\n * Adds the ability to abort requests using AbortController and signals under the hood.\n *\n *\n * _Only compatible with browsers that support\n * [AbortControllers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Otherwise, you could use a (partial)\n * [polyfill](https://www.npmjs.com/package/abortcontroller-polyfill)._\n *\n * ```js\n * import AbortAddon from \"wretch/addons/abort\"\n *\n * const [c, w] = wretch(\"...\")\n * .addon(AbortAddon())\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .controller();\n *\n * w.text((_) => console.log(\"should never be called\"));\n * c.abort();\n *\n * // Or :\n *\n * const controller = new AbortController();\n *\n * wretch(\"...\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .text((_) => console.log(\"should never be called\"));\n *\n * controller.abort();\n * ```\n */\nconst abort: () => WretchAddon<AbortWretch, AbortResolver> = () => {\n return {\n beforeRequest(wretch, options, state) {\n const fetchController = wretch._config.polyfill(\"AbortController\", false, true)\n if (!options[\"signal\"] && fetchController) {\n options[\"signal\"] = fetchController.signal\n }\n const timeout = {\n ref: null,\n clear() {\n if (timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n state.abort = {\n timeout,\n fetchController\n }\n return wretch\n },\n wretch: {\n signal(controller) {\n return { ...this, _options: { ...this._options, signal: controller.signal } }\n },\n },\n resolver: {\n setTimeout(time, controller = this._sharedState.abort.fetchController) {\n const { timeout } = this._sharedState.abort\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return this\n },\n controller() { return [this._sharedState.abort.fetchController, this] },\n onAbort(cb) { return this.error(\"AbortError\", cb) }\n },\n }\n}\n\nexport default abort\n","import type { Config, ConfiguredMiddleware, Wretch, WretchAddon } from \"../types.js\"\n\nfunction utf8ToBase64(input: string) {\n const utf8Bytes = new TextEncoder().encode(input)\n return btoa(String.fromCharCode(...utf8Bytes))\n}\n\nexport interface BasicAuthAddon {\n /**\n * Sets the `Authorization` header to `Basic ` + <base64 encoded credentials>.\n * Additionally, allows using URLs with credentials in them.\n *\n * ```js\n * const user = \"user\"\n * const pass = \"pass\"\n *\n * // Automatically sets the Authorization header to \"Basic \" + <base64 encoded credentials>\n * wretch(\"...\").addon(BasicAuthAddon).basicAuth(user, pass).get()\n *\n * // Allows using URLs with credentials in them\n * wretch(`https://${user}:${pass}@...`).addon(BasicAuthAddon).get()\n * ```\n *\n * @param username - Username to use for basic auth\n * @param password - Password to use for basic auth\n */\n basicAuth<T extends BasicAuthAddon, C, R>(\n this: T & Wretch<T, C, R>,\n username: string,\n password: string\n ): this\n}\n\nconst makeBasicAuthMiddleware: (config: Config) => ConfiguredMiddleware = config => next => (url, opts) => {\n const _URL = config.polyfill(\"URL\")\n let parsedUrl: URL | null\n try {\n parsedUrl = new _URL(url)\n } catch {\n parsedUrl = null\n }\n\n if (parsedUrl?.username || parsedUrl?.password) {\n const basicAuthBase64 = utf8ToBase64(\n `${decodeURIComponent(parsedUrl.username)}:${decodeURIComponent(parsedUrl.password)}`,\n )\n opts.headers = {\n ...opts.headers,\n Authorization: `Basic ${basicAuthBase64}`,\n }\n parsedUrl.username = \"\"\n parsedUrl.password = \"\"\n url = parsedUrl.toString()\n }\n\n return next(url, opts)\n}\n\n\n/**\n * Adds the ability to use basic auth with the `Authorization` header.\n *\n * ```js\n * import BasicAuthAddon from \"wretch/addons/basicAuth\"\n *\n * wretch().addon(BasicAuthAddon)\n * ```\n */\nconst basicAuth: WretchAddon<BasicAuthAddon> = {\n beforeRequest(wretch) {\n return wretch.middlewares([makeBasicAuthMiddleware(wretch._config)])\n },\n wretch: {\n basicAuth(username, password) {\n const basicAuthBase64 = utf8ToBase64(`${username}:${password}`)\n return this.auth(`Basic ${basicAuthBase64}`)\n },\n },\n}\n\nexport default basicAuth\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction convertFormData(\n formObject: object,\n recursive: string[] | boolean = false,\n config: Config,\n formData = config.polyfill(\"FormData\", true, true),\n ancestors = [] as string[],\n) {\n Object.entries(formObject).forEach(([key, value]) => {\n let formKey = ancestors.reduce((acc, ancestor) => (\n acc ? `${acc}[${ancestor}]` : ancestor\n ), null)\n formKey = formKey ? `${formKey}[${key}]` : key\n if (value instanceof Array || (globalThis.FileList && value instanceof FileList)) {\n for (const item of value as File[])\n formData.append(formKey, item)\n } else if (\n recursive &&\n typeof value === \"object\" &&\n (\n !(recursive instanceof Array) ||\n !recursive.includes(key)\n )\n ) {\n if (value !== null) {\n convertFormData(value, recursive, config, formData, [...ancestors, key])\n }\n } else {\n formData.append(formKey, value)\n }\n })\n\n return formData\n}\n\nexport interface FormDataAddon {\n /**\n * Converts the javascript object to a FormData and sets the request body.\n *\n * ```js\n * const form = {\n * hello: \"world\",\n * duck: \"Muscovy\",\n * };\n *\n * wretch(\"...\").addons(FormDataAddon).formData(form).post();\n * ```\n *\n * The `recursive` argument when set to `true` will enable recursion through all\n * nested objects and produce `object[key]` keys. It can be set to an array of\n * string to exclude specific keys.\n *\n * > Warning: Be careful to exclude `Blob` instances in the Browser, and\n * > `ReadableStream` and `Buffer` instances when using the node.js compatible\n * > `form-data` package.\n *\n * ```js\n * const form = {\n * duck: \"Muscovy\",\n * duckProperties: {\n * beak: {\n * color: \"yellow\",\n * },\n * legs: 2,\n * },\n * ignored: {\n * key: 0,\n * },\n * };\n *\n * // Will append the following keys to the FormData payload:\n * // \"duck\", \"duckProperties[beak][color]\", \"duckProperties[legs]\"\n * wretch(\"...\").addons(FormDataAddon).formData(form, [\"ignored\"]).post();\n * ```\n *\n * > Note: This addon does not support specifying a custom `filename`.\n * > If you need to do so, you can use the `body` method directly:\n * > ```js\n * > const form = new FormData();\n * > form.append(\"hello\", \"world\", \"hello.txt\");\n * > wretch(\"...\").body(form).post();\n * > ```\n * > See: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#example\n *\n * @param formObject - An object which will be converted to a FormData\n * @param recursive - If `true`, will recurse through all nested objects. Can be set as an array of string to exclude specific keys.\n */\n formData<T extends FormDataAddon, C, R>(this: T & Wretch<T, C, R>, formObject: object, recursive?: string[] | boolean): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormData and use it as a request body.\n *\n * ```js\n * import FormDataAddon from \"wretch/addons/formData\"\n *\n * wretch().addon(FormDataAddon)\n * ```\n */\nconst formData: WretchAddon<FormDataAddon> = {\n wretch: {\n formData(formObject, recursive = false) {\n return this.body(convertFormData(formObject, recursive, this._config))\n }\n }\n}\n\nexport default formData\n","import type { Wretch, WretchAddon } from \"../types.js\"\n\nfunction encodeQueryValue(key: string, value: unknown) {\n return encodeURIComponent(key) +\n \"=\" +\n encodeURIComponent(\n typeof value === \"object\" ?\n JSON.stringify(value) :\n \"\" + value\n )\n}\nfunction convertFormUrl(formObject: object) {\n return Object.keys(formObject)\n .map(key => {\n const value = formObject[key]\n if (value instanceof Array) {\n return value.map(v => encodeQueryValue(key, v)).join(\"&\")\n }\n return encodeQueryValue(key, value)\n })\n .join(\"&\")\n}\n\nexport interface FormUrlAddon {\n /**\n * Converts the input parameter to an url encoded string and sets the content-type\n * header and body. If the input argument is already a string, skips the conversion\n * part.\n *\n * ```js\n * const form = { a: 1, b: { c: 2 } };\n * const alreadyEncodedForm = \"a=1&b=%7B%22c%22%3A2%7D\";\n *\n * // Automatically sets the content-type header to \"application/x-www-form-urlencoded\"\n * wretch(\"...\").addon(FormUrlAddon).formUrl(form).post();\n * wretch(\"...\").addon(FormUrlAddon).formUrl(alreadyEncodedForm).post();\n * ```\n *\n * @param input - An object to convert into an url encoded string or an already encoded string\n */\n formUrl<T extends FormUrlAddon, C, R>(this: T & Wretch<T, C, R>, input: (object | string)): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormUrl and use it as a request body.\n *\n * ```js\n * import FormUrlAddon from \"wretch/addons/formUrl\"\n *\n * wretch().addon(FormUrlAddon)\n * ```\n */\nconst formUrl: WretchAddon<FormUrlAddon> = {\n wretch: {\n formUrl(input) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n }\n}\n\nexport default formUrl\n","import type { WretchResponseChain, WretchAddon, Config } from \"../types.js\"\n\nexport type PerfCallback = (timing: any) => void\n\nexport interface PerfsAddon {\n /**\n * Performs a callback on the API performance timings of the request.\n *\n * Warning: Still experimental on browsers and node.js\n */\n perfs: <T, C extends PerfsAddon, R>(this: C & WretchResponseChain<T, C, R>, cb?: PerfCallback) => this,\n}\n\n/**\n * Adds the ability to measure requests using the Performance Timings API.\n *\n * Uses the Performance API\n * ([browsers](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) &\n * [node.js](https://nodejs.org/api/perf_hooks.html)) to expose timings related to\n * the underlying request.\n *\n * Browser timings are very accurate, node.js only contains raw measures.\n *\n * ```js\n * import PerfsAddon from \"wretch/addons/perfs\"\n *\n * // Use perfs() before the response types (text, json, ...)\n * wretch(\"...\")\n * .addon(PerfsAddon())\n * .get()\n * .perfs((timings) => {\n * // Will be called when the timings are ready.\n * console.log(timings.startTime);\n * })\n * .res();\n *\n * ```\n *\n * For node.js, there is a little extra work to do :\n *\n * ```js\n * // Node.js only\n * const { performance, PerformanceObserver } = require(\"perf_hooks\");\n *\n * wretch.polyfills({\n * fetch: function (url, opts) {\n * performance.mark(url + \" - begin\");\n * return fetch(url, opts).then(res => {\n * performance.mark(url + \" - end\");\n * setTimeout(() => performance.measure(res.url, url + \" - begin\", url + \" - end\"), 0);\n * return res;\n * });\n * },\n * // other polyfills…\n * performance: performance,\n * PerformanceObserver: PerformanceObserver,\n * });\n * ```\n */\nconst perfs: () => WretchAddon<unknown, PerfsAddon> = () => {\n const callbacks = new Map<string, PerfCallback>()\n let observer /*: PerformanceObserver | null*/ = null\n\n const onMatch = (\n entries /*: PerformanceObserverEntryList */,\n name: string,\n callback: PerfCallback,\n performance: typeof globalThis.performance\n ) => {\n if (!entries.getEntriesByName)\n return false\n const matches = entries.getEntriesByName(name)\n if (matches && matches.length > 0) {\n callback(matches.reverse()[0])\n if (performance.clearMeasures)\n performance.clearMeasures(name)\n callbacks.delete(name)\n\n if (callbacks.size < 1) {\n observer.disconnect()\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n }\n\n const initObserver = (\n performance: (typeof globalThis.performance) | null | undefined,\n performanceObserver /*: (typeof PerformanceObserver) | null | undefined */\n ) => {\n if (!observer && performance && performanceObserver) {\n observer = new performanceObserver(entries => {\n callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, performance)\n })\n })\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n\n return observer\n }\n\n const monitor = (\n name: string | null | undefined,\n callback: PerfCallback | null | undefined,\n config: Config\n ) => {\n if (!name || !callback)\n return\n\n const performance = config.polyfill(\"performance\", false)\n const performanceObserver = config.polyfill(\"PerformanceObserver\", false)\n\n if (!initObserver(performance, performanceObserver))\n return\n\n if (!onMatch(performance, name, callback, performance)) {\n if (callbacks.size < 1)\n observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n callbacks.set(name, callback)\n }\n }\n\n return {\n resolver: {\n perfs(cb) {\n this._fetchReq\n .then(() =>\n monitor(this._wretchReq._url, cb, this._wretchReq._config)\n )\n .catch(() => {/* swallow */ })\n return this\n },\n }\n }\n}\n\nexport default perfs\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction stringify(value?: string | null): string | null {\n return typeof value !== \"undefined\" ? value : \"\"\n}\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean, omitUndefinedOrNullValues: boolean, config: Config) => {\n let queryString: string\n\n if (typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = config.polyfill(\"URLSearchParams\", true, true)\n for (const key in qp) {\n const value = qp[key]\n if (omitUndefinedOrNullValues && (value === null || value === undefined)) continue\n if (qp[key] instanceof Array) {\n for (const val of value)\n usp.append(key, stringify(val))\n } else {\n usp.append(key, stringify(value))\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n\n if (!queryString)\n return replace ? split[0] : url\n\n if (replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nexport interface QueryStringAddon {\n /**\n * Converts a javascript object to query parameters, then appends this query string\n * to the current url. String values are used as the query string verbatim.\n *\n * Pass `true` as the second argument to replace existing query parameters.\n * Pass `true` as the third argument to completely omit the key=value pair for undefined or null values.\n *\n * ```\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * let w = wretch(\"http://example.com\").addon(QueryStringAddon);\n * // url is http://example.com\n * w = w.query({ a: 1, b: 2 });\n * // url is now http://example.com?a=1&b=2\n * w = w.query({ c: 3, d: [4, 5] });\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5\n * w = w.query(\"five&six&seven=eight\");\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5&five&six&seven=eight\n * w = w.query({ reset: true }, true);\n * // url is now http://example.com?reset=true\n * ```\n *\n * ##### **Note that .query is not meant to handle complex cases with nested objects.**\n *\n * For this kind of usage, you can use `wretch` in conjunction with other libraries\n * (like [`qs`](https://github.com/ljharb/qs)).\n *\n * ```js\n * // Using wretch with qs\n *\n * const queryObject = { some: { nested: \"objects\" } };\n * const w = wretch(\"https://example.com/\").addon(QueryStringAddon)\n *\n * // Use .qs inside .query :\n *\n * w.query(qs.stringify(queryObject));\n *\n * // Use .defer :\n *\n * const qsWretch = w.defer((w, url, { qsQuery, qsOptions }) => (\n * qsQuery ? w.query(qs.stringify(qsQuery, qsOptions)) : w\n * ));\n *\n * qsWretch\n * .url(\"https://example.com/\")\n * .options({ qs: { query: queryObject } });\n * ```\n *\n * @param qp - An object which will be converted, or a string which will be used verbatim.\n */\n query<T extends QueryStringAddon, C, R>(this: T & Wretch<T, C, R>, qp: object | string, replace?: boolean, omitUndefinedOrNullValues?: boolean): this\n}\n\n/**\n * Adds the ability to append query parameters from a javascript object.\n *\n * ```js\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * wretch().addon(QueryAddon)\n * ```\n */\nconst queryString: WretchAddon<QueryStringAddon> = {\n wretch: {\n query(qp, replace = false, omitUndefinedOrNullValues = false) {\n return { ...this, _url: appendQueryParams(this._url, qp, replace, omitUndefinedOrNullValues, this._config) }\n }\n }\n}\n\nexport default queryString\n","import type { ConfiguredMiddleware, WretchAddon, WretchResponseChain } from \"../types.js\"\n\nexport interface ProgressResolver {\n /**\n * Provides a way to register a callback to be invoked one or multiple times during the download.\n * The callback receives the current progress as two arguments, the number of bytes loaded and the total number of bytes to load.\n *\n * _Under the hood: this method adds a middleware to the chain that will intercept the response and replace the body with a new one that will emit the progress event._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n *\n * @param onProgress - A callback that will be called one or multiple times with the number of bytes loaded and the total number of bytes to load.\n */\n progress: <T, C extends ProgressResolver, R>(\n this: C & WretchResponseChain<T, C, R>,\n onProgress: (loaded: number, total: number) => void\n ) => this\n}\n\n/**\n * Adds the ability to monitor progress when downloading a response.\n *\n * _Compatible with all platforms implementing the [TransformStream WebAPI](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility)._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n */\nconst progress: () => WretchAddon<unknown, ProgressResolver> = () => {\n function transformMiddleware(state: Record<any, any>) : ConfiguredMiddleware {\n return next => (url, opts) => {\n let loaded = 0\n let total = 0\n return next(url, opts).then(response => {\n try {\n const contentLength = response.headers.get(\"content-length\")\n total = contentLength ? +contentLength : null\n const transform = new TransformStream({\n transform(chunk, controller) {\n loaded += chunk.length\n if (total < loaded) {\n total = loaded\n }\n if (state.progress) {\n state.progress(loaded, total)\n }\n controller.enqueue(chunk)\n }\n })\n return new Response(response.body.pipeThrough(transform), response)\n } catch (e) {\n return response\n }\n })\n }\n }\n\n return {\n beforeRequest(wretch, _, state) {\n return wretch.middlewares([transformMiddleware(state)])\n },\n resolver: {\n progress(onProgress: (loaded: number, total: number) => void) {\n this._sharedState.progress = onProgress\n return this\n }\n },\n }\n}\n\nexport default progress\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport * as Addons from \"./addons/index.js\"\nimport { WretchError } from \"./resolver.js\"\n\nfunction factory(_url = \"\", _options = {}) {\n return { ...core, _url, _options }\n .addon(Addons.abortAddon())\n .addon(Addons.basicAuthAddon)\n .addon(Addons.formDataAddon)\n .addon(Addons.formUrlAddon)\n .addon(Addons.perfsAddon())\n .addon(Addons.queryStringAddon)\n .addon(Addons.progressAddon())\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","abort","state","fetchController","signal","ref","clearTimeout","controller","setTimeout","time","onAbort","utf8ToBase64","input","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","makeBasicAuthMiddleware","next","_URL","parsedUrl","username","password","basicAuthBase64","decodeURIComponent","toString","basicAuth","convertFormData","formObject","recursive","ancestors","forEach","formKey","ancestor","globalThis","FileList","item","append","includes","encodeQueryValue","encodeURIComponent","formUrl","keys","map","v","join","perfs","callbacks","observer","onMatch","performance","getEntriesByName","matches","reverse","clearMeasures","size","disconnect","clearResourceTimings","performanceObserver","initObserver","observe","entryTypes","monitor","appendQueryParams","qp","omitUndefinedOrNullValues","queryString","usp","val","query","progress","transformMiddleware","loaded","total","contentLength","transform","TransformStream","chunk","enqueue","Response","pipeThrough","e","onProgress","factory","Addons.abortAddon","Addons.basicAuthAddon","Addons.formDataAddon","Addons.formUrlAddon","Addons.perfsAddon","Addons.queryStringAddon","Addons.progressAddon"],"mappings":"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"}

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).wretch=t()}(this,(function(){"use strict";const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function n(e){return/^application\/.*json.*/.test(e)}const s=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,n])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(n)?t[o]=r?[...i,...n]:n:t[o]="object"==typeof i&&"object"==typeof n?s(i,n,r):n,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const n=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!n)throw new Error(e+" is not defined");return r&&n?new n(...o):n}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:n,_options:i,_config:l,_catchers:a,_resolvers:u,_middlewares:h,_addons:f}=e,d=new Map(a),p=s(l.options,i);let y=n;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(h)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(n,p),g=new Error,m=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=g,r.stack=r.stack+"\nCAUSE: "+g.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{throw r.message="string"==typeof t?t:e.statusText,t&&(o&&"string"==typeof t?(r.text=t,r.json=JSON.parse(t)):r[l.errorType]=t),r}))}return e})),b=o=>n=>(o?m.then((e=>e&&e[o]())).then((e=>n?n(e):e)):m.then((e=>n?n(e):e))).catch((o=>{const n=Object.prototype.hasOwnProperty.call(o,t),s=n?o[t]:o,i=(null==s?void 0:s.status)&&d.get(s.status)||d.get(null==s?void 0:s.name)||n&&d.has(t)&&d.get(t);if(i)return i(s,e);const c=d.get(r);if(c)return c(s,e);throw s})),w={_wretchReq:e,_fetchReq:_,_sharedState:o,res:b(null),json:b("json"),blob:b("blob"),formData:b("formData"),arrayBuffer:b("arrayBuffer"),text:b("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},T=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),w);return u.reduce(((t,r)=>r(t,e)),T)},a={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:s(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:s(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:s(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let s=this.url(t).options({method:e});const i=o(s._options.headers),c=this._config.polyfill("FormData",0),a="object"==typeof r&&!(c&&r instanceof c)&&(!s._options.headers||!i||n(i));return s=r?a?s.json(r,i):s.body(r):s,l(s._deferred.reduce(((e,t)=>t(e,e._url,e._options)),s))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||n(r)&&r||"application/json").body(JSON.stringify(e))}},u=()=>({beforeRequest(e,t,r){const o=e._config.polyfill("AbortController",0,1);!t.signal&&o&&(t.signal=o.signal);const n={ref:null,clear(){n.ref&&(clearTimeout(n.ref),n.ref=null)}};return r.abort={timeout:n,fetchController:o},e},wretch:{signal(e){return{...this,_options:{...this._options,signal:e.signal}}}},resolver:{setTimeout(e,t=this._sharedState.abort.fetchController){const{timeout:r}=this._sharedState.abort;return r.clear(),r.ref=setTimeout((()=>t.abort()),e),this},controller(){return[this._sharedState.abort.fetchController,this]},onAbort(e){return this.error("AbortError",e)}}});function h(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}const f=e=>t=>(r,o)=>{const n=e.polyfill("URL");let s;try{s=new n(r)}catch(e){s=null}if((null==s?void 0:s.username)||(null==s?void 0:s.password)){const e=h(`${decodeURIComponent(s.username)}:${decodeURIComponent(s.password)}`);o.headers={...o.headers,Authorization:`Basic ${e}`},s.username="",s.password="",r=s.toString()}return t(r,o)},d={beforeRequest:e=>e.middlewares([f(e._config)]),wretch:{basicAuth(e,t){const r=h(`${e}:${t}`);return this.auth(`Basic ${r}`)}}};function p(e,t=0,r,o=r.polyfill("FormData",1,1),n=[]){return Object.entries(e).forEach((([e,s])=>{let i=n.reduce(((e,t)=>e?`${e}[${t}]`:t),null);if(i=i?`${i}[${e}]`:e,s instanceof Array||globalThis.FileList&&s instanceof FileList)for(const e of s)o.append(i,e);else!t||"object"!=typeof s||t instanceof Array&&t.includes(e)?o.append(i,s):null!==s&&p(s,t,r,o,[...n,e])})),o}const y={wretch:{formData(e,t=0){return this.body(p(e,t,this._config))}}};function _(e,t){return encodeURIComponent(e)+"="+encodeURIComponent("object"==typeof t?JSON.stringify(t):""+t)}const g={wretch:{formUrl(e){return this.body("string"==typeof e?e:(t=e,Object.keys(t).map((e=>{const r=t[e];return r instanceof Array?r.map((t=>_(e,t))).join("&"):_(e,r)})).join("&"))).content("application/x-www-form-urlencoded");var t}}},m=()=>{const e=new Map;let t=null;const r=(r,o,n,s)=>{if(!r.getEntriesByName)return 0;const i=r.getEntriesByName(o);return i&&i.length>0?(n(i.reverse()[0]),s.clearMeasures&&s.clearMeasures(o),e.delete(o),e.size<1&&(t.disconnect(),s.clearResourceTimings&&s.clearResourceTimings()),1):0};return{resolver:{perfs(o){return this._fetchReq.then((()=>((o,n,s)=>{if(!o||!n)return;const i=s.polyfill("performance",0);((o,n)=>(!t&&o&&n&&(t=new n((t=>{e.forEach(((e,n)=>{r(t,n,e,o)}))})),o.clearResourceTimings&&o.clearResourceTimings()),t))(i,s.polyfill("PerformanceObserver",0))&&(r(i,o,n,i)||(e.size<1&&t.observe({entryTypes:["resource","measure"]}),e.set(o,n)))})(this._wretchReq._url,o,this._wretchReq._config))).catch((()=>{})),this}}}};function b(e){return void 0!==e?e:""}const w=(e,t,r,o,n)=>{let s;if("string"==typeof t)s=t;else{const e=n.polyfill("URLSearchParams",1,1);for(const r in t){const n=t[r];if(!o||null!=n)if(t[r]instanceof Array)for(const t of n)e.append(r,b(t));else e.append(r,b(n))}s=e.toString()}const i=e.split("?");return s?r||i.length<2?i[0]+"?"+s:e+"&"+s:r?i[0]:e},T={wretch:{query(e,t=0,r=0){return{...this,_url:w(this._url,e,t,r,this._config)}}}},v=()=>{function e(e){return t=>(r,o)=>{let n=0,s=0;return t(r,o).then((t=>{try{const r=t.headers.get("content-length");s=r?+r:null;const o=new TransformStream({transform(t,r){n+=t.length,s<n&&(s=n),e.progress&&e.progress(n,s),r.enqueue(t)}});return new Response(t.body.pipeThrough(o),t)}catch(e){return t}}))}}return{beforeRequest:(t,r,o)=>t.middlewares([e(o)]),resolver:{progress(e){return this._sharedState.progress=e,this}}}};function j(e="",t={}){return{...a,_url:e,_options:t}.addon(u()).addon(d).addon(y).addon(g).addon(m()).addon(T).addon(v())}return j.default=j,j.options=function(e,t=0){i.options=t?e:s(i.options,e)},j.errorType=function(e){i.errorType=e},j.polyfills=function(e,t=0){i.polyfills=t?e:s(i.polyfills,e)},j.WretchError=c,j}));
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).wretch=t()}(this,(function(){"use strict";const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function n(e){return/^application\/.*json.*/.test(e)}const s=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,n])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(n)?t[o]=r?[...i,...n]:n:t[o]="object"==typeof i&&"object"==typeof n?s(i,n,r):n,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const n=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!n)throw new Error(e+" is not defined");return r&&n?new n(...o):n}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:n,_options:i,_config:l,_catchers:a,_resolvers:u,_middlewares:h,_addons:f}=e,d=new Map(a),p=s(l.options,i);let y=n;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(h)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(n,p),g=new Error,m=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=g,r.stack=r.stack+"\nCAUSE: "+g.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{if(r.message="string"==typeof t?t:e.statusText,t)if(o&&"string"==typeof t){r.text=t;try{r.json=JSON.parse(t)}catch(e){}}else r[l.errorType]=t;throw r}))}return e})),b=o=>n=>(o?m.then((e=>e&&e[o]())).then((e=>n?n(e):e)):m.then((e=>n?n(e):e))).catch((o=>{const n=Object.prototype.hasOwnProperty.call(o,t),s=n?o[t]:o,i=(null==s?void 0:s.status)&&d.get(s.status)||d.get(null==s?void 0:s.name)||n&&d.has(t)&&d.get(t);if(i)return i(s,e);const c=d.get(r);if(c)return c(s,e);throw s})),w={_wretchReq:e,_fetchReq:_,_sharedState:o,res:b(null),json:b("json"),blob:b("blob"),formData:b("formData"),arrayBuffer:b("arrayBuffer"),text:b("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},T=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),w);return u.reduce(((t,r)=>r(t,e)),T)},a={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:s(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:s(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:s(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let s=this.url(t).options({method:e});const i=o(s._options.headers),c=this._config.polyfill("FormData",0),a="object"==typeof r&&!(c&&r instanceof c)&&(!s._options.headers||!i||n(i));return s=r?a?s.json(r,i):s.body(r):s,l(s._deferred.reduce(((e,t)=>t(e,e._url,e._options)),s))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||n(r)&&r||"application/json").body(JSON.stringify(e))}},u=()=>({beforeRequest(e,t,r){const o=e._config.polyfill("AbortController",0,1);!t.signal&&o&&(t.signal=o.signal);const n={ref:null,clear(){n.ref&&(clearTimeout(n.ref),n.ref=null)}};return r.abort={timeout:n,fetchController:o},e},wretch:{signal(e){return{...this,_options:{...this._options,signal:e.signal}}}},resolver:{setTimeout(e,t=this._sharedState.abort.fetchController){const{timeout:r}=this._sharedState.abort;return r.clear(),r.ref=setTimeout((()=>t.abort()),e),this},controller(){return[this._sharedState.abort.fetchController,this]},onAbort(e){return this.error("AbortError",e)}}});function h(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}const f=e=>t=>(r,o)=>{const n=e.polyfill("URL");let s;try{s=new n(r)}catch(e){s=null}if((null==s?void 0:s.username)||(null==s?void 0:s.password)){const e=h(`${decodeURIComponent(s.username)}:${decodeURIComponent(s.password)}`);o.headers={...o.headers,Authorization:`Basic ${e}`},s.username="",s.password="",r=s.toString()}return t(r,o)},d={beforeRequest:e=>e.middlewares([f(e._config)]),wretch:{basicAuth(e,t){const r=h(`${e}:${t}`);return this.auth(`Basic ${r}`)}}};function p(e,t=0,r,o=r.polyfill("FormData",1,1),n=[]){return Object.entries(e).forEach((([e,s])=>{let i=n.reduce(((e,t)=>e?`${e}[${t}]`:t),null);if(i=i?`${i}[${e}]`:e,s instanceof Array||globalThis.FileList&&s instanceof FileList)for(const e of s)o.append(i,e);else!t||"object"!=typeof s||t instanceof Array&&t.includes(e)?o.append(i,s):null!==s&&p(s,t,r,o,[...n,e])})),o}const y={wretch:{formData(e,t=0){return this.body(p(e,t,this._config))}}};function _(e,t){return encodeURIComponent(e)+"="+encodeURIComponent("object"==typeof t?JSON.stringify(t):""+t)}const g={wretch:{formUrl(e){return this.body("string"==typeof e?e:(t=e,Object.keys(t).map((e=>{const r=t[e];return r instanceof Array?r.map((t=>_(e,t))).join("&"):_(e,r)})).join("&"))).content("application/x-www-form-urlencoded");var t}}},m=()=>{const e=new Map;let t=null;const r=(r,o,n,s)=>{if(!r.getEntriesByName)return 0;const i=r.getEntriesByName(o);return i&&i.length>0?(n(i.reverse()[0]),s.clearMeasures&&s.clearMeasures(o),e.delete(o),e.size<1&&(t.disconnect(),s.clearResourceTimings&&s.clearResourceTimings()),1):0};return{resolver:{perfs(o){return this._fetchReq.then((()=>((o,n,s)=>{if(!o||!n)return;const i=s.polyfill("performance",0);((o,n)=>(!t&&o&&n&&(t=new n((t=>{e.forEach(((e,n)=>{r(t,n,e,o)}))})),o.clearResourceTimings&&o.clearResourceTimings()),t))(i,s.polyfill("PerformanceObserver",0))&&(r(i,o,n,i)||(e.size<1&&t.observe({entryTypes:["resource","measure"]}),e.set(o,n)))})(this._wretchReq._url,o,this._wretchReq._config))).catch((()=>{})),this}}}};function b(e){return void 0!==e?e:""}const w=(e,t,r,o,n)=>{let s;if("string"==typeof t)s=t;else{const e=n.polyfill("URLSearchParams",1,1);for(const r in t){const n=t[r];if(!o||null!=n)if(t[r]instanceof Array)for(const t of n)e.append(r,b(t));else e.append(r,b(n))}s=e.toString()}const i=e.split("?");return s?r||i.length<2?i[0]+"?"+s:e+"&"+s:r?i[0]:e},T={wretch:{query(e,t=0,r=0){return{...this,_url:w(this._url,e,t,r,this._config)}}}},v=()=>{function e(e){return t=>(r,o)=>{let n=0,s=0;return t(r,o).then((t=>{try{const r=t.headers.get("content-length");s=r?+r:null;const o=new TransformStream({transform(t,r){n+=t.length,s<n&&(s=n),e.progress&&e.progress(n,s),r.enqueue(t)}});return new Response(t.body.pipeThrough(o),t)}catch(e){return t}}))}}return{beforeRequest:(t,r,o)=>t.middlewares([e(o)]),resolver:{progress(e){return this._sharedState.progress=e,this}}}};function j(e="",t={}){return{...a,_url:e,_options:t}.addon(u()).addon(d).addon(y).addon(g).addon(m()).addon(T).addon(v())}return j.default=j,j.options=function(e,t=0){i.options=t?e:s(i.options,e)},j.errorType=function(e){i.errorType=e},j.polyfills=function(e,t=0){i.polyfills=t?e:s(i.polyfills,e)},j.WretchError=c,j}));
//# sourceMappingURL=wretch.all.min.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"wretch.all.min.js","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/addons/abort.ts","../../src/addons/basicAuth.ts","../../src/addons/formData.ts","../../src/addons/formUrl.ts","../../src/addons/perfs.ts","../../src/addons/queryString.ts","../../src/addons/progress.ts","../../src/index.all.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import type { Wretch, WretchAddon, WretchErrorCallback, WretchResponseChain } from \"../types.js\"\n\nexport interface AbortWretch {\n /**\n * Associates a custom controller with the request.\n *\n * Useful when you need to use\n * your own AbortController, otherwise wretch will create a new controller itself.\n *\n * ```js\n * const controller = new AbortController()\n *\n * // Associates the same controller with multiple requests\n * wretch(\"url1\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n * wretch(\"url2\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n *\n * // Aborts both requests\n * controller.abort()\n * ```\n *\n * @param controller - An instance of AbortController\n */\n signal: <T extends AbortWretch, C, R>(this: T & Wretch<T, C, R>, controller: AbortController) => this\n}\n\nexport interface AbortResolver {\n /**\n * Aborts the request after a fixed time.\n *\n * If you use a custom AbortController associated with the request, pass it as the second argument.\n *\n * ```js\n * // 1 second timeout\n * wretch(\"...\").addon(AbortAddon()).get().setTimeout(1000).json(_ =>\n * // will not be called if the request timeouts\n * )\n * ```\n *\n * @param time - Time in milliseconds\n * @param controller - An instance of AbortController\n */\n setTimeout: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, time: number, controller?: AbortController) => this\n /**\n * Returns the provided or generated AbortController plus the wretch response chain as a pair.\n *\n * ```js\n * // We need the controller outside the chain\n * const [c, w] = wretch(\"url\")\n * .addon(AbortAddon())\n * .get()\n * .controller()\n *\n * // Resume with the chain\n * w.onAbort(_ => console.log(\"ouch\")).json()\n *\n * // Later on…\n * c.abort()\n * ```\n */\n controller: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>) => [any, this]\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, cb: WretchErrorCallback<T, C, R>) => this\n}\n\n/**\n * Adds the ability to abort requests using AbortController and signals under the hood.\n *\n *\n * _Only compatible with browsers that support\n * [AbortControllers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Otherwise, you could use a (partial)\n * [polyfill](https://www.npmjs.com/package/abortcontroller-polyfill)._\n *\n * ```js\n * import AbortAddon from \"wretch/addons/abort\"\n *\n * const [c, w] = wretch(\"...\")\n * .addon(AbortAddon())\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .controller();\n *\n * w.text((_) => console.log(\"should never be called\"));\n * c.abort();\n *\n * // Or :\n *\n * const controller = new AbortController();\n *\n * wretch(\"...\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .text((_) => console.log(\"should never be called\"));\n *\n * controller.abort();\n * ```\n */\nconst abort: () => WretchAddon<AbortWretch, AbortResolver> = () => {\n return {\n beforeRequest(wretch, options, state) {\n const fetchController = wretch._config.polyfill(\"AbortController\", false, true)\n if (!options[\"signal\"] && fetchController) {\n options[\"signal\"] = fetchController.signal\n }\n const timeout = {\n ref: null,\n clear() {\n if (timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n state.abort = {\n timeout,\n fetchController\n }\n return wretch\n },\n wretch: {\n signal(controller) {\n return { ...this, _options: { ...this._options, signal: controller.signal } }\n },\n },\n resolver: {\n setTimeout(time, controller = this._sharedState.abort.fetchController) {\n const { timeout } = this._sharedState.abort\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return this\n },\n controller() { return [this._sharedState.abort.fetchController, this] },\n onAbort(cb) { return this.error(\"AbortError\", cb) }\n },\n }\n}\n\nexport default abort\n","import type { Config, ConfiguredMiddleware, Wretch, WretchAddon } from \"../types.js\"\n\nfunction utf8ToBase64(input: string) {\n const utf8Bytes = new TextEncoder().encode(input)\n return btoa(String.fromCharCode(...utf8Bytes))\n}\n\nexport interface BasicAuthAddon {\n /**\n * Sets the `Authorization` header to `Basic ` + <base64 encoded credentials>.\n * Additionally, allows using URLs with credentials in them.\n *\n * ```js\n * const user = \"user\"\n * const pass = \"pass\"\n *\n * // Automatically sets the Authorization header to \"Basic \" + <base64 encoded credentials>\n * wretch(\"...\").addon(BasicAuthAddon).basicAuth(user, pass).get()\n *\n * // Allows using URLs with credentials in them\n * wretch(`https://${user}:${pass}@...`).addon(BasicAuthAddon).get()\n * ```\n *\n * @param username - Username to use for basic auth\n * @param password - Password to use for basic auth\n */\n basicAuth<T extends BasicAuthAddon, C, R>(\n this: T & Wretch<T, C, R>,\n username: string,\n password: string\n ): this\n}\n\nconst makeBasicAuthMiddleware: (config: Config) => ConfiguredMiddleware = config => next => (url, opts) => {\n const _URL = config.polyfill(\"URL\")\n let parsedUrl: URL | null\n try {\n parsedUrl = new _URL(url)\n } catch {\n parsedUrl = null\n }\n\n if (parsedUrl?.username || parsedUrl?.password) {\n const basicAuthBase64 = utf8ToBase64(\n `${decodeURIComponent(parsedUrl.username)}:${decodeURIComponent(parsedUrl.password)}`,\n )\n opts.headers = {\n ...opts.headers,\n Authorization: `Basic ${basicAuthBase64}`,\n }\n parsedUrl.username = \"\"\n parsedUrl.password = \"\"\n url = parsedUrl.toString()\n }\n\n return next(url, opts)\n}\n\n\n/**\n * Adds the ability to use basic auth with the `Authorization` header.\n *\n * ```js\n * import BasicAuthAddon from \"wretch/addons/basicAuth\"\n *\n * wretch().addon(BasicAuthAddon)\n * ```\n */\nconst basicAuth: WretchAddon<BasicAuthAddon> = {\n beforeRequest(wretch) {\n return wretch.middlewares([makeBasicAuthMiddleware(wretch._config)])\n },\n wretch: {\n basicAuth(username, password) {\n const basicAuthBase64 = utf8ToBase64(`${username}:${password}`)\n return this.auth(`Basic ${basicAuthBase64}`)\n },\n },\n}\n\nexport default basicAuth\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction convertFormData(\n formObject: object,\n recursive: string[] | boolean = false,\n config: Config,\n formData = config.polyfill(\"FormData\", true, true),\n ancestors = [] as string[],\n) {\n Object.entries(formObject).forEach(([key, value]) => {\n let formKey = ancestors.reduce((acc, ancestor) => (\n acc ? `${acc}[${ancestor}]` : ancestor\n ), null)\n formKey = formKey ? `${formKey}[${key}]` : key\n if (value instanceof Array || (globalThis.FileList && value instanceof FileList)) {\n for (const item of value as File[])\n formData.append(formKey, item)\n } else if (\n recursive &&\n typeof value === \"object\" &&\n (\n !(recursive instanceof Array) ||\n !recursive.includes(key)\n )\n ) {\n if (value !== null) {\n convertFormData(value, recursive, config, formData, [...ancestors, key])\n }\n } else {\n formData.append(formKey, value)\n }\n })\n\n return formData\n}\n\nexport interface FormDataAddon {\n /**\n * Converts the javascript object to a FormData and sets the request body.\n *\n * ```js\n * const form = {\n * hello: \"world\",\n * duck: \"Muscovy\",\n * };\n *\n * wretch(\"...\").addons(FormDataAddon).formData(form).post();\n * ```\n *\n * The `recursive` argument when set to `true` will enable recursion through all\n * nested objects and produce `object[key]` keys. It can be set to an array of\n * string to exclude specific keys.\n *\n * > Warning: Be careful to exclude `Blob` instances in the Browser, and\n * > `ReadableStream` and `Buffer` instances when using the node.js compatible\n * > `form-data` package.\n *\n * ```js\n * const form = {\n * duck: \"Muscovy\",\n * duckProperties: {\n * beak: {\n * color: \"yellow\",\n * },\n * legs: 2,\n * },\n * ignored: {\n * key: 0,\n * },\n * };\n *\n * // Will append the following keys to the FormData payload:\n * // \"duck\", \"duckProperties[beak][color]\", \"duckProperties[legs]\"\n * wretch(\"...\").addons(FormDataAddon).formData(form, [\"ignored\"]).post();\n * ```\n *\n * > Note: This addon does not support specifying a custom `filename`.\n * > If you need to do so, you can use the `body` method directly:\n * > ```js\n * > const form = new FormData();\n * > form.append(\"hello\", \"world\", \"hello.txt\");\n * > wretch(\"...\").body(form).post();\n * > ```\n * > See: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#example\n *\n * @param formObject - An object which will be converted to a FormData\n * @param recursive - If `true`, will recurse through all nested objects. Can be set as an array of string to exclude specific keys.\n */\n formData<T extends FormDataAddon, C, R>(this: T & Wretch<T, C, R>, formObject: object, recursive?: string[] | boolean): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormData and use it as a request body.\n *\n * ```js\n * import FormDataAddon from \"wretch/addons/formData\"\n *\n * wretch().addon(FormDataAddon)\n * ```\n */\nconst formData: WretchAddon<FormDataAddon> = {\n wretch: {\n formData(formObject, recursive = false) {\n return this.body(convertFormData(formObject, recursive, this._config))\n }\n }\n}\n\nexport default formData\n","import type { Wretch, WretchAddon } from \"../types.js\"\n\nfunction encodeQueryValue(key: string, value: unknown) {\n return encodeURIComponent(key) +\n \"=\" +\n encodeURIComponent(\n typeof value === \"object\" ?\n JSON.stringify(value) :\n \"\" + value\n )\n}\nfunction convertFormUrl(formObject: object) {\n return Object.keys(formObject)\n .map(key => {\n const value = formObject[key]\n if (value instanceof Array) {\n return value.map(v => encodeQueryValue(key, v)).join(\"&\")\n }\n return encodeQueryValue(key, value)\n })\n .join(\"&\")\n}\n\nexport interface FormUrlAddon {\n /**\n * Converts the input parameter to an url encoded string and sets the content-type\n * header and body. If the input argument is already a string, skips the conversion\n * part.\n *\n * ```js\n * const form = { a: 1, b: { c: 2 } };\n * const alreadyEncodedForm = \"a=1&b=%7B%22c%22%3A2%7D\";\n *\n * // Automatically sets the content-type header to \"application/x-www-form-urlencoded\"\n * wretch(\"...\").addon(FormUrlAddon).formUrl(form).post();\n * wretch(\"...\").addon(FormUrlAddon).formUrl(alreadyEncodedForm).post();\n * ```\n *\n * @param input - An object to convert into an url encoded string or an already encoded string\n */\n formUrl<T extends FormUrlAddon, C, R>(this: T & Wretch<T, C, R>, input: (object | string)): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormUrl and use it as a request body.\n *\n * ```js\n * import FormUrlAddon from \"wretch/addons/formUrl\"\n *\n * wretch().addon(FormUrlAddon)\n * ```\n */\nconst formUrl: WretchAddon<FormUrlAddon> = {\n wretch: {\n formUrl(input) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n }\n}\n\nexport default formUrl\n","import type { WretchResponseChain, WretchAddon, Config } from \"../types.js\"\n\nexport type PerfCallback = (timing: any) => void\n\nexport interface PerfsAddon {\n /**\n * Performs a callback on the API performance timings of the request.\n *\n * Warning: Still experimental on browsers and node.js\n */\n perfs: <T, C extends PerfsAddon, R>(this: C & WretchResponseChain<T, C, R>, cb?: PerfCallback) => this,\n}\n\n/**\n * Adds the ability to measure requests using the Performance Timings API.\n *\n * Uses the Performance API\n * ([browsers](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) &\n * [node.js](https://nodejs.org/api/perf_hooks.html)) to expose timings related to\n * the underlying request.\n *\n * Browser timings are very accurate, node.js only contains raw measures.\n *\n * ```js\n * import PerfsAddon from \"wretch/addons/perfs\"\n *\n * // Use perfs() before the response types (text, json, ...)\n * wretch(\"...\")\n * .addon(PerfsAddon())\n * .get()\n * .perfs((timings) => {\n * // Will be called when the timings are ready.\n * console.log(timings.startTime);\n * })\n * .res();\n *\n * ```\n *\n * For node.js, there is a little extra work to do :\n *\n * ```js\n * // Node.js only\n * const { performance, PerformanceObserver } = require(\"perf_hooks\");\n *\n * wretch.polyfills({\n * fetch: function (url, opts) {\n * performance.mark(url + \" - begin\");\n * return fetch(url, opts).then(res => {\n * performance.mark(url + \" - end\");\n * setTimeout(() => performance.measure(res.url, url + \" - begin\", url + \" - end\"), 0);\n * return res;\n * });\n * },\n * // other polyfills…\n * performance: performance,\n * PerformanceObserver: PerformanceObserver,\n * });\n * ```\n */\nconst perfs: () => WretchAddon<unknown, PerfsAddon> = () => {\n const callbacks = new Map<string, PerfCallback>()\n let observer /*: PerformanceObserver | null*/ = null\n\n const onMatch = (\n entries /*: PerformanceObserverEntryList */,\n name: string,\n callback: PerfCallback,\n performance: typeof globalThis.performance\n ) => {\n if (!entries.getEntriesByName)\n return false\n const matches = entries.getEntriesByName(name)\n if (matches && matches.length > 0) {\n callback(matches.reverse()[0])\n if (performance.clearMeasures)\n performance.clearMeasures(name)\n callbacks.delete(name)\n\n if (callbacks.size < 1) {\n observer.disconnect()\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n }\n\n const initObserver = (\n performance: (typeof globalThis.performance) | null | undefined,\n performanceObserver /*: (typeof PerformanceObserver) | null | undefined */\n ) => {\n if (!observer && performance && performanceObserver) {\n observer = new performanceObserver(entries => {\n callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, performance)\n })\n })\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n\n return observer\n }\n\n const monitor = (\n name: string | null | undefined,\n callback: PerfCallback | null | undefined,\n config: Config\n ) => {\n if (!name || !callback)\n return\n\n const performance = config.polyfill(\"performance\", false)\n const performanceObserver = config.polyfill(\"PerformanceObserver\", false)\n\n if (!initObserver(performance, performanceObserver))\n return\n\n if (!onMatch(performance, name, callback, performance)) {\n if (callbacks.size < 1)\n observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n callbacks.set(name, callback)\n }\n }\n\n return {\n resolver: {\n perfs(cb) {\n this._fetchReq\n .then(() =>\n monitor(this._wretchReq._url, cb, this._wretchReq._config)\n )\n .catch(() => {/* swallow */ })\n return this\n },\n }\n }\n}\n\nexport default perfs\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction stringify(value?: string | null): string | null {\n return typeof value !== \"undefined\" ? value : \"\"\n}\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean, omitUndefinedOrNullValues: boolean, config: Config) => {\n let queryString: string\n\n if (typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = config.polyfill(\"URLSearchParams\", true, true)\n for (const key in qp) {\n const value = qp[key]\n if (omitUndefinedOrNullValues && (value === null || value === undefined)) continue\n if (qp[key] instanceof Array) {\n for (const val of value)\n usp.append(key, stringify(val))\n } else {\n usp.append(key, stringify(value))\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n\n if (!queryString)\n return replace ? split[0] : url\n\n if (replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nexport interface QueryStringAddon {\n /**\n * Converts a javascript object to query parameters, then appends this query string\n * to the current url. String values are used as the query string verbatim.\n *\n * Pass `true` as the second argument to replace existing query parameters.\n * Pass `true` as the third argument to completely omit the key=value pair for undefined or null values.\n *\n * ```\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * let w = wretch(\"http://example.com\").addon(QueryStringAddon);\n * // url is http://example.com\n * w = w.query({ a: 1, b: 2 });\n * // url is now http://example.com?a=1&b=2\n * w = w.query({ c: 3, d: [4, 5] });\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5\n * w = w.query(\"five&six&seven=eight\");\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5&five&six&seven=eight\n * w = w.query({ reset: true }, true);\n * // url is now http://example.com?reset=true\n * ```\n *\n * ##### **Note that .query is not meant to handle complex cases with nested objects.**\n *\n * For this kind of usage, you can use `wretch` in conjunction with other libraries\n * (like [`qs`](https://github.com/ljharb/qs)).\n *\n * ```js\n * // Using wretch with qs\n *\n * const queryObject = { some: { nested: \"objects\" } };\n * const w = wretch(\"https://example.com/\").addon(QueryStringAddon)\n *\n * // Use .qs inside .query :\n *\n * w.query(qs.stringify(queryObject));\n *\n * // Use .defer :\n *\n * const qsWretch = w.defer((w, url, { qsQuery, qsOptions }) => (\n * qsQuery ? w.query(qs.stringify(qsQuery, qsOptions)) : w\n * ));\n *\n * qsWretch\n * .url(\"https://example.com/\")\n * .options({ qs: { query: queryObject } });\n * ```\n *\n * @param qp - An object which will be converted, or a string which will be used verbatim.\n */\n query<T extends QueryStringAddon, C, R>(this: T & Wretch<T, C, R>, qp: object | string, replace?: boolean, omitUndefinedOrNullValues?: boolean): this\n}\n\n/**\n * Adds the ability to append query parameters from a javascript object.\n *\n * ```js\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * wretch().addon(QueryAddon)\n * ```\n */\nconst queryString: WretchAddon<QueryStringAddon> = {\n wretch: {\n query(qp, replace = false, omitUndefinedOrNullValues = false) {\n return { ...this, _url: appendQueryParams(this._url, qp, replace, omitUndefinedOrNullValues, this._config) }\n }\n }\n}\n\nexport default queryString\n","import type { ConfiguredMiddleware, WretchAddon, WretchResponseChain } from \"../types.js\"\n\nexport interface ProgressResolver {\n /**\n * Provides a way to register a callback to be invoked one or multiple times during the download.\n * The callback receives the current progress as two arguments, the number of bytes loaded and the total number of bytes to load.\n *\n * _Under the hood: this method adds a middleware to the chain that will intercept the response and replace the body with a new one that will emit the progress event._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n *\n * @param onProgress - A callback that will be called one or multiple times with the number of bytes loaded and the total number of bytes to load.\n */\n progress: <T, C extends ProgressResolver, R>(\n this: C & WretchResponseChain<T, C, R>,\n onProgress: (loaded: number, total: number) => void\n ) => this\n}\n\n/**\n * Adds the ability to monitor progress when downloading a response.\n *\n * _Compatible with all platforms implementing the [TransformStream WebAPI](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility)._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n */\nconst progress: () => WretchAddon<unknown, ProgressResolver> = () => {\n function transformMiddleware(state: Record<any, any>) : ConfiguredMiddleware {\n return next => (url, opts) => {\n let loaded = 0\n let total = 0\n return next(url, opts).then(response => {\n try {\n const contentLength = response.headers.get(\"content-length\")\n total = contentLength ? +contentLength : null\n const transform = new TransformStream({\n transform(chunk, controller) {\n loaded += chunk.length\n if (total < loaded) {\n total = loaded\n }\n if (state.progress) {\n state.progress(loaded, total)\n }\n controller.enqueue(chunk)\n }\n })\n return new Response(response.body.pipeThrough(transform), response)\n } catch (e) {\n return response\n }\n })\n }\n }\n\n return {\n beforeRequest(wretch, _, state) {\n return wretch.middlewares([transformMiddleware(state)])\n },\n resolver: {\n progress(onProgress: (loaded: number, total: number) => void) {\n this._sharedState.progress = onProgress\n return this\n }\n },\n }\n}\n\nexport default progress\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport * as Addons from \"./addons/index.js\"\nimport { WretchError } from \"./resolver.js\"\n\nfunction factory(_url = \"\", _options = {}) {\n return { ...core, _url, _options }\n .addon(Addons.abortAddon())\n .addon(Addons.basicAuthAddon)\n .addon(Addons.formDataAddon)\n .addon(Addons.formUrlAddon)\n .addon(Addons.perfsAddon())\n .addon(Addons.queryStringAddon)\n .addon(Addons.progressAddon())\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","abort","state","fetchController","signal","ref","clearTimeout","controller","setTimeout","time","onAbort","utf8ToBase64","input","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","makeBasicAuthMiddleware","next","_URL","parsedUrl","username","password","basicAuthBase64","decodeURIComponent","toString","basicAuth","convertFormData","formObject","recursive","ancestors","forEach","formKey","ancestor","globalThis","FileList","item","append","includes","encodeQueryValue","encodeURIComponent","formUrl","keys","map","v","join","perfs","callbacks","observer","onMatch","performance","getEntriesByName","matches","reverse","clearMeasures","size","disconnect","clearResourceTimings","performanceObserver","initObserver","observe","entryTypes","monitor","appendQueryParams","qp","omitUndefinedOrNullValues","queryString","usp","val","query","progress","transformMiddleware","loaded","total","contentLength","transform","TransformStream","chunk","enqueue","Response","pipeThrough","e","onProgress","factory","Addons.abortAddon","Addons.basicAuthAddon","Addons.formDataAddon","Addons.formUrlAddon","Addons.perfsAddon","Addons.queryStringAddon","Addons.progressAddon"],"mappings":"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"}
{"version":3,"file":"wretch.all.min.js","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/addons/abort.ts","../../src/addons/basicAuth.ts","../../src/addons/formData.ts","../../src/addons/formUrl.ts","../../src/addons/perfs.ts","../../src/addons/queryString.ts","../../src/addons/progress.ts","../../src/index.all.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import type { Wretch, WretchAddon, WretchErrorCallback, WretchResponseChain } from \"../types.js\"\n\nexport interface AbortWretch {\n /**\n * Associates a custom controller with the request.\n *\n * Useful when you need to use\n * your own AbortController, otherwise wretch will create a new controller itself.\n *\n * ```js\n * const controller = new AbortController()\n *\n * // Associates the same controller with multiple requests\n * wretch(\"url1\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n * wretch(\"url2\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n *\n * // Aborts both requests\n * controller.abort()\n * ```\n *\n * @param controller - An instance of AbortController\n */\n signal: <T extends AbortWretch, C, R>(this: T & Wretch<T, C, R>, controller: AbortController) => this\n}\n\nexport interface AbortResolver {\n /**\n * Aborts the request after a fixed time.\n *\n * If you use a custom AbortController associated with the request, pass it as the second argument.\n *\n * ```js\n * // 1 second timeout\n * wretch(\"...\").addon(AbortAddon()).get().setTimeout(1000).json(_ =>\n * // will not be called if the request timeouts\n * )\n * ```\n *\n * @param time - Time in milliseconds\n * @param controller - An instance of AbortController\n */\n setTimeout: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, time: number, controller?: AbortController) => this\n /**\n * Returns the provided or generated AbortController plus the wretch response chain as a pair.\n *\n * ```js\n * // We need the controller outside the chain\n * const [c, w] = wretch(\"url\")\n * .addon(AbortAddon())\n * .get()\n * .controller()\n *\n * // Resume with the chain\n * w.onAbort(_ => console.log(\"ouch\")).json()\n *\n * // Later on…\n * c.abort()\n * ```\n */\n controller: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>) => [any, this]\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, cb: WretchErrorCallback<T, C, R>) => this\n}\n\n/**\n * Adds the ability to abort requests using AbortController and signals under the hood.\n *\n *\n * _Only compatible with browsers that support\n * [AbortControllers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Otherwise, you could use a (partial)\n * [polyfill](https://www.npmjs.com/package/abortcontroller-polyfill)._\n *\n * ```js\n * import AbortAddon from \"wretch/addons/abort\"\n *\n * const [c, w] = wretch(\"...\")\n * .addon(AbortAddon())\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .controller();\n *\n * w.text((_) => console.log(\"should never be called\"));\n * c.abort();\n *\n * // Or :\n *\n * const controller = new AbortController();\n *\n * wretch(\"...\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .text((_) => console.log(\"should never be called\"));\n *\n * controller.abort();\n * ```\n */\nconst abort: () => WretchAddon<AbortWretch, AbortResolver> = () => {\n return {\n beforeRequest(wretch, options, state) {\n const fetchController = wretch._config.polyfill(\"AbortController\", false, true)\n if (!options[\"signal\"] && fetchController) {\n options[\"signal\"] = fetchController.signal\n }\n const timeout = {\n ref: null,\n clear() {\n if (timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n state.abort = {\n timeout,\n fetchController\n }\n return wretch\n },\n wretch: {\n signal(controller) {\n return { ...this, _options: { ...this._options, signal: controller.signal } }\n },\n },\n resolver: {\n setTimeout(time, controller = this._sharedState.abort.fetchController) {\n const { timeout } = this._sharedState.abort\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return this\n },\n controller() { return [this._sharedState.abort.fetchController, this] },\n onAbort(cb) { return this.error(\"AbortError\", cb) }\n },\n }\n}\n\nexport default abort\n","import type { Config, ConfiguredMiddleware, Wretch, WretchAddon } from \"../types.js\"\n\nfunction utf8ToBase64(input: string) {\n const utf8Bytes = new TextEncoder().encode(input)\n return btoa(String.fromCharCode(...utf8Bytes))\n}\n\nexport interface BasicAuthAddon {\n /**\n * Sets the `Authorization` header to `Basic ` + <base64 encoded credentials>.\n * Additionally, allows using URLs with credentials in them.\n *\n * ```js\n * const user = \"user\"\n * const pass = \"pass\"\n *\n * // Automatically sets the Authorization header to \"Basic \" + <base64 encoded credentials>\n * wretch(\"...\").addon(BasicAuthAddon).basicAuth(user, pass).get()\n *\n * // Allows using URLs with credentials in them\n * wretch(`https://${user}:${pass}@...`).addon(BasicAuthAddon).get()\n * ```\n *\n * @param username - Username to use for basic auth\n * @param password - Password to use for basic auth\n */\n basicAuth<T extends BasicAuthAddon, C, R>(\n this: T & Wretch<T, C, R>,\n username: string,\n password: string\n ): this\n}\n\nconst makeBasicAuthMiddleware: (config: Config) => ConfiguredMiddleware = config => next => (url, opts) => {\n const _URL = config.polyfill(\"URL\")\n let parsedUrl: URL | null\n try {\n parsedUrl = new _URL(url)\n } catch {\n parsedUrl = null\n }\n\n if (parsedUrl?.username || parsedUrl?.password) {\n const basicAuthBase64 = utf8ToBase64(\n `${decodeURIComponent(parsedUrl.username)}:${decodeURIComponent(parsedUrl.password)}`,\n )\n opts.headers = {\n ...opts.headers,\n Authorization: `Basic ${basicAuthBase64}`,\n }\n parsedUrl.username = \"\"\n parsedUrl.password = \"\"\n url = parsedUrl.toString()\n }\n\n return next(url, opts)\n}\n\n\n/**\n * Adds the ability to use basic auth with the `Authorization` header.\n *\n * ```js\n * import BasicAuthAddon from \"wretch/addons/basicAuth\"\n *\n * wretch().addon(BasicAuthAddon)\n * ```\n */\nconst basicAuth: WretchAddon<BasicAuthAddon> = {\n beforeRequest(wretch) {\n return wretch.middlewares([makeBasicAuthMiddleware(wretch._config)])\n },\n wretch: {\n basicAuth(username, password) {\n const basicAuthBase64 = utf8ToBase64(`${username}:${password}`)\n return this.auth(`Basic ${basicAuthBase64}`)\n },\n },\n}\n\nexport default basicAuth\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction convertFormData(\n formObject: object,\n recursive: string[] | boolean = false,\n config: Config,\n formData = config.polyfill(\"FormData\", true, true),\n ancestors = [] as string[],\n) {\n Object.entries(formObject).forEach(([key, value]) => {\n let formKey = ancestors.reduce((acc, ancestor) => (\n acc ? `${acc}[${ancestor}]` : ancestor\n ), null)\n formKey = formKey ? `${formKey}[${key}]` : key\n if (value instanceof Array || (globalThis.FileList && value instanceof FileList)) {\n for (const item of value as File[])\n formData.append(formKey, item)\n } else if (\n recursive &&\n typeof value === \"object\" &&\n (\n !(recursive instanceof Array) ||\n !recursive.includes(key)\n )\n ) {\n if (value !== null) {\n convertFormData(value, recursive, config, formData, [...ancestors, key])\n }\n } else {\n formData.append(formKey, value)\n }\n })\n\n return formData\n}\n\nexport interface FormDataAddon {\n /**\n * Converts the javascript object to a FormData and sets the request body.\n *\n * ```js\n * const form = {\n * hello: \"world\",\n * duck: \"Muscovy\",\n * };\n *\n * wretch(\"...\").addons(FormDataAddon).formData(form).post();\n * ```\n *\n * The `recursive` argument when set to `true` will enable recursion through all\n * nested objects and produce `object[key]` keys. It can be set to an array of\n * string to exclude specific keys.\n *\n * > Warning: Be careful to exclude `Blob` instances in the Browser, and\n * > `ReadableStream` and `Buffer` instances when using the node.js compatible\n * > `form-data` package.\n *\n * ```js\n * const form = {\n * duck: \"Muscovy\",\n * duckProperties: {\n * beak: {\n * color: \"yellow\",\n * },\n * legs: 2,\n * },\n * ignored: {\n * key: 0,\n * },\n * };\n *\n * // Will append the following keys to the FormData payload:\n * // \"duck\", \"duckProperties[beak][color]\", \"duckProperties[legs]\"\n * wretch(\"...\").addons(FormDataAddon).formData(form, [\"ignored\"]).post();\n * ```\n *\n * > Note: This addon does not support specifying a custom `filename`.\n * > If you need to do so, you can use the `body` method directly:\n * > ```js\n * > const form = new FormData();\n * > form.append(\"hello\", \"world\", \"hello.txt\");\n * > wretch(\"...\").body(form).post();\n * > ```\n * > See: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#example\n *\n * @param formObject - An object which will be converted to a FormData\n * @param recursive - If `true`, will recurse through all nested objects. Can be set as an array of string to exclude specific keys.\n */\n formData<T extends FormDataAddon, C, R>(this: T & Wretch<T, C, R>, formObject: object, recursive?: string[] | boolean): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormData and use it as a request body.\n *\n * ```js\n * import FormDataAddon from \"wretch/addons/formData\"\n *\n * wretch().addon(FormDataAddon)\n * ```\n */\nconst formData: WretchAddon<FormDataAddon> = {\n wretch: {\n formData(formObject, recursive = false) {\n return this.body(convertFormData(formObject, recursive, this._config))\n }\n }\n}\n\nexport default formData\n","import type { Wretch, WretchAddon } from \"../types.js\"\n\nfunction encodeQueryValue(key: string, value: unknown) {\n return encodeURIComponent(key) +\n \"=\" +\n encodeURIComponent(\n typeof value === \"object\" ?\n JSON.stringify(value) :\n \"\" + value\n )\n}\nfunction convertFormUrl(formObject: object) {\n return Object.keys(formObject)\n .map(key => {\n const value = formObject[key]\n if (value instanceof Array) {\n return value.map(v => encodeQueryValue(key, v)).join(\"&\")\n }\n return encodeQueryValue(key, value)\n })\n .join(\"&\")\n}\n\nexport interface FormUrlAddon {\n /**\n * Converts the input parameter to an url encoded string and sets the content-type\n * header and body. If the input argument is already a string, skips the conversion\n * part.\n *\n * ```js\n * const form = { a: 1, b: { c: 2 } };\n * const alreadyEncodedForm = \"a=1&b=%7B%22c%22%3A2%7D\";\n *\n * // Automatically sets the content-type header to \"application/x-www-form-urlencoded\"\n * wretch(\"...\").addon(FormUrlAddon).formUrl(form).post();\n * wretch(\"...\").addon(FormUrlAddon).formUrl(alreadyEncodedForm).post();\n * ```\n *\n * @param input - An object to convert into an url encoded string or an already encoded string\n */\n formUrl<T extends FormUrlAddon, C, R>(this: T & Wretch<T, C, R>, input: (object | string)): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormUrl and use it as a request body.\n *\n * ```js\n * import FormUrlAddon from \"wretch/addons/formUrl\"\n *\n * wretch().addon(FormUrlAddon)\n * ```\n */\nconst formUrl: WretchAddon<FormUrlAddon> = {\n wretch: {\n formUrl(input) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n }\n}\n\nexport default formUrl\n","import type { WretchResponseChain, WretchAddon, Config } from \"../types.js\"\n\nexport type PerfCallback = (timing: any) => void\n\nexport interface PerfsAddon {\n /**\n * Performs a callback on the API performance timings of the request.\n *\n * Warning: Still experimental on browsers and node.js\n */\n perfs: <T, C extends PerfsAddon, R>(this: C & WretchResponseChain<T, C, R>, cb?: PerfCallback) => this,\n}\n\n/**\n * Adds the ability to measure requests using the Performance Timings API.\n *\n * Uses the Performance API\n * ([browsers](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) &\n * [node.js](https://nodejs.org/api/perf_hooks.html)) to expose timings related to\n * the underlying request.\n *\n * Browser timings are very accurate, node.js only contains raw measures.\n *\n * ```js\n * import PerfsAddon from \"wretch/addons/perfs\"\n *\n * // Use perfs() before the response types (text, json, ...)\n * wretch(\"...\")\n * .addon(PerfsAddon())\n * .get()\n * .perfs((timings) => {\n * // Will be called when the timings are ready.\n * console.log(timings.startTime);\n * })\n * .res();\n *\n * ```\n *\n * For node.js, there is a little extra work to do :\n *\n * ```js\n * // Node.js only\n * const { performance, PerformanceObserver } = require(\"perf_hooks\");\n *\n * wretch.polyfills({\n * fetch: function (url, opts) {\n * performance.mark(url + \" - begin\");\n * return fetch(url, opts).then(res => {\n * performance.mark(url + \" - end\");\n * setTimeout(() => performance.measure(res.url, url + \" - begin\", url + \" - end\"), 0);\n * return res;\n * });\n * },\n * // other polyfills…\n * performance: performance,\n * PerformanceObserver: PerformanceObserver,\n * });\n * ```\n */\nconst perfs: () => WretchAddon<unknown, PerfsAddon> = () => {\n const callbacks = new Map<string, PerfCallback>()\n let observer /*: PerformanceObserver | null*/ = null\n\n const onMatch = (\n entries /*: PerformanceObserverEntryList */,\n name: string,\n callback: PerfCallback,\n performance: typeof globalThis.performance\n ) => {\n if (!entries.getEntriesByName)\n return false\n const matches = entries.getEntriesByName(name)\n if (matches && matches.length > 0) {\n callback(matches.reverse()[0])\n if (performance.clearMeasures)\n performance.clearMeasures(name)\n callbacks.delete(name)\n\n if (callbacks.size < 1) {\n observer.disconnect()\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n }\n\n const initObserver = (\n performance: (typeof globalThis.performance) | null | undefined,\n performanceObserver /*: (typeof PerformanceObserver) | null | undefined */\n ) => {\n if (!observer && performance && performanceObserver) {\n observer = new performanceObserver(entries => {\n callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, performance)\n })\n })\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n\n return observer\n }\n\n const monitor = (\n name: string | null | undefined,\n callback: PerfCallback | null | undefined,\n config: Config\n ) => {\n if (!name || !callback)\n return\n\n const performance = config.polyfill(\"performance\", false)\n const performanceObserver = config.polyfill(\"PerformanceObserver\", false)\n\n if (!initObserver(performance, performanceObserver))\n return\n\n if (!onMatch(performance, name, callback, performance)) {\n if (callbacks.size < 1)\n observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n callbacks.set(name, callback)\n }\n }\n\n return {\n resolver: {\n perfs(cb) {\n this._fetchReq\n .then(() =>\n monitor(this._wretchReq._url, cb, this._wretchReq._config)\n )\n .catch(() => {/* swallow */ })\n return this\n },\n }\n }\n}\n\nexport default perfs\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction stringify(value?: string | null): string | null {\n return typeof value !== \"undefined\" ? value : \"\"\n}\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean, omitUndefinedOrNullValues: boolean, config: Config) => {\n let queryString: string\n\n if (typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = config.polyfill(\"URLSearchParams\", true, true)\n for (const key in qp) {\n const value = qp[key]\n if (omitUndefinedOrNullValues && (value === null || value === undefined)) continue\n if (qp[key] instanceof Array) {\n for (const val of value)\n usp.append(key, stringify(val))\n } else {\n usp.append(key, stringify(value))\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n\n if (!queryString)\n return replace ? split[0] : url\n\n if (replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nexport interface QueryStringAddon {\n /**\n * Converts a javascript object to query parameters, then appends this query string\n * to the current url. String values are used as the query string verbatim.\n *\n * Pass `true` as the second argument to replace existing query parameters.\n * Pass `true` as the third argument to completely omit the key=value pair for undefined or null values.\n *\n * ```\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * let w = wretch(\"http://example.com\").addon(QueryStringAddon);\n * // url is http://example.com\n * w = w.query({ a: 1, b: 2 });\n * // url is now http://example.com?a=1&b=2\n * w = w.query({ c: 3, d: [4, 5] });\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5\n * w = w.query(\"five&six&seven=eight\");\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5&five&six&seven=eight\n * w = w.query({ reset: true }, true);\n * // url is now http://example.com?reset=true\n * ```\n *\n * ##### **Note that .query is not meant to handle complex cases with nested objects.**\n *\n * For this kind of usage, you can use `wretch` in conjunction with other libraries\n * (like [`qs`](https://github.com/ljharb/qs)).\n *\n * ```js\n * // Using wretch with qs\n *\n * const queryObject = { some: { nested: \"objects\" } };\n * const w = wretch(\"https://example.com/\").addon(QueryStringAddon)\n *\n * // Use .qs inside .query :\n *\n * w.query(qs.stringify(queryObject));\n *\n * // Use .defer :\n *\n * const qsWretch = w.defer((w, url, { qsQuery, qsOptions }) => (\n * qsQuery ? w.query(qs.stringify(qsQuery, qsOptions)) : w\n * ));\n *\n * qsWretch\n * .url(\"https://example.com/\")\n * .options({ qs: { query: queryObject } });\n * ```\n *\n * @param qp - An object which will be converted, or a string which will be used verbatim.\n */\n query<T extends QueryStringAddon, C, R>(this: T & Wretch<T, C, R>, qp: object | string, replace?: boolean, omitUndefinedOrNullValues?: boolean): this\n}\n\n/**\n * Adds the ability to append query parameters from a javascript object.\n *\n * ```js\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * wretch().addon(QueryAddon)\n * ```\n */\nconst queryString: WretchAddon<QueryStringAddon> = {\n wretch: {\n query(qp, replace = false, omitUndefinedOrNullValues = false) {\n return { ...this, _url: appendQueryParams(this._url, qp, replace, omitUndefinedOrNullValues, this._config) }\n }\n }\n}\n\nexport default queryString\n","import type { ConfiguredMiddleware, WretchAddon, WretchResponseChain } from \"../types.js\"\n\nexport interface ProgressResolver {\n /**\n * Provides a way to register a callback to be invoked one or multiple times during the download.\n * The callback receives the current progress as two arguments, the number of bytes loaded and the total number of bytes to load.\n *\n * _Under the hood: this method adds a middleware to the chain that will intercept the response and replace the body with a new one that will emit the progress event._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n *\n * @param onProgress - A callback that will be called one or multiple times with the number of bytes loaded and the total number of bytes to load.\n */\n progress: <T, C extends ProgressResolver, R>(\n this: C & WretchResponseChain<T, C, R>,\n onProgress: (loaded: number, total: number) => void\n ) => this\n}\n\n/**\n * Adds the ability to monitor progress when downloading a response.\n *\n * _Compatible with all platforms implementing the [TransformStream WebAPI](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility)._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n */\nconst progress: () => WretchAddon<unknown, ProgressResolver> = () => {\n function transformMiddleware(state: Record<any, any>) : ConfiguredMiddleware {\n return next => (url, opts) => {\n let loaded = 0\n let total = 0\n return next(url, opts).then(response => {\n try {\n const contentLength = response.headers.get(\"content-length\")\n total = contentLength ? +contentLength : null\n const transform = new TransformStream({\n transform(chunk, controller) {\n loaded += chunk.length\n if (total < loaded) {\n total = loaded\n }\n if (state.progress) {\n state.progress(loaded, total)\n }\n controller.enqueue(chunk)\n }\n })\n return new Response(response.body.pipeThrough(transform), response)\n } catch (e) {\n return response\n }\n })\n }\n }\n\n return {\n beforeRequest(wretch, _, state) {\n return wretch.middlewares([transformMiddleware(state)])\n },\n resolver: {\n progress(onProgress: (loaded: number, total: number) => void) {\n this._sharedState.progress = onProgress\n return this\n }\n },\n }\n}\n\nexport default progress\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport * as Addons from \"./addons/index.js\"\nimport { WretchError } from \"./resolver.js\"\n\nfunction factory(_url = \"\", _options = {}) {\n return { ...core, _url, _options }\n .addon(Addons.abortAddon())\n .addon(Addons.basicAuthAddon)\n .addon(Addons.formDataAddon)\n .addon(Addons.formUrlAddon)\n .addon(Addons.perfsAddon())\n .addon(Addons.queryStringAddon)\n .addon(Addons.progressAddon())\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","abort","state","fetchController","signal","ref","clearTimeout","controller","setTimeout","time","onAbort","utf8ToBase64","input","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","makeBasicAuthMiddleware","next","_URL","parsedUrl","username","password","basicAuthBase64","decodeURIComponent","toString","basicAuth","convertFormData","formObject","recursive","ancestors","forEach","formKey","ancestor","globalThis","FileList","item","append","includes","encodeQueryValue","encodeURIComponent","formUrl","keys","map","v","join","perfs","callbacks","observer","onMatch","performance","getEntriesByName","matches","reverse","clearMeasures","size","disconnect","clearResourceTimings","performanceObserver","initObserver","observe","entryTypes","monitor","appendQueryParams","qp","omitUndefinedOrNullValues","queryString","usp","val","query","progress","transformMiddleware","loaded","total","contentLength","transform","TransformStream","chunk","enqueue","Response","pipeThrough","e","onProgress","factory","Addons.abortAddon","Addons.basicAuthAddon","Addons.formDataAddon","Addons.formUrlAddon","Addons.perfsAddon","Addons.queryStringAddon","Addons.progressAddon"],"mappings":"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"}

@@ -1,2 +0,2 @@

const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function n(e){return/^application\/.*json.*/.test(e)}const s=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,n])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(n)?t[o]=r?[...i,...n]:n:t[o]="object"==typeof i&&"object"==typeof n?s(i,n,r):n,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const n=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!n)throw new Error(e+" is not defined");return r&&n?new n(...o):n}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:n,_options:i,_config:l,_catchers:a,_resolvers:u,_middlewares:h,_addons:f}=e,d=new Map(a),p=s(l.options,i);let y=n;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(h)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(n,p),g=new Error,m=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=g,r.stack=r.stack+"\nCAUSE: "+g.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{throw r.message="string"==typeof t?t:e.statusText,t&&(o&&"string"==typeof t?(r.text=t,r.json=JSON.parse(t)):r[l.errorType]=t),r}))}return e})),b=o=>n=>(o?m.then((e=>e&&e[o]())).then((e=>n?n(e):e)):m.then((e=>n?n(e):e))).catch((o=>{const n=Object.prototype.hasOwnProperty.call(o,t),s=n?o[t]:o,i=(null==s?void 0:s.status)&&d.get(s.status)||d.get(null==s?void 0:s.name)||n&&d.has(t)&&d.get(t);if(i)return i(s,e);const c=d.get(r);if(c)return c(s,e);throw s})),w={_wretchReq:e,_fetchReq:_,_sharedState:o,res:b(null),json:b("json"),blob:b("blob"),formData:b("formData"),arrayBuffer:b("arrayBuffer"),text:b("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},T=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),w);return u.reduce(((t,r)=>r(t,e)),T)},a={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:s(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:s(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:s(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let s=this.url(t).options({method:e});const i=o(s._options.headers),c=this._config.polyfill("FormData",0),a="object"==typeof r&&!(c&&r instanceof c)&&(!s._options.headers||!i||n(i));return s=r?a?s.json(r,i):s.body(r):s,l(s._deferred.reduce(((e,t)=>t(e,e._url,e._options)),s))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||n(r)&&r||"application/json").body(JSON.stringify(e))}},u=()=>({beforeRequest(e,t,r){const o=e._config.polyfill("AbortController",0,1);!t.signal&&o&&(t.signal=o.signal);const n={ref:null,clear(){n.ref&&(clearTimeout(n.ref),n.ref=null)}};return r.abort={timeout:n,fetchController:o},e},wretch:{signal(e){return{...this,_options:{...this._options,signal:e.signal}}}},resolver:{setTimeout(e,t=this._sharedState.abort.fetchController){const{timeout:r}=this._sharedState.abort;return r.clear(),r.ref=setTimeout((()=>t.abort()),e),this},controller(){return[this._sharedState.abort.fetchController,this]},onAbort(e){return this.error("AbortError",e)}}});function h(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}const f=e=>t=>(r,o)=>{const n=e.polyfill("URL");let s;try{s=new n(r)}catch(e){s=null}if((null==s?void 0:s.username)||(null==s?void 0:s.password)){const e=h(`${decodeURIComponent(s.username)}:${decodeURIComponent(s.password)}`);o.headers={...o.headers,Authorization:`Basic ${e}`},s.username="",s.password="",r=s.toString()}return t(r,o)},d={beforeRequest:e=>e.middlewares([f(e._config)]),wretch:{basicAuth(e,t){const r=h(`${e}:${t}`);return this.auth(`Basic ${r}`)}}};function p(e,t=0,r,o=r.polyfill("FormData",1,1),n=[]){return Object.entries(e).forEach((([e,s])=>{let i=n.reduce(((e,t)=>e?`${e}[${t}]`:t),null);if(i=i?`${i}[${e}]`:e,s instanceof Array||globalThis.FileList&&s instanceof FileList)for(const e of s)o.append(i,e);else!t||"object"!=typeof s||t instanceof Array&&t.includes(e)?o.append(i,s):null!==s&&p(s,t,r,o,[...n,e])})),o}const y={wretch:{formData(e,t=0){return this.body(p(e,t,this._config))}}};function _(e,t){return encodeURIComponent(e)+"="+encodeURIComponent("object"==typeof t?JSON.stringify(t):""+t)}const g={wretch:{formUrl(e){return this.body("string"==typeof e?e:(t=e,Object.keys(t).map((e=>{const r=t[e];return r instanceof Array?r.map((t=>_(e,t))).join("&"):_(e,r)})).join("&"))).content("application/x-www-form-urlencoded");var t}}},m=()=>{const e=new Map;let t=null;const r=(r,o,n,s)=>{if(!r.getEntriesByName)return 0;const i=r.getEntriesByName(o);return i&&i.length>0?(n(i.reverse()[0]),s.clearMeasures&&s.clearMeasures(o),e.delete(o),e.size<1&&(t.disconnect(),s.clearResourceTimings&&s.clearResourceTimings()),1):0};return{resolver:{perfs(o){return this._fetchReq.then((()=>((o,n,s)=>{if(!o||!n)return;const i=s.polyfill("performance",0);((o,n)=>(!t&&o&&n&&(t=new n((t=>{e.forEach(((e,n)=>{r(t,n,e,o)}))})),o.clearResourceTimings&&o.clearResourceTimings()),t))(i,s.polyfill("PerformanceObserver",0))&&(r(i,o,n,i)||(e.size<1&&t.observe({entryTypes:["resource","measure"]}),e.set(o,n)))})(this._wretchReq._url,o,this._wretchReq._config))).catch((()=>{})),this}}}};function b(e){return void 0!==e?e:""}const w=(e,t,r,o,n)=>{let s;if("string"==typeof t)s=t;else{const e=n.polyfill("URLSearchParams",1,1);for(const r in t){const n=t[r];if(!o||null!=n)if(t[r]instanceof Array)for(const t of n)e.append(r,b(t));else e.append(r,b(n))}s=e.toString()}const i=e.split("?");return s?r||i.length<2?i[0]+"?"+s:e+"&"+s:r?i[0]:e},T={wretch:{query(e,t=0,r=0){return{...this,_url:w(this._url,e,t,r,this._config)}}}},v=()=>{function e(e){return t=>(r,o)=>{let n=0,s=0;return t(r,o).then((t=>{try{const r=t.headers.get("content-length");s=r?+r:null;const o=new TransformStream({transform(t,r){n+=t.length,s<n&&(s=n),e.progress&&e.progress(n,s),r.enqueue(t)}});return new Response(t.body.pipeThrough(o),t)}catch(e){return t}}))}}return{beforeRequest:(t,r,o)=>t.middlewares([e(o)]),resolver:{progress(e){return this._sharedState.progress=e,this}}}};function j(e="",t={}){return{...a,_url:e,_options:t}.addon(u()).addon(d).addon(y).addon(g).addon(m()).addon(T).addon(v())}j.default=j,j.options=function(e,t=0){i.options=t?e:s(i.options,e)},j.errorType=function(e){i.errorType=e},j.polyfills=function(e,t=0){i.polyfills=t?e:s(i.polyfills,e)},j.WretchError=c;export{j as default};
const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function n(e){return/^application\/.*json.*/.test(e)}const s=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,n])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(n)?t[o]=r?[...i,...n]:n:t[o]="object"==typeof i&&"object"==typeof n?s(i,n,r):n,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const n=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!n)throw new Error(e+" is not defined");return r&&n?new n(...o):n}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:n,_options:i,_config:l,_catchers:a,_resolvers:u,_middlewares:h,_addons:f}=e,d=new Map(a),p=s(l.options,i);let y=n;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(h)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(n,p),g=new Error,m=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=g,r.stack=r.stack+"\nCAUSE: "+g.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{if(r.message="string"==typeof t?t:e.statusText,t)if(o&&"string"==typeof t){r.text=t;try{r.json=JSON.parse(t)}catch(e){}}else r[l.errorType]=t;throw r}))}return e})),b=o=>n=>(o?m.then((e=>e&&e[o]())).then((e=>n?n(e):e)):m.then((e=>n?n(e):e))).catch((o=>{const n=Object.prototype.hasOwnProperty.call(o,t),s=n?o[t]:o,i=(null==s?void 0:s.status)&&d.get(s.status)||d.get(null==s?void 0:s.name)||n&&d.has(t)&&d.get(t);if(i)return i(s,e);const c=d.get(r);if(c)return c(s,e);throw s})),w={_wretchReq:e,_fetchReq:_,_sharedState:o,res:b(null),json:b("json"),blob:b("blob"),formData:b("formData"),arrayBuffer:b("arrayBuffer"),text:b("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},T=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),w);return u.reduce(((t,r)=>r(t,e)),T)},a={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:s(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:s(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:s(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let s=this.url(t).options({method:e});const i=o(s._options.headers),c=this._config.polyfill("FormData",0),a="object"==typeof r&&!(c&&r instanceof c)&&(!s._options.headers||!i||n(i));return s=r?a?s.json(r,i):s.body(r):s,l(s._deferred.reduce(((e,t)=>t(e,e._url,e._options)),s))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||n(r)&&r||"application/json").body(JSON.stringify(e))}},u=()=>({beforeRequest(e,t,r){const o=e._config.polyfill("AbortController",0,1);!t.signal&&o&&(t.signal=o.signal);const n={ref:null,clear(){n.ref&&(clearTimeout(n.ref),n.ref=null)}};return r.abort={timeout:n,fetchController:o},e},wretch:{signal(e){return{...this,_options:{...this._options,signal:e.signal}}}},resolver:{setTimeout(e,t=this._sharedState.abort.fetchController){const{timeout:r}=this._sharedState.abort;return r.clear(),r.ref=setTimeout((()=>t.abort()),e),this},controller(){return[this._sharedState.abort.fetchController,this]},onAbort(e){return this.error("AbortError",e)}}});function h(e){const t=(new TextEncoder).encode(e);return btoa(String.fromCharCode(...t))}const f=e=>t=>(r,o)=>{const n=e.polyfill("URL");let s;try{s=new n(r)}catch(e){s=null}if((null==s?void 0:s.username)||(null==s?void 0:s.password)){const e=h(`${decodeURIComponent(s.username)}:${decodeURIComponent(s.password)}`);o.headers={...o.headers,Authorization:`Basic ${e}`},s.username="",s.password="",r=s.toString()}return t(r,o)},d={beforeRequest:e=>e.middlewares([f(e._config)]),wretch:{basicAuth(e,t){const r=h(`${e}:${t}`);return this.auth(`Basic ${r}`)}}};function p(e,t=0,r,o=r.polyfill("FormData",1,1),n=[]){return Object.entries(e).forEach((([e,s])=>{let i=n.reduce(((e,t)=>e?`${e}[${t}]`:t),null);if(i=i?`${i}[${e}]`:e,s instanceof Array||globalThis.FileList&&s instanceof FileList)for(const e of s)o.append(i,e);else!t||"object"!=typeof s||t instanceof Array&&t.includes(e)?o.append(i,s):null!==s&&p(s,t,r,o,[...n,e])})),o}const y={wretch:{formData(e,t=0){return this.body(p(e,t,this._config))}}};function _(e,t){return encodeURIComponent(e)+"="+encodeURIComponent("object"==typeof t?JSON.stringify(t):""+t)}const g={wretch:{formUrl(e){return this.body("string"==typeof e?e:(t=e,Object.keys(t).map((e=>{const r=t[e];return r instanceof Array?r.map((t=>_(e,t))).join("&"):_(e,r)})).join("&"))).content("application/x-www-form-urlencoded");var t}}},m=()=>{const e=new Map;let t=null;const r=(r,o,n,s)=>{if(!r.getEntriesByName)return 0;const i=r.getEntriesByName(o);return i&&i.length>0?(n(i.reverse()[0]),s.clearMeasures&&s.clearMeasures(o),e.delete(o),e.size<1&&(t.disconnect(),s.clearResourceTimings&&s.clearResourceTimings()),1):0};return{resolver:{perfs(o){return this._fetchReq.then((()=>((o,n,s)=>{if(!o||!n)return;const i=s.polyfill("performance",0);((o,n)=>(!t&&o&&n&&(t=new n((t=>{e.forEach(((e,n)=>{r(t,n,e,o)}))})),o.clearResourceTimings&&o.clearResourceTimings()),t))(i,s.polyfill("PerformanceObserver",0))&&(r(i,o,n,i)||(e.size<1&&t.observe({entryTypes:["resource","measure"]}),e.set(o,n)))})(this._wretchReq._url,o,this._wretchReq._config))).catch((()=>{})),this}}}};function b(e){return void 0!==e?e:""}const w=(e,t,r,o,n)=>{let s;if("string"==typeof t)s=t;else{const e=n.polyfill("URLSearchParams",1,1);for(const r in t){const n=t[r];if(!o||null!=n)if(t[r]instanceof Array)for(const t of n)e.append(r,b(t));else e.append(r,b(n))}s=e.toString()}const i=e.split("?");return s?r||i.length<2?i[0]+"?"+s:e+"&"+s:r?i[0]:e},T={wretch:{query(e,t=0,r=0){return{...this,_url:w(this._url,e,t,r,this._config)}}}},v=()=>{function e(e){return t=>(r,o)=>{let n=0,s=0;return t(r,o).then((t=>{try{const r=t.headers.get("content-length");s=r?+r:null;const o=new TransformStream({transform(t,r){n+=t.length,s<n&&(s=n),e.progress&&e.progress(n,s),r.enqueue(t)}});return new Response(t.body.pipeThrough(o),t)}catch(e){return t}}))}}return{beforeRequest:(t,r,o)=>t.middlewares([e(o)]),resolver:{progress(e){return this._sharedState.progress=e,this}}}};function j(e="",t={}){return{...a,_url:e,_options:t}.addon(u()).addon(d).addon(y).addon(g).addon(m()).addon(T).addon(v())}j.default=j,j.options=function(e,t=0){i.options=t?e:s(i.options,e)},j.errorType=function(e){i.errorType=e},j.polyfills=function(e,t=0){i.polyfills=t?e:s(i.polyfills,e)},j.WretchError=c;export{j as default};
//# sourceMappingURL=wretch.all.min.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"wretch.all.min.mjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/addons/abort.ts","../../src/addons/basicAuth.ts","../../src/addons/formData.ts","../../src/addons/formUrl.ts","../../src/addons/perfs.ts","../../src/addons/queryString.ts","../../src/addons/progress.ts","../../src/index.all.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import type { Wretch, WretchAddon, WretchErrorCallback, WretchResponseChain } from \"../types.js\"\n\nexport interface AbortWretch {\n /**\n * Associates a custom controller with the request.\n *\n * Useful when you need to use\n * your own AbortController, otherwise wretch will create a new controller itself.\n *\n * ```js\n * const controller = new AbortController()\n *\n * // Associates the same controller with multiple requests\n * wretch(\"url1\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n * wretch(\"url2\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n *\n * // Aborts both requests\n * controller.abort()\n * ```\n *\n * @param controller - An instance of AbortController\n */\n signal: <T extends AbortWretch, C, R>(this: T & Wretch<T, C, R>, controller: AbortController) => this\n}\n\nexport interface AbortResolver {\n /**\n * Aborts the request after a fixed time.\n *\n * If you use a custom AbortController associated with the request, pass it as the second argument.\n *\n * ```js\n * // 1 second timeout\n * wretch(\"...\").addon(AbortAddon()).get().setTimeout(1000).json(_ =>\n * // will not be called if the request timeouts\n * )\n * ```\n *\n * @param time - Time in milliseconds\n * @param controller - An instance of AbortController\n */\n setTimeout: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, time: number, controller?: AbortController) => this\n /**\n * Returns the provided or generated AbortController plus the wretch response chain as a pair.\n *\n * ```js\n * // We need the controller outside the chain\n * const [c, w] = wretch(\"url\")\n * .addon(AbortAddon())\n * .get()\n * .controller()\n *\n * // Resume with the chain\n * w.onAbort(_ => console.log(\"ouch\")).json()\n *\n * // Later on…\n * c.abort()\n * ```\n */\n controller: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>) => [any, this]\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, cb: WretchErrorCallback<T, C, R>) => this\n}\n\n/**\n * Adds the ability to abort requests using AbortController and signals under the hood.\n *\n *\n * _Only compatible with browsers that support\n * [AbortControllers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Otherwise, you could use a (partial)\n * [polyfill](https://www.npmjs.com/package/abortcontroller-polyfill)._\n *\n * ```js\n * import AbortAddon from \"wretch/addons/abort\"\n *\n * const [c, w] = wretch(\"...\")\n * .addon(AbortAddon())\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .controller();\n *\n * w.text((_) => console.log(\"should never be called\"));\n * c.abort();\n *\n * // Or :\n *\n * const controller = new AbortController();\n *\n * wretch(\"...\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .text((_) => console.log(\"should never be called\"));\n *\n * controller.abort();\n * ```\n */\nconst abort: () => WretchAddon<AbortWretch, AbortResolver> = () => {\n return {\n beforeRequest(wretch, options, state) {\n const fetchController = wretch._config.polyfill(\"AbortController\", false, true)\n if (!options[\"signal\"] && fetchController) {\n options[\"signal\"] = fetchController.signal\n }\n const timeout = {\n ref: null,\n clear() {\n if (timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n state.abort = {\n timeout,\n fetchController\n }\n return wretch\n },\n wretch: {\n signal(controller) {\n return { ...this, _options: { ...this._options, signal: controller.signal } }\n },\n },\n resolver: {\n setTimeout(time, controller = this._sharedState.abort.fetchController) {\n const { timeout } = this._sharedState.abort\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return this\n },\n controller() { return [this._sharedState.abort.fetchController, this] },\n onAbort(cb) { return this.error(\"AbortError\", cb) }\n },\n }\n}\n\nexport default abort\n","import type { Config, ConfiguredMiddleware, Wretch, WretchAddon } from \"../types.js\"\n\nfunction utf8ToBase64(input: string) {\n const utf8Bytes = new TextEncoder().encode(input)\n return btoa(String.fromCharCode(...utf8Bytes))\n}\n\nexport interface BasicAuthAddon {\n /**\n * Sets the `Authorization` header to `Basic ` + <base64 encoded credentials>.\n * Additionally, allows using URLs with credentials in them.\n *\n * ```js\n * const user = \"user\"\n * const pass = \"pass\"\n *\n * // Automatically sets the Authorization header to \"Basic \" + <base64 encoded credentials>\n * wretch(\"...\").addon(BasicAuthAddon).basicAuth(user, pass).get()\n *\n * // Allows using URLs with credentials in them\n * wretch(`https://${user}:${pass}@...`).addon(BasicAuthAddon).get()\n * ```\n *\n * @param username - Username to use for basic auth\n * @param password - Password to use for basic auth\n */\n basicAuth<T extends BasicAuthAddon, C, R>(\n this: T & Wretch<T, C, R>,\n username: string,\n password: string\n ): this\n}\n\nconst makeBasicAuthMiddleware: (config: Config) => ConfiguredMiddleware = config => next => (url, opts) => {\n const _URL = config.polyfill(\"URL\")\n let parsedUrl: URL | null\n try {\n parsedUrl = new _URL(url)\n } catch {\n parsedUrl = null\n }\n\n if (parsedUrl?.username || parsedUrl?.password) {\n const basicAuthBase64 = utf8ToBase64(\n `${decodeURIComponent(parsedUrl.username)}:${decodeURIComponent(parsedUrl.password)}`,\n )\n opts.headers = {\n ...opts.headers,\n Authorization: `Basic ${basicAuthBase64}`,\n }\n parsedUrl.username = \"\"\n parsedUrl.password = \"\"\n url = parsedUrl.toString()\n }\n\n return next(url, opts)\n}\n\n\n/**\n * Adds the ability to use basic auth with the `Authorization` header.\n *\n * ```js\n * import BasicAuthAddon from \"wretch/addons/basicAuth\"\n *\n * wretch().addon(BasicAuthAddon)\n * ```\n */\nconst basicAuth: WretchAddon<BasicAuthAddon> = {\n beforeRequest(wretch) {\n return wretch.middlewares([makeBasicAuthMiddleware(wretch._config)])\n },\n wretch: {\n basicAuth(username, password) {\n const basicAuthBase64 = utf8ToBase64(`${username}:${password}`)\n return this.auth(`Basic ${basicAuthBase64}`)\n },\n },\n}\n\nexport default basicAuth\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction convertFormData(\n formObject: object,\n recursive: string[] | boolean = false,\n config: Config,\n formData = config.polyfill(\"FormData\", true, true),\n ancestors = [] as string[],\n) {\n Object.entries(formObject).forEach(([key, value]) => {\n let formKey = ancestors.reduce((acc, ancestor) => (\n acc ? `${acc}[${ancestor}]` : ancestor\n ), null)\n formKey = formKey ? `${formKey}[${key}]` : key\n if (value instanceof Array || (globalThis.FileList && value instanceof FileList)) {\n for (const item of value as File[])\n formData.append(formKey, item)\n } else if (\n recursive &&\n typeof value === \"object\" &&\n (\n !(recursive instanceof Array) ||\n !recursive.includes(key)\n )\n ) {\n if (value !== null) {\n convertFormData(value, recursive, config, formData, [...ancestors, key])\n }\n } else {\n formData.append(formKey, value)\n }\n })\n\n return formData\n}\n\nexport interface FormDataAddon {\n /**\n * Converts the javascript object to a FormData and sets the request body.\n *\n * ```js\n * const form = {\n * hello: \"world\",\n * duck: \"Muscovy\",\n * };\n *\n * wretch(\"...\").addons(FormDataAddon).formData(form).post();\n * ```\n *\n * The `recursive` argument when set to `true` will enable recursion through all\n * nested objects and produce `object[key]` keys. It can be set to an array of\n * string to exclude specific keys.\n *\n * > Warning: Be careful to exclude `Blob` instances in the Browser, and\n * > `ReadableStream` and `Buffer` instances when using the node.js compatible\n * > `form-data` package.\n *\n * ```js\n * const form = {\n * duck: \"Muscovy\",\n * duckProperties: {\n * beak: {\n * color: \"yellow\",\n * },\n * legs: 2,\n * },\n * ignored: {\n * key: 0,\n * },\n * };\n *\n * // Will append the following keys to the FormData payload:\n * // \"duck\", \"duckProperties[beak][color]\", \"duckProperties[legs]\"\n * wretch(\"...\").addons(FormDataAddon).formData(form, [\"ignored\"]).post();\n * ```\n *\n * > Note: This addon does not support specifying a custom `filename`.\n * > If you need to do so, you can use the `body` method directly:\n * > ```js\n * > const form = new FormData();\n * > form.append(\"hello\", \"world\", \"hello.txt\");\n * > wretch(\"...\").body(form).post();\n * > ```\n * > See: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#example\n *\n * @param formObject - An object which will be converted to a FormData\n * @param recursive - If `true`, will recurse through all nested objects. Can be set as an array of string to exclude specific keys.\n */\n formData<T extends FormDataAddon, C, R>(this: T & Wretch<T, C, R>, formObject: object, recursive?: string[] | boolean): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormData and use it as a request body.\n *\n * ```js\n * import FormDataAddon from \"wretch/addons/formData\"\n *\n * wretch().addon(FormDataAddon)\n * ```\n */\nconst formData: WretchAddon<FormDataAddon> = {\n wretch: {\n formData(formObject, recursive = false) {\n return this.body(convertFormData(formObject, recursive, this._config))\n }\n }\n}\n\nexport default formData\n","import type { Wretch, WretchAddon } from \"../types.js\"\n\nfunction encodeQueryValue(key: string, value: unknown) {\n return encodeURIComponent(key) +\n \"=\" +\n encodeURIComponent(\n typeof value === \"object\" ?\n JSON.stringify(value) :\n \"\" + value\n )\n}\nfunction convertFormUrl(formObject: object) {\n return Object.keys(formObject)\n .map(key => {\n const value = formObject[key]\n if (value instanceof Array) {\n return value.map(v => encodeQueryValue(key, v)).join(\"&\")\n }\n return encodeQueryValue(key, value)\n })\n .join(\"&\")\n}\n\nexport interface FormUrlAddon {\n /**\n * Converts the input parameter to an url encoded string and sets the content-type\n * header and body. If the input argument is already a string, skips the conversion\n * part.\n *\n * ```js\n * const form = { a: 1, b: { c: 2 } };\n * const alreadyEncodedForm = \"a=1&b=%7B%22c%22%3A2%7D\";\n *\n * // Automatically sets the content-type header to \"application/x-www-form-urlencoded\"\n * wretch(\"...\").addon(FormUrlAddon).formUrl(form).post();\n * wretch(\"...\").addon(FormUrlAddon).formUrl(alreadyEncodedForm).post();\n * ```\n *\n * @param input - An object to convert into an url encoded string or an already encoded string\n */\n formUrl<T extends FormUrlAddon, C, R>(this: T & Wretch<T, C, R>, input: (object | string)): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormUrl and use it as a request body.\n *\n * ```js\n * import FormUrlAddon from \"wretch/addons/formUrl\"\n *\n * wretch().addon(FormUrlAddon)\n * ```\n */\nconst formUrl: WretchAddon<FormUrlAddon> = {\n wretch: {\n formUrl(input) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n }\n}\n\nexport default formUrl\n","import type { WretchResponseChain, WretchAddon, Config } from \"../types.js\"\n\nexport type PerfCallback = (timing: any) => void\n\nexport interface PerfsAddon {\n /**\n * Performs a callback on the API performance timings of the request.\n *\n * Warning: Still experimental on browsers and node.js\n */\n perfs: <T, C extends PerfsAddon, R>(this: C & WretchResponseChain<T, C, R>, cb?: PerfCallback) => this,\n}\n\n/**\n * Adds the ability to measure requests using the Performance Timings API.\n *\n * Uses the Performance API\n * ([browsers](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) &\n * [node.js](https://nodejs.org/api/perf_hooks.html)) to expose timings related to\n * the underlying request.\n *\n * Browser timings are very accurate, node.js only contains raw measures.\n *\n * ```js\n * import PerfsAddon from \"wretch/addons/perfs\"\n *\n * // Use perfs() before the response types (text, json, ...)\n * wretch(\"...\")\n * .addon(PerfsAddon())\n * .get()\n * .perfs((timings) => {\n * // Will be called when the timings are ready.\n * console.log(timings.startTime);\n * })\n * .res();\n *\n * ```\n *\n * For node.js, there is a little extra work to do :\n *\n * ```js\n * // Node.js only\n * const { performance, PerformanceObserver } = require(\"perf_hooks\");\n *\n * wretch.polyfills({\n * fetch: function (url, opts) {\n * performance.mark(url + \" - begin\");\n * return fetch(url, opts).then(res => {\n * performance.mark(url + \" - end\");\n * setTimeout(() => performance.measure(res.url, url + \" - begin\", url + \" - end\"), 0);\n * return res;\n * });\n * },\n * // other polyfills…\n * performance: performance,\n * PerformanceObserver: PerformanceObserver,\n * });\n * ```\n */\nconst perfs: () => WretchAddon<unknown, PerfsAddon> = () => {\n const callbacks = new Map<string, PerfCallback>()\n let observer /*: PerformanceObserver | null*/ = null\n\n const onMatch = (\n entries /*: PerformanceObserverEntryList */,\n name: string,\n callback: PerfCallback,\n performance: typeof globalThis.performance\n ) => {\n if (!entries.getEntriesByName)\n return false\n const matches = entries.getEntriesByName(name)\n if (matches && matches.length > 0) {\n callback(matches.reverse()[0])\n if (performance.clearMeasures)\n performance.clearMeasures(name)\n callbacks.delete(name)\n\n if (callbacks.size < 1) {\n observer.disconnect()\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n }\n\n const initObserver = (\n performance: (typeof globalThis.performance) | null | undefined,\n performanceObserver /*: (typeof PerformanceObserver) | null | undefined */\n ) => {\n if (!observer && performance && performanceObserver) {\n observer = new performanceObserver(entries => {\n callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, performance)\n })\n })\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n\n return observer\n }\n\n const monitor = (\n name: string | null | undefined,\n callback: PerfCallback | null | undefined,\n config: Config\n ) => {\n if (!name || !callback)\n return\n\n const performance = config.polyfill(\"performance\", false)\n const performanceObserver = config.polyfill(\"PerformanceObserver\", false)\n\n if (!initObserver(performance, performanceObserver))\n return\n\n if (!onMatch(performance, name, callback, performance)) {\n if (callbacks.size < 1)\n observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n callbacks.set(name, callback)\n }\n }\n\n return {\n resolver: {\n perfs(cb) {\n this._fetchReq\n .then(() =>\n monitor(this._wretchReq._url, cb, this._wretchReq._config)\n )\n .catch(() => {/* swallow */ })\n return this\n },\n }\n }\n}\n\nexport default perfs\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction stringify(value?: string | null): string | null {\n return typeof value !== \"undefined\" ? value : \"\"\n}\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean, omitUndefinedOrNullValues: boolean, config: Config) => {\n let queryString: string\n\n if (typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = config.polyfill(\"URLSearchParams\", true, true)\n for (const key in qp) {\n const value = qp[key]\n if (omitUndefinedOrNullValues && (value === null || value === undefined)) continue\n if (qp[key] instanceof Array) {\n for (const val of value)\n usp.append(key, stringify(val))\n } else {\n usp.append(key, stringify(value))\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n\n if (!queryString)\n return replace ? split[0] : url\n\n if (replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nexport interface QueryStringAddon {\n /**\n * Converts a javascript object to query parameters, then appends this query string\n * to the current url. String values are used as the query string verbatim.\n *\n * Pass `true` as the second argument to replace existing query parameters.\n * Pass `true` as the third argument to completely omit the key=value pair for undefined or null values.\n *\n * ```\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * let w = wretch(\"http://example.com\").addon(QueryStringAddon);\n * // url is http://example.com\n * w = w.query({ a: 1, b: 2 });\n * // url is now http://example.com?a=1&b=2\n * w = w.query({ c: 3, d: [4, 5] });\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5\n * w = w.query(\"five&six&seven=eight\");\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5&five&six&seven=eight\n * w = w.query({ reset: true }, true);\n * // url is now http://example.com?reset=true\n * ```\n *\n * ##### **Note that .query is not meant to handle complex cases with nested objects.**\n *\n * For this kind of usage, you can use `wretch` in conjunction with other libraries\n * (like [`qs`](https://github.com/ljharb/qs)).\n *\n * ```js\n * // Using wretch with qs\n *\n * const queryObject = { some: { nested: \"objects\" } };\n * const w = wretch(\"https://example.com/\").addon(QueryStringAddon)\n *\n * // Use .qs inside .query :\n *\n * w.query(qs.stringify(queryObject));\n *\n * // Use .defer :\n *\n * const qsWretch = w.defer((w, url, { qsQuery, qsOptions }) => (\n * qsQuery ? w.query(qs.stringify(qsQuery, qsOptions)) : w\n * ));\n *\n * qsWretch\n * .url(\"https://example.com/\")\n * .options({ qs: { query: queryObject } });\n * ```\n *\n * @param qp - An object which will be converted, or a string which will be used verbatim.\n */\n query<T extends QueryStringAddon, C, R>(this: T & Wretch<T, C, R>, qp: object | string, replace?: boolean, omitUndefinedOrNullValues?: boolean): this\n}\n\n/**\n * Adds the ability to append query parameters from a javascript object.\n *\n * ```js\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * wretch().addon(QueryAddon)\n * ```\n */\nconst queryString: WretchAddon<QueryStringAddon> = {\n wretch: {\n query(qp, replace = false, omitUndefinedOrNullValues = false) {\n return { ...this, _url: appendQueryParams(this._url, qp, replace, omitUndefinedOrNullValues, this._config) }\n }\n }\n}\n\nexport default queryString\n","import type { ConfiguredMiddleware, WretchAddon, WretchResponseChain } from \"../types.js\"\n\nexport interface ProgressResolver {\n /**\n * Provides a way to register a callback to be invoked one or multiple times during the download.\n * The callback receives the current progress as two arguments, the number of bytes loaded and the total number of bytes to load.\n *\n * _Under the hood: this method adds a middleware to the chain that will intercept the response and replace the body with a new one that will emit the progress event._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n *\n * @param onProgress - A callback that will be called one or multiple times with the number of bytes loaded and the total number of bytes to load.\n */\n progress: <T, C extends ProgressResolver, R>(\n this: C & WretchResponseChain<T, C, R>,\n onProgress: (loaded: number, total: number) => void\n ) => this\n}\n\n/**\n * Adds the ability to monitor progress when downloading a response.\n *\n * _Compatible with all platforms implementing the [TransformStream WebAPI](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility)._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n */\nconst progress: () => WretchAddon<unknown, ProgressResolver> = () => {\n function transformMiddleware(state: Record<any, any>) : ConfiguredMiddleware {\n return next => (url, opts) => {\n let loaded = 0\n let total = 0\n return next(url, opts).then(response => {\n try {\n const contentLength = response.headers.get(\"content-length\")\n total = contentLength ? +contentLength : null\n const transform = new TransformStream({\n transform(chunk, controller) {\n loaded += chunk.length\n if (total < loaded) {\n total = loaded\n }\n if (state.progress) {\n state.progress(loaded, total)\n }\n controller.enqueue(chunk)\n }\n })\n return new Response(response.body.pipeThrough(transform), response)\n } catch (e) {\n return response\n }\n })\n }\n }\n\n return {\n beforeRequest(wretch, _, state) {\n return wretch.middlewares([transformMiddleware(state)])\n },\n resolver: {\n progress(onProgress: (loaded: number, total: number) => void) {\n this._sharedState.progress = onProgress\n return this\n }\n },\n }\n}\n\nexport default progress\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport * as Addons from \"./addons/index.js\"\nimport { WretchError } from \"./resolver.js\"\n\nfunction factory(_url = \"\", _options = {}) {\n return { ...core, _url, _options }\n .addon(Addons.abortAddon())\n .addon(Addons.basicAuthAddon)\n .addon(Addons.formDataAddon)\n .addon(Addons.formUrlAddon)\n .addon(Addons.perfsAddon())\n .addon(Addons.queryStringAddon)\n .addon(Addons.progressAddon())\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","abort","state","fetchController","signal","ref","clearTimeout","controller","setTimeout","time","onAbort","utf8ToBase64","input","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","makeBasicAuthMiddleware","next","_URL","parsedUrl","username","password","basicAuthBase64","decodeURIComponent","toString","basicAuth","convertFormData","formObject","recursive","ancestors","forEach","formKey","ancestor","globalThis","FileList","item","append","includes","encodeQueryValue","encodeURIComponent","formUrl","keys","map","v","join","perfs","callbacks","observer","onMatch","performance","getEntriesByName","matches","reverse","clearMeasures","size","disconnect","clearResourceTimings","performanceObserver","initObserver","observe","entryTypes","monitor","appendQueryParams","qp","omitUndefinedOrNullValues","queryString","usp","val","query","progress","transformMiddleware","loaded","total","contentLength","transform","TransformStream","chunk","enqueue","Response","pipeThrough","e","onProgress","factory","Addons.abortAddon","Addons.basicAuthAddon","Addons.formDataAddon","Addons.formUrlAddon","Addons.perfsAddon","Addons.queryStringAddon","Addons.progressAddon"],"mappings":"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"}
{"version":3,"file":"wretch.all.min.mjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/addons/abort.ts","../../src/addons/basicAuth.ts","../../src/addons/formData.ts","../../src/addons/formUrl.ts","../../src/addons/perfs.ts","../../src/addons/queryString.ts","../../src/addons/progress.ts","../../src/index.all.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import type { Wretch, WretchAddon, WretchErrorCallback, WretchResponseChain } from \"../types.js\"\n\nexport interface AbortWretch {\n /**\n * Associates a custom controller with the request.\n *\n * Useful when you need to use\n * your own AbortController, otherwise wretch will create a new controller itself.\n *\n * ```js\n * const controller = new AbortController()\n *\n * // Associates the same controller with multiple requests\n * wretch(\"url1\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n * wretch(\"url2\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .json()\n *\n * // Aborts both requests\n * controller.abort()\n * ```\n *\n * @param controller - An instance of AbortController\n */\n signal: <T extends AbortWretch, C, R>(this: T & Wretch<T, C, R>, controller: AbortController) => this\n}\n\nexport interface AbortResolver {\n /**\n * Aborts the request after a fixed time.\n *\n * If you use a custom AbortController associated with the request, pass it as the second argument.\n *\n * ```js\n * // 1 second timeout\n * wretch(\"...\").addon(AbortAddon()).get().setTimeout(1000).json(_ =>\n * // will not be called if the request timeouts\n * )\n * ```\n *\n * @param time - Time in milliseconds\n * @param controller - An instance of AbortController\n */\n setTimeout: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, time: number, controller?: AbortController) => this\n /**\n * Returns the provided or generated AbortController plus the wretch response chain as a pair.\n *\n * ```js\n * // We need the controller outside the chain\n * const [c, w] = wretch(\"url\")\n * .addon(AbortAddon())\n * .get()\n * .controller()\n *\n * // Resume with the chain\n * w.onAbort(_ => console.log(\"ouch\")).json()\n *\n * // Later on…\n * c.abort()\n * ```\n */\n controller: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>) => [any, this]\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: <T, C extends AbortResolver, R>(this: C & WretchResponseChain<T, C, R>, cb: WretchErrorCallback<T, C, R>) => this\n}\n\n/**\n * Adds the ability to abort requests using AbortController and signals under the hood.\n *\n *\n * _Only compatible with browsers that support\n * [AbortControllers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).\n * Otherwise, you could use a (partial)\n * [polyfill](https://www.npmjs.com/package/abortcontroller-polyfill)._\n *\n * ```js\n * import AbortAddon from \"wretch/addons/abort\"\n *\n * const [c, w] = wretch(\"...\")\n * .addon(AbortAddon())\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .controller();\n *\n * w.text((_) => console.log(\"should never be called\"));\n * c.abort();\n *\n * // Or :\n *\n * const controller = new AbortController();\n *\n * wretch(\"...\")\n * .addon(AbortAddon())\n * .signal(controller)\n * .get()\n * .onAbort((_) => console.log(\"Aborted !\"))\n * .text((_) => console.log(\"should never be called\"));\n *\n * controller.abort();\n * ```\n */\nconst abort: () => WretchAddon<AbortWretch, AbortResolver> = () => {\n return {\n beforeRequest(wretch, options, state) {\n const fetchController = wretch._config.polyfill(\"AbortController\", false, true)\n if (!options[\"signal\"] && fetchController) {\n options[\"signal\"] = fetchController.signal\n }\n const timeout = {\n ref: null,\n clear() {\n if (timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n state.abort = {\n timeout,\n fetchController\n }\n return wretch\n },\n wretch: {\n signal(controller) {\n return { ...this, _options: { ...this._options, signal: controller.signal } }\n },\n },\n resolver: {\n setTimeout(time, controller = this._sharedState.abort.fetchController) {\n const { timeout } = this._sharedState.abort\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return this\n },\n controller() { return [this._sharedState.abort.fetchController, this] },\n onAbort(cb) { return this.error(\"AbortError\", cb) }\n },\n }\n}\n\nexport default abort\n","import type { Config, ConfiguredMiddleware, Wretch, WretchAddon } from \"../types.js\"\n\nfunction utf8ToBase64(input: string) {\n const utf8Bytes = new TextEncoder().encode(input)\n return btoa(String.fromCharCode(...utf8Bytes))\n}\n\nexport interface BasicAuthAddon {\n /**\n * Sets the `Authorization` header to `Basic ` + <base64 encoded credentials>.\n * Additionally, allows using URLs with credentials in them.\n *\n * ```js\n * const user = \"user\"\n * const pass = \"pass\"\n *\n * // Automatically sets the Authorization header to \"Basic \" + <base64 encoded credentials>\n * wretch(\"...\").addon(BasicAuthAddon).basicAuth(user, pass).get()\n *\n * // Allows using URLs with credentials in them\n * wretch(`https://${user}:${pass}@...`).addon(BasicAuthAddon).get()\n * ```\n *\n * @param username - Username to use for basic auth\n * @param password - Password to use for basic auth\n */\n basicAuth<T extends BasicAuthAddon, C, R>(\n this: T & Wretch<T, C, R>,\n username: string,\n password: string\n ): this\n}\n\nconst makeBasicAuthMiddleware: (config: Config) => ConfiguredMiddleware = config => next => (url, opts) => {\n const _URL = config.polyfill(\"URL\")\n let parsedUrl: URL | null\n try {\n parsedUrl = new _URL(url)\n } catch {\n parsedUrl = null\n }\n\n if (parsedUrl?.username || parsedUrl?.password) {\n const basicAuthBase64 = utf8ToBase64(\n `${decodeURIComponent(parsedUrl.username)}:${decodeURIComponent(parsedUrl.password)}`,\n )\n opts.headers = {\n ...opts.headers,\n Authorization: `Basic ${basicAuthBase64}`,\n }\n parsedUrl.username = \"\"\n parsedUrl.password = \"\"\n url = parsedUrl.toString()\n }\n\n return next(url, opts)\n}\n\n\n/**\n * Adds the ability to use basic auth with the `Authorization` header.\n *\n * ```js\n * import BasicAuthAddon from \"wretch/addons/basicAuth\"\n *\n * wretch().addon(BasicAuthAddon)\n * ```\n */\nconst basicAuth: WretchAddon<BasicAuthAddon> = {\n beforeRequest(wretch) {\n return wretch.middlewares([makeBasicAuthMiddleware(wretch._config)])\n },\n wretch: {\n basicAuth(username, password) {\n const basicAuthBase64 = utf8ToBase64(`${username}:${password}`)\n return this.auth(`Basic ${basicAuthBase64}`)\n },\n },\n}\n\nexport default basicAuth\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction convertFormData(\n formObject: object,\n recursive: string[] | boolean = false,\n config: Config,\n formData = config.polyfill(\"FormData\", true, true),\n ancestors = [] as string[],\n) {\n Object.entries(formObject).forEach(([key, value]) => {\n let formKey = ancestors.reduce((acc, ancestor) => (\n acc ? `${acc}[${ancestor}]` : ancestor\n ), null)\n formKey = formKey ? `${formKey}[${key}]` : key\n if (value instanceof Array || (globalThis.FileList && value instanceof FileList)) {\n for (const item of value as File[])\n formData.append(formKey, item)\n } else if (\n recursive &&\n typeof value === \"object\" &&\n (\n !(recursive instanceof Array) ||\n !recursive.includes(key)\n )\n ) {\n if (value !== null) {\n convertFormData(value, recursive, config, formData, [...ancestors, key])\n }\n } else {\n formData.append(formKey, value)\n }\n })\n\n return formData\n}\n\nexport interface FormDataAddon {\n /**\n * Converts the javascript object to a FormData and sets the request body.\n *\n * ```js\n * const form = {\n * hello: \"world\",\n * duck: \"Muscovy\",\n * };\n *\n * wretch(\"...\").addons(FormDataAddon).formData(form).post();\n * ```\n *\n * The `recursive` argument when set to `true` will enable recursion through all\n * nested objects and produce `object[key]` keys. It can be set to an array of\n * string to exclude specific keys.\n *\n * > Warning: Be careful to exclude `Blob` instances in the Browser, and\n * > `ReadableStream` and `Buffer` instances when using the node.js compatible\n * > `form-data` package.\n *\n * ```js\n * const form = {\n * duck: \"Muscovy\",\n * duckProperties: {\n * beak: {\n * color: \"yellow\",\n * },\n * legs: 2,\n * },\n * ignored: {\n * key: 0,\n * },\n * };\n *\n * // Will append the following keys to the FormData payload:\n * // \"duck\", \"duckProperties[beak][color]\", \"duckProperties[legs]\"\n * wretch(\"...\").addons(FormDataAddon).formData(form, [\"ignored\"]).post();\n * ```\n *\n * > Note: This addon does not support specifying a custom `filename`.\n * > If you need to do so, you can use the `body` method directly:\n * > ```js\n * > const form = new FormData();\n * > form.append(\"hello\", \"world\", \"hello.txt\");\n * > wretch(\"...\").body(form).post();\n * > ```\n * > See: https://developer.mozilla.org/en-US/docs/Web/API/FormData/append#example\n *\n * @param formObject - An object which will be converted to a FormData\n * @param recursive - If `true`, will recurse through all nested objects. Can be set as an array of string to exclude specific keys.\n */\n formData<T extends FormDataAddon, C, R>(this: T & Wretch<T, C, R>, formObject: object, recursive?: string[] | boolean): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormData and use it as a request body.\n *\n * ```js\n * import FormDataAddon from \"wretch/addons/formData\"\n *\n * wretch().addon(FormDataAddon)\n * ```\n */\nconst formData: WretchAddon<FormDataAddon> = {\n wretch: {\n formData(formObject, recursive = false) {\n return this.body(convertFormData(formObject, recursive, this._config))\n }\n }\n}\n\nexport default formData\n","import type { Wretch, WretchAddon } from \"../types.js\"\n\nfunction encodeQueryValue(key: string, value: unknown) {\n return encodeURIComponent(key) +\n \"=\" +\n encodeURIComponent(\n typeof value === \"object\" ?\n JSON.stringify(value) :\n \"\" + value\n )\n}\nfunction convertFormUrl(formObject: object) {\n return Object.keys(formObject)\n .map(key => {\n const value = formObject[key]\n if (value instanceof Array) {\n return value.map(v => encodeQueryValue(key, v)).join(\"&\")\n }\n return encodeQueryValue(key, value)\n })\n .join(\"&\")\n}\n\nexport interface FormUrlAddon {\n /**\n * Converts the input parameter to an url encoded string and sets the content-type\n * header and body. If the input argument is already a string, skips the conversion\n * part.\n *\n * ```js\n * const form = { a: 1, b: { c: 2 } };\n * const alreadyEncodedForm = \"a=1&b=%7B%22c%22%3A2%7D\";\n *\n * // Automatically sets the content-type header to \"application/x-www-form-urlencoded\"\n * wretch(\"...\").addon(FormUrlAddon).formUrl(form).post();\n * wretch(\"...\").addon(FormUrlAddon).formUrl(alreadyEncodedForm).post();\n * ```\n *\n * @param input - An object to convert into an url encoded string or an already encoded string\n */\n formUrl<T extends FormUrlAddon, C, R>(this: T & Wretch<T, C, R>, input: (object | string)): this\n}\n\n/**\n * Adds the ability to convert a an object to a FormUrl and use it as a request body.\n *\n * ```js\n * import FormUrlAddon from \"wretch/addons/formUrl\"\n *\n * wretch().addon(FormUrlAddon)\n * ```\n */\nconst formUrl: WretchAddon<FormUrlAddon> = {\n wretch: {\n formUrl(input) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n }\n}\n\nexport default formUrl\n","import type { WretchResponseChain, WretchAddon, Config } from \"../types.js\"\n\nexport type PerfCallback = (timing: any) => void\n\nexport interface PerfsAddon {\n /**\n * Performs a callback on the API performance timings of the request.\n *\n * Warning: Still experimental on browsers and node.js\n */\n perfs: <T, C extends PerfsAddon, R>(this: C & WretchResponseChain<T, C, R>, cb?: PerfCallback) => this,\n}\n\n/**\n * Adds the ability to measure requests using the Performance Timings API.\n *\n * Uses the Performance API\n * ([browsers](https://developer.mozilla.org/en-US/docs/Web/API/Performance_API) &\n * [node.js](https://nodejs.org/api/perf_hooks.html)) to expose timings related to\n * the underlying request.\n *\n * Browser timings are very accurate, node.js only contains raw measures.\n *\n * ```js\n * import PerfsAddon from \"wretch/addons/perfs\"\n *\n * // Use perfs() before the response types (text, json, ...)\n * wretch(\"...\")\n * .addon(PerfsAddon())\n * .get()\n * .perfs((timings) => {\n * // Will be called when the timings are ready.\n * console.log(timings.startTime);\n * })\n * .res();\n *\n * ```\n *\n * For node.js, there is a little extra work to do :\n *\n * ```js\n * // Node.js only\n * const { performance, PerformanceObserver } = require(\"perf_hooks\");\n *\n * wretch.polyfills({\n * fetch: function (url, opts) {\n * performance.mark(url + \" - begin\");\n * return fetch(url, opts).then(res => {\n * performance.mark(url + \" - end\");\n * setTimeout(() => performance.measure(res.url, url + \" - begin\", url + \" - end\"), 0);\n * return res;\n * });\n * },\n * // other polyfills…\n * performance: performance,\n * PerformanceObserver: PerformanceObserver,\n * });\n * ```\n */\nconst perfs: () => WretchAddon<unknown, PerfsAddon> = () => {\n const callbacks = new Map<string, PerfCallback>()\n let observer /*: PerformanceObserver | null*/ = null\n\n const onMatch = (\n entries /*: PerformanceObserverEntryList */,\n name: string,\n callback: PerfCallback,\n performance: typeof globalThis.performance\n ) => {\n if (!entries.getEntriesByName)\n return false\n const matches = entries.getEntriesByName(name)\n if (matches && matches.length > 0) {\n callback(matches.reverse()[0])\n if (performance.clearMeasures)\n performance.clearMeasures(name)\n callbacks.delete(name)\n\n if (callbacks.size < 1) {\n observer.disconnect()\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n }\n\n const initObserver = (\n performance: (typeof globalThis.performance) | null | undefined,\n performanceObserver /*: (typeof PerformanceObserver) | null | undefined */\n ) => {\n if (!observer && performance && performanceObserver) {\n observer = new performanceObserver(entries => {\n callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, performance)\n })\n })\n if (performance.clearResourceTimings) {\n performance.clearResourceTimings()\n }\n }\n\n return observer\n }\n\n const monitor = (\n name: string | null | undefined,\n callback: PerfCallback | null | undefined,\n config: Config\n ) => {\n if (!name || !callback)\n return\n\n const performance = config.polyfill(\"performance\", false)\n const performanceObserver = config.polyfill(\"PerformanceObserver\", false)\n\n if (!initObserver(performance, performanceObserver))\n return\n\n if (!onMatch(performance, name, callback, performance)) {\n if (callbacks.size < 1)\n observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n callbacks.set(name, callback)\n }\n }\n\n return {\n resolver: {\n perfs(cb) {\n this._fetchReq\n .then(() =>\n monitor(this._wretchReq._url, cb, this._wretchReq._config)\n )\n .catch(() => {/* swallow */ })\n return this\n },\n }\n }\n}\n\nexport default perfs\n","import type { Wretch, Config, WretchAddon } from \"../types.js\"\n\nfunction stringify(value?: string | null): string | null {\n return typeof value !== \"undefined\" ? value : \"\"\n}\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean, omitUndefinedOrNullValues: boolean, config: Config) => {\n let queryString: string\n\n if (typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = config.polyfill(\"URLSearchParams\", true, true)\n for (const key in qp) {\n const value = qp[key]\n if (omitUndefinedOrNullValues && (value === null || value === undefined)) continue\n if (qp[key] instanceof Array) {\n for (const val of value)\n usp.append(key, stringify(val))\n } else {\n usp.append(key, stringify(value))\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n\n if (!queryString)\n return replace ? split[0] : url\n\n if (replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nexport interface QueryStringAddon {\n /**\n * Converts a javascript object to query parameters, then appends this query string\n * to the current url. String values are used as the query string verbatim.\n *\n * Pass `true` as the second argument to replace existing query parameters.\n * Pass `true` as the third argument to completely omit the key=value pair for undefined or null values.\n *\n * ```\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * let w = wretch(\"http://example.com\").addon(QueryStringAddon);\n * // url is http://example.com\n * w = w.query({ a: 1, b: 2 });\n * // url is now http://example.com?a=1&b=2\n * w = w.query({ c: 3, d: [4, 5] });\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5\n * w = w.query(\"five&six&seven=eight\");\n * // url is now http://example.com?a=1&b=2c=3&d=4&d=5&five&six&seven=eight\n * w = w.query({ reset: true }, true);\n * // url is now http://example.com?reset=true\n * ```\n *\n * ##### **Note that .query is not meant to handle complex cases with nested objects.**\n *\n * For this kind of usage, you can use `wretch` in conjunction with other libraries\n * (like [`qs`](https://github.com/ljharb/qs)).\n *\n * ```js\n * // Using wretch with qs\n *\n * const queryObject = { some: { nested: \"objects\" } };\n * const w = wretch(\"https://example.com/\").addon(QueryStringAddon)\n *\n * // Use .qs inside .query :\n *\n * w.query(qs.stringify(queryObject));\n *\n * // Use .defer :\n *\n * const qsWretch = w.defer((w, url, { qsQuery, qsOptions }) => (\n * qsQuery ? w.query(qs.stringify(qsQuery, qsOptions)) : w\n * ));\n *\n * qsWretch\n * .url(\"https://example.com/\")\n * .options({ qs: { query: queryObject } });\n * ```\n *\n * @param qp - An object which will be converted, or a string which will be used verbatim.\n */\n query<T extends QueryStringAddon, C, R>(this: T & Wretch<T, C, R>, qp: object | string, replace?: boolean, omitUndefinedOrNullValues?: boolean): this\n}\n\n/**\n * Adds the ability to append query parameters from a javascript object.\n *\n * ```js\n * import QueryAddon from \"wretch/addons/queryString\"\n *\n * wretch().addon(QueryAddon)\n * ```\n */\nconst queryString: WretchAddon<QueryStringAddon> = {\n wretch: {\n query(qp, replace = false, omitUndefinedOrNullValues = false) {\n return { ...this, _url: appendQueryParams(this._url, qp, replace, omitUndefinedOrNullValues, this._config) }\n }\n }\n}\n\nexport default queryString\n","import type { ConfiguredMiddleware, WretchAddon, WretchResponseChain } from \"../types.js\"\n\nexport interface ProgressResolver {\n /**\n * Provides a way to register a callback to be invoked one or multiple times during the download.\n * The callback receives the current progress as two arguments, the number of bytes loaded and the total number of bytes to load.\n *\n * _Under the hood: this method adds a middleware to the chain that will intercept the response and replace the body with a new one that will emit the progress event._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n *\n * @param onProgress - A callback that will be called one or multiple times with the number of bytes loaded and the total number of bytes to load.\n */\n progress: <T, C extends ProgressResolver, R>(\n this: C & WretchResponseChain<T, C, R>,\n onProgress: (loaded: number, total: number) => void\n ) => this\n}\n\n/**\n * Adds the ability to monitor progress when downloading a response.\n *\n * _Compatible with all platforms implementing the [TransformStream WebAPI](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream#browser_compatibility)._\n *\n * ```js\n * import ProgressAddon from \"wretch/addons/progress\"\n *\n * wretch(\"some_url\")\n * // Register the addon\n * .addon(ProgressAddon())\n * .get()\n * // Log the progress as a percentage of completion\n * .progress((loaded, total) => console.log(`${(loaded / total * 100).toFixed(0)}%`))\n * ```\n */\nconst progress: () => WretchAddon<unknown, ProgressResolver> = () => {\n function transformMiddleware(state: Record<any, any>) : ConfiguredMiddleware {\n return next => (url, opts) => {\n let loaded = 0\n let total = 0\n return next(url, opts).then(response => {\n try {\n const contentLength = response.headers.get(\"content-length\")\n total = contentLength ? +contentLength : null\n const transform = new TransformStream({\n transform(chunk, controller) {\n loaded += chunk.length\n if (total < loaded) {\n total = loaded\n }\n if (state.progress) {\n state.progress(loaded, total)\n }\n controller.enqueue(chunk)\n }\n })\n return new Response(response.body.pipeThrough(transform), response)\n } catch (e) {\n return response\n }\n })\n }\n }\n\n return {\n beforeRequest(wretch, _, state) {\n return wretch.middlewares([transformMiddleware(state)])\n },\n resolver: {\n progress(onProgress: (loaded: number, total: number) => void) {\n this._sharedState.progress = onProgress\n return this\n }\n },\n }\n}\n\nexport default progress\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport * as Addons from \"./addons/index.js\"\nimport { WretchError } from \"./resolver.js\"\n\nfunction factory(_url = \"\", _options = {}) {\n return { ...core, _url, _options }\n .addon(Addons.abortAddon())\n .addon(Addons.basicAuthAddon)\n .addon(Addons.formDataAddon)\n .addon(Addons.formUrlAddon)\n .addon(Addons.perfsAddon())\n .addon(Addons.queryStringAddon)\n .addon(Addons.progressAddon())\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","abort","state","fetchController","signal","ref","clearTimeout","controller","setTimeout","time","onAbort","utf8ToBase64","input","utf8Bytes","TextEncoder","encode","btoa","String","fromCharCode","makeBasicAuthMiddleware","next","_URL","parsedUrl","username","password","basicAuthBase64","decodeURIComponent","toString","basicAuth","convertFormData","formObject","recursive","ancestors","forEach","formKey","ancestor","globalThis","FileList","item","append","includes","encodeQueryValue","encodeURIComponent","formUrl","keys","map","v","join","perfs","callbacks","observer","onMatch","performance","getEntriesByName","matches","reverse","clearMeasures","size","disconnect","clearResourceTimings","performanceObserver","initObserver","observe","entryTypes","monitor","appendQueryParams","qp","omitUndefinedOrNullValues","queryString","usp","val","query","progress","transformMiddleware","loaded","total","contentLength","transform","TransformStream","chunk","enqueue","Response","pipeThrough","e","onProgress","factory","Addons.abortAddon","Addons.basicAuthAddon","Addons.formDataAddon","Addons.formUrlAddon","Addons.perfsAddon","Addons.queryStringAddon","Addons.progressAddon"],"mappings":"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"}

@@ -1,2 +0,2 @@

"use strict";const t="Content-Type",e=Symbol(),r=Symbol();function o(e={}){var r;const o=e instanceof Array?Object.fromEntries(e):e;return null===(r=Object.entries(o).find((([e])=>e.toLowerCase()===t.toLowerCase())))||void 0===r?void 0:r[1]}function s(t){return/^application\/.*json.*/.test(t)}const n=function(t,e,r=0){return Object.entries(e).reduce(((e,[o,s])=>{const i=t[o];return Array.isArray(i)&&Array.isArray(s)?e[o]=r?[...i,...s]:s:e[o]="object"==typeof i&&"object"==typeof s?n(i,s,r):s,e}),{...t})},i={options:{},errorType:"text",polyfills:{},polyfill(t,e=1,r=0,...o){const s=this.polyfills[t]||("undefined"!=typeof self?self[t]:null)||("undefined"!=typeof global?global[t]:null);if(e&&!s)throw new Error(t+" is not defined");return r&&s?new s(...o):s}};class h extends Error{}const c=t=>{const o=Object.create(null);t=t._addons.reduce(((e,r)=>r.beforeRequest&&r.beforeRequest(e,t._options,o)||e),t);const{_url:s,_options:i,_config:c,_catchers:l,_resolvers:u,_middlewares:a,_addons:f}=t,d=new Map(l),p=n(c.options,i);let _=s;const y=(t=>e=>t.reduceRight(((t,e)=>e(t)),e)||e)(a)(((t,e)=>(_=t,c.polyfill("fetch")(t,e))))(s,p),b=new Error,g=y.catch((t=>{throw{[e]:t}})).then((t=>{var e;if(!t.ok){const r=new h;if(r.cause=b,r.stack=r.stack+"\nCAUSE: "+b.stack,r.response=t,r.status=t.status,r.url=_,"opaque"===t.type)throw r;const o="json"===c.errorType||"application/json"===(null===(e=t.headers.get("Content-Type"))||void 0===e?void 0:e.split(";")[0]);return(c.errorType?o?t.text():t[c.errorType]():Promise.resolve(t.body)).then((e=>{throw r.message="string"==typeof e?e:t.statusText,e&&(o&&"string"==typeof e?(r.text=e,r.json=JSON.parse(e)):r[c.errorType]=e),r}))}return t})),w=o=>s=>(o?g.then((t=>t&&t[o]())).then((t=>s?s(t):t)):g.then((t=>s?s(t):t))).catch((o=>{const s=Object.prototype.hasOwnProperty.call(o,e),n=s?o[e]:o,i=(null==n?void 0:n.status)&&d.get(n.status)||d.get(null==n?void 0:n.name)||s&&d.has(e)&&d.get(e);if(i)return i(n,t);const h=d.get(r);if(h)return h(n,t);throw n})),m={_wretchReq:t,_fetchReq:y,_sharedState:o,res:w(null),json:w("json"),blob:w("blob"),formData:w("formData"),arrayBuffer:w("arrayBuffer"),text:w("text"),error(t,e){return d.set(t,e),this},badRequest(t){return this.error(400,t)},unauthorized(t){return this.error(401,t)},forbidden(t){return this.error(403,t)},notFound(t){return this.error(404,t)},timeout(t){return this.error(408,t)},internalError(t){return this.error(500,t)},fetchError(t){return this.error(e,t)}},j=f.reduce(((t,e)=>({...t,..."function"==typeof e.resolver?e.resolver(t):e.resolver})),m);return u.reduce(((e,r)=>r(e,t)),j)},l={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(t){return{...this,_addons:[...this._addons,t],...t.wretch}},errorType(t){return{...this,_config:{...this._config,errorType:t}}},polyfills(t,e=0){return{...this,_config:{...this._config,polyfills:e?t:n(this._config.polyfills,t)}}},url(t,e=0){if(e)return{...this,_url:t};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+t+"?"+r[1]:this._url+t}},options(t,e=0){return{...this,_options:e?t:n(this._options,t)}},headers(t){const e=t?Array.isArray(t)?Object.fromEntries(t):"entries"in t?Object.fromEntries(t.entries()):t:{};return{...this,_options:n(this._options,{headers:e})}},accept(t){return this.headers({Accept:t})},content(e){return this.headers({[t]:e})},auth(t){return this.headers({Authorization:t})},catcher(t,e){const r=new Map(this._catchers);return r.set(t,e),{...this,_catchers:r}},catcherFallback(t){return this.catcher(r,t)},resolve(t,e=0){return{...this,_resolvers:e?[t]:[...this._resolvers,t]}},defer(t,e=0){return{...this,_deferred:e?[t]:[...this._deferred,t]}},middlewares(t,e=0){return{...this,_middlewares:e?t:[...this._middlewares,...t]}},fetch(t=this._options.method,e="",r=null){let n=this.url(e).options({method:t});const i=o(n._options.headers),h=this._config.polyfill("FormData",0),l="object"==typeof r&&!(h&&r instanceof h)&&(!n._options.headers||!i||s(i));return n=r?l?n.json(r,i):n.body(r):n,c(n._deferred.reduce(((t,e)=>e(t,t._url,t._options)),n))},get(t=""){return this.fetch("GET",t)},delete(t=""){return this.fetch("DELETE",t)},put(t,e=""){return this.fetch("PUT",e,t)},post(t,e=""){return this.fetch("POST",e,t)},patch(t,e=""){return this.fetch("PATCH",e,t)},head(t=""){return this.fetch("HEAD",t)},opts(t=""){return this.fetch("OPTIONS",t)},body(t){return{...this,_options:{...this._options,body:t}}},json(t,e){const r=o(this._options.headers);return this.content(e||s(r)&&r||"application/json").body(JSON.stringify(t))}};function u(t="",e={}){return{...l,_url:t,_options:e}}u.default=u,u.options=function(t,e=0){i.options=e?t:n(i.options,t)},u.errorType=function(t){i.errorType=t},u.polyfills=function(t,e=0){i.polyfills=e?t:n(i.polyfills,t)},u.WretchError=h,module.exports=u;
"use strict";const t="Content-Type",e=Symbol(),r=Symbol();function o(e={}){var r;const o=e instanceof Array?Object.fromEntries(e):e;return null===(r=Object.entries(o).find((([e])=>e.toLowerCase()===t.toLowerCase())))||void 0===r?void 0:r[1]}function s(t){return/^application\/.*json.*/.test(t)}const n=function(t,e,r=0){return Object.entries(e).reduce(((e,[o,s])=>{const i=t[o];return Array.isArray(i)&&Array.isArray(s)?e[o]=r?[...i,...s]:s:e[o]="object"==typeof i&&"object"==typeof s?n(i,s,r):s,e}),{...t})},i={options:{},errorType:"text",polyfills:{},polyfill(t,e=1,r=0,...o){const s=this.polyfills[t]||("undefined"!=typeof self?self[t]:null)||("undefined"!=typeof global?global[t]:null);if(e&&!s)throw new Error(t+" is not defined");return r&&s?new s(...o):s}};class c extends Error{}const h=t=>{const o=Object.create(null);t=t._addons.reduce(((e,r)=>r.beforeRequest&&r.beforeRequest(e,t._options,o)||e),t);const{_url:s,_options:i,_config:h,_catchers:l,_resolvers:u,_middlewares:a,_addons:f}=t,d=new Map(l),p=n(h.options,i);let _=s;const y=(t=>e=>t.reduceRight(((t,e)=>e(t)),e)||e)(a)(((t,e)=>(_=t,h.polyfill("fetch")(t,e))))(s,p),b=new Error,g=y.catch((t=>{throw{[e]:t}})).then((t=>{var e;if(!t.ok){const r=new c;if(r.cause=b,r.stack=r.stack+"\nCAUSE: "+b.stack,r.response=t,r.status=t.status,r.url=_,"opaque"===t.type)throw r;const o="json"===h.errorType||"application/json"===(null===(e=t.headers.get("Content-Type"))||void 0===e?void 0:e.split(";")[0]);return(h.errorType?o?t.text():t[h.errorType]():Promise.resolve(t.body)).then((e=>{if(r.message="string"==typeof e?e:t.statusText,e)if(o&&"string"==typeof e){r.text=e;try{r.json=JSON.parse(e)}catch(t){}}else r[h.errorType]=e;throw r}))}return t})),w=o=>s=>(o?g.then((t=>t&&t[o]())).then((t=>s?s(t):t)):g.then((t=>s?s(t):t))).catch((o=>{const s=Object.prototype.hasOwnProperty.call(o,e),n=s?o[e]:o,i=(null==n?void 0:n.status)&&d.get(n.status)||d.get(null==n?void 0:n.name)||s&&d.has(e)&&d.get(e);if(i)return i(n,t);const c=d.get(r);if(c)return c(n,t);throw n})),m={_wretchReq:t,_fetchReq:y,_sharedState:o,res:w(null),json:w("json"),blob:w("blob"),formData:w("formData"),arrayBuffer:w("arrayBuffer"),text:w("text"),error(t,e){return d.set(t,e),this},badRequest(t){return this.error(400,t)},unauthorized(t){return this.error(401,t)},forbidden(t){return this.error(403,t)},notFound(t){return this.error(404,t)},timeout(t){return this.error(408,t)},internalError(t){return this.error(500,t)},fetchError(t){return this.error(e,t)}},j=f.reduce(((t,e)=>({...t,..."function"==typeof e.resolver?e.resolver(t):e.resolver})),m);return u.reduce(((e,r)=>r(e,t)),j)},l={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(t){return{...this,_addons:[...this._addons,t],...t.wretch}},errorType(t){return{...this,_config:{...this._config,errorType:t}}},polyfills(t,e=0){return{...this,_config:{...this._config,polyfills:e?t:n(this._config.polyfills,t)}}},url(t,e=0){if(e)return{...this,_url:t};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+t+"?"+r[1]:this._url+t}},options(t,e=0){return{...this,_options:e?t:n(this._options,t)}},headers(t){const e=t?Array.isArray(t)?Object.fromEntries(t):"entries"in t?Object.fromEntries(t.entries()):t:{};return{...this,_options:n(this._options,{headers:e})}},accept(t){return this.headers({Accept:t})},content(e){return this.headers({[t]:e})},auth(t){return this.headers({Authorization:t})},catcher(t,e){const r=new Map(this._catchers);return r.set(t,e),{...this,_catchers:r}},catcherFallback(t){return this.catcher(r,t)},resolve(t,e=0){return{...this,_resolvers:e?[t]:[...this._resolvers,t]}},defer(t,e=0){return{...this,_deferred:e?[t]:[...this._deferred,t]}},middlewares(t,e=0){return{...this,_middlewares:e?t:[...this._middlewares,...t]}},fetch(t=this._options.method,e="",r=null){let n=this.url(e).options({method:t});const i=o(n._options.headers),c=this._config.polyfill("FormData",0),l="object"==typeof r&&!(c&&r instanceof c)&&(!n._options.headers||!i||s(i));return n=r?l?n.json(r,i):n.body(r):n,h(n._deferred.reduce(((t,e)=>e(t,t._url,t._options)),n))},get(t=""){return this.fetch("GET",t)},delete(t=""){return this.fetch("DELETE",t)},put(t,e=""){return this.fetch("PUT",e,t)},post(t,e=""){return this.fetch("POST",e,t)},patch(t,e=""){return this.fetch("PATCH",e,t)},head(t=""){return this.fetch("HEAD",t)},opts(t=""){return this.fetch("OPTIONS",t)},body(t){return{...this,_options:{...this._options,body:t}}},json(t,e){const r=o(this._options.headers);return this.content(e||s(r)&&r||"application/json").body(JSON.stringify(t))}};function u(t="",e={}){return{...l,_url:t,_options:e}}u.default=u,u.options=function(t,e=0){i.options=e?t:n(i.options,t)},u.errorType=function(t){i.errorType=t},u.polyfills=function(t,e=0){i.polyfills=e?t:n(i.polyfills,t)},u.WretchError=c,module.exports=u;
//# sourceMappingURL=wretch.min.cjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"wretch.min.cjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/index.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport { WretchError } from \"./resolver.js\"\nimport type { Wretch, WretchOptions } from \"./types.js\"\n\nexport type {\n Wretch,\n Config,\n ConfiguredMiddleware,\n FetchLike,\n Middleware,\n WretchResponseChain,\n WretchOptions,\n WretchError,\n WretchErrorCallback,\n WretchResponse,\n WretchDeferredCallback,\n WretchAddon\n} from \"./types.js\"\n\n/**\n * Creates a new wretch instance with a base url and base\n * [fetch options](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch).\n *\n * ```ts\n * import wretch from \"wretch\"\n *\n * // Reusable instance\n * const w = wretch(\"https://domain.com\", { mode: \"cors\" })\n * ```\n *\n * @param _url The base url\n * @param _options The base fetch options\n * @returns A fresh wretch instance\n */\nfunction factory(_url = \"\", _options: WretchOptions = {}): Wretch {\n return { ...core, _url, _options }\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","factory"],"mappings":"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"}
{"version":3,"file":"wretch.min.cjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/index.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport { WretchError } from \"./resolver.js\"\nimport type { Wretch, WretchOptions } from \"./types.js\"\n\nexport type {\n Wretch,\n Config,\n ConfiguredMiddleware,\n FetchLike,\n Middleware,\n WretchResponseChain,\n WretchOptions,\n WretchError,\n WretchErrorCallback,\n WretchResponse,\n WretchDeferredCallback,\n WretchAddon\n} from \"./types.js\"\n\n/**\n * Creates a new wretch instance with a base url and base\n * [fetch options](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch).\n *\n * ```ts\n * import wretch from \"wretch\"\n *\n * // Reusable instance\n * const w = wretch(\"https://domain.com\", { mode: \"cors\" })\n * ```\n *\n * @param _url The base url\n * @param _options The base fetch options\n * @returns A fresh wretch instance\n */\nfunction factory(_url = \"\", _options: WretchOptions = {}): Wretch {\n return { ...core, _url, _options }\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","factory"],"mappings":"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"}

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).wretch=t()}(this,(function(){"use strict";const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function s(e){return/^application\/.*json.*/.test(e)}const n=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,s])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(s)?t[o]=r?[...i,...s]:s:t[o]="object"==typeof i&&"object"==typeof s?n(i,s,r):s,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const s=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!s)throw new Error(e+" is not defined");return r&&s?new s(...o):s}};class l extends Error{}const u=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:s,_options:i,_config:u,_catchers:c,_resolvers:h,_middlewares:a,_addons:f}=e,d=new Map(c),p=n(u.options,i);let _=s;const y=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(a)(((e,t)=>(_=e,u.polyfill("fetch")(e,t))))(s,p),b=new Error,g=y.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new l;if(r.cause=b,r.stack=r.stack+"\nCAUSE: "+b.stack,r.response=e,r.status=e.status,r.url=_,"opaque"===e.type)throw r;const o="json"===u.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(u.errorType?o?e.text():e[u.errorType]():Promise.resolve(e.body)).then((t=>{throw r.message="string"==typeof t?t:e.statusText,t&&(o&&"string"==typeof t?(r.text=t,r.json=JSON.parse(t)):r[u.errorType]=t),r}))}return e})),w=o=>s=>(o?g.then((e=>e&&e[o]())).then((e=>s?s(e):e)):g.then((e=>s?s(e):e))).catch((o=>{const s=Object.prototype.hasOwnProperty.call(o,t),n=s?o[t]:o,i=(null==n?void 0:n.status)&&d.get(n.status)||d.get(null==n?void 0:n.name)||s&&d.has(t)&&d.get(t);if(i)return i(n,e);const l=d.get(r);if(l)return l(n,e);throw n})),m={_wretchReq:e,_fetchReq:y,_sharedState:o,res:w(null),json:w("json"),blob:w("blob"),formData:w("formData"),arrayBuffer:w("arrayBuffer"),text:w("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},j=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),m);return h.reduce(((t,r)=>r(t,e)),j)},c={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:n(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:n(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:n(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let n=this.url(t).options({method:e});const i=o(n._options.headers),l=this._config.polyfill("FormData",0),c="object"==typeof r&&!(l&&r instanceof l)&&(!n._options.headers||!i||s(i));return n=r?c?n.json(r,i):n.body(r):n,u(n._deferred.reduce(((e,t)=>t(e,e._url,e._options)),n))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||s(r)&&r||"application/json").body(JSON.stringify(e))}};function h(e="",t={}){return{...c,_url:e,_options:t}}return h.default=h,h.options=function(e,t=0){i.options=t?e:n(i.options,e)},h.errorType=function(e){i.errorType=e},h.polyfills=function(e,t=0){i.polyfills=t?e:n(i.polyfills,e)},h.WretchError=l,h}));
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).wretch=t()}(this,(function(){"use strict";const e="Content-Type",t=Symbol(),r=Symbol();function o(t={}){var r;const o=t instanceof Array?Object.fromEntries(t):t;return null===(r=Object.entries(o).find((([t])=>t.toLowerCase()===e.toLowerCase())))||void 0===r?void 0:r[1]}function s(e){return/^application\/.*json.*/.test(e)}const n=function(e,t,r=0){return Object.entries(t).reduce(((t,[o,s])=>{const i=e[o];return Array.isArray(i)&&Array.isArray(s)?t[o]=r?[...i,...s]:s:t[o]="object"==typeof i&&"object"==typeof s?n(i,s,r):s,t}),{...e})},i={options:{},errorType:"text",polyfills:{},polyfill(e,t=1,r=0,...o){const s=this.polyfills[e]||("undefined"!=typeof self?self[e]:null)||("undefined"!=typeof global?global[e]:null);if(t&&!s)throw new Error(e+" is not defined");return r&&s?new s(...o):s}};class c extends Error{}const l=e=>{const o=Object.create(null);e=e._addons.reduce(((t,r)=>r.beforeRequest&&r.beforeRequest(t,e._options,o)||t),e);const{_url:s,_options:i,_config:l,_catchers:h,_resolvers:u,_middlewares:a,_addons:f}=e,d=new Map(h),p=n(l.options,i);let y=s;const _=(e=>t=>e.reduceRight(((e,t)=>t(e)),t)||t)(a)(((e,t)=>(y=e,l.polyfill("fetch")(e,t))))(s,p),b=new Error,g=_.catch((e=>{throw{[t]:e}})).then((e=>{var t;if(!e.ok){const r=new c;if(r.cause=b,r.stack=r.stack+"\nCAUSE: "+b.stack,r.response=e,r.status=e.status,r.url=y,"opaque"===e.type)throw r;const o="json"===l.errorType||"application/json"===(null===(t=e.headers.get("Content-Type"))||void 0===t?void 0:t.split(";")[0]);return(l.errorType?o?e.text():e[l.errorType]():Promise.resolve(e.body)).then((t=>{if(r.message="string"==typeof t?t:e.statusText,t)if(o&&"string"==typeof t){r.text=t;try{r.json=JSON.parse(t)}catch(e){}}else r[l.errorType]=t;throw r}))}return e})),w=o=>s=>(o?g.then((e=>e&&e[o]())).then((e=>s?s(e):e)):g.then((e=>s?s(e):e))).catch((o=>{const s=Object.prototype.hasOwnProperty.call(o,t),n=s?o[t]:o,i=(null==n?void 0:n.status)&&d.get(n.status)||d.get(null==n?void 0:n.name)||s&&d.has(t)&&d.get(t);if(i)return i(n,e);const c=d.get(r);if(c)return c(n,e);throw n})),m={_wretchReq:e,_fetchReq:_,_sharedState:o,res:w(null),json:w("json"),blob:w("blob"),formData:w("formData"),arrayBuffer:w("arrayBuffer"),text:w("text"),error(e,t){return d.set(e,t),this},badRequest(e){return this.error(400,e)},unauthorized(e){return this.error(401,e)},forbidden(e){return this.error(403,e)},notFound(e){return this.error(404,e)},timeout(e){return this.error(408,e)},internalError(e){return this.error(500,e)},fetchError(e){return this.error(t,e)}},j=f.reduce(((e,t)=>({...e,..."function"==typeof t.resolver?t.resolver(e):t.resolver})),m);return u.reduce(((t,r)=>r(t,e)),j)},h={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(e){return{...this,_addons:[...this._addons,e],...e.wretch}},errorType(e){return{...this,_config:{...this._config,errorType:e}}},polyfills(e,t=0){return{...this,_config:{...this._config,polyfills:t?e:n(this._config.polyfills,e)}}},url(e,t=0){if(t)return{...this,_url:e};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+e+"?"+r[1]:this._url+e}},options(e,t=0){return{...this,_options:t?e:n(this._options,e)}},headers(e){const t=e?Array.isArray(e)?Object.fromEntries(e):"entries"in e?Object.fromEntries(e.entries()):e:{};return{...this,_options:n(this._options,{headers:t})}},accept(e){return this.headers({Accept:e})},content(t){return this.headers({[e]:t})},auth(e){return this.headers({Authorization:e})},catcher(e,t){const r=new Map(this._catchers);return r.set(e,t),{...this,_catchers:r}},catcherFallback(e){return this.catcher(r,e)},resolve(e,t=0){return{...this,_resolvers:t?[e]:[...this._resolvers,e]}},defer(e,t=0){return{...this,_deferred:t?[e]:[...this._deferred,e]}},middlewares(e,t=0){return{...this,_middlewares:t?e:[...this._middlewares,...e]}},fetch(e=this._options.method,t="",r=null){let n=this.url(t).options({method:e});const i=o(n._options.headers),c=this._config.polyfill("FormData",0),h="object"==typeof r&&!(c&&r instanceof c)&&(!n._options.headers||!i||s(i));return n=r?h?n.json(r,i):n.body(r):n,l(n._deferred.reduce(((e,t)=>t(e,e._url,e._options)),n))},get(e=""){return this.fetch("GET",e)},delete(e=""){return this.fetch("DELETE",e)},put(e,t=""){return this.fetch("PUT",t,e)},post(e,t=""){return this.fetch("POST",t,e)},patch(e,t=""){return this.fetch("PATCH",t,e)},head(e=""){return this.fetch("HEAD",e)},opts(e=""){return this.fetch("OPTIONS",e)},body(e){return{...this,_options:{...this._options,body:e}}},json(e,t){const r=o(this._options.headers);return this.content(t||s(r)&&r||"application/json").body(JSON.stringify(e))}};function u(e="",t={}){return{...h,_url:e,_options:t}}return u.default=u,u.options=function(e,t=0){i.options=t?e:n(i.options,e)},u.errorType=function(e){i.errorType=e},u.polyfills=function(e,t=0){i.polyfills=t?e:n(i.polyfills,e)},u.WretchError=c,u}));
//# sourceMappingURL=wretch.min.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"wretch.min.js","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/index.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport { WretchError } from \"./resolver.js\"\nimport type { Wretch, WretchOptions } from \"./types.js\"\n\nexport type {\n Wretch,\n Config,\n ConfiguredMiddleware,\n FetchLike,\n Middleware,\n WretchResponseChain,\n WretchOptions,\n WretchError,\n WretchErrorCallback,\n WretchResponse,\n WretchDeferredCallback,\n WretchAddon\n} from \"./types.js\"\n\n/**\n * Creates a new wretch instance with a base url and base\n * [fetch options](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch).\n *\n * ```ts\n * import wretch from \"wretch\"\n *\n * // Reusable instance\n * const w = wretch(\"https://domain.com\", { mode: \"cors\" })\n * ```\n *\n * @param _url The base url\n * @param _options The base fetch options\n * @returns A fresh wretch instance\n */\nfunction factory(_url = \"\", _options: WretchOptions = {}): Wretch {\n return { ...core, _url, _options }\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","factory"],"mappings":"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"}
{"version":3,"file":"wretch.min.js","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/index.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport { WretchError } from \"./resolver.js\"\nimport type { Wretch, WretchOptions } from \"./types.js\"\n\nexport type {\n Wretch,\n Config,\n ConfiguredMiddleware,\n FetchLike,\n Middleware,\n WretchResponseChain,\n WretchOptions,\n WretchError,\n WretchErrorCallback,\n WretchResponse,\n WretchDeferredCallback,\n WretchAddon\n} from \"./types.js\"\n\n/**\n * Creates a new wretch instance with a base url and base\n * [fetch options](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch).\n *\n * ```ts\n * import wretch from \"wretch\"\n *\n * // Reusable instance\n * const w = wretch(\"https://domain.com\", { mode: \"cors\" })\n * ```\n *\n * @param _url The base url\n * @param _options The base fetch options\n * @returns A fresh wretch instance\n */\nfunction factory(_url = \"\", _options: WretchOptions = {}): Wretch {\n return { ...core, _url, _options }\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","factory"],"mappings":"uOAAO,MACMA,EAAsB,eACtBC,EAAcC,SACdC,EAAmBD,SCDhB,SAAAE,EAAmBC,EAAuB,UACxD,MAAMC,EAAoBD,aAAmBE,MAAQC,OAAOC,YAAYJ,GAAWA,EACnF,OAEI,QAFGK,EAAAF,OAAOG,QAAQL,GAAmBM,MAAK,EAAEC,KAC9CA,EAAEC,gBAAkBd,EAAoBc,uBACtC,IAAAJ,OAAA,EAAAA,EAAA,EACN,CAEM,SAAUK,EAAiBC,GAC/B,MAAO,yBAAyBC,KAAKD,EACvC,CAEO,MAAME,EAAM,SAAUC,EAAaC,EAAaC,EAAuB,GAC5E,OAAOb,OAAOG,QAAQS,GAAKE,QAAO,CAACC,GAAMC,EAAKC,MAC5C,MAAMT,EAAQG,EAAIK,GASlB,OARIjB,MAAMmB,QAAQV,IAAUT,MAAMmB,QAAQD,GACxCF,EAAIC,GAAOH,EAAc,IAAIL,KAAUS,GAAYA,EAEnDF,EAAIC,GADsB,iBAAVR,GAA0C,iBAAbS,EAClCP,EAAIF,EAAOS,EAAUJ,GAErBI,EAGNF,CAAG,GACT,IAAKJ,GACV,ECrBMQ,EAAiB,CAErBC,QAAS,CAAE,EAEXC,UAAW,OAEXC,UAAW,CAQV,EACDC,SAASC,EAAWC,EAAmB,EAAMC,EAAoB,KAAUC,GACzE,MAAMC,EAAMC,KAAKP,UAAUE,KACR,oBAATM,KAAuBA,KAAKN,GAAK,QACtB,oBAAXO,OAAyBA,OAAOP,GAAK,MAC/C,GAAIC,IAAYG,EAAK,MAAM,IAAII,MAAMR,EAAI,mBACzC,OAAOE,GAAYE,EAAM,IAAIA,KAAOD,GAAQC,CAC7C,GCjBG,MAAOK,UAAoBD,OAQ1B,MAAME,EAAyBC,IACpC,MAAMC,EAAcpC,OAAOqC,OAAO,MAElCF,EAASA,EAAOG,QAAQxB,QAAO,CAACyB,EAAGC,IACjCA,EAAMC,eACND,EAAMC,cAAcF,EAAGJ,EAAOO,SAAUN,IACrCG,GACLJ,GAEA,MACEQ,KAAMC,EACNF,SAAUG,EACVC,QAAS3B,EACT4B,UAAWA,EACXC,WAAYC,EACZC,aAAcC,EACdb,QAASc,GACPjB,EAEEkB,EAAW,IAAIC,IAAIP,GACnBQ,EAAe7C,EAAIS,EAAOC,QAASyB,GAGzC,IAAIW,EAAWZ,EACf,MAAMa,ECpCwB,CAACN,GAAyCO,GACjEP,EAAYQ,aAAY,CAAC5C,EAAK6C,IAASA,EAAK7C,IAAM2C,IAAkBA,EDmCzDG,CAAiBV,EAAjBU,EAA8B,CAACjB,EAAKxB,KACpDoC,EAAWZ,EACJzB,EAAOI,SAAS,QAAhBJ,CAAyByB,EAAKxB,KAFrByC,CAGfjB,EAAKW,GAEFO,EAAiB,IAAI9B,MACrB+B,EAAkDN,EACrDO,OAAMC,IACL,KAAM,CAAExE,CAACA,GAAcwE,EAAO,IAE/BC,MAAKC,UACJ,IAAKA,EAASC,GAAI,CAChB,MAAMC,EAAM,IAAIpC,EAQhB,GANAoC,EAAW,MAAIP,EACfO,EAAIC,MAAQD,EAAIC,MAAQ,YAAcR,EAAeQ,MACrDD,EAAIF,SAAWA,EACfE,EAAIE,OAASJ,EAASI,OACtBF,EAAIzB,IAAMY,EAEY,WAAlBW,EAASK,KACX,MAAMH,EAGR,MAAMI,EAAqC,SAArBtD,EAAOE,WAAgF,sBAApB,QAApCnB,EAAAiE,EAAStE,QAAQ6E,IAAI,uBAAe,IAAAxE,OAAA,EAAAA,EAAEyE,MAAM,KAAK,IAMtG,OAJGxD,EAAOE,UACNoD,EAAgBN,EAASS,OACvBT,EAAShD,EAAOE,aAFAwD,QAAQC,QAAQX,EAASY,OAI5Bb,MAAMa,IAEvB,GADAV,EAAIW,QAA0B,iBAATD,EAAoBA,EAAOZ,EAASc,WACtDF,EACD,GAAGN,GAAiC,iBAATM,EAAmB,CAC5CV,EAAIO,KAAOG,EACX,IAAMV,EAAIa,KAAOC,KAAKC,MAAML,EAAO,CACnC,MAAoB7E,GAAE,CACvB,MACCmE,EAAIlD,EAAOE,WAAa0D,EAG5B,MAAMV,CAAG,GAEZ,CACD,OAAOF,CAAQ,IA0BbkB,EAAyBC,GAAWC,IAAMD,EAE9BvB,EAAgBG,MAAKsB,GAAKA,GAAKA,EAAEF,OAAYpB,MAAKsB,GAAKD,EAAKA,EAAGC,GAAKA,IAEpEzB,EAAgBG,MAAKsB,GAAKD,EAAKA,EAAGC,GAAYA,KA1B/CxB,OAAMK,IACnB,MAAMoB,EAAiBzF,OAAO0F,UAAUC,eAAeC,KAAKvB,EAAK5E,GAC3DwE,EAAQwB,EAAiBpB,EAAI5E,GAAe4E,EAE5CwB,GACH5B,eAAAA,EAAOM,SAAUlB,EAASqB,IAAIT,EAAMM,SACrClB,EAASqB,IAAIT,aAAA,EAAAA,EAAO6B,OAClBL,GAAkBpC,EAAS0C,IAAItG,IAAgB4D,EAASqB,IAAIjF,GAGhE,GAAIoG,EACF,OAAOA,EAAQ5B,EAAO9B,GAExB,MAAM6D,EAAkB3C,EAASqB,IAAI/E,GACrC,GAAIqG,EACF,OAAOA,EAAgB/B,EAAO9B,GAEhC,MAAM8B,CAAK,IAWTgC,EAAkD,CACtDC,WAAY/D,EACZsB,YACA0C,aAAc/D,EACdR,IAAKyD,EAA2B,MAChCH,KAAMG,EAAgB,QACtBe,KAAMf,EAAiB,QACvBgB,SAAUhB,EAAqB,YAC/BiB,YAAajB,EAAwB,eACrCT,KAAMS,EAAmB,QACzBpB,MAAMsC,EAAShB,GAEb,OADAlC,EAASmD,IAAID,EAAShB,GACf1D,IACR,EACD4E,WAAWlB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC7CmB,aAAanB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC/CoB,UAAUpB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC5CqB,SAASrB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC3CsB,QAAQtB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAC1CuB,cAAcvB,GAAM,OAAO1D,KAAKoC,MAAM,IAAKsB,EAAK,EAChDwB,WAAWxB,GAAM,OAAO1D,KAAKoC,MAAMxE,EAAa8F,EAAK,GAGjDyB,EAAoG5D,EAAOtC,QAAO,CAACmG,EAAOzE,KAAW,IACtIyE,KAC2B,mBAAnBzE,EAAMN,SAA2BM,EAAMN,SAA0D+E,GAASzE,EAAMN,YACzH+D,GAEJ,OAAOhD,EAAUnC,QAAO,CAACmG,EAAOC,IAAMA,EAAED,EAAO9E,IAAS6E,EAAsB,EE3InEG,EAAe,CAC1BxE,KAAM,GACND,SAAU,CAAE,EACZI,QAAS3B,EACT4B,UAAW,IAAIO,IACfN,WAAY,GACZoE,UAAW,GACXlE,aAAc,GACdZ,QAAS,GACTE,MAAMA,GACJ,MAAO,IAAKX,KAAMS,QAAS,IAAIT,KAAKS,QAASE,MAAWA,EAAML,OAC/D,EACDd,UAAUA,GACR,MAAO,IACFQ,KACHiB,QAAS,IACJjB,KAAKiB,QACRzB,aAGL,EACDC,UAAUA,EAAW+F,EAAU,GAC7B,MAAO,IACFxF,KACHiB,QAAS,IACJjB,KAAKiB,QACRxB,UAAW+F,EAAU/F,EAAYZ,EAAImB,KAAKiB,QAAQxB,UAAWA,IAGlE,EACDsB,IAAID,EAAM0E,EAAU,GAClB,GAAIA,EACF,MAAO,IAAKxF,KAAMc,QACpB,MAAMgC,EAAQ9C,KAAKc,KAAKgC,MAAM,KAC9B,MAAO,IACF9C,KACHc,KAAMgC,EAAM2C,OAAS,EACnB3C,EAAM,GAAKhC,EAAO,IAAMgC,EAAM,GAC9B9C,KAAKc,KAAOA,EAEjB,EACDvB,QAAQA,EAASiG,EAAU,GACzB,MAAO,IAAKxF,KAAMa,SAAU2E,EAAUjG,EAAUV,EAAImB,KAAKa,SAAUtB,GACpE,EACDvB,QAAQ0H,GACN,MAAM1H,EACH0H,EACCxH,MAAMmB,QAAQqG,GAAgBvH,OAAOC,YAAYsH,GAC/C,YAAaA,EAAevH,OAAOC,YAAasH,EAAyBpH,WACvEoH,EAHU,CAAE,EAIpB,MAAO,IAAK1F,KAAMa,SAAUhC,EAAImB,KAAKa,SAAU,CAAE7C,YAClD,EACD2H,OAAOC,GACL,OAAO5F,KAAKhC,QAAQ,CAAE6H,OAAQD,GAC/B,EACDE,QAAQF,GACN,OAAO5F,KAAKhC,QAAQ,CAAEL,CAACA,GAAsBiI,GAC9C,EACDG,KAAKH,GACH,OAAO5F,KAAKhC,QAAQ,CAAEgI,cAAeJ,GACtC,EACD5B,QAAQU,EAASV,GACf,MAAMiC,EAAS,IAAIxE,IAAIzB,KAAKkB,WAE5B,OADA+E,EAAOtB,IAAID,EAASV,GACb,IAAKhE,KAAMkB,UAAW+E,EAC9B,EACD9B,gBAAgBH,GACd,OAAOhE,KAAKgE,QAAQlG,EAAkBkG,EACvC,EAEDf,QAAqB5C,EAAU6F,EAAiB,GAC9C,MAAO,IAAKlG,KAAMmB,WAAY+E,EAAQ,CAAC7F,GAAY,IAAIL,KAAKmB,WAAYd,GACzE,EACD8F,MAAMC,EAAUF,EAAiB,GAC/B,MAAO,IACFlG,KACHuF,UAAWW,EAAQ,CAACE,GAAY,IAAIpG,KAAKuF,UAAWa,GAEvD,EACD9E,YAAYA,EAAa4E,EAAQ,GAC/B,MAAO,IACFlG,KACHqB,aAAc6E,EAAQ5E,EAAc,IAAItB,KAAKqB,gBAAiBC,GAEjE,EACD+E,MAAMC,EAAiBtG,KAAKa,SAASyF,OAAQvF,EAAM,GAAImC,EAAO,MAC5D,IAAIqD,EAAOvG,KAAKe,IAAIA,GAAKxB,QAAQ,CAAE+G,WAEnC,MAAME,EAAczI,EAAmBwI,EAAK1F,SAAS7C,SAC/CyI,EAAgBzG,KAAKiB,QAAQvB,SAAS,WAAY,GAClDgH,EACY,iBAATxD,KACLuD,GAAiBvD,aAAgBuD,MACjCF,EAAK1F,SAAS7C,UAAYwI,GAAe9H,EAAiB8H,IAK9D,OAJAD,EACGrD,EACCwD,EAAUH,EAAKlD,KAAKH,EAAMsD,GACxBD,EAAKrD,KAAKA,GAFNqD,EAGHlG,EACLkG,EACGhB,UACAtG,QAAO,CAACC,EAAa6C,IAASA,EAAK7C,EAAKA,EAAI4B,KAAM5B,EAAI2B,WAAW0F,GAEvE,EACD1D,IAAI9B,EAAM,IACR,OAAOf,KAAKqG,MAAM,MAAOtF,EAC1B,EACD4F,OAAO5F,EAAM,IACX,OAAOf,KAAKqG,MAAM,SAAUtF,EAC7B,EACD6F,IAAI1D,EAAMnC,EAAM,IACd,OAAOf,KAAKqG,MAAM,MAAOtF,EAAKmC,EAC/B,EACD2D,KAAK3D,EAAMnC,EAAM,IACf,OAAOf,KAAKqG,MAAM,OAAQtF,EAAKmC,EAChC,EACD4D,MAAM5D,EAAMnC,EAAM,IAChB,OAAOf,KAAKqG,MAAM,QAAStF,EAAKmC,EACjC,EACD6D,KAAKhG,EAAM,IACT,OAAOf,KAAKqG,MAAM,OAAQtF,EAC3B,EACDC,KAAKD,EAAM,IACT,OAAOf,KAAKqG,MAAM,UAAWtF,EAC9B,EACDmC,KAAK8D,GACH,MAAO,IAAKhH,KAAMa,SAAU,IAAKb,KAAKa,SAAUqC,KAAM8D,GACvD,EACD3D,KAAK4D,EAAUT,GACb,MAAMU,EAAqBnJ,EAAmBiC,KAAKa,SAAS7C,SAC5D,OAAOgC,KAAK8F,QACVU,GACA9H,EAAiBwI,IAAuBA,GL1IrB,oBK4InBhE,KAAKI,KAAK6D,UAAUF,GACvB,GC1GH,SAASG,EAAQtG,EAAO,GAAID,EAA0B,CAAA,GACpD,MAAO,IAAKyE,EAAMxE,OAAMD,WAC1B,QAEAuG,EAAiB,QAAIA,EACrBA,EAAQ7H,iBJImBA,EAAwBiG,EAAU,GAC3DlG,EAAOC,QAAUiG,EAAUjG,EAAUV,EAAIS,EAAOC,QAASA,EAC3D,EILA6H,EAAQ5H,UJuDF,SAAuBA,GAC3BF,EAAOE,UAAYA,CACrB,EIxDA4H,EAAQ3H,mBJ4BqBA,EAAmB+F,EAAU,GACxDlG,EAAOG,UAAY+F,EAAU/F,EAAYZ,EAAIS,EAAOG,UAAWA,EACjE,EI7BA2H,EAAQhH,YAAcA"}

@@ -1,2 +0,2 @@

const t="Content-Type",e=Symbol(),r=Symbol();function o(e={}){var r;const o=e instanceof Array?Object.fromEntries(e):e;return null===(r=Object.entries(o).find((([e])=>e.toLowerCase()===t.toLowerCase())))||void 0===r?void 0:r[1]}function s(t){return/^application\/.*json.*/.test(t)}const n=function(t,e,r=0){return Object.entries(e).reduce(((e,[o,s])=>{const i=t[o];return Array.isArray(i)&&Array.isArray(s)?e[o]=r?[...i,...s]:s:e[o]="object"==typeof i&&"object"==typeof s?n(i,s,r):s,e}),{...t})},i={options:{},errorType:"text",polyfills:{},polyfill(t,e=1,r=0,...o){const s=this.polyfills[t]||("undefined"!=typeof self?self[t]:null)||("undefined"!=typeof global?global[t]:null);if(e&&!s)throw new Error(t+" is not defined");return r&&s?new s(...o):s}};class h extends Error{}const l=t=>{const o=Object.create(null);t=t._addons.reduce(((e,r)=>r.beforeRequest&&r.beforeRequest(e,t._options,o)||e),t);const{_url:s,_options:i,_config:l,_catchers:c,_resolvers:u,_middlewares:a,_addons:f}=t,d=new Map(c),p=n(l.options,i);let _=s;const y=(t=>e=>t.reduceRight(((t,e)=>e(t)),e)||e)(a)(((t,e)=>(_=t,l.polyfill("fetch")(t,e))))(s,p),b=new Error,g=y.catch((t=>{throw{[e]:t}})).then((t=>{var e;if(!t.ok){const r=new h;if(r.cause=b,r.stack=r.stack+"\nCAUSE: "+b.stack,r.response=t,r.status=t.status,r.url=_,"opaque"===t.type)throw r;const o="json"===l.errorType||"application/json"===(null===(e=t.headers.get("Content-Type"))||void 0===e?void 0:e.split(";")[0]);return(l.errorType?o?t.text():t[l.errorType]():Promise.resolve(t.body)).then((e=>{throw r.message="string"==typeof e?e:t.statusText,e&&(o&&"string"==typeof e?(r.text=e,r.json=JSON.parse(e)):r[l.errorType]=e),r}))}return t})),w=o=>s=>(o?g.then((t=>t&&t[o]())).then((t=>s?s(t):t)):g.then((t=>s?s(t):t))).catch((o=>{const s=Object.prototype.hasOwnProperty.call(o,e),n=s?o[e]:o,i=(null==n?void 0:n.status)&&d.get(n.status)||d.get(null==n?void 0:n.name)||s&&d.has(e)&&d.get(e);if(i)return i(n,t);const h=d.get(r);if(h)return h(n,t);throw n})),j={_wretchReq:t,_fetchReq:y,_sharedState:o,res:w(null),json:w("json"),blob:w("blob"),formData:w("formData"),arrayBuffer:w("arrayBuffer"),text:w("text"),error(t,e){return d.set(t,e),this},badRequest(t){return this.error(400,t)},unauthorized(t){return this.error(401,t)},forbidden(t){return this.error(403,t)},notFound(t){return this.error(404,t)},timeout(t){return this.error(408,t)},internalError(t){return this.error(500,t)},fetchError(t){return this.error(e,t)}},m=f.reduce(((t,e)=>({...t,..."function"==typeof e.resolver?e.resolver(t):e.resolver})),j);return u.reduce(((e,r)=>r(e,t)),m)},c={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(t){return{...this,_addons:[...this._addons,t],...t.wretch}},errorType(t){return{...this,_config:{...this._config,errorType:t}}},polyfills(t,e=0){return{...this,_config:{...this._config,polyfills:e?t:n(this._config.polyfills,t)}}},url(t,e=0){if(e)return{...this,_url:t};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+t+"?"+r[1]:this._url+t}},options(t,e=0){return{...this,_options:e?t:n(this._options,t)}},headers(t){const e=t?Array.isArray(t)?Object.fromEntries(t):"entries"in t?Object.fromEntries(t.entries()):t:{};return{...this,_options:n(this._options,{headers:e})}},accept(t){return this.headers({Accept:t})},content(e){return this.headers({[t]:e})},auth(t){return this.headers({Authorization:t})},catcher(t,e){const r=new Map(this._catchers);return r.set(t,e),{...this,_catchers:r}},catcherFallback(t){return this.catcher(r,t)},resolve(t,e=0){return{...this,_resolvers:e?[t]:[...this._resolvers,t]}},defer(t,e=0){return{...this,_deferred:e?[t]:[...this._deferred,t]}},middlewares(t,e=0){return{...this,_middlewares:e?t:[...this._middlewares,...t]}},fetch(t=this._options.method,e="",r=null){let n=this.url(e).options({method:t});const i=o(n._options.headers),h=this._config.polyfill("FormData",0),c="object"==typeof r&&!(h&&r instanceof h)&&(!n._options.headers||!i||s(i));return n=r?c?n.json(r,i):n.body(r):n,l(n._deferred.reduce(((t,e)=>e(t,t._url,t._options)),n))},get(t=""){return this.fetch("GET",t)},delete(t=""){return this.fetch("DELETE",t)},put(t,e=""){return this.fetch("PUT",e,t)},post(t,e=""){return this.fetch("POST",e,t)},patch(t,e=""){return this.fetch("PATCH",e,t)},head(t=""){return this.fetch("HEAD",t)},opts(t=""){return this.fetch("OPTIONS",t)},body(t){return{...this,_options:{...this._options,body:t}}},json(t,e){const r=o(this._options.headers);return this.content(e||s(r)&&r||"application/json").body(JSON.stringify(t))}};function u(t="",e={}){return{...c,_url:t,_options:e}}u.default=u,u.options=function(t,e=0){i.options=e?t:n(i.options,t)},u.errorType=function(t){i.errorType=t},u.polyfills=function(t,e=0){i.polyfills=e?t:n(i.polyfills,t)},u.WretchError=h;export{u as default};
const t="Content-Type",e=Symbol(),r=Symbol();function o(e={}){var r;const o=e instanceof Array?Object.fromEntries(e):e;return null===(r=Object.entries(o).find((([e])=>e.toLowerCase()===t.toLowerCase())))||void 0===r?void 0:r[1]}function s(t){return/^application\/.*json.*/.test(t)}const n=function(t,e,r=0){return Object.entries(e).reduce(((e,[o,s])=>{const i=t[o];return Array.isArray(i)&&Array.isArray(s)?e[o]=r?[...i,...s]:s:e[o]="object"==typeof i&&"object"==typeof s?n(i,s,r):s,e}),{...t})},i={options:{},errorType:"text",polyfills:{},polyfill(t,e=1,r=0,...o){const s=this.polyfills[t]||("undefined"!=typeof self?self[t]:null)||("undefined"!=typeof global?global[t]:null);if(e&&!s)throw new Error(t+" is not defined");return r&&s?new s(...o):s}};class h extends Error{}const c=t=>{const o=Object.create(null);t=t._addons.reduce(((e,r)=>r.beforeRequest&&r.beforeRequest(e,t._options,o)||e),t);const{_url:s,_options:i,_config:c,_catchers:l,_resolvers:u,_middlewares:a,_addons:f}=t,d=new Map(l),p=n(c.options,i);let _=s;const y=(t=>e=>t.reduceRight(((t,e)=>e(t)),e)||e)(a)(((t,e)=>(_=t,c.polyfill("fetch")(t,e))))(s,p),b=new Error,g=y.catch((t=>{throw{[e]:t}})).then((t=>{var e;if(!t.ok){const r=new h;if(r.cause=b,r.stack=r.stack+"\nCAUSE: "+b.stack,r.response=t,r.status=t.status,r.url=_,"opaque"===t.type)throw r;const o="json"===c.errorType||"application/json"===(null===(e=t.headers.get("Content-Type"))||void 0===e?void 0:e.split(";")[0]);return(c.errorType?o?t.text():t[c.errorType]():Promise.resolve(t.body)).then((e=>{if(r.message="string"==typeof e?e:t.statusText,e)if(o&&"string"==typeof e){r.text=e;try{r.json=JSON.parse(e)}catch(t){}}else r[c.errorType]=e;throw r}))}return t})),w=o=>s=>(o?g.then((t=>t&&t[o]())).then((t=>s?s(t):t)):g.then((t=>s?s(t):t))).catch((o=>{const s=Object.prototype.hasOwnProperty.call(o,e),n=s?o[e]:o,i=(null==n?void 0:n.status)&&d.get(n.status)||d.get(null==n?void 0:n.name)||s&&d.has(e)&&d.get(e);if(i)return i(n,t);const h=d.get(r);if(h)return h(n,t);throw n})),j={_wretchReq:t,_fetchReq:y,_sharedState:o,res:w(null),json:w("json"),blob:w("blob"),formData:w("formData"),arrayBuffer:w("arrayBuffer"),text:w("text"),error(t,e){return d.set(t,e),this},badRequest(t){return this.error(400,t)},unauthorized(t){return this.error(401,t)},forbidden(t){return this.error(403,t)},notFound(t){return this.error(404,t)},timeout(t){return this.error(408,t)},internalError(t){return this.error(500,t)},fetchError(t){return this.error(e,t)}},m=f.reduce(((t,e)=>({...t,..."function"==typeof e.resolver?e.resolver(t):e.resolver})),j);return u.reduce(((e,r)=>r(e,t)),m)},l={_url:"",_options:{},_config:i,_catchers:new Map,_resolvers:[],_deferred:[],_middlewares:[],_addons:[],addon(t){return{...this,_addons:[...this._addons,t],...t.wretch}},errorType(t){return{...this,_config:{...this._config,errorType:t}}},polyfills(t,e=0){return{...this,_config:{...this._config,polyfills:e?t:n(this._config.polyfills,t)}}},url(t,e=0){if(e)return{...this,_url:t};const r=this._url.split("?");return{...this,_url:r.length>1?r[0]+t+"?"+r[1]:this._url+t}},options(t,e=0){return{...this,_options:e?t:n(this._options,t)}},headers(t){const e=t?Array.isArray(t)?Object.fromEntries(t):"entries"in t?Object.fromEntries(t.entries()):t:{};return{...this,_options:n(this._options,{headers:e})}},accept(t){return this.headers({Accept:t})},content(e){return this.headers({[t]:e})},auth(t){return this.headers({Authorization:t})},catcher(t,e){const r=new Map(this._catchers);return r.set(t,e),{...this,_catchers:r}},catcherFallback(t){return this.catcher(r,t)},resolve(t,e=0){return{...this,_resolvers:e?[t]:[...this._resolvers,t]}},defer(t,e=0){return{...this,_deferred:e?[t]:[...this._deferred,t]}},middlewares(t,e=0){return{...this,_middlewares:e?t:[...this._middlewares,...t]}},fetch(t=this._options.method,e="",r=null){let n=this.url(e).options({method:t});const i=o(n._options.headers),h=this._config.polyfill("FormData",0),l="object"==typeof r&&!(h&&r instanceof h)&&(!n._options.headers||!i||s(i));return n=r?l?n.json(r,i):n.body(r):n,c(n._deferred.reduce(((t,e)=>e(t,t._url,t._options)),n))},get(t=""){return this.fetch("GET",t)},delete(t=""){return this.fetch("DELETE",t)},put(t,e=""){return this.fetch("PUT",e,t)},post(t,e=""){return this.fetch("POST",e,t)},patch(t,e=""){return this.fetch("PATCH",e,t)},head(t=""){return this.fetch("HEAD",t)},opts(t=""){return this.fetch("OPTIONS",t)},body(t){return{...this,_options:{...this._options,body:t}}},json(t,e){const r=o(this._options.headers);return this.content(e||s(r)&&r||"application/json").body(JSON.stringify(t))}};function u(t="",e={}){return{...l,_url:t,_options:e}}u.default=u,u.options=function(t,e=0){i.options=e?t:n(i.options,t)},u.errorType=function(t){i.errorType=t},u.polyfills=function(t,e=0){i.polyfills=e?t:n(i.polyfills,t)},u.WretchError=h;export{u as default};
//# sourceMappingURL=wretch.min.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"wretch.min.mjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/index.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport { WretchError } from \"./resolver.js\"\nimport type { Wretch, WretchOptions } from \"./types.js\"\n\nexport type {\n Wretch,\n Config,\n ConfiguredMiddleware,\n FetchLike,\n Middleware,\n WretchResponseChain,\n WretchOptions,\n WretchError,\n WretchErrorCallback,\n WretchResponse,\n WretchDeferredCallback,\n WretchAddon\n} from \"./types.js\"\n\n/**\n * Creates a new wretch instance with a base url and base\n * [fetch options](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch).\n *\n * ```ts\n * import wretch from \"wretch\"\n *\n * // Reusable instance\n * const w = wretch(\"https://domain.com\", { mode: \"cors\" })\n * ```\n *\n * @param _url The base url\n * @param _options The base fetch options\n * @returns A fresh wretch instance\n */\nfunction factory(_url = \"\", _options: WretchOptions = {}): Wretch {\n return { ...core, _url, _options }\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","factory"],"mappings":"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"}
{"version":3,"file":"wretch.min.mjs","sources":["../../src/constants.ts","../../src/utils.ts","../../src/config.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/core.ts","../../src/index.ts"],"sourcesContent":["export const JSON_MIME = \"application/json\"\nexport const CONTENT_TYPE_HEADER = \"Content-Type\"\nexport const FETCH_ERROR = Symbol()\nexport const CATCHER_FALLBACK = Symbol()\n","import { CONTENT_TYPE_HEADER } from \"./constants.js\"\n\nexport function extractContentType(headers: HeadersInit = {}): string | undefined {\n const normalizedHeaders = headers instanceof Array ? Object.fromEntries(headers) : headers\n return Object.entries(normalizedHeaders).find(([k]) =>\n k.toLowerCase() === CONTENT_TYPE_HEADER.toLowerCase()\n )?.[1]\n}\n\nexport function isLikelyJsonMime(value: string): boolean {\n return /^application\\/.*json.*/.test(value)\n}\n\nexport const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n return Object.entries(two).reduce((acc, [key, newValue]) => {\n const value = one[key]\n if (Array.isArray(value) && Array.isArray(newValue)) {\n acc[key] = mergeArrays ? [...value, ...newValue] : newValue\n } else if (typeof value === \"object\" && typeof newValue === \"object\") {\n acc[key] = mix(value, newValue, mergeArrays)\n } else {\n acc[key] = newValue\n }\n\n return acc\n }, { ...one })\n}\n","import { mix } from \"./utils.js\"\nimport type { Config, ErrorType, WretchOptions } from \"./types.js\"\n\ndeclare const global\n\nconst config: Config = {\n // Default options\n options: {},\n // Error type\n errorType: \"text\",\n // Polyfills\n polyfills: {\n // fetch: null,\n // FormData: null,\n // URL: null,\n // URLSearchParams: null,\n // performance: null,\n // PerformanceObserver: null,\n // AbortController: null,\n },\n polyfill(p: string, doThrow: boolean = true, instance: boolean = false, ...args: any[]) {\n const res = this.polyfills[p] ||\n (typeof self !== \"undefined\" ? self[p] : null) ||\n (typeof global !== \"undefined\" ? global[p] : null)\n if (doThrow && !res) throw new Error(p + \" is not defined\")\n return instance && res ? new res(...args) : res\n }\n}\n\n/**\n * Sets the default fetch options that will be stored internally when instantiating wretch objects.\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.options({ headers: { \"Accept\": \"application/json\" } });\n *\n * // The fetch request is sent with both headers.\n * wretch(\"...\", { headers: { \"X-Custom\": \"Header\" } }).get().res();\n * ```\n *\n * @param options Default options\n * @param replace If true, completely replaces the existing options instead of mixing in\n */\nexport function setOptions(options: WretchOptions, replace = false) {\n config.options = replace ? options : mix(config.options, options)\n}\n\n/**\n * Sets the default polyfills that will be stored internally when instantiating wretch objects.\n * Useful for browserless environments like `node.js`.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.polyfills({\n * fetch: require(\"node-fetch\"),\n * FormData: require(\"form-data\"),\n * URLSearchParams: require(\"url\").URLSearchParams,\n * });\n *\n * // Uses the above polyfills.\n * wretch(\"...\").get().res();\n * ```\n *\n * @param polyfills An object containing the polyfills\n * @param replace If true, replaces the current polyfills instead of mixing in\n */\nexport function setPolyfills(polyfills: object, replace = false) {\n config.polyfills = replace ? polyfills : mix(config.polyfills, polyfills)\n}\n\n/**\n * Sets the default method (text, json, …) used to parse the data contained in the response body in case of an HTTP error.\n * As with other static methods, it will affect wretch instances created after calling this function.\n *\n * _Note: if the response Content-Type header is set to \"application/json\", the body will be parsed as json regardless of the errorType._\n *\n * ```js\n * import wretch from \"wretch\"\n *\n * wretch.errorType(\"json\")\n *\n * wretch(\"http://server/which/returns/an/error/with/a/json/body\")\n * .get()\n * .res()\n * .catch(error => {\n * // error[errorType] (here, json) contains the parsed body\n * console.log(error.json)\n * })\n * ```\n *\n * If null, defaults to \"text\".\n */\nexport function setErrorType(errorType: ErrorType) {\n config.errorType = errorType\n}\n\nexport default config\n","import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n","import type { ConfiguredMiddleware, FetchLike } from \"./types.js\"\n\n/**\n * @private @internal\n */\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return middlewares.reduceRight((acc, curr) => curr(acc), fetchFunction) || fetchFunction\n}\n","import { mix, extractContentType, isLikelyJsonMime } from \"./utils.js\"\nimport { JSON_MIME, CONTENT_TYPE_HEADER, CATCHER_FALLBACK } from \"./constants.js\"\nimport { resolver } from \"./resolver.js\"\nimport config from \"./config.js\"\nimport type { Wretch, ErrorType } from \"./types.js\"\n\nexport const core: Wretch = {\n _url: \"\",\n _options: {},\n _config: config,\n _catchers: new Map(),\n _resolvers: [],\n _deferred: [],\n _middlewares: [],\n _addons: [],\n addon(addon) {\n return { ...this, _addons: [...this._addons, addon], ...addon.wretch }\n },\n errorType(errorType: ErrorType) {\n return {\n ...this,\n _config: {\n ...this._config,\n errorType\n }\n }\n },\n polyfills(polyfills, replace = false) {\n return {\n ...this,\n _config: {\n ...this._config,\n polyfills: replace ? polyfills : mix(this._config.polyfills, polyfills)\n }\n }\n },\n url(_url, replace = false) {\n if (replace)\n return { ...this, _url }\n const split = this._url.split(\"?\")\n return {\n ...this,\n _url: split.length > 1 ?\n split[0] + _url + \"?\" + split[1] :\n this._url + _url\n }\n },\n options(options, replace = false) {\n return { ...this, _options: replace ? options : mix(this._options, options) }\n },\n headers(headerValues) {\n const headers =\n !headerValues ? {} :\n Array.isArray(headerValues) ? Object.fromEntries(headerValues) :\n \"entries\" in headerValues ? Object.fromEntries((headerValues as Headers).entries()) :\n headerValues\n return { ...this, _options: mix(this._options, { headers }) }\n },\n accept(headerValue) {\n return this.headers({ Accept: headerValue })\n },\n content(headerValue) {\n return this.headers({ [CONTENT_TYPE_HEADER]: headerValue })\n },\n auth(headerValue) {\n return this.headers({ Authorization: headerValue })\n },\n catcher(errorId, catcher) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return { ...this, _catchers: newMap }\n },\n catcherFallback(catcher) {\n return this.catcher(CATCHER_FALLBACK, catcher)\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n resolve<R = unknown>(resolver, clear: boolean = false) {\n return { ...this, _resolvers: clear ? [resolver] : [...this._resolvers, resolver] }\n },\n defer(callback, clear: boolean = false) {\n return {\n ...this,\n _deferred: clear ? [callback] : [...this._deferred, callback]\n }\n },\n middlewares(middlewares, clear = false) {\n return {\n ...this,\n _middlewares: clear ? middlewares : [...this._middlewares, ...middlewares]\n }\n },\n fetch(method: string = this._options.method, url = \"\", body = null) {\n let base = this.url(url).options({ method })\n // \"Jsonify\" the body if it is an object and if it is likely that the content type targets json.\n const contentType = extractContentType(base._options.headers)\n const formDataClass = this._config.polyfill(\"FormData\", false)\n const jsonify =\n typeof body === \"object\" &&\n !(formDataClass && body instanceof formDataClass) &&\n (!base._options.headers || !contentType || isLikelyJsonMime(contentType))\n base =\n !body ? base :\n jsonify ? base.json(body, contentType) :\n base.body(body)\n return resolver(\n base\n ._deferred\n .reduce((acc: Wretch, curr) => curr(acc, acc._url, acc._options), base)\n )\n },\n get(url = \"\") {\n return this.fetch(\"GET\", url)\n },\n delete(url = \"\") {\n return this.fetch(\"DELETE\", url)\n },\n put(body, url = \"\") {\n return this.fetch(\"PUT\", url, body)\n },\n post(body, url = \"\") {\n return this.fetch(\"POST\", url, body)\n },\n patch(body, url = \"\") {\n return this.fetch(\"PATCH\", url, body)\n },\n head(url = \"\") {\n return this.fetch(\"HEAD\", url)\n },\n opts(url = \"\") {\n return this.fetch(\"OPTIONS\", url)\n },\n body(contents) {\n return { ...this, _options: { ...this._options, body: contents } }\n },\n json(jsObject, contentType) {\n const currentContentType = extractContentType(this._options.headers)\n return this.content(\n contentType ||\n isLikelyJsonMime(currentContentType) && currentContentType ||\n JSON_MIME\n ).body(JSON.stringify(jsObject))\n }\n}\n","import { setOptions, setErrorType, setPolyfills } from \"./config.js\"\nimport { core } from \"./core.js\"\nimport { WretchError } from \"./resolver.js\"\nimport type { Wretch, WretchOptions } from \"./types.js\"\n\nexport type {\n Wretch,\n Config,\n ConfiguredMiddleware,\n FetchLike,\n Middleware,\n WretchResponseChain,\n WretchOptions,\n WretchError,\n WretchErrorCallback,\n WretchResponse,\n WretchDeferredCallback,\n WretchAddon\n} from \"./types.js\"\n\n/**\n * Creates a new wretch instance with a base url and base\n * [fetch options](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch).\n *\n * ```ts\n * import wretch from \"wretch\"\n *\n * // Reusable instance\n * const w = wretch(\"https://domain.com\", { mode: \"cors\" })\n * ```\n *\n * @param _url The base url\n * @param _options The base fetch options\n * @returns A fresh wretch instance\n */\nfunction factory(_url = \"\", _options: WretchOptions = {}): Wretch {\n return { ...core, _url, _options }\n}\n\nfactory[\"default\"] = factory\nfactory.options = setOptions\nfactory.errorType = setErrorType\nfactory.polyfills = setPolyfills\nfactory.WretchError = WretchError\n\nexport default factory\n"],"names":["CONTENT_TYPE_HEADER","FETCH_ERROR","Symbol","CATCHER_FALLBACK","extractContentType","headers","normalizedHeaders","Array","Object","fromEntries","_a","entries","find","k","toLowerCase","isLikelyJsonMime","value","test","mix","one","two","mergeArrays","reduce","acc","key","newValue","isArray","config","options","errorType","polyfills","polyfill","p","doThrow","instance","args","res","this","self","global","Error","WretchError","resolver","wretch","sharedState","create","_addons","w","addon","beforeRequest","_options","_url","url","opts","_config","_catchers","_resolvers","resolvers","_middlewares","middlewares","addons","catchers","Map","finalOptions","finalUrl","_fetchReq","fetchFunction","reduceRight","curr","middlewareHelper","referenceError","throwingPromise","catch","error","then","response","ok","err","stack","status","type","jsonErrorType","get","split","text","Promise","resolve","body","message","statusText","json","JSON","parse","bodyParser","funName","cb","_","fetchErrorFlag","prototype","hasOwnProperty","call","catcher","name","has","catcherFallback","responseChain","_wretchReq","_sharedState","blob","formData","arrayBuffer","errorId","set","badRequest","unauthorized","forbidden","notFound","timeout","internalError","fetchError","enhancedResponseChain","chain","r","core","_deferred","replace","length","headerValues","accept","headerValue","Accept","content","auth","Authorization","newMap","clear","defer","callback","fetch","method","base","contentType","formDataClass","jsonify","delete","put","post","patch","head","contents","jsObject","currentContentType","stringify","factory"],"mappings":"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"}

@@ -56,3 +56,6 @@ "use strict";

err.text = body;
err.json = JSON.parse(body);
try {
err.json = JSON.parse(body);
}
catch ( /* ignore */_a) { /* ignore */ }
}

@@ -59,0 +62,0 @@ else {

@@ -1,1 +0,1 @@

{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n"]}
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n"]}

@@ -52,3 +52,6 @@ import { middlewareHelper } from "./middleware.js";

err.text = body;
err.json = JSON.parse(body);
try {
err.json = JSON.parse(body);
}
catch ( /* ignore */_a) { /* ignore */ }
}

@@ -55,0 +58,0 @@ else {

@@ -1,1 +0,1 @@

{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n err.json = JSON.parse(body)\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n"]}
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { middlewareHelper } from \"./middleware.js\"\nimport { mix } from \"./utils.js\"\nimport type { Wretch, WretchResponse, WretchResponseChain, WretchError as WretchErrorType } from \"./types.js\"\nimport { FETCH_ERROR, CATCHER_FALLBACK } from \"./constants.js\"\n\n/**\n * This class inheriting from Error is thrown when the fetch response is not \"ok\".\n * It extends Error and adds status, text and body fields.\n */\nexport class WretchError extends Error implements WretchErrorType {\n status: number\n response: WretchResponse\n url: string\n text?: string\n json?: any\n}\n\nexport const resolver = <T, Chain, R>(wretch: T & Wretch<T, Chain, R>) => {\n const sharedState = Object.create(null)\n\n wretch = wretch._addons.reduce((w, addon) =>\n addon.beforeRequest &&\n addon.beforeRequest(w, wretch._options, sharedState)\n || w,\n wretch)\n\n const {\n _url: url,\n _options: opts,\n _config: config,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _addons: addons\n } = wretch\n\n const catchers = new Map(_catchers)\n const finalOptions = mix(config.options, opts)\n\n // The generated fetch request\n let finalUrl = url\n const _fetchReq = middlewareHelper(middlewares)((url, options) => {\n finalUrl = url\n return config.polyfill(\"fetch\")(url, options)\n })(url, finalOptions)\n // Throws on an http error\n const referenceError = new Error()\n const throwingPromise: Promise<void | WretchResponse> = _fetchReq\n .catch(error => {\n throw { [FETCH_ERROR]: error }\n })\n .then(response => {\n if (!response.ok) {\n const err = new WretchError()\n // Enhance the error object\n err[\"cause\"] = referenceError\n err.stack = err.stack + \"\\nCAUSE: \" + referenceError.stack\n err.response = response\n err.status = response.status\n err.url = finalUrl\n\n if (response.type === \"opaque\") {\n throw err\n }\n\n const jsonErrorType = config.errorType === \"json\" || response.headers.get(\"Content-Type\")?.split(\";\")[0] === \"application/json\"\n const bodyPromise =\n !config.errorType ? Promise.resolve(response.body) :\n jsonErrorType ? response.text() :\n response[config.errorType]()\n\n return bodyPromise.then((body: unknown) => {\n err.message = typeof body === \"string\" ? body : response.statusText\n if(body) {\n if(jsonErrorType && typeof body === \"string\") {\n err.text = body\n try { err.json = JSON.parse(body) }\n catch { /* ignore */ }\n } else {\n err[config.errorType] = body\n }\n }\n throw err\n })\n }\n return response\n })\n // Wraps the Promise in order to dispatch the error to a matching catcher\n const catchersWrapper = <T>(promise: Promise<T>): Promise<void | T> => {\n return promise.catch(err => {\n const fetchErrorFlag = Object.prototype.hasOwnProperty.call(err, FETCH_ERROR)\n const error = fetchErrorFlag ? err[FETCH_ERROR] : err\n\n const catcher =\n (error?.status && catchers.get(error.status)) ||\n catchers.get(error?.name) || (\n fetchErrorFlag && catchers.has(FETCH_ERROR) && catchers.get(FETCH_ERROR)\n )\n\n if (catcher)\n return catcher(error, wretch)\n\n const catcherFallback = catchers.get(CATCHER_FALLBACK)\n if (catcherFallback)\n return catcherFallback(error, wretch)\n\n throw error\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = <Type>(funName: \"json\" | \"blob\" | \"formData\" | \"arrayBuffer\" | \"text\" | null) => <Result = void>(cb?: (type: Type) => Result) => Promise<Awaited<Result>>\n const bodyParser: BodyParser = funName => cb => funName ?\n // If a callback is provided, then callback with the body result otherwise return the parsed body itself.\n catchersWrapper(throwingPromise.then(_ => _ && _[funName]()).then(_ => cb ? cb(_) : _)) :\n // No body parsing method - return the response\n catchersWrapper(throwingPromise.then(_ => cb ? cb(_ as any) : _))\n\n const responseChain: WretchResponseChain<T, Chain, R> = {\n _wretchReq: wretch,\n _fetchReq,\n _sharedState: sharedState,\n res: bodyParser<WretchResponse>(null),\n json: bodyParser<any>(\"json\"),\n blob: bodyParser<Blob>(\"blob\"),\n formData: bodyParser<FormData>(\"formData\"),\n arrayBuffer: bodyParser<ArrayBuffer>(\"arrayBuffer\"),\n text: bodyParser<string>(\"text\"),\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return this\n },\n badRequest(cb) { return this.error(400, cb) },\n unauthorized(cb) { return this.error(401, cb) },\n forbidden(cb) { return this.error(403, cb) },\n notFound(cb) { return this.error(404, cb) },\n timeout(cb) { return this.error(408, cb) },\n internalError(cb) { return this.error(500, cb) },\n fetchError(cb) { return this.error(FETCH_ERROR, cb) },\n }\n\n const enhancedResponseChain: R extends undefined ? Chain & WretchResponseChain<T, Chain, undefined> : R = addons.reduce((chain, addon) => ({\n ...chain,\n ...(typeof addon.resolver === \"function\" ? (addon.resolver as (_: WretchResponseChain<T, Chain, R>) => any)(chain) : addon.resolver)\n }), responseChain)\n\n return resolvers.reduce((chain, r) => r(chain, wretch), enhancedResponseChain)\n}\n"]}
{
"name": "wretch",
"version": "2.11.0",
"version": "2.11.1",
"type": "module",

@@ -5,0 +5,0 @@ "description": "A tiny wrapper built around fetch with an intuitive syntax.",

@@ -680,3 +680,3 @@ <h1 align="center">

> // Replace the default condition with a custom one to avoid retrying on 4xx errors:
> until: (response, error) => response && (response.ok || (response.status >= 400 && response.status < 500))
> until: (response, error) => !!response && (response.ok || (response.status >= 400 && response.status < 500))
> ```

@@ -694,8 +694,8 @@

maxAttempts: 10,
until: (response, error) => response && response.ok,
onRetry: null,
until: (response, error) => !!response && response.ok,
onRetry: undefined,
retryOnNetworkError: false,
resolveWithLatestResponse: false
})
])./* ... */
])

@@ -706,5 +706,5 @@ // You can also return a Promise, which is useful if you want to inspect the body:

until: response =>
response.clone().json().then(body =>
response?.clone().json().then(body =>
body.field === 'something'
)
) || false
})

@@ -729,3 +729,3 @@ ])

})
])./* ... */
])
```

@@ -752,3 +752,3 @@

})
])./* ... */
])
```

@@ -766,3 +766,3 @@

delay(1000)
])./* ... */
])
```

@@ -769,0 +769,0 @@