Chaque push affichait les 27 mêmes avertissements. Un gate qui répète toujours la même chose n'est plus lu — et le jour où un VRAI avertissement apparaît, il passe inaperçu au milieu. Les deux règles en cause étaient les miennes et sont inadaptées à ce code. require-await (7 occurrences, apps/api) Inadapté à Fastify : un handler `async` sans `await` est la façon normale de renvoyer une valeur — l'API distingue le style async du style callback avec reply.send. Les rendre synchrones changerait la sémantique. Règle désactivée pour l'API. no-console (20 occurrences, apps/web/site) Traces de diagnostic délibérées dans le site public. Les signaler à chaque exécution sans jamais les retirer ne faisait que noyer le reste. Règle désactivée pour les frontends, avec la valeur à restaurer si on décide un jour de les nettoyer. Le hook affiche désormais six lignes vertes et rien d'autre : tout ce qui s'imprime redevient un signal.
119 lines
3.9 KiB
JavaScript
119 lines
3.9 KiB
JavaScript
import js from "@eslint/js";
|
|
import globals from "globals";
|
|
|
|
/**
|
|
* Config ESLint « flat » (ESLint 9).
|
|
*
|
|
* Trois environnements coexistent dans ce repo et n'ont pas les mêmes globales :
|
|
* - apps/api : Node ESM
|
|
* - apps/web/site : scripts classiques navigateur (Leaflet en global)
|
|
* - apps/admin/site : scripts classiques navigateur
|
|
*/
|
|
export default [
|
|
{
|
|
ignores: [
|
|
"**/node_modules/**",
|
|
"apps/web/quizz-site/**",
|
|
"reports/**",
|
|
".stryker-tmp/**",
|
|
"coverage/**",
|
|
],
|
|
},
|
|
|
|
js.configs.recommended,
|
|
|
|
// ---- API : Node, ESM ----
|
|
{
|
|
files: ["apps/api/src/**/*.js"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "module",
|
|
globals: { ...globals.node },
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
"no-console": "off",
|
|
eqeqeq: ["error", "smart"],
|
|
"prefer-const": "error",
|
|
"no-var": "error",
|
|
"no-throw-literal": "error",
|
|
// require-await est inadapté à Fastify : un handler `async` sans `await`
|
|
// est la façon NORMALE de renvoyer une valeur (l'API distingue le style
|
|
// async du style callback avec reply.send). Le rendre synchrone
|
|
// changerait la sémantique. La règle produisait 7 avertissements
|
|
// permanents — et un gate qui affiche toujours la même chose finit par
|
|
// ne plus être lu.
|
|
"require-await": "off",
|
|
},
|
|
},
|
|
|
|
// ---- Tests (vitest + Playwright). Certains tournent sous jsdom ou dans un
|
|
// navigateur → globales navigateur en plus de Node. Le harnais e2e est en
|
|
// .mjs (modules ES chargés directement par node). ----
|
|
{
|
|
files: ["apps/*/test/**/*.{js,mjs}"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "module",
|
|
globals: { ...globals.node, ...globals.browser },
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
},
|
|
},
|
|
|
|
// ---- Frontends : scripts classiques navigateur ----
|
|
{
|
|
files: ["apps/web/site/**/*.js", "apps/admin/site/**/*.js"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "script",
|
|
globals: {
|
|
...globals.browser,
|
|
// Chargés via <script> (CDN ou fichier local) avant app.js
|
|
L: "readonly",
|
|
LOCALES: "readonly",
|
|
noUiSlider: "readonly",
|
|
BMPure: "readonly",
|
|
// Footer CJS des modules « purs » partagés navigateur/test
|
|
module: "writable",
|
|
},
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
// `try { … } catch {}` volontaire sur les appels best-effort (logout, télémétrie)
|
|
"no-empty": ["error", { allowEmptyCatch: true }],
|
|
// Les console.log du site public sont des traces de diagnostic voulues
|
|
// par l'auteur. Les signaler à chaque exécution sans jamais les retirer
|
|
// ne fait que noyer les vrais avertissements. Si on décide un jour de
|
|
// les supprimer, remettre ["warn", { allow: ["warn", "error"] }].
|
|
"no-console": "off",
|
|
eqeqeq: ["error", "smart"],
|
|
"prefer-const": "error",
|
|
"no-var": "error",
|
|
// Les frontends déclarent volontairement des globales partagées entre fichiers
|
|
"no-redeclare": ["error", { builtinGlobals: false }],
|
|
},
|
|
},
|
|
|
|
// ---- Traductions : les espaces insécables fines sont de la typographie
|
|
// volontaire (français, tchèque…), pas des caractères parasites. ----
|
|
{
|
|
files: ["apps/web/site/locales.js"],
|
|
rules: { "no-irregular-whitespace": "off" },
|
|
},
|
|
|
|
// ---- Config et scripts d'outillage (racine + scripts/) ----
|
|
{
|
|
files: ["*.js", "*.config.js", "scripts/**/*.{js,mjs}"],
|
|
languageOptions: {
|
|
ecmaVersion: 2023,
|
|
sourceType: "module",
|
|
globals: { ...globals.node },
|
|
},
|
|
rules: {
|
|
"no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
|
|
"no-console": "off",
|
|
},
|
|
},
|
|
];
|