UNPKG

@nntdgrss/node-modules-cleaner

Version:

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

71 lines (70 loc) 3.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.FindCommand = void 0; const os_1 = __importDefault(require("os")); const path_1 = __importDefault(require("path")); const file_utils_1 = require("../utils/file.utils"); const spinner_1 = require("../ui/spinner"); const tree_view_1 = require("../ui/tree.view"); /** * Класс для поиска директорий node_modules */ class FindCommand { /** * Поиск node_modules с настраиваемой конфигурацией * @param startPath - начальная директория поиска (по умолчанию домашняя директория) * @param maxDepth - максимальная глубина поиска (-1 для неограниченной) * @returns Promise<NodeModulesInfo[]> */ static async execute(startPath = os_1.default.homedir(), maxDepth = -1) { spinner_1.Spinner.start("Начинаем поиск директорий node_modules..."); spinner_1.Spinner.update(`Сканирование: ${startPath}`); try { const searchConfig = { startPath: path_1.default.resolve(startPath), maxDepth, exclude: this.defaultExcludes, }; const results = await file_utils_1.FileUtils.findNodeModules(searchConfig); if (results.length === 0) { spinner_1.Spinner.warn("Директории node_modules не найдены"); return []; } const totalSize = results.reduce((acc, info) => acc + info.size, 0); const unusedCount = results.filter((r) => r.isUnused).length; spinner_1.Spinner.success(`Найдено ${results.length} директорий (${file_utils_1.FileUtils.formatSize(totalSize)}, неиспользуемых: ${unusedCount})`); // Отображаем древовидную структуру tree_view_1.TreeView.display(results); return results; } catch (err) { spinner_1.Spinner.error(`Ошибка при поиске node_modules: ${err}`); return []; } } /** * Получение человекочитаемой информации о node_modules * @param info - информация о директории * @returns string - форматированная строка */ static formatNodeModulesInfo(info) { const size = file_utils_1.FileUtils.formatSize(info.size); const date = info.lastModified.toLocaleDateString("ru-RU"); const status = info.isUnused ? "Не используется" : "Активный"; return `${info.path}\n Размер: ${size} | Последнее изменение: ${date} | Статус: ${status}`; } } exports.FindCommand = FindCommand; /** * Стандартные пути для исключения из поиска */ FindCommand.defaultExcludes = [ "**/node_modules/node_modules/**", // Вложенные node_modules "**/.*/**", // Скрытые директории "**/snap/**", // Системные директории "**/AppData/**", // Windows AppData "**/Library/**", // macOS Library ];