feat: 修改 mergeConfig 中 data 的合并方式
parent
ff3f50a580
commit
ee6a31b4bb
|
@ -253,9 +253,9 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
|
||||||
|
|
||||||
function transformResult(result: AnyObject): void {
|
function transformResult(result: AnyObject): void {
|
||||||
result.status =
|
result.status =
|
||||||
result.status ?? result.statusCode ?? isUndefined(result.data)
|
result.status ??
|
||||||
? 400
|
result.statusCode ??
|
||||||
: 200;
|
(isUndefined(result.data) ? 400 : 200);
|
||||||
result.statusText =
|
result.statusText =
|
||||||
result.status === 200
|
result.status === 200
|
||||||
? 'OK'
|
? 'OK'
|
||||||
|
|
63
src/axios.ts
63
src/axios.ts
|
@ -1,14 +1,13 @@
|
||||||
import { isString } from './helpers/isTypes';
|
import { AxiosDomainRequest } from './core/AxiosDomain';
|
||||||
import Axios, {
|
import Axios, {
|
||||||
AxiosConstructor,
|
AxiosConstructor,
|
||||||
AxiosRequestConfig,
|
AxiosRequestConfig,
|
||||||
AxiosRequestHeaders,
|
AxiosRequestHeaders,
|
||||||
AxiosResponse,
|
|
||||||
} from './core/Axios';
|
} from './core/Axios';
|
||||||
import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel';
|
import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel';
|
||||||
import { isAxiosError } from './core/createError';
|
import { isAxiosError } from './core/createError';
|
||||||
import { mergeConfig } from './core/mergeConfig';
|
import { mergeConfig } from './core/mergeConfig';
|
||||||
import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
|
import { createAdapter } from './adapter';
|
||||||
import defaults from './defaults';
|
import defaults from './defaults';
|
||||||
|
|
||||||
export interface AxiosInstanceDefaults extends AxiosRequestConfig {
|
export interface AxiosInstanceDefaults extends AxiosRequestConfig {
|
||||||
|
@ -18,27 +17,11 @@ export interface AxiosInstanceDefaults extends AxiosRequestConfig {
|
||||||
headers: Required<AxiosRequestHeaders>;
|
headers: Required<AxiosRequestHeaders>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AxiosInstance extends Axios {
|
export interface AxiosInstance extends AxiosDomainRequest, Axios {
|
||||||
/**
|
/**
|
||||||
* 默认请求配置
|
* 默认请求配置
|
||||||
*/
|
*/
|
||||||
defaults: AxiosInstanceDefaults;
|
defaults: AxiosInstanceDefaults;
|
||||||
<TData = unknown>(
|
|
||||||
/**
|
|
||||||
* 请求配置
|
|
||||||
*/
|
|
||||||
config: AxiosRequestConfig,
|
|
||||||
): Promise<AxiosResponse<TData>>;
|
|
||||||
<TData = unknown>(
|
|
||||||
/**
|
|
||||||
* 请求地址
|
|
||||||
*/
|
|
||||||
url: string,
|
|
||||||
/**
|
|
||||||
* 请求配置
|
|
||||||
*/
|
|
||||||
config?: AxiosRequestConfig,
|
|
||||||
): Promise<AxiosResponse<TData>>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AxiosStatic extends AxiosInstance {
|
export interface AxiosStatic extends AxiosInstance {
|
||||||
|
@ -61,7 +44,7 @@ export interface AxiosStatic extends AxiosInstance {
|
||||||
*
|
*
|
||||||
* @param platform 平台
|
* @param platform 平台
|
||||||
*/
|
*/
|
||||||
createAdapter(platform: AxiosPlatform): AxiosAdapter;
|
createAdapter: typeof createAdapter;
|
||||||
/**
|
/**
|
||||||
* 判断 Cancel
|
* 判断 Cancel
|
||||||
*/
|
*/
|
||||||
|
@ -72,40 +55,26 @@ export interface AxiosStatic extends AxiosInstance {
|
||||||
isAxiosError: typeof isAxiosError;
|
isAxiosError: typeof isAxiosError;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createInstance(defaults: AxiosRequestConfig): AxiosInstance {
|
function createInstance(defaults: AxiosRequestConfig) {
|
||||||
const instance = new Axios(defaults);
|
const context = new Axios(defaults);
|
||||||
|
const instance = context.request as AxiosInstance;
|
||||||
|
|
||||||
function axios<TData = unknown>(
|
Object.assign(instance, context, {
|
||||||
urlOrConfig: string | AxiosRequestConfig,
|
// instance.fork 内部调用了 context 的私有方法
|
||||||
config: AxiosRequestConfig = {},
|
// 所以直接调用 instance.fork 会导致程序会抛出无法访问私有方法的异常
|
||||||
): Promise<AxiosResponse<TData>> {
|
// instance.fork 调用时 this 重新指向 context,解决此问题
|
||||||
if (isString(urlOrConfig)) {
|
fork: context.fork.bind(context),
|
||||||
config.url = urlOrConfig;
|
});
|
||||||
} else {
|
Object.setPrototypeOf(instance, Object.getPrototypeOf(context));
|
||||||
config = urlOrConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
return instance.request(config);
|
return instance;
|
||||||
}
|
|
||||||
|
|
||||||
Object.assign(axios, instance);
|
|
||||||
Object.setPrototypeOf(
|
|
||||||
axios,
|
|
||||||
Object.assign(Object.getPrototypeOf(instance), {
|
|
||||||
// axios.fork 内部调用了 instance 的私有方法,但是无法直接访问私有方法程序抛出导致异常
|
|
||||||
// axios.fork 调用时 this 重新指向 instance,解决此问题
|
|
||||||
fork: instance.fork.bind(instance),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
return axios as AxiosInstance;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const axios = createInstance(defaults) as AxiosStatic;
|
const axios = createInstance(defaults) as AxiosStatic;
|
||||||
|
|
||||||
axios.Axios = Axios;
|
axios.Axios = Axios;
|
||||||
axios.CancelToken = CancelToken;
|
axios.CancelToken = CancelToken;
|
||||||
axios.create = function create(defaults: AxiosRequestConfig): AxiosInstance {
|
axios.create = function create(defaults) {
|
||||||
return createInstance(mergeConfig(axios.defaults, defaults));
|
return createInstance(mergeConfig(axios.defaults, defaults));
|
||||||
};
|
};
|
||||||
axios.createAdapter = createAdapter;
|
axios.createAdapter = createAdapter;
|
||||||
|
|
|
@ -207,9 +207,7 @@ export default class Axios extends AxiosDomain {
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(defaults: AxiosRequestConfig = {}) {
|
constructor(defaults: AxiosRequestConfig = {}) {
|
||||||
super(defaults, (...args) => {
|
super(defaults, (config) => this.#processRequest(config));
|
||||||
return this.#processRequest(...args);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getUri(config: AxiosRequestConfig): string {
|
getUri(config: AxiosRequestConfig): string {
|
||||||
|
@ -228,9 +226,11 @@ export default class Axios extends AxiosDomain {
|
||||||
if (!isAbsoluteURL(baseURL)) {
|
if (!isAbsoluteURL(baseURL)) {
|
||||||
defaults.baseURL = combineURL(this.defaults.baseURL ?? '', baseURL);
|
defaults.baseURL = combineURL(this.defaults.baseURL ?? '', baseURL);
|
||||||
}
|
}
|
||||||
return new AxiosDomain(mergeConfig(this.defaults, defaults), (...args) => {
|
return new AxiosDomain(
|
||||||
return this.#processRequest(...args);
|
mergeConfig(this.defaults, defaults),
|
||||||
});
|
|
||||||
|
(config) => this.#processRequest(config),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#processRequest<TData = unknown>(config: AxiosRequestConfig) {
|
#processRequest<TData = unknown>(config: AxiosRequestConfig) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { isString, isUndefined } from '../helpers/isTypes';
|
||||||
import { deepMerge } from '../helpers/deepMerge';
|
import { deepMerge } from '../helpers/deepMerge';
|
||||||
import { mergeConfig } from './mergeConfig';
|
import { mergeConfig } from './mergeConfig';
|
||||||
import { AxiosRequestConfig, AxiosRequestData, AxiosResponse } from './Axios';
|
import { AxiosRequestConfig, AxiosRequestData, AxiosResponse } from './Axios';
|
||||||
|
@ -9,6 +10,16 @@ export interface AxiosDomainRequest {
|
||||||
*/
|
*/
|
||||||
config: AxiosRequestConfig,
|
config: AxiosRequestConfig,
|
||||||
): Promise<AxiosResponse<TData>>;
|
): Promise<AxiosResponse<TData>>;
|
||||||
|
<TData = unknown>(
|
||||||
|
/**
|
||||||
|
* 请求地址
|
||||||
|
*/
|
||||||
|
url: string,
|
||||||
|
/**
|
||||||
|
* 请求配置
|
||||||
|
*/
|
||||||
|
config?: AxiosRequestConfig,
|
||||||
|
): Promise<AxiosResponse<TData>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AxiosDomainAsRequest {
|
export interface AxiosDomainAsRequest {
|
||||||
|
@ -126,10 +137,24 @@ export default class AxiosDomain {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
defaults: AxiosRequestConfig = {},
|
defaults: AxiosRequestConfig = {},
|
||||||
processRequest: AxiosDomainRequest,
|
processRequest: (config: AxiosRequestConfig) => Promise<AxiosResponse>,
|
||||||
) {
|
) {
|
||||||
this.defaults = defaults;
|
this.defaults = defaults;
|
||||||
this.request = (config) => {
|
|
||||||
|
this.request = (
|
||||||
|
urlOrConfig: string | AxiosRequestConfig,
|
||||||
|
config: AxiosRequestConfig = {},
|
||||||
|
) => {
|
||||||
|
if (isString(urlOrConfig)) {
|
||||||
|
config.url = urlOrConfig;
|
||||||
|
} else {
|
||||||
|
config = urlOrConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isUndefined(config.method)) {
|
||||||
|
config.method = 'get';
|
||||||
|
}
|
||||||
|
|
||||||
return processRequest(mergeConfig(this.defaults, config));
|
return processRequest(mergeConfig(this.defaults, config));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -141,10 +166,8 @@ export default class AxiosDomain {
|
||||||
#createAsRequests() {
|
#createAsRequests() {
|
||||||
for (const alias of AxiosDomain.as) {
|
for (const alias of AxiosDomain.as) {
|
||||||
this[alias] = function processAsRequest(url, config = {}) {
|
this[alias] = function processAsRequest(url, config = {}) {
|
||||||
config.url = url;
|
|
||||||
config.method = alias;
|
config.method = alias;
|
||||||
|
return this.request(url, config);
|
||||||
return this.request(config);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,11 +175,9 @@ export default class AxiosDomain {
|
||||||
#createAspRequests() {
|
#createAspRequests() {
|
||||||
for (const alias of AxiosDomain.asp) {
|
for (const alias of AxiosDomain.asp) {
|
||||||
this[alias] = function processAspRequest(url, params = {}, config = {}) {
|
this[alias] = function processAspRequest(url, params = {}, config = {}) {
|
||||||
config.url = url;
|
|
||||||
config.method = alias;
|
config.method = alias;
|
||||||
config.params = deepMerge(params, config.params ?? {});
|
config.params = deepMerge(params, config.params ?? {});
|
||||||
|
return this.request(url, config);
|
||||||
return this.request(config);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,11 +185,9 @@ export default class AxiosDomain {
|
||||||
#createAsdRequests() {
|
#createAsdRequests() {
|
||||||
for (const alias of AxiosDomain.asd) {
|
for (const alias of AxiosDomain.asd) {
|
||||||
this[alias] = function processAsdRequest(url, data = {}, config = {}) {
|
this[alias] = function processAsdRequest(url, data = {}, config = {}) {
|
||||||
config.url = url;
|
|
||||||
config.method = alias;
|
config.method = alias;
|
||||||
config.data = deepMerge(data, config.data ?? {});
|
config.data = deepMerge(data, config.data ?? {});
|
||||||
|
return this.request(url, config);
|
||||||
return this.request(config);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,13 +5,13 @@ import { AxiosRequestConfig } from './Axios';
|
||||||
const fromConfig2Map: Record<string, boolean> = {
|
const fromConfig2Map: Record<string, boolean> = {
|
||||||
url: true,
|
url: true,
|
||||||
method: true,
|
method: true,
|
||||||
data: true,
|
|
||||||
upload: true,
|
upload: true,
|
||||||
download: true,
|
download: true,
|
||||||
};
|
};
|
||||||
const deepMergeConfigMap: Record<string, boolean> = {
|
const deepMergeConfigMap: Record<string, boolean> = {
|
||||||
headers: true,
|
headers: true,
|
||||||
params: true,
|
params: true,
|
||||||
|
data: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
export function mergeConfig(
|
export function mergeConfig(
|
||||||
|
|
|
@ -13,14 +13,12 @@ describe('src/core/mergeConfig.ts', () => {
|
||||||
const c1 = {
|
const c1 = {
|
||||||
url: 'a',
|
url: 'a',
|
||||||
method: 'get' as const,
|
method: 'get' as const,
|
||||||
data: {},
|
|
||||||
upload: true,
|
upload: true,
|
||||||
download: true,
|
download: true,
|
||||||
};
|
};
|
||||||
const c2 = {
|
const c2 = {
|
||||||
url: 'b',
|
url: 'b',
|
||||||
method: 'post' as const,
|
method: 'post' as const,
|
||||||
data: {},
|
|
||||||
upload: false,
|
upload: false,
|
||||||
download: false,
|
download: false,
|
||||||
};
|
};
|
||||||
|
@ -37,6 +35,27 @@ describe('src/core/mergeConfig.ts', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test('应该深度合并', () => {
|
test('应该深度合并', () => {
|
||||||
|
const o1 = {
|
||||||
|
v1: 1,
|
||||||
|
v2: 1,
|
||||||
|
v3: {
|
||||||
|
v1: 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const o2 = {
|
||||||
|
v2: 2,
|
||||||
|
v3: {
|
||||||
|
v2: 2,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const o3 = {
|
||||||
|
v1: 1,
|
||||||
|
v2: 2,
|
||||||
|
v3: {
|
||||||
|
v1: 1,
|
||||||
|
v2: 2,
|
||||||
|
},
|
||||||
|
};
|
||||||
const c1 = {
|
const c1 = {
|
||||||
headers: {
|
headers: {
|
||||||
common: {
|
common: {
|
||||||
|
@ -44,9 +63,8 @@ describe('src/core/mergeConfig.ts', () => {
|
||||||
},
|
},
|
||||||
v1: 1,
|
v1: 1,
|
||||||
},
|
},
|
||||||
params: {
|
params: o1,
|
||||||
v1: 1,
|
data: o1,
|
||||||
},
|
|
||||||
};
|
};
|
||||||
const c2 = {
|
const c2 = {
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -55,9 +73,8 @@ describe('src/core/mergeConfig.ts', () => {
|
||||||
},
|
},
|
||||||
v2: 2,
|
v2: 2,
|
||||||
},
|
},
|
||||||
params: {
|
params: o2,
|
||||||
v2: 2,
|
data: o2,
|
||||||
},
|
|
||||||
};
|
};
|
||||||
const mc = {
|
const mc = {
|
||||||
headers: {
|
headers: {
|
||||||
|
@ -68,10 +85,8 @@ describe('src/core/mergeConfig.ts', () => {
|
||||||
v1: 1,
|
v1: 1,
|
||||||
v2: 2,
|
v2: 2,
|
||||||
},
|
},
|
||||||
params: {
|
params: o3,
|
||||||
v1: 1,
|
data: o3,
|
||||||
v2: 2,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
expect(mergeConfig(c1, {})).toEqual(c1);
|
expect(mergeConfig(c1, {})).toEqual(c1);
|
||||||
|
|
Loading…
Reference in New Issue