3 familles, 13 fichiers (+153/−167) : 1. no-empty ×70 = TOUS des `catch (x) {}` vides → `catch { /* volontaire */ }` (binding optionnel ES2019 + commentaire : passe no-empty ET no-unused-vars, zéro changement de comportement). 2. no-unused-vars ×171 : - bindings de catch inutilisés retirés (e/err/ex/e2/e3) - 24 lignes mortes déterministes, chaque suppression validée par assert sur le texte exact (`var self = this` ×8, `var lang`, `var acc`, `var today`, `var path/restored/files/resolved/items/clickEl`, `uid()`/`propName()` sans un seul appel, `.then` + `resolved++` compteurs jamais lus) - `/* exported */` sur les 10 fonctions appelées depuis les attributs HTML des templates (vérifiées par grep : 1 template chacune) : setActiveTab/kanbanBoard/filterSystem/sortSystem/newIssueForm/ showNewIssue, importWizard, libraryPage, workspacesPage, settingsInit 3. no-undef ×44 = vrais globaux déclarés dans eslint.config.mjs (getSvgIcon = script inline de base.html, TextDecoder = API navigateur, Prism = CDN) + 2 vrais correctifs : - settings.js : `typeof toast === 'function'` = guard TOUJOURS faux (pas de toast global) → les toasts timezone/SAML ne s'affichaient jamais → `window.showToast` (2 sites) - local_workspace.js : `_wsInitData = window._wsInitData` (auto-affectation sans effet, global implicite) supprimé eslint static/js : **0 erreur / 0 warning** (285 → 0) · node --check vert sur tous les fichiers · suite **1089/1089** · ruff OK · docs à jour
4 blocs interpolés extraits avec la recette de la 2a (config JSON inline + JS statique, substitutions sur le CORPS du bloc) : - local_workspace.html → local_workspace.js (2 031 L, lw-config : current_folder_id, workspace_id) - settings.html → settings.js (1 093 L, st-config : avatar, user full_name/login/email, is_admin (bool), auth_method — 2 routes rendent ce template, expressions « or "" » préservées pour les valeurs Undefined) - _page_editor_realtime.html → page_editor_realtime.js (531 L, rt-config : SELF id/login/full_name/color) - board.html → board.js (146 L, bd-config : owner/repo/initial_view) BONUS sécurité : les valeurs passent par |tojson (échappement JSON explicite) au lieu d'être interpolées dans des strings JS. Tags : config JSON (nonce conservé) + <script src> ?v={{ asset_version }} ; loaders JSON.parse en tête (try/catch → {}). Correctif sur le loader (accolade try en trop, caught par node --check avant tout commit). Cumul A27 : 10 560 L extraites (13 904 → 3 344 restantes, -76 %). Reste structurel : base 1 338 ({% block %}/{% for %}) + database_table 1 323 (if/else) + 279 warnings eslint (12 fichiers, 0 erreur). suite **1089/1089** · ruff OK · node --check ×4 vert · docs à jour