39 lines
947 B
JavaScript
39 lines
947 B
JavaScript
'use strict';
|
|
|
|
var toStr = Object.prototype.toString;
|
|
var fnToStr = Function.prototype.toString;
|
|
var isFnRegex = /^\s*async(?:\s+function(?:\s+|\()|\s*\()/;
|
|
var hasToStringTag = require('has-tostringtag/shams')();
|
|
var getProto = Object.getPrototypeOf;
|
|
var getAsyncFunc = function () { // eslint-disable-line consistent-return
|
|
if (!hasToStringTag) {
|
|
return false;
|
|
}
|
|
try {
|
|
return Function('return async function () {}')();
|
|
} catch (e) {
|
|
}
|
|
};
|
|
var AsyncFunction;
|
|
|
|
module.exports = function isAsyncFunction(fn) {
|
|
if (typeof fn !== 'function') {
|
|
return false;
|
|
}
|
|
if (isFnRegex.test(fnToStr.call(fn))) {
|
|
return true;
|
|
}
|
|
if (!hasToStringTag) {
|
|
var str = toStr.call(fn);
|
|
return str === '[object AsyncFunction]';
|
|
}
|
|
if (!getProto) {
|
|
return false;
|
|
}
|
|
if (typeof AsyncFunction === 'undefined') {
|
|
var asyncFunc = getAsyncFunc();
|
|
AsyncFunction = asyncFunc ? getProto(asyncFunc) : false;
|
|
}
|
|
return getProto(fn) === AsyncFunction;
|
|
};
|