UNPKG

1.11 kBJavaScriptView Raw
1'use strict';
2
3var fnToStr = Function.prototype.toString;
4
5var constructorRegex = /^\s*class\b/;
6var isES6ClassFn = function isES6ClassFunction(value) {
7 try {
8 var fnStr = fnToStr.call(value);
9 return constructorRegex.test(fnStr);
10 } catch (e) {
11 return false; // not a function
12 }
13};
14
15var tryFunctionObject = function tryFunctionToStr(value) {
16 try {
17 if (isES6ClassFn(value)) { return false; }
18 fnToStr.call(value);
19 return true;
20 } catch (e) {
21 return false;
22 }
23};
24var toStr = Object.prototype.toString;
25var fnClass = '[object Function]';
26var genClass = '[object GeneratorFunction]';
27var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
28
29module.exports = function isCallable(value) {
30 if (!value) { return false; }
31 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
32 if (typeof value === 'function' && !value.prototype) { return true; }
33 if (hasToStringTag) { return tryFunctionObject(value); }
34 if (isES6ClassFn(value)) { return false; }
35 var strClass = toStr.call(value);
36 return strClass === fnClass || strClass === genClass;
37};