Skip to content

build(deps): passer le frontend à Angular 22 (Node 22, Jest 30) - #678

Merged
aschlegle merged 4 commits into
developfrom
chore/angular-22
Sep 29, 2026
Merged

aschlegle merged 4 commits into
developfrom
chore/angular-22

Conversation

@aschlegle

Copy link
Copy Markdown
Contributor

Corrige les 22 vulnérabilités remontées par Dependency-Track sur cicada-frontend en montant Angular 19 → 22 (maintenu jusqu'à fin 2027). Angular 19 n'est plus maintenu : 7 des failles n'y ont aucun correctif. Suite de #677 (partie Python).

Commits (une marche par version majeure)

  1. Angular 20 — Material/CDK 20, TypeScript 5.9. La migration renomme les variables CSS Material --mdc-* → --mat-* (styles globaux, overrides, 4 composants).
  2. Jest 30 — jest-preset-angular 14 bloquait ng update. jsdom 26 ne permet plus de remplacer window.location : la redirection de sortie d'impersonation passe par HeaderComponent.reloadTo().
  3. Angular 21 — retrait des imports standalone inutilisés (CommonModule dans 99 composants). Une navigation du routeur ne se termine plus sous fakeAsync : les tests de l'en-tête passent en async/await (3 d'entre eux passaient sans naviguer).
  4. Angular 22 + Node.js 22 — TypeScript 6.0 ; Node 22 dans la CI, le Dockerfile et le conteneur de dev. Migrations à comportement constant : ChangeDetectionStrategy.Eager sur les 133 composants (OnPush devient le défaut), withXhr(), $safeNavigationMigration() dans 6 gabarits. Documentation mise à jour (CLAUDE.md, DESIGN_SYSTEM.md).

Vérifications

  • Build de production OK ; avertissements de budget déjà présents sous Angular 19 (bundle initial 917 → 955 ko, +5,5 ko gzip)
  • tsc --noEmit OK
  • Jest : 2606/2607. Le seul échec (profile.component.spec.ts › getDaysUntilDeletion) échoue déjà sur develop
  • npm audit --omit=dev et OSV : 0 vulnérabilité sur les 25 composants de production
  • Comparaison visuelle 19 / 22 (Chrome, admin@test.fr) : accueil, liste des plans, plan, enjeux, utilisateurs, sites, formulaire de création, liste déroulante, modale → identiques au pixel près. Suite E2E Playwright non lancée en local (la CI la lance).

Changements visibles à arbitrer

Deux valeurs par défaut de Material ont changé, visibles dans le menu du compte :

  • Séparateurs mat-divider : #6f7979 → #bec9c8 (plus clair, partout dans l'application). Aucune des deux n'est la couleur du design system, qui prévoit $gray-light (#E4E4E4) pour les filets ; la nouvelle s'en rapproche.
  • Bouton qui ouvre un menu : le voile primaire à 8 % tant que le menu est ouvert n'apparaît plus qu'à la navigation clavier.

Après merge

  • Recréer le conteneur frontend (image node:22-alpine) : docker compose up -d --force-recreate frontend
  • Node 22 requis en local (nvm install 22)

🤖 Generated with Claude Code

aschlegle and others added 4 commits September 29, 2026 14:17
Angular 19 n'est plus maintenu : 7 des 22 failles remontées par Dependency-Track
sur cicada-frontend n'y ont aucun correctif. Première marche vers Angular 22.

- @angular/* 19.2.15 → 20.3.32, CLI et build-angular 20.3.37,
  Material et CDK 19.2.19 → 20.2.14, TypeScript 5.6 → 5.9
- migrations ng update : variables CSS Material renommées --mdc-* → --mat-*
  (styles globaux, overrides Material et 4 composants), valeurs par défaut des
  schematics dans angular.json
- TypeScript 5.9 refuse une variable lue avant affectation dans un test
  (plan-detail.component.spec.ts)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jest-preset-angular 14 ne suit que Jest 29 et bloque ng update au-delà
d'Angular 20. Jest 29 → 30, jest-environment-jsdom 30, jest-preset-angular
14 → 17 (Angular 20 à 22), @types/jest 30.

jsdom 26 ne permet plus de remplacer window.location : le rechargement de page
à la sortie de l'impersonation passe par HeaderComponent.reloadTo(), que les
tests espionnent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deuxième marche vers Angular 22.

- @angular/* 20.3.32 → 21.2.24, CLI et build-angular 21.2.24,
  Material et CDK 20.2.14 → 21.2.14
- migrations ng update : retrait des imports standalone inutilisés
  (CommonModule dans 99 composants, composants importés mais absents du
  gabarit), lib par défaut dans tsconfig.json
- depuis Angular 21, une navigation du routeur ne se termine plus sous
  fakeAsync/tick : les tests de détection de la page d'accueil de l'en-tête
  passent en async/await. Ceux qui attendaient l'accueil restaient verts sans
  naviguer, l'URL initiale étant déjà « / » ; ils vérifient de nouveau quelque
  chose.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Troisième et dernière marche. Angular 22 est maintenu jusqu'à fin 2027 ;
toutes les failles remontées sur cicada-frontend sont corrigées.

- @angular/* 21.2.24 → 22.2.0, Material et CDK 21.2.14 → 22.2.0,
  TypeScript 5.9 → 6.0
- Node.js 20 → 22 (Angular 22 l'exige) : CI, Dockerfile du frontend,
  conteneur de développement
- migrations ng update, toutes à comportement constant :
  - OnPush devient le défaut : ChangeDetectionStrategy.Eager posé sur les
    133 composants existants
  - provideHttpClient garde le backend XHR (withXhr) au lieu de fetch
  - 6 gabarits : () conserve l'ancienne sémantique
    de ?.
  - deux diagnostics étendus mis en sourdine dans tsconfig.app.json
- TypeScript 6 n'inclut plus les @types par défaut : tsconfig.json déclare
  jest et node pour le typecheck de la CI
- l'hôte de test de FilterDropdownComponent modifie des champs ordinaires :
  Eager, lui aussi
- documentation : version d'Angular, variables CSS Material --mat-* dans
  CLAUDE.md et DESIGN_SYSTEM.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aschlegle
aschlegle merged commit 98d077b into develop Sep 29, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant