A powerful npm package to scan React Native and React files to find unused CSS classes and StyleSheet definitions.
- β
Scans React Native
StyleSheet.create()definitions - β Detects unused styles in your components
- β
Supports
.tsx,.ts,.jsx,.jsfiles - β Generates detailed reports with usage statistics
- β CLI and programmatic API
- β Customizable ignore patterns
npm install unused-css-scanner --save-dev
# or
yarn add unused-css-scanner --devunused-css-scanner
# or
unused-css-scanner scanThis will:
- Ask you which folder to scan
- Let you choose scan mode (all at once or one by one)
- Show detailed reports
- Ask permission to delete unused styles
unused-css-scanner src/unused-css-scanner src/HomeScreen.tsxunused-css-scanner help
# or
unused-css-scanner --helpunused-css-scanner --versionimport UnusedCSSScanner from "unused-css-scanner";
// Create scanner instance
const scanner = new UnusedCSSScanner({
files: ["src/HomeScreen.tsx", "src/Profile.tsx"],
extensions: [".tsx", ".ts", ".jsx", ".js"],
ignorePatterns: [/node_modules/, /\.test\./],
});
// Scan files and get results
const { results, report } = scanner.scan();
console.log(report);
// Access detailed results
results.forEach((result) => {
console.log(`File: ${result.file}`);
console.log(`Unused styles: ${result.unusedStyles.join(", ")}`);
});Given this React Native component:
<View style={styles.sectionHeader}>
<Text style={styles.sectionTitle}>Popular PGs</Text>
<TouchableOpacity onPress={allPG}>
<Text style={styles.seeAll}>See All β</Text>
</TouchableOpacity>
</View>And StyleSheet:
const styles = StyleSheet.create({
container: { flex: 1 },
header: { backgroundColor: Colors.primary },
sectionHeader: { flexDirection: "row" },
sectionTitle: { fontSize: FontSize.xxl },
seeAll: { fontSize: FontSize.md },
// ... more styles
});Output:
π Unused CSS/Style Classes Report
ββββββββββββββββββββββββββββββββββββββββββββββββββ
π File: src/HomeScreen.tsx
Defined: 15 | Used: 3 | Unused: 12
β Unused: container, header, searchSection, searchInput, ...
ββββββββββββββββββββββββββββββββββββββββββββββββββ
π Summary:
Total Styles Defined: 15
Total Styles Used: 3
Total Styles Unused: 12
Usage Rate: 20.00%
interface ScanOptions {
files: string[]; // Array of file paths to scan
styleFiles?: string[]; // Optional: specific style files
extensions?: string[]; // File extensions to scan (default: ['.tsx', '.ts', '.jsx', '.js'])
ignorePatterns?: RegExp[]; // Patterns to ignore (default: [/node_modules/, /\.test\./])
}scanFile(filePath: string): StyleUsage | null- Scan a single filescanFiles(files?: string[]): StyleUsage[]- Scan multiple filesgenerateReport(results: StyleUsage[]): string- Generate text reportscan(files?: string[]): { results: StyleUsage[], report: string }- Scan and generate report
interface StyleUsage {
file: string; // File path
definedStyles: string[]; // All defined style names
usedStyles: string[]; // Used style names
unusedStyles: string[]; // Unused style names
}const scanner = new UnusedCSSScanner({
files: ["src/**/*.tsx"],
ignorePatterns: [/node_modules/, /\.test\./, /\.stories\./, /__snapshots__/],
});const scanner = new UnusedCSSScanner({
files: ["src/**/*"],
extensions: [".tsx", ".jsx", ".ts", ".js", ".mjs"],
});Add to your package.json:
{
"scripts": {
"lint:css": "unused-css-scanner src/**/*.tsx",
"precommit": "npm run lint:css"
}
}The CLI exits with code 1 if unused styles are found, making it perfect for CI/CD pipelines.
The scanner detects:
style={styles.styleName}style={[styles.style1, styles.style2]}className="styleName"className={styles.styleName}- Any reference to
styles.styleName
Contributions are welcome! Please feel free to submit a Pull Request.
MIT
Chandan Jadhav
Made with β€οΈ for cleaner React Native codebases