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