pnpm 11.8 livre `install --dry-run`, des package maps Node.js et une SBOM par paquet

pnpm 11.8 livre `install --dry-run`, des package maps Node.js et une SBOM par paquet

lschvn

pnpm 11.8.0 est sorti le 18 juin 2026, trois jours après 11.7.0, la version qui ajoutait --frozen-store, la délégation de résolution à pacquet et un correctif de traversal de chemin dans le lockfile. Là où la 11.7 portait sur les installations reproductibles et en lecture seule, la 11.8 vise l'observabilité et le reporting de chaîne d'approvisionnement : un mode dry-run qui reproduit enfin npm, un format de package map Node.js qui alimente les expériences de résolution du runtime, et deux améliorations CycloneDX SBOM qui rendent pnpm sbom utilisable pour de vrais workflows de conformité. On trouve aussi un second avis de traversal de chemin, cette fois dans configDependencies, et un correctif macOS Gatekeeper qui agaçait les utilisateurs de modules natifs depuis un moment.

pnpm install --dry-run : la fonctionnalité que npm avait et pas pnpm

L'ajout principal est --dry-run pour pnpm install. Il exécute une résolution complète des dépendances contre les manifestes courants et affiche ce qu'une installation ajouterait, supprimerait ou modifierait, puis n'écrit rien : ni pnpm-lock.yaml, ni node_modules, ni mutation du store. Il quitte toujours avec le code 0, ce qui correspond à la sémantique de npm install --dry-run et clôture l'issue #7340, ouverte depuis 2022.

L'usage pratique est la CI et la revue de code : une PR qui monte une dépendance ou change une entrée de catalogue peut lancer pnpm install --dry-run pour exposer le diff transitif complet, y compris les avertissements de peer et les approbations de build-script, sans toucher au répertoire de travail. Comme la résolution de pnpm est déjà rapide, le coût est une passe de résolution sans écriture sur le système de fichiers. Le code de sortie est volontairement toujours 0 pour que le drapeau puisse s'insérer dans une étape d'installation existante sans faire passer un pipeline au rouge sur un diff bénin.

Package maps Node.js dans node_modules/.package-map.json

La 11.8 peut désormais générer un node_modules/.package-map.json lors des installations isolated (par défaut) et hoisted. Deux paramètres contrôlent le comportement :

  • node-experimental-package-map : quand il est activé, pnpm injecte la carte générée dans les environnements de script Node.js qu'il gère, afin que le runtime puisse consulter une disposition de paquets précalculée au lieu de parcourir node_modules au démarrage.
  • node-package-map-type : choisit entre une carte standard et une carte loose, au prix d'un compromis entre rigueur et compatibilité.

C'est une plomberie précoce pour la réforme de résolution de paquets de Node, où un fichier de carte déclaratif pourrait remplacer la résolution implicite et pilotée par le système de fichiers que chaque gestionnaire de paquets doit actuellement contourner. Le fait que pnpm génère la carte signifie que les projets qui l'activent obtiennent une description de disposition cohérente, qu'ils utilisent le linker isolated ou hoisted. Le nom du paramètre (node-experimental-package-map) signale que le format n'est pas encore stable.

SBOM : le scope des devDependencies et la génération par paquet

Les deux changements SBOM de la 11.8 ciblent l'écart entre un arbre de dépendances et ce dont un consommateur CycloneDX peut réellement déduire.

Premièrement, pnpm sbom marque désormais les composants accessibles uniquement via les devDependencies avec le scope CycloneDX scope: "excluded" et la propriété cdx:npm:package:development. Le scope excluded est la façon CycloneDX de documenter « l'usage d'un composant à des fins de test et autres usages non runtime », ce qui correspond exactement à une devDependency. La propriété reproduit le marqueur qu'émet @cyclonedx/cyclonedx-npm, donc les consommateurs modernes (basés sur le scope) et existants (basés sur la propriété) le récupèrent tous les deux. Les composants accessibles au runtime, y compris les optionalDependencies installées, omettent le scope et valent required par défaut.

Deuxièmement, la génération de SBOM par paquet arrive via deux drapeaux :

  • --out out/%s.cdx.json écrit un document CycloneDX par paquet du workspace dans des fichiers individuels.
  • --split émet du NDJSON sur stdout, un paquet par ligne.

Quand --filter sélectionne un seul paquet, le composant racine de la SBOM utilise désormais les métadonnées de ce paquet. Les inter-dépendances du workspace déclarées via le protocole workspace:, ainsi que leurs dépendances transitives, sont incluses pour qu'une SBOM par paquet soit autonome. L'auteur, le dépôt et la licence reviennent au manifeste racine quand le paquet ne les définit pas. Pour un monorepo qui doit livrer une SBOM par bibliothèque publiée, c'est la différence entre post-traiter un document géant et obtenir des artefacts par paquet directement depuis l'outil d'installation.

Traversal de chemin sur les configDependencies (GHSA-qrv3-253h-g69c)

La 11.8 corrige un second avis de traversal de chemin, distinct du correctif d'alias de lockfile en 11.7 et de la traversal Windows d'esbuild 0.28.1 qui avait surfaced dans un autre outil. Avant la 11.8, un lockfile dont les configDependencies contenaient un nom (par exemple ../../PWNED) ou une version (par exemple ../../../PWNED) de type traversal pouvait provoquer une écriture de liens symboliques ou de fichiers en dehors de node_modules/.pnpm-config et du store lors d'un pnpm install.

Le correctif valide les noms et versions des configDependencies avant qu'ils ne soient utilisés pour construire des chemins. Les noms doivent désormais être des noms de paquet npm valides et les versions des chaînes semver exactes. La même validation s'applique aux sous-dépendances optionnelles des configDependencies et au format legacy des manifestes de workspace, avant toute écriture du lockfile. Comme la porte de vérification de la 11.7, c'est une défense en profondeur : un projet qui fait déjà confiance à sa source de lockfile en bénéficie quand même, car la vérification protège contre la corruption partielle et contre les bugs dans le générateur de lockfile lui-même. Voir GHSA-qrv3-253h-g69c.

macOS Gatekeeper ne bloque plus les binaires natifs

Un correctif plus discret mais largement ressenti : quand pnpm importe des fichiers depuis son store à adressage de contenu vers node_modules, macOS préserve les attributs étendus, dont com.apple.quarantine. Si cet xattr était présent sur un blob du store (par exemple, il a d'abord été écrit sous une application Gatekeeper-activée comme un client Git), il se propageait vers node_modules, et Gatekeeper bloquait le binaire natif au chargement même si pnpm avait déjà vérifié l'intégrité du fichier contre le lockfile.

Après l'import d'un paquet, la 11.8 retire désormais com.apple.quarantine des binaires natifs (.node, .dylib, .so), reproduisant le comportement de Homebrew qui retire la quarantaine des téléchargements vérifiés. Le nettoyage est réservé à macOS, s'exécute en un seul appel xattr groupé par paquet, se limite aux binaires natifs pour que les autres fichiers restent intacts, et est non bloquant. Il corrige #11056.

Autres correctifs à connaître

pnpm run --no-bail quitte désormais avec un code non nul quand un script exécuté échoue, tout en continuant à exécuter tous les scripts correspondants jusqu'au bout. Cela clôture l'issue #8013 : les exécutions --no-bail non récursives quittaient toujours avec 0 même en cas d'échec, ce qui était incohérent avec les exécutions récursives qui échouaient déjà à la fin.

pnpm view sans nom de paquet cherche désormais vers le haut le manifeste de projet le plus proche (package.json, package.yaml ou package.json5) et utilise son champ name, remplaçant la dépendance find-up par le module empathic, plus rapide. Plusieurs bugs de correction du lockfile arrivent aussi : les installations incrémentales ne conservent plus les dépendances transitives dupliquées qu'une installation fraîche n'aurait pas produites (#5108), optimisticRepeatInstall ne signale plus « Already up to date » quand seul le lockfile a changé (#12100), et les overrides de catalogue qui se résolvent via un catalogue restent synchronisés avec le catalogue pendant pnpm update. pnpm version --recursive respecte désormais le filtre de workspace au lieu de monter chaque paquet (#11348). La sortie du reporter pour pnpm store et pnpm config va désormais sur stderr, pour que des scripts comme PNPM_STORE=$(pnpm store path) ne capturent plus d'avertissements dans leur résultat.

Mise à niveau

pnpm 11.8.0 requiert Node.js 22.13 ou supérieur, la même ligne de base que la 11.7. Le format du lockfile est inchangé, donc un npm install -g pnpm@latest (ou corepack prepare pnpm@latest --activate) suivi d'un pnpm install constitue le chemin complet de mise à niveau. Les nouveaux drapeaux sont tous opt-in, et la validation des configDependencies ne rejette que des entrées qui n'ont jamais été des noms de paquet valides.

Questions fréquentes

React Router v8 promeut ses Future Flags en valeurs par défaut, passe en ESM uniquement et abandonne `react-router-dom`

React Router v8.0.0 (17 juin 2026) est la première version majeure sous le modèle de gouvernance ouverte (Open Governance) du projet et la première d'un rythme annuel planifié. Chaque indicateur `future.v8_*` de la v7 devient la valeur par défaut (middleware toujours activé, requêtes pass-through, API Vite Environment, découpage des modules de route), la base minimale passe à Node 22.22+, React 19.2.7+ et Vite 7+, tous les paquets sont publiés en ESM uniquement avec une cible ES2022, `react-router-dom` est supprimé, et les adaptateurs Node basculent vers un serveur fetch maintenu par Remix tandis que `create-react-router` abandonne son polyfill fetch pour le `fetch` natif.

TypeScript 7.0 RC arrive : le compilateur Go atteint le Release Candidate, environ 10 fois plus rapide, avec une migration côte à côte

TypeScript 7.0 RC (18 juin 2026) est le release candidate du compilateur que Microsoft a porté depuis sa base de code TypeScript auto-amorcée vers Go. Il est souvent environ 10 fois plus rapide que TypeScript 6.0, fournit un paquet de compatibilité tsc6 pour fonctionner côte à côte avec 6.0, ajoute les options de parallélisme --checkers/--builders/--singleThreaded et un mode watch reconstruit sur un port Go de @parcel/watcher, et transforme toutes les dépréciations de 6.0 en erreurs fatales. La version stable est prévue dans le mois qui vient, une API programmatique stable étant repoussée à 7.1.

Articles connexes

Plus de couverture avec des sujets et tags en commun.

Bug Claude Code #74066 : Des Utilisateurs Signalent une Fuite de Contexte Entre Workspaces sur Sonnet 5, Anthropic N'a Pas Encore Répondu
security

Bug Claude Code #74066 : Des Utilisateurs Signalent une Fuite de Contexte Entre Workspaces sur Sonnet 5, Anthropic N'a Pas Encore Répondu

Un bug ouvert déposé contre Claude Code le 2026-07-04 par un utilisateur [Enterprise ZDR](https://docs.anthropic.com/en/docs/build-with-claude/zero-data-retention) décrit une session de travail sur Sonnet 5 qui commence soudainement à faire référence à une construction de temple Minecraft non liée, puis persiste dans la mauvaise tâche dans son récapitulatif. Le rapporteur (GitHub : [@milesrichardson-edb](https://github.com/milesrichardson-edb), issue [anthropics/claude-code#74066](https://github.com/anthropics/claude-code/issues/74066)) est sur Enterprise Zero Data Retention, le niveau qu'Anthropic présente spécifiquement comme isolé par session. Le triage sur le JSONL de session locale du rapporteur à `~/.claude/projects/<encoded-cwd>/<session-id>.jsonl` montre que le texte fuité n'est pas dans la transcription, ce qui exclut une fuite de contexte locale par chevauchement de fichier. Quatre autres utilisateurs dans les commentaires (avec des historiques de travail remontant à l'an dernier) décrivent un comportement quasi identique sur Claude Code, Claude Mobile et Claude deep research. Le fit architectural le plus plausible est un état de cache KV partagé dans l'inférence ([selon @yv3nne dans les commentaires](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880448776)), mais aucun ingénieur d'Anthropic n'a commenté l'issue dans les 22 heures depuis son dépôt, et l'issue a atteint le sommet de [Hacker News](https://news.ycombinator.com/item?id=42481789) le 2026-07-04. Le ton dans le fil est partagé : la moitié suspectant une vraie réutilisation de cache plateforme, l'autre moitié suspectant une [hallucination spécifique à Sonnet 5 déclenchée par un lexer Pygments](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880334711). Les deux lectures sont crédibles.
Turborepo 2.10.3 Reconnaît nub et aube, Deux Nouveaux Gestionnaires de Paquets Node.js en Rust par Colin McDonnell (Zod) et Jeff Dickey (mise)
tooling

Turborepo 2.10.3 Reconnaît nub et aube, Deux Nouveaux Gestionnaires de Paquets Node.js en Rust par Colin McDonnell (Zod) et Jeff Dickey (mise)

Turborepo [v2.10.3](https://github.com/vercel/turborepo/releases/tag/v2.10.3) est sorti le 2026-07-03 avec un support de première classe pour [nub](https://github.com/nubjs/nub) et [aube](https://github.com/jdx/aube), deux gestionnaires de paquets Node.js écrits en Rust qui ont émergé au printemps et à l'été 2026. nub est écrit par Colin McDonnell (créateur de [Zod](https://github.com/colinhacks/zod), 43k étoiles) et aube par Jeff Dickey (créateur de [mise](https://github.com/jdx/mise)); les deux s'intègrent à Turborepo comme valeurs `packageManager` dans `package.json` et `devEngines.packageManager`. La release apporte aussi un nouveau toggle TUI/logs-streamés, la sélection de tâches au clic dans la liste de tâches TUI, la copie automatique des sélections TUI au presse-papiers à la souris, un flag `--production` sur `turbo prune`, TypeScript 7.0.1-rc comme toolchain de workspace, thin LTO + `codegen-units=1` pour les builds de release, et une longue liste de corrections de perf sur le cache-hashing. Le signal principal: deux des builders les plus respectés du toolchain JS livrent désormais des gestionnaires de paquets qui s'appuient sur Node stock au lieu de le remplacer, et Turborepo est le premier outil de monorepo mainstream à formaliser les deux.
npm 11.18 promeut la stratégie d'installation `linked` en stable, ajoute l'espace de noms `npm install-scripts` et avertit quand `min-release-age` bloque un correctif d'audit
tooling

npm 11.18 promeut la stratégie d'installation `linked` en stable, ajoute l'espace de noms `npm install-scripts` et avertit quand `min-release-age` bloque un correctif d'audit

npm 11.18.0 (29 juin 2026) livre trois fonctionnalités et un long backlog de corrections de bugs qui, ensemble, achèvent le travail que le CLI npm mène sur le mode d'installation `install-strategy=linked` (isolated) depuis la RFC #0042 en 2022. L'événement phare est la [PR #9677](https://github.com/npm/cli/pull/9677) (backport de #9674), qui fait passer `--install-strategy=linked` d'expérimental à stable. Le mode installe chaque paquet dans `node_modules/.store/<name>@<version>/node_modules/<dep>` et lie symboliquement ses dépendances déclarées dans son propre `node_modules/<dep>`, de sorte qu'un paquet ne peut `require` que les dépendances réellement déclarées dans son propre `package.json`. La nouvelle recommandation des docs ([PR #9690](https://github.com/npm/cli/pull/9690)) consiste à exécuter `--install-strategy=linked` en CI pour intercepter les dépendances fantômes avant publication. Autour de cette promotion, la release livre un nouveau namespace `npm install-scripts` ([#9635](https://github.com/npm/cli/pull/9635), backport de #9629) qui possède `approve`, `deny` et `ls`, avec `npm approve-scripts` / `npm deny-scripts` conservés comme alias ; une passe de ménage `install-scripts: prune unused allowScripts entries` ([#9662](https://github.com/npm/cli/pull/9662)) ; et un nouvel avertissement quand `min-release-age` bloque un `npm audit fix` ([#9564](https://github.com/npm/cli/pull/9564)). La release de 43 commits corrige aussi 19 bugs de la stratégie `linked` (déterminisme de l'audit #9638, stubs `.bin` orphelins #9643, nettoyage des `.store` périmés #9649, crash `filterNode` invalide #9645, validation peerOptional #9641), trois fixes `npm sbom` et un fix d'encodage en pourcentage du qualificateur `vcs_url` dans les purls générées ([#9693](https://github.com/npm/cli/pull/9693)).

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.