@nntdgrss/node-modules-cleaner
Version:
Утилита для поиска и удаления неиспользуемых node_modules директорий
102 lines (101 loc) • 4.46 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TreeView = void 0;
const chalk_1 = __importDefault(require("chalk"));
const file_utils_1 = require("../utils/file.utils");
const progress_1 = require("./progress");
/**
* Класс для древовидного отображения node_modules
*/
class TreeView {
/**
* Форматирование строки для отображения информации о node_modules
* @param info - информация о директории
* @param prefix - префикс для отступа
* @returns отформатированная строка
*/
static formatNodeInfo(info, prefix = "") {
const size = file_utils_1.FileUtils.formatSize(info.size);
const date = info.lastModified.toLocaleDateString("ru-RU");
const { label, color } = progress_1.Progress.getSizeGroup(info.size);
const status = info.isUnused
? chalk_1.default.yellow("Не используется")
: chalk_1.default.green("Активный");
return [
color(`${prefix}└─ ${info.path}`),
chalk_1.default.dim(`\n${prefix} ├─ Размер: ${size} (${label})`),
chalk_1.default.dim(`\n${prefix} ├─ Последнее изменение: ${date}`),
`\n${prefix} └─ Статус: ${status}`,
].join("");
}
/**
* Группировка node_modules по размеру
* @param items - массив информации о директориях
* @returns сгруппированный массив
*/
static groupBySize(items) {
const GB = 1024 * 1024 * 1024;
const MB = 1024 * 1024;
return {
veryLarge: items.filter((item) => item.size >= GB),
large: items.filter((item) => item.size >= 100 * MB && item.size < GB),
medium: items.filter((item) => item.size >= 10 * MB && item.size < 100 * MB),
small: items.filter((item) => item.size < 10 * MB),
};
}
/**
* Создание древовидного отображения с группировкой по размеру
* @param items - массив информации о директориях
* @returns отформатированная строка
*/
static createSizeTree(items) {
const groups = this.groupBySize(items);
const totalSize = items.reduce((acc, item) => acc + item.size, 0);
const sections = [
{
title: chalk_1.default.red("Очень большие (>1GB)"),
items: groups.veryLarge,
},
{
title: chalk_1.default.yellow("Большие (100MB-1GB)"),
items: groups.large,
},
{
title: chalk_1.default.blue("Средние (10MB-100MB)"),
items: groups.medium,
},
{
title: chalk_1.default.green("Малые (<10MB)"),
items: groups.small,
},
];
const result = [
chalk_1.default.bold(`\nВсего найдено: ${items.length} директорий`),
chalk_1.default.bold(`Общий размер: ${file_utils_1.FileUtils.formatSize(totalSize)}\n`),
];
for (const section of sections) {
if (section.items.length > 0) {
const sectionSize = section.items.reduce((acc, item) => acc + item.size, 0);
result.push(`\n${section.title} (${section.items.length} шт., ${file_utils_1.FileUtils.formatSize(sectionSize)})`);
section.items
.sort((a, b) => b.size - a.size)
.forEach((item) => {
result.push(`\n${this.formatNodeInfo(item, " ")}`);
});
}
}
return result.join("\n");
}
/**
* Очистка консоли и отображение дерева
* @param items - массив информации о директориях
*/
static display(items) {
console.clear();
console.log(this.createSizeTree(items));
}
}
exports.TreeView = TreeView;