123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621 |
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (factory((global.WHATWGFetch = {})));
- }(this, (function (exports) { 'use strict';
- var global =
- (typeof globalThis !== 'undefined' && globalThis) ||
- (typeof self !== 'undefined' && self) ||
- (typeof global !== 'undefined' && global);
- var support = {
- searchParams: 'URLSearchParams' in global,
- iterable: 'Symbol' in global && 'iterator' in Symbol,
- blob:
- 'FileReader' in global &&
- 'Blob' in global &&
- (function() {
- try {
- new Blob();
- return true
- } catch (e) {
- return false
- }
- })(),
- formData: 'FormData' in global,
- arrayBuffer: 'ArrayBuffer' in global
- };
- function isDataView(obj) {
- return obj && DataView.prototype.isPrototypeOf(obj)
- }
- if (support.arrayBuffer) {
- var viewClasses = [
- '[object Int8Array]',
- '[object Uint8Array]',
- '[object Uint8ClampedArray]',
- '[object Int16Array]',
- '[object Uint16Array]',
- '[object Int32Array]',
- '[object Uint32Array]',
- '[object Float32Array]',
- '[object Float64Array]'
- ];
- var isArrayBufferView =
- ArrayBuffer.isView ||
- function(obj) {
- return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
- };
- }
- function normalizeName(name) {
- if (typeof name !== 'string') {
- name = String(name);
- }
- if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {
- throw new TypeError('Invalid character in header field name: "' + name + '"')
- }
- return name.toLowerCase()
- }
- function normalizeValue(value) {
- if (typeof value !== 'string') {
- value = String(value);
- }
- return value
- }
- // Build a destructive iterator for the value list
- function iteratorFor(items) {
- var iterator = {
- next: function() {
- var value = items.shift();
- return {done: value === undefined, value: value}
- }
- };
- if (support.iterable) {
- iterator[Symbol.iterator] = function() {
- return iterator
- };
- }
- return iterator
- }
- function Headers(headers) {
- this.map = {};
- if (headers instanceof Headers) {
- headers.forEach(function(value, name) {
- this.append(name, value);
- }, this);
- } else if (Array.isArray(headers)) {
- headers.forEach(function(header) {
- this.append(header[0], header[1]);
- }, this);
- } else if (headers) {
- Object.getOwnPropertyNames(headers).forEach(function(name) {
- this.append(name, headers[name]);
- }, this);
- }
- }
- Headers.prototype.append = function(name, value) {
- name = normalizeName(name);
- value = normalizeValue(value);
- var oldValue = this.map[name];
- this.map[name] = oldValue ? oldValue + ', ' + value : value;
- };
- Headers.prototype['delete'] = function(name) {
- delete this.map[normalizeName(name)];
- };
- Headers.prototype.get = function(name) {
- name = normalizeName(name);
- return this.has(name) ? this.map[name] : null
- };
- Headers.prototype.has = function(name) {
- return this.map.hasOwnProperty(normalizeName(name))
- };
- Headers.prototype.set = function(name, value) {
- this.map[normalizeName(name)] = normalizeValue(value);
- };
- Headers.prototype.forEach = function(callback, thisArg) {
- for (var name in this.map) {
- if (this.map.hasOwnProperty(name)) {
- callback.call(thisArg, this.map[name], name, this);
- }
- }
- };
- Headers.prototype.keys = function() {
- var items = [];
- this.forEach(function(value, name) {
- items.push(name);
- });
- return iteratorFor(items)
- };
- Headers.prototype.values = function() {
- var items = [];
- this.forEach(function(value) {
- items.push(value);
- });
- return iteratorFor(items)
- };
- Headers.prototype.entries = function() {
- var items = [];
- this.forEach(function(value, name) {
- items.push([name, value]);
- });
- return iteratorFor(items)
- };
- if (support.iterable) {
- Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
- }
- function consumed(body) {
- if (body.bodyUsed) {
- return Promise.reject(new TypeError('Already read'))
- }
- body.bodyUsed = true;
- }
- function fileReaderReady(reader) {
- return new Promise(function(resolve, reject) {
- reader.onload = function() {
- resolve(reader.result);
- };
- reader.onerror = function() {
- reject(reader.error);
- };
- })
- }
- function readBlobAsArrayBuffer(blob) {
- var reader = new FileReader();
- var promise = fileReaderReady(reader);
- reader.readAsArrayBuffer(blob);
- return promise
- }
- function readBlobAsText(blob) {
- var reader = new FileReader();
- var promise = fileReaderReady(reader);
- reader.readAsText(blob);
- return promise
- }
- function readArrayBufferAsText(buf) {
- var view = new Uint8Array(buf);
- var chars = new Array(view.length);
- for (var i = 0; i < view.length; i++) {
- chars[i] = String.fromCharCode(view[i]);
- }
- return chars.join('')
- }
- function bufferClone(buf) {
- if (buf.slice) {
- return buf.slice(0)
- } else {
- var view = new Uint8Array(buf.byteLength);
- view.set(new Uint8Array(buf));
- return view.buffer
- }
- }
- function Body() {
- this.bodyUsed = false;
- this._initBody = function(body) {
- /*
- fetch-mock wraps the Response object in an ES6 Proxy to
- provide useful test harness features such as flush. However, on
- ES5 browsers without fetch or Proxy support pollyfills must be used;
- the proxy-pollyfill is unable to proxy an attribute unless it exists
- on the object before the Proxy is created. This change ensures
- Response.bodyUsed exists on the instance, while maintaining the
- semantic of setting Request.bodyUsed in the constructor before
- _initBody is called.
- */
- this.bodyUsed = this.bodyUsed;
- this._bodyInit = body;
- if (!body) {
- this._bodyText = '';
- } else if (typeof body === 'string') {
- this._bodyText = body;
- } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
- this._bodyBlob = body;
- } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
- this._bodyFormData = body;
- } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
- this._bodyText = body.toString();
- } else if (support.arrayBuffer && support.blob && isDataView(body)) {
- this._bodyArrayBuffer = bufferClone(body.buffer);
- // IE 10-11 can't handle a DataView body.
- this._bodyInit = new Blob([this._bodyArrayBuffer]);
- } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
- this._bodyArrayBuffer = bufferClone(body);
- } else {
- this._bodyText = body = Object.prototype.toString.call(body);
- }
- if (!this.headers.get('content-type')) {
- if (typeof body === 'string') {
- this.headers.set('content-type', 'text/plain;charset=UTF-8');
- } else if (this._bodyBlob && this._bodyBlob.type) {
- this.headers.set('content-type', this._bodyBlob.type);
- } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
- this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
- }
- }
- };
- if (support.blob) {
- this.blob = function() {
- var rejected = consumed(this);
- if (rejected) {
- return rejected
- }
- if (this._bodyBlob) {
- return Promise.resolve(this._bodyBlob)
- } else if (this._bodyArrayBuffer) {
- return Promise.resolve(new Blob([this._bodyArrayBuffer]))
- } else if (this._bodyFormData) {
- throw new Error('could not read FormData body as blob')
- } else {
- return Promise.resolve(new Blob([this._bodyText]))
- }
- };
- this.arrayBuffer = function() {
- if (this._bodyArrayBuffer) {
- var isConsumed = consumed(this);
- if (isConsumed) {
- return isConsumed
- }
- if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
- return Promise.resolve(
- this._bodyArrayBuffer.buffer.slice(
- this._bodyArrayBuffer.byteOffset,
- this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength
- )
- )
- } else {
- return Promise.resolve(this._bodyArrayBuffer)
- }
- } else {
- return this.blob().then(readBlobAsArrayBuffer)
- }
- };
- }
- this.text = function() {
- var rejected = consumed(this);
- if (rejected) {
- return rejected
- }
- if (this._bodyBlob) {
- return readBlobAsText(this._bodyBlob)
- } else if (this._bodyArrayBuffer) {
- return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
- } else if (this._bodyFormData) {
- throw new Error('could not read FormData body as text')
- } else {
- return Promise.resolve(this._bodyText)
- }
- };
- if (support.formData) {
- this.formData = function() {
- return this.text().then(decode)
- };
- }
- this.json = function() {
- return this.text().then(JSON.parse)
- };
- return this
- }
- // HTTP methods whose capitalization should be normalized
- var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
- function normalizeMethod(method) {
- var upcased = method.toUpperCase();
- return methods.indexOf(upcased) > -1 ? upcased : method
- }
- function Request(input, options) {
- if (!(this instanceof Request)) {
- throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.')
- }
- options = options || {};
- var body = options.body;
- if (input instanceof Request) {
- if (input.bodyUsed) {
- throw new TypeError('Already read')
- }
- this.url = input.url;
- this.credentials = input.credentials;
- if (!options.headers) {
- this.headers = new Headers(input.headers);
- }
- this.method = input.method;
- this.mode = input.mode;
- this.signal = input.signal;
- if (!body && input._bodyInit != null) {
- body = input._bodyInit;
- input.bodyUsed = true;
- }
- } else {
- this.url = String(input);
- }
- this.credentials = options.credentials || this.credentials || 'same-origin';
- if (options.headers || !this.headers) {
- this.headers = new Headers(options.headers);
- }
- this.method = normalizeMethod(options.method || this.method || 'GET');
- this.mode = options.mode || this.mode || null;
- this.signal = options.signal || this.signal;
- this.referrer = null;
- if ((this.method === 'GET' || this.method === 'HEAD') && body) {
- throw new TypeError('Body not allowed for GET or HEAD requests')
- }
- this._initBody(body);
- if (this.method === 'GET' || this.method === 'HEAD') {
- if (options.cache === 'no-store' || options.cache === 'no-cache') {
- // Search for a '_' parameter in the query string
- var reParamSearch = /([?&])_=[^&]*/;
- if (reParamSearch.test(this.url)) {
- // If it already exists then set the value with the current time
- this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());
- } else {
- // Otherwise add a new '_' parameter to the end with the current time
- var reQueryString = /\?/;
- this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();
- }
- }
- }
- }
- Request.prototype.clone = function() {
- return new Request(this, {body: this._bodyInit})
- };
- function decode(body) {
- var form = new FormData();
- body
- .trim()
- .split('&')
- .forEach(function(bytes) {
- if (bytes) {
- var split = bytes.split('=');
- var name = split.shift().replace(/\+/g, ' ');
- var value = split.join('=').replace(/\+/g, ' ');
- form.append(decodeURIComponent(name), decodeURIComponent(value));
- }
- });
- return form
- }
- function parseHeaders(rawHeaders) {
- var headers = new Headers();
- // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
- // https://tools.ietf.org/html/rfc7230#section-3.2
- var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
- // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill
- // https://github.com/github/fetch/issues/748
- // https://github.com/zloirock/core-js/issues/751
- preProcessedHeaders
- .split('\r')
- .map(function(header) {
- return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header
- })
- .forEach(function(line) {
- var parts = line.split(':');
- var key = parts.shift().trim();
- if (key) {
- var value = parts.join(':').trim();
- headers.append(key, value);
- }
- });
- return headers
- }
- Body.call(Request.prototype);
- function Response(bodyInit, options) {
- if (!(this instanceof Response)) {
- throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.')
- }
- if (!options) {
- options = {};
- }
- this.type = 'default';
- this.status = options.status === undefined ? 200 : options.status;
- this.ok = this.status >= 200 && this.status < 300;
- this.statusText = options.statusText === undefined ? '' : '' + options.statusText;
- this.headers = new Headers(options.headers);
- this.url = options.url || '';
- this._initBody(bodyInit);
- }
- Body.call(Response.prototype);
- Response.prototype.clone = function() {
- return new Response(this._bodyInit, {
- status: this.status,
- statusText: this.statusText,
- headers: new Headers(this.headers),
- url: this.url
- })
- };
- Response.error = function() {
- var response = new Response(null, {status: 0, statusText: ''});
- response.type = 'error';
- return response
- };
- var redirectStatuses = [301, 302, 303, 307, 308];
- Response.redirect = function(url, status) {
- if (redirectStatuses.indexOf(status) === -1) {
- throw new RangeError('Invalid status code')
- }
- return new Response(null, {status: status, headers: {location: url}})
- };
- exports.DOMException = global.DOMException;
- try {
- new exports.DOMException();
- } catch (err) {
- exports.DOMException = function(message, name) {
- this.message = message;
- this.name = name;
- var error = Error(message);
- this.stack = error.stack;
- };
- exports.DOMException.prototype = Object.create(Error.prototype);
- exports.DOMException.prototype.constructor = exports.DOMException;
- }
- function fetch(input, init) {
- return new Promise(function(resolve, reject) {
- var request = new Request(input, init);
- if (request.signal && request.signal.aborted) {
- return reject(new exports.DOMException('Aborted', 'AbortError'))
- }
- var xhr = new XMLHttpRequest();
- function abortXhr() {
- xhr.abort();
- }
- xhr.onload = function() {
- var options = {
- status: xhr.status,
- statusText: xhr.statusText,
- headers: parseHeaders(xhr.getAllResponseHeaders() || '')
- };
- options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
- var body = 'response' in xhr ? xhr.response : xhr.responseText;
- setTimeout(function() {
- resolve(new Response(body, options));
- }, 0);
- };
- xhr.onerror = function() {
- setTimeout(function() {
- reject(new TypeError('Network request failed'));
- }, 0);
- };
- xhr.ontimeout = function() {
- setTimeout(function() {
- reject(new TypeError('Network request failed'));
- }, 0);
- };
- xhr.onabort = function() {
- setTimeout(function() {
- reject(new exports.DOMException('Aborted', 'AbortError'));
- }, 0);
- };
- function fixUrl(url) {
- try {
- return url === '' && global.location.href ? global.location.href : url
- } catch (e) {
- return url
- }
- }
- xhr.open(request.method, fixUrl(request.url), true);
- if (request.credentials === 'include') {
- xhr.withCredentials = true;
- } else if (request.credentials === 'omit') {
- xhr.withCredentials = false;
- }
- if ('responseType' in xhr) {
- if (support.blob) {
- xhr.responseType = 'blob';
- } else if (
- support.arrayBuffer &&
- request.headers.get('Content-Type') &&
- request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1
- ) {
- xhr.responseType = 'arraybuffer';
- }
- }
- if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) {
- Object.getOwnPropertyNames(init.headers).forEach(function(name) {
- xhr.setRequestHeader(name, normalizeValue(init.headers[name]));
- });
- } else {
- request.headers.forEach(function(value, name) {
- xhr.setRequestHeader(name, value);
- });
- }
- if (request.signal) {
- request.signal.addEventListener('abort', abortXhr);
- xhr.onreadystatechange = function() {
- // DONE (success or failure)
- if (xhr.readyState === 4) {
- request.signal.removeEventListener('abort', abortXhr);
- }
- };
- }
- xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
- })
- }
- fetch.polyfill = true;
- if (!global.fetch) {
- global.fetch = fetch;
- global.Headers = Headers;
- global.Request = Request;
- global.Response = Response;
- }
- exports.Headers = Headers;
- exports.Request = Request;
- exports.Response = Response;
- exports.fetch = fetch;
- Object.defineProperty(exports, '__esModule', { value: true });
- })));
|