fix(deps): update postcss to 8.5.23, accept the react-router advisory #318

Merged
maximus merged 1 commit from issue-311-npm-advisories into main 2026-07-28 00:38:32 +00:00
Owner

Resolves #311

npm audit passe de 3 findings à 2. Le seul restant est volontairement accepté.

Base = issue-310-rustsec-advisories, pas main. À merger après #316. Les deux PR écrivent dans la même section ### Security / ### Sécurité sous [Unreleased] des deux CHANGELOG : brancher depuis main garantissait un conflit add/add. Le stack laisse cette PR ajouter une puce à la section créée par #316, ce qui est aussi le bon résultat sémantique. Forgejo re-ciblera automatiquement sur main au merge de #316merger #316 en merge ou fast-forward, pas en squash : un squash rejouerait tout le diff de #310 dans cette PR et recréerait précisément le conflit que le stack évite.

postcss — corrigé

postcss 8.5.13 → 8.5.23, corrigeant GHSA-r28c-9q8g-f849 (traversée de chemin dans le chargement automatique d'une source map précédente via un commentaire sourceMappingURL, divulgation de .map arbitraires — 7.5 high, CWE-22).

Aucune entrée overrides nécessaire, contrairement au cas @babel/core de #241 : vite@6.4.3 déclare postcss: ^8.5.3 et 8.5.23 est publié — la borne autorisait déjà le correctif, seul le lock portait une résolution périmée. Le bloc overrides existant est intact, et package.json n'est pas touché.

nanoid 3.3.11 → 3.3.16 suit : c'est une dépendance de postcss lui-même, dans sa propre borne. Le diff du lock est donc de 2 paquets, pas 1.

$ npm ls postcss
simpl_result_scaffold@0.14.0
└─┬ vite@6.4.3
  └── postcss@8.5.23      <- instance unique, pas de duplication d'arbre

Vérification du CSS émis

postcss est le pipeline CSS (vite + @tailwindcss/vite) : un build vert prouve la compilation, pas l'identité de la sortie. Ni le build ni les 871 tests n'assertent quoi que ce soit sur le CSS produit — c'est le seul angle mort réel d'un bump d'outil de build.

La feuille de style a donc été diffée de part et d'autre du bump :

avant : 00f5a734b3e0b0a11a4adab323da8af9138cfff0eef7d4c2667bf41632bc0441  index-B59Ma3Pl.css
après : 00f5a734b3e0b0a11a4adab323da8af9138cfff0eef7d4c2667bf41632bc0441  index-B59Ma3Pl.css

Identique octet pour octet — même hash de contenu, donc même nom d'asset.

react-router — accepté, pas corrigé

GHSA-qwww-vcr4-c8h2, « RSC Mode CSRF Bypass », HIGH, CWE-352, plage >=7.12.0 <8.3.0, installé 7.18.1. Les 2 findings restants sont une seule advisory : la clé react-router-dom vient de effects[] (inflation transitive).

Inatteignable. L'advisory vise le mode React Server Components. src/App.tsx:109 monte un BrowserRouter client-only, et src/ ne contient aucun createStaticHandler, StaticRouter ni rendu serveur. Une app Tauri de bureau n'a pas de serveur.

Rien vers quoi avancer. react-router-dom est figé à 7.18.1 (latest) : la v8 a fusionné le paquet dans react-router (8.3.0 = latest) et react-router-dom n'a jamais publié de 8.x. Le « fix » que propose npm audit est react-router-dom@7.11.0 — un downgrade de sept mineures, d'où son étiquette isSemVerMajor: true. Sortir de la plage demande une migration vers react-router v8, pas un bump.

Déclencheur de re-évaluation : #317, dont le titre porte react-router — nécessaire, car /analyse-vulnerabilite déduplique par sous-chaîne du nom de paquet contre les issues ouvertes ; sans ça, la prochaine passe rouvrirait un doublon, ce qui s'est déjà produit trois fois (#180, #235, #238).

Pas de gate CI ici, contrairement au Rust

check-frontend.yml lance npm ci, npm run build et npm testaucune étape npm audit. Une advisory npm non corrigée ne rend donc rien rouge : il n'y a pas d'alarme à préserver comme côté Rust, et pas d'équivalent npm du .cargo/audit.toml de #310 (npm audit n'a pas de mécanisme d'exclusion natif).

Conséquence : npm audit remontera 2 high en permanence. Comme rien dans le dépôt ne disait que c'était attendu, docs/architecture.md et CLAUDE.md l'écrivent maintenant — sinon le prochain lecteur re-dérive l'analyse ou traite le chiffre comme une régression.

Validation locale

Réinstallation par npm ci avant la validation finale, pour produire le vert par le même chemin d'installation que la CI plutôt que sur un node_modules muté en place par npm update.

  • npm ci propre
  • npm run build (tsc + vite) vert
  • npm test : 871 passed (54 fichiers)
  • CSS émis identique octet pour octet
  • npm audit : 3 → 2 findings, high 3 → 2, postcss disparu

Note pour la synchro STATE.md post-merge

STATE.md affirme encore « npm audit 5→0 » (2026-07-04), ce que l'issue signalait déjà comme périmé. Le chiffre exact après cette PR est 2 high acceptés. La Step 10.5 de /fix-issue ne corrige pas cette ligne d'elle-même — elle n'écrit que dans ## Decisions recentes — donc à reprendre à la main au moment de la synchro.

Resolves #311 `npm audit` passe de **3 findings à 2**. Le seul restant est volontairement accepté. > **Base = `issue-310-rustsec-advisories`, pas `main`.** À merger **après #316**. Les deux PR écrivent dans la même section `### Security` / `### Sécurité` sous `[Unreleased]` des deux CHANGELOG : brancher depuis `main` garantissait un conflit add/add. Le stack laisse cette PR **ajouter une puce** à la section créée par #316, ce qui est aussi le bon résultat sémantique. Forgejo re-ciblera automatiquement sur `main` au merge de #316 — **merger #316 en `merge` ou fast-forward, pas en squash** : un squash rejouerait tout le diff de #310 dans cette PR et recréerait précisément le conflit que le stack évite. ## postcss — corrigé `postcss` 8.5.13 → **8.5.23**, corrigeant [GHSA-r28c-9q8g-f849](https://github.com/advisories/GHSA-r28c-9q8g-f849) (traversée de chemin dans le chargement automatique d'une source map précédente via un commentaire `sourceMappingURL`, divulgation de `.map` arbitraires — 7.5 high, CWE-22). **Aucune entrée `overrides` nécessaire**, contrairement au cas `@babel/core` de #241 : `vite@6.4.3` déclare `postcss: ^8.5.3` et 8.5.23 est publié — la borne autorisait déjà le correctif, seul le lock portait une résolution périmée. Le bloc `overrides` existant est intact, et `package.json` n'est pas touché. `nanoid` 3.3.11 → 3.3.16 suit : c'est une dépendance de `postcss` lui-même, dans sa propre borne. Le diff du lock est donc de **2 paquets**, pas 1. ``` $ npm ls postcss simpl_result_scaffold@0.14.0 └─┬ vite@6.4.3 └── postcss@8.5.23 <- instance unique, pas de duplication d'arbre ``` ### Vérification du CSS émis `postcss` **est** le pipeline CSS (vite + `@tailwindcss/vite`) : un build vert prouve la compilation, pas l'identité de la sortie. Ni le build ni les 871 tests n'assertent quoi que ce soit sur le CSS produit — c'est le seul angle mort réel d'un bump d'outil de build. La feuille de style a donc été diffée de part et d'autre du bump : ``` avant : 00f5a734b3e0b0a11a4adab323da8af9138cfff0eef7d4c2667bf41632bc0441 index-B59Ma3Pl.css après : 00f5a734b3e0b0a11a4adab323da8af9138cfff0eef7d4c2667bf41632bc0441 index-B59Ma3Pl.css ``` **Identique octet pour octet** — même hash de contenu, donc même nom d'asset. ## react-router — accepté, pas corrigé [GHSA-qwww-vcr4-c8h2](https://github.com/advisories/GHSA-qwww-vcr4-c8h2), « RSC Mode CSRF Bypass », HIGH, CWE-352, plage `>=7.12.0 <8.3.0`, installé 7.18.1. Les 2 findings restants sont **une seule advisory** : la clé `react-router-dom` vient de `effects[]` (inflation transitive). **Inatteignable.** L'advisory vise le mode **React Server Components**. `src/App.tsx:109` monte un `BrowserRouter` client-only, et `src/` ne contient aucun `createStaticHandler`, `StaticRouter` ni rendu serveur. Une app Tauri de bureau n'a pas de serveur. **Rien vers quoi avancer.** `react-router-dom` est figé à **7.18.1** (`latest`) : la v8 a fusionné le paquet dans `react-router` (8.3.0 = `latest`) et `react-router-dom` n'a jamais publié de 8.x. Le « fix » que propose `npm audit` est `react-router-dom@7.11.0` — un **downgrade** de sept mineures, d'où son étiquette `isSemVerMajor: true`. Sortir de la plage demande une **migration** vers react-router v8, pas un bump. Déclencheur de re-évaluation : **#317**, dont le titre porte `react-router` — nécessaire, car `/analyse-vulnerabilite` déduplique par sous-chaîne du nom de paquet contre les issues **ouvertes** ; sans ça, la prochaine passe rouvrirait un doublon, ce qui s'est déjà produit trois fois (#180, #235, #238). ## Pas de gate CI ici, contrairement au Rust `check-frontend.yml` lance `npm ci`, `npm run build` et `npm test` — **aucune étape `npm audit`**. Une advisory npm non corrigée ne rend donc **rien rouge** : il n'y a pas d'alarme à préserver comme côté Rust, et pas d'équivalent npm du `.cargo/audit.toml` de #310 (`npm audit` n'a pas de mécanisme d'exclusion natif). Conséquence : `npm audit` remontera **2 high en permanence**. Comme rien dans le dépôt ne disait que c'était attendu, `docs/architecture.md` et `CLAUDE.md` l'écrivent maintenant — sinon le prochain lecteur re-dérive l'analyse ou traite le chiffre comme une régression. ## Validation locale Réinstallation par `npm ci` avant la validation finale, pour produire le vert par **le même chemin d'installation que la CI** plutôt que sur un `node_modules` muté en place par `npm update`. - `npm ci` propre - `npm run build` (tsc + vite) vert - `npm test` : **871 passed** (54 fichiers) - CSS émis identique octet pour octet - `npm audit` : 3 → 2 findings, `high` 3 → 2, `postcss` disparu ## Note pour la synchro STATE.md post-merge `STATE.md` affirme encore « `npm audit` 5→**0** » (2026-07-04), ce que l'issue signalait déjà comme périmé. Le chiffre exact après cette PR est **2 high acceptés**. La Step 10.5 de `/fix-issue` ne corrige pas cette ligne d'elle-même — elle n'écrit que dans `## Decisions recentes` — donc à reprendre à la main au moment de la synchro.
maximus added 1 commit 2026-07-27 23:57:08 +00:00
fix(deps): update postcss to 8.5.23, accept the react-router advisory
All checks were successful
PR Check — Frontend / frontend (pull_request) Successful in 1m37s
2740621fee
npm update postcss moves it 8.5.13 -> 8.5.23, clearing GHSA-r28c-9q8g-f849
(path traversal in previous-source-map auto-loading via a sourceMappingURL
comment, arbitrary .map disclosure, 7.5 high). No overrides entry needed,
unlike #241: vite declares postcss ^8.5.3 and 8.5.23 is published, so the
existing range already permitted the fix and only the lockfile carried a
stale resolution. nanoid 3.3.11 -> 3.3.16 comes along as postcss's own
dependency, within its declared range.

postcss IS the CSS pipeline, so a green build only proves compilation. The
emitted stylesheet was diffed across the bump and is byte-for-byte identical
(same content hash, same asset filename).

The remaining react-router advisory (GHSA-qwww-vcr4-c8h2, RSC Mode CSRF
bypass) is accepted rather than fixed. It targets React Server Components,
which a Tauri desktop app never runs — App.tsx mounts a client-only
BrowserRouter and src/ has no createStaticHandler, StaticRouter or server
rendering. There is also nothing to move forward to: react-router-dom is
frozen at 7.18.1 since v8 merged the package into react-router, so npm's
proposed "fix" is a downgrade to 7.11.0, and leaving the affected range
means migrating to react-router v8. Re-evaluation trigger tracked in #317.

Unlike the Rust side, no CI gate is involved: check-frontend.yml runs no
npm audit step, so nothing turns red. That expectation is now written down
in docs/architecture.md and CLAUDE.md so the two permanent high findings do
not read as a regression.

npm audit: 3 findings -> 2 (high 3 -> 2), postcss cleared.
npm ci + npm run build + 871 vitest green.

Resolves #311

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
maximus force-pushed issue-311-npm-advisories from 2740621fee to a14258b147 2026-07-28 00:00:14 +00:00 Compare
maximus changed target branch from issue-310-rustsec-advisories to main 2026-07-28 00:38:12 +00:00
maximus merged commit a14258b147 into main 2026-07-28 00:38:32 +00:00
maximus deleted branch issue-311-npm-advisories 2026-07-28 00:38:32 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#318
No description provided.