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.
349 lines
8.7 KiB
349 lines
8.7 KiB
'use strict'; |
|
|
|
var bind = require('./helpers/bind'); |
|
|
|
// utils is a library of generic helper functions non-specific to axios |
|
|
|
var toString = Object.prototype.toString; |
|
|
|
/** |
|
* 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 toString.call(val) === '[object Array]'; |
|
} |
|
|
|
/** |
|
* 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 |
|
* |
|
* @param {Object} val The value to test |
|
* @returns {boolean} True if value is an ArrayBuffer, otherwise false |
|
*/ |
|
function isArrayBuffer(val) { |
|
return toString.call(val) === '[object ArrayBuffer]'; |
|
} |
|
|
|
/** |
|
* Determine if a value is a FormData |
|
* |
|
* @param {Object} val The value to test |
|
* @returns {boolean} True if value is an FormData, otherwise false |
|
*/ |
|
function isFormData(val) { |
|
return (typeof FormData !== 'undefined') && (val instanceof FormData); |
|
} |
|
|
|
/** |
|
* 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) && (val.buffer instanceof ArrayBuffer); |
|
} |
|
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 (toString.call(val) !== '[object Object]') { |
|
return false; |
|
} |
|
|
|
var prototype = Object.getPrototypeOf(val); |
|
return prototype === null || prototype === Object.prototype; |
|
} |
|
|
|
/** |
|
* Determine if a value is a Date |
|
* |
|
* @param {Object} val The value to test |
|
* @returns {boolean} True if value is a Date, otherwise false |
|
*/ |
|
function isDate(val) { |
|
return toString.call(val) === '[object Date]'; |
|
} |
|
|
|
/** |
|
* Determine if a value is a File |
|
* |
|
* @param {Object} val The value to test |
|
* @returns {boolean} True if value is a File, otherwise false |
|
*/ |
|
function isFile(val) { |
|
return toString.call(val) === '[object File]'; |
|
} |
|
|
|
/** |
|
* Determine if a value is a Blob |
|
* |
|
* @param {Object} val The value to test |
|
* @returns {boolean} True if value is a Blob, otherwise false |
|
*/ |
|
function isBlob(val) { |
|
return toString.call(val) === '[object Blob]'; |
|
} |
|
|
|
/** |
|
* 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 URLSearchParams object |
|
* |
|
* @param {Object} val The value to test |
|
* @returns {boolean} True if value is a URLSearchParams object, otherwise false |
|
*/ |
|
function isURLSearchParams(val) { |
|
return typeof URLSearchParams !== 'undefined' && val instanceof 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; |
|
} |
|
|
|
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 |
|
};
|
|
|