| 'use strict'; |
| |
| var bind = require('./helpers/bind'); |
| |
| /*global toString:true*/ |
| |
| // 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 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 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 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 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.replace(/^\s*/, '').replace(/\s*$/, ''); |
| } |
| |
| /** |
| * 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: |
| * typeof document.createElement -> undefined |
| */ |
| function isStandardBrowserEnv() { |
| return ( |
| typeof window !== 'undefined' && |
| typeof document !== 'undefined' && |
| typeof document.createElement === 'function' |
| ); |
| } |
| |
| /** |
| * 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' && !isArray(obj)) { |
| /*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 (typeof result[key] === 'object' && typeof val === 'object') { |
| result[key] = merge(result[key], val); |
| } 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; |
| } |
| |
| module.exports = { |
| isArray: isArray, |
| isArrayBuffer: isArrayBuffer, |
| isFormData: isFormData, |
| isArrayBufferView: isArrayBufferView, |
| isString: isString, |
| isNumber: isNumber, |
| isObject: isObject, |
| isUndefined: isUndefined, |
| isDate: isDate, |
| isFile: isFile, |
| isBlob: isBlob, |
| isFunction: isFunction, |
| isStream: isStream, |
| isURLSearchParams: isURLSearchParams, |
| isStandardBrowserEnv: isStandardBrowserEnv, |
| forEach: forEach, |
| merge: merge, |
| extend: extend, |
| trim: trim |
| }; |