Кейс · 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 · Как выглядит

Скриншоты

Скриншот проекта «lockweigh: «взвешивает» lock-файл» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «lockweigh: «взвешивает» lock-файл» на экране телефона, 390 пикселей
Телефон, 390 px

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 5

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.

Запросить код