126 lines
3.3 KiB
Plaintext
126 lines
3.3 KiB
Plaintext
'use strict';
|
|
|
|
var whichBoxedPrimitive = require('which-boxed-primitive');
|
|
var whichCollection = require('which-collection');
|
|
var whichTypedArray = require('which-typed-array');
|
|
var isArray = require('isarray');
|
|
var isDate = require('is-date-object');
|
|
var isRegex = require('is-regex');
|
|
var isWeakRef = require('is-weakref');
|
|
var isFinalizationRegistry = require('is-finalizationregistry');
|
|
var name = require('function.prototype.name');
|
|
var isGeneratorFunction = require('is-generator-function');
|
|
var isAsyncFunction = require('is-async-function');
|
|
var hasToStringTag = require('has-tostringtag/shams')();
|
|
var toStringTag = hasToStringTag && Symbol.toStringTag;
|
|
|
|
var $Object = Object;
|
|
|
|
var promiseThen = typeof Promise === 'function' && Promise.prototype.then;
|
|
var isPromise = function isPromise(value) {
|
|
if (!value || typeof value !== 'object' || !promiseThen) {
|
|
return false;
|
|
}
|
|
try {
|
|
promiseThen.call(value, null, function () {});
|
|
return true;
|
|
} catch (e) {}
|
|
return false;
|
|
};
|
|
|
|
var isKnownBuiltin = function isKnownBuiltin(builtinName) {
|
|
return builtinName
|
|
// primitives
|
|
&& builtinName !== 'BigInt'
|
|
&& builtinName !== 'Boolean'
|
|
&& builtinName !== 'Null'
|
|
&& builtinName !== 'Number'
|
|
&& builtinName !== 'String'
|
|
&& builtinName !== 'Symbol'
|
|
&& builtinName !== 'Undefined'
|
|
// namespaces
|
|
&& builtinName !== 'Math'
|
|
&& builtinName !== 'JSON'
|
|
&& builtinName !== 'Reflect'
|
|
&& builtinName !== 'Atomics'
|
|
// collections
|
|
&& builtinName !== 'Map'
|
|
&& builtinName !== 'Set'
|
|
&& builtinName !== 'WeakMap'
|
|
&& builtinName !== 'WeakSet'
|
|
// typed arrays
|
|
&& builtinName !== 'BigInt64Array'
|
|
&& builtinName !== 'BigUint64Array'
|
|
&& builtinName !== 'Float32Array'
|
|
&& builtinName !== 'Float64Array'
|
|
&& builtinName !== 'Int16Array'
|
|
&& builtinName !== 'Int32Array'
|
|
&& builtinName !== 'Int8Array'
|
|
&& builtinName !== 'Uint16Array'
|
|
&& builtinName !== 'Uint32Array'
|
|
&& builtinName !== 'Uint8Array'
|
|
&& builtinName !== 'Uint8ClampedArray'
|
|
// checked explicitly
|
|
&& builtinName !== 'Array'
|
|
&& builtinName !== 'Date'
|
|
&& builtinName !== 'FinalizationRegistry'
|
|
&& builtinName !== 'Promise'
|
|
&& builtinName !== 'RegExp'
|
|
&& builtinName !== 'WeakRef'
|
|
// functions
|
|
&& builtinName !== 'Function'
|
|
&& builtinName !== 'GeneratorFunction'
|
|
&& builtinName !== 'AsyncFunction';
|
|
};
|
|
|
|
module.exports = function whichBuiltinType(value) {
|
|
if (value == null) {
|
|
return value;
|
|
}
|
|
// covers: primitives, {,Weak}Map/Set, typed arrays
|
|
var which = whichBoxedPrimitive($Object(value)) || whichCollection(value) || whichTypedArray(value);
|
|
if (which) {
|
|
return which;
|
|
}
|
|
if (isArray(value)) {
|
|
return 'Array';
|
|
}
|
|
if (isDate(value)) {
|
|
return 'Date';
|
|
}
|
|
if (isRegex(value)) {
|
|
return 'RegExp';
|
|
}
|
|
if (isWeakRef(value)) {
|
|
return 'WeakRef';
|
|
}
|
|
if (isFinalizationRegistry(value)) {
|
|
return 'FinalizationRegistry';
|
|
}
|
|
if (typeof value === 'function') {
|
|
if (isGeneratorFunction(value)) {
|
|
return 'GeneratorFunction';
|
|
}
|
|
if (isAsyncFunction(value)) {
|
|
return 'AsyncFunction';
|
|
}
|
|
return 'Function';
|
|
}
|
|
if (isPromise(value)) {
|
|
return 'Promise';
|
|
}
|
|
if (toStringTag && toStringTag in value) {
|
|
var tag = value[toStringTag];
|
|
if (isKnownBuiltin(tag)) {
|
|
return tag;
|
|
}
|
|
}
|
|
if (typeof value.constructor === 'function') {
|
|
var constructorName = name(value.constructor);
|
|
if (isKnownBuiltin(constructorName)) {
|
|
return constructorName;
|
|
}
|
|
}
|
|
return 'Object';
|
|
};
|