From 9655b46686b1f976cb41fff6ea9fd151f0da7fd9 Mon Sep 17 00:00:00 2001 From: elbywan Date: Wed, 27 Nov 2019 15:04:26 +0100 Subject: [PATCH] :factory: Add esm bundle. #63 --- dist/bundle/wretch.esm.js | 2 + dist/bundle/wretch.esm.js.map | 1 + dist/bundle/wretch.js | 2 +- dist/bundle/wretch.js.map | 2 +- package-lock.json | 117 ++++++++++++++++++++-------------- package.json | 7 +- rollup.config.js | 25 +++++--- 7 files changed, 92 insertions(+), 64 deletions(-) create mode 100644 dist/bundle/wretch.esm.js create mode 100644 dist/bundle/wretch.esm.js.map diff --git a/dist/bundle/wretch.esm.js b/dist/bundle/wretch.esm.js new file mode 100644 index 0000000..f6c15af --- /dev/null +++ b/dist/bundle/wretch.esm.js @@ -0,0 +1,2 @@ +var r=function(){return(r=Object.assign||function(r){for(var t,e=1,n=arguments.length;e0)&&(e(o.reverse()[0]),n.clearMeasures&&n.clearMeasures(t),i.callbacks.delete(t),i.callbacks.size<1&&(i.observer.disconnect(),n.clearResourceTimings&&n.clearResourceTimings()),!0)},i={callbacks:new Map,observer:null,observe:function(r,t){if(r&&t){var e=n.polyfill("performance",{doThrow:!1});(function(r,t){return!i.observer&&r&&t&&(i.observer=new t((function(t){i.callbacks.forEach((function(e,n){o(t,n,e,r)}))})),r.clearResourceTimings&&r.clearResourceTimings()),i.observer})(e,n.polyfill("PerformanceObserver",{doThrow:!1}))&&(o(e,r,t,e)||(i.callbacks.size<1&&i.observer.observe({entryTypes:["resource","measure"]}),i.callbacks.set(r,t)))}}},s=function(){function o(r,t,e,n,o,i){void 0===e&&(e=new Map),void 0===n&&(n=[]),void 0===o&&(o=[]),void 0===i&&(i=[]),this._url=r,this._options=t,this._catchers=e,this._resolvers=n,this._middlewares=o,this._deferredChain=i}return o.factory=function(r,t){return void 0===r&&(r=""),void 0===t&&(t={}),new o(r,t)},o.prototype.selfFactory=function(e){var n=void 0===e?{}:e,i=n.url,s=void 0===i?this._url:i,u=n.options,a=void 0===u?this._options:u,f=n.catchers,l=void 0===f?this._catchers:f,c=n.resolvers,p=void 0===c?this._resolvers:c,h=n.middlewares,d=void 0===h?this._middlewares:h,y=n.deferredChain,v=void 0===y?this._deferredChain:y;return new o(s,r({},a),new Map(l),t(p),t(d),t(v))},o.prototype.defaults=function(r,t){return void 0===t&&(t=!1),n.defaults=t?e(n.defaults,r):r,this},o.prototype.errorType=function(r){return n.errorType=r,this},o.prototype.polyfills=function(t){return n.polyfills=r(r({},n.polyfills),t),this},o.prototype.url=function(r,t){if(void 0===t&&(t=!1),t)return this.selfFactory({url:r});var e=this._url.split("?");return this.selfFactory({url:e.length>1?e[0]+r+"?"+e[1]:this._url+r})},o.prototype.options=function(r,t){return void 0===t&&(t=!0),this.selfFactory({options:t?e(this._options,r):r})},o.prototype.query=function(r,t){return void 0===t&&(t=!1),this.selfFactory({url:u(this._url,r,t)})},o.prototype.headers=function(r){return this.selfFactory({options:e(this._options,{headers:r||{}})})},o.prototype.accept=function(r){return this.headers({Accept:r})},o.prototype.content=function(r){return this.headers({"Content-Type":r})},o.prototype.auth=function(r){return this.headers({Authorization:r})},o.prototype.catcher=function(r,t){var e=new Map(this._catchers);return e.set(r,t),this.selfFactory({catchers:e})},o.prototype.signal=function(t){return this.selfFactory({options:r(r({},this._options),{signal:t.signal})})},o.prototype.resolve=function(r,e){return void 0===e&&(e=!1),this.selfFactory({resolvers:e?[r]:t(this._resolvers,[r])})},o.prototype.defer=function(r,e){return void 0===e&&(e=!1),this.selfFactory({deferredChain:e?[r]:t(this._deferredChain,[r])})},o.prototype.middlewares=function(r,e){return void 0===e&&(e=!1),this.selfFactory({middlewares:e?r:t(this._middlewares,r)})},o.prototype.method=function(t,o,s){void 0===o&&(o={}),void 0===s&&(s=null);var u=s?"object"==typeof s?this.json(s):this.body(s):this;return function(r){var t=r._url,o=r._catchers,s=r._resolvers,u=r._middlewares,a=r._options,f=new Map(o),l=e(n.defaults,a),c=n.polyfill("AbortController",{doThrow:!1,instance:!0});!l.signal&&c&&(l.signal=c.signal);var p={ref:null,clear:function(){p.ref&&(clearTimeout(p.ref),p.ref=null)}},h=function(r){return function(t){return 0===r.length?t:1===r.length?r[0](t):r.reduceRight((function(e,n,o){return o===r.length-2?n(e(t)):n(e)}))}}(u)(n.polyfill("fetch"))(t,l),d=h.then((function(r){return p.clear(),r.ok?r:r[n.errorType||"text"]().then((function(t){var e=new Error(t);throw e[n.errorType||"text"]=t,e.status=r.status,e.response=r,e}))})),y=function(t){return t.catch((function(t){if(p.clear(),f.has(t.status))return f.get(t.status)(t,r);if(f.has(t.name))return f.get(t.name)(t,r);throw t}))},v=function(r){return function(t){return y(r?d.then((function(t){return t&&t[r]()})).then((function(r){return t?t(r):r})):d.then((function(r){return t?t(r):r})))}},m={res:v(null),json:v("json"),blob:v("blob"),formData:v("formData"),arrayBuffer:v("arrayBuffer"),text:v("text"),perfs:function(r){return h.then((function(t){return i.observe(t.url,r)})),m},setTimeout:function(r,t){return void 0===t&&(t=c),p.clear(),p.ref=setTimeout((function(){return t.abort()}),r),m},controller:function(){return[c,m]},error:function(r,t){return f.set(r,t),m},badRequest:function(r){return m.error(400,r)},unauthorized:function(r){return m.error(401,r)},forbidden:function(r){return m.error(403,r)},notFound:function(r){return m.error(404,r)},timeout:function(r){return m.error(408,r)},internalError:function(r){return m.error(500,r)},onAbort:function(r){return m.error("AbortError",r)}};return s.reduce((function(t,e){return e(t,r)}),m)}((u=u.options(r(r({},o),{method:t})))._deferredChain.reduce((function(r,t){return t(r,r._url,r._options)}),u))},o.prototype.get=function(r){return this.method("GET",r)},o.prototype.delete=function(r){return this.method("DELETE",r)},o.prototype.put=function(r,t){return this.method("PUT",t,r)},o.prototype.post=function(r,t){return this.method("POST",t,r)},o.prototype.patch=function(r,t){return this.method("PATCH",t,r)},o.prototype.head=function(r){return this.method("HEAD",r)},o.prototype.opts=function(r){return this.method("OPTIONS",r)},o.prototype.replay=function(r){return this.method(this._options.method,r)},o.prototype.body=function(t){return this.selfFactory({options:r(r({},this._options),{body:t})})},o.prototype.json=function(r){return this.content("application/json").body(JSON.stringify(r))},o.prototype.formData=function(r){return this.body(function(r){var t=n.polyfill("FormData",{instance:!0});for(var e in r)if(r[e]instanceof Array)for(var o=0,i=r[e];o {\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 perfs.callbacks.delete(name)\n\n if(perfs.callbacks.size < 1) {\n perfs.observer.disconnect()\n if(_performance.clearResourceTimings) {\n _performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n}\n\nconst lazyObserver = (_performance, _observer) => {\n if(!perfs.observer && _performance && _observer) {\n perfs.observer = new _observer(entries => {\n perfs.callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, _performance)\n })\n })\n if(_performance.clearResourceTimings)\n _performance.clearResourceTimings()\n }\n return perfs.observer\n}\n\nconst perfs = {\n callbacks: new Map(),\n observer: null,\n observe: (name, callback) => {\n if(!name || !callback)\n return\n\n const _performance = conf.polyfill(\"performance\", { doThrow: false })\n const _observer = conf.polyfill(\"PerformanceObserver\", { doThrow: false })\n\n if(!lazyObserver(_performance, _observer))\n return\n\n if(!onMatch(_performance, name, callback, _performance)) {\n if(perfs.callbacks.size < 1)\n perfs.observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n perfs.callbacks.set(name, callback)\n }\n\n }\n}\n\nexport default perfs\n","import { mix } from \"./mix\"\nimport conf from \"./config\"\nimport { resolver, WretcherError, ResponseChain } from \"./resolver\"\nimport { ConfiguredMiddleware } from \"./middleware\"\n\nexport type WretcherOptions = RequestInit & {\n [key: string]: any\n}\n\nexport type DeferredCallback = (wretcher: Wretcher, url: string, options: WretcherOptions) => Wretcher\n\n/**\n * The Wretcher class used to perform easy fetch requests.\n *\n * Immutability : almost every method of this class return a fresh Wretcher object.\n */\nexport class Wretcher {\n\n protected constructor(\n public _url: string,\n public _options: WretcherOptions,\n public _catchers: Map void> = new Map(),\n public _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any> = [],\n public _middlewares: ConfiguredMiddleware[] = [],\n public _deferredChain: DeferredCallback[] = []) {}\n\n static factory(url = \"\", options: WretcherOptions = {}) { return new Wretcher(url, options) }\n private selfFactory({ url = this._url, options = this._options, catchers = this._catchers,\n resolvers = this._resolvers, middlewares = this._middlewares, deferredChain = this._deferredChain } = {}) {\n return new Wretcher(url, {...options}, new Map(catchers), [...resolvers], [...middlewares], [...deferredChain])\n }\n\n /**\n * Sets the default fetch options used for every subsequent fetch call.\n * @param options New default options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n defaults(options: WretcherOptions, mixin = false) {\n conf.defaults = mixin ? mix(conf.defaults, options) : options\n return this\n }\n\n /**\n * Sets the method (text, json ...) used to parse the data contained in the response body in case of an HTTP error.\n *\n * Persists for every subsequent requests.\n *\n * Default is \"text\".\n */\n errorType(method: \"text\" | \"json\") {\n conf.errorType = method\n return this\n }\n\n /**\n * Sets the non-global polyfills which will be used for every subsequent calls.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * @param polyfills An object containing the polyfills.\n */\n polyfills(polyfills: Partial) {\n conf.polyfills = { ...conf.polyfills, ...polyfills }\n return this\n }\n\n /**\n * Returns a new Wretcher object with the argument url appended and the same options.\n * @param url String url\n * @param replace Boolean If true, replaces the current url instead of appending\n */\n url(url: string, replace = false) {\n if(replace)\n return this.selfFactory({ url })\n const split = this._url.split(\"?\")\n return this.selfFactory({\n url: split.length > 1 ?\n split[0] + url + \"?\" + split[1] :\n this._url + url\n })\n }\n\n /**\n * Returns a new Wretcher object with the same url and new options.\n * @param options New options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n options(options: WretcherOptions, mixin = true) {\n return this.selfFactory({ options: mixin ? mix(this._options, options) : options })\n }\n\n /**\n * Converts a javascript object to query parameters,\n * then appends this query string to the current url.\n *\n * If given a string, use the string as the query verbatim.\n *\n * ```\n * let w = wretch(\"http://example.com\") // url is http://example.com\n *\n * // Chain query calls\n * w = w.query({ a: 1, b : 2 }) // url is now http://example.com?a=1&b=2\n * w = w.query(\"foo-bar-baz-woz\") // url is now http://example.com?a=1&b=2&foo-bar-baz-woz\n *\n * // Pass true as the second argument to replace existing query parameters\n * w = w.query(\"c=3&d=4\", true) // url is now http://example.com?c=3&d=4\n * ```\n *\n * @param qp An object which will be converted, or a string which will be used verbatim.\n */\n query(qp: object | string, replace: boolean = false) {\n return this.selfFactory({ url: appendQueryParams(this._url, qp, replace) })\n }\n\n /**\n * Set request headers.\n * @param headerValues An object containing header keys and values\n */\n headers(headerValues: { [headerName: string]: string }) {\n return this.selfFactory({ options: mix(this._options, { headers: headerValues || {} }) })\n }\n\n /**\n * Shortcut to set the \"Accept\" header.\n * @param headerValue Header value\n */\n accept(headerValue: string) {\n return this.headers({ Accept : headerValue })\n }\n\n /**\n * Shortcut to set the \"Content-Type\" header.\n * @param headerValue Header value\n */\n content(headerValue: string) {\n return this.headers({ \"Content-Type\" : headerValue })\n }\n\n /**\n * Shortcut to set the \"Authorization\" header.\n * @param headerValue Header value\n */\n auth(headerValue: string) {\n return this.headers({ Authorization: headerValue })\n }\n\n /**\n * Adds a default catcher which will be called on every subsequent request error when the error code matches.\n * @param errorId Error code or name\n * @param catcher: The catcher method\n */\n catcher(errorId: number | string, catcher: (error: WretcherError, originalRequest: Wretcher) => any) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return this.selfFactory({ catchers: newMap })\n }\n\n /**\n * Associates a custom signal with the request.\n * @param controller : An AbortController\n */\n signal(controller: AbortController) {\n return this.selfFactory({ options: { ...this._options, signal: controller.signal }})\n }\n\n /**\n * Program a resolver to perform response chain tasks automatically.\n * @param doResolve : Resolver callback\n */\n resolve(doResolve: (chain: ResponseChain, originalRequest: Wretcher) => ResponseChain | Promise, clear: boolean = false) {\n return this.selfFactory({ resolvers: clear ? [ doResolve ] : [ ...this._resolvers, doResolve ]})\n }\n\n /**\n * Defer wretcher methods that will be chained and called just before the request is performed.\n */\n defer(callback: DeferredCallback, clear = false) {\n return this.selfFactory({\n deferredChain: clear ? [callback] : [ ...this._deferredChain, callback ]\n })\n }\n\n /**\n * Add middlewares to intercept a request before being sent.\n */\n middlewares(middlewares: ConfiguredMiddleware[], clear = false) {\n return this.selfFactory({\n middlewares: clear ? middlewares : [ ...this._middlewares, ...middlewares ]\n })\n }\n\n private method(method, options = {}, body = null) {\n let baseWretcher =\n !body ? this :\n typeof body === \"object\" ? this.json(body) :\n this.body(body)\n baseWretcher = baseWretcher.options({ ...options, method })\n const deferredWretcher = baseWretcher._deferredChain.reduce((acc: Wretcher, curr) => curr(acc, acc._url, acc._options), baseWretcher)\n return resolver(deferredWretcher)\n }\n\n /**\n * Performs a get request.\n */\n get(options?) {\n return this.method(\"GET\", options)\n }\n /**\n * Performs a delete request.\n */\n delete(options?) {\n return this.method(\"DELETE\", options)\n }\n /**\n * Performs a put request.\n */\n put(body?, options?) {\n return this.method(\"PUT\", options, body)\n }\n /**\n * Performs a post request.\n */\n post(body?, options?) {\n return this.method(\"POST\", options, body)\n }\n /**\n * Performs a patch request.\n */\n patch(body?, options?) {\n return this.method(\"PATCH\", options, body)\n }\n /**\n * Performs a head request.\n */\n head(options?) {\n return this.method(\"HEAD\", options)\n }\n /**\n * Performs an options request\n */\n opts(options?) {\n return this.method(\"OPTIONS\", options)\n }\n /**\n * Replay a request.\n */\n replay(options?) {\n return this.method(this._options.method, options)\n }\n\n /**\n * Sets the request body with any content.\n * @param contents The body contents\n */\n body(contents: any) {\n return this.selfFactory({ options: { ...this._options, body: contents }})\n }\n /**\n * Sets the content type header, stringifies an object and sets the request body.\n * @param jsObject An object which will be serialized into a JSON\n */\n json(jsObject: object) {\n return this.content(\"application/json\").body(JSON.stringify(jsObject))\n }\n /**\n * Converts the javascript object to a FormData and sets the request body.\n * @param formObject An object which will be converted to a FormData\n */\n formData(formObject: object) {\n return this.body(convertFormData(formObject))\n }\n /**\n * Converts the input to an url encoded string and sets the content-type header and body.\n * If the input argument is already a string, skips the conversion part.\n *\n * @param input An object to convert into an url encoded string or an already encoded string\n */\n formUrl(input: (object | string)) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n}\n\n// Internal helpers\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean) => {\n let queryString\n\n if(typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = conf.polyfill(\"URLSearchParams\", { instance: true })\n for(const key in qp) {\n if(qp[key] instanceof Array) {\n for(const val of qp[key])\n usp.append(key, val)\n } else {\n usp.append(key, qp[key])\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n if(replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nfunction convertFormData(formObject: object) {\n const formData = conf.polyfill(\"FormData\", { instance: true })\n for(const key in formObject) {\n if(formObject[key] instanceof Array) {\n for(const item of formObject[key])\n formData.append(key + \"[]\", item)\n } else {\n formData.append(key, formObject[key])\n }\n }\n\n return formData\n}\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","import { Wretcher } from \"./wretcher\"\nimport { mix } from \"./mix\"\nimport conf from \"./config\"\nimport perfs from \"./perfs\"\nimport { middlewareHelper } from \"./middleware\"\n\nexport type WretcherError = Error & { status: number, response: WretcherResponse, text?: string, json?: any }\nexport type WretcherErrorCallback = (error: WretcherError, originalRequest: Wretcher) => any\nexport type WretcherResponse = Response & { [key: string]: any }\nexport type ResponseChain = {\n // Response types\n res: (cb?: (type: WretcherResponse) => Result) => Promise,\n json: (cb?: (type: {[key: string]: any}) => Result) => Promise,\n blob: (cb?: (type: Blob) => Result) => Promise,\n formData: (cb?: (type: FormData) => Result) => Promise,\n arrayBuffer: (cb?: (type: ArrayBuffer) => Result) => Promise,\n text: (cb?: (type: string) => Result) => Promise,\n // Extras\n perfs: (cb?: (timing: any) => void) => ResponseChain,\n setTimeout: (time: number, controller?: AbortController) => ResponseChain,\n controller: () => [any, ResponseChain],\n // Catchers\n error: (code: (number | string), cb: WretcherErrorCallback) => ResponseChain,\n badRequest: (cb: WretcherErrorCallback) => ResponseChain,\n unauthorized: (cb: WretcherErrorCallback) => ResponseChain,\n forbidden: (cb: WretcherErrorCallback) => ResponseChain,\n notFound: (cb: WretcherErrorCallback) => ResponseChain,\n timeout: (cb: WretcherErrorCallback) => ResponseChain,\n internalError: (cb: WretcherErrorCallback) => ResponseChain,\n onAbort: (cb: WretcherErrorCallback) => ResponseChain\n}\n\nexport const resolver = (wretcher: Wretcher) => {\n const {\n _url: url,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _options: opts\n } = wretcher\n const catchers = new Map(_catchers)\n const finalOptions = mix(conf.defaults, opts)\n const fetchController = conf.polyfill(\"AbortController\", { doThrow: false, instance: true })\n if(!finalOptions[\"signal\"] && fetchController) {\n finalOptions[\"signal\"] = fetchController.signal\n }\n // Request timeout\n const timeout = {\n ref: null,\n clear() {\n if(timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n // The generated fetch request\n const fetchRequest = middlewareHelper(middlewares)(conf.polyfill(\"fetch\"))(url, finalOptions)\n // Throws on an http error\n const throwingPromise: Promise = fetchRequest.then(response => {\n timeout.clear()\n if (!response.ok) {\n return response[conf.errorType || \"text\"]().then(msg => {\n // Enhances the error object\n const err = new Error(msg)\n err[conf.errorType || \"text\"] = msg\n err[\"status\"] = response.status\n err[\"response\"] = response\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 = (promise: Promise): Promise => {\n return promise.catch(err => {\n timeout.clear()\n if(catchers.has(err.status))\n return catchers.get(err.status)(err, wretcher)\n else if(catchers.has(err.name))\n return catchers.get(err.name)(err, wretcher)\n else\n throw err\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = (funName: string | null) => (cb?: (type: Type) => Result) => Promise\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(_) : _))\n\n const responseChain: ResponseChain = {\n /**\n * Retrieves the raw result as a promise.\n */\n res: bodyParser(null),\n /**\n * Retrieves the result as a parsed JSON object.\n */\n json: bodyParser(\"json\"),\n /**\n * Retrieves the result as a Blob object.\n */\n blob: bodyParser(\"blob\"),\n /**\n * Retrieves the result as a FormData object.\n */\n formData: bodyParser(\"formData\"),\n /**\n * Retrieves the result as an ArrayBuffer object.\n */\n arrayBuffer: bodyParser(\"arrayBuffer\"),\n /**\n * Retrieves the result as a string.\n */\n text: bodyParser(\"text\"),\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: cb => {\n fetchRequest.then(res => perfs.observe(res.url, cb))\n return responseChain\n },\n /**\n * Aborts the request after a fixed time.\n *\n * @param time Time in milliseconds\n * @param controller A custom controller\n */\n setTimeout: (time, controller = fetchController) => {\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return responseChain\n },\n /**\n * Returns the automatically generated AbortController alongside the current wretch response as a pair.\n */\n controller: () => [ fetchController, responseChain ],\n /**\n * Catches an http response with a specific error code or name and performs a callback.\n */\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return responseChain\n },\n /**\n * Catches a bad request (http code 400) and performs a callback.\n */\n badRequest: cb => responseChain.error(400, cb),\n /**\n * Catches an unauthorized request (http code 401) and performs a callback.\n */\n unauthorized: cb => responseChain.error(401, cb),\n /**\n * Catches a forbidden request (http code 403) and performs a callback.\n */\n forbidden: cb => responseChain.error(403, cb),\n /**\n * Catches a \"not found\" request (http code 404) and performs a callback.\n */\n notFound: cb => responseChain.error(404, cb),\n /**\n * Catches a timeout (http code 408) and performs a callback.\n */\n timeout: cb => responseChain.error(408, cb),\n /**\n * Catches an internal server error (http code 500) and performs a callback.\n */\n internalError: cb => responseChain.error(500, cb),\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: cb => responseChain.error(\"AbortError\", cb)\n }\n\n return resolvers.reduce((chain, r) => r(chain, wretcher), responseChain) as (ResponseChain & Promise)\n}\n","import { WretcherOptions } from \"./wretcher\"\nimport { WretcherResponse } from \"./resolver\"\n\nexport type Middleware = (options?: {[key: string]: any}) => ConfiguredMiddleware\nexport type ConfiguredMiddleware = (next: FetchLike) => FetchLike\nexport type FetchLike = (url: string, opts: WretcherOptions) => Promise\n\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return (\n middlewares.length === 0 ?\n fetchFunction :\n middlewares.length === 1 ?\n middlewares[0](fetchFunction) :\n middlewares.reduceRight((acc, curr, idx): any =>\n (idx === middlewares.length - 2) ? curr(acc(fetchFunction)) : curr(acc as any)\n )\n ) as FetchLike\n}\n","import { Wretcher } from \"./wretcher\"\n\nconst factory = Wretcher.factory\nfactory[\"default\"] = Wretcher.factory\n\n/**\n * Return a fresh Wretcher instance.\n */\nexport default factory\n"],"names":["mix","one","two","mergeArrays","clone","prop","hasOwnProperty","Array","config","defaults","errorType","polyfills","fetch","FormData","URLSearchParams","performance","PerformanceObserver","AbortController","polyfill","p","_a","_b","_c","doThrow","_d","instance","_i","args","res","this","self","global","Error","onMatch","entries","name","callback","_performance","getEntriesByName","matches","length","reverse","clearMeasures","perfs","callbacks","delete","size","observer","disconnect","clearResourceTimings","Map","observe","conf","_observer","forEach","lazyObserver","entryTypes","set","_url","_options","_catchers","_resolvers","_middlewares","_deferredChain","Wretcher","url","options","_e","catchers","_f","resolvers","_g","middlewares","_h","deferredChain","mixin","method","replace","selfFactory","split","qp","appendQueryParams","headerValues","headers","headerValue","Accept","Content-Type","Authorization","errorId","catcher","newMap","controller","signal","doResolve","clear","body","baseWretcher","json","wretcher","opts","finalOptions","fetchController","timeout","ref","clearTimeout","fetchRequest","fetchFunction","reduceRight","acc","curr","idx","middlewareHelper","throwingPromise","then","response","ok","msg","err","status","catchersWrapper","promise","catch","has","get","bodyParser","funName","cb","_","responseChain","blob","formData","arrayBuffer","text","setTimeout","time","abort","error","badRequest","unauthorized","forbidden","notFound","internalError","onAbort","reduce","chain","r","resolver","contents","jsObject","content","JSON","stringify","formObject","key","item","append","convertFormData","input","Object","keys","map","value","v","encodeQueryValue","join","queryString","usp","val","toString","encodeURIComponent","factory"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundle/wretch.js b/dist/bundle/wretch.js index 9d633bb..cc6e543 100644 --- a/dist/bundle/wretch.js +++ b/dist/bundle/wretch.js @@ -1,2 +1,2 @@ -!function(r,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(r=r||self).wretch=t()}(this,function(){"use strict";var d=function(){return(d=Object.assign||function(r){for(var t,e=1,n=arguments.length;e0)&&(e(o.reverse()[0]),n.clearMeasures&&n.clearMeasures(t),i.callbacks.delete(t),i.callbacks.size<1&&(i.observer.disconnect(),n.clearResourceTimings&&n.clearResourceTimings()),!0)},i={callbacks:new Map,observer:null,observe:function(r,t){if(r&&t){var e=n.polyfill("performance",{doThrow:!1});(function(r,t){return!i.observer&&r&&t&&(i.observer=new t((function(t){i.callbacks.forEach((function(e,n){o(t,n,e,r)}))})),r.clearResourceTimings&&r.clearResourceTimings()),i.observer})(e,n.polyfill("PerformanceObserver",{doThrow:!1}))&&(o(e,r,t,e)||(i.callbacks.size<1&&i.observer.observe({entryTypes:["resource","measure"]}),i.callbacks.set(r,t)))}}},s=function(){function o(r,t,e,n,o,i){void 0===e&&(e=new Map),void 0===n&&(n=[]),void 0===o&&(o=[]),void 0===i&&(i=[]),this._url=r,this._options=t,this._catchers=e,this._resolvers=n,this._middlewares=o,this._deferredChain=i}return o.factory=function(r,t){return void 0===r&&(r=""),void 0===t&&(t={}),new o(r,t)},o.prototype.selfFactory=function(e){var n=void 0===e?{}:e,i=n.url,s=void 0===i?this._url:i,u=n.options,a=void 0===u?this._options:u,f=n.catchers,c=void 0===f?this._catchers:f,l=n.resolvers,p=void 0===l?this._resolvers:l,h=n.middlewares,d=void 0===h?this._middlewares:h,y=n.deferredChain,v=void 0===y?this._deferredChain:y;return new o(s,r({},a),new Map(c),t(p),t(d),t(v))},o.prototype.defaults=function(r,t){return void 0===t&&(t=!1),n.defaults=t?e(n.defaults,r):r,this},o.prototype.errorType=function(r){return n.errorType=r,this},o.prototype.polyfills=function(t){return n.polyfills=r(r({},n.polyfills),t),this},o.prototype.url=function(r,t){if(void 0===t&&(t=!1),t)return this.selfFactory({url:r});var e=this._url.split("?");return this.selfFactory({url:e.length>1?e[0]+r+"?"+e[1]:this._url+r})},o.prototype.options=function(r,t){return void 0===t&&(t=!0),this.selfFactory({options:t?e(this._options,r):r})},o.prototype.query=function(r,t){return void 0===t&&(t=!1),this.selfFactory({url:u(this._url,r,t)})},o.prototype.headers=function(r){return this.selfFactory({options:e(this._options,{headers:r||{}})})},o.prototype.accept=function(r){return this.headers({Accept:r})},o.prototype.content=function(r){return this.headers({"Content-Type":r})},o.prototype.auth=function(r){return this.headers({Authorization:r})},o.prototype.catcher=function(r,t){var e=new Map(this._catchers);return e.set(r,t),this.selfFactory({catchers:e})},o.prototype.signal=function(t){return this.selfFactory({options:r(r({},this._options),{signal:t.signal})})},o.prototype.resolve=function(r,e){return void 0===e&&(e=!1),this.selfFactory({resolvers:e?[r]:t(this._resolvers,[r])})},o.prototype.defer=function(r,e){return void 0===e&&(e=!1),this.selfFactory({deferredChain:e?[r]:t(this._deferredChain,[r])})},o.prototype.middlewares=function(r,e){return void 0===e&&(e=!1),this.selfFactory({middlewares:e?r:t(this._middlewares,r)})},o.prototype.method=function(t,o,s){void 0===o&&(o={}),void 0===s&&(s=null);var u=s?"object"==typeof s?this.json(s):this.body(s):this;return function(r){var t=r._url,o=r._catchers,s=r._resolvers,u=r._middlewares,a=r._options,f=new Map(o),c=e(n.defaults,a),l=n.polyfill("AbortController",{doThrow:!1,instance:!0});!c.signal&&l&&(c.signal=l.signal);var p={ref:null,clear:function(){p.ref&&(clearTimeout(p.ref),p.ref=null)}},h=function(r){return function(t){return 0===r.length?t:1===r.length?r[0](t):r.reduceRight((function(e,n,o){return o===r.length-2?n(e(t)):n(e)}))}}(u)(n.polyfill("fetch"))(t,c),d=h.then((function(r){return p.clear(),r.ok?r:r[n.errorType||"text"]().then((function(t){var e=new Error(t);throw e[n.errorType||"text"]=t,e.status=r.status,e.response=r,e}))})),y=function(t){return t.catch((function(t){if(p.clear(),f.has(t.status))return f.get(t.status)(t,r);if(f.has(t.name))return f.get(t.name)(t,r);throw t}))},v=function(r){return function(t){return y(r?d.then((function(t){return t&&t[r]()})).then((function(r){return t?t(r):r})):d.then((function(r){return t?t(r):r})))}},m={res:v(null),json:v("json"),blob:v("blob"),formData:v("formData"),arrayBuffer:v("arrayBuffer"),text:v("text"),perfs:function(r){return h.then((function(t){return i.observe(t.url,r)})),m},setTimeout:function(r,t){return void 0===t&&(t=l),p.clear(),p.ref=setTimeout((function(){return t.abort()}),r),m},controller:function(){return[l,m]},error:function(r,t){return f.set(r,t),m},badRequest:function(r){return m.error(400,r)},unauthorized:function(r){return m.error(401,r)},forbidden:function(r){return m.error(403,r)},notFound:function(r){return m.error(404,r)},timeout:function(r){return m.error(408,r)},internalError:function(r){return m.error(500,r)},onAbort:function(r){return m.error("AbortError",r)}};return s.reduce((function(t,e){return e(t,r)}),m)}((u=u.options(r(r({},o),{method:t})))._deferredChain.reduce((function(r,t){return t(r,r._url,r._options)}),u))},o.prototype.get=function(r){return this.method("GET",r)},o.prototype.delete=function(r){return this.method("DELETE",r)},o.prototype.put=function(r,t){return this.method("PUT",t,r)},o.prototype.post=function(r,t){return this.method("POST",t,r)},o.prototype.patch=function(r,t){return this.method("PATCH",t,r)},o.prototype.head=function(r){return this.method("HEAD",r)},o.prototype.opts=function(r){return this.method("OPTIONS",r)},o.prototype.replay=function(r){return this.method(this._options.method,r)},o.prototype.body=function(t){return this.selfFactory({options:r(r({},this._options),{body:t})})},o.prototype.json=function(r){return this.content("application/json").body(JSON.stringify(r))},o.prototype.formData=function(r){return this.body(function(r){var t=n.polyfill("FormData",{instance:!0});for(var e in r)if(r[e]instanceof Array)for(var o=0,i=r[e];o {\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 perfs.callbacks.delete(name)\n\n if(perfs.callbacks.size < 1) {\n perfs.observer.disconnect()\n if(_performance.clearResourceTimings) {\n _performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n}\n\nconst lazyObserver = (_performance, _observer) => {\n if(!perfs.observer && _performance && _observer) {\n perfs.observer = new _observer(entries => {\n perfs.callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, _performance)\n })\n })\n if(_performance.clearResourceTimings)\n _performance.clearResourceTimings()\n }\n return perfs.observer\n}\n\nconst perfs = {\n callbacks: new Map(),\n observer: null,\n observe: (name, callback) => {\n if(!name || !callback)\n return\n\n const _performance = conf.polyfill(\"performance\", { doThrow: false })\n const _observer = conf.polyfill(\"PerformanceObserver\", { doThrow: false })\n\n if(!lazyObserver(_performance, _observer))\n return\n\n if(!onMatch(_performance, name, callback, _performance)) {\n if(perfs.callbacks.size < 1)\n perfs.observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n perfs.callbacks.set(name, callback)\n }\n\n }\n}\n\nexport default perfs\n","export const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n if(!one || !two || typeof one !== \"object\" || typeof two !== \"object\")\n return one\n\n const clone = { ...one }\n for(const prop in two) {\n if(two.hasOwnProperty(prop)) {\n if(two[prop] instanceof Array && one[prop] instanceof Array) {\n clone[prop] = mergeArrays ? [ ...one[prop], ...two[prop] ] : two[prop]\n } else if(typeof two[prop] === \"object\" && typeof one[prop] === \"object\") {\n clone[prop] = mix(one[prop], two[prop], mergeArrays)\n } else {\n clone[prop] = two[prop]\n }\n }\n }\n\n return clone\n}\n","declare const global\n\nconst config = {\n // Default options\n defaults: {},\n // Error type\n errorType: null,\n // Polyfills\n polyfills: {\n fetch: null,\n FormData: null,\n URLSearchParams: null,\n performance: null,\n PerformanceObserver: null,\n AbortController: null\n },\n polyfill(p: string, { doThrow = true, instance = false } = {}, ...args) {\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\nexport default config\n","import { mix } from \"./mix\"\nimport conf from \"./config\"\nimport { resolver, WretcherError, ResponseChain } from \"./resolver\"\nimport { ConfiguredMiddleware } from \"./middleware\"\n\nexport type WretcherOptions = RequestInit & {\n [key: string]: any\n}\n\nexport type DeferredCallback = (wretcher: Wretcher, url: string, options: WretcherOptions) => Wretcher\n\n/**\n * The Wretcher class used to perform easy fetch requests.\n *\n * Immutability : almost every method of this class return a fresh Wretcher object.\n */\nexport class Wretcher {\n\n protected constructor(\n public _url: string,\n public _options: WretcherOptions,\n public _catchers: Map void> = new Map(),\n public _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any> = [],\n public _middlewares: ConfiguredMiddleware[] = [],\n public _deferredChain: DeferredCallback[] = []) {}\n\n static factory(url = \"\", options: WretcherOptions = {}) { return new Wretcher(url, options) }\n private selfFactory({ url = this._url, options = this._options, catchers = this._catchers,\n resolvers = this._resolvers, middlewares = this._middlewares, deferredChain = this._deferredChain } = {}) {\n return new Wretcher(url, {...options}, new Map(catchers), [...resolvers], [...middlewares], [...deferredChain])\n }\n\n /**\n * Sets the default fetch options used for every subsequent fetch call.\n * @param options New default options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n defaults(options: WretcherOptions, mixin = false) {\n conf.defaults = mixin ? mix(conf.defaults, options) : options\n return this\n }\n\n /**\n * Sets the method (text, json ...) used to parse the data contained in the response body in case of an HTTP error.\n *\n * Persists for every subsequent requests.\n *\n * Default is \"text\".\n */\n errorType(method: \"text\" | \"json\") {\n conf.errorType = method\n return this\n }\n\n /**\n * Sets the non-global polyfills which will be used for every subsequent calls.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * @param polyfills An object containing the polyfills.\n */\n polyfills(polyfills: Partial) {\n conf.polyfills = { ...conf.polyfills, ...polyfills }\n return this\n }\n\n /**\n * Returns a new Wretcher object with the argument url appended and the same options.\n * @param url String url\n * @param replace Boolean If true, replaces the current url instead of appending\n */\n url(url: string, replace = false) {\n if(replace)\n return this.selfFactory({ url })\n const split = this._url.split(\"?\")\n return this.selfFactory({\n url: split.length > 1 ?\n split[0] + url + \"?\" + split[1] :\n this._url + url\n })\n }\n\n /**\n * Returns a new Wretcher object with the same url and new options.\n * @param options New options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n options(options: WretcherOptions, mixin = true) {\n return this.selfFactory({ options: mixin ? mix(this._options, options) : options })\n }\n\n /**\n * Converts a javascript object to query parameters,\n * then appends this query string to the current url.\n *\n * If given a string, use the string as the query verbatim.\n *\n * ```\n * let w = wretch(\"http://example.com\") // url is http://example.com\n *\n * // Chain query calls\n * w = w.query({ a: 1, b : 2 }) // url is now http://example.com?a=1&b=2\n * w = w.query(\"foo-bar-baz-woz\") // url is now http://example.com?a=1&b=2&foo-bar-baz-woz\n *\n * // Pass true as the second argument to replace existing query parameters\n * w = w.query(\"c=3&d=4\", true) // url is now http://example.com?c=3&d=4\n * ```\n *\n * @param qp An object which will be converted, or a string which will be used verbatim.\n */\n query(qp: object | string, replace: boolean = false) {\n return this.selfFactory({ url: appendQueryParams(this._url, qp, replace) })\n }\n\n /**\n * Set request headers.\n * @param headerValues An object containing header keys and values\n */\n headers(headerValues: { [headerName: string]: string }) {\n return this.selfFactory({ options: mix(this._options, { headers: headerValues || {} }) })\n }\n\n /**\n * Shortcut to set the \"Accept\" header.\n * @param headerValue Header value\n */\n accept(headerValue: string) {\n return this.headers({ Accept : headerValue })\n }\n\n /**\n * Shortcut to set the \"Content-Type\" header.\n * @param headerValue Header value\n */\n content(headerValue: string) {\n return this.headers({ \"Content-Type\" : headerValue })\n }\n\n /**\n * Shortcut to set the \"Authorization\" header.\n * @param headerValue Header value\n */\n auth(headerValue: string) {\n return this.headers({ Authorization: headerValue })\n }\n\n /**\n * Adds a default catcher which will be called on every subsequent request error when the error code matches.\n * @param errorId Error code or name\n * @param catcher: The catcher method\n */\n catcher(errorId: number | string, catcher: (error: WretcherError, originalRequest: Wretcher) => any) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return this.selfFactory({ catchers: newMap })\n }\n\n /**\n * Associates a custom signal with the request.\n * @param controller : An AbortController\n */\n signal(controller: AbortController) {\n return this.selfFactory({ options: { ...this._options, signal: controller.signal }})\n }\n\n /**\n * Program a resolver to perform response chain tasks automatically.\n * @param doResolve : Resolver callback\n */\n resolve(doResolve: (chain: ResponseChain, originalRequest: Wretcher) => ResponseChain | Promise, clear: boolean = false) {\n return this.selfFactory({ resolvers: clear ? [ doResolve ] : [ ...this._resolvers, doResolve ]})\n }\n\n /**\n * Defer wretcher methods that will be chained and called just before the request is performed.\n */\n defer(callback: DeferredCallback, clear = false) {\n return this.selfFactory({\n deferredChain: clear ? [callback] : [ ...this._deferredChain, callback ]\n })\n }\n\n /**\n * Add middlewares to intercept a request before being sent.\n */\n middlewares(middlewares: ConfiguredMiddleware[], clear = false) {\n return this.selfFactory({\n middlewares: clear ? middlewares : [ ...this._middlewares, ...middlewares ]\n })\n }\n\n private method(method, options = {}, body = null) {\n let baseWretcher =\n !body ? this :\n typeof body === \"object\" ? this.json(body) :\n this.body(body)\n baseWretcher = baseWretcher.options({ ...options, method })\n const deferredWretcher = baseWretcher._deferredChain.reduce((acc: Wretcher, curr) => curr(acc, acc._url, acc._options), baseWretcher)\n return resolver(deferredWretcher)\n }\n\n /**\n * Performs a get request.\n */\n get(options?) {\n return this.method(\"GET\", options)\n }\n /**\n * Performs a delete request.\n */\n delete(options?) {\n return this.method(\"DELETE\", options)\n }\n /**\n * Performs a put request.\n */\n put(body?, options?) {\n return this.method(\"PUT\", options, body)\n }\n /**\n * Performs a post request.\n */\n post(body?, options?) {\n return this.method(\"POST\", options, body)\n }\n /**\n * Performs a patch request.\n */\n patch(body?, options?) {\n return this.method(\"PATCH\", options, body)\n }\n /**\n * Performs a head request.\n */\n head(options?) {\n return this.method(\"HEAD\", options)\n }\n /**\n * Performs an options request\n */\n opts(options?) {\n return this.method(\"OPTIONS\", options)\n }\n /**\n * Replay a request.\n */\n replay(options?) {\n return this.method(this._options.method, options)\n }\n\n /**\n * Sets the request body with any content.\n * @param contents The body contents\n */\n body(contents: any) {\n return this.selfFactory({ options: { ...this._options, body: contents }})\n }\n /**\n * Sets the content type header, stringifies an object and sets the request body.\n * @param jsObject An object which will be serialized into a JSON\n */\n json(jsObject: object) {\n return this.content(\"application/json\").body(JSON.stringify(jsObject))\n }\n /**\n * Converts the javascript object to a FormData and sets the request body.\n * @param formObject An object which will be converted to a FormData\n */\n formData(formObject: object) {\n return this.body(convertFormData(formObject))\n }\n /**\n * Converts the input to an url encoded string and sets the content-type header and body.\n * If the input argument is already a string, skips the conversion part.\n *\n * @param input An object to convert into an url encoded string or an already encoded string\n */\n formUrl(input: (object | string)) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n}\n\n// Internal helpers\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean) => {\n let queryString\n\n if(typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = conf.polyfill(\"URLSearchParams\", { instance: true })\n for(const key in qp) {\n if(qp[key] instanceof Array) {\n for(const val of qp[key])\n usp.append(key, val)\n } else {\n usp.append(key, qp[key])\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n if(replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nfunction convertFormData(formObject: object) {\n const formData = conf.polyfill(\"FormData\", { instance: true })\n for(const key in formObject) {\n if(formObject[key] instanceof Array) {\n for(const item of formObject[key])\n formData.append(key + \"[]\", item)\n } else {\n formData.append(key, formObject[key])\n }\n }\n\n return formData\n}\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","import { Wretcher } from \"./wretcher\"\nimport { mix } from \"./mix\"\nimport conf from \"./config\"\nimport perfs from \"./perfs\"\nimport { middlewareHelper } from \"./middleware\"\n\nexport type WretcherError = Error & { status: number, response: WretcherResponse, text?: string, json?: any }\nexport type WretcherErrorCallback = (error: WretcherError, originalRequest: Wretcher) => any\nexport type WretcherResponse = Response & { [key: string]: any }\nexport type ResponseChain = {\n // Response types\n res: (cb?: (type: WretcherResponse) => Result) => Promise,\n json: (cb?: (type: {[key: string]: any}) => Result) => Promise,\n blob: (cb?: (type: Blob) => Result) => Promise,\n formData: (cb?: (type: FormData) => Result) => Promise,\n arrayBuffer: (cb?: (type: ArrayBuffer) => Result) => Promise,\n text: (cb?: (type: string) => Result) => Promise,\n // Extras\n perfs: (cb?: (timing: any) => void) => ResponseChain,\n setTimeout: (time: number, controller?: AbortController) => ResponseChain,\n controller: () => [any, ResponseChain],\n // Catchers\n error: (code: (number | string), cb: WretcherErrorCallback) => ResponseChain,\n badRequest: (cb: WretcherErrorCallback) => ResponseChain,\n unauthorized: (cb: WretcherErrorCallback) => ResponseChain,\n forbidden: (cb: WretcherErrorCallback) => ResponseChain,\n notFound: (cb: WretcherErrorCallback) => ResponseChain,\n timeout: (cb: WretcherErrorCallback) => ResponseChain,\n internalError: (cb: WretcherErrorCallback) => ResponseChain,\n onAbort: (cb: WretcherErrorCallback) => ResponseChain\n}\n\nexport const resolver = (wretcher: Wretcher) => {\n const {\n _url: url,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _options: opts\n } = wretcher\n const catchers = new Map(_catchers)\n const finalOptions = mix(conf.defaults, opts)\n const fetchController = conf.polyfill(\"AbortController\", { doThrow: false, instance: true })\n if(!finalOptions[\"signal\"] && fetchController) {\n finalOptions[\"signal\"] = fetchController.signal\n }\n // Request timeout\n const timeout = {\n ref: null,\n clear() {\n if(timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n // The generated fetch request\n const fetchRequest = middlewareHelper(middlewares)(conf.polyfill(\"fetch\"))(url, finalOptions)\n // Throws on an http error\n const throwingPromise: Promise = fetchRequest.then(response => {\n timeout.clear()\n if (!response.ok) {\n return response[conf.errorType || \"text\"]().then(msg => {\n // Enhances the error object\n const err = new Error(msg)\n err[conf.errorType || \"text\"] = msg\n err[\"status\"] = response.status\n err[\"response\"] = response\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 = (promise: Promise): Promise => {\n return promise.catch(err => {\n timeout.clear()\n if(catchers.has(err.status))\n return catchers.get(err.status)(err, wretcher)\n else if(catchers.has(err.name))\n return catchers.get(err.name)(err, wretcher)\n else\n throw err\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = (funName: string | null) => (cb?: (type: Type) => Result) => Promise\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(_) : _))\n\n const responseChain: ResponseChain = {\n /**\n * Retrieves the raw result as a promise.\n */\n res: bodyParser(null),\n /**\n * Retrieves the result as a parsed JSON object.\n */\n json: bodyParser(\"json\"),\n /**\n * Retrieves the result as a Blob object.\n */\n blob: bodyParser(\"blob\"),\n /**\n * Retrieves the result as a FormData object.\n */\n formData: bodyParser(\"formData\"),\n /**\n * Retrieves the result as an ArrayBuffer object.\n */\n arrayBuffer: bodyParser(\"arrayBuffer\"),\n /**\n * Retrieves the result as a string.\n */\n text: bodyParser(\"text\"),\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: cb => {\n fetchRequest.then(res => perfs.observe(res.url, cb))\n return responseChain\n },\n /**\n * Aborts the request after a fixed time.\n *\n * @param time Time in milliseconds\n * @param controller A custom controller\n */\n setTimeout: (time, controller = fetchController) => {\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return responseChain\n },\n /**\n * Returns the automatically generated AbortController alongside the current wretch response as a pair.\n */\n controller: () => [ fetchController, responseChain ],\n /**\n * Catches an http response with a specific error code or name and performs a callback.\n */\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return responseChain\n },\n /**\n * Catches a bad request (http code 400) and performs a callback.\n */\n badRequest: cb => responseChain.error(400, cb),\n /**\n * Catches an unauthorized request (http code 401) and performs a callback.\n */\n unauthorized: cb => responseChain.error(401, cb),\n /**\n * Catches a forbidden request (http code 403) and performs a callback.\n */\n forbidden: cb => responseChain.error(403, cb),\n /**\n * Catches a \"not found\" request (http code 404) and performs a callback.\n */\n notFound: cb => responseChain.error(404, cb),\n /**\n * Catches a timeout (http code 408) and performs a callback.\n */\n timeout: cb => responseChain.error(408, cb),\n /**\n * Catches an internal server error (http code 500) and performs a callback.\n */\n internalError: cb => responseChain.error(500, cb),\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: cb => responseChain.error(\"AbortError\", cb)\n }\n\n return resolvers.reduce((chain, r) => r(chain, wretcher), responseChain) as (ResponseChain & Promise)\n}\n","import { WretcherOptions } from \"./wretcher\"\nimport { WretcherResponse } from \"./resolver\"\n\nexport type Middleware = (options?: {[key: string]: any}) => ConfiguredMiddleware\nexport type ConfiguredMiddleware = (next: FetchLike) => FetchLike\nexport type FetchLike = (url: string, opts: WretcherOptions) => Promise\n\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return (\n middlewares.length === 0 ?\n fetchFunction :\n middlewares.length === 1 ?\n middlewares[0](fetchFunction) :\n middlewares.reduceRight((acc, curr, idx): any =>\n (idx === middlewares.length - 2) ? curr(acc(fetchFunction)) : curr(acc as any)\n )\n ) as FetchLike\n}\n","import { Wretcher } from \"./wretcher\"\n\nconst factory = Wretcher.factory\nfactory[\"default\"] = Wretcher.factory\n\n/**\n * Return a fresh Wretcher instance.\n */\nexport default factory\n"],"names":["onMatch","entries","name","callback","_performance","getEntriesByName","matches","length","reverse","clearMeasures","perfs","callbacks","delete","size","observer","disconnect","clearResourceTimings","mix","one","two","mergeArrays","clone","prop","hasOwnProperty","Array","config","defaults","errorType","polyfills","fetch","FormData","URLSearchParams","performance","PerformanceObserver","AbortController","polyfill","p","_a","_b","_c","doThrow","_d","instance","_i","args","res","this","self","global","Error","Map","observe","conf","_observer","forEach","lazyObserver","entryTypes","set","Wretcher","url","options","_e","catchers","_f","resolvers","_g","middlewares","_h","deferredChain","mixin","method","replace","selfFactory","split","_url","_options","qp","appendQueryParams","headerValues","headers","headerValue","Accept","Content-Type","Authorization","errorId","catcher","newMap","_catchers","controller","signal","doResolve","clear","_resolvers","_deferredChain","_middlewares","body","baseWretcher","json","wretcher","opts","finalOptions","fetchController","catchersWrapper","promise","catch","err","timeout","has","status","get","bodyParser","funName","cb","throwingPromise","then","_","ref","clearTimeout","fetchRequest","fetchFunction","reduceRight","acc","curr","idx","middlewareHelper","response","ok","msg","responseChain","blob","formData","arrayBuffer","text","setTimeout","time","abort","error","badRequest","unauthorized","forbidden","notFound","internalError","onAbort","reduce","chain","r","resolver","contents","jsObject","content","JSON","stringify","formObject","key","item","append","convertFormData","input","Object","keys","map","value","v","encodeQueryValue","join","convertFormUrl","queryString","usp","val","toString","encodeURIComponent","factory"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"wretch.js","sources":["../../src/mix.ts","../../src/config.ts","../../src/perfs.ts","../../src/wretcher.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/index.umd.ts"],"sourcesContent":["export const mix = function (one: object, two: object, mergeArrays: boolean = false) {\n if(!one || !two || typeof one !== \"object\" || typeof two !== \"object\")\n return one\n\n const clone = { ...one }\n for(const prop in two) {\n if(two.hasOwnProperty(prop)) {\n if(two[prop] instanceof Array && one[prop] instanceof Array) {\n clone[prop] = mergeArrays ? [ ...one[prop], ...two[prop] ] : two[prop]\n } else if(typeof two[prop] === \"object\" && typeof one[prop] === \"object\") {\n clone[prop] = mix(one[prop], two[prop], mergeArrays)\n } else {\n clone[prop] = two[prop]\n }\n }\n }\n\n return clone\n}\n","declare const global\n\nconst config = {\n // Default options\n defaults: {},\n // Error type\n errorType: null,\n // Polyfills\n polyfills: {\n fetch: null,\n FormData: null,\n URLSearchParams: null,\n performance: null,\n PerformanceObserver: null,\n AbortController: null\n },\n polyfill(p: string, { doThrow = true, instance = false } = {}, ...args) {\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\nexport default config\n","import conf from \"./config\"\n\nconst onMatch = (entries, name, callback, _performance) => {\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 perfs.callbacks.delete(name)\n\n if(perfs.callbacks.size < 1) {\n perfs.observer.disconnect()\n if(_performance.clearResourceTimings) {\n _performance.clearResourceTimings()\n }\n }\n return true\n }\n return false\n}\n\nconst lazyObserver = (_performance, _observer) => {\n if(!perfs.observer && _performance && _observer) {\n perfs.observer = new _observer(entries => {\n perfs.callbacks.forEach((callback, name) => {\n onMatch(entries, name, callback, _performance)\n })\n })\n if(_performance.clearResourceTimings)\n _performance.clearResourceTimings()\n }\n return perfs.observer\n}\n\nconst perfs = {\n callbacks: new Map(),\n observer: null,\n observe: (name, callback) => {\n if(!name || !callback)\n return\n\n const _performance = conf.polyfill(\"performance\", { doThrow: false })\n const _observer = conf.polyfill(\"PerformanceObserver\", { doThrow: false })\n\n if(!lazyObserver(_performance, _observer))\n return\n\n if(!onMatch(_performance, name, callback, _performance)) {\n if(perfs.callbacks.size < 1)\n perfs.observer.observe({ entryTypes: [\"resource\", \"measure\"] })\n perfs.callbacks.set(name, callback)\n }\n\n }\n}\n\nexport default perfs\n","import { mix } from \"./mix\"\nimport conf from \"./config\"\nimport { resolver, WretcherError, ResponseChain } from \"./resolver\"\nimport { ConfiguredMiddleware } from \"./middleware\"\n\nexport type WretcherOptions = RequestInit & {\n [key: string]: any\n}\n\nexport type DeferredCallback = (wretcher: Wretcher, url: string, options: WretcherOptions) => Wretcher\n\n/**\n * The Wretcher class used to perform easy fetch requests.\n *\n * Immutability : almost every method of this class return a fresh Wretcher object.\n */\nexport class Wretcher {\n\n protected constructor(\n public _url: string,\n public _options: WretcherOptions,\n public _catchers: Map void> = new Map(),\n public _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any> = [],\n public _middlewares: ConfiguredMiddleware[] = [],\n public _deferredChain: DeferredCallback[] = []) {}\n\n static factory(url = \"\", options: WretcherOptions = {}) { return new Wretcher(url, options) }\n private selfFactory({ url = this._url, options = this._options, catchers = this._catchers,\n resolvers = this._resolvers, middlewares = this._middlewares, deferredChain = this._deferredChain } = {}) {\n return new Wretcher(url, {...options}, new Map(catchers), [...resolvers], [...middlewares], [...deferredChain])\n }\n\n /**\n * Sets the default fetch options used for every subsequent fetch call.\n * @param options New default options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n defaults(options: WretcherOptions, mixin = false) {\n conf.defaults = mixin ? mix(conf.defaults, options) : options\n return this\n }\n\n /**\n * Sets the method (text, json ...) used to parse the data contained in the response body in case of an HTTP error.\n *\n * Persists for every subsequent requests.\n *\n * Default is \"text\".\n */\n errorType(method: \"text\" | \"json\") {\n conf.errorType = method\n return this\n }\n\n /**\n * Sets the non-global polyfills which will be used for every subsequent calls.\n *\n * Needed for libraries like [fetch-ponyfill](https://github.com/qubyte/fetch-ponyfill).\n *\n * @param polyfills An object containing the polyfills.\n */\n polyfills(polyfills: Partial) {\n conf.polyfills = { ...conf.polyfills, ...polyfills }\n return this\n }\n\n /**\n * Returns a new Wretcher object with the argument url appended and the same options.\n * @param url String url\n * @param replace Boolean If true, replaces the current url instead of appending\n */\n url(url: string, replace = false) {\n if(replace)\n return this.selfFactory({ url })\n const split = this._url.split(\"?\")\n return this.selfFactory({\n url: split.length > 1 ?\n split[0] + url + \"?\" + split[1] :\n this._url + url\n })\n }\n\n /**\n * Returns a new Wretcher object with the same url and new options.\n * @param options New options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n options(options: WretcherOptions, mixin = true) {\n return this.selfFactory({ options: mixin ? mix(this._options, options) : options })\n }\n\n /**\n * Converts a javascript object to query parameters,\n * then appends this query string to the current url.\n *\n * If given a string, use the string as the query verbatim.\n *\n * ```\n * let w = wretch(\"http://example.com\") // url is http://example.com\n *\n * // Chain query calls\n * w = w.query({ a: 1, b : 2 }) // url is now http://example.com?a=1&b=2\n * w = w.query(\"foo-bar-baz-woz\") // url is now http://example.com?a=1&b=2&foo-bar-baz-woz\n *\n * // Pass true as the second argument to replace existing query parameters\n * w = w.query(\"c=3&d=4\", true) // url is now http://example.com?c=3&d=4\n * ```\n *\n * @param qp An object which will be converted, or a string which will be used verbatim.\n */\n query(qp: object | string, replace: boolean = false) {\n return this.selfFactory({ url: appendQueryParams(this._url, qp, replace) })\n }\n\n /**\n * Set request headers.\n * @param headerValues An object containing header keys and values\n */\n headers(headerValues: { [headerName: string]: string }) {\n return this.selfFactory({ options: mix(this._options, { headers: headerValues || {} }) })\n }\n\n /**\n * Shortcut to set the \"Accept\" header.\n * @param headerValue Header value\n */\n accept(headerValue: string) {\n return this.headers({ Accept : headerValue })\n }\n\n /**\n * Shortcut to set the \"Content-Type\" header.\n * @param headerValue Header value\n */\n content(headerValue: string) {\n return this.headers({ \"Content-Type\" : headerValue })\n }\n\n /**\n * Shortcut to set the \"Authorization\" header.\n * @param headerValue Header value\n */\n auth(headerValue: string) {\n return this.headers({ Authorization: headerValue })\n }\n\n /**\n * Adds a default catcher which will be called on every subsequent request error when the error code matches.\n * @param errorId Error code or name\n * @param catcher: The catcher method\n */\n catcher(errorId: number | string, catcher: (error: WretcherError, originalRequest: Wretcher) => any) {\n const newMap = new Map(this._catchers)\n newMap.set(errorId, catcher)\n return this.selfFactory({ catchers: newMap })\n }\n\n /**\n * Associates a custom signal with the request.\n * @param controller : An AbortController\n */\n signal(controller: AbortController) {\n return this.selfFactory({ options: { ...this._options, signal: controller.signal }})\n }\n\n /**\n * Program a resolver to perform response chain tasks automatically.\n * @param doResolve : Resolver callback\n */\n resolve(doResolve: (chain: ResponseChain, originalRequest: Wretcher) => ResponseChain | Promise, clear: boolean = false) {\n return this.selfFactory({ resolvers: clear ? [ doResolve ] : [ ...this._resolvers, doResolve ]})\n }\n\n /**\n * Defer wretcher methods that will be chained and called just before the request is performed.\n */\n defer(callback: DeferredCallback, clear = false) {\n return this.selfFactory({\n deferredChain: clear ? [callback] : [ ...this._deferredChain, callback ]\n })\n }\n\n /**\n * Add middlewares to intercept a request before being sent.\n */\n middlewares(middlewares: ConfiguredMiddleware[], clear = false) {\n return this.selfFactory({\n middlewares: clear ? middlewares : [ ...this._middlewares, ...middlewares ]\n })\n }\n\n private method(method, options = {}, body = null) {\n let baseWretcher =\n !body ? this :\n typeof body === \"object\" ? this.json(body) :\n this.body(body)\n baseWretcher = baseWretcher.options({ ...options, method })\n const deferredWretcher = baseWretcher._deferredChain.reduce((acc: Wretcher, curr) => curr(acc, acc._url, acc._options), baseWretcher)\n return resolver(deferredWretcher)\n }\n\n /**\n * Performs a get request.\n */\n get(options?) {\n return this.method(\"GET\", options)\n }\n /**\n * Performs a delete request.\n */\n delete(options?) {\n return this.method(\"DELETE\", options)\n }\n /**\n * Performs a put request.\n */\n put(body?, options?) {\n return this.method(\"PUT\", options, body)\n }\n /**\n * Performs a post request.\n */\n post(body?, options?) {\n return this.method(\"POST\", options, body)\n }\n /**\n * Performs a patch request.\n */\n patch(body?, options?) {\n return this.method(\"PATCH\", options, body)\n }\n /**\n * Performs a head request.\n */\n head(options?) {\n return this.method(\"HEAD\", options)\n }\n /**\n * Performs an options request\n */\n opts(options?) {\n return this.method(\"OPTIONS\", options)\n }\n /**\n * Replay a request.\n */\n replay(options?) {\n return this.method(this._options.method, options)\n }\n\n /**\n * Sets the request body with any content.\n * @param contents The body contents\n */\n body(contents: any) {\n return this.selfFactory({ options: { ...this._options, body: contents }})\n }\n /**\n * Sets the content type header, stringifies an object and sets the request body.\n * @param jsObject An object which will be serialized into a JSON\n */\n json(jsObject: object) {\n return this.content(\"application/json\").body(JSON.stringify(jsObject))\n }\n /**\n * Converts the javascript object to a FormData and sets the request body.\n * @param formObject An object which will be converted to a FormData\n */\n formData(formObject: object) {\n return this.body(convertFormData(formObject))\n }\n /**\n * Converts the input to an url encoded string and sets the content-type header and body.\n * If the input argument is already a string, skips the conversion part.\n *\n * @param input An object to convert into an url encoded string or an already encoded string\n */\n formUrl(input: (object | string)) {\n return this\n .body(typeof input === \"string\" ? input : convertFormUrl(input))\n .content(\"application/x-www-form-urlencoded\")\n }\n}\n\n// Internal helpers\n\nconst appendQueryParams = (url: string, qp: object | string, replace: boolean) => {\n let queryString\n\n if(typeof qp === \"string\") {\n queryString = qp\n } else {\n const usp = conf.polyfill(\"URLSearchParams\", { instance: true })\n for(const key in qp) {\n if(qp[key] instanceof Array) {\n for(const val of qp[key])\n usp.append(key, val)\n } else {\n usp.append(key, qp[key])\n }\n }\n queryString = usp.toString()\n }\n\n const split = url.split(\"?\")\n if(replace || split.length < 2)\n return split[0] + \"?\" + queryString\n\n return url + \"&\" + queryString\n}\n\nfunction convertFormData(formObject: object) {\n const formData = conf.polyfill(\"FormData\", { instance: true })\n for(const key in formObject) {\n if(formObject[key] instanceof Array) {\n for(const item of formObject[key])\n formData.append(key + \"[]\", item)\n } else {\n formData.append(key, formObject[key])\n }\n }\n\n return formData\n}\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","import { Wretcher } from \"./wretcher\"\nimport { mix } from \"./mix\"\nimport conf from \"./config\"\nimport perfs from \"./perfs\"\nimport { middlewareHelper } from \"./middleware\"\n\nexport type WretcherError = Error & { status: number, response: WretcherResponse, text?: string, json?: any }\nexport type WretcherErrorCallback = (error: WretcherError, originalRequest: Wretcher) => any\nexport type WretcherResponse = Response & { [key: string]: any }\nexport type ResponseChain = {\n // Response types\n res: (cb?: (type: WretcherResponse) => Result) => Promise,\n json: (cb?: (type: {[key: string]: any}) => Result) => Promise,\n blob: (cb?: (type: Blob) => Result) => Promise,\n formData: (cb?: (type: FormData) => Result) => Promise,\n arrayBuffer: (cb?: (type: ArrayBuffer) => Result) => Promise,\n text: (cb?: (type: string) => Result) => Promise,\n // Extras\n perfs: (cb?: (timing: any) => void) => ResponseChain,\n setTimeout: (time: number, controller?: AbortController) => ResponseChain,\n controller: () => [any, ResponseChain],\n // Catchers\n error: (code: (number | string), cb: WretcherErrorCallback) => ResponseChain,\n badRequest: (cb: WretcherErrorCallback) => ResponseChain,\n unauthorized: (cb: WretcherErrorCallback) => ResponseChain,\n forbidden: (cb: WretcherErrorCallback) => ResponseChain,\n notFound: (cb: WretcherErrorCallback) => ResponseChain,\n timeout: (cb: WretcherErrorCallback) => ResponseChain,\n internalError: (cb: WretcherErrorCallback) => ResponseChain,\n onAbort: (cb: WretcherErrorCallback) => ResponseChain\n}\n\nexport const resolver = (wretcher: Wretcher) => {\n const {\n _url: url,\n _catchers: _catchers,\n _resolvers: resolvers,\n _middlewares: middlewares,\n _options: opts\n } = wretcher\n const catchers = new Map(_catchers)\n const finalOptions = mix(conf.defaults, opts)\n const fetchController = conf.polyfill(\"AbortController\", { doThrow: false, instance: true })\n if(!finalOptions[\"signal\"] && fetchController) {\n finalOptions[\"signal\"] = fetchController.signal\n }\n // Request timeout\n const timeout = {\n ref: null,\n clear() {\n if(timeout.ref) {\n clearTimeout(timeout.ref)\n timeout.ref = null\n }\n }\n }\n // The generated fetch request\n const fetchRequest = middlewareHelper(middlewares)(conf.polyfill(\"fetch\"))(url, finalOptions)\n // Throws on an http error\n const throwingPromise: Promise = fetchRequest.then(response => {\n timeout.clear()\n if (!response.ok) {\n return response[conf.errorType || \"text\"]().then(msg => {\n // Enhances the error object\n const err = new Error(msg)\n err[conf.errorType || \"text\"] = msg\n err[\"status\"] = response.status\n err[\"response\"] = response\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 = (promise: Promise): Promise => {\n return promise.catch(err => {\n timeout.clear()\n if(catchers.has(err.status))\n return catchers.get(err.status)(err, wretcher)\n else if(catchers.has(err.name))\n return catchers.get(err.name)(err, wretcher)\n else\n throw err\n })\n }\n // Enforces the proper promise type when a body parsing method is called.\n type BodyParser = (funName: string | null) => (cb?: (type: Type) => Result) => Promise\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(_) : _))\n\n const responseChain: ResponseChain = {\n /**\n * Retrieves the raw result as a promise.\n */\n res: bodyParser(null),\n /**\n * Retrieves the result as a parsed JSON object.\n */\n json: bodyParser(\"json\"),\n /**\n * Retrieves the result as a Blob object.\n */\n blob: bodyParser(\"blob\"),\n /**\n * Retrieves the result as a FormData object.\n */\n formData: bodyParser(\"formData\"),\n /**\n * Retrieves the result as an ArrayBuffer object.\n */\n arrayBuffer: bodyParser(\"arrayBuffer\"),\n /**\n * Retrieves the result as a string.\n */\n text: bodyParser(\"text\"),\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: cb => {\n fetchRequest.then(res => perfs.observe(res.url, cb))\n return responseChain\n },\n /**\n * Aborts the request after a fixed time.\n *\n * @param time Time in milliseconds\n * @param controller A custom controller\n */\n setTimeout: (time, controller = fetchController) => {\n timeout.clear()\n timeout.ref = setTimeout(() => controller.abort(), time)\n return responseChain\n },\n /**\n * Returns the automatically generated AbortController alongside the current wretch response as a pair.\n */\n controller: () => [ fetchController, responseChain ],\n /**\n * Catches an http response with a specific error code or name and performs a callback.\n */\n error(errorId, cb) {\n catchers.set(errorId, cb)\n return responseChain\n },\n /**\n * Catches a bad request (http code 400) and performs a callback.\n */\n badRequest: cb => responseChain.error(400, cb),\n /**\n * Catches an unauthorized request (http code 401) and performs a callback.\n */\n unauthorized: cb => responseChain.error(401, cb),\n /**\n * Catches a forbidden request (http code 403) and performs a callback.\n */\n forbidden: cb => responseChain.error(403, cb),\n /**\n * Catches a \"not found\" request (http code 404) and performs a callback.\n */\n notFound: cb => responseChain.error(404, cb),\n /**\n * Catches a timeout (http code 408) and performs a callback.\n */\n timeout: cb => responseChain.error(408, cb),\n /**\n * Catches an internal server error (http code 500) and performs a callback.\n */\n internalError: cb => responseChain.error(500, cb),\n /**\n * Catches an AbortError and performs a callback.\n */\n onAbort: cb => responseChain.error(\"AbortError\", cb)\n }\n\n return resolvers.reduce((chain, r) => r(chain, wretcher), responseChain) as (ResponseChain & Promise)\n}\n","import { WretcherOptions } from \"./wretcher\"\nimport { WretcherResponse } from \"./resolver\"\n\nexport type Middleware = (options?: {[key: string]: any}) => ConfiguredMiddleware\nexport type ConfiguredMiddleware = (next: FetchLike) => FetchLike\nexport type FetchLike = (url: string, opts: WretcherOptions) => Promise\n\nexport const middlewareHelper = (middlewares: ConfiguredMiddleware[]) => (fetchFunction: FetchLike): FetchLike => {\n return (\n middlewares.length === 0 ?\n fetchFunction :\n middlewares.length === 1 ?\n middlewares[0](fetchFunction) :\n middlewares.reduceRight((acc, curr, idx): any =>\n (idx === middlewares.length - 2) ? curr(acc(fetchFunction)) : curr(acc as any)\n )\n ) as FetchLike\n}\n","import { Wretcher } from \"./wretcher\"\n\nconst factory = Wretcher.factory\nfactory[\"default\"] = Wretcher.factory\n\n/**\n * Return a fresh Wretcher instance.\n */\nexport default factory\n"],"names":["mix","one","two","mergeArrays","clone","prop","hasOwnProperty","Array","config","defaults","errorType","polyfills","fetch","FormData","URLSearchParams","performance","PerformanceObserver","AbortController","polyfill","p","_a","_b","_c","doThrow","_d","instance","_i","args","res","this","self","global","Error","onMatch","entries","name","callback","_performance","getEntriesByName","matches","length","reverse","clearMeasures","perfs","callbacks","delete","size","observer","disconnect","clearResourceTimings","Map","observe","conf","_observer","forEach","lazyObserver","entryTypes","set","_url","_options","_catchers","_resolvers","_middlewares","_deferredChain","Wretcher","url","options","_e","catchers","_f","resolvers","_g","middlewares","_h","deferredChain","mixin","method","replace","selfFactory","split","qp","appendQueryParams","headerValues","headers","headerValue","Accept","Content-Type","Authorization","errorId","catcher","newMap","controller","signal","doResolve","clear","body","baseWretcher","json","wretcher","opts","finalOptions","fetchController","timeout","ref","clearTimeout","fetchRequest","fetchFunction","reduceRight","acc","curr","idx","middlewareHelper","throwingPromise","then","response","ok","msg","err","status","catchersWrapper","promise","catch","has","get","bodyParser","funName","cb","_","responseChain","blob","formData","arrayBuffer","text","setTimeout","time","abort","error","badRequest","unauthorized","forbidden","notFound","internalError","onAbort","reduce","chain","r","resolver","contents","jsObject","content","JSON","stringify","formObject","key","item","append","convertFormData","input","Object","keys","map","value","v","encodeQueryValue","join","queryString","usp","val","toString","encodeURIComponent","factory"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9b346e3..e2acc9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7675,6 +7675,46 @@ } } }, + "rollup-plugin-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.1.2.tgz", + "integrity": "sha512-sWKBCOS+vUkRtHtEiJPAf+WnBqk/C402fBD9AVHxSIXMqjsY7MnYWKYEUqGixtr0c8+1DjzUEPlNgOYQPVrS1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "jest-worker": "^24.6.0", + "rollup-pluginutils": "^2.8.1", + "serialize-javascript": "^1.7.0", + "terser": "^4.1.0" + }, + "dependencies": { + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "rollup-plugin-typescript": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rollup-plugin-typescript/-/rollup-plugin-typescript-1.0.1.tgz", @@ -7696,36 +7736,6 @@ } } }, - "rollup-plugin-uglify": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-uglify/-/rollup-plugin-uglify-6.0.3.tgz", - "integrity": "sha512-PIv3CfhZJlOG8C85N0GX+uK09TPggmAS6Nk6fpp2ELzDAV5VUhNzOURDU2j7+MwuRr0zq9IZttUTADc/jH8Gkg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "jest-worker": "^24.0.0", - "serialize-javascript": "^1.9.0", - "uglify-js": "^3.4.9" - }, - "dependencies": { - "commander": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.1.tgz", - "integrity": "sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg==", - "dev": true - }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", - "dev": true, - "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - } - } - } - }, "rollup-pluginutils": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", @@ -8746,6 +8756,35 @@ "uuid": "^2.0.1" } }, + "terser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", + "integrity": "sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, "test-exclude": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.1.0.tgz", @@ -9015,24 +9054,6 @@ "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", "dev": true }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", diff --git a/package.json b/package.json index e1db2f3..aaf9647 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "lint": "tslint -p tsconfig.json -t codeFrame", "fix": "tslint --fix -p tsconfig.json -t codeFrame", "prebuild": "rimraf dist && rimraf coverage && npm run lint", - "build": "tsc -p . && rollup -c", + "build": "tsc -p . && rollup -c && rollup -c --format esm -o dist/bundle/wretch.esm.js", "mock": "node scripts/mockServer.js", "test": "concurrently --success first -k jest \"npm run mock\"", "test-browsers": "rollup -c -o test/browser/src/wretch.min.js && concurrently -s first -k browserstack-runner \"npm run mock\"", @@ -56,13 +56,12 @@ "rimraf": "^3.0.0", "rollup": "^1.23.1", "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-terser": "^5.1.2", "rollup-plugin-typescript": "^1.0.1", - "rollup-plugin-uglify": "^6.0.3", "ts-jest": "^24.1.0", "tslib": "^1.10.0", "tslint": "^5.20.0", - "typescript": "^3.6.3", - "uglify-es": "^3.3.9" + "typescript": "^3.6.3" }, "jest": { "transform": { diff --git a/rollup.config.js b/rollup.config.js index bd3011e..917343d 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,24 +1,29 @@ import typescript from "rollup-plugin-typescript" -import { uglify } from "rollup-plugin-uglify" +import { terser } from "rollup-plugin-terser" import nodeResolve from "rollup-plugin-node-resolve" -import { minify } from "uglify-es" export default { input: "./src/index.umd.ts", - output: { - file: "dist/bundle/wretch.js", - format: "umd", - name: "wretch", - exports: "default", - sourcemap: true - }, + output: [ + { + file: "dist/bundle/wretch.js", + format: "umd", + name: "wretch", + exports: "default", + sourcemap: true + } + ], plugins: [ typescript({ typescript: require("typescript"), importHelpers: true }), nodeResolve(), - uglify({}, minify) + terser({ + output: { + comments: false + } + }) ], external: [ "url" ] } \ No newline at end of file