const JavaScriptObfuscator = require('javascript-obfuscator'); const fs = require('fs-extra'); const path = require('path'); const srcDir = path.resolve(__dirname, '..'); const distDir = path.resolve(__dirname, '../dist'); async function build() { console.log('šŸš€ Starting "Hugging Face Shield" Build...'); console.log(` Source: ${srcDir}`); console.log(` Destination: ${distDir}`); try { // 1. Ensure dist folder exists await fs.ensureDir(distDir); // 2. Define what to copy const toCopy = ['server', 'public', 'package.json', 'Dockerfile', '.dockerignore', '.env.example']; for (const item of toCopy) { const srcPath = path.join(srcDir, item); const destPath = path.join(distDir, item); if (fs.existsSync(srcPath)) { // Remove destination if it exists (but handle folder locks) try { if (fs.existsSync(destPath)) { await fs.remove(destPath); } } catch (e) { console.warn(` āš ļø Warning: Could not remove old ${item}, overwriting...`); } await fs.copy(srcPath, destPath); console.log(`āœ… Copied: ${item}`); } else { console.warn(`āŒ Missing source: ${item}`); } } // 3. Obfuscate all JS files in dist console.log('šŸ”’ Scrambling code...'); await obfuscateDirectory(path.join(distDir, 'server')); await obfuscateDirectory(path.join(distDir, 'public')); console.log('\n✨ BUILD COMPLETE! ✨'); console.log('šŸ“ Your scrambled code is in the "dist" folder.'); console.log('šŸ‘‰ Upload ONLY the contents of the "dist" folder to Hugging Face.'); } catch (err) { console.error('āŒ Build failed:', err); } } async function obfuscateDirectory(dir) { if (!fs.existsSync(dir)) return; const files = await fs.readdir(dir); for (const file of files) { const fullPath = path.join(dir, file); const stat = await fs.stat(fullPath); if (stat.isDirectory()) { await obfuscateDirectory(fullPath); } else if (file.endsWith('.js') && !file.includes('.min.js')) { const code = await fs.readFile(fullPath, 'utf8'); const result = JavaScriptObfuscator.obfuscate(code, { compact: true, controlFlowFlattening: true, controlFlowFlatteningThreshold: 1, numbersToExpressions: true, simplify: true, stringArrayThreshold: 1, stringArrayRotate: true, stringArrayShuffle: true, stringArray: true, identifierNamesGenerator: 'hexadecimal' }); await fs.writeFile(fullPath, result.getObfuscatedCode()); console.log(` - Scrambled: ${file}`); } } } build();