index.js 830 B

1234567891011121314151617181920212223242526272829303132
  1. 'use strict';
  2. var callBound = require('call-bound');
  3. var safeRegexTest = require('safe-regex-test');
  4. var toStr = callBound('Object.prototype.toString');
  5. var fnToStr = callBound('Function.prototype.toString');
  6. var isFnRegex = safeRegexTest(/^\s*async(?:\s+function(?:\s+|\()|\s*\()/);
  7. var hasToStringTag = require('has-tostringtag/shams')();
  8. var getProto = require('get-proto');
  9. var getAsyncFunc = require('async-function');
  10. /** @type {import('.')} */
  11. module.exports = function isAsyncFunction(fn) {
  12. if (typeof fn !== 'function') {
  13. return false;
  14. }
  15. if (isFnRegex(fnToStr(fn))) {
  16. return true;
  17. }
  18. if (!hasToStringTag) {
  19. var str = toStr(fn);
  20. return str === '[object AsyncFunction]';
  21. }
  22. if (!getProto) {
  23. return false;
  24. }
  25. var asyncFunc = getAsyncFunc();
  26. return asyncFunc && asyncFunc.prototype === getProto(fn);
  27. };