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
JavaScript
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"));
}
}