// admin-portal ESLint flat config // 包含 React + jsx-a11y + TypeScript 规则 // 注意:@next/eslint-plugin-next 14.x 与 ESLint 9 不兼容,暂不使用 const js = require('@eslint/js'); const tseslint = require('typescript-eslint'); const prettierConfig = require('eslint-config-prettier'); const jsx11y = require('eslint-plugin-jsx-a11y'); module.exports = tseslint.config( // 全局忽略 { ignores: [ '.next/**', 'coverage/**', 'node_modules/**', 'public/mockServiceWorker.js', 'eslint.config.js', 'next.config.js', 'vitest.config.ts', 'postcss.config.js', 'tailwind.config.js', ], }, // 基础 JS 规则 js.configs.recommended, // TypeScript 规则 ...tseslint.configs.recommended, // jsx-a11y 规则(A11y WCAG 2.2 AA) { plugins: { 'jsx-a11y': jsx11y, }, rules: { ...jsx11y.flatConfigs.recommended.rules, 'jsx-a11y/no-autofocus': 'warn', 'jsx-a11y/aria-role': 'error', 'jsx-a11y/aria-props': 'error', 'jsx-a11y/aria-proptypes': 'error', 'jsx-a11y/aria-unsupported-elements': 'error', 'jsx-a11y/role-has-required-aria-props': 'error', 'jsx-a11y/role-supports-aria-props': 'error', 'jsx-a11y/tabindex-no-positive': 'error', 'jsx-a11y/no-noninteractive-tabindex': 'warn', }, }, // React/JSX 文件配置 { files: ['**/*.tsx', '**/*.ts'], languageOptions: { ecmaVersion: 2024, sourceType: 'module', parserOptions: { ecmaFeatures: { jsx: true }, }, }, rules: { // 禁止 any(未知类型用 unknown) '@typescript-eslint/no-explicit-any': 'warn', // 未使用变量允许下划线前缀 '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', }, ], // 允许 console(开发环境) 'no-console': 'off', // 允许未定义的 require(Next.js 配置) '@typescript-eslint/no-require-imports': 'off', }, }, // 测试文件放宽规则 { files: ['**/*.test.ts', '**/*.test.tsx', '**/*.spec.ts'], rules: { '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-non-null-assertion': 'off', 'jsx-a11y/no-autofocus': 'off', }, }, // 禁用与 Prettier 冲突的规则 prettierConfig, );