import js from '@eslint/js'; import typescriptEslint from '@typescript-eslint/eslint-plugin'; import typescriptParser from '@typescript-eslint/parser'; import globals from 'globals'; /** * ESLint 配置 for @d8d/e2e-test-utils * * 此配置捕获常见代码问题,包括: * - 冗余的 null 检查 * - 未使用的变量 * - 空 catch 块 * - 首选 const 而非 let * * 参见: _bmad-output/implementation-artifacts/epic-1-retrospective.md */ // Vitest 全局变量 const vitestGlobals = { describe: 'readonly', it: 'readonly', test: 'readonly', expect: 'readonly', beforeEach: 'readonly', afterEach: 'readonly', beforeAll: 'readonly', afterAll: 'readonly', vi: 'readonly', }; /** @type {import('eslint').Linter.Config[]} */ const config = [ // 全局忽略 { ignores: [ 'dist/**', 'node_modules/**', '*.config.js', '*.config.ts', 'coverage/**', ], }, // 基础配置 { files: ['src/**/*.ts'], ignores: [ 'dist/**', 'node_modules/**', '*.config.js', '*.config.ts', 'coverage/**', ], languageOptions: { ecmaVersion: 'latest', sourceType: 'module', parser: typescriptParser, parserOptions: { project: './tsconfig.json', }, globals: { ...globals.node, ...globals.es2021, }, }, plugins: { '@typescript-eslint': typescriptEslint, }, rules: { // 基础 ESLint 规则 ...js.configs.recommended.rules, // TypeScript 规则 '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_', }], '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/explicit-function-return-type': 'off', '@typescript-eslint/no-non-null-assertion': 'warn', // 捕获冗余的 null 检查 (来自 Epic 1 回顾) 'no-constant-binary-expression': 'error', // 捕获空 catch 块 (来自 Epic 1 回顾) 'no-empty': ['error', { allowEmptyCatch: false }], // 首选 const (来自 Epic 1 回顾) 'prefer-const': 'error', // 其他有用的规则 'no-console': 'off', // 测试工具可能需要 console.debug 'no-undef': 'off', // TypeScript 已经处理了未定义变量 'no-unused-vars': 'off', // 使用 TypeScript 的版本 }, }, // 测试环境配置 (Vitest) - 不使用 tsconfig project { files: ['tests/**/*.test.ts', 'tests/**/*.spec.ts'], ignores: ['coverage/**'], languageOptions: { ecmaVersion: 'latest', sourceType: 'module', parser: typescriptParser, globals: { ...globals.node, ...vitestGlobals, }, }, rules: { '@typescript-eslint/no-explicit-any': 'off', 'no-console': 'off', }, }, ]; export default config;