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.
		
		
		
		
			
				
					130 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					130 lines
				
				3.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var toString = Object.prototype.toString;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function kindOf(val) {
							 | 
						||
| 
								 | 
							
								  if (val === void 0) return 'undefined';
							 | 
						||
| 
								 | 
							
								  if (val === null) return 'null';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var type = typeof val;
							 | 
						||
| 
								 | 
							
								  if (type === 'boolean') return 'boolean';
							 | 
						||
| 
								 | 
							
								  if (type === 'string') return 'string';
							 | 
						||
| 
								 | 
							
								  if (type === 'number') return 'number';
							 | 
						||
| 
								 | 
							
								  if (type === 'symbol') return 'symbol';
							 | 
						||
| 
								 | 
							
								  if (type === 'function') {
							 | 
						||
| 
								 | 
							
								    return isGeneratorFn(val) ? 'generatorfunction' : 'function';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (isArray(val)) return 'array';
							 | 
						||
| 
								 | 
							
								  if (isBuffer(val)) return 'buffer';
							 | 
						||
| 
								 | 
							
								  if (isArguments(val)) return 'arguments';
							 | 
						||
| 
								 | 
							
								  if (isDate(val)) return 'date';
							 | 
						||
| 
								 | 
							
								  if (isError(val)) return 'error';
							 | 
						||
| 
								 | 
							
								  if (isRegexp(val)) return 'regexp';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  switch (ctorName(val)) {
							 | 
						||
| 
								 | 
							
								    case 'Symbol': return 'symbol';
							 | 
						||
| 
								 | 
							
								    case 'Promise': return 'promise';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Set, Map, WeakSet, WeakMap
							 | 
						||
| 
								 | 
							
								    case 'WeakMap': return 'weakmap';
							 | 
						||
| 
								 | 
							
								    case 'WeakSet': return 'weakset';
							 | 
						||
| 
								 | 
							
								    case 'Map': return 'map';
							 | 
						||
| 
								 | 
							
								    case 'Set': return 'set';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 8-bit typed arrays
							 | 
						||
| 
								 | 
							
								    case 'Int8Array': return 'int8array';
							 | 
						||
| 
								 | 
							
								    case 'Uint8Array': return 'uint8array';
							 | 
						||
| 
								 | 
							
								    case 'Uint8ClampedArray': return 'uint8clampedarray';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 16-bit typed arrays
							 | 
						||
| 
								 | 
							
								    case 'Int16Array': return 'int16array';
							 | 
						||
| 
								 | 
							
								    case 'Uint16Array': return 'uint16array';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 32-bit typed arrays
							 | 
						||
| 
								 | 
							
								    case 'Int32Array': return 'int32array';
							 | 
						||
| 
								 | 
							
								    case 'Uint32Array': return 'uint32array';
							 | 
						||
| 
								 | 
							
								    case 'Float32Array': return 'float32array';
							 | 
						||
| 
								 | 
							
								    case 'Float64Array': return 'float64array';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (isGeneratorObj(val)) {
							 | 
						||
| 
								 | 
							
								    return 'generator';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Non-plain objects
							 | 
						||
| 
								 | 
							
								  type = toString.call(val);
							 | 
						||
| 
								 | 
							
								  switch (type) {
							 | 
						||
| 
								 | 
							
								    case '[object Object]': return 'object';
							 | 
						||
| 
								 | 
							
								    // iterators
							 | 
						||
| 
								 | 
							
								    case '[object Map Iterator]': return 'mapiterator';
							 | 
						||
| 
								 | 
							
								    case '[object Set Iterator]': return 'setiterator';
							 | 
						||
| 
								 | 
							
								    case '[object String Iterator]': return 'stringiterator';
							 | 
						||
| 
								 | 
							
								    case '[object Array Iterator]': return 'arrayiterator';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // other
							 | 
						||
| 
								 | 
							
								  return type.slice(8, -1).toLowerCase().replace(/\s/g, '');
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function ctorName(val) {
							 | 
						||
| 
								 | 
							
								  return typeof val.constructor === 'function' ? val.constructor.name : null;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isArray(val) {
							 | 
						||
| 
								 | 
							
								  if (Array.isArray) return Array.isArray(val);
							 | 
						||
| 
								 | 
							
								  return val instanceof Array;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isError(val) {
							 | 
						||
| 
								 | 
							
								  return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isDate(val) {
							 | 
						||
| 
								 | 
							
								  if (val instanceof Date) return true;
							 | 
						||
| 
								 | 
							
								  return typeof val.toDateString === 'function'
							 | 
						||
| 
								 | 
							
								    && typeof val.getDate === 'function'
							 | 
						||
| 
								 | 
							
								    && typeof val.setDate === 'function';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isRegexp(val) {
							 | 
						||
| 
								 | 
							
								  if (val instanceof RegExp) return true;
							 | 
						||
| 
								 | 
							
								  return typeof val.flags === 'string'
							 | 
						||
| 
								 | 
							
								    && typeof val.ignoreCase === 'boolean'
							 | 
						||
| 
								 | 
							
								    && typeof val.multiline === 'boolean'
							 | 
						||
| 
								 | 
							
								    && typeof val.global === 'boolean';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isGeneratorFn(name, val) {
							 | 
						||
| 
								 | 
							
								  return ctorName(name) === 'GeneratorFunction';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isGeneratorObj(val) {
							 | 
						||
| 
								 | 
							
								  return typeof val.throw === 'function'
							 | 
						||
| 
								 | 
							
								    && typeof val.return === 'function'
							 | 
						||
| 
								 | 
							
								    && typeof val.next === 'function';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isArguments(val) {
							 | 
						||
| 
								 | 
							
								  try {
							 | 
						||
| 
								 | 
							
								    if (typeof val.length === 'number' && typeof val.callee === 'function') {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } catch (err) {
							 | 
						||
| 
								 | 
							
								    if (err.message.indexOf('callee') !== -1) {
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return false;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * If you need to support Safari 5-7 (8-10 yr-old browser),
							 | 
						||
| 
								 | 
							
								 * take a look at https://github.com/feross/is-buffer
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isBuffer(val) {
							 | 
						||
| 
								 | 
							
								  if (val.constructor && typeof val.constructor.isBuffer === 'function') {
							 | 
						||
| 
								 | 
							
								    return val.constructor.isBuffer(val);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return false;
							 | 
						||
| 
								 | 
							
								}
							 |