update at 2025-10-10 17:00:09
This commit is contained in:
48
tools/esbuild-obfuscator-plugin.mjs
Normal file
48
tools/esbuild-obfuscator-plugin.mjs
Normal file
@@ -0,0 +1,48 @@
|
||||
import { promises as fs } from "fs";
|
||||
|
||||
// Esbuild plugin that optionally obfuscates the emitted bundle with javascript-obfuscator.
|
||||
export default function javascriptObfuscatorPlugin(obfuscatorOptions = {}) {
|
||||
let obfuscatorPromise;
|
||||
|
||||
const loadObfuscator = async () => {
|
||||
if (!obfuscatorPromise) {
|
||||
obfuscatorPromise = import("javascript-obfuscator")
|
||||
.then((module) => module.default ?? module)
|
||||
.catch((error) => {
|
||||
console.warn("[esbuild] javascript-obfuscator unavailable, skipping obfuscation.", error);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
return obfuscatorPromise;
|
||||
};
|
||||
|
||||
// Default to preserving line breaks unless explicitly overridden.
|
||||
if (typeof obfuscatorOptions.compact === "undefined") {
|
||||
obfuscatorOptions.compact = false;
|
||||
}
|
||||
|
||||
return {
|
||||
name: "javascript-obfuscator",
|
||||
setup(build) {
|
||||
build.onEnd(async (result) => {
|
||||
if (result.errors.length) return;
|
||||
const outfile = build.initialOptions.outfile;
|
||||
if (!outfile) return;
|
||||
|
||||
try {
|
||||
const obfuscator = await loadObfuscator();
|
||||
if (!obfuscator?.obfuscate) return;
|
||||
|
||||
const source = await fs.readFile(outfile, "utf8");
|
||||
const obfuscatedCode = obfuscator
|
||||
.obfuscate(source, obfuscatorOptions)
|
||||
.getObfuscatedCode();
|
||||
|
||||
await fs.writeFile(outfile, obfuscatedCode, "utf8");
|
||||
} catch (error) {
|
||||
console.warn("[esbuild] javascript-obfuscator plugin failed, continuing without obfuscation.", error);
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user