@alova/adapter-axios
Version:
axios adapter for alova.js
94 lines (92 loc) • 2.73 kB
JavaScript
/**
* @alova/adapter-axios 2.0.20 (https://alova.js.org)
* Document https://alova.js.org
* Copyright 2026 Scott Hu. All Rights Reserved
* Licensed under MIT (git://github.com/alovajs/alova/blob/main/LICENSE)
*/
import { newInstance, noop, undefinedValue } from "@alova/shared";
import axios, { AxiosError, AxiosHeaders } from "axios";
//#region src/mockResponse.ts
const mockResponseHandler = ({ status, statusText, body }, _, currentMethod) => {
const responseHeaders = {};
const { config } = currentMethod;
const axiosConfig = {
baseURL: currentMethod.baseURL,
url: currentMethod.url,
data: currentMethod.data,
...config,
headers: new AxiosHeaders(config.headers)
};
const axiosResponse = {
data: body,
status,
statusText,
headers: responseHeaders,
config: axiosConfig
};
if (status >= 400) throw new AxiosError(statusText, "ERR_BAD_REQUEST", axiosConfig, undefinedValue, axiosResponse);
return {
response: axiosResponse,
headers: responseHeaders
};
};
const mockErrorHandler = (error, currentMethod) => {
const { config } = currentMethod;
return new AxiosError(error.message, "ERR_NETWORK", {
baseURL: currentMethod.baseURL,
url: currentMethod.url,
data: currentMethod.data,
...config,
headers: new AxiosHeaders(config.headers)
});
};
var mockResponse_default = {
onMockResponse: mockResponseHandler,
onMockError: mockErrorHandler
};
//#endregion
//#region src/requestAdapter.ts
/**
* axios request adapter
*/
function requestAdapter(options = {}) {
const adaptedAxiosInstance = options.axios || axios;
const adapter = (_, method) => {
let downloadHandler = noop;
let uploadHandler = noop;
const { config } = method;
const controller = new AbortController();
const { baseURL, timeout } = adaptedAxiosInstance.defaults;
const responsePromise = adaptedAxiosInstance({
url: method.url,
method: method.type,
baseURL: baseURL || method.baseURL,
timeout: timeout || method.config.timeout,
data: method.data,
signal: controller.signal,
onUploadProgress: process.env.NODE_ENV !== "test" ? (event) => {
uploadHandler(event.loaded, event.total || 1);
} : undefinedValue,
onDownloadProgress: (event) => {
downloadHandler(event.loaded, event.total || 1);
},
...config
});
return {
response: () => responsePromise,
headers: () => responsePromise.then((res) => res?.headers || newInstance(AxiosHeaders)),
abort: () => {
controller.abort();
},
onDownload: (handler) => {
downloadHandler = handler;
},
onUpload: (handler) => {
uploadHandler = handler;
}
};
};
return adapter;
}
//#endregion
export { mockResponse_default as axiosMockResponse, requestAdapter as axiosRequestAdapter };