find-unused-sass-variables
Version:
A small tool to find unused Sass variables
73 lines (59 loc) • 2.55 kB
JavaScript
import fs from 'node:fs/promises';
import process from 'node:process';
import path from 'node:path';
import { program } from 'commander';
import picocolors from 'picocolors';
import { findAsync } from '../index.js';
const pkg = new URL('../package.json', import.meta.url);
const { name, version, description } = JSON.parse(await fs.readFile(pkg));
program
.name(name)
.argument('<folders...>', 'one or more folders to scan')
.description(description)
.version(version, '-v, --version')
.option('-i, --ignore <variables>', 'ignore variables, comma separated', '')
.option('-if, --ignoreFiles <files>', 'ignore files, comma separated', '')
.option('-e, --extension [types...]', 'file extensions to search', ['scss'])
.action((folders, options) => {
console.log('Looking for unused variables');
for (const option of ['ignore', 'ignoreFiles']) {
options[option] = options[option] ? options[option].split(',').filter(Boolean) : [];
}
return main(folders, {
ignore: options.ignore,
ignoreFiles: options.ignoreFiles,
fileExtensions: options.extension
});
})
.showHelpAfterError()
.parse();
async function main(folders, options) {
let status = 0;
const results = await Promise.allSettled(
folders.map(folder => executeForPath(folder, options))
);
for (const result of results) {
if (result.status === 'rejected') {
// TODO: switch to console.error and result.reason.message in the next major version
console.log(picocolors.red(result.reason));
status = 1;
}
}
process.exit(status);
}
async function executeForPath(folder, options) {
const dir = path.resolve(folder);
const unusedVars = await findAsync(dir, options);
const unusedCount = unusedVars.unused.length;
console.log(`\nSearching for unused variables in "${picocolors.cyan(dir)}" folder, ${picocolors.cyan(options.fileExtensions.join(', '))} files...`);
if (unusedCount > 0) {
console.log(`${picocolors.cyan(unusedVars.total)} total variables, ${picocolors.red(unusedCount)} unused:`);
for (const { name, file, line } of unusedVars.unused) {
console.log(` - ${picocolors.red(name)} ${picocolors.gray(file)}:${picocolors.cyan(line)}`);
}
throw new Error(`Found ${unusedCount} unused variable${unusedCount > 1 ? 's' : ''} in "${picocolors.cyan(dir)}" folder`);
}
console.log(`${picocolors.cyan(unusedVars.total)} total variables`);
console.log(picocolors.green(`No unused variables found in "${picocolors.cyan(dir)}"!`));
}