{"version":3,"file":"http.common.cjs","sources":["../src/utils/cloneOptions.ts","../src/operators/appendBody.ts","../src/operators/appendUrl.ts","../src/operators/error.ts","../src/operators/headers.ts","../src/operators/json.ts","../src/operators/method.ts","../src/operators/middleware.ts","../src/operators/params.ts","../src/operators/resolve.ts","../src/operators/url.ts","../src/http.ts"],"sourcesContent":["import { Options } from '../types';\r\n\r\nexport function cloneOptions(opts: Options) {\r\n  return Object.entries(opts).reduce<any>((cloned, [key, value]) => {\r\n    cloned[key] =\r\n      value instanceof URLSearchParams ? new URLSearchParams(value) : value;\r\n    return cloned;\r\n  }, {});\r\n}\r\n","import { Piper, BaseObject } from '../types';\r\n\r\nexport const appendBody: Piper<BaseObject> = (body) => (opts) => ({\r\n  ...opts,\r\n  fetchOptions: { ...opts.fetchOptions, body: JSON.stringify(body) },\r\n});\r\n","import { Piper } from '../types';\r\n\r\nexport const appendUrl: Piper<string> = (url) => (opts) => ({\r\n  ...opts,\r\n  url: opts.url + url,\r\n});\r\n","import { Piper, ErrorPiper } from '../types';\r\n\r\nexport const error: Piper<ErrorPiper> = (catcher) => (opts) => ({\r\n  ...opts,\r\n  catchers: [...opts.catchers, catcher],\r\n});\r\n","import { Piper, BaseObject } from '../types';\r\n\r\nexport const headers: Piper<BaseObject> = (headers) => (opts) => ({\r\n  ...opts,\r\n  headers,\r\n});\r\n","import { ArgumentlessPiper } from '../types';\r\n\r\nexport const json: ArgumentlessPiper = () => (opts) => ({\r\n  ...opts,\r\n  response: 'json',\r\n});\r\n","import { Piper, Method } from '../types';\r\n\r\nexport const method: Piper<Method> = (type) => (opts) => ({\r\n  ...opts,\r\n  fetchOptions: { ...opts.fetchOptions, method: type },\r\n});\r\n","import { Piper, Pipe } from '../types';\r\n\r\nexport const middleware: Piper<Pipe> = (pipe) => (opts) => pipe(opts);\r\n","import { Piper, BaseObject } from '../types';\r\n\r\nexport const params: Piper<BaseObject<any>> = (params) => (opts) => {\r\n  if (!params) return opts;\r\n  for (const [key, value] of Object.entries(params)) {\r\n    opts.params.append(key, JSON.stringify(value));\r\n  }\r\n  return opts;\r\n};\r\n","import { Piper, ResponsePiper } from '../types';\r\n\r\nexport const resolve: Piper<ResponsePiper> = (resolver) => (opts) => ({\r\n  ...opts,\r\n  resolvers: [...opts.resolvers, resolver],\r\n});\r\n","import { Piper } from '../types';\r\n\r\nexport const url: Piper<string> = (url) => (opts) => ({ ...opts, url });\r\n","import { Options, Pipe, HttpClient, HttpClientObject } from './types';\r\nimport { cloneOptions } from './utils/cloneOptions';\r\nimport { method, appendUrl, appendBody, params } from './operators';\r\n\r\nfunction makeFinalCall<T>(\r\n  options: Options<T>,\r\n): Promise<readonly [null, T] | readonly [Error, null]> {\r\n  const {\r\n    url,\r\n    headers,\r\n    fetchOptions,\r\n    fetchInstance,\r\n    responseType,\r\n    catchers,\r\n    resolvers,\r\n    preResolvers,\r\n    params,\r\n  } = options.middlewares.reduce<Options<T>>(\r\n    (opts, middleware) => middleware(opts),\r\n    options,\r\n  );\r\n\r\n  if (responseType === 'json') headers['Content-Type'] = 'application/json';\r\n\r\n  const finalUrl = new URL(url);\r\n  params.forEach((value, key) => finalUrl.searchParams.set(key, value));\r\n\r\n  return (fetchInstance as typeof fetch)(finalUrl.toString(), {\r\n    ...fetchOptions,\r\n    headers,\r\n  })\r\n    .then(async (response) => {\r\n      const value = await response[responseType]();\r\n\r\n      // HACK: This should most likely not be a reduce\r\n      preResolvers.reduce(\r\n        ({ response, value }, preResolver) => {\r\n          preResolver(response, value);\r\n          return { response, value };\r\n        },\r\n        { response, value },\r\n      );\r\n\r\n      return value;\r\n    })\r\n    .then(\r\n      (response) =>\r\n        [\r\n          null,\r\n          resolvers.reduce(\r\n            (finalResponse, resolver) => resolver(finalResponse),\r\n            response,\r\n          ),\r\n        ] as const,\r\n    )\r\n    .catch(\r\n      (error) =>\r\n        [\r\n          catchers.reduce((finalError, catcher) => catcher(finalError), error),\r\n          null,\r\n        ] as const,\r\n    );\r\n}\r\n\r\nexport const http: HttpClient = (userOpts = {}) => {\r\n  const mergedOptions: Options = {\r\n    url: '',\r\n    headers: {},\r\n    middlewares: [],\r\n    fetchOptions: {},\r\n    responseType: 'json',\r\n    params: new URLSearchParams(),\r\n    catchers: [],\r\n    resolvers: [],\r\n    preResolvers: [],\r\n    fetchInstance: fetch,\r\n    ...userOpts,\r\n  };\r\n\r\n  const httpClientObject: Record<string, any> = {\r\n    pipe(...pipes: Pipe[]) {\r\n      return http(\r\n        pipes.reduce<Options>(\r\n          (options, pipe) => pipe(options),\r\n          cloneOptions(mergedOptions),\r\n        ),\r\n      );\r\n    },\r\n    run() {\r\n      return makeFinalCall(cloneOptions(mergedOptions));\r\n    },\r\n  };\r\n\r\n  const httpVerbs = ['GET', 'DELETE', 'POST', 'PATCH', 'PUT'] as const;\r\n\r\n  for (let i = 0, length = httpVerbs.length; i < length; i++) {\r\n    const httpVerb = httpVerbs[i];\r\n    const bodyHandler = i > 1 ? appendBody : params;\r\n\r\n    httpClientObject[httpVerb.toLowerCase()] = (\r\n      url = '',\r\n      bodyOrParams = i > 1 ? undefined : {},\r\n    ) =>\r\n      http(cloneOptions(mergedOptions))\r\n        .pipe(method(httpVerb), appendUrl(url), bodyHandler(bodyOrParams!))\r\n        .run();\r\n  }\r\n\r\n  return httpClientObject as HttpClientObject;\r\n};\r\n\r\nexport * from './operators';\r\nexport * from './types';\r\n"],"names":[],"mappings":"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"}