import js from '@eslint/js' import globals from 'globals' import reactHooks from 'eslint-plugin-react-hooks' import reactRefresh from 'eslint-plugin-react-refresh' import tseslint from 'typescript-eslint' import { defineConfig, globalIgnores } from 'eslint/config' // ESLint configuration tuned for this codebase. // // We deliberately drop `tseslint.configs.stylistic` — the stylistic // preset enforces preferences like `interface` over `type`, `T[]` // over `Array`, and "no trivially inferred types" that don't // match the conventions used throughout `web/src`. Enforcing them // would generate hundreds of churn-only diffs. // // `no-explicit-any` is downgraded to a warning. There are places // (third-party event payloads, generic data-grid cells, etc.) where // `any` is the pragmatic choice and the TS compiler already catches // the genuine type errors. // // `no-unused-vars` keeps the strict-by-name pattern (`_foo` is fine) // so dead code still fails the build. export default defineConfig([ globalIgnores(['dist', 'node_modules', 'coverage']), { files: ['**/*.{ts,tsx}'], extends: [ js.configs.recommended, tseslint.configs.recommended, reactHooks.configs['recommended-latest'], reactRefresh.configs.vite, ], languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, rules: { // Downgraded to warning. The codebase has hundreds of legacy // unused imports; TypeScript's `noUnusedLocals` already flags // genuine dead code in the IDE, and we don't want CI to fail // on churn-only cleanup. '@typescript-eslint/no-unused-vars': [ 'warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_', ignoreRestSiblings: true, }, ], '@typescript-eslint/consistent-type-imports': 'warn', '@typescript-eslint/no-explicit-any': 'warn', '@typescript-eslint/no-empty-object-type': 'warn', '@typescript-eslint/no-unused-expressions': 'warn', // Some legacy providers in `hooks/` declare helper components // via IIFE which trips this rule. The rule catches real bugs // but we have pre-existing violations the CI shouldn't fail // on; keep as a warning until they're refactored. 'react-hooks/rules-of-hooks': 'warn', 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true }, ], }, }, ])