1 | 'use strict';
|
2 |
|
3 | var utils = require('../utils');
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | module.exports = function mergeConfig(config1, config2) {
|
14 |
|
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 | };
|