pnpm 10.16

Незначні зміни#

Новий параметр для відкладеного оновлення залежностей#

Останнім часом було кілька інцидентів, коли популярні пакунки були успішно атаковані. Щоб зменшити ризик встановлення скомпрометованої версії, ми вводимо новий параметр, який затримує встановлення щойно випущених залежностей. У більшості випадків такі атаки виявляються швидко, а шкідливі версії видаляються з реєстру протягом години.

Новий параметр називається minimumReleaseAge. Він визначає кількість хвилин, які мають пройти після публікації версії, перш ніж pnpm її встановить. Наприклад, встановлення значення minimumReleaseAge: 1440 гарантує, що можна буде встановити лише пакунки, випущені принаймні один день тому.

Якщо ви встановили minimumReleaseAge, але вам потрібно вимкнути це обмеження для певних залежностей, ви можете перерахувати їх у налаштуванні minimumReleaseAgeExclude. Наприклад, з такою конфігурацією pnpm завжди встановлюватиме останню версію webpack, незалежно від часу її випуску:

minimumReleaseAgeExclude:
- webpack

Див. тікет: #9921.

Розширена фільтрація залежностей за допомогою функцій пошуку#

Додано підтримку пошуку.

У минулому pnpm list та pnpm why могли шукати залежності лише за назвою (і, опціонально, за версією). Наприклад:

pnpm why minimist

виводить ланцюжок залежностей для будь-якого встановленого екземпляра minimist:

verdaccio 5.20.1
├─┬ handlebars 4.7.7
│ └── minimist 1.2.8
└─┬ mv 2.1.1
└─┬ mkdirp 0.5.6
  └── minimist 1.2.8

Що робити, якщо ми хочемо шукати за іншими властивостями залежності, а не лише за її назвою? Наприклад, знайти всі пакунки, які мають 'react@17' у своїх прямих залежностях?

Тепер це можливо завдяки "функціям пошуку". Функції пошуку можна оголосити у файлі .pnpmfile.cjs та викликати з прапорцем --find-by=<function name> під час виконання команд pnpm list або pnpm why.

Припустимо, нам потрібно знайти будь-які залежності, які містять React 17 у прямих залежностях. Ми можемо додати цей пошук до нашого .pnpmfile.cjs:

module.exports = {
finders: {
  react17: (ctx) => {
    return ctx.readManifest().peerDependencies?.react === "^17.0.0";
  },
},
};

Тепер ми можемо використовувати цю функцію пошуку, виконавши:

pnpm why --find-by=react17

pnpm знайде всі залежності, які мають цей React в прямих залежностях, і виведе їх точне розташування в графі залежностей.

@apollo/client 4.0.4
├── @graphql-typed-document-node/core 3.2.0
└── graphql-tag 2.12.6

Також можна вивести деяку додаткову інформацію у вивід, повернувши рядок з пошуку. Наприклад, за допомогою наступного пошуку:

module.exports = {
finders: {
  react17: (ctx) => {
    const manifest = ctx.readManifest();
    if (manifest.peerDependencies?.react === "^17.0.0") {
      return `license: ${manifest.license}`;
    }
    return false;
  },
},
};

Кожен пакунок, що відповідає цьому параметру, також виведе ліцензію зі свого package.json:

@apollo/client 4.0.4
├── @graphql-typed-document-node/core 3.2.0
│   license: MIT
└── graphql-tag 2.12.6
  license: MIT

Див. PR: #9946.

Зміни в патчах#

  • Виправлено попередження про застаріле програмне забезпечення, яке виводиться під час виконання pnpm за допомогою Node.js 24 #9529.
  • Викинути помилку, якщо nodeVersion не встановлено на точну версію semver #9934.
  • Команда pnpm publish повинна мати можливість публікувати файл .tar.gz #9927.
  • Скасування запущеного процесу за допомогою Ctrl-C має призвести до того, що pnpm run поверне ненульовий код завершення #9626.