metalfrom.eu/eslint.config.js
Nicolas Fryder cf9b88cfbc
Some checks are pending
CI / javascript (push) Waiting to run
CI / python (push) Waiting to run
CI / mutation (push) Waiting to run
chore(lint): supprime 27 avertissements permanents du hook pre-push
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.
2026-08-19 15:13:55 +02:00

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",
},
},
];