UNPKG

devghost

Version:

šŸ‘» Find dead code, dead imports, and dead dependencies before they haunt your project

203 lines • 8.24 kB
"use strict"; 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