UNPKG

wretch

Version:

A tiny wrapper built around fetch with an intuitive syntax.

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