UNPKG

2.9 kBJavaScriptView Raw
1'use strict';
2
3var utils = require('../utils');
4
5/**
6 * Config-specific merge-function which creates a new config-object
7 * by merging two configuration objects together.
8 *
9 * @param {Object} config1
10 * @param {Object} config2
11 * @returns {Object} New object resulting from merging config2 to config1
12 */
13module.exports = function mergeConfig(config1, config2) {
14 // eslint-disable-next-line no-param-reassign
15 config2 = config2 || {};
16 var config = {};
17
18 var valueFromConfig2Keys = ['url', 'method', 'data'];
19 var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];
20 var defaultToConfig2Keys = [
21 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',
22 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',
23 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress',
24 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent',
25 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'
26 ];
27 var directMergeKeys = ['validateStatus'];
28
29 function getMergedValue(target, source) {
30 if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
31 return utils.merge(target, source);
32 } else if (utils.isPlainObject(source)) {
33 return utils.merge({}, source);
34 } else if (utils.isArray(source)) {
35 return source.slice();
36 }
37 return source;
38 }
39
40 function mergeDeepProperties(prop) {
41 if (!utils.isUndefined(config2[prop])) {
42 config[prop] = getMergedValue(config1[prop], config2[prop]);
43 } else if (!utils.isUndefined(config1[prop])) {
44 config[prop] = getMergedValue(undefined, config1[prop]);
45 }
46 }
47
48 utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
49 if (!utils.isUndefined(config2[prop])) {
50 config[prop] = getMergedValue(undefined, config2[prop]);
51 }
52 });
53
54 utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
55
56 utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
57 if (!utils.isUndefined(config2[prop])) {
58 config[prop] = getMergedValue(undefined, config2[prop]);
59 } else if (!utils.isUndefined(config1[prop])) {
60 config[prop] = getMergedValue(undefined, config1[prop]);
61 }
62 });
63
64 utils.forEach(directMergeKeys, function merge(prop) {
65 if (prop in config2) {
66 config[prop] = getMergedValue(config1[prop], config2[prop]);
67 } else if (prop in config1) {
68 config[prop] = getMergedValue(undefined, config1[prop]);
69 }
70 });
71
72 var axiosKeys = valueFromConfig2Keys
73 .concat(mergeDeepPropertiesKeys)
74 .concat(defaultToConfig2Keys)
75 .concat(directMergeKeys);
76
77 var otherKeys = Object
78 .keys(config1)
79 .concat(Object.keys(config2))
80 .filter(function filterAxiosKeys(key) {
81 return axiosKeys.indexOf(key) === -1;
82 });
83
84 utils.forEach(otherKeys, mergeDeepProperties);
85
86 return config;
87};