60 lines
2.3 KiB
JavaScript
60 lines
2.3 KiB
JavaScript
import Tools from '../tools';
|
|
|
|
function mergeConfig (defaultConfig, instanceConfig = {}) {
|
|
const CONFIG_KEY_LIST = ['url', 'method', 'data', 'dataType', 'responseType', 'params', 'isProxy'];
|
|
const CONFIG_MERGE_DEEP_KEY_LIST = ['header'];
|
|
const CONFIG_OPTIONAL_KEY_LIST = ['baseURL'];
|
|
const CONFIG_ALL_KEY_LIST = [...CONFIG_KEY_LIST, ...CONFIG_MERGE_DEEP_KEY_LIST, ...CONFIG_OPTIONAL_KEY_LIST];
|
|
const ARGS_ALL_KEY_LIST = [...new Set([...Object.keys(instanceConfig), ...Object.keys(defaultConfig)])];
|
|
const REMAINDER_KEY_LIST = ARGS_ALL_KEY_LIST.filter(key => !CONFIG_ALL_KEY_LIST.includes(key));
|
|
let newConfig = {}
|
|
|
|
// 必要参数
|
|
CONFIG_KEY_LIST.forEach(prop => {
|
|
const val = instanceConfig[prop] || defaultConfig[prop];
|
|
|
|
!Tools.isType('Undefined', val) && (newConfig[prop] = val);
|
|
});
|
|
|
|
// 必要深拷贝参数
|
|
CONFIG_MERGE_DEEP_KEY_LIST.forEach(prop => {
|
|
const defaultVal = defaultConfig[prop];
|
|
const instanceVal = instanceConfig[prop];
|
|
|
|
if (Tools.isType('Object', instanceVal)) {
|
|
newConfig[prop] = Tools.deepCopy(defaultVal, instanceVal);
|
|
} else if (Tools.isType('Object', defaultVal)) {
|
|
newConfig[prop] = Tools.deepCopy(defaultVal);
|
|
}
|
|
});
|
|
|
|
// 配置文件中可选参数
|
|
CONFIG_OPTIONAL_KEY_LIST.forEach(prop => {
|
|
const val = defaultConfig[prop];
|
|
|
|
if (!Tools.isType('Undefined', val)) {
|
|
newConfig[prop] = defaultConfig[prop];
|
|
}
|
|
});
|
|
|
|
// 合并未出现在上述列表中的参数
|
|
REMAINDER_KEY_LIST.forEach(prop => {
|
|
const defaultVal = defaultConfig[prop];
|
|
const instanceVal = instanceConfig[prop];
|
|
|
|
if (!Tools.isType('Undefined', instanceVal)) {
|
|
newConfig[prop] = instanceVal;
|
|
} else if (!Tools.isType('Undefined', defaultVal)) {
|
|
newConfig[prop] = defaultVal;
|
|
}
|
|
});
|
|
|
|
newConfig.instanceURL = instanceConfig.url;
|
|
newConfig.url = Tools.getFullURL(newConfig.baseURL, newConfig.url);
|
|
newConfig.url = Tools.paramsToURL(newConfig);
|
|
newConfig.header = Tools.adapterContentType(defaultConfig.header, instanceConfig.header, newConfig.header);
|
|
|
|
return newConfig;
|
|
}
|
|
|
|
export default mergeConfig; |