blob: ed5bb1d06ecb991b08a9160e5c545d78a44824bd [file] [log] [blame]
'use strict';
var toStr = Object.prototype.toString;
var fnToStr = Function.prototype.toString;
var isFnRegex = /^\s*(?:function)?\*/;
var hasToStringTag = require('has-tostringtag/shams')();
var getProto = Object.getPrototypeOf;
class TrustedFunction {
static policy = trustedTypes.createPolicy('TrustedFunctionWorkaround', {
createScript: (_, ...args) => {
args.forEach( (arg) => {
if (!trustedTypes.isScript(arg)) {
throw new Error("TrustedScripts only, please");
}
});
// NOTE: This is insecure without parsing the arguments and body,
// Malicious inputs can escape the function body and execute immediately!
const fnArgs = args.slice(0, -1).join(',');
const fnBody = args.pop().toString();
const body = `(function anonymous(
${fnArgs}
) {
${fnBody}
})`;
return body;
}
});
constructor(...args) {
return (window || self).eval(TrustedFunction.policy.createScript('', ...args));
}
}
var getGeneratorFunc = function () { // eslint-disable-line consistent-return
if (!hasToStringTag) {
return false;
}
try {
if (self.trustedTypes && self.trustedTypes.createPolicy) {
return TrustedFunction('return function*() {}');
}
else {
return Function('return function*() {}')();
}
} catch (e) {
}
};
var GeneratorFunction;
module.exports = function isGeneratorFunction(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 GeneratorFunction]';
}
if (!getProto) {
return false;
}
if (typeof GeneratorFunction === 'undefined') {
var generatorFunc = getGeneratorFunc();
GeneratorFunction = generatorFunc ? getProto(generatorFunc) : false;
}
return getProto(fn) === GeneratorFunction;
};