49 lines
1.4 KiB
JavaScript
49 lines
1.4 KiB
JavaScript
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);
|
|
}
|
|
});
|
|
},
|
|
};
|
|
}
|