Files
decypharr/scripts/minify-js.js
2025-07-10 02:17:35 +01:00

118 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const { minify } = require('terser');
const sourceDir = './pkg/web/assets/js';
const buildDir = './pkg/web/assets/build/js';
// Create build directory
if (!fs.existsSync(buildDir)) {
fs.mkdirSync(buildDir, { recursive: true });
}
// Minify options
const minifyOptions = {
compress: {
drop_console: false, // Keep console.log for debugging
drop_debugger: true,
dead_code: true,
unused: true,
sequences: true,
conditionals: true,
booleans: true,
if_return: true,
join_vars: true,
},
mangle: {
toplevel: false,
reserved: [
'$', 'jQuery', 'decypharrUtils', 'configManager', 'repairManager',
'RepairManager', 'RepairUtils', 'ConfigManager', 'window', 'document'
]
},
format: {
comments: false,
beautify: false
}
};
async function minifyFile(inputPath, outputPath) {
try {
console.log(`🗜️ Minifying ${path.basename(inputPath)}...`);
const code = fs.readFileSync(inputPath, 'utf8');
const result = await minify(code, minifyOptions);
if (result.error) {
throw result.error;
}
fs.writeFileSync(outputPath, result.code);
// Show size reduction
const originalSize = fs.statSync(inputPath).size;
const minifiedSize = fs.statSync(outputPath).size;
const reduction = ((originalSize - minifiedSize) / originalSize * 100).toFixed(1);
console.log(`${path.basename(inputPath)}: ${(originalSize/1024).toFixed(1)}KB → ${(minifiedSize/1024).toFixed(1)}KB (${reduction}% reduction)`);
return { original: originalSize, minified: minifiedSize };
} catch (error) {
console.error(` ✗ Error minifying ${inputPath}:`, error.message);
return null;
}
}
async function minifyAllJS() {
console.log('📦 Minifying JavaScript files...\n');
try {
// Check if source directory exists
if (!fs.existsSync(sourceDir)) {
console.log(`Creating source directory ${sourceDir}...`);
fs.mkdirSync(sourceDir, { recursive: true });
console.log(' No JavaScript files found to minify');
return;
}
// Get all JS files from source directory
const jsFiles = fs.readdirSync(sourceDir).filter(file => file.endsWith('.js'));
if (jsFiles.length === 0) {
console.log(' No JavaScript files found to minify');
return;
}
let totalOriginal = 0;
let totalMinified = 0;
let processedFiles = 0;
// Minify each file
for (const file of jsFiles) {
const inputPath = path.join(sourceDir, file);
const outputPath = path.join(buildDir, file);
const result = await minifyFile(inputPath, outputPath);
if (result) {
totalOriginal += result.original;
totalMinified += result.minified;
processedFiles++;
}
}
if (processedFiles > 0) {
const totalReduction = ((totalOriginal - totalMinified) / totalOriginal * 100).toFixed(1);
console.log(`\n✅ Successfully minified ${processedFiles}/${jsFiles.length} JavaScript file(s)`);
console.log(`📊 Total: ${(totalOriginal/1024).toFixed(1)}KB → ${(totalMinified/1024).toFixed(1)}KB (${totalReduction}% reduction)`);
}
} catch (error) {
console.error('💥 Error during JavaScript minification:', error);
process.exit(1);
}
}
minifyAllJS();