From 171ac48f26495c114d51ddc3d2e037c7fc8f00c7 Mon Sep 17 00:00:00 2001 From: Julien Elbaz Date: Wed, 7 Mar 2018 22:35:04 +0100 Subject: [PATCH] :white_check_mark: Update tests with a working abortController polyfill --- dist/bundle/wretch.js | 2 +- dist/bundle/wretch.js.map | 2 +- test/wretch.spec.ts | 38 +++++++++++++++++++++++++++----------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/dist/bundle/wretch.js b/dist/bundle/wretch.js index ab43e0a..10230aa 100644 --- a/dist/bundle/wretch.js +++ b/dist/bundle/wretch.js @@ -1,2 +1,2 @@ -!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):t.wretch=r()}(this,function(){"use strict";var t=Object.assign||function(t){for(var r,e=1,o=arguments.length;e0)&&(e(i.reverse()[0]),o.clearMeasures(r),n.callbacks.delete(r),n.callbacks.size<1&&(n.observer.disconnect(),o.clearResourceTimings&&o.clearResourceTimings()),!0)},n={callbacks:new Map,observer:null,observe:function(t,r){if(t&&r){var i=e.polyfill("performance",!1),s=e.polyfill("PerformanceObserver",!1);if(u=i,c=s,!n.observer&&u&&c&&(n.observer=new c(function(t){n.callbacks.forEach(function(r,e){o(t,e,r,u)})}),u.clearResourceTimings&&u.clearResourceTimings()),n.observer){var u,c;o(i,t,r,i)||(n.callbacks.size<1&&n.observer.observe({entryTypes:["resource","measure"]}),n.callbacks.set(t,r))}}}},i=function(){function o(t,r,e,o,n){void 0===e&&(e=new Map),void 0===o&&(o=[]),void 0===n&&(n=[]),this._url=t,this._options=r,this._catchers=e,this._resolvers=o,this._middlewares=n}return o.factory=function(t,r){return void 0===t&&(t=""),void 0===r&&(r={}),new o(t,r)},o.prototype.selfFactory=function(t){var r=void 0===t?{}:t,e=r.url,n=void 0===e?this._url:e,i=r.options,s=void 0===i?this._options:i,u=r.catchers,c=void 0===u?this._catchers:u,a=r.resolvers,f=void 0===a?this._resolvers:a,l=r.middlewares;return new o(n,s,c,f,void 0===l?this._middlewares:l)},o.prototype.defaults=function(t,o){return void 0===o&&(o=!1),e.defaults=o?r(e.defaults,t):t,this},o.prototype.errorType=function(t){return e.errorType=t,this},o.prototype.polyfills=function(r){return e.polyfills=t({},e.polyfills,r),this},o.prototype.url=function(t,r){return void 0===r&&(r=!1),r?this.selfFactory({url:t}):this.selfFactory({url:this._url+t})},o.prototype.options=function(t,e){return void 0===e&&(e=!0),this.selfFactory({options:e?r(this._options,t):t})},o.prototype.query=function(t){return this.selfFactory({url:s(this._url,t)})},o.prototype.headers=function(t){return this.selfFactory({options:r(this._options,{headers:t})})},o.prototype.accept=function(t){return this.headers({Accept:t})},o.prototype.content=function(t){return this.headers({"Content-Type":t})},o.prototype.auth=function(t){return this.headers({Authorization:t})},o.prototype.catcher=function(t,r){var e=new Map(this._catchers);return e.set(t,r),this.selfFactory({catchers:e})},o.prototype.signal=function(r){return this.selfFactory({options:t({},this._options,{signal:r.signal})})},o.prototype.resolve=function(t,r){return void 0===r&&(r=!1),this.selfFactory({resolvers:r?[t]:this._resolvers.concat([t])})},o.prototype.middlewares=function(t,r){return void 0===r&&(r=!1),this.selfFactory({middlewares:r?t:this._middlewares.concat(t)})},o.prototype.method=function(o,i){return function(t){var o=t._url,i=t._catchers,s=t._resolvers,u=t._middlewares,c=t._options,a=r(e.defaults,c),f=e.polyfill("AbortController",!1,!0);!a.signal&&f&&(a.signal=f.signal);var l,p=(l=u,function(t){return 0===l.length?t:1===l.length?l[0](t):l.reduceRight(function(r,e,o){return o===l.length-2?e(r(t)):e(r)})})(e.polyfill("fetch"))(o,a),h=p.then(function(t){return t.ok?t:t[e.errorType||"text"]().then(function(r){var o=new Error(r);throw o[e.errorType]=r,o.status=t.status,o.response=t,o})}),d=function(r){return r.catch(function(r){if(i.has(r.status))return i.get(r.status)(r,t);if(i.has(r.name))return i.get(r.name)(r,t);throw r})},y=function(t){return function(r){return d(t?h.then(function(r){return r&&r[t]()}).then(function(t){return t&&r&&r(t)||t}):h.then(function(t){return t&&r&&r(t)||t}))}},v={res:y(null),json:y("json"),blob:y("blob"),formData:y("formData"),arrayBuffer:y("arrayBuffer"),text:y("text"),perfs:function(t){return p.then(function(r){return n.observe(r.url,t)}),v},setTimeout:function(t,r){return void 0===r&&(r=f),setTimeout(function(){return r.abort()},t),v},controller:function(){return[f,v]},error:function(t,r){return i.set(t,r),v},badRequest:function(t){return v.error(400,t)},unauthorized:function(t){return v.error(401,t)},forbidden:function(t){return v.error(403,t)},notFound:function(t){return v.error(404,t)},timeout:function(t){return v.error(408,t)},internalError:function(t){return v.error(500,t)},onAbort:function(t){return v.error("AbortError",t)}};return s.reduce(function(r,e){return e(r,t)},v)}(this.options(t({},i,{method:o})))},o.prototype.get=function(t){return void 0===t&&(t={}),this.method("GET",t)},o.prototype.delete=function(t){return void 0===t&&(t={}),this.method("DELETE",t)},o.prototype.put=function(t){return void 0===t&&(t={}),this.method("PUT",t)},o.prototype.post=function(t){return void 0===t&&(t={}),this.method("POST",t)},o.prototype.patch=function(t){return void 0===t&&(t={}),this.method("PATCH",t)},o.prototype.head=function(t){return void 0===t&&(t={}),this.method("HEAD",t)},o.prototype.opts=function(t){return void 0===t&&(t={}),this.method("OPTIONS",t)},o.prototype.body=function(r){return this.selfFactory({options:t({},this._options,{body:r})})},o.prototype.json=function(t){return this.content("application/json").body(JSON.stringify(t))},o.prototype.formData=function(t){return this.body(u(t))},o.prototype.formUrl=function(t){return this.body("string"==typeof t?t:c(t)).content("application/x-www-form-urlencoded")},o}(),s=function(t,r){var o=e.polyfill("URLSearchParams",!0,!0),n=t.indexOf("?");for(var i in r)if(r[i]instanceof Array)for(var s=0,u=r[i];s0)&&(e(i.reverse()[0]),o.clearMeasures(r),n.callbacks.delete(r),n.callbacks.size<1&&(n.observer.disconnect(),o.clearResourceTimings&&o.clearResourceTimings()),!0)},n={callbacks:new Map,observer:null,observe:function(t,r){if(t&&r){var i=e.polyfill("performance",!1);(function(t,r){return!n.observer&&t&&r&&(n.observer=new r(function(r){n.callbacks.forEach(function(e,n){o(r,n,e,t)})}),t.clearResourceTimings&&t.clearResourceTimings()),n.observer})(i,e.polyfill("PerformanceObserver",!1))&&(o(i,t,r,i)||(n.callbacks.size<1&&n.observer.observe({entryTypes:["resource","measure"]}),n.callbacks.set(t,r)))}}},i=function(){function o(t,r,e,o,n){void 0===e&&(e=new Map),void 0===o&&(o=[]),void 0===n&&(n=[]),this._url=t,this._options=r,this._catchers=e,this._resolvers=o,this._middlewares=n}return o.factory=function(t,r){return void 0===t&&(t=""),void 0===r&&(r={}),new o(t,r)},o.prototype.selfFactory=function(t){var r=void 0===t?{}:t,e=r.url,n=void 0===e?this._url:e,i=r.options,s=void 0===i?this._options:i,u=r.catchers,c=void 0===u?this._catchers:u,f=r.resolvers,a=void 0===f?this._resolvers:f,l=r.middlewares;return new o(n,s,c,a,void 0===l?this._middlewares:l)},o.prototype.defaults=function(t,o){return void 0===o&&(o=!1),e.defaults=o?r(e.defaults,t):t,this},o.prototype.errorType=function(t){return e.errorType=t,this},o.prototype.polyfills=function(r){return e.polyfills=t({},e.polyfills,r),this},o.prototype.url=function(t,r){return void 0===r&&(r=!1),r?this.selfFactory({url:t}):this.selfFactory({url:this._url+t})},o.prototype.options=function(t,e){return void 0===e&&(e=!0),this.selfFactory({options:e?r(this._options,t):t})},o.prototype.query=function(t){return this.selfFactory({url:s(this._url,t)})},o.prototype.headers=function(t){return this.selfFactory({options:r(this._options,{headers:t})})},o.prototype.accept=function(t){return this.headers({Accept:t})},o.prototype.content=function(t){return this.headers({"Content-Type":t})},o.prototype.auth=function(t){return this.headers({Authorization:t})},o.prototype.catcher=function(t,r){var e=new Map(this._catchers);return e.set(t,r),this.selfFactory({catchers:e})},o.prototype.signal=function(r){return this.selfFactory({options:t({},this._options,{signal:r.signal})})},o.prototype.resolve=function(t,r){return void 0===r&&(r=!1),this.selfFactory({resolvers:r?[t]:this._resolvers.concat([t])})},o.prototype.middlewares=function(t,r){return void 0===r&&(r=!1),this.selfFactory({middlewares:r?t:this._middlewares.concat(t)})},o.prototype.method=function(o,i){return function(t){var o=t._url,i=t._catchers,s=t._resolvers,u=t._middlewares,c=t._options,f=r(e.defaults,c),a=e.polyfill("AbortController",!1,!0);!f.signal&&a&&(f.signal=a.signal);var l=function(t){return function(r){return 0===t.length?r:1===t.length?t[0](r):t.reduceRight(function(e,o,n){return n===t.length-2?o(e(r)):o(e)})}}(u)(e.polyfill("fetch"))(o,f),p=l.then(function(t){return t.ok?t:t[e.errorType||"text"]().then(function(r){var o=new Error(r);throw o[e.errorType]=r,o.status=t.status,o.response=t,o})}),h=function(r){return r.catch(function(r){if(i.has(r.status))return i.get(r.status)(r,t);if(i.has(r.name))return i.get(r.name)(r,t);throw r})},d=function(t){return function(r){return h(t?p.then(function(r){return r&&r[t]()}).then(function(t){return t&&r&&r(t)||t}):p.then(function(t){return t&&r&&r(t)||t}))}},y={res:d(null),json:d("json"),blob:d("blob"),formData:d("formData"),arrayBuffer:d("arrayBuffer"),text:d("text"),perfs:function(t){return l.then(function(r){return n.observe(r.url,t)}),y},setTimeout:function(t,r){return void 0===r&&(r=a),setTimeout(function(){return r.abort()},t),y},controller:function(){return[a,y]},error:function(t,r){return i.set(t,r),y},badRequest:function(t){return y.error(400,t)},unauthorized:function(t){return y.error(401,t)},forbidden:function(t){return y.error(403,t)},notFound:function(t){return y.error(404,t)},timeout:function(t){return y.error(408,t)},internalError:function(t){return y.error(500,t)},onAbort:function(t){return y.error("AbortError",t)}};return s.reduce(function(r,e){return e(r,t)},y)}(this.options(t({},i,{method:o})))},o.prototype.get=function(t){return void 0===t&&(t={}),this.method("GET",t)},o.prototype.delete=function(t){return void 0===t&&(t={}),this.method("DELETE",t)},o.prototype.put=function(t){return void 0===t&&(t={}),this.method("PUT",t)},o.prototype.post=function(t){return void 0===t&&(t={}),this.method("POST",t)},o.prototype.patch=function(t){return void 0===t&&(t={}),this.method("PATCH",t)},o.prototype.head=function(t){return void 0===t&&(t={}),this.method("HEAD",t)},o.prototype.opts=function(t){return void 0===t&&(t={}),this.method("OPTIONS",t)},o.prototype.body=function(r){return this.selfFactory({options:t({},this._options,{body:r})})},o.prototype.json=function(t){return this.content("application/json").body(JSON.stringify(t))},o.prototype.formData=function(t){return this.body(u(t))},o.prototype.formUrl=function(t){return this.body("string"==typeof t?t:c(t)).content("application/x-www-form-urlencoded")},o}(),s=function(t,r){var o=e.polyfill("URLSearchParams",!0,!0),n=t.indexOf("?");for(var i in r)if(r[i]instanceof Array)for(var s=0,u=r[i];s= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\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 conf from \"./config\"\n\nconst onMatch = (entries, name, callback, _performance) => {\n const matches = entries.getEntriesByName(name)\n if(matches && matches.length > 0) {\n callback(matches.reverse()[0])\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) _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\", false)\n const _observer = conf.polyfill(\"PerformanceObserver\", 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\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: RequestInit,\n public _catchers: Map void> = new Map(),\n public _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any> = [],\n public _middlewares: ConfiguredMiddleware[] = []) {}\n\n static factory(url = \"\", opts: RequestInit = {}) { return new Wretcher(url, opts) }\n private selfFactory({ url = this._url, options = this._options, catchers = this._catchers,\n resolvers = this._resolvers, middlewares = this._middlewares } = {}) {\n return new Wretcher(url, options, catchers, resolvers, middlewares)\n }\n\n /**\n * Sets the default fetch options used for every subsequent fetch call.\n * @param opts New default options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n defaults(opts: RequestInit, mixin = false) {\n conf.defaults = mixin ? mix(conf.defaults, opts) : opts\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 return replace ? this.selfFactory({ url }) : this.selfFactory({ url: this._url + url })\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: RequestInit, 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 * ```\n * let w = wretch(\"http://example.com\") // url is http://example.com\n * w = w.query({ a: 1, b : 2 }) // url is now http://example.com?a=1&b=2\n * ```\n *\n * @param qp An object which will be converted.\n */\n query(qp: object) {\n return this.selfFactory({ url: appendQueryParams(this._url, qp) })\n }\n\n /**\n * Set request headers.\n * @param headerValues An object containing header keys and values\n */\n headers(headerValues: { [headerName: string]: any }) {\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: any) {\n return this.selfFactory({ options: { ...this._options, signal: controller.signal } as any })\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 * 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, opts) {\n return resolver(this.options({ ...opts, method }))\n }\n\n /**\n * Performs a get request.\n */\n get(opts = {}) {\n return this.method(\"GET\", opts)\n }\n /**\n * Performs a delete request.\n */\n delete(opts = {}) {\n return this.method(\"DELETE\", opts)\n }\n /**\n * Performs a put request.\n */\n put(opts = {}) {\n return this.method(\"PUT\", opts)\n }\n /**\n * Performs a post request.\n */\n post(opts = {}) {\n return this.method(\"POST\", opts)\n }\n /**\n * Performs a patch request.\n */\n patch(opts = {}) {\n return this.method(\"PATCH\", opts)\n }\n /**\n * Performs a head request.\n */\n head(opts = {}) {\n return this.method(\"HEAD\", opts)\n }\n /**\n * Performs an options request\n */\n opts(opts = {}) {\n return this.method(\"OPTIONS\", opts)\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) => {\n const usp = conf.polyfill(\"URLSearchParams\", true, true)\n const index = url.indexOf(\"?\")\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 return ~index ?\n `${url.substring(0, index)}?${usp.toString()}` :\n `${url}?${usp.toString()}`\n}\n\nconst convertFormData = (formObject: object) => {\n const formData = conf.polyfill(\"FormData\", true, 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\nconst convertFormUrl = (formObject: object) => {\n return Object.keys(formObject)\n .map(key =>\n encodeURIComponent(key) + \"=\" +\n `${ encodeURIComponent(typeof formObject[key] === \"object\" ? JSON.stringify(formObject[key]) : formObject[key]) }`)\n .join(\"&\")\n}\n","import { Wretcher } from \"./wretcher\"\nimport { mix } from \"./mix\"\nimport conf from \"./config\"\nimport perfs from \"./perfs\"\nimport { middlewareHelper, ConfiguredMiddleware } from \"./middleware\"\n\nexport type WretcherError = Error & { status: number, response: Response, text?: string, json?: any }\nexport type ResponseChain = {\n // Response types\n res: (cb?: (type: Response) => 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?: (type: any) => void) => ResponseChain,\n setTimeout: (time: number, controller?: any) => ResponseChain,\n controller: () => [any, ResponseChain],\n // Catchers\n error: (code: (number | string), cb: any) => ResponseChain,\n badRequest: (cb: (error: WretcherError, originalRequest: Wretcher) => void) => ResponseChain,\n unauthorized: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n forbidden: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n notFound: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n timeout: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n internalError: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n onAbort: (cb: (error: Error, originalRequest: Wretcher) => any) => 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\n type TypeParser = (funName: string | null) => (cb?: (type: Type) => Result) => Promise\n\n const finalOpts = mix(conf.defaults, opts)\n const fetchController = conf.polyfill(\"AbortController\", false, true)\n if(!finalOpts[\"signal\"] && fetchController) {\n finalOpts[\"signal\"] = fetchController.signal\n }\n\n const req = middlewareHelper(middlewares)(conf.polyfill(\"fetch\"))(url, finalOpts)\n const wrapper: Promise = req.then(response => {\n if (!response.ok) {\n return response[conf.errorType || \"text\"]().then(_ => {\n const err = new Error(_)\n err[conf.errorType] = _\n err[\"status\"] = response.status\n err[\"response\"] = response\n throw err\n })\n }\n return response\n })\n\n const doCatch = (promise: Promise): Promise => {\n return promise.catch(err => {\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 const wrapTypeParser: TypeParser = (funName) => (cb) => funName ?\n doCatch(wrapper.then(_ => _ && _[funName]()).then(_ => _ && cb && cb(_) || _)) :\n doCatch(wrapper.then(_ => _ && cb && cb(_) || _))\n\n const responseChain: ResponseChain = {\n /**\n * Retrieves the raw result as a promise.\n */\n res: wrapTypeParser(null),\n /**\n * Retrieves the result as a parsed JSON object.\n */\n json: wrapTypeParser(\"json\"),\n /**\n * Retrieves the result as a Blob object.\n */\n blob: wrapTypeParser(\"blob\"),\n /**\n * Retrieves the result as a FormData object.\n */\n formData: wrapTypeParser(\"formData\"),\n /**\n * Retrieves the result as an ArrayBuffer object.\n */\n arrayBuffer: wrapTypeParser(\"arrayBuffer\"),\n /**\n * Retrieves the result as a string.\n */\n text: wrapTypeParser(\"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 req.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 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","export type Middleware = (options?: {[key: string]: any}) => ConfiguredMiddleware\nexport type ConfiguredMiddleware = (next: FetchLike) => FetchLike\nexport type FetchLike = (url: string, opts: RequestInit) => 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":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","mix","one","two","mergeArrays","clone","prop","Array","config","defaults","errorType","polyfills","fetch","FormData","URLSearchParams","performance","PerformanceObserver","AbortController","polyfill","doThrow","instance","_i","args","res","this","self","global","Error","onMatch","entries","name","callback","_performance","matches","getEntriesByName","reverse","clearMeasures","perfs","callbacks","delete","size","observer","disconnect","clearResourceTimings","Map","observe","conf","_observer","forEach","entryTypes","set","_url","_options","_catchers","_resolvers","_middlewares","Wretcher","url","opts","_a","_b","_c","_d","options","_e","catchers","_f","resolvers","_g","mixin","method","replace","selfFactory","qp","appendQueryParams","headerValues","headers","headerValue","Accept","Content-Type","Authorization","errorId","catcher","newMap","controller","tslib_1.__assign","signal","doResolve","clear","middlewares","wretcher","finalOpts","fetchController","req","fetchFunction","reduceRight","acc","curr","idx","middlewareHelper","wrapper","then","response","ok","_","err","status","doCatch","promise","catch","has","get","wrapTypeParser","funName","cb","responseChain","json","blob","formData","arrayBuffer","text","setTimeout","time","abort","error","badRequest","unauthorized","forbidden","notFound","timeout","internalError","onAbort","reduce","chain","r","resolver","contents","body","jsObject","content","JSON","stringify","formObject","convertFormData","input","convertFormUrl","usp","index","indexOf","key","val","append","substring","toString","item","keys","map","encodeURIComponent","join","factory"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"wretch.js","sources":["../../node_modules/tslib/tslib.es6.js","../../src/mix.ts","../../src/config.ts","../../src/perfs.ts","../../src/wretcher.ts","../../src/resolver.ts","../../src/middleware.ts","../../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [0, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { if (o[n]) i[n] = function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; }; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator];\r\n return m ? m.call(o) : typeof __values === \"function\" ? __values(o) : o[Symbol.iterator]();\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\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 conf from \"./config\"\n\nconst onMatch = (entries, name, callback, _performance) => {\n const matches = entries.getEntriesByName(name)\n if(matches && matches.length > 0) {\n callback(matches.reverse()[0])\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) _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\", false)\n const _observer = conf.polyfill(\"PerformanceObserver\", 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\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: RequestInit,\n public _catchers: Map void> = new Map(),\n public _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any> = [],\n public _middlewares: ConfiguredMiddleware[] = []) {}\n\n static factory(url = \"\", opts: RequestInit = {}) { return new Wretcher(url, opts) }\n private selfFactory({ url = this._url, options = this._options, catchers = this._catchers,\n resolvers = this._resolvers, middlewares = this._middlewares } = {}) {\n return new Wretcher(url, options, catchers, resolvers, middlewares)\n }\n\n /**\n * Sets the default fetch options used for every subsequent fetch call.\n * @param opts New default options\n * @param mixin If true, mixes in instead of replacing the existing options\n */\n defaults(opts: RequestInit, mixin = false) {\n conf.defaults = mixin ? mix(conf.defaults, opts) : opts\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 return replace ? this.selfFactory({ url }) : this.selfFactory({ url: this._url + url })\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: RequestInit, 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 * ```\n * let w = wretch(\"http://example.com\") // url is http://example.com\n * w = w.query({ a: 1, b : 2 }) // url is now http://example.com?a=1&b=2\n * ```\n *\n * @param qp An object which will be converted.\n */\n query(qp: object) {\n return this.selfFactory({ url: appendQueryParams(this._url, qp) })\n }\n\n /**\n * Set request headers.\n * @param headerValues An object containing header keys and values\n */\n headers(headerValues: { [headerName: string]: any }) {\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: any) {\n return this.selfFactory({ options: { ...this._options, signal: controller.signal } as any })\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 * 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, opts) {\n return resolver(this.options({ ...opts, method }))\n }\n\n /**\n * Performs a get request.\n */\n get(opts = {}) {\n return this.method(\"GET\", opts)\n }\n /**\n * Performs a delete request.\n */\n delete(opts = {}) {\n return this.method(\"DELETE\", opts)\n }\n /**\n * Performs a put request.\n */\n put(opts = {}) {\n return this.method(\"PUT\", opts)\n }\n /**\n * Performs a post request.\n */\n post(opts = {}) {\n return this.method(\"POST\", opts)\n }\n /**\n * Performs a patch request.\n */\n patch(opts = {}) {\n return this.method(\"PATCH\", opts)\n }\n /**\n * Performs a head request.\n */\n head(opts = {}) {\n return this.method(\"HEAD\", opts)\n }\n /**\n * Performs an options request\n */\n opts(opts = {}) {\n return this.method(\"OPTIONS\", opts)\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) => {\n const usp = conf.polyfill(\"URLSearchParams\", true, true)\n const index = url.indexOf(\"?\")\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 return ~index ?\n `${url.substring(0, index)}?${usp.toString()}` :\n `${url}?${usp.toString()}`\n}\n\nconst convertFormData = (formObject: object) => {\n const formData = conf.polyfill(\"FormData\", true, 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\nconst convertFormUrl = (formObject: object) => {\n return Object.keys(formObject)\n .map(key =>\n encodeURIComponent(key) + \"=\" +\n `${ encodeURIComponent(typeof formObject[key] === \"object\" ? JSON.stringify(formObject[key]) : formObject[key]) }`)\n .join(\"&\")\n}\n","import { Wretcher } from \"./wretcher\"\nimport { mix } from \"./mix\"\nimport conf from \"./config\"\nimport perfs from \"./perfs\"\nimport { middlewareHelper, ConfiguredMiddleware } from \"./middleware\"\n\nexport type WretcherError = Error & { status: number, response: Response, text?: string, json?: any }\nexport type ResponseChain = {\n // Response types\n res: (cb?: (type: Response) => 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?: (type: any) => void) => ResponseChain,\n setTimeout: (time: number, controller?: any) => ResponseChain,\n controller: () => [any, ResponseChain],\n // Catchers\n error: (code: (number | string), cb: any) => ResponseChain,\n badRequest: (cb: (error: WretcherError, originalRequest: Wretcher) => void) => ResponseChain,\n unauthorized: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n forbidden: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n notFound: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n timeout: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n internalError: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain,\n onAbort: (cb: (error: Error, originalRequest: Wretcher) => any) => 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\n type TypeParser = (funName: string | null) => (cb?: (type: Type) => Result) => Promise\n\n const finalOpts = mix(conf.defaults, opts)\n const fetchController = conf.polyfill(\"AbortController\", false, true)\n if(!finalOpts[\"signal\"] && fetchController) {\n finalOpts[\"signal\"] = fetchController.signal\n }\n\n const req = middlewareHelper(middlewares)(conf.polyfill(\"fetch\"))(url, finalOpts)\n const wrapper: Promise = req.then(response => {\n if (!response.ok) {\n return response[conf.errorType || \"text\"]().then(_ => {\n const err = new Error(_)\n err[conf.errorType] = _\n err[\"status\"] = response.status\n err[\"response\"] = response\n throw err\n })\n }\n return response\n })\n\n const doCatch = (promise: Promise): Promise => {\n return promise.catch(err => {\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 const wrapTypeParser: TypeParser = (funName) => (cb) => funName ?\n doCatch(wrapper.then(_ => _ && _[funName]()).then(_ => _ && cb && cb(_) || _)) :\n doCatch(wrapper.then(_ => _ && cb && cb(_) || _))\n\n const responseChain: ResponseChain = {\n /**\n * Retrieves the raw result as a promise.\n */\n res: wrapTypeParser(null),\n /**\n * Retrieves the result as a parsed JSON object.\n */\n json: wrapTypeParser(\"json\"),\n /**\n * Retrieves the result as a Blob object.\n */\n blob: wrapTypeParser(\"blob\"),\n /**\n * Retrieves the result as a FormData object.\n */\n formData: wrapTypeParser(\"formData\"),\n /**\n * Retrieves the result as an ArrayBuffer object.\n */\n arrayBuffer: wrapTypeParser(\"arrayBuffer\"),\n /**\n * Retrieves the result as a string.\n */\n text: wrapTypeParser(\"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 req.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 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","export type Middleware = (options?: {[key: string]: any}) => ConfiguredMiddleware\nexport type ConfiguredMiddleware = (next: FetchLike) => FetchLike\nexport type FetchLike = (url: string, opts: RequestInit) => 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":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","mix","one","two","mergeArrays","clone","prop","Array","config","defaults","errorType","polyfills","fetch","FormData","URLSearchParams","performance","PerformanceObserver","AbortController","polyfill","doThrow","instance","_i","args","res","this","self","global","Error","onMatch","entries","name","callback","_performance","matches","getEntriesByName","reverse","clearMeasures","perfs","callbacks","delete","size","observer","disconnect","clearResourceTimings","Map","observe","conf","_observer","forEach","lazyObserver","entryTypes","set","_url","_options","_catchers","_resolvers","_middlewares","Wretcher","url","opts","_a","_b","_c","_d","options","_e","catchers","_f","resolvers","_g","mixin","method","replace","selfFactory","qp","appendQueryParams","headerValues","headers","headerValue","Accept","Content-Type","Authorization","errorId","catcher","newMap","controller","tslib_1.__assign","signal","doResolve","clear","middlewares","wretcher","finalOpts","fetchController","req","fetchFunction","reduceRight","acc","curr","idx","middlewareHelper","wrapper","then","response","ok","_","err","status","doCatch","promise","catch","has","get","wrapTypeParser","funName","cb","responseChain","json","blob","formData","arrayBuffer","text","setTimeout","time","abort","error","badRequest","unauthorized","forbidden","notFound","timeout","internalError","onAbort","reduce","chain","r","resolver","contents","body","jsObject","content","JSON","stringify","formObject","convertFormData","input","convertFormUrl","usp","index","indexOf","key","val","append","substring","toString","item","keys","map","encodeURIComponent","join","factory"],"mappings":"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"} \ No newline at end of file diff --git a/test/wretch.spec.ts b/test/wretch.spec.ts index c4fa037..a602691 100644 --- a/test/wretch.spec.ts +++ b/test/wretch.spec.ts @@ -1,6 +1,6 @@ -import * as nodeFetch from "node-fetch" +import nodeFetch from "node-fetch" import * as FormData from "form-data" -import * as AbortController from "abortcontroller" +import { AbortController, abortableFetch } from "abortcontroller-polyfill/dist/cjs-ponyfill" import * as fs from "fs" import { URLSearchParams } from "url" import * as path from "path" @@ -23,10 +23,11 @@ const allRoutes = (obj, type, action, opts?) => Promise.all([ obj.delete(opts)[type](action), ]) -const fetchPolyfill = (timeout = null) => +const fetchPolyfill = (timeout = null) => ( function(url, opts) { performance.mark(url + " - begin") - return nodeFetch(url, opts).then(_ => { + const { fetch } = abortableFetch(nodeFetch) + return fetch(url, opts).then(_ => { performance.mark(url + " - end") const measure = () => performance.measure(_.url, url + " - begin", url + " - end") if(timeout) @@ -36,6 +37,7 @@ const fetchPolyfill = (timeout = null) => return _ }) } +) const duckImage = fs.readFileSync(path.resolve(__dirname, "assets", "duck.jpg")) @@ -51,6 +53,7 @@ describe("Wretch", function() { it("should set and use non global polyfills", async function() { global["FormData"] = null + global["URLSearchParams"] = null expect(() => wretch("...").query({ a: 1, b: 2 })).toThrow("URLSearchParams is not defined") expect(() => wretch("...").formData({ a: 1, b: 2 })).toThrow("FormData is not defined") @@ -347,25 +350,38 @@ describe("Wretch", function() { }) it("should abort a request", function(done) { - // Waiting for real nodejs polyfills ... + let count = 0 + + const handleError = error => { + expect(error.name).toBe("AbortError") + count++ + } + const controller = new AbortController() wretch(`${_URL}/longResult`) .signal(controller) .get() - .text(_ => 1) + .res() + .catch(handleError) controller.abort() const [c, w] = wretch(`${_URL}/longResult`).get().controller() - w.text(_ => 1) + w.res().catch(handleError) c.abort() wretch(`${_URL}/longResult`) .get() - .setTimeout(500) - // tslint:disable-next-line:no-console - .onAbort(err => console.log(err)) + .setTimeout(100) + .onAbort(handleError) + .res() + + const [c2, w2] = wretch(`${_URL}/longResult`).get().controller() + w2.setTimeout(100, c2).onAbort(handleError).res() - setTimeout(done, 1000) + setTimeout(() => { + expect(count).toBe(4) + done() + }, 1000) }) it("should program resolvers", async function() {