82f2b76e25
We now use webpack instead of SystemJS, effectively bundling modules into one file (plus commons chunks) for every entry point. This results in a much smaller extension size (almost half). Furthermore we use yarn/npm even for extension run-time dependencies. This relieves us from manually vendoring and building dependencies. It's also easier to understand for new developers familiar with node.
117 lines
2.4 KiB
JavaScript
117 lines
2.4 KiB
JavaScript
var isBuffer = require('is-buffer');
|
|
var toString = Object.prototype.toString;
|
|
|
|
/**
|
|
* Get the native `typeof` a value.
|
|
*
|
|
* @param {*} `val`
|
|
* @return {*} Native javascript type
|
|
*/
|
|
|
|
module.exports = function kindOf(val) {
|
|
// primitivies
|
|
if (typeof val === 'undefined') {
|
|
return 'undefined';
|
|
}
|
|
if (val === null) {
|
|
return 'null';
|
|
}
|
|
if (val === true || val === false || val instanceof Boolean) {
|
|
return 'boolean';
|
|
}
|
|
if (typeof val === 'string' || val instanceof String) {
|
|
return 'string';
|
|
}
|
|
if (typeof val === 'number' || val instanceof Number) {
|
|
return 'number';
|
|
}
|
|
|
|
// functions
|
|
if (typeof val === 'function' || val instanceof Function) {
|
|
return 'function';
|
|
}
|
|
|
|
// array
|
|
if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {
|
|
return 'array';
|
|
}
|
|
|
|
// check for instances of RegExp and Date before calling `toString`
|
|
if (val instanceof RegExp) {
|
|
return 'regexp';
|
|
}
|
|
if (val instanceof Date) {
|
|
return 'date';
|
|
}
|
|
|
|
// other objects
|
|
var type = toString.call(val);
|
|
|
|
if (type === '[object RegExp]') {
|
|
return 'regexp';
|
|
}
|
|
if (type === '[object Date]') {
|
|
return 'date';
|
|
}
|
|
if (type === '[object Arguments]') {
|
|
return 'arguments';
|
|
}
|
|
if (type === '[object Error]') {
|
|
return 'error';
|
|
}
|
|
|
|
// buffer
|
|
if (typeof Buffer !== 'undefined' && isBuffer(val)) {
|
|
return 'buffer';
|
|
}
|
|
|
|
// es6: Map, WeakMap, Set, WeakSet
|
|
if (type === '[object Set]') {
|
|
return 'set';
|
|
}
|
|
if (type === '[object WeakSet]') {
|
|
return 'weakset';
|
|
}
|
|
if (type === '[object Map]') {
|
|
return 'map';
|
|
}
|
|
if (type === '[object WeakMap]') {
|
|
return 'weakmap';
|
|
}
|
|
if (type === '[object Symbol]') {
|
|
return 'symbol';
|
|
}
|
|
|
|
// typed arrays
|
|
if (type === '[object Int8Array]') {
|
|
return 'int8array';
|
|
}
|
|
if (type === '[object Uint8Array]') {
|
|
return 'uint8array';
|
|
}
|
|
if (type === '[object Uint8ClampedArray]') {
|
|
return 'uint8clampedarray';
|
|
}
|
|
if (type === '[object Int16Array]') {
|
|
return 'int16array';
|
|
}
|
|
if (type === '[object Uint16Array]') {
|
|
return 'uint16array';
|
|
}
|
|
if (type === '[object Int32Array]') {
|
|
return 'int32array';
|
|
}
|
|
if (type === '[object Uint32Array]') {
|
|
return 'uint32array';
|
|
}
|
|
if (type === '[object Float32Array]') {
|
|
return 'float32array';
|
|
}
|
|
if (type === '[object Float64Array]') {
|
|
return 'float64array';
|
|
}
|
|
|
|
// must be a plain object
|
|
return 'object';
|
|
};
|