diff --git a/packages/fatcher/src/fatcher.ts b/packages/fatcher/src/fatcher.ts index ab50625..a6779ad 100644 --- a/packages/fatcher/src/fatcher.ts +++ b/packages/fatcher/src/fatcher.ts @@ -1,6 +1,6 @@ import { RequestOptions, ResponseResult } from './interfaces'; import { defaultOptions, mergeOptions } from './options'; -import { fetcher, registerMiddlewares, composeMiddlewares, payloadConsumer } from './middlewares'; +import { fetcher, registerMiddlewares, composeMiddlewares } from './middlewares'; import { createContext } from './context'; import { canActivate } from './helpers'; @@ -12,7 +12,7 @@ export async function fatcher(inlineOptions: RequestOptions = {}): Prom const { middlewares: customMiddlewares = [], ...rest } = options; - const registeredMiddlewares = registerMiddlewares([...customMiddlewares, payloadConsumer, fetcher]); + const registeredMiddlewares = registerMiddlewares([...customMiddlewares, fetcher]); const useMiddlewares = composeMiddlewares(registeredMiddlewares); diff --git a/packages/fatcher/src/middlewares/fetcher.ts b/packages/fatcher/src/middlewares/fetcher.ts index cc5d15c..f623228 100644 --- a/packages/fatcher/src/middlewares/fetcher.ts +++ b/packages/fatcher/src/middlewares/fetcher.ts @@ -7,13 +7,43 @@ import { FatcherError } from '../errors'; */ export function fetcher(): Middleware { return { - name: 'fatcher-middleware-http-fetcher', + name: 'fatcher-middleware-fetch', async use(context) { - const { url = '', requestHeaders: headers, ...rest } = context; + // eslint-disable-next-line prefer-const + let { url = '', requestHeaders: headers, payload, method = 'GET', body, params, ...rest } = context; + + const contentType = headers.get('content-type'); + + /** + * If Request Method is `GET` or `HEAD`. + * + * Will ignore headers['Content-Type']. + * + * payload will transform into search params. + */ + if (['GET', 'HEAD'].includes(method)) { + params = Object.assign({}, params, body); + body = null; + } else if (payload && contentType) { + if (contentType.includes('application/json')) { + body = JSON.stringify(payload); + } + + if (contentType.includes('application/x-www-form-urlencoded')) { + body = new URLSearchParams(payload); + } + } + + if (Object.keys(params!).length) { + // Recessive call `toString()` in URLSearchParams + url = `${url}?${new URLSearchParams(params)}`; + } const response = await fetch(url, { ...rest, headers, + body, + method, }); const { status, statusText, ok, headers: responseHeaders } = response; diff --git a/packages/fatcher/src/middlewares/index.ts b/packages/fatcher/src/middlewares/index.ts index 14ac750..8e0fc43 100644 --- a/packages/fatcher/src/middlewares/index.ts +++ b/packages/fatcher/src/middlewares/index.ts @@ -1,4 +1,3 @@ export * from './composeMiddlewares'; export * from './fetcher'; -export * from './payloadConsumer'; export * from './registerMiddlewares'; diff --git a/packages/fatcher/src/middlewares/payloadConsumer.ts b/packages/fatcher/src/middlewares/payloadConsumer.ts deleted file mode 100644 index b77c1dd..0000000 --- a/packages/fatcher/src/middlewares/payloadConsumer.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Middleware } from '../interfaces'; - -export function payloadConsumer(): Middleware { - return { - name: 'fatcher-middleware-payload-consumer', - use(context, next) { - const { payload, url, requestHeaders, method, body, params = {} } = context; - - const contentType = requestHeaders.get('content-type'); - - let normalizeUrl = url; - - /** - * If Request Method is `GET` or `HEAD`. - * - * Will ignore headers['Content-Type']. - * - * payload will transform into search params. - */ - if (['GET', 'HEAD'].includes(method!)) { - if (Object.keys(params).length) { - normalizeUrl = `${url}?${new URLSearchParams(Object.assign({}, params, body)).toString()}`; - } - - return next({ - url: normalizeUrl, - body: null, - }); - } - - let normalizedBody = body; - - if (payload) { - if (contentType?.includes('application/json')) { - normalizedBody = JSON.stringify(payload); - } - - if (contentType?.includes('application/x-www-form-urlencoded')) { - normalizedBody = new URLSearchParams(payload); - } - } - - if (Object.keys(params).length) { - normalizeUrl = `${url}?${new URLSearchParams(params).toString()}`; - } - - return next({ - url: normalizeUrl, - body: normalizedBody, - }); - }, - }; -}