Кейс · CLI-утилита · TypeScript
lockweigh: «взвешивает» lock-файл
CLI на TypeScript без runtime-зависимостей: читает package-lock.json (v2, v3), pnpm-lock.yaml (v9) и yarn.lock (classic v1) и показывает, сколько в проекте пакетов, кто тянет дубликаты версий, какие поддеревья самые тяжёлые, где install-скрипты и какие лицензии, а также почему пакет попал в проект (why) и что изменилось между двумя lock-файлами (diff). Парсеры, включая подмножество YAML, написаны с нуля. Работает офлайн и ничего не выполняет.
- TypeScript
- Node.js
- esbuild
- Node SEA
- YAML parser
- vitest
- GitHub Actions
01 · Как выглядит
Скриншоты


02 · О проекте
Что это и зачем
Задача: быстро понять, из чего на самом деле состоит дерево зависимостей проекта, не запуская ничего из него и без сети.
Решение: TypeScript без runtime-зависимостей. Парсеры package-lock.json (v2, v3), pnpm-lock.yaml (v9, с подмножеством YAML) и yarn.lock (v1) написаны с нуля; один бандл esbuild и одиночный исполняемый файл через Node SEA.
Ограничения
В реальных lock-файлах npm почти нет размеров пакетов, рейтинг по размеру обычно недоступен и честно помечен.
Не поддерживаются package-lock v1, pnpm до v9, Yarn Berry и bun.lock.
В графах больше 20 000 пакетов рейтинг поддеревьев считается только для прямых зависимостей.
Учебный проект: в npm не публикуется.
Что внутри
- Сводка: число пакетов, уникальные версии и имена, прямые зависимости, prod/dev/optional, глубина графа по кратчайшему пути
- Дубликаты версий с указанием, кто какую тянет; тяжёлые поддеревья; install-скрипты и «нативные» пакеты (эвристика, помечено)
- Команда why: все пути от корня до пакета с бюджетом шагов; команда diff двух lock-файлов
- Реальный запуск на фикстуре express (npm install express cors morgan): 73 пакета, глубина 7, 2 дубликата версий (debug 2.6.9 и 4.4.3)
- 77 тестов vitest; коды возврата для CI с порогами на число пакетов, дубликаты и install-скрипты
- В CI запускаются npm audit и gitleaks; сборки для Windows, Linux и macOS выкладываются артефактами
03 · Как запустить
Запуск одной командой
git clone <репозиторий по запросу> lockweigh
cd lockweigh
npm ci && npm run build
node dist/lockweigh.cjs package-lock.json --top 504 · Код
Репозиторий приватный
Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.
Запросить код