UNPKG

assetdrain

Version:

๐Ÿงน A blazing-fast CLI to detect and clean unused assets from your codebase with interactive UX.

64 lines (63 loc) โ€ข 2.73 kB
import chalk from "chalk"; import path from "path"; import fs from "fs/promises"; export async function generateReport(allAssets, usedAssets, options) { const unusedAssets = allAssets.filter((asset) => !usedAssets.has(asset)); console.log(""); console.log(chalk.blueBright(`๐Ÿ“ฆ Found ${allAssets.length} assets`)); console.log(chalk.greenBright(`โœ… ${usedAssets.size} are used`)); console.log(chalk.redBright(`๐Ÿงน ${unusedAssets.length} appear to be unused`)); if (unusedAssets.length === 0) { console.log(chalk.greenBright("\n๐ŸŽ‰ No unused assets found!")); return; } console.log("\n" + chalk.yellow("Unused Assets:")); unusedAssets.forEach((img) => { console.log(chalk.gray("โ€ข ") + chalk.italic(`[${path.relative(process.cwd(), img)}]`)); }); if (options.mode === "dry") { console.log(chalk.blueBright("\n๐Ÿงช Dry run: No files were deleted.\n")); return; } if (options.mode === "delete") { console.log(chalk.redBright("\nโš  Deleting unused assets...\n")); for (const file of unusedAssets) { try { await fs.unlink(file); console.log(chalk.red(`๐Ÿ—‘ Deleted: ${path.relative(process.cwd(), file)}`)); } catch (err) { console.error(chalk.red(`โŒ Failed to delete: ${file}`), err); } } console.log(chalk.greenBright("\nโœ… Cleanup complete!\n")); } else { console.log(chalk.yellowBright("\n๐Ÿ“ Review mode only. No files were deleted.\n")); } if (options.export === "json") { const data = { totalAssets: allAssets.length, usedAssets: [...usedAssets], unusedAssets, summary: { usedCount: usedAssets.size, unusedCount: unusedAssets.length, deleted: options.deleted ?? false, }, }; await fs.writeFile("assetdrain-report.json", JSON.stringify(data, null, 2)); console.log(chalk.cyan("\n๐Ÿ“„ Report saved to: assetdrain-report.json")); } if (options.export === "csv") { const csvLines = ["Filename,Used,Deleted"]; for (const file of allAssets) { const relative = path.relative(process.cwd(), file); const isUsed = usedAssets.has(file) ? "Yes" : "No"; const isDeleted = !usedAssets.has(file) && (options.deleted ?? false) ? "Yes" : "No"; csvLines.push(`"${relative}","${isUsed}","${isDeleted}"`); } await fs.writeFile("assetdrain-report.csv", csvLines.join("\n")); console.log(chalk.cyan("\n๐Ÿ“„ Report saved to: assetdrain-report.csv")); } }