@ace-fetch/uni-app
Version:
uni-app adapter for @ace-fetch/core.
85 lines (84 loc) • 2.9 kB
JavaScript
import { isPlainObject, isArray, isUndef } from '@ace-util/core';
import { forEach, merge } from '../utils';
/**
* Config-specific merge-function which creates a new config-object
* by merging two configuration objects together.
*
* @param {Object} config1
* @param {Object} config2
*
* @returns {Object} New object resulting from merging config2 to config1
*/
export function mergeConfig(config1, config2) {
config2 = config2 || {};
var config = {};
function getMergedValue(target, source) {
if (isPlainObject(target) && isPlainObject(source)) {
return merge(target, source);
}
else if (isPlainObject(source)) {
return merge({}, source);
}
else if (isArray(source)) {
return source.slice();
}
return source;
}
function mergeDeepProperties(prop) {
if (!isUndef(config2[prop])) {
return getMergedValue(config1[prop], config2[prop]);
}
else if (!isUndef(config1[prop])) {
return getMergedValue(undefined, config1[prop]);
}
}
function valueFromConfig2(prop) {
if (!isUndef(config2[prop])) {
return getMergedValue(undefined, config2[prop]);
}
}
function defaultToConfig2(prop) {
if (!isUndef(config2[prop])) {
return getMergedValue(undefined, config2[prop]);
}
else if (!isUndef(config1[prop])) {
return getMergedValue(undefined, config1[prop]);
}
}
function mergeDirectKeys(prop) {
if (prop in config2) {
return getMergedValue(config1[prop], config2[prop]);
}
else if (prop in config1) {
return getMergedValue(undefined, config1[prop]);
}
}
var mergeMap = {
url: valueFromConfig2,
method: valueFromConfig2,
headers: mergeDeepProperties,
data: valueFromConfig2,
timeout: defaultToConfig2,
requestType: defaultToConfig2,
responseType: defaultToConfig2,
sslVerify: defaultToConfig2,
withCredentials: defaultToConfig2,
firstIpv4: defaultToConfig2,
enableHttp2: defaultToConfig2,
enableQuic: defaultToConfig2,
enableCache: defaultToConfig2,
enableHttpDNS: defaultToConfig2,
httpDNSServiceId: defaultToConfig2,
enableChunked: defaultToConfig2,
forceCellularNetwork: defaultToConfig2,
enableCookie: defaultToConfig2,
cloudCache: mergeDeepProperties,
defer: defaultToConfig2,
};
forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
var merge = mergeMap[prop] || mergeDeepProperties;
var configValue = merge(prop);
(isUndef(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
});
return config;
}