pnpm — пакетный менеджер для JavaScript с общим хранилищем пакетов на диске и строгим деревом зависимостей. Версия 11.20.0 вышла 3 августа и закрывает как раз эту дыру.
Что внутри:
🔘 пакеты из именованных реестров теперь записываются в файл блокировки с указанием источника, в виде
имя@реестр:версия, поэтому каждый реестр получает собственную запись;🔘 формат файла намеренно не менялся, так что старые версии pnpm его прочитают, но сами такие ключи не пишут: если часть команды сидит на старом pnpm, файл будет переключаться туда-обратно, и в старом виде проект снова уязвим;
🔘 появился встроенный псевдоним
npmjs:, который жёстко привязывает зависимость к публичному реестру, даже если общий registry указывает на внутреннее зеркало;🔘 псевдоним, совпадающий с зарезервированным префиксом вроде
file, link, workspace или npm, теперь отклоняется с понятной ошибкой, а не молча перекрывается резолвером;🔘 пустые значения
http-proxy, https-proxy и no-proxy больше не валят установку, а читаются как отсутствующие; proxy=false наконец выключает прокси, а не воспринимается как хост с именем false;🔘 разрешение зависимостей ускорено: при включённом
minimumReleaseAge метаданные фильтруются один раз на пакет, а разобранные версии и диапазоны переиспользуются между сравнениями.Обновление полуломающее для тех, кто пользуется именованными реестрами: первая же обычная установка перепишет записи в файле блокировки, и этот дифф нужно закоммитить. Заодно его стоит просмотреть: запись, уехавшая к неожиданному реестру, это повод разобраться. Отключить новое поведение нельзя, авторы прямо пишут, что старая форма и есть уязвимость.
Пригодится тем, у кого рядом живут приватный реестр и публичный npm, и кто до сих пор верил, что файл блокировки фиксирует источник пакета.
36 тысяч звёзд на GitHub, ближайшие соседи по нише — Yarn и bun.
Язык: Rust. Лицензия: MIT.
@prog_tools