/** * ESLint flat config – project rules (Rappel des grandes règles / qualité du code). * Applies to web/js and server (excluding node_modules). * Run: npm run lint */ const js = require("@eslint/js"); const jsdoc = require("eslint-plugin-jsdoc"); module.exports = [ js.configs.recommended, { files: ["web/js/**/*.js", "server/**/*.js"], ignores: ["**/node_modules/**", "server/node_modules/**"], plugins: { jsdoc: jsdoc }, languageOptions: { ecmaVersion: 2022, sourceType: "module", globals: { window: "readonly", document: "readonly", localStorage: "readonly", fetch: "readonly", setInterval: "readonly", clearInterval: "readonly", setTimeout: "readonly", clearTimeout: "readonly", performance: "readonly", console: "readonly", URL: "readonly", URLSearchParams: "readonly", Blob: "readonly", btoa: "readonly", atob: "readonly", crypto: "readonly", TextEncoder: "readonly", navigator: "readonly", CustomEvent: "readonly", Event: "readonly", HTMLElement: "readonly", Node: "readonly", Element: "readonly", MutationObserver: "readonly", ResizeObserver: "readonly", requestAnimationFrame: "readonly", cancelAnimationFrame: "readonly", getComputedStyle: "readonly", addEventListener: "readonly", removeEventListener: "readonly", dispatchEvent: "readonly", }, }, rules: { "max-lines": ["error", { max: 250, skipBlankLines: true, skipComments: true }], "max-lines-per-function": ["error", { max: 40, skipBlankLines: true, skipComments: true }], "max-params": ["error", 4], "max-depth": ["error", 4], "complexity": ["warn", { max: 10 }], "no-unused-vars": [ "error", { argsIgnorePattern: "^_", varsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" }, ], "eqeqeq": ["error", "always"], "no-implicit-coercion": "warn", "no-var": "error", "prefer-const": "warn", "no-else-return": "warn", "no-continue": "error", "no-labels": "error", "prefer-arrow-callback": "warn", "no-param-reassign": ["error", { props: false }], "no-throw-literal": "error", "require-await": "warn", "no-console": ["warn", { allow: ["warn", "error"] }], "no-debugger": "error", "no-alert": "error", "no-eval": "error", "no-implied-eval": "error", "no-new-func": "error", "no-constructor-return": "error", "no-duplicate-imports": "warn", "no-unreachable": "warn", "no-shadow": "warn", "jsdoc/require-returns": ["warn", { forceReturnsWithAsync: true }], "jsdoc/check-param-names": "warn", "jsdoc/require-param-description": "off", "jsdoc/require-returns-description": "off", }, }, { files: ["server/**/*.js"], ignores: ["server/node_modules/**"], languageOptions: { globals: { process: "readonly", __dirname: "readonly", __filename: "readonly", module: "readonly", require: "readonly", Buffer: "readonly", }, }, }, ];