diff --git a/.coveralls.yml b/.coveralls.yml index 3d2e4e6..545d3f6 100644 --- a/.coveralls.yml +++ b/.coveralls.yml @@ -1,2 +1,2 @@ -service_name: travis-pro +service_name: github-action repo_token: lUvcBvK6t0T7L2PClgL8aq931DRj8q6F7 diff --git a/.editorconfig b/.editorconfig index eb3ec67..79fe802 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,12 +1,8 @@ root = true -[{*.js,*.css,*.html}] +[*] indent_style = space -indent_size = 4 +indent_size = 2 end_of_line = lf charset = utf-8 insert_final_newline = true - -[{package.json,.*rc,*.yml}] -indent_style = space -indent_size = 2 \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 20b8fbb..17c850b 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,7 +1,8 @@ module.exports = { env: { browser: true, - es2021: true + es2021: true, + node: true }, extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], overrides: [], @@ -20,6 +21,7 @@ module.exports = { '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/ban-ts-comment': 'off', 'no-empty': 'off', + '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/triple-slash-reference': 'off' } }; diff --git a/.gitattributes b/.gitattributes index dfe0770..fcadb2c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1 @@ -# Auto detect text files and perform LF normalization -* text=auto +* text eol=lf diff --git a/config/rollup.cjs b/config/rollup.cjs index f5f9e2c..87b3a7a 100644 --- a/config/rollup.cjs +++ b/config/rollup.cjs @@ -3,9 +3,7 @@ * @LastEditors: JOU(wx: huzhen555) * @LastEditTime: 2023-05-08 23:00:03 */ -var typescript = require('rollup-plugin-typescript2'); -var { readFileSync } = require('fs'); - +const typescript = require('rollup-plugin-typescript2'); const getCompiler = ( opt = { // objectHashIgnoreUnknownHack: true, diff --git a/config/rollup.config.cjs b/config/rollup.config.cjs index fffe89b..274b863 100644 --- a/config/rollup.config.cjs +++ b/config/rollup.config.cjs @@ -5,31 +5,31 @@ */ // rollup.config.js // commonjs -var config = require('./rollup.cjs'); -var module = process.argv.pop().replace('--', '') || 'core'; -var paths = config.compilePath; -var moduleType = 'cjs'; +const config = require('./rollup.cjs'); +const module = process.argv.pop().replace('--', '') || 'core'; +const paths = config.compilePath; +const moduleType = 'cjs'; module.exports = { - input: paths.input, - output: { - name: paths.packageName, - file: paths.output(moduleType), - format: 'cjs', - // When export and export default are not used at the same time, set legacy to true. - // legacy: true, - banner: config.banner, - }, - external: config.external, - plugins: [ - config.getCompiler({ - tsconfigOverride: { - compilerOptions: { - declaration: true, - module: 'ES2015' - } - }, - useTsconfigDeclarationDir: true - }) - ] + input: paths.input, + output: { + name: paths.packageName, + file: paths.output(moduleType), + format: 'cjs', + // When export and export default are not used at the same time, set legacy to true. + // legacy: true, + banner: config.banner + }, + external: config.external, + plugins: [ + config.getCompiler({ + tsconfigOverride: { + compilerOptions: { + declaration: true, + module: 'ES2015' + } + }, + useTsconfigDeclarationDir: true + }) + ] }; diff --git a/config/rollup.config.esm.cjs b/config/rollup.config.esm.cjs index da7501d..fdb802b 100644 --- a/config/rollup.config.esm.cjs +++ b/config/rollup.config.esm.cjs @@ -1,10 +1,9 @@ // rollup.config.js // ES output -var { nodeResolve } = require('@rollup/plugin-node-resolve'); -var config = require('./rollup.cjs'); -var paths = config.compilePath; -var moduleType = 'esm'; - +const { nodeResolve } = require('@rollup/plugin-node-resolve'); +const config = require('./rollup.cjs'); +const paths = config.compilePath; +const moduleType = 'esm'; const globals = {}; // 将externals中的内容放到globals对象中 config.external.forEach(key => (globals[key] = key)); diff --git a/config/rollup.config.umd.cjs b/config/rollup.config.umd.cjs index 6d12630..3329bd0 100644 --- a/config/rollup.config.umd.cjs +++ b/config/rollup.config.umd.cjs @@ -5,19 +5,19 @@ */ // rollup.config.js // umd -var { nodeResolve } = require('@rollup/plugin-node-resolve'); -var commonjs = require('@rollup/plugin-commonjs'); -var { terser } = require('rollup-plugin-terser'); -var replace = require('@rollup/plugin-replace'); -var json = require('@rollup/plugin-json'); -var config = require('./rollup.cjs'); -var prod = process.env.NODE_ENV === 'production'; -var paths = config.compilePath; -var moduleType = prod ? 'umd.min' : 'umd'; - +const { nodeResolve } = require('@rollup/plugin-node-resolve'); +const commonjs = require('@rollup/plugin-commonjs'); +const { terser } = require('rollup-plugin-terser'); +const replace = require('@rollup/plugin-replace'); +const json = require('@rollup/plugin-json'); +const config = require('./rollup.cjs'); +const prod = process.env.NODE_ENV === 'production'; +const paths = config.compilePath; +const moduleType = prod ? 'umd.min' : 'umd'; const globals = {}; // 将externals中的内容放到globals对象中 config.external.forEach(key => (globals[key] = key)); + module.exports = { input: paths.input, output: { diff --git a/jest.config.node.ts b/jest.config.node.ts index 40502f4..13c25bc 100644 --- a/jest.config.node.ts +++ b/jest.config.node.ts @@ -140,11 +140,7 @@ export default { // The test environment that will be used for testing // testEnvironment: 'node', - testMatch: [ - '**/?(*.)+(spec|test).[tj]s?(x)' - // '**/test/requestAdapter.spec.ts(x)?' - // '**/test/mockResponse.spec.ts(x)?' - ], + testMatch: ['**/test/server/**/*.[jt]s?(x)'], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped testPathIgnorePatterns: [ @@ -163,37 +159,12 @@ export default { // A map from regular expressions to paths to transformers transform: { - '\\.(j|t)sx?$': [ - 'ts-jest', - // mock import.meta, see https://www.npmjs.com/package/ts-jest-mock-import-meta - { - diagnostics: { - ignoreCodes: [1343] - }, - astTransformers: { - // 转换import.meta - before: [ - { - path: 'node_modules/ts-jest-mock-import-meta', - options: { - metaObjectReplacement: { - url: 'https://xxx', - env: { - PROD: false, - DEV: true - }, - status: 2 - } - } - } - ] - } - } - ] + '\\.(j|t)sx?$': 'ts-jest' }, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - transformIgnorePatterns: ['/node_modules/(?!alova)'] + // must "allowJs": true in tsconfig.json + transformIgnorePatterns: ['/node_modules/(?!(alova|@alova/mock))'] // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them // unmockedModulePathPatterns: undefined, diff --git a/jest.config.ts b/jest.config.ts index 5559abf..14b7944 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -140,11 +140,7 @@ export default { // The test environment that will be used for testing testEnvironment: 'jsdom', - testMatch: [ - '**/?(*.)+(spec|test).[tj]s?(x)' - // '**/test/requestAdapter.spec.ts(x)?' - // '**/test/mockResponse.spec.ts(x)?' - ], + testMatch: ['**/test/browser/**/*.[jt]s?(x)'], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped testPathIgnorePatterns: [ @@ -163,37 +159,11 @@ export default { // A map from regular expressions to paths to transformers transform: { - '\\.(j|t)sx?$': [ - 'ts-jest', - // mock import.meta, see https://www.npmjs.com/package/ts-jest-mock-import-meta - { - diagnostics: { - ignoreCodes: [1343] - }, - astTransformers: { - // 转换import.meta - before: [ - { - path: 'node_modules/ts-jest-mock-import-meta', - options: { - metaObjectReplacement: { - url: 'https://xxx', - env: { - PROD: false, - DEV: true - }, - status: 2 - } - } - } - ] - } - } - ] + '\\.(j|t)sx?$': 'ts-jest' }, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - transformIgnorePatterns: ['/node_modules/(?!alova)'] + transformIgnorePatterns: ['/node_modules/(?!(alova|@alova/mock))'] // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them // unmockedModulePathPatterns: undefined, diff --git a/package-lock.json b/package-lock.json index 0371cc0..e8b72d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.1.1", "license": "MIT", "devDependencies": { - "@alova/mock": "^1.2.1", + "@alova/mock": "^1.5.0", "@babel/core": "^7.18.2", "@babel/preset-env": "^7.18.2", "@commitlint/config-conventional": "^17.4.4", @@ -23,7 +23,7 @@ "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", - "alova": "^2.3.1", + "alova": "^2.13.1", "axios": "^1.3.4", "babel-jest": "^29.2.2", "commitizen": "^4.3.0", @@ -62,9 +62,9 @@ "dev": true }, "node_modules/@alova/mock": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@alova/mock/-/mock-1.2.1.tgz", - "integrity": "sha512-jcaqSi7BTjrAy//Vr+h6tqwJuoJ+x7YcesmvWVsOXLPRJwWWELdHQLpF2wmGCVWdrdqkBgtqGymq0k9DQdQaXQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@alova/mock/-/mock-1.5.0.tgz", + "integrity": "sha512-4l0tlScxquL5n8y3lr2UBHGY4yaMsThBAsp4YBkfVZPdibagJNJtK1Z7ujamMKF5sVJU134KDze17/FVixcv1Q==", "dev": true }, "node_modules/@ampproject/remapping": { @@ -5085,9 +5085,9 @@ } }, "node_modules/alova": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/alova/-/alova-2.3.1.tgz", - "integrity": "sha512-w0vFOoB5QbpYWwq003LRWVaLKhgo5cgf9d2u16fADajMH++k48F55zwlBSbvKa7MtF8Ap/5GGvLrEGCrx/G++w==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/alova/-/alova-2.13.1.tgz", + "integrity": "sha512-VCqei7HWP2leslNHrF0CjLBUUlUdpHebnS8ronm4Qh19jzLYcRLCXx+D9XRaPuutgrDJa10qD11ZB/Egs0bM4Q==", "dev": true, "engines": { "node": ">= 0.12.0" @@ -19286,9 +19286,9 @@ "dev": true }, "@alova/mock": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@alova/mock/-/mock-1.2.1.tgz", - "integrity": "sha512-jcaqSi7BTjrAy//Vr+h6tqwJuoJ+x7YcesmvWVsOXLPRJwWWELdHQLpF2wmGCVWdrdqkBgtqGymq0k9DQdQaXQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@alova/mock/-/mock-1.5.0.tgz", + "integrity": "sha512-4l0tlScxquL5n8y3lr2UBHGY4yaMsThBAsp4YBkfVZPdibagJNJtK1Z7ujamMKF5sVJU134KDze17/FVixcv1Q==", "dev": true }, "@ampproject/remapping": { @@ -23045,9 +23045,9 @@ } }, "alova": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/alova/-/alova-2.3.1.tgz", - "integrity": "sha512-w0vFOoB5QbpYWwq003LRWVaLKhgo5cgf9d2u16fADajMH++k48F55zwlBSbvKa7MtF8Ap/5GGvLrEGCrx/G++w==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/alova/-/alova-2.13.1.tgz", + "integrity": "sha512-VCqei7HWP2leslNHrF0CjLBUUlUdpHebnS8ronm4Qh19jzLYcRLCXx+D9XRaPuutgrDJa10qD11ZB/Egs0bM4Q==", "dev": true }, "ansi-escapes": { diff --git a/package.json b/package.json index c3a3ad7..1ba465d 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "typings/*.d.ts" ], "devDependencies": { - "@alova/mock": "^1.2.1", + "@alova/mock": "^1.5.0", "@babel/core": "^7.18.2", "@babel/preset-env": "^7.18.2", "@commitlint/config-conventional": "^17.4.4", @@ -70,7 +70,7 @@ "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", - "alova": "^2.3.1", + "alova": "^2.13.1", "axios": "^1.3.4", "babel-jest": "^29.2.2", "commitizen": "^4.3.0", diff --git a/src/requestAdapter.ts b/src/requestAdapter.ts index 5655db3..80bb3dc 100644 --- a/src/requestAdapter.ts +++ b/src/requestAdapter.ts @@ -1,38 +1,40 @@ import { ProgressUpdater } from 'alova'; import axios from 'axios'; -import { AxiosRequestAdapter } from '../typings'; +import { AdapterCreateOptions, AxiosRequestAdapter } from '../typings'; import { noop, undefinedValue } from './helper'; /** * axios请求适配器 */ -export default function requestAdapter() { +export default function requestAdapter(options: AdapterCreateOptions = {}) { + const adaptedAxiosInstance = options.axios || axios; const adapter: AxiosRequestAdapter = (_, method) => { - const { config } = method; - const controller = new AbortController(); - let downloadHandler: ProgressUpdater = noop; - let uploadHandler: ProgressUpdater = noop; - - const responsePromise = axios({ - url: method.url, - method: method.type, - baseURL: method.baseURL, - data: method.data, - signal: controller.signal, - // `onUploadProgress` 允许为上传处理进度事件 - onUploadProgress: config.enableUpload - ? event => { - uploadHandler(event.loaded, event.total || 1); - } - : undefinedValue, - // `onDownloadProgress` 允许为下载处理进度事件 - onDownloadProgress: config.enableDownload - ? event => { - downloadHandler(event.loaded, event.total || 1); - } - : undefinedValue, - ...config - }); + let downloadHandler: ProgressUpdater = noop, + uploadHandler: ProgressUpdater = noop; + const { config } = method, + controller = new AbortController(), + { baseURL, timeout } = adaptedAxiosInstance.defaults, + responsePromise = adaptedAxiosInstance({ + url: method.url, + method: method.type, + baseURL: baseURL || method.baseURL, + timeout: timeout || method.config.timeout, + data: method.data, + signal: controller.signal, + // `onUploadProgress` 允许为上传处理进度事件 + onUploadProgress: config.enableUpload + ? event => { + uploadHandler(event.loaded, event.total || 1); + } + : undefinedValue, + // `onDownloadProgress` 允许为下载处理进度事件 + onDownloadProgress: config.enableDownload + ? event => { + downloadHandler(event.loaded, event.total || 1); + } + : undefinedValue, + ...config + }); return { response: () => responsePromise, diff --git a/test/mockResponse.spec.ts b/test/browser/mockResponse.spec.ts similarity index 95% rename from test/mockResponse.spec.ts rename to test/browser/mockResponse.spec.ts index 94ded8c..1df7ca1 100644 --- a/test/mockResponse.spec.ts +++ b/test/browser/mockResponse.spec.ts @@ -4,7 +4,7 @@ import vueHook from 'alova/vue'; import { AxiosError, AxiosResponse } from 'axios'; import { readFileSync } from 'fs'; import path from 'path'; -import { axiosMockResponse, axiosRequestAdapter } from '../src/index'; +import { axiosMockResponse, axiosRequestAdapter } from '../../src/index'; const mocks = defineMock({ '/unit-test': () => { @@ -78,12 +78,12 @@ describe('mock response adapter', () => { } }); - (isSSR ? xtest : test)('uploadFile', async () => { + test('uploadFile', async () => { // 使用formData上传文件 const formData = new FormData(); formData.append('f1', 'f1'); formData.append('f2', 'f2'); - const imageFile = new File([readFileSync(path.resolve(__dirname, './image.jpg'))], 'file', { + const imageFile = new File([readFileSync(path.resolve(__dirname, '../image.jpg'))], 'file', { type: 'image/jpeg' }); formData.append('file', imageFile); diff --git a/test/requestAdapter.spec.ts b/test/browser/requestAdapter.spec.ts similarity index 77% rename from test/requestAdapter.spec.ts rename to test/browser/requestAdapter.spec.ts index 9de8fe1..1befe72 100644 --- a/test/requestAdapter.spec.ts +++ b/test/browser/requestAdapter.spec.ts @@ -1,12 +1,12 @@ import { createAlova, useRequest } from 'alova'; import VueHook from 'alova/vue'; -import { AxiosError } from 'axios'; +import axios, { AxiosError } from 'axios'; import { readFileSync } from 'fs'; import path from 'path'; -import { axiosRequestAdapter } from '../src/index'; -import { Result } from './result.type'; -import { mockServer } from './server'; -import { mockBaseURL, untilCbCalled } from './utils'; +import { axiosRequestAdapter } from '../../src'; +import { mockServer } from '../mockServer'; +import { Result } from '../result.type'; +import { mockBaseURL, untilCbCalled } from '../utils'; beforeAll(() => mockServer.listen()); afterEach(() => mockServer.resetHandlers()); @@ -178,7 +178,7 @@ describe('request adapter', () => { expect(error.value?.message).toBe('canceled'); }); - (isSSR ? xtest : test)('should upload file and pass the right args', async () => { + test('should upload file and pass the right args', async () => { const alovaInst = createAlova({ baseURL: mockBaseURL, requestAdapter: axiosRequestAdapter(), @@ -192,7 +192,7 @@ describe('request adapter', () => { const formData = new FormData(); formData.append('f1', 'f1'); formData.append('f2', 'f2'); - const imageFile = new File([readFileSync(path.resolve(__dirname, './image.jpg'))], 'file', { + const imageFile = new File([readFileSync(path.resolve(__dirname, '../image.jpg'))], 'file', { type: 'image/jpeg' }); formData.append('file', imageFile); @@ -213,7 +213,7 @@ describe('request adapter', () => { expect(error.value).toBeUndefined(); }); - (isSSR ? xtest : test)('should download file and pass the right args', async () => { + test('should download file and pass the right args', async () => { const alovaInst = createAlova({ baseURL: mockBaseURL, requestAdapter: axiosRequestAdapter(), @@ -236,4 +236,67 @@ describe('request adapter', () => { expect(downloading.value).toEqual({ total: 3273178, loaded: 3273178 }); expect(error.value).toBeUndefined(); }); + + test('should request with custom axios instance', async () => { + const newAxiosInst = axios.create({ + baseURL: mockBaseURL, + timeout: 5000 + }); + + const axiosRequestFn = jest.fn(); + const axiosResponseFn = jest.fn(); + newAxiosInst.interceptors.request.use(config => { + axiosRequestFn(); + return config; + }); + newAxiosInst.interceptors.response.use(response => { + axiosResponseFn(); + return response.data; + }); + + const alovaInst = createAlova({ + requestAdapter: axiosRequestAdapter({ + axios: newAxiosInst + }), + statesHook: VueHook, + // 比axios的request钩子更早触发 + beforeRequest() { + expect(axiosRequestFn).not.toBeCalled(); + }, + // 比axios的response钩子更迟触发 + responsed(res) { + expect(axiosResponseFn).toBeCalled(); + return res; + } + }); + + const Get = alovaInst.Get('/unit-test', { + params: { + a: '1', + b: '2' + }, + responseEncoding: 'utf8', + decompress: true, + xsrfCookieName: 'xsrf_cookie', + xsrfHeaderName: 'xsrf_header' + }); + + const { loading, data, downloading, error, onSuccess } = useRequest(Get); + expect(loading.value).toBeTruthy(); + expect(data.value).toBeUndefined(); + expect(downloading.value).toEqual({ total: 0, loaded: 0 }); + expect(error.value).toBeUndefined(); + + await untilCbCalled(onSuccess); + expect(loading.value).toBeFalsy(); + expect(data.value.code).toBe(200); + expect(data.value.data.method).toBe('GET'); + expect(data.value.data.params).toStrictEqual({ + a: '1', + b: '2' + }); + expect(data.value.data.path).toBe('/unit-test'); + expect(downloading.value).toEqual({ total: 0, loaded: 0 }); + expect(error.value).toBeUndefined(); + }); }); diff --git a/test/server.ts b/test/mockServer.ts similarity index 100% rename from test/server.ts rename to test/mockServer.ts diff --git a/test/result.type.ts b/test/result.type.ts index 8927948..e23eda9 100644 --- a/test/result.type.ts +++ b/test/result.type.ts @@ -1,16 +1,16 @@ type GetData = { - path: string; - method: string; - params: Record; + path: string; + method: string; + params: Record; }; type PostData = { - path: string; - method: string; - params: Record; - data: Record; + path: string; + method: string; + params: Record; + data: Record; }; export type Result = { - code: number; - msg: string; - data: T extends string ? GetData : PostData; + code: number; + msg: string; + data: T extends string ? GetData : PostData; }; diff --git a/test/server/requestAdapter.spec.ts b/test/server/requestAdapter.spec.ts new file mode 100644 index 0000000..2d79159 --- /dev/null +++ b/test/server/requestAdapter.spec.ts @@ -0,0 +1,33 @@ +import { createAlova, useRequest } from 'alova'; +import VueHook from 'alova/vue'; +import { axiosRequestAdapter } from '../../src'; +import { Result } from '../result.type'; +import { mockBaseURL, untilCbCalled } from '../utils'; + +describe('request adapter in SSR', () => { + test("shouldn't request but loading is true", async () => { + const alova = createAlova({ + baseURL: mockBaseURL, + requestAdapter: axiosRequestAdapter(), + statesHook: VueHook, + timeout: 100000 + }); + const Get = alova.Get('/unit-test', { + params: { a: 'a', b: 'str' } + }); + const { loading, data, downloading, error } = useRequest(Get, { + initialData: {} + }); + expect(loading.value).toBeTruthy(); + expect(data.value).toStrictEqual({}); + expect(downloading.value).toEqual({ total: 0, loaded: 0 }); + expect(error.value).toBeUndefined(); + + // 200ms后依然为请求前状态 + await untilCbCalled(setTimeout, 200); + expect(loading.value).toBeTruthy(); + expect(data.value).toStrictEqual({}); + expect(downloading.value).toEqual({ total: 0, loaded: 0 }); + expect(error.value).toBeUndefined(); + }); +}); diff --git a/test/test-env.d.ts b/test/test-env.d.ts deleted file mode 100644 index bca5b5e..0000000 --- a/test/test-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare let isSSR: boolean; diff --git a/typings/index.d.ts b/typings/index.d.ts index d2dbffb..d2858aa 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,6 +1,6 @@ import { MockError } from '@alova/mock'; import { AlovaRequestAdapter } from 'alova'; -import { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; /** * axios请求配置参数 @@ -30,10 +30,14 @@ export type AxiosRequestAdapter = AlovaRequestAdapter< AxiosResponse['headers'] >; +interface AdapterCreateOptions { + axios?: AxiosInstance; +} /** * axios请求适配器 + * @param options 选项参数 */ -export declare function axiosRequestAdapter(): AxiosRequestAdapter; +export declare function axiosRequestAdapter(options?: AdapterCreateOptions): AxiosRequestAdapter; /** * 模拟响应适配器,它用于@alova/mock中,让模拟请求时也能返回axios响应数据兼容的格式