Files
note2any/tools/esbuild-obfuscator-plugin.mjs
2025-10-10 17:00:09 +08:00

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);
}
});
},
};
}