@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
61 lines • 2.52 kB
JavaScript
import { analyzeCSSUsage, cleanCSS } from '../index.js';
import path from 'path';
import fs from 'fs/promises';
export 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);
}
});
}
}
export default CSSPrunerPlugin;
//# sourceMappingURL=webpack.js.map