import js from "@eslint/js"; import importPlugin from "eslint-plugin-import"; import perfectionist from "eslint-plugin-perfectionist"; import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; import reactHooks from "eslint-plugin-react-hooks"; import reactRefresh from "eslint-plugin-react-refresh"; import tseslint from "typescript-eslint"; export default tseslint.config( { ignores: [ "node_modules/**", "dist/**", ".build/**", "*.bun-build", "openspec/**", ".opencode/**", ".claude/**", ".codex/**", ".agents/**", "bun.lock", "data/**", ], }, js.configs.recommended, ...tseslint.configs.recommendedTypeChecked, ...tseslint.configs.stylisticTypeChecked, importPlugin.flatConfigs.recommended, importPlugin.flatConfigs.typescript, perfectionist.configs["recommended-natural"], { languageOptions: { parserOptions: { projectService: true, tsconfigRootDir: import.meta.dirname, }, }, settings: { "import/resolver": { node: true, typescript: true }, }, }, { rules: { "@typescript-eslint/array-type": ["error", { default: "array-simple" }], "@typescript-eslint/consistent-type-assertions": ["error", { assertionStyle: "as" }], "@typescript-eslint/consistent-type-imports": ["error", { prefer: "type-imports" }], "@typescript-eslint/only-throw-error": "error", "@typescript-eslint/prefer-nullish-coalescing": "error", "@typescript-eslint/prefer-optional-chain": "error", "import/no-unresolved": ["error", { ignore: ["^bun:"] }], "no-undef": "off", }, }, { files: ["eslint.config.js"], rules: { "import/no-named-as-default": "off", "import/no-named-as-default-member": "off", }, }, { files: ["src/web/**/*.{ts,tsx}"], plugins: { "react-hooks": reactHooks, "react-refresh": reactRefresh, }, rules: { ...reactHooks.configs.recommended.rules, "no-restricted-imports": [ "error", { patterns: [ { group: [ "../server/*", "../server/**", "../**/server/*", "../**/server/**", "../../server/*", "../../server/**", "src/server/*", "src/server/**", ], message: "前端不得导入 src/server 后端运行时实现;请改用 src/shared 类型或 HTTP API。", }, ], }, ], "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], }, }, eslintPluginPrettierRecommended, );