mirror of
https://github.com/BetterSEQTA/BetterSEQTA-Plus.git
synced 2026-06-05 19:24:39 +00:00
44 lines
1.6 KiB
TypeScript
44 lines
1.6 KiB
TypeScript
import type { Plugin } from "vite";
|
|
|
|
/**
|
|
* Firefox extension pages forbid eval / `Function` constructor. Some deps still emit:
|
|
* - `Function(\`return this\`)()` (lodash-style global)
|
|
* - `try { return Function(\`\`) / new Function("") … }` (feature probes, e.g. PDF.js / ORT)
|
|
*/
|
|
export function firefoxStripFunctionProbe(): Plugin {
|
|
return {
|
|
name: "firefox-strip-function-probe",
|
|
apply: "build",
|
|
enforce: "post",
|
|
generateBundle(_options, bundle) {
|
|
if ((process.env.MODE || "chrome").toLowerCase() !== "firefox") return;
|
|
|
|
const literalReplacements: [string, string][] = [
|
|
['try{return new Function(""),!0}catch{return!1}', "return!1"],
|
|
["try{return new Function(''),!0}catch{return!1}", "return!1"],
|
|
['try{return new Function(""),true}catch{return false}', "return false"],
|
|
["try{return new Function(''),true}catch{return false}", "return false"],
|
|
// Empty template literal probe (minifier output)
|
|
["try{return Function(``),!0}catch{return!1}", "return!1"],
|
|
];
|
|
|
|
for (const chunk of Object.values(bundle)) {
|
|
if (chunk.type !== "chunk" || typeof chunk.code !== "string") continue;
|
|
let { code } = chunk;
|
|
|
|
code = code.replace(/Function\(`return this`\)\(\)/g, "(globalThis)");
|
|
code = code.replace(/Function\("return this"\)\(\)/g, "(globalThis)");
|
|
code = code.replace(/Function\('return this'\)\(\)/g, "(globalThis)");
|
|
|
|
for (const [from, to] of literalReplacements) {
|
|
if (code.includes(from)) {
|
|
code = code.split(from).join(to);
|
|
}
|
|
}
|
|
|
|
chunk.code = code;
|
|
}
|
|
},
|
|
};
|
|
}
|