feat: A20 — htmx allowEval off + plan Alpine CSP phase 3 scopé par probes (v7.37.0)
Changed :
- htmx `allowEval: false` dans le meta htmx-config (base.html) : plus
d'évaluation JS côté htmx (hx-on/hx-vars/hx-vals = 0 usage grep → zéro
régression possible) ; unsafe-eval reste UNIQUEMENT pour Alpine standard.
- Gate E20 renforcée : le smoke vérifie que `Alpine.$data()` lie un vrai
composant [x-data] de la page (lien composant = cœur de toute bascule CSP).
- sw.js : cache bump flowdeck-v7 (purge + re-precache après Inter).
Probes (non conservés, retirés après mesure) — A20 phase 3 scopée :
- Build `@alpinejs/csp` téléchargé et TESTÉ : 72 Ko, 0 eval/new Function,
parseur d'expressions maison, tourne sous CSP strict (meta sans
unsafe-eval) — le lint sélectif fonctionne.
- Mais bloqué sur FlowDeck :
(a) 13 expressions non parsables par la grammaire restreinte
(arrows ×2, typeof ×1, new Date ×4, optional-chaining ×6 ;
base, library, local_workspace, settings, gitea_workspace) —
le gate E2E a attrapé la première : `CSP Parser Error: Unexpected
token: PUNCTUATION ")"` ;
(b) 24 `x-html` réactifs (icônes SVG + markdown agent + preview) =
INTERDITS par le build CSP (innerHTML) → architecture d'icônes à
reposer ;
(c) scope des expressions CSP = données du composant uniquement
(probe : `Undefined variable: fmtDate` / `document`) → chaque site
devient une méthode Alpine.data enregistrée.
- Conséquence : build CSP reverté (alpine.min.js ×3 templates + sw),
unsafe-eval maintenu, fichier alpine.csp.min.js retiré (re-téléchargeable),
assert test CSP de nouveau `in`. Plan de migration composant par composant
(library → settings → local_workspace → gitea → base) + gate E2E par
surface documenté dans ROADMAP (A20 phase 3).
suite **1093/1093** · ruff OK · E2E **2/2** (dont assertion Alpine.$data)
· docs à jour (ROADMAP A20 phase 3, CHANGELOG, WORKLOAD, VERSION)
This commit is contained in: