Skip to content

chore: nettoyage Dependabot v0.5.0 + fixes reveal.js 6.x - #116

Merged
jefBinomed merged 8 commits into
developfrom
chore/v0.5.0-cleanup
Jul 5, 2026
Merged

jefBinomed merged 8 commits into
developfrom
chore/v0.5.0-cleanup

Conversation

@jefBinomed

Copy link
Copy Markdown
Collaborator

Résumé

Triage complet des alertes Dependabot (118 → 3 ouvertes) et migration reveal.js 3.8.0 → 6.0.1, avec les régressions découvertes et corrigées au passage.

Dependabot (clusters A-G)

  • A — Remplace le vendoring reveal.js 3.8.0 (4 Mo de code mort, source de 78/118 alertes) par une vraie dépendance npm (reveal.js@6.0.1), synchronisée à la volée dans le showcase via un script non commité.
  • B — Migre ngrok (dépend de request, déprécié) vers le SDK officiel @ngrok/ngrok.
  • C — Retire commitizen/@commitlint/cli (config morte, jamais branchée à un hook ni à la CI).
  • D — Bump http-server 0.12.3 → 14.1.1 + portfinder → 1.0.38.
  • F — Remplace npm-run-all (non maintenu) par npm-run-all2 (fork actif, binaire identique).
  • G — Bump wait-on 4→9 (élimine sa dépendance à request/uuid), @babel/runtime, brace-expansion, override y18n.
  • E (follow-redirects) résolu naturellement par la résolution npm des autres clusters ; non-régression vérifiée manuellement (composant critique du proxy).

Reste volontairement non traité : la chaîne vite/esbuild/vitepress (nécessite un bump majeur de Vite, étude séparée).

Régressions reveal.js 6.x découvertes et corrigées

  • scrollActivationWidth (nouvelle feature 6.x) activait automatiquement le "Scroll View" natif sur les vues étroites (preview presenter, mobile), cassant la navigation et le plugin touch de TalkControl → désactivé.
  • Race condition : reveal.js 6.x lit/réécrit location.hash à l'init, entrant en conflit avec tc-component.bundle.js qui l'utilisait pour connaître son delta (slide courante vs preview de la suivante) → delta/focus passent maintenant par la query string.
  • Bug préexistant démasqué : le serveur rediffuse pluginsList à tous les clients connectés à chaque init, dupliquant les entrées du menu Plugins quand presenter + on-stage sont ouverts simultanément → dédoublonnage côté client.
  • Bug préexistant démasqué : touch-pointer-mask.ts/touch-pointer-settings.ts déclaraient leurs propriétés Lit sans declare, cassées par useDefineForClassFields (cible ES2022) → shadowRoot ne rendait plus rien.

Test plan

  • tsc --noEmit propre
  • 198 tests unitaires passent
  • 27 tests composants (navigateur) passent, dont 3 nouveaux pour la déduplication du menu Plugins
  • Vérification manuelle : showcase, stage view et presenter view (double preview + notes + timer) avec reveal.js 6.0.1
  • Vérification manuelle : navigation clavier synchronisée sur plusieurs slides consécutives, preview correctement décalée d'une slide
  • Vérification manuelle : proxy http-proxy/follow-redirects après redémarrage serveur (non-régression composant critique)
  • Vérification manuelle : presenter + on-stage ouverts en parallèle — menu Plugins sans doublon, mask/réglages touch pointer s'affichent et propagent bien position/couleur vers on-stage

🤖 Generated with Claude Code

jefBinomed and others added 8 commits July 1, 2026 18:32
Deux prompts KERNEL calibrés Sonnet, jouables indépendamment :
- 01 : triage Dependabot + nettoyage issues (fermeture sur accord)
- 02 : audit code lecture seule, rapport priorisé sur tout le repo

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nce npm (Cluster A)

Supprime la copie source complète de reveal.js 3.8.0 (4 Mo, figée depuis
2020, jamais retouchée, source de 78 des 118 alertes Dependabot ouvertes)
au profit de reveal.js@6.0.1 installé via npm et synchronisé dans le
showcase à la volée (scripts/sync-showcase-reveal.mjs, non commité).

showcase/index.html reconstruit depuis le demo officiel reveal.js 6.x,
en conservant l'injection tc-component (corrige au passage un bug
préexistant : script chargé en text/javascript au lieu de module).

Corrige aussi une race condition dans RevealEngine.goToSlide() qui
plantait quand une commande de navigation arrivait avant que Reveal
ait rendu les slides dans le DOM (Cannot read properties of undefined
reading 'fMax') — non lié à la version de reveal.js, découvert lors
du test manuel de l'upgrade faute de couverture e2e existante.

Vérifié manuellement : showcase, stage view et presenter view de
TalkControl fonctionnent avec reveal.js 6.0.1 (rendu, notes, timer).
198/198 tests passent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Cluster B : migre ngrok@3.4.1 (dépend de `request`, déprécié) vers le
  SDK officiel @ngrok/ngrok — API mise à jour dans tunnel.ts
  (ngrok.forward() + listener.url() au lieu de ngrok.connect()).
- Cluster C : retire commitizen + @commitlint/cli (jamais branchés à un
  hook ni à la CI, config morte) et leur config associée.
- Cluster D : bump http-server 0.12.3 -> 14.1.1 pour le showcase, et
  portfinder -> 1.0.38 pour éliminer la dernière alerte async.
- Cluster F : remplace npm-run-all (non maintenu) par npm-run-all2,
  fork actif avec les mêmes binaires (aucun changement de script).
- Cluster G : bump wait-on 4 -> 9 (élimine sa dépendance à `request`
  et `uuid`), @babel/runtime et brace-expansion mis à jour dans leurs
  ranges existants, override `y18n` -> ^4.0.1 (transitif de qrcode,
  utilisé uniquement par son CLI qu'on n'exécute jamais).

Reste volontairement non traité : la chaîne vite/esbuild/vitepress
(nécessite un bump majeur de Vite, étude séparée) et le Cluster E
(follow-redirects, composant critique, non-régression à part).

tsc --noEmit propre, 198/198 tests passent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…reveal.js 6.x

reveal.js 6.x introduit `scrollActivationWidth` (défaut 435px) : sous ce
seuil, il bascule automatiquement en "Scroll View" natif, une fonctionnalité
inexistante en 3.8.0. Ce mode restructure le DOM (.slides > div.scroll-page
au lieu de .slides > section) et prend la main sur le scroll/touch natif.

Deux effets de bord observés en usage réel :
- Le panneau "next slide preview" du presenter (plus étroit que 435px)
  bascule en Scroll View, cassant getSlides()/goToSlide() (silencieux
  depuis le fix précédent, mais plus aucune navigation ne s'y reflétait).
- presenter-mobile.html (~360px de large) déclenche le même mode, dont
  la gestion tactile native entre en conflit avec le plugin touchInput
  de TalkControl, qui gère lui-même les gestures de swipe.

TalkControl pilote sa propre navigation de bout en bout ; le Scroll View
natif de reveal n'a jamais de raison de s'activer. Fix : scrollActivationWidth
à null dans RevealEngine.init(), qui court-circuite la vérification
(`typeof f.scrollActivationWidth === 'number'`) dans reveal.js.

Vérifié : structure .slides>section préservée à 360px et sur le panneau
preview, navigation clavier reflétée sur les deux panneaux du presenter.
198/198 tests passent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
reveal.js 6.x lit et réécrit location.hash pendant son initialisation
(routing par hash pour le deep-linking). Ça entre en course avec
tc-component.bundle.js (script module, différé) qui lisait aussi
location.hash pour connaître son "delta" (0 = slide courante, 1 =
preview de la slide suivante côté presenter). Reveal gagnait
systématiquement la course et vidait le hash avant notre lecture,
donc delta retombait toujours à 0 par défaut.

Résultat observable : le panneau "next slide preview" du presenter
affichait la slide courante au lieu de la suivante, et ne semblait
"suivre" aucune navigation clavier de façon cohérente.

Fix : delta et focus transitent maintenant par la query string
(?delta=1) au lieu du hash (#delta=1) — reveal.js ne touche jamais à
location.search, donc plus de race condition possible.

Vérifié manuellement : après ce fix, le panneau preview du presenter
affiche bien la slide suivante et reste correctement décalé d'un cran
sur plusieurs navigations successives. 198 tests unitaires + 24 tests
composants passent (dont 3 nouveaux/mis à jour dans slide-view.spec.ts
pour couvrir la construction de l'URL en query param).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deux bugs préexistants (aucun lien avec reveal.js), jamais détectés
faute de test avec presenter + on-stage connectés simultanément :

1. Le serveur rediffuse `pluginsList` à TOUS les clients connectés
   (io.emit) à chaque fois que N'IMPORTE LEQUEL d'entre eux envoie
   'init' — dès que deux vues sont ouvertes (presenter + on-stage),
   chaque plugin non-auto-activé (ex: touchPointerInput) apparaît en
   double dans le menu Plugins. Fix côté client : menu-plugins.ts
   ignore maintenant l'ajout d'un item déjà présent dans la liste.

2. touch-pointer-mask.ts et touch-pointer-settings.ts déclaraient
   leurs propriétés réactives Lit comme de simples class fields
   (`pointer = {...}`, `pointerColor = '...'`, `foo!: Type`). Avec la
   cible TypeScript ES2022 du projet (useDefineForClassFields), ça
   écrase silencieusement les accesseurs générés par Lit et empêche
   tout rendu (shadowRoot reste vide, seul un warning dev-mode Lit
   apparaît en console). Fix : `declare` sur ces champs + valeurs par
   défaut déplacées dans le constructeur, même pattern déjà utilisé
   correctement dans slide-view.ts. Recherche exhaustive : aucun autre
   composant Lit du projet n'a ce problème.

Vérifié manuellement avec presenter + on-stage ouverts en parallèle :
un seul "touchPointerInput" dans le menu, le mask (bordure rouge) et
le panneau de réglages (couleurs) s'affichent à l'activation, et un
déplacement de souris sur le mask du presenter met bien à jour la
position/couleur du pointeur sur la vue on-stage.

198 tests unitaires + 27 tests composants (dont 3 nouveaux pour la
déduplication du menu) passent. tsc --noEmit propre.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Le job E2E utilisait un chemin codé en dur vers une copie imbriquée de
playwright (node_modules/@playwright/test/node_modules/playwright/cli.js)
qui n'existe pas forcément après un `npm ci` propre selon la façon dont
npm hoiste/déduplique les dépendances (ENOTDIR en CI) — ce chemin
fonctionnait seulement par accident d'historique d'installation locale.

@playwright/test embarque en fait son propre cli.js directement
(node_modules/@playwright/test/cli.js), sans avoir besoin de descendre
dans un node_modules imbriqué. C'est ce chemin stable qu'il faut utiliser
pour exécuter les specs e2e (qui importent `test`/`expect` depuis
@playwright/test), afin de garantir qu'on utilise la même instance de
Playwright que celle avec laquelle les specs ont été écrites — sinon
Playwright refuse de lancer les tests ("two different versions of
@playwright/test").

La dépendance `playwright` (standalone) au niveau racine reste
nécessaire : c'est une peerDependency obligatoire de
@vitest/browser-playwright pour les tests de composants en mode
navigateur, pas une redondance à supprimer.

Preexistant sur develop (déjà en échec avant cette branche), corrigé
ici pour débloquer la CI de la PR. 24/24 tests e2e passent en local
avec le chemin corrigé.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s seuils manquants

Le check Coverage échouait déjà sur develop : les web-components (testés en
mode navigateur via vitest.browser.config.ts) ressortaient à 0% dans le
rapport car leur exécution est séparée de la config jsdom. On fusionne
désormais les deux via le reporter blob + --mergeReports de Vitest 4, et on
comble le reste de l'écart (branches surtout) avec des tests pour les 3
plugins d'input jamais testés (touch-pointer, keyboard, touch), le service
presentation, le bootstrap tc-component et les cas limites du moteur
revealjs-server-engine.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jefBinomed
jefBinomed merged commit 8ef8fb0 into develop Jul 5, 2026
7 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