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.
- package/CHANGELOG.md +115 -8
- package/README.md +97 -5
- package/SECURITY.md +5 -0
- package/dist/axios.js +2102 -1583
- package/dist/axios.map +1 -1
- package/dist/axios.min.js +1 -2
- package/dist/axios.min.map +1 -1
- package/index.d.ts +35 -21
- package/lib/adapters/http.js +74 -14
- package/lib/adapters/xhr.js +65 -32
- package/lib/axios.js +6 -5
- package/lib/cancel/CancelToken.js +62 -0
- package/lib/core/Axios.js +60 -7
- package/lib/core/InterceptorManager.js +4 -2
- package/lib/core/README.md +1 -0
- package/lib/core/dispatchRequest.js +11 -3
- package/lib/core/enhanceError.js +2 -1
- package/lib/core/mergeConfig.js +50 -38
- package/lib/core/transformData.js +3 -1
- package/lib/defaults.js +48 -12
- package/lib/env/README.md +3 -0
- package/lib/env/data.js +3 -0
- package/lib/helpers/validator.js +82 -0
- package/lib/utils.js +1 -3
- package/package.json +23 -23
@@ -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
|
package/lib/core/enhanceError.js
CHANGED
@@ -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;
|
package/lib/core/mergeConfig.js
CHANGED
@@ -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
|
-
|
32
|
+
return getMergedValue(config1[prop], config2[prop]);
|
43
33
|
} else if (!utils.isUndefined(config1[prop])) {
|
44
|
-
|
34
|
+
return getMergedValue(undefined, config1[prop]);
|
45
35
|
}
|
46
36
|
}
|
47
37
|
|
48
|
-
|
38
|
+
// eslint-disable-next-line consistent-return
|
39
|
+
function valueFromConfig2(prop) {
|
49
40
|
if (!utils.isUndefined(config2[prop])) {
|
50
|
-
|
41
|
+
return getMergedValue(undefined, config2[prop]);
|
51
42
|
}
|
52
|
-
}
|
53
|
-
|
54
|
-
utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
|
43
|
+
}
|
55
44
|
|
56
|
-
|
45
|
+
// eslint-disable-next-line consistent-return
|
46
|
+
function defaultToConfig2(prop) {
|
57
47
|
if (!utils.isUndefined(config2[prop])) {
|
58
|
-
|
48
|
+
return getMergedValue(undefined, config2[prop]);
|
59
49
|
} else if (!utils.isUndefined(config1[prop])) {
|
60
|
-
|
50
|
+
return getMergedValue(undefined, config1[prop]);
|
61
51
|
}
|
62
|
-
}
|
52
|
+
}
|
63
53
|
|
64
|
-
|
54
|
+
// eslint-disable-next-line consistent-return
|
55
|
+
function mergeDirectKeys(prop) {
|
65
56
|
if (prop in config2) {
|
66
|
-
|
57
|
+
return getMergedValue(config1[prop], config2[prop]);
|
67
58
|
} else if (prop in config1) {
|
68
|
-
|
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
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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(
|
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
|
52
|
-
return
|
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
|
-
|
59
|
-
|
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
|
-
|
62
|
-
} catch (e) {
|
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
|
-
|
85
|
-
|
86
|
-
|
119
|
+
headers: {
|
120
|
+
common: {
|
121
|
+
'Accept': 'application/json, text/plain, */*'
|
122
|
+
}
|
87
123
|
}
|
88
124
|
};
|
89
125
|
|
package/lib/env/data.js
ADDED
@@ -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.
|
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.
|
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
|
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 &&
|
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://
|
34
|
+
"homepage": "https://axios-http.com",
|
34
35
|
"devDependencies": {
|
35
|
-
"
|
36
|
+
"abortcontroller-polyfill": "^1.5.0",
|
36
37
|
"coveralls": "^3.0.0",
|
37
38
|
"es6-promise": "^4.2.4",
|
38
|
-
"grunt": "^1.0
|
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": "^
|
44
|
-
"grunt-karma": "^
|
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": "^
|
48
|
+
"grunt-webpack": "^4.0.2",
|
48
49
|
"istanbul-instrumenter-loader": "^1.0.0",
|
49
50
|
"jasmine-core": "^2.4.1",
|
50
|
-
"karma": "^
|
51
|
-
"karma-chrome-launcher": "^
|
52
|
-
"karma-
|
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": "^
|
57
|
+
"karma-sauce-launcher": "^4.3.6",
|
59
58
|
"karma-sinon": "^1.0.5",
|
60
|
-
"karma-sourcemap-loader": "^0.3.
|
61
|
-
"karma-webpack": "^
|
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": "^
|
63
|
+
"mocha": "^8.2.1",
|
65
64
|
"sinon": "^4.5.0",
|
66
|
-
"
|
65
|
+
"terser-webpack-plugin": "^4.2.3",
|
66
|
+
"typescript": "^4.0.5",
|
67
67
|
"url-search-params": "^0.10.0",
|
68
|
-
"webpack": "^
|
69
|
-
"webpack-dev-server": "^
|
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.
|
78
|
+
"follow-redirects": "^1.14.4"
|
79
79
|
},
|
80
80
|
"bundlesize": [
|
81
81
|
{
|