import { isPlainObject } from '../helpers/isTypes'; import { isCancel, isCancelToken } from './cancel'; import { flattenHeaders } from './flattenHeaders'; import { transformData } from './transformData'; import { request } from './request'; import { AxiosRequestConfig, AxiosResponse } from './Axios'; import { transformURL } from './transformURL'; function throwIfCancellationRequested(config: AxiosRequestConfig) { const { cancelToken } = config; if (isCancelToken(cancelToken)) { cancelToken.throwIfRequested(); } } export default function dispatchRequest( config: AxiosRequestConfig, ): Promise { throwIfCancellationRequested(config); config.method = config.method ?? 'get'; config.url = transformURL(config); config.headers = flattenHeaders(config); config.data = transformData( config.data, config.headers, config.transformRequest, ); return request(config).then( (response: AxiosResponse) => { throwIfCancellationRequested(config); response.data = transformData( response.data as AnyObject, response.headers, config.transformResponse, ) as TData; return response; }, (reason: unknown) => { if (!isCancel(reason)) { throwIfCancellationRequested(config); if (isPlainObject(reason) && isPlainObject(reason.response)) { reason.response.data = transformData( reason.response.data, reason.response.headers, config.transformResponse, ); } } throw config.errorHandler?.(reason) ?? reason; }, ); }