axios 0.21.1 → 0.22.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.
@@ -4,6 +4,7 @@ var utils = require('./../utils');
4
4
  var transformData = require('./transformData');
5
5
  var isCancel = require('../cancel/isCancel');
6
6
  var defaults = require('../defaults');
7
+ var Cancel = require('../cancel/Cancel');
7
8
 
8
9
  /**
9
10
  * Throws a `Cancel` if cancellation has been requested.
@@ -12,6 +13,10 @@ function throwIfCancellationRequested(config) {
12
13
  if (config.cancelToken) {
13
14
  config.cancelToken.throwIfRequested();
14
15
  }
16
+
17
+ if (config.signal && config.signal.aborted) {
18
+ throw new Cancel('canceled');
19
+ }
15
20
  }
16
21
 
17
22
  /**
@@ -27,7 +32,8 @@ module.exports = function dispatchRequest(config) {
27
32
  config.headers = config.headers || {};
28
33
 
29
34
  // Transform request data
30
- config.data = transformData(
35
+ config.data = transformData.call(
36
+ config,
31
37
  config.data,
32
38
  config.headers,
33
39
  config.transformRequest
@@ -53,7 +59,8 @@ module.exports = function dispatchRequest(config) {
53
59
  throwIfCancellationRequested(config);
54
60
 
55
61
  // Transform response data
56
- response.data = transformData(
62
+ response.data = transformData.call(
63
+ config,
57
64
  response.data,
58
65
  response.headers,
59
66
  config.transformResponse
@@ -66,7 +73,8 @@ module.exports = function dispatchRequest(config) {
66
73
 
67
74
  // Transform response data
68
75
  if (reason && reason.response) {
69
- reason.response.data = transformData(
76
+ reason.response.data = transformData.call(
77
+ config,
70
78
  reason.response.data,
71
79
  reason.response.headers,
72
80
  config.transformResponse
@@ -35,7 +35,8 @@ module.exports = function enhanceError(error, config, code, request, response) {
35
35
  stack: this.stack,
36
36
  // Axios
37
37
  config: this.config,
38
- code: this.code
38
+ code: this.code,
39
+ status: this.response && this.response.status ? this.response.status : null
39
40
  };
40
41
  };
41
42
  return error;
@@ -15,17 +15,6 @@ 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);
@@ -37,51 +26,74 @@ module.exports = function mergeConfig(config1, config2) {
37
26
  return source;
38
27
  }
39
28
 
29
+ // eslint-disable-next-line consistent-return
40
30
  function mergeDeepProperties(prop) {
41
31
  if (!utils.isUndefined(config2[prop])) {
42
- config[prop] = getMergedValue(config1[prop], config2[prop]);
32
+ return getMergedValue(config1[prop], config2[prop]);
43
33
  } else if (!utils.isUndefined(config1[prop])) {
44
- config[prop] = getMergedValue(undefined, config1[prop]);
34
+ return getMergedValue(undefined, config1[prop]);
45
35
  }
46
36
  }
47
37
 
48
- utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
38
+ // eslint-disable-next-line consistent-return
39
+ function valueFromConfig2(prop) {
49
40
  if (!utils.isUndefined(config2[prop])) {
50
- config[prop] = getMergedValue(undefined, config2[prop]);
41
+ return getMergedValue(undefined, config2[prop]);
51
42
  }
52
- });
53
-
54
- utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
43
+ }
55
44
 
56
- utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
45
+ // eslint-disable-next-line consistent-return
46
+ function defaultToConfig2(prop) {
57
47
  if (!utils.isUndefined(config2[prop])) {
58
- config[prop] = getMergedValue(undefined, config2[prop]);
48
+ return getMergedValue(undefined, config2[prop]);
59
49
  } else if (!utils.isUndefined(config1[prop])) {
60
- config[prop] = getMergedValue(undefined, config1[prop]);
50
+ return getMergedValue(undefined, config1[prop]);
61
51
  }
62
- });
52
+ }
63
53
 
64
- utils.forEach(directMergeKeys, function merge(prop) {
54
+ // eslint-disable-next-line consistent-return
55
+ function mergeDirectKeys(prop) {
65
56
  if (prop in config2) {
66
- config[prop] = getMergedValue(config1[prop], config2[prop]);
57
+ return getMergedValue(config1[prop], config2[prop]);
67
58
  } else if (prop in config1) {
68
- config[prop] = getMergedValue(undefined, config1[prop]);
59
+ return getMergedValue(undefined, config1[prop]);
69
60
  }
70
- });
71
-
72
- var axiosKeys = valueFromConfig2Keys
73
- .concat(mergeDeepPropertiesKeys)
74
- .concat(defaultToConfig2Keys)
75
- .concat(directMergeKeys);
61
+ }
76
62
 
77
- var otherKeys = Object
78
- .keys(config1)
79
- .concat(Object.keys(config2))
80
- .filter(function filterAxiosKeys(key) {
81
- return axiosKeys.indexOf(key) === -1;
82
- });
63
+ var mergeMap = {
64
+ 'url': valueFromConfig2,
65
+ 'method': valueFromConfig2,
66
+ 'data': valueFromConfig2,
67
+ 'baseURL': defaultToConfig2,
68
+ 'transformRequest': defaultToConfig2,
69
+ 'transformResponse': defaultToConfig2,
70
+ 'paramsSerializer': defaultToConfig2,
71
+ 'timeout': defaultToConfig2,
72
+ 'timeoutMessage': defaultToConfig2,
73
+ 'withCredentials': defaultToConfig2,
74
+ 'adapter': defaultToConfig2,
75
+ 'responseType': defaultToConfig2,
76
+ 'xsrfCookieName': defaultToConfig2,
77
+ 'xsrfHeaderName': defaultToConfig2,
78
+ 'onUploadProgress': defaultToConfig2,
79
+ 'onDownloadProgress': defaultToConfig2,
80
+ 'decompress': defaultToConfig2,
81
+ 'maxContentLength': defaultToConfig2,
82
+ 'maxBodyLength': defaultToConfig2,
83
+ 'transport': defaultToConfig2,
84
+ 'httpAgent': defaultToConfig2,
85
+ 'httpsAgent': defaultToConfig2,
86
+ 'cancelToken': defaultToConfig2,
87
+ 'socketPath': defaultToConfig2,
88
+ 'responseEncoding': defaultToConfig2,
89
+ 'validateStatus': mergeDirectKeys
90
+ };
83
91
 
84
- utils.forEach(otherKeys, mergeDeepProperties);
92
+ utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
93
+ var merge = mergeMap[prop] || mergeDeepProperties;
94
+ var configValue = merge(prop);
95
+ (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
96
+ });
85
97
 
86
98
  return config;
87
99
  };
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var utils = require('./../utils');
4
+ var defaults = require('./../defaults');
4
5
 
5
6
  /**
6
7
  * Transform the data for a request or a response
@@ -11,9 +12,10 @@ var utils = require('./../utils');
11
12
  * @returns {*} The resulting transformed data
12
13
  */
13
14
  module.exports = function transformData(data, headers, fns) {
15
+ var context = this || defaults;
14
16
  /*eslint no-param-reassign:0*/
15
17
  utils.forEach(fns, function transform(fn) {
16
- data = fn(data, headers);
18
+ data = fn.call(context, data, headers);
17
19
  });
18
20
 
19
21
  return data;
package/lib/defaults.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  var utils = require('./utils');
4
4
  var normalizeHeaderName = require('./helpers/normalizeHeaderName');
5
+ var enhanceError = require('./core/enhanceError');
5
6
 
6
7
  var DEFAULT_CONTENT_TYPE = {
7
8
  'Content-Type': 'application/x-www-form-urlencoded'
@@ -25,12 +26,35 @@ function getDefaultAdapter() {
25
26
  return adapter;
26
27
  }
27
28
 
29
+ function stringifySafely(rawValue, parser, encoder) {
30
+ if (utils.isString(rawValue)) {
31
+ try {
32
+ (parser || JSON.parse)(rawValue);
33
+ return utils.trim(rawValue);
34
+ } catch (e) {
35
+ if (e.name !== 'SyntaxError') {
36
+ throw e;
37
+ }
38
+ }
39
+ }
40
+
41
+ return (encoder || JSON.stringify)(rawValue);
42
+ }
43
+
28
44
  var defaults = {
45
+
46
+ transitional: {
47
+ silentJSONParsing: true,
48
+ forcedJSONParsing: true,
49
+ clarifyTimeoutError: false
50
+ },
51
+
29
52
  adapter: getDefaultAdapter(),
30
53
 
31
54
  transformRequest: [function transformRequest(data, headers) {
32
55
  normalizeHeaderName(headers, 'Accept');
33
56
  normalizeHeaderName(headers, 'Content-Type');
57
+
34
58
  if (utils.isFormData(data) ||
35
59
  utils.isArrayBuffer(data) ||
36
60
  utils.isBuffer(data) ||
@@ -47,20 +71,32 @@ var defaults = {
47
71
  setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
48
72
  return data.toString();
49
73
  }
50
- if (utils.isObject(data)) {
51
- setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
52
- return JSON.stringify(data);
74
+ if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {
75
+ setContentTypeIfUnset(headers, 'application/json');
76
+ return stringifySafely(data);
53
77
  }
54
78
  return data;
55
79
  }],
56
80
 
57
81
  transformResponse: [function transformResponse(data) {
58
- /*eslint no-param-reassign:0*/
59
- if (typeof data === 'string') {
82
+ var transitional = this.transitional || defaults.transitional;
83
+ var silentJSONParsing = transitional && transitional.silentJSONParsing;
84
+ var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
85
+ var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
86
+
87
+ if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
60
88
  try {
61
- data = JSON.parse(data);
62
- } catch (e) { /* Ignore */ }
89
+ return JSON.parse(data);
90
+ } catch (e) {
91
+ if (strictJSONParsing) {
92
+ if (e.name === 'SyntaxError') {
93
+ throw enhanceError(e, this, 'E_JSON_PARSE');
94
+ }
95
+ throw e;
96
+ }
97
+ }
63
98
  }
99
+
64
100
  return data;
65
101
  }],
66
102
 
@@ -78,12 +114,12 @@ var defaults = {
78
114
 
79
115
  validateStatus: function validateStatus(status) {
80
116
  return status >= 200 && status < 300;
81
- }
82
- };
117
+ },
83
118
 
84
- defaults.headers = {
85
- common: {
86
- 'Accept': 'application/json, text/plain, */*'
119
+ headers: {
120
+ common: {
121
+ 'Accept': 'application/json, text/plain, */*'
122
+ }
87
123
  }
88
124
  };
89
125
 
@@ -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,3 @@
1
+ module.exports = {
2
+ "version": "0.22.0"
3
+ };
@@ -0,0 +1,82 @@
1
+ 'use strict';
2
+
3
+ var VERSION = require('../env/data').version;
4
+
5
+ var validators = {};
6
+
7
+ // eslint-disable-next-line func-names
8
+ ['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {
9
+ validators[type] = function validator(thing) {
10
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
11
+ };
12
+ });
13
+
14
+ var deprecatedWarnings = {};
15
+
16
+ /**
17
+ * Transitional option validator
18
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
19
+ * @param {string?} version - deprecated version / removed since version
20
+ * @param {string?} message - some message with additional info
21
+ * @returns {function}
22
+ */
23
+ validators.transitional = function transitional(validator, version, message) {
24
+ function formatMessage(opt, desc) {
25
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
26
+ }
27
+
28
+ // eslint-disable-next-line func-names
29
+ return function(value, opt, opts) {
30
+ if (validator === false) {
31
+ throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));
32
+ }
33
+
34
+ if (version && !deprecatedWarnings[opt]) {
35
+ deprecatedWarnings[opt] = true;
36
+ // eslint-disable-next-line no-console
37
+ console.warn(
38
+ formatMessage(
39
+ opt,
40
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
41
+ )
42
+ );
43
+ }
44
+
45
+ return validator ? validator(value, opt, opts) : true;
46
+ };
47
+ };
48
+
49
+ /**
50
+ * Assert object's properties type
51
+ * @param {object} options
52
+ * @param {object} schema
53
+ * @param {boolean?} allowUnknown
54
+ */
55
+
56
+ function assertOptions(options, schema, allowUnknown) {
57
+ if (typeof options !== 'object') {
58
+ throw new TypeError('options must be an object');
59
+ }
60
+ var keys = Object.keys(options);
61
+ var i = keys.length;
62
+ while (i-- > 0) {
63
+ var opt = keys[i];
64
+ var validator = schema[opt];
65
+ if (validator) {
66
+ var value = options[opt];
67
+ var result = value === undefined || validator(value, opt, options);
68
+ if (result !== true) {
69
+ throw new TypeError('option ' + opt + ' must be ' + result);
70
+ }
71
+ continue;
72
+ }
73
+ if (allowUnknown !== true) {
74
+ throw Error('Unknown option ' + opt);
75
+ }
76
+ }
77
+ }
78
+
79
+ module.exports = {
80
+ assertOptions: assertOptions,
81
+ validators: validators
82
+ };
package/lib/utils.js CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  var bind = require('./helpers/bind');
4
4
 
5
- /*global toString:true*/
6
-
7
5
  // utils is a library of generic helper functions non-specific to axios
8
6
 
9
7
  var toString = Object.prototype.toString;
@@ -187,7 +185,7 @@ function isURLSearchParams(val) {
187
185
  * @returns {String} The String freed of excess whitespace
188
186
  */
189
187
  function trim(str) {
190
- return str.replace(/^\s*/, '').replace(/\s*$/, '');
188
+ return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
191
189
  }
192
190
 
193
191
  /**
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "axios",
3
- "version": "0.21.1",
3
+ "version": "0.22.0",
4
4
  "description": "Promise based HTTP client for the browser and node.js",
5
5
  "main": "index.js",
6
+ "types": "index.d.ts",
6
7
  "scripts": {
7
- "test": "grunt test && bundlesize",
8
+ "test": "grunt test",
8
9
  "start": "node ./sandbox/server.js",
9
10
  "build": "NODE_ENV=production grunt build",
10
- "preversion": "npm test",
11
- "version": "npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json",
11
+ "preversion": "grunt version && npm test",
12
+ "version": "npm run build && git add -A dist && git add CHANGELOG.md bower.json package.json",
12
13
  "postversion": "git push && git push --tags",
13
14
  "examples": "node ./examples/server.js",
14
15
  "coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
@@ -30,43 +31,42 @@
30
31
  "bugs": {
31
32
  "url": "https://github.com/axios/axios/issues"
32
33
  },
33
- "homepage": "https://github.com/axios/axios",
34
+ "homepage": "https://axios-http.com",
34
35
  "devDependencies": {
35
- "bundlesize": "^0.17.0",
36
+ "abortcontroller-polyfill": "^1.5.0",
36
37
  "coveralls": "^3.0.0",
37
38
  "es6-promise": "^4.2.4",
38
- "grunt": "^1.0.2",
39
+ "grunt": "^1.3.0",
39
40
  "grunt-banner": "^0.6.0",
40
41
  "grunt-cli": "^1.2.0",
41
42
  "grunt-contrib-clean": "^1.1.0",
42
43
  "grunt-contrib-watch": "^1.0.0",
43
- "grunt-eslint": "^20.1.0",
44
- "grunt-karma": "^2.0.0",
44
+ "grunt-eslint": "^23.0.0",
45
+ "grunt-karma": "^4.0.0",
45
46
  "grunt-mocha-test": "^0.13.3",
46
47
  "grunt-ts": "^6.0.0-beta.19",
47
- "grunt-webpack": "^1.0.18",
48
+ "grunt-webpack": "^4.0.2",
48
49
  "istanbul-instrumenter-loader": "^1.0.0",
49
50
  "jasmine-core": "^2.4.1",
50
- "karma": "^1.3.0",
51
- "karma-chrome-launcher": "^2.2.0",
52
- "karma-coverage": "^1.1.1",
53
- "karma-firefox-launcher": "^1.1.0",
51
+ "karma": "^6.3.2",
52
+ "karma-chrome-launcher": "^3.1.0",
53
+ "karma-firefox-launcher": "^2.1.0",
54
54
  "karma-jasmine": "^1.1.1",
55
55
  "karma-jasmine-ajax": "^0.1.13",
56
- "karma-opera-launcher": "^1.0.0",
57
56
  "karma-safari-launcher": "^1.0.0",
58
- "karma-sauce-launcher": "^1.2.0",
57
+ "karma-sauce-launcher": "^4.3.6",
59
58
  "karma-sinon": "^1.0.5",
60
- "karma-sourcemap-loader": "^0.3.7",
61
- "karma-webpack": "^1.7.0",
59
+ "karma-sourcemap-loader": "^0.3.8",
60
+ "karma-webpack": "^4.0.2",
62
61
  "load-grunt-tasks": "^3.5.2",
63
62
  "minimist": "^1.2.0",
64
- "mocha": "^5.2.0",
63
+ "mocha": "^8.2.1",
65
64
  "sinon": "^4.5.0",
66
- "typescript": "^2.8.1",
65
+ "terser-webpack-plugin": "^4.2.3",
66
+ "typescript": "^4.0.5",
67
67
  "url-search-params": "^0.10.0",
68
- "webpack": "^1.13.1",
69
- "webpack-dev-server": "^1.14.1"
68
+ "webpack": "^4.44.2",
69
+ "webpack-dev-server": "^3.11.0"
70
70
  },
71
71
  "browser": {
72
72
  "./lib/adapters/http.js": "./lib/adapters/xhr.js"
@@ -75,7 +75,7 @@
75
75
  "unpkg": "dist/axios.min.js",
76
76
  "typings": "./index.d.ts",
77
77
  "dependencies": {
78
- "follow-redirects": "^1.10.0"
78
+ "follow-redirects": "^1.14.4"
79
79
  },
80
80
  "bundlesize": [
81
81
  {