You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.8 KiB

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