b3632abda88e526d80eebf9acd4eeb9a45578a7bca9045e716646d309805d57e304118452e5f5b0cdf9f2924ec0f8cb0ea2f3a44693c0fc6cacb917d4d37f0 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. function getMergedValue(target, source) {
  16. if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
  17. return utils.merge(target, source);
  18. } else if (utils.isEmptyObject(source)) {
  19. return utils.merge({}, target);
  20. } else if (utils.isPlainObject(source)) {
  21. return utils.merge({}, source);
  22. } else if (utils.isArray(source)) {
  23. return source.slice();
  24. }
  25. return source;
  26. }
  27. // eslint-disable-next-line consistent-return
  28. function mergeDeepProperties(prop) {
  29. if (!utils.isUndefined(config2[prop])) {
  30. return getMergedValue(config1[prop], config2[prop]);
  31. } else if (!utils.isUndefined(config1[prop])) {
  32. return getMergedValue(undefined, config1[prop]);
  33. }
  34. }
  35. // eslint-disable-next-line consistent-return
  36. function valueFromConfig2(prop) {
  37. if (!utils.isUndefined(config2[prop])) {
  38. return getMergedValue(undefined, config2[prop]);
  39. }
  40. }
  41. // eslint-disable-next-line consistent-return
  42. function defaultToConfig2(prop) {
  43. if (!utils.isUndefined(config2[prop])) {
  44. return getMergedValue(undefined, config2[prop]);
  45. } else if (!utils.isUndefined(config1[prop])) {
  46. return getMergedValue(undefined, config1[prop]);
  47. }
  48. }
  49. // eslint-disable-next-line consistent-return
  50. function mergeDirectKeys(prop) {
  51. if (prop in config2) {
  52. return getMergedValue(config1[prop], config2[prop]);
  53. } else if (prop in config1) {
  54. return getMergedValue(undefined, config1[prop]);
  55. }
  56. }
  57. var mergeMap = {
  58. 'url': valueFromConfig2,
  59. 'method': valueFromConfig2,
  60. 'data': valueFromConfig2,
  61. 'baseURL': defaultToConfig2,
  62. 'transformRequest': defaultToConfig2,
  63. 'transformResponse': defaultToConfig2,
  64. 'paramsSerializer': defaultToConfig2,
  65. 'timeout': defaultToConfig2,
  66. 'timeoutMessage': defaultToConfig2,
  67. 'withCredentials': defaultToConfig2,
  68. 'withXSRFToken': defaultToConfig2,
  69. 'adapter': defaultToConfig2,
  70. 'responseType': defaultToConfig2,
  71. 'xsrfCookieName': defaultToConfig2,
  72. 'xsrfHeaderName': defaultToConfig2,
  73. 'onUploadProgress': defaultToConfig2,
  74. 'onDownloadProgress': defaultToConfig2,
  75. 'decompress': defaultToConfig2,
  76. 'maxContentLength': defaultToConfig2,
  77. 'maxBodyLength': defaultToConfig2,
  78. 'beforeRedirect': defaultToConfig2,
  79. 'transport': defaultToConfig2,
  80. 'httpAgent': defaultToConfig2,
  81. 'httpsAgent': defaultToConfig2,
  82. 'cancelToken': defaultToConfig2,
  83. 'socketPath': defaultToConfig2,
  84. 'responseEncoding': defaultToConfig2,
  85. 'validateStatus': mergeDirectKeys
  86. };
  87. utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
  88. var merge = mergeMap[prop] || mergeDeepProperties;
  89. var configValue = merge(prop);
  90. (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
  91. });
  92. return config;
  93. };