index.js 885 B

123456789101112131415161718192021222324252627282930313233
  1. 'use strict';
  2. var toStr = Object.prototype.toString;
  3. var fnToStr = Function.prototype.toString;
  4. var isFnRegex = /^\s*(?:function)?\*/;
  5. var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
  6. var getProto = Object.getPrototypeOf;
  7. var getGeneratorFunc = function () { // eslint-disable-line consistent-return
  8. if (!hasToStringTag) {
  9. return false;
  10. }
  11. try {
  12. return Function('return function*() {}')();
  13. } catch (e) {
  14. }
  15. };
  16. var generatorFunc = getGeneratorFunc();
  17. var GeneratorFunction = generatorFunc ? getProto(generatorFunc) : {};
  18. module.exports = function isGeneratorFunction(fn) {
  19. if (typeof fn !== 'function') {
  20. return false;
  21. }
  22. if (isFnRegex.test(fnToStr.call(fn))) {
  23. return true;
  24. }
  25. if (!hasToStringTag) {
  26. var str = toStr.call(fn);
  27. return str === '[object GeneratorFunction]';
  28. }
  29. return getProto(fn) === GeneratorFunction;
  30. };