axios 1.6.7 → 1.7.0-beta.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.

Potentially problematic release.


This version of axios might be problematic. Click here for more details.

@@ -1,4 +1,4 @@
1
- // Axios v1.6.7 Copyright (c) 2024 Matt Zabriskie and contributors
1
+ // Axios v1.7.0-beta.0 Copyright (c) 2024 Matt Zabriskie and contributors
2
2
  'use strict';
3
3
 
4
4
  const FormData$1 = require('form-data');
@@ -10,7 +10,7 @@ const util = require('util');
10
10
  const followRedirects = require('follow-redirects');
11
11
  const zlib = require('zlib');
12
12
  const stream = require('stream');
13
- const EventEmitter = require('events');
13
+ const events = require('events');
14
14
 
15
15
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
16
16
 
@@ -22,7 +22,6 @@ const util__default = /*#__PURE__*/_interopDefaultLegacy(util);
22
22
  const followRedirects__default = /*#__PURE__*/_interopDefaultLegacy(followRedirects);
23
23
  const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib);
24
24
  const stream__default = /*#__PURE__*/_interopDefaultLegacy(stream);
25
- const EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
26
25
 
27
26
  function bind(fn, thisArg) {
28
27
  return function wrap() {
@@ -237,6 +236,8 @@ const isFormData = (thing) => {
237
236
  */
238
237
  const isURLSearchParams = kindOfTest('URLSearchParams');
239
238
 
239
+ const [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);
240
+
240
241
  /**
241
242
  * Trim excess whitespace off the beginning and end of a string
242
243
  *
@@ -625,8 +626,7 @@ const toObjectSet = (arrayOrString, delimiter) => {
625
626
  const noop = () => {};
626
627
 
627
628
  const toFiniteNumber = (value, defaultValue) => {
628
- value = +value;
629
- return Number.isFinite(value) ? value : defaultValue;
629
+ return value != null && Number.isFinite(value = +value) ? value : defaultValue;
630
630
  };
631
631
 
632
632
  const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
@@ -707,6 +707,10 @@ const utils$1 = {
707
707
  isBoolean,
708
708
  isObject,
709
709
  isPlainObject,
710
+ isReadableStream,
711
+ isRequest,
712
+ isResponse,
713
+ isHeaders,
710
714
  isUndefined,
711
715
  isDate,
712
716
  isFile,
@@ -1296,11 +1300,14 @@ const hasStandardBrowserWebWorkerEnv = (() => {
1296
1300
  );
1297
1301
  })();
1298
1302
 
1303
+ const origin = hasBrowserEnv && window.location.href || 'http://localhost';
1304
+
1299
1305
  const utils = /*#__PURE__*/Object.freeze({
1300
1306
  __proto__: null,
1301
1307
  hasBrowserEnv: hasBrowserEnv,
1302
1308
  hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
1303
- hasStandardBrowserEnv: hasStandardBrowserEnv
1309
+ hasStandardBrowserEnv: hasStandardBrowserEnv,
1310
+ origin: origin
1304
1311
  });
1305
1312
 
1306
1313
  const platform = {
@@ -1440,7 +1447,7 @@ const defaults = {
1440
1447
 
1441
1448
  transitional: transitionalDefaults,
1442
1449
 
1443
- adapter: ['xhr', 'http'],
1450
+ adapter: ['xhr', 'http', 'fetch'],
1444
1451
 
1445
1452
  transformRequest: [function transformRequest(data, headers) {
1446
1453
  const contentType = headers.getContentType() || '';
@@ -1461,7 +1468,8 @@ const defaults = {
1461
1468
  utils$1.isBuffer(data) ||
1462
1469
  utils$1.isStream(data) ||
1463
1470
  utils$1.isFile(data) ||
1464
- utils$1.isBlob(data)
1471
+ utils$1.isBlob(data) ||
1472
+ utils$1.isReadableStream(data)
1465
1473
  ) {
1466
1474
  return data;
1467
1475
  }
@@ -1504,6 +1512,10 @@ const defaults = {
1504
1512
  const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
1505
1513
  const JSONRequested = this.responseType === 'json';
1506
1514
 
1515
+ if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {
1516
+ return data;
1517
+ }
1518
+
1507
1519
  if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
1508
1520
  const silentJSONParsing = transitional && transitional.silentJSONParsing;
1509
1521
  const strictJSONParsing = !silentJSONParsing && JSONRequested;
@@ -1707,6 +1719,10 @@ class AxiosHeaders {
1707
1719
  setHeaders(header, valueOrRewrite);
1708
1720
  } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
1709
1721
  setHeaders(parseHeaders(header), valueOrRewrite);
1722
+ } else if (utils$1.isHeaders(header)) {
1723
+ for (const [key, value] of header.entries()) {
1724
+ setHeader(value, key, rewrite);
1725
+ }
1710
1726
  } else {
1711
1727
  header != null && setHeader(valueOrRewrite, header, rewrite);
1712
1728
  }
@@ -2019,7 +2035,7 @@ function buildFullPath(baseURL, requestedURL) {
2019
2035
  return requestedURL;
2020
2036
  }
2021
2037
 
2022
- const VERSION = "1.6.7";
2038
+ const VERSION = "1.7.0-beta.0";
2023
2039
 
2024
2040
  function parseProtocol(url) {
2025
2041
  const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
@@ -2084,7 +2100,9 @@ function throttle(fn, freq) {
2084
2100
  let timestamp = 0;
2085
2101
  const threshold = 1000 / freq;
2086
2102
  let timer = null;
2087
- return function throttled(force, args) {
2103
+ return function throttled() {
2104
+ const force = this === true;
2105
+
2088
2106
  const now = Date.now();
2089
2107
  if (force || now - timestamp > threshold) {
2090
2108
  if (timer) {
@@ -2092,13 +2110,13 @@ function throttle(fn, freq) {
2092
2110
  timer = null;
2093
2111
  }
2094
2112
  timestamp = now;
2095
- return fn.apply(null, args);
2113
+ return fn.apply(null, arguments);
2096
2114
  }
2097
2115
  if (!timer) {
2098
2116
  timer = setTimeout(() => {
2099
2117
  timer = null;
2100
2118
  timestamp = Date.now();
2101
- return fn.apply(null, args);
2119
+ return fn.apply(null, arguments);
2102
2120
  }, threshold - (now - timestamp));
2103
2121
  }
2104
2122
  };
@@ -2216,19 +2234,20 @@ class AxiosTransformStream extends stream__default["default"].Transform{
2216
2234
 
2217
2235
  process.nextTick(() => {
2218
2236
  self.emit('progress', {
2219
- 'loaded': bytesTransferred,
2220
- 'total': totalBytes,
2221
- 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined,
2222
- 'bytes': progressBytes,
2223
- 'rate': rate ? rate : undefined,
2224
- 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ?
2225
- (totalBytes - bytesTransferred) / rate : undefined
2237
+ loaded: bytesTransferred,
2238
+ total: totalBytes,
2239
+ progress: totalBytes ? (bytesTransferred / totalBytes) : undefined,
2240
+ bytes: progressBytes,
2241
+ rate: rate ? rate : undefined,
2242
+ estimated: rate && totalBytes && bytesTransferred <= totalBytes ?
2243
+ (totalBytes - bytesTransferred) / rate : undefined,
2244
+ lengthComputable: totalBytes != null
2226
2245
  });
2227
2246
  });
2228
2247
  }, internals.ticksRate);
2229
2248
 
2230
2249
  const onFinish = () => {
2231
- internals.updateProgress(true);
2250
+ internals.updateProgress.call(true);
2232
2251
  };
2233
2252
 
2234
2253
  this.once('end', onFinish);
@@ -2662,7 +2681,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
2662
2681
  }
2663
2682
 
2664
2683
  // temporary internal emitter until the AxiosRequest class will be implemented
2665
- const emitter = new EventEmitter__default["default"]();
2684
+ const emitter = new events.EventEmitter();
2666
2685
 
2667
2686
  const onFinished = () => {
2668
2687
  if (config.cancelToken) {
@@ -3159,44 +3178,35 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
3159
3178
  });
3160
3179
  };
3161
3180
 
3162
- const cookies = platform.hasStandardBrowserEnv ?
3163
-
3164
- // Standard browser envs support document.cookie
3165
- {
3166
- write(name, value, expires, path, domain, secure) {
3167
- const cookie = [name + '=' + encodeURIComponent(value)];
3168
-
3169
- utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());
3170
-
3171
- utils$1.isString(path) && cookie.push('path=' + path);
3172
-
3173
- utils$1.isString(domain) && cookie.push('domain=' + domain);
3174
-
3175
- secure === true && cookie.push('secure');
3181
+ const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
3182
+ let bytesNotified = 0;
3183
+ const _speedometer = speedometer(50, 250);
3176
3184
 
3177
- document.cookie = cookie.join('; ');
3178
- },
3185
+ return throttle(e => {
3186
+ const loaded = e.loaded;
3187
+ const total = e.lengthComputable ? e.total : undefined;
3188
+ const progressBytes = loaded - bytesNotified;
3189
+ const rate = _speedometer(progressBytes);
3190
+ const inRange = loaded <= total;
3179
3191
 
3180
- read(name) {
3181
- const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
3182
- return (match ? decodeURIComponent(match[3]) : null);
3183
- },
3192
+ bytesNotified = loaded;
3184
3193
 
3185
- remove(name) {
3186
- this.write(name, '', Date.now() - 86400000);
3187
- }
3188
- }
3194
+ const data = {
3195
+ loaded,
3196
+ total,
3197
+ progress: total ? (loaded / total) : undefined,
3198
+ bytes: progressBytes,
3199
+ rate: rate ? rate : undefined,
3200
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
3201
+ event: e,
3202
+ lengthComputable: total != null
3203
+ };
3189
3204
 
3190
- :
3205
+ data[isDownloadStream ? 'download' : 'upload'] = true;
3191
3206
 
3192
- // Non-standard browser env (web workers, react-native) lack needed support.
3193
- {
3194
- write() {},
3195
- read() {
3196
- return null;
3197
- },
3198
- remove() {}
3199
- };
3207
+ listener(data);
3208
+ }, freq);
3209
+ };
3200
3210
 
3201
3211
  const isURLSameOrigin = platform.hasStandardBrowserEnv ?
3202
3212
 
@@ -3261,80 +3271,220 @@ const isURLSameOrigin = platform.hasStandardBrowserEnv ?
3261
3271
  };
3262
3272
  })();
3263
3273
 
3264
- function progressEventReducer(listener, isDownloadStream) {
3265
- let bytesNotified = 0;
3266
- const _speedometer = speedometer(50, 250);
3274
+ const cookies = platform.hasStandardBrowserEnv ?
3267
3275
 
3268
- return e => {
3269
- const loaded = e.loaded;
3270
- const total = e.lengthComputable ? e.total : undefined;
3271
- const progressBytes = loaded - bytesNotified;
3272
- const rate = _speedometer(progressBytes);
3273
- const inRange = loaded <= total;
3276
+ // Standard browser envs support document.cookie
3277
+ {
3278
+ write(name, value, expires, path, domain, secure) {
3279
+ const cookie = [name + '=' + encodeURIComponent(value)];
3274
3280
 
3275
- bytesNotified = loaded;
3281
+ utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());
3276
3282
 
3277
- const data = {
3278
- loaded,
3279
- total,
3280
- progress: total ? (loaded / total) : undefined,
3281
- bytes: progressBytes,
3282
- rate: rate ? rate : undefined,
3283
- estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
3284
- event: e
3285
- };
3283
+ utils$1.isString(path) && cookie.push('path=' + path);
3286
3284
 
3287
- data[isDownloadStream ? 'download' : 'upload'] = true;
3285
+ utils$1.isString(domain) && cookie.push('domain=' + domain);
3288
3286
 
3289
- listener(data);
3287
+ secure === true && cookie.push('secure');
3288
+
3289
+ document.cookie = cookie.join('; ');
3290
+ },
3291
+
3292
+ read(name) {
3293
+ const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
3294
+ return (match ? decodeURIComponent(match[3]) : null);
3295
+ },
3296
+
3297
+ remove(name) {
3298
+ this.write(name, '', Date.now() - 86400000);
3299
+ }
3300
+ }
3301
+
3302
+ :
3303
+
3304
+ // Non-standard browser env (web workers, react-native) lack needed support.
3305
+ {
3306
+ write() {},
3307
+ read() {
3308
+ return null;
3309
+ },
3310
+ remove() {}
3290
3311
  };
3312
+
3313
+ const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;
3314
+
3315
+ /**
3316
+ * Config-specific merge-function which creates a new config-object
3317
+ * by merging two configuration objects together.
3318
+ *
3319
+ * @param {Object} config1
3320
+ * @param {Object} config2
3321
+ *
3322
+ * @returns {Object} New object resulting from merging config2 to config1
3323
+ */
3324
+ function mergeConfig(config1, config2) {
3325
+ // eslint-disable-next-line no-param-reassign
3326
+ config2 = config2 || {};
3327
+ const config = {};
3328
+
3329
+ function getMergedValue(target, source, caseless) {
3330
+ if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
3331
+ return utils$1.merge.call({caseless}, target, source);
3332
+ } else if (utils$1.isPlainObject(source)) {
3333
+ return utils$1.merge({}, source);
3334
+ } else if (utils$1.isArray(source)) {
3335
+ return source.slice();
3336
+ }
3337
+ return source;
3338
+ }
3339
+
3340
+ // eslint-disable-next-line consistent-return
3341
+ function mergeDeepProperties(a, b, caseless) {
3342
+ if (!utils$1.isUndefined(b)) {
3343
+ return getMergedValue(a, b, caseless);
3344
+ } else if (!utils$1.isUndefined(a)) {
3345
+ return getMergedValue(undefined, a, caseless);
3346
+ }
3347
+ }
3348
+
3349
+ // eslint-disable-next-line consistent-return
3350
+ function valueFromConfig2(a, b) {
3351
+ if (!utils$1.isUndefined(b)) {
3352
+ return getMergedValue(undefined, b);
3353
+ }
3354
+ }
3355
+
3356
+ // eslint-disable-next-line consistent-return
3357
+ function defaultToConfig2(a, b) {
3358
+ if (!utils$1.isUndefined(b)) {
3359
+ return getMergedValue(undefined, b);
3360
+ } else if (!utils$1.isUndefined(a)) {
3361
+ return getMergedValue(undefined, a);
3362
+ }
3363
+ }
3364
+
3365
+ // eslint-disable-next-line consistent-return
3366
+ function mergeDirectKeys(a, b, prop) {
3367
+ if (prop in config2) {
3368
+ return getMergedValue(a, b);
3369
+ } else if (prop in config1) {
3370
+ return getMergedValue(undefined, a);
3371
+ }
3372
+ }
3373
+
3374
+ const mergeMap = {
3375
+ url: valueFromConfig2,
3376
+ method: valueFromConfig2,
3377
+ data: valueFromConfig2,
3378
+ baseURL: defaultToConfig2,
3379
+ transformRequest: defaultToConfig2,
3380
+ transformResponse: defaultToConfig2,
3381
+ paramsSerializer: defaultToConfig2,
3382
+ timeout: defaultToConfig2,
3383
+ timeoutMessage: defaultToConfig2,
3384
+ withCredentials: defaultToConfig2,
3385
+ withXSRFToken: defaultToConfig2,
3386
+ adapter: defaultToConfig2,
3387
+ responseType: defaultToConfig2,
3388
+ xsrfCookieName: defaultToConfig2,
3389
+ xsrfHeaderName: defaultToConfig2,
3390
+ onUploadProgress: defaultToConfig2,
3391
+ onDownloadProgress: defaultToConfig2,
3392
+ decompress: defaultToConfig2,
3393
+ maxContentLength: defaultToConfig2,
3394
+ maxBodyLength: defaultToConfig2,
3395
+ beforeRedirect: defaultToConfig2,
3396
+ transport: defaultToConfig2,
3397
+ httpAgent: defaultToConfig2,
3398
+ httpsAgent: defaultToConfig2,
3399
+ cancelToken: defaultToConfig2,
3400
+ socketPath: defaultToConfig2,
3401
+ responseEncoding: defaultToConfig2,
3402
+ validateStatus: mergeDirectKeys,
3403
+ headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)
3404
+ };
3405
+
3406
+ utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
3407
+ const merge = mergeMap[prop] || mergeDeepProperties;
3408
+ const configValue = merge(config1[prop], config2[prop], prop);
3409
+ (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
3410
+ });
3411
+
3412
+ return config;
3291
3413
  }
3292
3414
 
3415
+ const resolveConfig = (config) => {
3416
+ const newConfig = mergeConfig({}, config);
3417
+
3418
+ let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;
3419
+
3420
+ newConfig.headers = headers = AxiosHeaders$1.from(headers);
3421
+
3422
+ newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);
3423
+
3424
+ // HTTP basic authentication
3425
+ if (auth) {
3426
+ headers.set('Authorization', 'Basic ' +
3427
+ btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))
3428
+ );
3429
+ }
3430
+
3431
+ let contentType;
3432
+
3433
+ if (utils$1.isFormData(data)) {
3434
+ if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {
3435
+ headers.setContentType(undefined); // Let the browser set it
3436
+ } else if ((contentType = headers.getContentType()) !== false) {
3437
+ // fix semicolon duplication issue for ReactNative FormData implementation
3438
+ const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];
3439
+ headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));
3440
+ }
3441
+ }
3442
+
3443
+ // Add xsrf header
3444
+ // This is only done if running in a standard browser environment.
3445
+ // Specifically not if we're in a web worker, or react-native.
3446
+
3447
+ if (platform.hasStandardBrowserEnv) {
3448
+ withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));
3449
+
3450
+ if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {
3451
+ // Add xsrf header
3452
+ const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);
3453
+
3454
+ if (xsrfValue) {
3455
+ headers.set(xsrfHeaderName, xsrfValue);
3456
+ }
3457
+ }
3458
+ }
3459
+
3460
+ return newConfig;
3461
+ };
3462
+
3293
3463
  const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
3294
3464
 
3295
3465
  const xhrAdapter = isXHRAdapterSupported && function (config) {
3296
3466
  return new Promise(function dispatchXhrRequest(resolve, reject) {
3297
- let requestData = config.data;
3298
- const requestHeaders = AxiosHeaders$1.from(config.headers).normalize();
3299
- let {responseType, withXSRFToken} = config;
3467
+ const _config = resolveConfig(config);
3468
+ let requestData = _config.data;
3469
+ const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();
3470
+ let {responseType} = _config;
3300
3471
  let onCanceled;
3301
3472
  function done() {
3302
- if (config.cancelToken) {
3303
- config.cancelToken.unsubscribe(onCanceled);
3304
- }
3305
-
3306
- if (config.signal) {
3307
- config.signal.removeEventListener('abort', onCanceled);
3473
+ if (_config.cancelToken) {
3474
+ _config.cancelToken.unsubscribe(onCanceled);
3308
3475
  }
3309
- }
3310
-
3311
- let contentType;
3312
3476
 
3313
- if (utils$1.isFormData(requestData)) {
3314
- if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {
3315
- requestHeaders.setContentType(false); // Let the browser set it
3316
- } else if ((contentType = requestHeaders.getContentType()) !== false) {
3317
- // fix semicolon duplication issue for ReactNative FormData implementation
3318
- const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];
3319
- requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));
3477
+ if (_config.signal) {
3478
+ _config.signal.removeEventListener('abort', onCanceled);
3320
3479
  }
3321
3480
  }
3322
3481
 
3323
3482
  let request = new XMLHttpRequest();
3324
3483
 
3325
- // HTTP basic authentication
3326
- if (config.auth) {
3327
- const username = config.auth.username || '';
3328
- const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
3329
- requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));
3330
- }
3331
-
3332
- const fullPath = buildFullPath(config.baseURL, config.url);
3333
-
3334
- request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
3484
+ request.open(_config.method.toUpperCase(), _config.url, true);
3335
3485
 
3336
3486
  // Set the request timeout in MS
3337
- request.timeout = config.timeout;
3487
+ request.timeout = _config.timeout;
3338
3488
 
3339
3489
  function onloadend() {
3340
3490
  if (!request) {
@@ -3396,7 +3546,7 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3396
3546
  return;
3397
3547
  }
3398
3548
 
3399
- reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
3549
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, _config, request));
3400
3550
 
3401
3551
  // Clean up request
3402
3552
  request = null;
@@ -3406,7 +3556,7 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3406
3556
  request.onerror = function handleError() {
3407
3557
  // Real errors are hidden from us by the browser
3408
3558
  // onerror should only fire if it's a network error
3409
- reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
3559
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, _config, request));
3410
3560
 
3411
3561
  // Clean up request
3412
3562
  request = null;
@@ -3414,37 +3564,21 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3414
3564
 
3415
3565
  // Handle timeout
3416
3566
  request.ontimeout = function handleTimeout() {
3417
- let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
3418
- const transitional = config.transitional || transitionalDefaults;
3419
- if (config.timeoutErrorMessage) {
3420
- timeoutErrorMessage = config.timeoutErrorMessage;
3567
+ let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';
3568
+ const transitional = _config.transitional || transitionalDefaults;
3569
+ if (_config.timeoutErrorMessage) {
3570
+ timeoutErrorMessage = _config.timeoutErrorMessage;
3421
3571
  }
3422
3572
  reject(new AxiosError(
3423
3573
  timeoutErrorMessage,
3424
3574
  transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
3425
- config,
3575
+ _config,
3426
3576
  request));
3427
3577
 
3428
3578
  // Clean up request
3429
3579
  request = null;
3430
3580
  };
3431
3581
 
3432
- // Add xsrf header
3433
- // This is only done if running in a standard browser environment.
3434
- // Specifically not if we're in a web worker, or react-native.
3435
- if(platform.hasStandardBrowserEnv) {
3436
- withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));
3437
-
3438
- if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {
3439
- // Add xsrf header
3440
- const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
3441
-
3442
- if (xsrfValue) {
3443
- requestHeaders.set(config.xsrfHeaderName, xsrfValue);
3444
- }
3445
- }
3446
- }
3447
-
3448
3582
  // Remove Content-Type if data is undefined
3449
3583
  requestData === undefined && requestHeaders.setContentType(null);
3450
3584
 
@@ -3456,26 +3590,26 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3456
3590
  }
3457
3591
 
3458
3592
  // Add withCredentials to request if needed
3459
- if (!utils$1.isUndefined(config.withCredentials)) {
3460
- request.withCredentials = !!config.withCredentials;
3593
+ if (!utils$1.isUndefined(_config.withCredentials)) {
3594
+ request.withCredentials = !!_config.withCredentials;
3461
3595
  }
3462
3596
 
3463
3597
  // Add responseType to request if needed
3464
3598
  if (responseType && responseType !== 'json') {
3465
- request.responseType = config.responseType;
3599
+ request.responseType = _config.responseType;
3466
3600
  }
3467
3601
 
3468
3602
  // Handle progress if needed
3469
- if (typeof config.onDownloadProgress === 'function') {
3470
- request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));
3603
+ if (typeof _config.onDownloadProgress === 'function') {
3604
+ request.addEventListener('progress', progressEventReducer(_config.onDownloadProgress, true));
3471
3605
  }
3472
3606
 
3473
3607
  // Not all browsers support upload events
3474
- if (typeof config.onUploadProgress === 'function' && request.upload) {
3475
- request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));
3608
+ if (typeof _config.onUploadProgress === 'function' && request.upload) {
3609
+ request.upload.addEventListener('progress', progressEventReducer(_config.onUploadProgress));
3476
3610
  }
3477
3611
 
3478
- if (config.cancelToken || config.signal) {
3612
+ if (_config.cancelToken || _config.signal) {
3479
3613
  // Handle cancellation
3480
3614
  // eslint-disable-next-line func-names
3481
3615
  onCanceled = cancel => {
@@ -3487,13 +3621,13 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3487
3621
  request = null;
3488
3622
  };
3489
3623
 
3490
- config.cancelToken && config.cancelToken.subscribe(onCanceled);
3491
- if (config.signal) {
3492
- config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
3624
+ _config.cancelToken && _config.cancelToken.subscribe(onCanceled);
3625
+ if (_config.signal) {
3626
+ _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);
3493
3627
  }
3494
3628
  }
3495
3629
 
3496
- const protocol = parseProtocol(fullPath);
3630
+ const protocol = parseProtocol(_config.url);
3497
3631
 
3498
3632
  if (protocol && platform.protocols.indexOf(protocol) === -1) {
3499
3633
  reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
@@ -3506,9 +3640,296 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3506
3640
  });
3507
3641
  };
3508
3642
 
3643
+ const composeSignals = (signals, timeout) => {
3644
+ let controller = new AbortController();
3645
+
3646
+ let aborted;
3647
+
3648
+ const onabort = function (cancel) {
3649
+ if (!aborted) {
3650
+ aborted = true;
3651
+ unsubscribe();
3652
+ const err = cancel instanceof Error ? cancel : this.reason;
3653
+ controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
3654
+ }
3655
+ };
3656
+
3657
+ let timer = timeout && setTimeout(() => {
3658
+ onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));
3659
+ }, timeout);
3660
+
3661
+ const unsubscribe = () => {
3662
+ if (signals) {
3663
+ timer && clearTimeout(timer);
3664
+ timer = null;
3665
+ signals.forEach(signal => {
3666
+ signal &&
3667
+ (signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort));
3668
+ });
3669
+ signals = null;
3670
+ }
3671
+ };
3672
+
3673
+ signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort));
3674
+
3675
+ const {signal} = controller;
3676
+
3677
+ signal.unsubscribe = unsubscribe;
3678
+
3679
+ return [signal, () => {
3680
+ timer && clearTimeout(timer);
3681
+ timer = null;
3682
+ }];
3683
+ };
3684
+
3685
+ const composeSignals$1 = composeSignals;
3686
+
3687
+ const streamChunk = function* (chunk, chunkSize) {
3688
+ let len = chunk.byteLength;
3689
+
3690
+ if (!chunkSize || len < chunkSize) {
3691
+ yield chunk;
3692
+ return;
3693
+ }
3694
+
3695
+ let pos = 0;
3696
+ let end;
3697
+
3698
+ while (pos < len) {
3699
+ end = pos + chunkSize;
3700
+ yield chunk.slice(pos, end);
3701
+ pos = end;
3702
+ }
3703
+ };
3704
+
3705
+ const encoder = new TextEncoder();
3706
+
3707
+ const readBytes = async function* (iterable, chunkSize) {
3708
+ for await (const chunk of iterable) {
3709
+ yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : (await encoder.encode(String(chunk))), chunkSize);
3710
+ }
3711
+ };
3712
+
3713
+ const trackStream = (stream, chunkSize, onProgress, onFinish) => {
3714
+ const iterator = readBytes(stream, chunkSize);
3715
+
3716
+ let bytes = 0;
3717
+
3718
+ return new ReadableStream({
3719
+ type: 'bytes',
3720
+
3721
+ async pull(controller) {
3722
+ const {done, value} = await iterator.next();
3723
+
3724
+ if (done) {
3725
+ controller.close();
3726
+ onFinish();
3727
+ return;
3728
+ }
3729
+
3730
+ let len = value.byteLength;
3731
+ onProgress && onProgress(bytes += len);
3732
+ controller.enqueue(new Uint8Array(value));
3733
+ },
3734
+ cancel(reason) {
3735
+ onFinish(reason);
3736
+ return iterator.return();
3737
+ }
3738
+ }, {
3739
+ highWaterMark: 2
3740
+ })
3741
+ };
3742
+
3743
+ const fetchProgressDecorator = (total, fn) => {
3744
+ const lengthComputable = total != null;
3745
+ return (loaded) => setTimeout(() => fn({
3746
+ lengthComputable,
3747
+ total,
3748
+ loaded
3749
+ }));
3750
+ };
3751
+
3752
+ const isFetchSupported = typeof fetch !== 'undefined';
3753
+
3754
+ const supportsRequestStreams = isFetchSupported && (() => {
3755
+ let duplexAccessed = false;
3756
+
3757
+ const hasContentType = new Request(platform.origin, {
3758
+ body: new ReadableStream(),
3759
+ method: 'POST',
3760
+ get duplex() {
3761
+ duplexAccessed = true;
3762
+ return 'half';
3763
+ },
3764
+ }).headers.has('Content-Type');
3765
+
3766
+ return duplexAccessed && !hasContentType;
3767
+ })();
3768
+
3769
+ const DEFAULT_CHUNK_SIZE = 64 * 1024;
3770
+
3771
+ const resolvers = {
3772
+ stream: (res) => res.body
3773
+ };
3774
+
3775
+ isFetchSupported && ['text', 'arrayBuffer', 'blob', 'formData'].forEach(type => [
3776
+ resolvers[type] = utils$1.isFunction(Response.prototype[type]) ? (res) => res[type]() : (_, config) => {
3777
+ throw new AxiosError(`Response type ${type} is not supported`, AxiosError.ERR_NOT_SUPPORT, config);
3778
+ }
3779
+ ]);
3780
+
3781
+ const getBodyLength = async (body) => {
3782
+ if(utils$1.isBlob(body)) {
3783
+ return body.size;
3784
+ }
3785
+
3786
+ if(utils$1.isSpecCompliantForm(body)) {
3787
+ return (await new Request(body).arrayBuffer()).byteLength;
3788
+ }
3789
+
3790
+ if(utils$1.isArrayBufferView(body)) {
3791
+ return body.byteLength;
3792
+ }
3793
+
3794
+ if(utils$1.isURLSearchParams(body)) {
3795
+ body = body + '';
3796
+ }
3797
+
3798
+ if(utils$1.isString(body)) {
3799
+ return (await new TextEncoder().encode(body)).byteLength;
3800
+ }
3801
+ };
3802
+
3803
+ const resolveBodyLength = async (headers, body) => {
3804
+ const length = utils$1.toFiniteNumber(headers.getContentLength());
3805
+
3806
+ return length == null ? getBodyLength(body) : length;
3807
+ };
3808
+
3809
+ const fetchAdapter = async (config) => {
3810
+ let {
3811
+ url,
3812
+ method,
3813
+ data,
3814
+ signal,
3815
+ cancelToken,
3816
+ timeout,
3817
+ onDownloadProgress,
3818
+ onUploadProgress,
3819
+ responseType,
3820
+ headers,
3821
+ withCredentials = 'same-origin',
3822
+ fetchOptions
3823
+ } = resolveConfig(config);
3824
+
3825
+ responseType = responseType ? (responseType + '').toLowerCase() : 'text';
3826
+
3827
+ let [composedSignal, stopTimeout] = (signal || cancelToken || timeout) ?
3828
+ composeSignals$1([signal, cancelToken], timeout) : [];
3829
+
3830
+ let finished, request;
3831
+
3832
+ const onFinish = () => {
3833
+ !finished && setTimeout(() => {
3834
+ composedSignal && composedSignal.unsubscribe();
3835
+ });
3836
+
3837
+ finished = true;
3838
+ };
3839
+
3840
+ try {
3841
+ if (onUploadProgress && supportsRequestStreams && method !== 'get' && method !== 'head') {
3842
+ let requestContentLength = await resolveBodyLength(headers, data);
3843
+
3844
+ let _request = new Request(url, {
3845
+ method,
3846
+ body: data,
3847
+ duplex: "half"
3848
+ });
3849
+
3850
+ let contentTypeHeader;
3851
+
3852
+ if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
3853
+ headers.setContentType(contentTypeHeader);
3854
+ }
3855
+
3856
+ data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, fetchProgressDecorator(
3857
+ requestContentLength,
3858
+ progressEventReducer(onUploadProgress)
3859
+ ));
3860
+ }
3861
+
3862
+ if (!utils$1.isString(withCredentials)) {
3863
+ withCredentials = withCredentials ? 'cors' : 'omit';
3864
+ }
3865
+
3866
+ request = new Request(url, {
3867
+ ...fetchOptions,
3868
+ signal: composedSignal,
3869
+ method,
3870
+ headers: headers.normalize().toJSON(),
3871
+ body: data,
3872
+ duplex: "half",
3873
+ withCredentials
3874
+ });
3875
+
3876
+ let response = await fetch(request);
3877
+
3878
+ const isStreamResponse = responseType === 'stream' || responseType === 'response';
3879
+
3880
+ if (onDownloadProgress || isStreamResponse) {
3881
+ const options = {};
3882
+
3883
+ Object.getOwnPropertyNames(response).forEach(prop => {
3884
+ options[prop] = response[prop];
3885
+ });
3886
+
3887
+ const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length'));
3888
+
3889
+ response = new Response(
3890
+ trackStream(response.body, DEFAULT_CHUNK_SIZE, onDownloadProgress && fetchProgressDecorator(
3891
+ responseContentLength,
3892
+ progressEventReducer(onDownloadProgress, true)
3893
+ ), isStreamResponse && onFinish),
3894
+ options
3895
+ );
3896
+ }
3897
+
3898
+ responseType = responseType || 'text';
3899
+
3900
+ let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);
3901
+
3902
+ !isStreamResponse && onFinish();
3903
+
3904
+ stopTimeout && stopTimeout();
3905
+
3906
+ return await new Promise((resolve, reject) => {
3907
+ settle(resolve, reject, {
3908
+ data: responseData,
3909
+ headers: AxiosHeaders$1.from(response.headers),
3910
+ status: response.status,
3911
+ statusText: response.statusText,
3912
+ config,
3913
+ request
3914
+ });
3915
+ })
3916
+ } catch (err) {
3917
+ onFinish();
3918
+
3919
+ let {code} = err;
3920
+
3921
+ if (err.name === 'NetworkError') {
3922
+ code = AxiosError.ERR_NETWORK;
3923
+ }
3924
+
3925
+ throw AxiosError.from(err, code, config, request);
3926
+ }
3927
+ };
3928
+
3509
3929
  const knownAdapters = {
3510
3930
  http: httpAdapter,
3511
- xhr: xhrAdapter
3931
+ xhr: xhrAdapter,
3932
+ fetch: fetchAdapter
3512
3933
  };
3513
3934
 
3514
3935
  utils$1.forEach(knownAdapters, (fn, value) => {
@@ -3652,108 +4073,6 @@ function dispatchRequest(config) {
3652
4073
  });
3653
4074
  }
3654
4075
 
3655
- const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : thing;
3656
-
3657
- /**
3658
- * Config-specific merge-function which creates a new config-object
3659
- * by merging two configuration objects together.
3660
- *
3661
- * @param {Object} config1
3662
- * @param {Object} config2
3663
- *
3664
- * @returns {Object} New object resulting from merging config2 to config1
3665
- */
3666
- function mergeConfig(config1, config2) {
3667
- // eslint-disable-next-line no-param-reassign
3668
- config2 = config2 || {};
3669
- const config = {};
3670
-
3671
- function getMergedValue(target, source, caseless) {
3672
- if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
3673
- return utils$1.merge.call({caseless}, target, source);
3674
- } else if (utils$1.isPlainObject(source)) {
3675
- return utils$1.merge({}, source);
3676
- } else if (utils$1.isArray(source)) {
3677
- return source.slice();
3678
- }
3679
- return source;
3680
- }
3681
-
3682
- // eslint-disable-next-line consistent-return
3683
- function mergeDeepProperties(a, b, caseless) {
3684
- if (!utils$1.isUndefined(b)) {
3685
- return getMergedValue(a, b, caseless);
3686
- } else if (!utils$1.isUndefined(a)) {
3687
- return getMergedValue(undefined, a, caseless);
3688
- }
3689
- }
3690
-
3691
- // eslint-disable-next-line consistent-return
3692
- function valueFromConfig2(a, b) {
3693
- if (!utils$1.isUndefined(b)) {
3694
- return getMergedValue(undefined, b);
3695
- }
3696
- }
3697
-
3698
- // eslint-disable-next-line consistent-return
3699
- function defaultToConfig2(a, b) {
3700
- if (!utils$1.isUndefined(b)) {
3701
- return getMergedValue(undefined, b);
3702
- } else if (!utils$1.isUndefined(a)) {
3703
- return getMergedValue(undefined, a);
3704
- }
3705
- }
3706
-
3707
- // eslint-disable-next-line consistent-return
3708
- function mergeDirectKeys(a, b, prop) {
3709
- if (prop in config2) {
3710
- return getMergedValue(a, b);
3711
- } else if (prop in config1) {
3712
- return getMergedValue(undefined, a);
3713
- }
3714
- }
3715
-
3716
- const mergeMap = {
3717
- url: valueFromConfig2,
3718
- method: valueFromConfig2,
3719
- data: valueFromConfig2,
3720
- baseURL: defaultToConfig2,
3721
- transformRequest: defaultToConfig2,
3722
- transformResponse: defaultToConfig2,
3723
- paramsSerializer: defaultToConfig2,
3724
- timeout: defaultToConfig2,
3725
- timeoutMessage: defaultToConfig2,
3726
- withCredentials: defaultToConfig2,
3727
- withXSRFToken: defaultToConfig2,
3728
- adapter: defaultToConfig2,
3729
- responseType: defaultToConfig2,
3730
- xsrfCookieName: defaultToConfig2,
3731
- xsrfHeaderName: defaultToConfig2,
3732
- onUploadProgress: defaultToConfig2,
3733
- onDownloadProgress: defaultToConfig2,
3734
- decompress: defaultToConfig2,
3735
- maxContentLength: defaultToConfig2,
3736
- maxBodyLength: defaultToConfig2,
3737
- beforeRedirect: defaultToConfig2,
3738
- transport: defaultToConfig2,
3739
- httpAgent: defaultToConfig2,
3740
- httpsAgent: defaultToConfig2,
3741
- cancelToken: defaultToConfig2,
3742
- socketPath: defaultToConfig2,
3743
- responseEncoding: defaultToConfig2,
3744
- validateStatus: mergeDirectKeys,
3745
- headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)
3746
- };
3747
-
3748
- utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
3749
- const merge = mergeMap[prop] || mergeDeepProperties;
3750
- const configValue = merge(config1[prop], config2[prop], prop);
3751
- (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
3752
- });
3753
-
3754
- return config;
3755
- }
3756
-
3757
4076
  const validators$1 = {};
3758
4077
 
3759
4078
  // eslint-disable-next-line func-names