import { readdirSync, readFileSync, writeFileSync } from 'node:fs' import { basename, resolve } from 'node:path' import JavaScriptObfuscator from 'javascript-obfuscator' const assetsDirectory = resolve('dist/assets') const appChunks = readdirSync(assetsDirectory) .filter((file) => file.endsWith('.js') && !file.startsWith('vendor-')) .map((file) => resolve(assetsDirectory, file)) if (!appChunks.length) throw new Error('No application chunks found to obfuscate') const options = { identifierNamesGenerator: 'hexadecimal', stringArray: true, stringArrayEncoding: ['base64'], stringArrayThreshold: 0.75, splitStrings: true, splitStringsChunkLength: 8, controlFlowFlattening: false, deadCodeInjection: false, selfDefending: false, debugProtection: false, renameGlobals: false, sourceMap: false, } let originalBytes = 0 let obfuscatedBytes = 0 for (const file of appChunks) { const source = readFileSync(file, 'utf8') const output = JavaScriptObfuscator.obfuscate(source, options).getObfuscatedCode() writeFileSync(file, output) originalBytes += Buffer.byteLength(source) obfuscatedBytes += Buffer.byteLength(output) console.log(`obfuscated ${basename(file)}`) } console.log(`application chunks: +${((obfuscatedBytes / originalBytes - 1) * 100).toFixed(1)}% raw size`)