| 'use strict'; |
|
|
| var utils = require('../utils'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| module.exports = function mergeConfig(config1, config2) { |
| |
| config2 = config2 || {}; |
| var config = {}; |
|
|
| function getMergedValue(target, source) { |
| if (utils.isPlainObject(target) && utils.isPlainObject(source)) { |
| return utils.merge(target, source); |
| } else if (utils.isPlainObject(source)) { |
| return utils.merge({}, source); |
| } else if (utils.isArray(source)) { |
| return source.slice(); |
| } |
| return source; |
| } |
|
|
| |
| function mergeDeepProperties(prop) { |
| if (!utils.isUndefined(config2[prop])) { |
| return getMergedValue(config1[prop], config2[prop]); |
| } else if (!utils.isUndefined(config1[prop])) { |
| return getMergedValue(undefined, config1[prop]); |
| } |
| } |
|
|
| |
| function valueFromConfig2(prop) { |
| if (!utils.isUndefined(config2[prop])) { |
| return getMergedValue(undefined, config2[prop]); |
| } |
| } |
|
|
| |
| function defaultToConfig2(prop) { |
| if (!utils.isUndefined(config2[prop])) { |
| return getMergedValue(undefined, config2[prop]); |
| } else if (!utils.isUndefined(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, |
| 'data': valueFromConfig2, |
| 'baseURL': defaultToConfig2, |
| 'transformRequest': defaultToConfig2, |
| 'transformResponse': defaultToConfig2, |
| 'paramsSerializer': defaultToConfig2, |
| 'timeout': defaultToConfig2, |
| 'timeoutMessage': defaultToConfig2, |
| 'withCredentials': defaultToConfig2, |
| 'adapter': defaultToConfig2, |
| 'responseType': defaultToConfig2, |
| 'xsrfCookieName': defaultToConfig2, |
| 'xsrfHeaderName': defaultToConfig2, |
| 'onUploadProgress': defaultToConfig2, |
| 'onDownloadProgress': defaultToConfig2, |
| 'decompress': defaultToConfig2, |
| 'maxContentLength': defaultToConfig2, |
| 'maxBodyLength': defaultToConfig2, |
| 'transport': defaultToConfig2, |
| 'httpAgent': defaultToConfig2, |
| 'httpsAgent': defaultToConfig2, |
| 'cancelToken': defaultToConfig2, |
| 'socketPath': defaultToConfig2, |
| 'responseEncoding': defaultToConfig2, |
| 'validateStatus': mergeDirectKeys |
| }; |
|
|
| utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) { |
| var merge = mergeMap[prop] || mergeDeepProperties; |
| var configValue = merge(prop); |
| (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); |
| }); |
|
|
| return config; |
| }; |
|
|