index.js 1000 B

1234567891011121314151617181920212223242526272829303132333435363738
  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 GeneratorFunction;
  17. module.exports = function isGeneratorFunction(fn) {
  18. if (typeof fn !== 'function') {
  19. return false;
  20. }
  21. if (isFnRegex.test(fnToStr.call(fn))) {
  22. return true;
  23. }
  24. if (!hasToStringTag) {
  25. var str = toStr.call(fn);
  26. return str === '[object GeneratorFunction]';
  27. }
  28. if (!getProto) {
  29. return false;
  30. }
  31. if (typeof GeneratorFunction === 'undefined') {
  32. var generatorFunc = getGeneratorFunc();
  33. GeneratorFunction = generatorFunc ? getProto(generatorFunc) : false;
  34. }
  35. return getProto(fn) === GeneratorFunction;
  36. };