@fe-fast/unused-css-pruner
Version:
A powerful CSS pruning tool that removes unused styles with support for dynamic class names, CSS-in-JS, and component-level analysis
69 lines (61 loc) • 2.64 kB
JavaScript
const { analyzeCSSUsage, cleanCSS } = require('../index.js');
const path = require('path');
const fs = require('fs/promises');
class CSSPrunerPlugin {
constructor(options = {}) {
this.options = {
cssFiles: ['dist/**/*.css'],
sourceDirectories: ['src'],
outputDir: 'dist',
mode: 'analyze',
config: {},
onAnalysisComplete: () => { },
...options
};
}
apply(compiler) {
const pluginName = 'CSSPrunerPlugin';
compiler.hooks.afterEmit.tapAsync(pluginName, async (compilation, callback) => {
try {
console.log('🔍 CSS Pruner: Starting analysis...');
const { cssFiles, sourceDirectories, outputDir, mode, config, onAnalysisComplete } = this.options;
if (mode === 'analyze') {
const result = await analyzeCSSUsage({
cssFiles,
sourceDirectories,
config
});
console.log(`📊 Analysis complete: ${result.unusedSelectors.length} unused selectors found`);
if (onAnalysisComplete) {
onAnalysisComplete(result);
}
// Generate report
if (config.reportFormat === 'json' && config.outputFile) {
await fs.writeFile(path.resolve(config.outputFile), JSON.stringify(result, null, 2));
console.log(`📄 Report saved to: ${config.outputFile}`);
}
}
else if (mode === 'clean') {
const { result, cleanedFiles } = await cleanCSS({
cssFiles,
sourceDirectories,
outputDir,
config
});
console.log(`✨ CSS cleaned: ${result.unusedSelectors.length} selectors removed`);
console.log(`📁 Files processed: ${cleanedFiles.length}`);
if (onAnalysisComplete) {
onAnalysisComplete({ result, cleanedFiles });
}
}
callback();
}
catch (error) {
console.error('❌ CSS Pruner error:', error);
callback(error);
}
});
}
}
module.exports = { CSSPrunerPlugin };
module.exports.default = CSSPrunerPlugin;