devghost
Version:
š» Find dead code, dead imports, and dead dependencies before they haunt your project
203 lines ⢠8.24 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.success = success;
exports.error = error;
exports.warning = warning;
exports.info = info;
exports.formatSize = formatSize;
exports.formatStats = formatStats;
exports.formatResults = formatResults;
exports.createProgressBar = createProgressBar;
const chalk_1 = __importDefault(require("chalk"));
/**
* Log a success message
*/
function success(message) {
console.log(`${chalk_1.default.green('ā')} ${message}`);
}
/**
* Log an error message
*/
function error(message) {
console.log(`${chalk_1.default.red('ā')} ${message}`);
}
/**
* Log a warning message
*/
function warning(message) {
console.log(`${chalk_1.default.yellow('ā ')} ${message}`);
}
/**
* Log an info message
*/
function info(message) {
console.log(`${chalk_1.default.blue('ā¹')} ${message}`);
}
/**
* Format bytes to human-readable size
*/
function formatSize(bytes) {
if (bytes === 0)
return '0 B';
const k = 1024;
const sizes = ['B', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${Math.round((bytes / k ** i) * 100) / 100} ${sizes[i]}`;
}
/**
* Format analysis statistics
*/
function formatStats(stats) {
const { potentialSavings } = stats;
let output = chalk_1.default.bold('\nš¾ Potential Savings:\n');
if (potentialSavings.bytes > 0) {
output += ` - ${formatSize(potentialSavings.bytes)} of code\n`;
}
if (potentialSavings.lines > 0) {
output += ` - ${potentialSavings.lines.toLocaleString()} lines\n`;
}
if (potentialSavings.dependencies > 0) {
output += ` - ${potentialSavings.dependencies} npm ${potentialSavings.dependencies === 1 ? 'package' : 'packages'}`;
if (potentialSavings.dependenciesSize > 0) {
output += ` (${formatSize(potentialSavings.dependenciesSize)} in node_modules)`;
}
output += '\n';
}
return output;
}
/**
* Format analysis results for pretty printing
*/
function formatResults(results, showStats = true) {
let output = '';
output += chalk_1.default.bold.cyan('\nš» DevGhost - Dead Code Detective\n');
output += `${chalk_1.default.cyan('='.repeat(40))}\n\n`;
const totalIssues = results.unusedImports.length +
results.unusedFiles.length +
results.unusedDependencies.length +
results.unusedExports.length +
results.unusedFunctions.length;
if (totalIssues === 0) {
output += chalk_1.default.green('ā No dead code found! Your project is clean. š\n');
return output;
}
// Unused imports
if (results.unusedImports.length > 0) {
output += chalk_1.default.red(`ā Found ${results.unusedImports.length} unused import${results.unusedImports.length === 1 ? '' : 's'}:\n`);
for (const imp of results.unusedImports.slice(0, 10)) {
output +=
chalk_1.default.gray(` - ${imp.file}:${imp.line + 1} - `) +
chalk_1.default.yellow(`'${imp.importName}'`) +
chalk_1.default.gray(` from '${imp.source}'\n`);
}
if (results.unusedImports.length > 10) {
output += chalk_1.default.gray(` ... and ${results.unusedImports.length - 10} more\n`);
}
output += '\n';
}
// Unused exports
if (results.unusedExports.length > 0) {
output += chalk_1.default.red(`ā Found ${results.unusedExports.length} unused export${results.unusedExports.length === 1 ? '' : 's'}:\n`);
for (const exp of results.unusedExports.slice(0, 10)) {
output +=
chalk_1.default.gray(` - ${exp.file}:${exp.line + 1} - `) +
chalk_1.default.yellow(`'${exp.exportName}'`) +
chalk_1.default.gray(` (${exp.exportType})\n`);
}
if (results.unusedExports.length > 10) {
output += chalk_1.default.gray(` ... and ${results.unusedExports.length - 10} more\n`);
}
output += '\n';
}
// Unused functions
if (results.unusedFunctions.length > 0) {
output += chalk_1.default.red(`ā Found ${results.unusedFunctions.length} unused function${results.unusedFunctions.length === 1 ? '' : 's'}:\n`);
for (const func of results.unusedFunctions.slice(0, 10)) {
output +=
chalk_1.default.gray(` - ${func.file}:${func.line + 1} - `) +
chalk_1.default.yellow(`'${func.functionName}'`) +
chalk_1.default.gray(` (${func.functionType})\n`);
}
if (results.unusedFunctions.length > 10) {
output += chalk_1.default.gray(` ... and ${results.unusedFunctions.length - 10} more\n`);
}
output += '\n';
}
// Unused variables
if (results.unusedVariables.length > 0) {
output += chalk_1.default.red(`ā Found ${results.unusedVariables.length} unused variable${results.unusedVariables.length === 1 ? '' : 's'}:\n`);
for (const variable of results.unusedVariables.slice(0, 10)) {
output +=
chalk_1.default.gray(` - ${variable.file}:${variable.line + 1} - `) +
chalk_1.default.yellow(`'${variable.variableName}'`) +
chalk_1.default.gray(` (${variable.variableType})\n`);
}
if (results.unusedVariables.length > 10) {
output += chalk_1.default.gray(` ... and ${results.unusedVariables.length - 10} more\n`);
}
output += '\n';
}
// Unused files
if (results.unusedFiles.length > 0) {
output += chalk_1.default.red(`ā Found ${results.unusedFiles.length} unused file${results.unusedFiles.length === 1 ? '' : 's'}:\n`);
for (const file of results.unusedFiles.slice(0, 10)) {
output +=
chalk_1.default.gray(` - ${file.path} `) +
chalk_1.default.dim(`(${formatSize(file.size)}, ${file.lines} lines)\n`);
}
if (results.unusedFiles.length > 10) {
output += chalk_1.default.gray(` ... and ${results.unusedFiles.length - 10} more\n`);
}
output += '\n';
}
// Unused dependencies
if (results.unusedDependencies.length > 0) {
output += chalk_1.default.red(`ā Found ${results.unusedDependencies.length} unused dependenc${results.unusedDependencies.length === 1 ? 'y' : 'ies'}:\n`);
for (const dep of results.unusedDependencies.slice(0, 10)) {
output += chalk_1.default.gray(` - ${dep.name} `);
if (dep.size > 0) {
output += chalk_1.default.dim(`(${formatSize(dep.size)} in node_modules)`);
}
output += '\n';
}
if (results.unusedDependencies.length > 10) {
output += chalk_1.default.gray(` ... and ${results.unusedDependencies.length - 10} more\n`);
}
output += '\n';
}
// Statistics
if (showStats && results.stats.potentialSavings.bytes > 0) {
output += formatStats(results.stats);
}
// Summary
output += chalk_1.default.bold(`\nSummary: ${totalIssues} issue${totalIssues === 1 ? '' : 's'} found\n`);
// Helpful hints
if (results.unusedImports.length > 0) {
output += chalk_1.default.dim(`\nš” Run 'devghost --fix' to automatically remove unused imports\n`);
output += chalk_1.default.dim(`š” Run 'devghost --interactive' to review each issue\n`);
}
return output;
}
/**
* Create a simple progress indicator
*/
function createProgressBar(total) {
let lastProgress = 0;
return {
update: (current) => {
const progress = Math.floor((current / total) * 100);
if (progress > lastProgress) {
process.stdout.write(`\rScanning... ${progress}%`);
lastProgress = progress;
}
},
finish: () => {
process.stdout.write(`\r${' '.repeat(50)}\r`); // Clear the line
success(`Scanned ${total} files`);
},
};
}
//# sourceMappingURL=logger.js.map