A plugin for esbuild that obfuscates JavaScript using javascript-obfuscator. This plugin allows developers to selectively obfuscate JavaScript files during the build process, enhancing security by making the code more difficult to read and understand.
Install the plugin with npm:
npm install esbuild-plugin-obfuscator --save-devTo use the esbuild-plugin-obfuscator, import it in your build script and configure it according to your needs. Below is an example of how to set up the plugin with esbuild:
import esbuild from 'esbuild';
import { ObfuscatorPlugin } from 'esbuild-plugin-obfuscator';
// Run esbuild with the obfuscator plugin and micromatch file filtering
esbuild.build({
entryPoints: ['src/main.js'], // Entry files to build
bundle: true,
outfile: 'dist/output.js', // Output file
plugins: [
ObfuscatorPlugin({
compact: true, // Obfuscator options
controlFlowFlattening: true,
filter: ['**/sanitize.js'], // Obfuscate 'sanitize.js' only
}),
],
}).then(() => {
console.log('Build complete with selective obfuscation');
}).catch(() => process.exit(1));The ObfuscatorPlugin accepts the following options:
-
filter (
Array<string>): A list of micromatch patterns that specify which files should be obfuscated. Default is an empty array[]. -
shouldObfuscateOutput (
boolean): If set totrue, the plugin will obfuscate all output files after the build process is completed. Default isfalse. -
shouldWriteOutputSourceMap (
boolean): If set totrue, writes the output source map files when obfuscating the final output. This option is only relevant ifshouldObfuscateOutputis true. Default isfalse. -
ignoreRequireImports (
boolean): If set totrue, it prevents obfuscation ofrequireimports. Could be helpful in some cases when for some reason runtime environment requires these imports with static strings only. -
options (
Object): Additional options for thejavascript-obfuscator. This can include various configurations available in javascript-obfuscator.
The plugin automatically generates source maps for obfuscated code to help with debugging:
- During transform phase: Source maps are automatically generated and included in esbuild's source map chain, allowing you to debug obfuscated code back to the original source.
- During output phase: When using
shouldObfuscateOutput: true, you can enableshouldWriteOutputSourceMap: trueto write separate.mapfiles alongside the obfuscated output files.
You can also configure the plugin to obfuscate the output files with source map generation:
esbuild.build({
entryPoints: ['src/main.js'],
bundle: true,
outfile: 'dist/output.js',
sourcemap: true, // Enable esbuild source maps
plugins: [
ObfuscatorPlugin({
shouldObfuscateOutput: true, // Obfuscate all output files
shouldWriteOutputSourceMap: true, // Generate .map files for obfuscated output
compact: true,
controlFlowFlattening: true,
}),
],
}).then(() => {
console.log('Build complete with output obfuscation and source maps');
}).catch(() => process.exit(1));For transform-time obfuscation, source maps are automatically integrated into esbuild's source map chain:
esbuild.build({
entryPoints: ['src/main.js'],
bundle: true,
outfile: 'dist/output.js',
sourcemap: true, // Enable esbuild source maps
plugins: [
ObfuscatorPlugin({
filter: ['**/sanitize.js'], // Obfuscate specific files
compact: true,
controlFlowFlattening: true,
}),
],
}).then(() => {
console.log('Build complete with selective obfuscation and integrated source maps');
}).catch(() => process.exit(1));The plugin uses micromatch to filter which files are obfuscated. You can use patterns like:
**/*.jsto match all JavaScript files.**/folder/*.jsto match JavaScript files in a specific folder.!**/exclude/**to exclude files from being obfuscated.
ObfuscatorPlugin({
filter: ['**/*.js', '!**/exclude/**'],
});Contributions are welcome! If you would like to contribute to this project, please fork the repository and submit a pull request. Ensure that your code follows the project's style and is well-documented.
This project is licensed under the MIT License.
- esbuild for providing a fast and efficient JavaScript bundler.
- javascript-obfuscator for powerful obfuscation capabilities.
- esbuild-extra - for extending Esbuild plugins abilities, especially for the
onTransformandonEndhooks.
If you encounter any issues or have questions, feel free to open an issue on the GitHub repository.