Updating index.js to patch the TT violation using the Function workaround

Change-Id: I857bf52804157c537cd1eabe5091c6929983e55d
diff --git a/index.js b/index.js
index 253d574..ed5bb1d 100644
--- a/index.js
+++ b/index.js
@@ -5,17 +5,42 @@
 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) {
-			const policy = trustedTypes.createPolicy("myEscapePolicy", {
-				createScript: (_ignored) => "return function*() {}",
-			});
-			const safeScript = policy.createScript("_ignored");
-			return Function(safeScript);
+			return TrustedFunction('return function*() {}');
 		}
 		else {
 			return Function('return function*() {}')();