You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					471 lines
				
				12 KiB
			
		
		
			
		
	
	
					471 lines
				
				12 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | var bind = require('./helpers/bind'); | ||
|  | 
 | ||
|  | // utils is a library of generic helper functions non-specific to axios
 | ||
|  | 
 | ||
|  | var toString = Object.prototype.toString; | ||
|  | 
 | ||
|  | // eslint-disable-next-line func-names
 | ||
|  | var kindOf = (function(cache) { | ||
|  |   // eslint-disable-next-line func-names
 | ||
|  |   return function(thing) { | ||
|  |     var str = toString.call(thing); | ||
|  |     return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); | ||
|  |   }; | ||
|  | })(Object.create(null)); | ||
|  | 
 | ||
|  | function kindOfTest(type) { | ||
|  |   type = type.toLowerCase(); | ||
|  |   return function isKindOf(thing) { | ||
|  |     return kindOf(thing) === type; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is an Array | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is an Array, otherwise false | ||
|  |  */ | ||
|  | function isArray(val) { | ||
|  |   return Array.isArray(val); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is undefined | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if the value is undefined, otherwise false | ||
|  |  */ | ||
|  | function isUndefined(val) { | ||
|  |   return typeof val === 'undefined'; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a Buffer | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a Buffer, otherwise false | ||
|  |  */ | ||
|  | function isBuffer(val) { | ||
|  |   return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) | ||
|  |     && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is an ArrayBuffer | ||
|  |  * | ||
|  |  * @function | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is an ArrayBuffer, otherwise false | ||
|  |  */ | ||
|  | var isArrayBuffer = kindOfTest('ArrayBuffer'); | ||
|  | 
 | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a view on an ArrayBuffer | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false | ||
|  |  */ | ||
|  | function isArrayBufferView(val) { | ||
|  |   var result; | ||
|  |   if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { | ||
|  |     result = ArrayBuffer.isView(val); | ||
|  |   } else { | ||
|  |     result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); | ||
|  |   } | ||
|  |   return result; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a String | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a String, otherwise false | ||
|  |  */ | ||
|  | function isString(val) { | ||
|  |   return typeof val === 'string'; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a Number | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a Number, otherwise false | ||
|  |  */ | ||
|  | function isNumber(val) { | ||
|  |   return typeof val === 'number'; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is an Object | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is an Object, otherwise false | ||
|  |  */ | ||
|  | function isObject(val) { | ||
|  |   return val !== null && typeof val === 'object'; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a plain Object | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @return {boolean} True if value is a plain Object, otherwise false | ||
|  |  */ | ||
|  | function isPlainObject(val) { | ||
|  |   if (kindOf(val) !== 'object') { | ||
|  |     return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   var prototype = Object.getPrototypeOf(val); | ||
|  |   return prototype === null || prototype === Object.prototype; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a Date | ||
|  |  * | ||
|  |  * @function | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a Date, otherwise false | ||
|  |  */ | ||
|  | var isDate = kindOfTest('Date'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a File | ||
|  |  * | ||
|  |  * @function | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a File, otherwise false | ||
|  |  */ | ||
|  | var isFile = kindOfTest('File'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a Blob | ||
|  |  * | ||
|  |  * @function | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a Blob, otherwise false | ||
|  |  */ | ||
|  | var isBlob = kindOfTest('Blob'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a FileList | ||
|  |  * | ||
|  |  * @function | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a File, otherwise false | ||
|  |  */ | ||
|  | var isFileList = kindOfTest('FileList'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a Function | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a Function, otherwise false | ||
|  |  */ | ||
|  | function isFunction(val) { | ||
|  |   return toString.call(val) === '[object Function]'; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a Stream | ||
|  |  * | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a Stream, otherwise false | ||
|  |  */ | ||
|  | function isStream(val) { | ||
|  |   return isObject(val) && isFunction(val.pipe); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a FormData | ||
|  |  * | ||
|  |  * @param {Object} thing The value to test | ||
|  |  * @returns {boolean} True if value is an FormData, otherwise false | ||
|  |  */ | ||
|  | function isFormData(thing) { | ||
|  |   var pattern = '[object FormData]'; | ||
|  |   return thing && ( | ||
|  |     (typeof FormData === 'function' && thing instanceof FormData) || | ||
|  |     toString.call(thing) === pattern || | ||
|  |     (isFunction(thing.toString) && thing.toString() === pattern) | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if a value is a URLSearchParams object | ||
|  |  * @function | ||
|  |  * @param {Object} val The value to test | ||
|  |  * @returns {boolean} True if value is a URLSearchParams object, otherwise false | ||
|  |  */ | ||
|  | var isURLSearchParams = kindOfTest('URLSearchParams'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Trim excess whitespace off the beginning and end of a string | ||
|  |  * | ||
|  |  * @param {String} str The String to trim | ||
|  |  * @returns {String} The String freed of excess whitespace | ||
|  |  */ | ||
|  | function trim(str) { | ||
|  |   return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Determine if we're running in a standard browser environment | ||
|  |  * | ||
|  |  * This allows axios to run in a web worker, and react-native. | ||
|  |  * Both environments support XMLHttpRequest, but not fully standard globals. | ||
|  |  * | ||
|  |  * web workers: | ||
|  |  *  typeof window -> undefined | ||
|  |  *  typeof document -> undefined | ||
|  |  * | ||
|  |  * react-native: | ||
|  |  *  navigator.product -> 'ReactNative' | ||
|  |  * nativescript | ||
|  |  *  navigator.product -> 'NativeScript' or 'NS' | ||
|  |  */ | ||
|  | function isStandardBrowserEnv() { | ||
|  |   if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || | ||
|  |                                            navigator.product === 'NativeScript' || | ||
|  |                                            navigator.product === 'NS')) { | ||
|  |     return false; | ||
|  |   } | ||
|  |   return ( | ||
|  |     typeof window !== 'undefined' && | ||
|  |     typeof document !== 'undefined' | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Iterate over an Array or an Object invoking a function for each item. | ||
|  |  * | ||
|  |  * If `obj` is an Array callback will be called passing | ||
|  |  * the value, index, and complete array for each item. | ||
|  |  * | ||
|  |  * If 'obj' is an Object callback will be called passing | ||
|  |  * the value, key, and complete object for each property. | ||
|  |  * | ||
|  |  * @param {Object|Array} obj The object to iterate | ||
|  |  * @param {Function} fn The callback to invoke for each item | ||
|  |  */ | ||
|  | function forEach(obj, fn) { | ||
|  |   // Don't bother if no value provided
 | ||
|  |   if (obj === null || typeof obj === 'undefined') { | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Force an array if not already something iterable
 | ||
|  |   if (typeof obj !== 'object') { | ||
|  |     /*eslint no-param-reassign:0*/ | ||
|  |     obj = [obj]; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (isArray(obj)) { | ||
|  |     // Iterate over array values
 | ||
|  |     for (var i = 0, l = obj.length; i < l; i++) { | ||
|  |       fn.call(null, obj[i], i, obj); | ||
|  |     } | ||
|  |   } else { | ||
|  |     // Iterate over object keys
 | ||
|  |     for (var key in obj) { | ||
|  |       if (Object.prototype.hasOwnProperty.call(obj, key)) { | ||
|  |         fn.call(null, obj[key], key, obj); | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Accepts varargs expecting each argument to be an object, then | ||
|  |  * immutably merges the properties of each object and returns result. | ||
|  |  * | ||
|  |  * When multiple objects contain the same key the later object in | ||
|  |  * the arguments list will take precedence. | ||
|  |  * | ||
|  |  * Example: | ||
|  |  * | ||
|  |  * ```js
 | ||
|  |  * var result = merge({foo: 123}, {foo: 456}); | ||
|  |  * console.log(result.foo); // outputs 456
 | ||
|  |  * ```
 | ||
|  |  * | ||
|  |  * @param {Object} obj1 Object to merge | ||
|  |  * @returns {Object} Result of all merge properties | ||
|  |  */ | ||
|  | function merge(/* obj1, obj2, obj3, ... */) { | ||
|  |   var result = {}; | ||
|  |   function assignValue(val, key) { | ||
|  |     if (isPlainObject(result[key]) && isPlainObject(val)) { | ||
|  |       result[key] = merge(result[key], val); | ||
|  |     } else if (isPlainObject(val)) { | ||
|  |       result[key] = merge({}, val); | ||
|  |     } else if (isArray(val)) { | ||
|  |       result[key] = val.slice(); | ||
|  |     } else { | ||
|  |       result[key] = val; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   for (var i = 0, l = arguments.length; i < l; i++) { | ||
|  |     forEach(arguments[i], assignValue); | ||
|  |   } | ||
|  |   return result; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Extends object a by mutably adding to it the properties of object b. | ||
|  |  * | ||
|  |  * @param {Object} a The object to be extended | ||
|  |  * @param {Object} b The object to copy properties from | ||
|  |  * @param {Object} thisArg The object to bind function to | ||
|  |  * @return {Object} The resulting value of object a | ||
|  |  */ | ||
|  | function extend(a, b, thisArg) { | ||
|  |   forEach(b, function assignValue(val, key) { | ||
|  |     if (thisArg && typeof val === 'function') { | ||
|  |       a[key] = bind(val, thisArg); | ||
|  |     } else { | ||
|  |       a[key] = val; | ||
|  |     } | ||
|  |   }); | ||
|  |   return a; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) | ||
|  |  * | ||
|  |  * @param {string} content with BOM | ||
|  |  * @return {string} content value without BOM | ||
|  |  */ | ||
|  | function stripBOM(content) { | ||
|  |   if (content.charCodeAt(0) === 0xFEFF) { | ||
|  |     content = content.slice(1); | ||
|  |   } | ||
|  |   return content; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Inherit the prototype methods from one constructor into another | ||
|  |  * @param {function} constructor | ||
|  |  * @param {function} superConstructor | ||
|  |  * @param {object} [props] | ||
|  |  * @param {object} [descriptors] | ||
|  |  */ | ||
|  | 
 | ||
|  | function inherits(constructor, superConstructor, props, descriptors) { | ||
|  |   constructor.prototype = Object.create(superConstructor.prototype, descriptors); | ||
|  |   constructor.prototype.constructor = constructor; | ||
|  |   props && Object.assign(constructor.prototype, props); | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Resolve object with deep prototype chain to a flat object | ||
|  |  * @param {Object} sourceObj source object | ||
|  |  * @param {Object} [destObj] | ||
|  |  * @param {Function} [filter] | ||
|  |  * @returns {Object} | ||
|  |  */ | ||
|  | 
 | ||
|  | function toFlatObject(sourceObj, destObj, filter) { | ||
|  |   var props; | ||
|  |   var i; | ||
|  |   var prop; | ||
|  |   var merged = {}; | ||
|  | 
 | ||
|  |   destObj = destObj || {}; | ||
|  | 
 | ||
|  |   do { | ||
|  |     props = Object.getOwnPropertyNames(sourceObj); | ||
|  |     i = props.length; | ||
|  |     while (i-- > 0) { | ||
|  |       prop = props[i]; | ||
|  |       if (!merged[prop]) { | ||
|  |         destObj[prop] = sourceObj[prop]; | ||
|  |         merged[prop] = true; | ||
|  |       } | ||
|  |     } | ||
|  |     sourceObj = Object.getPrototypeOf(sourceObj); | ||
|  |   } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); | ||
|  | 
 | ||
|  |   return destObj; | ||
|  | } | ||
|  | 
 | ||
|  | /* | ||
|  |  * determines whether a string ends with the characters of a specified string | ||
|  |  * @param {String} str | ||
|  |  * @param {String} searchString | ||
|  |  * @param {Number} [position= 0] | ||
|  |  * @returns {boolean} | ||
|  |  */ | ||
|  | function endsWith(str, searchString, position) { | ||
|  |   str = String(str); | ||
|  |   if (position === undefined || position > str.length) { | ||
|  |     position = str.length; | ||
|  |   } | ||
|  |   position -= searchString.length; | ||
|  |   var lastIndex = str.indexOf(searchString, position); | ||
|  |   return lastIndex !== -1 && lastIndex === position; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | /** | ||
|  |  * Returns new array from array like object | ||
|  |  * @param {*} [thing] | ||
|  |  * @returns {Array} | ||
|  |  */ | ||
|  | function toArray(thing) { | ||
|  |   if (!thing) return null; | ||
|  |   var i = thing.length; | ||
|  |   if (isUndefined(i)) return null; | ||
|  |   var arr = new Array(i); | ||
|  |   while (i-- > 0) { | ||
|  |     arr[i] = thing[i]; | ||
|  |   } | ||
|  |   return arr; | ||
|  | } | ||
|  | 
 | ||
|  | // eslint-disable-next-line func-names
 | ||
|  | var isTypedArray = (function(TypedArray) { | ||
|  |   // eslint-disable-next-line func-names
 | ||
|  |   return function(thing) { | ||
|  |     return TypedArray && thing instanceof TypedArray; | ||
|  |   }; | ||
|  | })(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array)); | ||
|  | 
 | ||
|  | module.exports = { | ||
|  |   isArray: isArray, | ||
|  |   isArrayBuffer: isArrayBuffer, | ||
|  |   isBuffer: isBuffer, | ||
|  |   isFormData: isFormData, | ||
|  |   isArrayBufferView: isArrayBufferView, | ||
|  |   isString: isString, | ||
|  |   isNumber: isNumber, | ||
|  |   isObject: isObject, | ||
|  |   isPlainObject: isPlainObject, | ||
|  |   isUndefined: isUndefined, | ||
|  |   isDate: isDate, | ||
|  |   isFile: isFile, | ||
|  |   isBlob: isBlob, | ||
|  |   isFunction: isFunction, | ||
|  |   isStream: isStream, | ||
|  |   isURLSearchParams: isURLSearchParams, | ||
|  |   isStandardBrowserEnv: isStandardBrowserEnv, | ||
|  |   forEach: forEach, | ||
|  |   merge: merge, | ||
|  |   extend: extend, | ||
|  |   trim: trim, | ||
|  |   stripBOM: stripBOM, | ||
|  |   inherits: inherits, | ||
|  |   toFlatObject: toFlatObject, | ||
|  |   kindOf: kindOf, | ||
|  |   kindOfTest: kindOfTest, | ||
|  |   endsWith: endsWith, | ||
|  |   toArray: toArray, | ||
|  |   isTypedArray: isTypedArray, | ||
|  |   isFileList: isFileList | ||
|  | }; |