axios 0.27.2 → 0.28.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 +121 -58
- package/README.md +271 -80
- package/SECURITY.md +3 -3
- package/UPGRADE_GUIDE.md +16 -15
- package/bin/check-build-version.js +19 -0
- package/bin/ssl_hotfix.js +22 -0
- package/dist/axios.js +1993 -2226
- package/dist/axios.js.map +1 -0
- package/dist/axios.min.js +2 -3
- package/dist/axios.min.js.map +1 -0
- package/dist/esm/axios.js +2354 -0
- package/dist/esm/axios.js.map +1 -0
- package/dist/esm/axios.min.js +2 -0
- package/dist/esm/axios.min.js.map +1 -0
- package/index.d.ts +104 -19
- package/lib/adapters/http.js +153 -114
- package/lib/adapters/xhr.js +14 -10
- package/lib/axios.js +5 -1
- package/lib/cancel/CancelToken.js +4 -5
- package/lib/cancel/CanceledError.js +4 -2
- package/lib/core/Axios.js +6 -1
- package/lib/core/AxiosError.js +12 -1
- package/lib/core/InterceptorManager.js +9 -0
- package/lib/core/dispatchRequest.js +7 -0
- package/lib/core/mergeConfig.js +3 -0
- package/lib/core/transformData.js +3 -2
- package/lib/defaults/index.js +42 -13
- package/lib/env/data.js +1 -1
- package/lib/helpers/AxiosURLSearchParams.js +42 -0
- package/lib/helpers/bind.js +1 -5
- package/lib/helpers/buildURL.js +14 -37
- package/lib/helpers/formDataToJSON.js +71 -0
- package/lib/helpers/fromDataURI.js +51 -0
- package/lib/helpers/isURLSameOrigin.js +12 -12
- package/lib/helpers/parseHeaders.js +2 -2
- package/lib/helpers/toFormData.js +141 -34
- package/lib/helpers/toURLEncodedForm.js +18 -0
- package/lib/platform/browser/classes/FormData.js +3 -0
- package/lib/platform/browser/classes/URLSearchParams.js +5 -0
- package/lib/platform/browser/index.js +11 -0
- package/lib/platform/index.js +3 -0
- package/lib/platform/node/classes/FormData.js +3 -0
- package/lib/platform/node/classes/URLSearchParams.js +5 -0
- package/lib/platform/node/index.js +11 -0
- package/lib/utils.js +68 -16
- package/package.json +19 -6
- package/rollup.config.js +60 -0
- package/dist/axios.map +0 -1
- package/dist/axios.min.map +0 -1
- /package/lib/{defaults/env → env/classes}/FormData.js +0 -0
@@ -8,14 +8,15 @@ var defaults = require('../defaults');
|
|
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;
|
package/lib/defaults/index.js
CHANGED
@@ -5,6 +5,9 @@ var normalizeHeaderName = require('../helpers/normalizeHeaderName');
|
|
5
5
|
var AxiosError = require('../core/AxiosError');
|
6
6
|
var transitionalDefaults = require('./transitional');
|
7
7
|
var toFormData = require('../helpers/toFormData');
|
8
|
+
var toURLEncodedForm = require('../helpers/toURLEncodedForm');
|
9
|
+
var platform = require('../platform');
|
10
|
+
var formDataToJSON = require('../helpers/formDataToJSON');
|
8
11
|
|
9
12
|
var DEFAULT_CONTENT_TYPE = {
|
10
13
|
'Content-Type': 'application/x-www-form-urlencoded'
|
@@ -53,8 +56,21 @@ var defaults = {
|
|
53
56
|
normalizeHeaderName(headers, 'Accept');
|
54
57
|
normalizeHeaderName(headers, 'Content-Type');
|
55
58
|
|
56
|
-
|
57
|
-
|
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) ||
|
58
74
|
utils.isBuffer(data) ||
|
59
75
|
utils.isStream(data) ||
|
60
76
|
utils.isFile(data) ||
|
@@ -70,15 +86,25 @@ var defaults = {
|
|
70
86
|
return data.toString();
|
71
87
|
}
|
72
88
|
|
73
|
-
var isObjectPayload = utils.isObject(data);
|
74
|
-
var contentType = headers && headers['Content-Type'];
|
75
|
-
|
76
89
|
var isFileList;
|
77
90
|
|
78
|
-
if (
|
79
|
-
|
80
|
-
|
81
|
-
|
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 ) {
|
82
108
|
setContentTypeIfUnset(headers, 'application/json');
|
83
109
|
return stringifySafely(data);
|
84
110
|
}
|
@@ -88,11 +114,13 @@ var defaults = {
|
|
88
114
|
|
89
115
|
transformResponse: [function transformResponse(data) {
|
90
116
|
var transitional = this.transitional || defaults.transitional;
|
91
|
-
var silentJSONParsing = transitional && transitional.silentJSONParsing;
|
92
117
|
var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
|
93
|
-
var
|
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;
|
94
123
|
|
95
|
-
if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {
|
96
124
|
try {
|
97
125
|
return JSON.parse(data);
|
98
126
|
} catch (e) {
|
@@ -121,7 +149,8 @@ var defaults = {
|
|
121
149
|
maxBodyLength: -1,
|
122
150
|
|
123
151
|
env: {
|
124
|
-
FormData:
|
152
|
+
FormData: platform.classes.FormData,
|
153
|
+
Blob: platform.classes.Blob
|
125
154
|
},
|
126
155
|
|
127
156
|
validateStatus: function validateStatus(status) {
|
package/lib/env/data.js
CHANGED
@@ -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;
|
package/lib/helpers/bind.js
CHANGED
@@ -2,10 +2,6 @@
|
|
2
2
|
|
3
3
|
module.exports = function bind(fn, thisArg) {
|
4
4
|
return function wrap() {
|
5
|
-
|
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
|
};
|
package/lib/helpers/buildURL.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
|
-
var utils = require('
|
3
|
+
var utils = require('../utils');
|
4
|
+
var AxiosURLSearchParams = require('../helpers/AxiosURLSearchParams');
|
4
5
|
|
5
6
|
function encode(val) {
|
6
7
|
return encodeURIComponent(val).
|
@@ -17,53 +18,29 @@ 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,
|
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
|
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
|
-
|
37
|
-
|
38
|
-
return;
|
39
|
-
}
|
40
|
-
|
41
|
-
if (utils.isArray(val)) {
|
42
|
-
key = key + '[]';
|
43
|
-
} else {
|
44
|
-
val = [val];
|
45
|
-
}
|
46
|
-
|
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
|
-
});
|
56
|
-
|
57
|
-
serializedParams = parts.join('&');
|
32
|
+
if (hashmarkIndex !== -1) {
|
33
|
+
url = url.slice(0, hashmarkIndex);
|
58
34
|
}
|
59
35
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
36
|
+
var _encode = options && options.encode || encode;
|
37
|
+
|
38
|
+
var serializerParams = utils.isURLSearchParams(params) ?
|
39
|
+
params.toString() :
|
40
|
+
new AxiosURLSearchParams(params, options).toString(_encode);
|
65
41
|
|
66
|
-
|
42
|
+
if (serializerParams) {
|
43
|
+
url += (url.indexOf('?') === -1 ? '?' : '&') + serializerParams;
|
67
44
|
}
|
68
45
|
|
69
46
|
return url;
|
@@ -0,0 +1,71 @@
|
|
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
|
+
var isNumericKey = Number.isFinite(+name);
|
32
|
+
var isLast = index >= path.length;
|
33
|
+
name = !name && utils.isArray(target) ? target.length : name;
|
34
|
+
|
35
|
+
if (isLast) {
|
36
|
+
if (utils.hasOwnProperty(target, name)) {
|
37
|
+
target[name] = [target[name], value];
|
38
|
+
} else {
|
39
|
+
target[name] = value;
|
40
|
+
}
|
41
|
+
|
42
|
+
return !isNumericKey;
|
43
|
+
}
|
44
|
+
|
45
|
+
if (!target[name] || !utils.isObject(target[name])) {
|
46
|
+
target[name] = [];
|
47
|
+
}
|
48
|
+
|
49
|
+
var result = buildPath(path, value, target[name], index);
|
50
|
+
|
51
|
+
if (result && utils.isArray(target[name])) {
|
52
|
+
target[name] = arrayToObject(target[name]);
|
53
|
+
}
|
54
|
+
|
55
|
+
return !isNumericKey;
|
56
|
+
}
|
57
|
+
|
58
|
+
if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {
|
59
|
+
var obj = {};
|
60
|
+
|
61
|
+
utils.forEachEntry(formData, function(name, value) {
|
62
|
+
buildPath(parsePropPath(name), value, obj, 0);
|
63
|
+
});
|
64
|
+
|
65
|
+
return obj;
|
66
|
+
}
|
67
|
+
|
68
|
+
return null;
|
69
|
+
}
|
70
|
+
|
71
|
+
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
|
+
};
|
@@ -13,16 +13,16 @@ module.exports = (
|
|
13
13
|
var originURL;
|
14
14
|
|
15
15
|
/**
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
* Parse a URL to discover it's components
|
17
|
+
*
|
18
|
+
* @param {String} url The URL to be parsed
|
19
|
+
* @returns {Object}
|
20
|
+
*/
|
21
21
|
function resolveURL(url) {
|
22
22
|
var href = url;
|
23
23
|
|
24
24
|
if (msie) {
|
25
|
-
|
25
|
+
// IE needs attribute set twice to normalize properties
|
26
26
|
urlParsingNode.setAttribute('href', href);
|
27
27
|
href = urlParsingNode.href;
|
28
28
|
}
|
@@ -47,11 +47,11 @@ module.exports = (
|
|
47
47
|
originURL = resolveURL(window.location.href);
|
48
48
|
|
49
49
|
/**
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
* Determine if a URL shares the same origin as the current location
|
51
|
+
*
|
52
|
+
* @param {String} requestURL The URL to test
|
53
|
+
* @returns {boolean} True if URL shares the same origin, otherwise false
|
54
|
+
*/
|
55
55
|
return function isURLSameOrigin(requestURL) {
|
56
56
|
var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
|
57
57
|
return (parsed.protocol === originURL.protocol &&
|
@@ -59,7 +59,7 @@ module.exports = (
|
|
59
59
|
};
|
60
60
|
})() :
|
61
61
|
|
62
|
-
|
62
|
+
// Non standard browser envs (web workers, react-native) lack needed support.
|
63
63
|
(function nonStandardBrowserEnv() {
|
64
64
|
return function isURLSameOrigin() {
|
65
65
|
return true;
|
@@ -34,8 +34,8 @@ module.exports = function parseHeaders(headers) {
|
|
34
34
|
|
35
35
|
utils.forEach(headers.split('\n'), function parser(line) {
|
36
36
|
i = line.indexOf(':');
|
37
|
-
key = utils.trim(line.
|
38
|
-
val = utils.trim(line.
|
37
|
+
key = utils.trim(line.slice(0, i)).toLowerCase();
|
38
|
+
val = utils.trim(line.slice(i + 1));
|
39
39
|
|
40
40
|
if (key) {
|
41
41
|
if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
|
@@ -1,19 +1,79 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
3
|
var utils = require('../utils');
|
4
|
+
var AxiosError = require('../core/AxiosError');
|
5
|
+
var envFormData = require('../env/classes/FormData');
|
6
|
+
|
7
|
+
function isVisitable(thing) {
|
8
|
+
return utils.isPlainObject(thing) || utils.isArray(thing);
|
9
|
+
}
|
10
|
+
|
11
|
+
function removeBrackets(key) {
|
12
|
+
return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;
|
13
|
+
}
|
14
|
+
|
15
|
+
function renderKey(path, key, dots) {
|
16
|
+
if (!path) return key;
|
17
|
+
return path.concat(key).map(function each(token, i) {
|
18
|
+
// eslint-disable-next-line no-param-reassign
|
19
|
+
token = removeBrackets(token);
|
20
|
+
return !dots && i ? '[' + token + ']' : token;
|
21
|
+
}).join(dots ? '.' : '');
|
22
|
+
}
|
23
|
+
|
24
|
+
function isFlatArray(arr) {
|
25
|
+
return utils.isArray(arr) && !arr.some(isVisitable);
|
26
|
+
}
|
27
|
+
|
28
|
+
var predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {
|
29
|
+
return /^is[A-Z]/.test(prop);
|
30
|
+
});
|
31
|
+
|
32
|
+
function isSpecCompliant(thing) {
|
33
|
+
return thing && utils.isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator];
|
34
|
+
}
|
4
35
|
|
5
36
|
/**
|
6
37
|
* Convert a data object to FormData
|
7
38
|
* @param {Object} obj
|
8
39
|
* @param {?Object} [formData]
|
40
|
+
* @param {?Object} [options]
|
41
|
+
* @param {Function} [options.visitor]
|
42
|
+
* @param {Boolean} [options.metaTokens = true]
|
43
|
+
* @param {Boolean} [options.dots = false]
|
44
|
+
* @param {?Boolean} [options.indexes = false]
|
9
45
|
* @returns {Object}
|
10
46
|
**/
|
11
47
|
|
12
|
-
function toFormData(obj, formData) {
|
48
|
+
function toFormData(obj, formData, options) {
|
49
|
+
if (!utils.isObject(obj)) {
|
50
|
+
throw new TypeError('target must be an object');
|
51
|
+
}
|
52
|
+
|
13
53
|
// eslint-disable-next-line no-param-reassign
|
14
|
-
formData = formData || new FormData();
|
54
|
+
formData = formData || new (envFormData || FormData)();
|
15
55
|
|
16
|
-
|
56
|
+
// eslint-disable-next-line no-param-reassign
|
57
|
+
options = utils.toFlatObject(options, {
|
58
|
+
metaTokens: true,
|
59
|
+
dots: false,
|
60
|
+
indexes: false
|
61
|
+
}, false, function defined(option, source) {
|
62
|
+
// eslint-disable-next-line no-eq-null,eqeqeq
|
63
|
+
return !utils.isUndefined(source[option]);
|
64
|
+
});
|
65
|
+
|
66
|
+
var metaTokens = options.metaTokens;
|
67
|
+
// eslint-disable-next-line no-use-before-define
|
68
|
+
var visitor = options.visitor || defaultVisitor;
|
69
|
+
var dots = options.dots;
|
70
|
+
var indexes = options.indexes;
|
71
|
+
var _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
|
72
|
+
var useBlob = _Blob && isSpecCompliant(formData);
|
73
|
+
|
74
|
+
if (!utils.isFunction(visitor)) {
|
75
|
+
throw new TypeError('visitor must be a function');
|
76
|
+
}
|
17
77
|
|
18
78
|
function convertValue(value) {
|
19
79
|
if (value === null) return '';
|
@@ -22,46 +82,93 @@ function toFormData(obj, formData) {
|
|
22
82
|
return value.toISOString();
|
23
83
|
}
|
24
84
|
|
85
|
+
if (!useBlob && utils.isBlob(value)) {
|
86
|
+
throw new AxiosError('Blob is not supported. Use a Buffer instead.');
|
87
|
+
}
|
88
|
+
|
25
89
|
if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {
|
26
|
-
return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
|
90
|
+
return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
|
27
91
|
}
|
28
92
|
|
29
93
|
return value;
|
30
94
|
}
|
31
95
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
96
|
+
/**
|
97
|
+
*
|
98
|
+
* @param {*} value
|
99
|
+
* @param {String|Number} key
|
100
|
+
* @param {Array<String|Number>} path
|
101
|
+
* @this {FormData}
|
102
|
+
* @returns {boolean} return true to visit the each prop of the value recursively
|
103
|
+
*/
|
104
|
+
function defaultVisitor(value, key, path) {
|
105
|
+
var arr = value;
|
106
|
+
|
107
|
+
if (value && !path && typeof value === 'object') {
|
108
|
+
if (utils.endsWith(key, '{}')) {
|
109
|
+
// eslint-disable-next-line no-param-reassign
|
110
|
+
key = metaTokens ? key : key.slice(0, -2);
|
111
|
+
// eslint-disable-next-line no-param-reassign
|
112
|
+
value = JSON.stringify(value);
|
113
|
+
} else if (
|
114
|
+
(utils.isArray(value) && isFlatArray(value)) ||
|
115
|
+
(utils.isFileList(value) || utils.endsWith(key, '[]') && (arr = utils.toArray(value))
|
116
|
+
)) {
|
117
|
+
// eslint-disable-next-line no-param-reassign
|
118
|
+
key = removeBrackets(key);
|
119
|
+
|
120
|
+
arr.forEach(function each(el, index) {
|
121
|
+
!utils.isUndefined(el) && formData.append(
|
122
|
+
// eslint-disable-next-line no-nested-ternary
|
123
|
+
indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
|
124
|
+
convertValue(el)
|
125
|
+
);
|
126
|
+
});
|
127
|
+
return false;
|
36
128
|
}
|
129
|
+
}
|
37
130
|
|
38
|
-
|
39
|
-
|
40
|
-
utils.forEach(data, function each(value, key) {
|
41
|
-
if (utils.isUndefined(value)) return;
|
42
|
-
var fullKey = parentKey ? parentKey + '.' + key : key;
|
43
|
-
var arr;
|
44
|
-
|
45
|
-
if (value && !parentKey && typeof value === 'object') {
|
46
|
-
if (utils.endsWith(key, '{}')) {
|
47
|
-
// eslint-disable-next-line no-param-reassign
|
48
|
-
value = JSON.stringify(value);
|
49
|
-
} else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {
|
50
|
-
// eslint-disable-next-line func-names
|
51
|
-
arr.forEach(function(el) {
|
52
|
-
!utils.isUndefined(el) && formData.append(fullKey, convertValue(el));
|
53
|
-
});
|
54
|
-
return;
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
build(value, fullKey);
|
59
|
-
});
|
60
|
-
|
61
|
-
stack.pop();
|
62
|
-
} else {
|
63
|
-
formData.append(parentKey, convertValue(data));
|
131
|
+
if (isVisitable(value)) {
|
132
|
+
return true;
|
64
133
|
}
|
134
|
+
|
135
|
+
formData.append(renderKey(path, key, dots), convertValue(value));
|
136
|
+
|
137
|
+
return false;
|
138
|
+
}
|
139
|
+
|
140
|
+
var stack = [];
|
141
|
+
|
142
|
+
var exposedHelpers = Object.assign(predicates, {
|
143
|
+
defaultVisitor: defaultVisitor,
|
144
|
+
convertValue: convertValue,
|
145
|
+
isVisitable: isVisitable
|
146
|
+
});
|
147
|
+
|
148
|
+
function build(value, path) {
|
149
|
+
if (utils.isUndefined(value)) return;
|
150
|
+
|
151
|
+
if (stack.indexOf(value) !== -1) {
|
152
|
+
throw Error('Circular reference detected in ' + path.join('.'));
|
153
|
+
}
|
154
|
+
|
155
|
+
stack.push(value);
|
156
|
+
|
157
|
+
utils.forEach(value, function each(el, key) {
|
158
|
+
var result = !utils.isUndefined(el) && visitor.call(
|
159
|
+
formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers
|
160
|
+
);
|
161
|
+
|
162
|
+
if (result === true) {
|
163
|
+
build(el, path ? path.concat(key) : [key]);
|
164
|
+
}
|
165
|
+
});
|
166
|
+
|
167
|
+
stack.pop();
|
168
|
+
}
|
169
|
+
|
170
|
+
if (!utils.isObject(obj)) {
|
171
|
+
throw new TypeError('data must be an object');
|
65
172
|
}
|
66
173
|
|
67
174
|
build(obj);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
var utils = require('../utils');
|
4
|
+
var toFormData = require('./toFormData');
|
5
|
+
var platform = require('../platform/');
|
6
|
+
|
7
|
+
module.exports = function toURLEncodedForm(data, options) {
|
8
|
+
return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
|
9
|
+
visitor: function(value, key, path, helpers) {
|
10
|
+
if (platform.isNode && utils.isBuffer(value)) {
|
11
|
+
this.append(key, value.toString('base64'));
|
12
|
+
return false;
|
13
|
+
}
|
14
|
+
|
15
|
+
return helpers.defaultVisitor.apply(this, arguments);
|
16
|
+
}
|
17
|
+
}, options));
|
18
|
+
};
|