UNPKG

@nntdgrss/node-modules-cleaner

Version:

Утилита для поиска и удаления неиспользуемых node_modules директорий

102 lines (101 loc) 4.46 kB
"use strict"; 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;