axios 1.6.8 → 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.8 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');
@@ -236,6 +236,8 @@ const isFormData = (thing) => {
236
236
  */
237
237
  const isURLSearchParams = kindOfTest('URLSearchParams');
238
238
 
239
+ const [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);
240
+
239
241
  /**
240
242
  * Trim excess whitespace off the beginning and end of a string
241
243
  *
@@ -624,8 +626,7 @@ const toObjectSet = (arrayOrString, delimiter) => {
624
626
  const noop = () => {};
625
627
 
626
628
  const toFiniteNumber = (value, defaultValue) => {
627
- value = +value;
628
- return Number.isFinite(value) ? value : defaultValue;
629
+ return value != null && Number.isFinite(value = +value) ? value : defaultValue;
629
630
  };
630
631
 
631
632
  const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
@@ -706,6 +707,10 @@ const utils$1 = {
706
707
  isBoolean,
707
708
  isObject,
708
709
  isPlainObject,
710
+ isReadableStream,
711
+ isRequest,
712
+ isResponse,
713
+ isHeaders,
709
714
  isUndefined,
710
715
  isDate,
711
716
  isFile,
@@ -1295,11 +1300,14 @@ const hasStandardBrowserWebWorkerEnv = (() => {
1295
1300
  );
1296
1301
  })();
1297
1302
 
1303
+ const origin = hasBrowserEnv && window.location.href || 'http://localhost';
1304
+
1298
1305
  const utils = /*#__PURE__*/Object.freeze({
1299
1306
  __proto__: null,
1300
1307
  hasBrowserEnv: hasBrowserEnv,
1301
1308
  hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
1302
- hasStandardBrowserEnv: hasStandardBrowserEnv
1309
+ hasStandardBrowserEnv: hasStandardBrowserEnv,
1310
+ origin: origin
1303
1311
  });
1304
1312
 
1305
1313
  const platform = {
@@ -1439,7 +1447,7 @@ const defaults = {
1439
1447
 
1440
1448
  transitional: transitionalDefaults,
1441
1449
 
1442
- adapter: ['xhr', 'http'],
1450
+ adapter: ['xhr', 'http', 'fetch'],
1443
1451
 
1444
1452
  transformRequest: [function transformRequest(data, headers) {
1445
1453
  const contentType = headers.getContentType() || '';
@@ -1460,7 +1468,8 @@ const defaults = {
1460
1468
  utils$1.isBuffer(data) ||
1461
1469
  utils$1.isStream(data) ||
1462
1470
  utils$1.isFile(data) ||
1463
- utils$1.isBlob(data)
1471
+ utils$1.isBlob(data) ||
1472
+ utils$1.isReadableStream(data)
1464
1473
  ) {
1465
1474
  return data;
1466
1475
  }
@@ -1503,6 +1512,10 @@ const defaults = {
1503
1512
  const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
1504
1513
  const JSONRequested = this.responseType === 'json';
1505
1514
 
1515
+ if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {
1516
+ return data;
1517
+ }
1518
+
1506
1519
  if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
1507
1520
  const silentJSONParsing = transitional && transitional.silentJSONParsing;
1508
1521
  const strictJSONParsing = !silentJSONParsing && JSONRequested;
@@ -1706,6 +1719,10 @@ class AxiosHeaders {
1706
1719
  setHeaders(header, valueOrRewrite);
1707
1720
  } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
1708
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
+ }
1709
1726
  } else {
1710
1727
  header != null && setHeader(valueOrRewrite, header, rewrite);
1711
1728
  }
@@ -2018,7 +2035,7 @@ function buildFullPath(baseURL, requestedURL) {
2018
2035
  return requestedURL;
2019
2036
  }
2020
2037
 
2021
- const VERSION = "1.6.8";
2038
+ const VERSION = "1.7.0-beta.0";
2022
2039
 
2023
2040
  function parseProtocol(url) {
2024
2041
  const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
@@ -2083,7 +2100,9 @@ function throttle(fn, freq) {
2083
2100
  let timestamp = 0;
2084
2101
  const threshold = 1000 / freq;
2085
2102
  let timer = null;
2086
- return function throttled(force, args) {
2103
+ return function throttled() {
2104
+ const force = this === true;
2105
+
2087
2106
  const now = Date.now();
2088
2107
  if (force || now - timestamp > threshold) {
2089
2108
  if (timer) {
@@ -2091,13 +2110,13 @@ function throttle(fn, freq) {
2091
2110
  timer = null;
2092
2111
  }
2093
2112
  timestamp = now;
2094
- return fn.apply(null, args);
2113
+ return fn.apply(null, arguments);
2095
2114
  }
2096
2115
  if (!timer) {
2097
2116
  timer = setTimeout(() => {
2098
2117
  timer = null;
2099
2118
  timestamp = Date.now();
2100
- return fn.apply(null, args);
2119
+ return fn.apply(null, arguments);
2101
2120
  }, threshold - (now - timestamp));
2102
2121
  }
2103
2122
  };
@@ -2215,19 +2234,20 @@ class AxiosTransformStream extends stream__default["default"].Transform{
2215
2234
 
2216
2235
  process.nextTick(() => {
2217
2236
  self.emit('progress', {
2218
- 'loaded': bytesTransferred,
2219
- 'total': totalBytes,
2220
- 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined,
2221
- 'bytes': progressBytes,
2222
- 'rate': rate ? rate : undefined,
2223
- 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ?
2224
- (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
2225
2245
  });
2226
2246
  });
2227
2247
  }, internals.ticksRate);
2228
2248
 
2229
2249
  const onFinish = () => {
2230
- internals.updateProgress(true);
2250
+ internals.updateProgress.call(true);
2231
2251
  };
2232
2252
 
2233
2253
  this.once('end', onFinish);
@@ -3158,44 +3178,35 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
3158
3178
  });
3159
3179
  };
3160
3180
 
3161
- const cookies = platform.hasStandardBrowserEnv ?
3162
-
3163
- // Standard browser envs support document.cookie
3164
- {
3165
- write(name, value, expires, path, domain, secure) {
3166
- const cookie = [name + '=' + encodeURIComponent(value)];
3167
-
3168
- utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());
3169
-
3170
- utils$1.isString(path) && cookie.push('path=' + path);
3171
-
3172
- utils$1.isString(domain) && cookie.push('domain=' + domain);
3173
-
3174
- secure === true && cookie.push('secure');
3181
+ const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
3182
+ let bytesNotified = 0;
3183
+ const _speedometer = speedometer(50, 250);
3175
3184
 
3176
- document.cookie = cookie.join('; ');
3177
- },
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;
3178
3191
 
3179
- read(name) {
3180
- const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
3181
- return (match ? decodeURIComponent(match[3]) : null);
3182
- },
3192
+ bytesNotified = loaded;
3183
3193
 
3184
- remove(name) {
3185
- this.write(name, '', Date.now() - 86400000);
3186
- }
3187
- }
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
+ };
3188
3204
 
3189
- :
3205
+ data[isDownloadStream ? 'download' : 'upload'] = true;
3190
3206
 
3191
- // Non-standard browser env (web workers, react-native) lack needed support.
3192
- {
3193
- write() {},
3194
- read() {
3195
- return null;
3196
- },
3197
- remove() {}
3198
- };
3207
+ listener(data);
3208
+ }, freq);
3209
+ };
3199
3210
 
3200
3211
  const isURLSameOrigin = platform.hasStandardBrowserEnv ?
3201
3212
 
@@ -3260,80 +3271,220 @@ const isURLSameOrigin = platform.hasStandardBrowserEnv ?
3260
3271
  };
3261
3272
  })();
3262
3273
 
3263
- function progressEventReducer(listener, isDownloadStream) {
3264
- let bytesNotified = 0;
3265
- const _speedometer = speedometer(50, 250);
3274
+ const cookies = platform.hasStandardBrowserEnv ?
3266
3275
 
3267
- return e => {
3268
- const loaded = e.loaded;
3269
- const total = e.lengthComputable ? e.total : undefined;
3270
- const progressBytes = loaded - bytesNotified;
3271
- const rate = _speedometer(progressBytes);
3272
- 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)];
3273
3280
 
3274
- bytesNotified = loaded;
3281
+ utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());
3275
3282
 
3276
- const data = {
3277
- loaded,
3278
- total,
3279
- progress: total ? (loaded / total) : undefined,
3280
- bytes: progressBytes,
3281
- rate: rate ? rate : undefined,
3282
- estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
3283
- event: e
3284
- };
3283
+ utils$1.isString(path) && cookie.push('path=' + path);
3285
3284
 
3286
- data[isDownloadStream ? 'download' : 'upload'] = true;
3285
+ utils$1.isString(domain) && cookie.push('domain=' + domain);
3287
3286
 
3288
- 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() {}
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)
3289
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;
3290
3413
  }
3291
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
+
3292
3463
  const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
3293
3464
 
3294
3465
  const xhrAdapter = isXHRAdapterSupported && function (config) {
3295
3466
  return new Promise(function dispatchXhrRequest(resolve, reject) {
3296
- let requestData = config.data;
3297
- const requestHeaders = AxiosHeaders$1.from(config.headers).normalize();
3298
- 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;
3299
3471
  let onCanceled;
3300
3472
  function done() {
3301
- if (config.cancelToken) {
3302
- config.cancelToken.unsubscribe(onCanceled);
3303
- }
3304
-
3305
- if (config.signal) {
3306
- config.signal.removeEventListener('abort', onCanceled);
3473
+ if (_config.cancelToken) {
3474
+ _config.cancelToken.unsubscribe(onCanceled);
3307
3475
  }
3308
- }
3309
-
3310
- let contentType;
3311
3476
 
3312
- if (utils$1.isFormData(requestData)) {
3313
- if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {
3314
- requestHeaders.setContentType(false); // Let the browser set it
3315
- } else if ((contentType = requestHeaders.getContentType()) !== false) {
3316
- // fix semicolon duplication issue for ReactNative FormData implementation
3317
- const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];
3318
- requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; '));
3477
+ if (_config.signal) {
3478
+ _config.signal.removeEventListener('abort', onCanceled);
3319
3479
  }
3320
3480
  }
3321
3481
 
3322
3482
  let request = new XMLHttpRequest();
3323
3483
 
3324
- // HTTP basic authentication
3325
- if (config.auth) {
3326
- const username = config.auth.username || '';
3327
- const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
3328
- requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));
3329
- }
3330
-
3331
- const fullPath = buildFullPath(config.baseURL, config.url);
3332
-
3333
- request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
3484
+ request.open(_config.method.toUpperCase(), _config.url, true);
3334
3485
 
3335
3486
  // Set the request timeout in MS
3336
- request.timeout = config.timeout;
3487
+ request.timeout = _config.timeout;
3337
3488
 
3338
3489
  function onloadend() {
3339
3490
  if (!request) {
@@ -3395,7 +3546,7 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3395
3546
  return;
3396
3547
  }
3397
3548
 
3398
- reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
3549
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, _config, request));
3399
3550
 
3400
3551
  // Clean up request
3401
3552
  request = null;
@@ -3405,7 +3556,7 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3405
3556
  request.onerror = function handleError() {
3406
3557
  // Real errors are hidden from us by the browser
3407
3558
  // onerror should only fire if it's a network error
3408
- reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
3559
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, _config, request));
3409
3560
 
3410
3561
  // Clean up request
3411
3562
  request = null;
@@ -3413,37 +3564,21 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3413
3564
 
3414
3565
  // Handle timeout
3415
3566
  request.ontimeout = function handleTimeout() {
3416
- let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
3417
- const transitional = config.transitional || transitionalDefaults;
3418
- if (config.timeoutErrorMessage) {
3419
- 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;
3420
3571
  }
3421
3572
  reject(new AxiosError(
3422
3573
  timeoutErrorMessage,
3423
3574
  transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
3424
- config,
3575
+ _config,
3425
3576
  request));
3426
3577
 
3427
3578
  // Clean up request
3428
3579
  request = null;
3429
3580
  };
3430
3581
 
3431
- // Add xsrf header
3432
- // This is only done if running in a standard browser environment.
3433
- // Specifically not if we're in a web worker, or react-native.
3434
- if(platform.hasStandardBrowserEnv) {
3435
- withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config));
3436
-
3437
- if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(fullPath))) {
3438
- // Add xsrf header
3439
- const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && cookies.read(config.xsrfCookieName);
3440
-
3441
- if (xsrfValue) {
3442
- requestHeaders.set(config.xsrfHeaderName, xsrfValue);
3443
- }
3444
- }
3445
- }
3446
-
3447
3582
  // Remove Content-Type if data is undefined
3448
3583
  requestData === undefined && requestHeaders.setContentType(null);
3449
3584
 
@@ -3455,26 +3590,26 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3455
3590
  }
3456
3591
 
3457
3592
  // Add withCredentials to request if needed
3458
- if (!utils$1.isUndefined(config.withCredentials)) {
3459
- request.withCredentials = !!config.withCredentials;
3593
+ if (!utils$1.isUndefined(_config.withCredentials)) {
3594
+ request.withCredentials = !!_config.withCredentials;
3460
3595
  }
3461
3596
 
3462
3597
  // Add responseType to request if needed
3463
3598
  if (responseType && responseType !== 'json') {
3464
- request.responseType = config.responseType;
3599
+ request.responseType = _config.responseType;
3465
3600
  }
3466
3601
 
3467
3602
  // Handle progress if needed
3468
- if (typeof config.onDownloadProgress === 'function') {
3469
- request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));
3603
+ if (typeof _config.onDownloadProgress === 'function') {
3604
+ request.addEventListener('progress', progressEventReducer(_config.onDownloadProgress, true));
3470
3605
  }
3471
3606
 
3472
3607
  // Not all browsers support upload events
3473
- if (typeof config.onUploadProgress === 'function' && request.upload) {
3474
- request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));
3608
+ if (typeof _config.onUploadProgress === 'function' && request.upload) {
3609
+ request.upload.addEventListener('progress', progressEventReducer(_config.onUploadProgress));
3475
3610
  }
3476
3611
 
3477
- if (config.cancelToken || config.signal) {
3612
+ if (_config.cancelToken || _config.signal) {
3478
3613
  // Handle cancellation
3479
3614
  // eslint-disable-next-line func-names
3480
3615
  onCanceled = cancel => {
@@ -3486,13 +3621,13 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3486
3621
  request = null;
3487
3622
  };
3488
3623
 
3489
- config.cancelToken && config.cancelToken.subscribe(onCanceled);
3490
- if (config.signal) {
3491
- 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);
3492
3627
  }
3493
3628
  }
3494
3629
 
3495
- const protocol = parseProtocol(fullPath);
3630
+ const protocol = parseProtocol(_config.url);
3496
3631
 
3497
3632
  if (protocol && platform.protocols.indexOf(protocol) === -1) {
3498
3633
  reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
@@ -3505,9 +3640,296 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
3505
3640
  });
3506
3641
  };
3507
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
+
3508
3929
  const knownAdapters = {
3509
3930
  http: httpAdapter,
3510
- xhr: xhrAdapter
3931
+ xhr: xhrAdapter,
3932
+ fetch: fetchAdapter
3511
3933
  };
3512
3934
 
3513
3935
  utils$1.forEach(knownAdapters, (fn, value) => {
@@ -3651,108 +4073,6 @@ function dispatchRequest(config) {
3651
4073
  });
3652
4074
  }
3653
4075
 
3654
- const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;
3655
-
3656
- /**
3657
- * Config-specific merge-function which creates a new config-object
3658
- * by merging two configuration objects together.
3659
- *
3660
- * @param {Object} config1
3661
- * @param {Object} config2
3662
- *
3663
- * @returns {Object} New object resulting from merging config2 to config1
3664
- */
3665
- function mergeConfig(config1, config2) {
3666
- // eslint-disable-next-line no-param-reassign
3667
- config2 = config2 || {};
3668
- const config = {};
3669
-
3670
- function getMergedValue(target, source, caseless) {
3671
- if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
3672
- return utils$1.merge.call({caseless}, target, source);
3673
- } else if (utils$1.isPlainObject(source)) {
3674
- return utils$1.merge({}, source);
3675
- } else if (utils$1.isArray(source)) {
3676
- return source.slice();
3677
- }
3678
- return source;
3679
- }
3680
-
3681
- // eslint-disable-next-line consistent-return
3682
- function mergeDeepProperties(a, b, caseless) {
3683
- if (!utils$1.isUndefined(b)) {
3684
- return getMergedValue(a, b, caseless);
3685
- } else if (!utils$1.isUndefined(a)) {
3686
- return getMergedValue(undefined, a, caseless);
3687
- }
3688
- }
3689
-
3690
- // eslint-disable-next-line consistent-return
3691
- function valueFromConfig2(a, b) {
3692
- if (!utils$1.isUndefined(b)) {
3693
- return getMergedValue(undefined, b);
3694
- }
3695
- }
3696
-
3697
- // eslint-disable-next-line consistent-return
3698
- function defaultToConfig2(a, b) {
3699
- if (!utils$1.isUndefined(b)) {
3700
- return getMergedValue(undefined, b);
3701
- } else if (!utils$1.isUndefined(a)) {
3702
- return getMergedValue(undefined, a);
3703
- }
3704
- }
3705
-
3706
- // eslint-disable-next-line consistent-return
3707
- function mergeDirectKeys(a, b, prop) {
3708
- if (prop in config2) {
3709
- return getMergedValue(a, b);
3710
- } else if (prop in config1) {
3711
- return getMergedValue(undefined, a);
3712
- }
3713
- }
3714
-
3715
- const mergeMap = {
3716
- url: valueFromConfig2,
3717
- method: valueFromConfig2,
3718
- data: valueFromConfig2,
3719
- baseURL: defaultToConfig2,
3720
- transformRequest: defaultToConfig2,
3721
- transformResponse: defaultToConfig2,
3722
- paramsSerializer: defaultToConfig2,
3723
- timeout: defaultToConfig2,
3724
- timeoutMessage: defaultToConfig2,
3725
- withCredentials: defaultToConfig2,
3726
- withXSRFToken: defaultToConfig2,
3727
- adapter: defaultToConfig2,
3728
- responseType: defaultToConfig2,
3729
- xsrfCookieName: defaultToConfig2,
3730
- xsrfHeaderName: defaultToConfig2,
3731
- onUploadProgress: defaultToConfig2,
3732
- onDownloadProgress: defaultToConfig2,
3733
- decompress: defaultToConfig2,
3734
- maxContentLength: defaultToConfig2,
3735
- maxBodyLength: defaultToConfig2,
3736
- beforeRedirect: defaultToConfig2,
3737
- transport: defaultToConfig2,
3738
- httpAgent: defaultToConfig2,
3739
- httpsAgent: defaultToConfig2,
3740
- cancelToken: defaultToConfig2,
3741
- socketPath: defaultToConfig2,
3742
- responseEncoding: defaultToConfig2,
3743
- validateStatus: mergeDirectKeys,
3744
- headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)
3745
- };
3746
-
3747
- utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
3748
- const merge = mergeMap[prop] || mergeDeepProperties;
3749
- const configValue = merge(config1[prop], config2[prop], prop);
3750
- (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
3751
- });
3752
-
3753
- return config;
3754
- }
3755
-
3756
4076
  const validators$1 = {};
3757
4077
 
3758
4078
  // eslint-disable-next-line func-names