diff --git a/README.md b/README.md index 2887ae9..e62625b 100644 --- a/README.md +++ b/README.md @@ -258,7 +258,7 @@ Creates a new Wretcher object with an url and [vanilla fetch options](https://de *Helper methods are optional and can be chained.* -| [url](#urlurl-string-replace-boolean--false) | [query](#queryqp-object) | [options](#optionsoptions-object-mixin-boolean--true) | [headers](#headersheadervalues-object) | [accept](#acceptheadervalue-string) | [content](#contentheadervalue-string) | [auth](#authheadervalue-string) | [catcher](#catchererrorid-number--string-catcher-error-wretchererror--void) | [resolve](#resolvedoresolve-chain-responsechain--responsechain--promise-clear--false) | [defaults](#defaultsopts-object-mixin-boolean--false) | [errorType](#errortypemethod-text--json--text) | [polyfills](#polyfillspolyfills-object) | +| [url](#urlurl-string-replace-boolean--false) | [query](#queryqp-object) | [options](#optionsoptions-object-mixin-boolean--true) | [headers](#headersheadervalues-object) | [accept](#acceptheadervalue-string) | [content](#contentheadervalue-string) | [auth](#authheadervalue-string) | [catcher](#catchererrorid-number--string-catcher-error-wretchererror-originalrequest-wretcher--void) | [resolve](#resolvedoresolve-chain-responsechain-originalrequest-wretcher--responsechain--promise-clear--false) | [defaults](#defaultsopts-object-mixin-boolean--false) | [errorType](#errortypemethod-text--json--text) | [polyfills](#polyfillspolyfills-object) | |-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----| #### url(url: string, replace: boolean = false) @@ -380,14 +380,14 @@ Shortcut to set the "Authorization" header. wretch("...").auth("Basic d3JldGNoOnJvY2tz") ``` -#### catcher(errorId: number | string, catcher: (error: WretcherError) => void) +#### catcher(errorId: number | string, catcher: (error: WretcherError, originalRequest: Wretcher) => void) Adds a [catcher](https://github.com/elbywan/wretch#catchers) which will be called on every subsequent request error. Very useful when you need to perform a repetitive action on a specific error code. ```js -const w = wretcher() +const w = wretch() .catcher(404, err => redirect("/routes/notfound", err.message)) .catcher(500, err => flashMessage("internal.server.error")) .error("SyntaxError", err => log("bad.json")) @@ -399,7 +399,25 @@ w.url("http://myapi.com/get/something").get().json(json => /* ... */) w.url("...").notFound(err => /* overrides the default 'redirect' catcher */) ``` -#### resolve(doResolve: (chain: ResponseChain) => ResponseChain | Promise, clear = false) +The original request is passed along the error and can be used in order to perform an additional request. + +```js +const reAuthOn401 = wretch() + .catcher(401, async (error, request) => { + // Renew credentials + const token = await wretch("/renewtoken").get().text() + storeToken(token) + // Replay the original request with new credentials + return request.auth(token).get().unauthorized(err => { throw err }).json() + }) + +reAuthOn401.url("/resource") + .get() + .json() // <- Will only be called for the original promise + .then(callback) // <- Will be called for the original OR the replayed promise result +``` + +#### resolve(doResolve: (chain: ResponseChain, originalRequest: Wretcher) => ResponseChain | Promise, clear = false) Programs a resolver which will automatically be injected to perform response chain tasks. @@ -603,7 +621,7 @@ wretch("...").opts({ credentials: "same-origin" }) *Catchers can be chained.* -| [badRequest](#badrequestcb-error-wretchererror--any) | [unauthorized](#unauthorizedcb-error-wretchererror--any) | [forbidden](#forbiddencb-error-wretchererror--any) | [notFound](#notfoundcb-error-wretchererror--any) | [timeout](#timeoutcb-error-wretchererror--any) | [internalError](#internalerrorcb-error-wretchererror--any) | [error](#errorerrorid-number--string-cb-error-wretchererror--any) | +| [badRequest](#badrequestcb-error-wretchererror-originalrequest-wretcher--any) | [unauthorized](#unauthorizedcb-error-wretchererror-originalrequest-wretcher--any) | [forbidden](#forbiddencb-error-wretchererror-originalrequest-wretcher--any) | [notFound](#notfoundcb-error-wretchererror-originalrequest-wretcher--any) | [timeout](#timeoutcb-error-wretchererror-originalrequest-wretcher--any) | [internalError](#internalerrorcb-error-wretchererror-originalrequest-wretcher--any) | [error](#errorerrorid-number--string-cb-error-wretchererror-originalrequest-wretcher--any) | |-----|-----|-----|-----|-----|-----|-----| ```ts @@ -623,34 +641,53 @@ wretch("...") .res() ``` -#### badRequest(cb: (error: WretcherError) => any) +#### badRequest(cb: (error: WretcherError, originalRequest: Wretcher) => any) Syntactic sugar for `error(400, cb)`. -#### unauthorized(cb: (error: WretcherError) => any) +#### unauthorized(cb: (error: WretcherError, originalRequest: Wretcher) => any) Syntactic sugar for `error(401, cb)`. -#### forbidden(cb: (error: WretcherError) => any) +#### forbidden(cb: (error: WretcherError, originalRequest: Wretcher) => any) Syntactic sugar for `error(403, cb)`. -#### notFound(cb: (error: WretcherError) => any) +#### notFound(cb: (error: WretcherError, originalRequest: Wretcher) => any) Syntactic sugar for `error(404, cb)`. -#### timeout(cb: (error: WretcherError) => any) +#### timeout(cb: (error: WretcherError, originalRequest: Wretcher) => any) Syntactic sugar for `error(418, cb)`. -#### internalError(cb: (error: WretcherError) => any) +#### internalError(cb: (error: WretcherError, originalRequest: Wretcher) => any) Syntactic sugar for `error(500, cb)`. -#### error(errorId: number | string, cb: (error: WretcherError) => any) +#### error(errorId: number | string, cb: (error: WretcherError, originalRequest: Wretcher) => any) Catches a specific error given its code or name and perform the callback. +The original request is passed along the error and can be used in order to perform an additional request. + +```js +wretch("/resource") + .get() + .unauthorized(async (error, req) => { + // Renew credentials + const token = await wretch("/renewtoken").get().text() + storeToken(token) + // Replay the original request with new credentials + return req.auth(token).get().unauthorized(err => { throw err }).json() + }) + .json() + // The promise chain is preserved as expected + // ".then" will be performed on the result of the original request + // or the replayed one (if a 401 error was thrown) + .then(callback) +``` + ## Response Types **Required** diff --git a/dist/bundle/wretch.js b/dist/bundle/wretch.js index eaa1efc..a7632b2 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);(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?e.defaults=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){return function(o){return void 0===o&&(o=new Map),function(i){return function(s){return function(u){void 0===u&&(u={});var c=r(e.defaults,u),f=e.polyfill("AbortController",!1,!0);!c.signal&&f&&(c.signal=f.signal);var a=function(t){return function(r){return 0===t.length?r:1===t.length?t[0](r):t.reduceRight(function(e,o,n){return o(n===t.length-2?e(r):e)})}}(s)(e.polyfill("fetch"))(t,c),l=a.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})}),p=function(t){return t.catch(function(t){if(o.has(t.status))o.get(t.status)(t);else{if(!o.has(t.name))throw t;o.get(t.name)(t)}})},h=function(t){return function(r){return p(t?l.then(function(r){return r&&r[t]()}).then(function(t){return t&&r&&r(t)||t}):l.then(function(t){return t&&r&&r(t)||t}))}},d={res:h(null),json:h("json"),blob:h("blob"),formData:h("formData"),arrayBuffer:h("arrayBuffer"),text:h("text"),perfs:function(t){return a.then(function(r){return n.observe(r.url,t)}),d},setTimeout:function(t,r){return void 0===r&&(r=f),setTimeout(function(){return r.abort()},t),d},controller:function(){return[f,d]},error:function(t,r){return o.set(t,r),d},badRequest:function(t){return d.error(400,t)},unauthorized:function(t){return d.error(401,t)},forbidden:function(t){return d.error(403,t)},notFound:function(t){return d.error(404,t)},timeout:function(t){return d.error(408,t)},internalError:function(t){return d.error(500,t)},onAbort:function(t){return d.error("AbortError",t)}};return i.reduce(function(t,r){return r(t)},d)}}}}}(this._url)(this._catchers)(this._resolvers)(this._middlewares)(t({},r(i,this._options),{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 o(n===t.length-2?e(r):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 private _url: string,\n private _options: RequestInit,\n private _catchers: Map void> = new Map(),\n private _resolvers: Array<(resolver: ResponseChain) => any> = [],\n private _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 ? conf.defaults = 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) => void) {\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) => 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._url)(this._catchers)(this._resolvers)(this._middlewares)({ ...mix(opts, this._options), 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 { 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) => void) => ResponseChain,\n unauthorized: (cb: (error: WretcherError) => void) => ResponseChain,\n forbidden: (cb: (error: WretcherError) => void) => ResponseChain,\n notFound: (cb: (error: WretcherError) => void) => ResponseChain,\n timeout: (cb: (error: WretcherError) => void) => ResponseChain,\n internalError: (cb: (error: WretcherError) => void) => ResponseChain,\n onAbort: (cb: (error: Error) => void) => ResponseChain\n}\n\nexport const resolver = url =>\n (catchers: Map void> = new Map()) =>\n (resolvers: Array<(chain: ResponseChain) => ResponseChain & Promise>) =>\n (middlewares: ConfiguredMiddleware[]) =>\n (opts = {}) => {\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 catchers.get(err.status)(err)\n else if(catchers.has(err.name))\n catchers.get(err.name)(err)\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), 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","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","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/dist/resolver.d.ts b/dist/resolver.d.ts index 3f96d3c..6ca9262 100644 --- a/dist/resolver.d.ts +++ b/dist/resolver.d.ts @@ -1,4 +1,4 @@ -import { ConfiguredMiddleware } from "./middleware"; +import { Wretcher } from "./wretcher"; export declare type WretcherError = Error & { status: number; response: Response; @@ -20,12 +20,12 @@ export declare type ResponseChain = { setTimeout: (time: number, controller?: any) => ResponseChain; controller: () => [any, ResponseChain]; error: (code: (number | string), cb: any) => ResponseChain; - badRequest: (cb: (error: WretcherError) => void) => ResponseChain; - unauthorized: (cb: (error: WretcherError) => void) => ResponseChain; - forbidden: (cb: (error: WretcherError) => void) => ResponseChain; - notFound: (cb: (error: WretcherError) => void) => ResponseChain; - timeout: (cb: (error: WretcherError) => void) => ResponseChain; - internalError: (cb: (error: WretcherError) => void) => ResponseChain; - onAbort: (cb: (error: Error) => void) => ResponseChain; + badRequest: (cb: (error: WretcherError, originalRequest: Wretcher) => void) => ResponseChain; + unauthorized: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain; + forbidden: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain; + notFound: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain; + timeout: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain; + internalError: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain; + onAbort: (cb: (error: Error, originalRequest: Wretcher) => any) => ResponseChain; }; -export declare const resolver: (url: any) => (catchers?: Map void>) => (resolvers: ((chain: ResponseChain) => ResponseChain & Promise)[]) => (middlewares: ConfiguredMiddleware[]) => (opts?: {}) => ResponseChain & Promise; +export declare const resolver: (wretcher: Wretcher) => ResponseChain & Promise; diff --git a/dist/resolver.js b/dist/resolver.js index 640b92e..4a4ba95 100644 --- a/dist/resolver.js +++ b/dist/resolver.js @@ -2,133 +2,124 @@ import { mix } from "./mix"; import conf from "./config"; import perfs from "./perfs"; import { middlewareHelper } from "./middleware"; -export var resolver = function (url) { - return function (catchers) { - if (catchers === void 0) { catchers = new Map(); } - return function (resolvers) { - return function (middlewares) { - return function (opts) { - if (opts === void 0) { opts = {}; } - var finalOpts = mix(conf.defaults, opts); - var fetchController = conf.polyfill("AbortController", false, true); - if (!finalOpts["signal"] && fetchController) { - finalOpts["signal"] = fetchController.signal; - } - var req = middlewareHelper(middlewares)(conf.polyfill("fetch"))(url, finalOpts); - var wrapper = req.then(function (response) { - if (!response.ok) { - return response[conf.errorType || "text"]().then(function (_) { - var err = new Error(_); - err[conf.errorType] = _; - err["status"] = response.status; - err["response"] = response; - throw err; - }); - } - return response; - }); - var doCatch = function (promise) { - return promise.catch(function (err) { - if (catchers.has(err.status)) - catchers.get(err.status)(err); - else if (catchers.has(err.name)) - catchers.get(err.name)(err); - else - throw err; - }); - }; - var wrapTypeParser = function (funName) { return function (cb) { return funName ? - doCatch(wrapper.then(function (_) { return _ && _[funName](); }).then(function (_) { return _ && cb && cb(_) || _; })) : - doCatch(wrapper.then(function (_) { return _ && cb && cb(_) || _; })); }; }; - var responseChain = { - /** - * Retrieves the raw result as a promise. - */ - res: wrapTypeParser(null), - /** - * Retrieves the result as a parsed JSON object. - */ - json: wrapTypeParser("json"), - /** - * Retrieves the result as a Blob object. - */ - blob: wrapTypeParser("blob"), - /** - * Retrieves the result as a FormData object. - */ - formData: wrapTypeParser("formData"), - /** - * Retrieves the result as an ArrayBuffer object. - */ - arrayBuffer: wrapTypeParser("arrayBuffer"), - /** - * Retrieves the result as a string. - */ - text: wrapTypeParser("text"), - /** - * Performs a callback on the API performance timings of the request. - * - * Warning: Still experimental on browsers and node.js - */ - perfs: function (cb) { - req.then(function (res) { return perfs.observe(res.url, cb); }); - return responseChain; - }, - /** - * Aborts the request after a fixed time. - * - * @param time Time in milliseconds - * @param controller A custom controller - */ - setTimeout: function (time, controller) { - if (controller === void 0) { controller = fetchController; } - setTimeout(function () { return controller.abort(); }, time); - return responseChain; - }, - /** - * Returns the automatically generated AbortController alongside the current wretch response as a pair. - */ - controller: function () { return [fetchController, responseChain]; }, - /** - * Catches an http response with a specific error code or name and performs a callback. - */ - error: function (errorId, cb) { - catchers.set(errorId, cb); - return responseChain; - }, - /** - * Catches a bad request (http code 400) and performs a callback. - */ - badRequest: function (cb) { return responseChain.error(400, cb); }, - /** - * Catches an unauthorized request (http code 401) and performs a callback. - */ - unauthorized: function (cb) { return responseChain.error(401, cb); }, - /** - * Catches a forbidden request (http code 403) and performs a callback. - */ - forbidden: function (cb) { return responseChain.error(403, cb); }, - /** - * Catches a "not found" request (http code 404) and performs a callback. - */ - notFound: function (cb) { return responseChain.error(404, cb); }, - /** - * Catches a timeout (http code 408) and performs a callback. - */ - timeout: function (cb) { return responseChain.error(408, cb); }, - /** - * Catches an internal server error (http code 500) and performs a callback. - */ - internalError: function (cb) { return responseChain.error(500, cb); }, - /** - * Catches an AbortError and performs a callback. - */ - onAbort: function (cb) { return responseChain.error("AbortError", cb); } - }; - return resolvers.reduce(function (chain, r) { return r(chain); }, responseChain); - }; - }; - }; +export var resolver = function (wretcher) { + var url = wretcher._url, catchers = wretcher._catchers, resolvers = wretcher._resolvers, middlewares = wretcher._middlewares, opts = wretcher._options; + var finalOpts = mix(conf.defaults, opts); + var fetchController = conf.polyfill("AbortController", false, true); + if (!finalOpts["signal"] && fetchController) { + finalOpts["signal"] = fetchController.signal; + } + var req = middlewareHelper(middlewares)(conf.polyfill("fetch"))(url, finalOpts); + var wrapper = req.then(function (response) { + if (!response.ok) { + return response[conf.errorType || "text"]().then(function (_) { + var err = new Error(_); + err[conf.errorType] = _; + err["status"] = response.status; + err["response"] = response; + throw err; + }); + } + return response; + }); + var doCatch = function (promise) { + return promise.catch(function (err) { + if (catchers.has(err.status)) + return catchers.get(err.status)(err, wretcher); + else if (catchers.has(err.name)) + return catchers.get(err.name)(err, wretcher); + else + throw err; + }); }; + var wrapTypeParser = function (funName) { return function (cb) { return funName ? + doCatch(wrapper.then(function (_) { return _ && _[funName](); }).then(function (_) { return _ && cb && cb(_) || _; })) : + doCatch(wrapper.then(function (_) { return _ && cb && cb(_) || _; })); }; }; + var responseChain = { + /** + * Retrieves the raw result as a promise. + */ + res: wrapTypeParser(null), + /** + * Retrieves the result as a parsed JSON object. + */ + json: wrapTypeParser("json"), + /** + * Retrieves the result as a Blob object. + */ + blob: wrapTypeParser("blob"), + /** + * Retrieves the result as a FormData object. + */ + formData: wrapTypeParser("formData"), + /** + * Retrieves the result as an ArrayBuffer object. + */ + arrayBuffer: wrapTypeParser("arrayBuffer"), + /** + * Retrieves the result as a string. + */ + text: wrapTypeParser("text"), + /** + * Performs a callback on the API performance timings of the request. + * + * Warning: Still experimental on browsers and node.js + */ + perfs: function (cb) { + req.then(function (res) { return perfs.observe(res.url, cb); }); + return responseChain; + }, + /** + * Aborts the request after a fixed time. + * + * @param time Time in milliseconds + * @param controller A custom controller + */ + setTimeout: function (time, controller) { + if (controller === void 0) { controller = fetchController; } + setTimeout(function () { return controller.abort(); }, time); + return responseChain; + }, + /** + * Returns the automatically generated AbortController alongside the current wretch response as a pair. + */ + controller: function () { return [fetchController, responseChain]; }, + /** + * Catches an http response with a specific error code or name and performs a callback. + */ + error: function (errorId, cb) { + catchers.set(errorId, cb); + return responseChain; + }, + /** + * Catches a bad request (http code 400) and performs a callback. + */ + badRequest: function (cb) { return responseChain.error(400, cb); }, + /** + * Catches an unauthorized request (http code 401) and performs a callback. + */ + unauthorized: function (cb) { return responseChain.error(401, cb); }, + /** + * Catches a forbidden request (http code 403) and performs a callback. + */ + forbidden: function (cb) { return responseChain.error(403, cb); }, + /** + * Catches a "not found" request (http code 404) and performs a callback. + */ + notFound: function (cb) { return responseChain.error(404, cb); }, + /** + * Catches a timeout (http code 408) and performs a callback. + */ + timeout: function (cb) { return responseChain.error(408, cb); }, + /** + * Catches an internal server error (http code 500) and performs a callback. + */ + internalError: function (cb) { return responseChain.error(500, cb); }, + /** + * Catches an AbortError and performs a callback. + */ + onAbort: function (cb) { return responseChain.error("AbortError", cb); } + }; + return resolvers.reduce(function (chain, r) { return r(chain, wretcher); }, responseChain); }; //# sourceMappingURL=resolver.js.map \ No newline at end of file diff --git a/dist/resolver.js.map b/dist/resolver.js.map index 39ec18b..8bd3e02 100644 --- a/dist/resolver.js.map +++ b/dist/resolver.js.map @@ -1 +1 @@ -{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/wretcher.d.ts b/dist/wretcher.d.ts index 7bf3543..e6864a9 100644 --- a/dist/wretcher.d.ts +++ b/dist/wretcher.d.ts @@ -7,12 +7,12 @@ import { ConfiguredMiddleware } from "./middleware"; * Immutability : almost every method of this class return a fresh Wretcher object. */ export declare class Wretcher { - private _url; - private _options; - private _catchers; - private _resolvers; - private _middlewares; - protected constructor(_url: string, _options: RequestInit, _catchers?: Map void>, _resolvers?: Array<(resolver: ResponseChain) => any>, _middlewares?: ConfiguredMiddleware[]); + _url: string; + _options: RequestInit; + _catchers: Map void>; + _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any>; + _middlewares: ConfiguredMiddleware[]; + protected constructor(_url: string, _options: RequestInit, _catchers?: Map void>, _resolvers?: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any>, _middlewares?: ConfiguredMiddleware[]); static factory(url?: string, opts?: RequestInit): Wretcher; private selfFactory({url, options, catchers, resolvers, middlewares}?); /** @@ -88,7 +88,7 @@ export declare class Wretcher { * @param errorId Error code or name * @param catcher: The catcher method */ - catcher(errorId: number | string, catcher: (error: WretcherError) => void): Wretcher; + catcher(errorId: number | string, catcher: (error: WretcherError, originalRequest: Wretcher) => any): Wretcher; /** * Associates a custom signal with the request. * @param controller : An AbortController @@ -98,7 +98,7 @@ export declare class Wretcher { * Program a resolver to perform response chain tasks automatically. * @param doResolve : Resolver callback */ - resolve(doResolve: (chain: ResponseChain) => ResponseChain | Promise, clear?: boolean): Wretcher; + resolve(doResolve: (chain: ResponseChain, originalRequest: Wretcher) => ResponseChain | Promise, clear?: boolean): Wretcher; /** * Add middlewares to intercept a request before being sent. */ diff --git a/dist/wretcher.js b/dist/wretcher.js index aab94d7..7623037 100644 --- a/dist/wretcher.js +++ b/dist/wretcher.js @@ -41,7 +41,7 @@ var Wretcher = /** @class */ (function () { */ Wretcher.prototype.defaults = function (opts, mixin) { if (mixin === void 0) { mixin = false; } - conf.defaults = mixin ? conf.defaults = mix(conf.defaults, opts) : opts; + conf.defaults = mixin ? mix(conf.defaults, opts) : opts; return this; }; /** @@ -161,7 +161,7 @@ var Wretcher = /** @class */ (function () { }); }; Wretcher.prototype.method = function (method, opts) { - return resolver(this._url)(this._catchers)(this._resolvers)(this._middlewares)(__assign({}, mix(opts, this._options), { method: method })); + return resolver(this.options(__assign({}, opts, { method: method }))); }; /** * Performs a get request. diff --git a/dist/wretcher.js.map b/dist/wretcher.js.map index 7e0d5d7..4ed518c 100644 --- a/dist/wretcher.js.map +++ b/dist/wretcher.js.map @@ -1 +1 @@ -{"version":3,"file":"wretcher.js","sourceRoot":"","sources":["../src/wretcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"wretcher.js","sourceRoot":"","sources":["../src/wretcher.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/resolver.ts b/src/resolver.ts index c3f8bd0..db38648 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1,3 +1,4 @@ +import { Wretcher } from "./wretcher" import { mix } from "./mix" import conf from "./config" import perfs from "./perfs" @@ -18,20 +19,24 @@ export type ResponseChain = { controller: () => [any, ResponseChain], // Catchers error: (code: (number | string), cb: any) => ResponseChain, - badRequest: (cb: (error: WretcherError) => void) => ResponseChain, - unauthorized: (cb: (error: WretcherError) => void) => ResponseChain, - forbidden: (cb: (error: WretcherError) => void) => ResponseChain, - notFound: (cb: (error: WretcherError) => void) => ResponseChain, - timeout: (cb: (error: WretcherError) => void) => ResponseChain, - internalError: (cb: (error: WretcherError) => void) => ResponseChain, - onAbort: (cb: (error: Error) => void) => ResponseChain + badRequest: (cb: (error: WretcherError, originalRequest: Wretcher) => void) => ResponseChain, + unauthorized: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain, + forbidden: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain, + notFound: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain, + timeout: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain, + internalError: (cb: (error: WretcherError, originalRequest: Wretcher) => any) => ResponseChain, + onAbort: (cb: (error: Error, originalRequest: Wretcher) => any) => ResponseChain } -export const resolver = url => - (catchers: Map void> = new Map()) => - (resolvers: Array<(chain: ResponseChain) => ResponseChain & Promise>) => - (middlewares: ConfiguredMiddleware[]) => - (opts = {}) => { +export const resolver = (wretcher: Wretcher) => { + const { + _url: url, + _catchers: catchers, + _resolvers: resolvers, + _middlewares: middlewares, + _options: opts + } = wretcher + type TypeParser = (funName: string | null) => (cb?: (type: Type) => Result) => Promise const finalOpts = mix(conf.defaults, opts) @@ -57,9 +62,9 @@ export const resolver = url => const doCatch = (promise: Promise): Promise => { return promise.catch(err => { if(catchers.has(err.status)) - catchers.get(err.status)(err) + return catchers.get(err.status)(err, wretcher) else if(catchers.has(err.name)) - catchers.get(err.name)(err) + return catchers.get(err.name)(err, wretcher) else throw err }) @@ -153,5 +158,5 @@ export const resolver = url => onAbort: cb => responseChain.error("AbortError", cb) } - return resolvers.reduce((chain, r) => r(chain), responseChain) as (ResponseChain & Promise) + return resolvers.reduce((chain, r) => r(chain, wretcher), responseChain) as (ResponseChain & Promise) } diff --git a/src/wretcher.ts b/src/wretcher.ts index 186d5f2..8be7794 100644 --- a/src/wretcher.ts +++ b/src/wretcher.ts @@ -11,11 +11,11 @@ import { ConfiguredMiddleware } from "./middleware" export class Wretcher { protected constructor( - private _url: string, - private _options: RequestInit, - private _catchers: Map void> = new Map(), - private _resolvers: Array<(resolver: ResponseChain) => any> = [], - private _middlewares: ConfiguredMiddleware[] = []) {} + public _url: string, + public _options: RequestInit, + public _catchers: Map void> = new Map(), + public _resolvers: Array<(resolver: ResponseChain, originalRequest: Wretcher) => any> = [], + public _middlewares: ConfiguredMiddleware[] = []) {} static factory(url = "", opts: RequestInit = {}) { return new Wretcher(url, opts) } private selfFactory({ url = this._url, options = this._options, catchers = this._catchers, @@ -127,7 +127,7 @@ export class Wretcher { * @param errorId Error code or name * @param catcher: The catcher method */ - catcher(errorId: number | string, catcher: (error: WretcherError) => void) { + catcher(errorId: number | string, catcher: (error: WretcherError, originalRequest: Wretcher) => any) { const newMap = new Map(this._catchers) newMap.set(errorId, catcher) return this.selfFactory({ catchers: newMap }) @@ -145,7 +145,7 @@ export class Wretcher { * Program a resolver to perform response chain tasks automatically. * @param doResolve : Resolver callback */ - resolve(doResolve: (chain: ResponseChain) => ResponseChain | Promise, clear: boolean = false) { + resolve(doResolve: (chain: ResponseChain, originalRequest: Wretcher) => ResponseChain | Promise, clear: boolean = false) { return this.selfFactory({ resolvers: clear ? [ doResolve ] : [ ...this._resolvers, doResolve ]}) } @@ -159,7 +159,7 @@ export class Wretcher { } private method(method, opts) { - return resolver(this._url)(this._catchers)(this._resolvers)(this._middlewares)({ ...mix(opts, this._options), method }) + return resolver(this.options({ ...opts, method })) } /** diff --git a/test/wretch.spec.ts b/test/wretch.spec.ts index e007bae..c4fa037 100644 --- a/test/wretch.spec.ts +++ b/test/wretch.spec.ts @@ -222,6 +222,33 @@ describe("Wretch", function() { expect(check).toBe(7) }) + it("should capture the original request with resolvers/catchers", async function() { + let check = 0 + const redirectedNotFound = await wretch(`${_URL}/404`) + .get() + .notFound((error, req) => { + check++ + return req.url(`${_URL}/text`, true).get().text() + }).text() + expect(redirectedNotFound).toBe("A text string") + + const withNotFoundCatcher = wretch(`${_URL}/401`) + .catcher(401, (err, req) => { + check++ + return req.url(`${_URL}/text`, true).get().text() + }) + + const withNotFoundRedirect = wretch(`${_URL}/404`) + .resolve(resolver => resolver.notFound((err, req) => { + check++ + return req.url(`${_URL}/text`, true).get().text() + })) + + expect(await withNotFoundCatcher.get().text()).toBe("A text string") + expect(await withNotFoundRedirect.get().text()).toBe("A text string") + expect(check).toBe(3) + }) + it("should set default fetch options", async function() { let rejected = await new Promise(res => wretch(`${_URL}/customHeaders`).get().badRequest(_ => { res(true)