axios 0.21.4 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +318 -54
  2. package/README.md +378 -64
  3. package/SECURITY.md +3 -3
  4. package/UPGRADE_GUIDE.md +41 -13
  5. package/bin/check-build-version.js +19 -0
  6. package/bin/ssl_hotfix.js +22 -0
  7. package/dist/axios.js +2072 -1878
  8. package/dist/axios.js.map +1 -0
  9. package/dist/axios.min.js +2 -3
  10. package/dist/axios.min.js.map +1 -0
  11. package/dist/esm/axios.js +2379 -0
  12. package/dist/esm/axios.js.map +1 -0
  13. package/dist/esm/axios.min.js +2 -0
  14. package/dist/esm/axios.min.js.map +1 -0
  15. package/index.d.ts +219 -46
  16. package/lib/adapters/http.js +262 -130
  17. package/lib/adapters/xhr.js +59 -22
  18. package/lib/axios.js +19 -7
  19. package/lib/cancel/CancelToken.js +65 -4
  20. package/lib/cancel/CanceledError.js +24 -0
  21. package/lib/core/Axios.js +45 -17
  22. package/lib/core/AxiosError.js +97 -0
  23. package/lib/core/InterceptorManager.js +9 -0
  24. package/lib/core/buildFullPath.js +5 -2
  25. package/lib/core/dispatchRequest.js +13 -1
  26. package/lib/core/mergeConfig.js +54 -38
  27. package/lib/core/settle.js +3 -3
  28. package/lib/core/transformData.js +4 -3
  29. package/lib/{defaults.js → defaults/index.js} +64 -23
  30. package/lib/defaults/transitional.js +7 -0
  31. package/lib/env/README.md +3 -0
  32. package/lib/env/classes/FormData.js +2 -0
  33. package/lib/env/data.js +3 -0
  34. package/lib/helpers/AxiosURLSearchParams.js +42 -0
  35. package/lib/helpers/bind.js +1 -5
  36. package/lib/helpers/buildURL.js +18 -33
  37. package/lib/helpers/combineURLs.js +1 -1
  38. package/lib/helpers/formDataToJSON.js +74 -0
  39. package/lib/helpers/fromDataURI.js +51 -0
  40. package/lib/helpers/isAbsoluteURL.js +1 -1
  41. package/lib/helpers/isAxiosError.js +3 -1
  42. package/lib/helpers/isURLSameOrigin.js +12 -12
  43. package/lib/helpers/null.js +2 -0
  44. package/lib/helpers/parseHeaders.js +2 -2
  45. package/lib/helpers/parseProtocol.js +6 -0
  46. package/lib/helpers/toFormData.js +179 -0
  47. package/lib/helpers/toURLEncodedForm.js +18 -0
  48. package/lib/helpers/validator.js +14 -33
  49. package/lib/platform/browser/classes/FormData.js +3 -0
  50. package/lib/platform/browser/classes/URLSearchParams.js +5 -0
  51. package/lib/platform/browser/index.js +11 -0
  52. package/lib/platform/index.js +3 -0
  53. package/lib/platform/node/classes/FormData.js +3 -0
  54. package/lib/platform/node/classes/URLSearchParams.js +5 -0
  55. package/lib/platform/node/index.js +11 -0
  56. package/lib/utils.js +210 -37
  57. package/package.json +42 -26
  58. package/rollup.config.js +60 -0
  59. package/tsconfig.json +14 -0
  60. package/tslint.json +6 -0
  61. package/dist/axios.map +0 -1
  62. package/dist/axios.min.map +0 -1
  63. package/lib/cancel/Cancel.js +0 -19
  64. package/lib/core/createError.js +0 -18
  65. package/lib/core/enhanceError.js +0 -42
@@ -15,20 +15,11 @@ module.exports = function mergeConfig(config1, config2) {
15
15
  config2 = config2 || {};
16
16
  var config = {};
17
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
18
  function getMergedValue(target, source) {
30
19
  if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
31
20
  return utils.merge(target, source);
21
+ } else if (utils.isEmptyObject(source)) {
22
+ return utils.merge({}, target);
32
23
  } else if (utils.isPlainObject(source)) {
33
24
  return utils.merge({}, source);
34
25
  } else if (utils.isArray(source)) {
@@ -37,51 +28,76 @@ module.exports = function mergeConfig(config1, config2) {
37
28
  return source;
38
29
  }
39
30
 
31
+ // eslint-disable-next-line consistent-return
40
32
  function mergeDeepProperties(prop) {
41
33
  if (!utils.isUndefined(config2[prop])) {
42
- config[prop] = getMergedValue(config1[prop], config2[prop]);
34
+ return getMergedValue(config1[prop], config2[prop]);
43
35
  } else if (!utils.isUndefined(config1[prop])) {
44
- config[prop] = getMergedValue(undefined, config1[prop]);
36
+ return getMergedValue(undefined, config1[prop]);
45
37
  }
46
38
  }
47
39
 
48
- utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
40
+ // eslint-disable-next-line consistent-return
41
+ function valueFromConfig2(prop) {
49
42
  if (!utils.isUndefined(config2[prop])) {
50
- config[prop] = getMergedValue(undefined, config2[prop]);
43
+ return getMergedValue(undefined, config2[prop]);
51
44
  }
52
- });
53
-
54
- utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
45
+ }
55
46
 
56
- utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
47
+ // eslint-disable-next-line consistent-return
48
+ function defaultToConfig2(prop) {
57
49
  if (!utils.isUndefined(config2[prop])) {
58
- config[prop] = getMergedValue(undefined, config2[prop]);
50
+ return getMergedValue(undefined, config2[prop]);
59
51
  } else if (!utils.isUndefined(config1[prop])) {
60
- config[prop] = getMergedValue(undefined, config1[prop]);
52
+ return getMergedValue(undefined, config1[prop]);
61
53
  }
62
- });
54
+ }
63
55
 
64
- utils.forEach(directMergeKeys, function merge(prop) {
56
+ // eslint-disable-next-line consistent-return
57
+ function mergeDirectKeys(prop) {
65
58
  if (prop in config2) {
66
- config[prop] = getMergedValue(config1[prop], config2[prop]);
59
+ return getMergedValue(config1[prop], config2[prop]);
67
60
  } else if (prop in config1) {
68
- config[prop] = getMergedValue(undefined, config1[prop]);
61
+ return getMergedValue(undefined, config1[prop]);
69
62
  }
70
- });
71
-
72
- var axiosKeys = valueFromConfig2Keys
73
- .concat(mergeDeepPropertiesKeys)
74
- .concat(defaultToConfig2Keys)
75
- .concat(directMergeKeys);
63
+ }
76
64
 
77
- var otherKeys = Object
78
- .keys(config1)
79
- .concat(Object.keys(config2))
80
- .filter(function filterAxiosKeys(key) {
81
- return axiosKeys.indexOf(key) === -1;
82
- });
65
+ var mergeMap = {
66
+ 'url': valueFromConfig2,
67
+ 'method': valueFromConfig2,
68
+ 'data': valueFromConfig2,
69
+ 'baseURL': defaultToConfig2,
70
+ 'transformRequest': defaultToConfig2,
71
+ 'transformResponse': defaultToConfig2,
72
+ 'paramsSerializer': defaultToConfig2,
73
+ 'timeout': defaultToConfig2,
74
+ 'timeoutMessage': defaultToConfig2,
75
+ 'withCredentials': defaultToConfig2,
76
+ 'withXSRFToken': defaultToConfig2,
77
+ 'adapter': defaultToConfig2,
78
+ 'responseType': defaultToConfig2,
79
+ 'xsrfCookieName': defaultToConfig2,
80
+ 'xsrfHeaderName': defaultToConfig2,
81
+ 'onUploadProgress': defaultToConfig2,
82
+ 'onDownloadProgress': defaultToConfig2,
83
+ 'decompress': defaultToConfig2,
84
+ 'maxContentLength': defaultToConfig2,
85
+ 'maxBodyLength': defaultToConfig2,
86
+ 'beforeRedirect': defaultToConfig2,
87
+ 'transport': defaultToConfig2,
88
+ 'httpAgent': defaultToConfig2,
89
+ 'httpsAgent': defaultToConfig2,
90
+ 'cancelToken': defaultToConfig2,
91
+ 'socketPath': defaultToConfig2,
92
+ 'responseEncoding': defaultToConfig2,
93
+ 'validateStatus': mergeDirectKeys
94
+ };
83
95
 
84
- utils.forEach(otherKeys, mergeDeepProperties);
96
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
97
+ var merge = mergeMap[prop] || mergeDeepProperties;
98
+ var configValue = merge(prop);
99
+ (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
100
+ });
85
101
 
86
102
  return config;
87
103
  };
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var createError = require('./createError');
3
+ var AxiosError = require('./AxiosError');
4
4
 
5
5
  /**
6
6
  * Resolve or reject a Promise based on response status.
@@ -14,10 +14,10 @@ module.exports = function settle(resolve, reject, response) {
14
14
  if (!response.status || !validateStatus || validateStatus(response.status)) {
15
15
  resolve(response);
16
16
  } else {
17
- reject(createError(
17
+ reject(new AxiosError(
18
18
  'Request failed with status code ' + response.status,
19
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
19
20
  response.config,
20
- null,
21
21
  response.request,
22
22
  response
23
23
  ));
@@ -1,21 +1,22 @@
1
1
  'use strict';
2
2
 
3
3
  var utils = require('./../utils');
4
- var defaults = require('./../defaults');
4
+ var defaults = require('../defaults');
5
5
 
6
6
  /**
7
7
  * Transform the data for a request or a response
8
8
  *
9
9
  * @param {Object|String} data The data to be transformed
10
10
  * @param {Array} headers The headers for the request or response
11
+ * @param {Number} status HTTP status code
11
12
  * @param {Array|Function} fns A single function or Array of functions
12
13
  * @returns {*} The resulting transformed data
13
14
  */
14
- module.exports = function transformData(data, headers, fns) {
15
+ module.exports = function transformData(data, headers, status, fns) {
15
16
  var context = this || defaults;
16
17
  /*eslint no-param-reassign:0*/
17
18
  utils.forEach(fns, function transform(fn) {
18
- data = fn.call(context, data, headers);
19
+ data = fn.call(context, data, headers, status);
19
20
  });
20
21
 
21
22
  return data;
@@ -1,8 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var utils = require('./utils');
4
- var normalizeHeaderName = require('./helpers/normalizeHeaderName');
5
- var enhanceError = require('./core/enhanceError');
3
+ var utils = require('../utils');
4
+ var normalizeHeaderName = require('../helpers/normalizeHeaderName');
5
+ var AxiosError = require('../core/AxiosError');
6
+ var transitionalDefaults = require('./transitional');
7
+ var toFormData = require('../helpers/toFormData');
8
+ var toURLEncodedForm = require('../helpers/toURLEncodedForm');
9
+ var platform = require('../platform');
10
+ var formDataToJSON = require('../helpers/formDataToJSON');
6
11
 
7
12
  var DEFAULT_CONTENT_TYPE = {
8
13
  'Content-Type': 'application/x-www-form-urlencoded'
@@ -18,10 +23,10 @@ function getDefaultAdapter() {
18
23
  var adapter;
19
24
  if (typeof XMLHttpRequest !== 'undefined') {
20
25
  // For browsers use XHR adapter
21
- adapter = require('./adapters/xhr');
26
+ adapter = require('../adapters/xhr');
22
27
  } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
23
28
  // For node use HTTP adapter
24
- adapter = require('./adapters/http');
29
+ adapter = require('../adapters/http');
25
30
  }
26
31
  return adapter;
27
32
  }
@@ -43,11 +48,7 @@ function stringifySafely(rawValue, parser, encoder) {
43
48
 
44
49
  var defaults = {
45
50
 
46
- transitional: {
47
- silentJSONParsing: true,
48
- forcedJSONParsing: true,
49
- clarifyTimeoutError: false
50
- },
51
+ transitional: transitionalDefaults,
51
52
 
52
53
  adapter: getDefaultAdapter(),
53
54
 
@@ -55,8 +56,21 @@ var defaults = {
55
56
  normalizeHeaderName(headers, 'Accept');
56
57
  normalizeHeaderName(headers, 'Content-Type');
57
58
 
58
- if (utils.isFormData(data) ||
59
- utils.isArrayBuffer(data) ||
59
+ var contentType = headers && headers['Content-Type'] || '';
60
+ var hasJSONContentType = contentType.indexOf('application/json') > -1;
61
+ var isObjectPayload = utils.isObject(data);
62
+
63
+ if (isObjectPayload && utils.isHTMLForm(data)) {
64
+ data = new FormData(data);
65
+ }
66
+
67
+ var isFormData = utils.isFormData(data);
68
+
69
+ if (isFormData) {
70
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
71
+ }
72
+
73
+ if (utils.isArrayBuffer(data) ||
60
74
  utils.isBuffer(data) ||
61
75
  utils.isStream(data) ||
62
76
  utils.isFile(data) ||
@@ -71,26 +85,48 @@ var defaults = {
71
85
  setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
72
86
  return data.toString();
73
87
  }
74
- if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {
88
+
89
+ var isFileList;
90
+
91
+ if (isObjectPayload) {
92
+ if (contentType.indexOf('application/x-www-form-urlencoded') !== -1) {
93
+ return toURLEncodedForm(data, this.formSerializer).toString();
94
+ }
95
+
96
+ if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
97
+ var _FormData = this.env && this.env.FormData;
98
+
99
+ return toFormData(
100
+ isFileList ? {'files[]': data} : data,
101
+ _FormData && new _FormData(),
102
+ this.formSerializer
103
+ );
104
+ }
105
+ }
106
+
107
+ if (isObjectPayload || hasJSONContentType ) {
75
108
  setContentTypeIfUnset(headers, 'application/json');
76
109
  return stringifySafely(data);
77
110
  }
111
+
78
112
  return data;
79
113
  }],
80
114
 
81
115
  transformResponse: [function transformResponse(data) {
82
- var transitional = this.transitional;
83
- var silentJSONParsing = transitional && transitional.silentJSONParsing;
116
+ var transitional = this.transitional || defaults.transitional;
84
117
  var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
85
- var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
118
+ var JSONRequested = this.responseType === 'json';
119
+
120
+ if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
121
+ var silentJSONParsing = transitional && transitional.silentJSONParsing;
122
+ var strictJSONParsing = !silentJSONParsing && JSONRequested;
86
123
 
87
- if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
88
124
  try {
89
125
  return JSON.parse(data);
90
126
  } catch (e) {
91
127
  if (strictJSONParsing) {
92
128
  if (e.name === 'SyntaxError') {
93
- throw enhanceError(e, this, 'E_JSON_PARSE');
129
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
94
130
  }
95
131
  throw e;
96
132
  }
@@ -112,14 +148,19 @@ var defaults = {
112
148
  maxContentLength: -1,
113
149
  maxBodyLength: -1,
114
150
 
151
+ env: {
152
+ FormData: platform.classes.FormData,
153
+ Blob: platform.classes.Blob
154
+ },
155
+
115
156
  validateStatus: function validateStatus(status) {
116
157
  return status >= 200 && status < 300;
117
- }
118
- };
158
+ },
119
159
 
120
- defaults.headers = {
121
- common: {
122
- 'Accept': 'application/json, text/plain, */*'
160
+ headers: {
161
+ common: {
162
+ 'Accept': 'application/json, text/plain, */*'
163
+ }
123
164
  }
124
165
  };
125
166
 
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ silentJSONParsing: true,
5
+ forcedJSONParsing: true,
6
+ clarifyTimeoutError: false
7
+ };
@@ -0,0 +1,3 @@
1
+ # axios // env
2
+
3
+ The `data.js` file is updated automatically when the package version is upgrading. Please do not edit it manually.
@@ -0,0 +1,2 @@
1
+ // eslint-disable-next-line strict
2
+ module.exports = require('form-data');
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ "version": "0.30.0"
3
+ };
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ var toFormData = require('./toFormData');
4
+
5
+ function encode(str) {
6
+ var charMap = {
7
+ '!': '%21',
8
+ "'": '%27',
9
+ '(': '%28',
10
+ ')': '%29',
11
+ '~': '%7E',
12
+ '%20': '+',
13
+ '%00': '\x00'
14
+ };
15
+ return encodeURIComponent(str).replace(/[!'\(\)~]|%20|%00/g, function replacer(match) {
16
+ return charMap[match];
17
+ });
18
+ }
19
+
20
+ function AxiosURLSearchParams(params, options) {
21
+ this._pairs = [];
22
+
23
+ params && toFormData(params, this, options);
24
+ }
25
+
26
+ var prototype = AxiosURLSearchParams.prototype;
27
+
28
+ prototype.append = function append(name, value) {
29
+ this._pairs.push([name, value]);
30
+ };
31
+
32
+ prototype.toString = function toString(encoder) {
33
+ var _encode = encoder ? function(value) {
34
+ return encoder.call(this, value, encode);
35
+ } : encode;
36
+
37
+ return this._pairs.map(function each(pair) {
38
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
39
+ }, '').join('&');
40
+ };
41
+
42
+ module.exports = AxiosURLSearchParams;
@@ -2,10 +2,6 @@
2
2
 
3
3
  module.exports = function bind(fn, thisArg) {
4
4
  return function wrap() {
5
- var args = new Array(arguments.length);
6
- for (var i = 0; i < args.length; i++) {
7
- args[i] = arguments[i];
8
- }
9
- return fn.apply(thisArg, args);
5
+ return fn.apply(thisArg, arguments);
10
6
  };
11
7
  };
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var utils = require('./../utils');
3
+ var utils = require('../utils');
4
+ var AxiosURLSearchParams = require('../helpers/AxiosURLSearchParams');
4
5
 
5
6
  function encode(val) {
6
7
  return encodeURIComponent(val).
@@ -17,52 +18,36 @@ function encode(val) {
17
18
  *
18
19
  * @param {string} url The base of the url (e.g., http://www.google.com)
19
20
  * @param {object} [params] The params to be appended
21
+ * @param {?object} options
20
22
  * @returns {string} The formatted url
21
23
  */
22
- module.exports = function buildURL(url, params, paramsSerializer) {
24
+ module.exports = function buildURL(url, params, options) {
23
25
  /*eslint no-param-reassign:0*/
24
26
  if (!params) {
25
27
  return url;
26
28
  }
27
29
 
28
- var serializedParams;
29
- if (paramsSerializer) {
30
- serializedParams = paramsSerializer(params);
31
- } else if (utils.isURLSearchParams(params)) {
32
- serializedParams = params.toString();
33
- } else {
34
- var parts = [];
30
+ var hashmarkIndex = url.indexOf('#');
35
31
 
36
- utils.forEach(params, function serialize(val, key) {
37
- if (val === null || typeof val === 'undefined') {
38
- return;
39
- }
32
+ if (hashmarkIndex !== -1) {
33
+ url = url.slice(0, hashmarkIndex);
34
+ }
40
35
 
41
- if (utils.isArray(val)) {
42
- key = key + '[]';
43
- } else {
44
- val = [val];
45
- }
36
+ var _encode = options && options.encode || encode;
46
37
 
47
- utils.forEach(val, function parseValue(v) {
48
- if (utils.isDate(v)) {
49
- v = v.toISOString();
50
- } else if (utils.isObject(v)) {
51
- v = JSON.stringify(v);
52
- }
53
- parts.push(encode(key) + '=' + encode(v));
54
- });
55
- });
38
+ var serializeFn = options && options.serialize;
56
39
 
57
- serializedParams = parts.join('&');
40
+ var serializedParams;
41
+
42
+ if (serializeFn) {
43
+ serializedParams = serializeFn(params, options);
44
+ } else {
45
+ serializedParams = utils.isURLSearchParams(params) ?
46
+ params.toString() :
47
+ new AxiosURLSearchParams(params, options).toString(_encode);
58
48
  }
59
49
 
60
50
  if (serializedParams) {
61
- var hashmarkIndex = url.indexOf('#');
62
- if (hashmarkIndex !== -1) {
63
- url = url.slice(0, hashmarkIndex);
64
- }
65
-
66
51
  url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
67
52
  }
68
53
 
@@ -9,6 +9,6 @@
9
9
  */
10
10
  module.exports = function combineURLs(baseURL, relativeURL) {
11
11
  return relativeURL
12
- ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
12
+ ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '')
13
13
  : baseURL;
14
14
  };
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ var utils = require('../utils');
4
+
5
+ function parsePropPath(name) {
6
+ // foo[x][y][z]
7
+ // foo.x.y.z
8
+ // foo-x-y-z
9
+ // foo x y z
10
+ return utils.matchAll(/\w+|\[(\w*)]/g, name).map(function(match) {
11
+ return match[0] === '[]' ? '' : match[1] || match[0];
12
+ });
13
+ }
14
+
15
+ function arrayToObject(arr) {
16
+ var obj = {};
17
+ var keys = Object.keys(arr);
18
+ var i;
19
+ var len = keys.length;
20
+ var key;
21
+ for (i = 0; i < len; i++) {
22
+ key = keys[i];
23
+ obj[key] = arr[key];
24
+ }
25
+ return obj;
26
+ }
27
+
28
+ function formDataToJSON(formData) {
29
+ function buildPath(path, value, target, index) {
30
+ var name = path[index++];
31
+
32
+ if (name === '__proto__') return true;
33
+
34
+ var isNumericKey = Number.isFinite(+name);
35
+ var isLast = index >= path.length;
36
+ name = !name && utils.isArray(target) ? target.length : name;
37
+
38
+ if (isLast) {
39
+ if (utils.hasOwnProperty(target, name)) {
40
+ target[name] = [target[name], value];
41
+ } else {
42
+ target[name] = value;
43
+ }
44
+
45
+ return !isNumericKey;
46
+ }
47
+
48
+ if (!target[name] || !utils.isObject(target[name])) {
49
+ target[name] = [];
50
+ }
51
+
52
+ var result = buildPath(path, value, target[name], index);
53
+
54
+ if (result && utils.isArray(target[name])) {
55
+ target[name] = arrayToObject(target[name]);
56
+ }
57
+
58
+ return !isNumericKey;
59
+ }
60
+
61
+ if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
62
+ var obj = {};
63
+
64
+ utils.forEachEntry(formData, function(name, value) {
65
+ buildPath(parsePropPath(name), value, obj, 0);
66
+ });
67
+
68
+ return obj;
69
+ }
70
+
71
+ return null;
72
+ }
73
+
74
+ module.exports = formDataToJSON;
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ var AxiosError = require('../core/AxiosError');
4
+ var parseProtocol = require('./parseProtocol');
5
+ var platform = require('../platform');
6
+
7
+ var DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
8
+
9
+ /**
10
+ * Parse data uri to a Buffer or Blob
11
+ * @param {String} uri
12
+ * @param {?Boolean} asBlob
13
+ * @param {?Object} options
14
+ * @param {?Function} options.Blob
15
+ * @returns {Buffer|Blob}
16
+ */
17
+ module.exports = function fromDataURI(uri, asBlob, options) {
18
+ var _Blob = options && options.Blob || platform.classes.Blob;
19
+ var protocol = parseProtocol(uri);
20
+
21
+ if (asBlob === undefined && _Blob) {
22
+ asBlob = true;
23
+ }
24
+
25
+ if (protocol === 'data') {
26
+ uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
27
+
28
+ var match = DATA_URL_PATTERN.exec(uri);
29
+
30
+ if (!match) {
31
+ throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
32
+ }
33
+
34
+ var mime = match[1];
35
+ var isBase64 = match[2];
36
+ var body = match[3];
37
+ var buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');
38
+
39
+ if (asBlob) {
40
+ if (!_Blob) {
41
+ throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
42
+ }
43
+
44
+ return new _Blob([buffer], {type: mime});
45
+ }
46
+
47
+ return buffer;
48
+ }
49
+
50
+ throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
51
+ };
@@ -10,5 +10,5 @@ module.exports = function isAbsoluteURL(url) {
10
10
  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
11
11
  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
12
12
  // by any combination of letters, digits, plus, period, or hyphen.
13
- return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
13
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
14
14
  };
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ var utils = require('./../utils');
4
+
3
5
  /**
4
6
  * Determines whether the payload is an error thrown by Axios
5
7
  *
@@ -7,5 +9,5 @@
7
9
  * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
8
10
  */
9
11
  module.exports = function isAxiosError(payload) {
10
- return (typeof payload === 'object') && (payload.isAxiosError === true);
12
+ return utils.isObject(payload) && (payload.isAxiosError === true);
11
13
  };