import js from "@eslint/js"; import prettier from "eslint-config-prettier"; import importPlugin, { createNodeResolver, flatConfigs, } from "eslint-plugin-import-x"; import prettierPlugin from "eslint-plugin-prettier"; import vuePlugin from "eslint-plugin-vue"; import globals from "globals"; import ts from "typescript-eslint"; export default [ // 全局忽略 { ignores: [ "**/node_modules/*", "**/dist/*", "build/", "public/", "docs/", "bin/", "pnpm-lock.yaml", ".vscode/", ".idea/", ".husky/", "Dockerfile", ".hbuilderx/", ".vite/", "uni_modules/", "libs/", "static/", "patches/", "wxcomponents/", "lib/", "scripts/", "src-tauri/", "**/*.bak.*", ], }, // 应用推荐规则 js.configs.recommended, ...ts.configs.recommended, // Vue 推荐规则 ...vuePlugin.configs["flat/recommended"], // prettier 必须在所有规则之后,关闭与 prettier 冲突的格式规则 prettier, // 基础配置 { files: ["**/*.{js,mjs,cjs,ts,vue}"], plugins: { prettier: prettierPlugin, "import-x": importPlugin }, settings: { "import-x/resolver-next": [ createNodeResolver(), ( await import("eslint-import-resolver-typescript") ).createTypeScriptImportResolver({ project: ["tsconfig.json"], }), ], }, languageOptions: { globals: { ...globals.node, ...globals.browser, }, ecmaVersion: "latest", sourceType: "module", parserOptions: { ecmaFeatures: { impliedStrict: true, }, }, }, rules: { ...flatConfigs.recommended.rules, // Prettier 规则 "prettier/prettier": "warn", "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", // Import 规则 "import-x/no-self-import": "error", "import-x/no-cycle": "error", "import-x/no-useless-path-segments": "error", "import-x/no-extraneous-dependencies": "error", "import-x/no-mutable-exports": "error", "import-x/no-named-as-default": "error", "import-x/no-named-as-default-member": "error", "import-x/no-duplicates": "warn", "import-x/no-deprecated": "warn", "import-x/newline-after-import": "warn", "import-x/first": "warn", "import-x/order": [ "warn", { groups: [ "builtin", "external", "internal", "parent", "sibling", "index", "object", "type", ], alphabetize: { order: "asc", }, }, ], // TypeScript 宽松规则(对已有代码降级) "@typescript-eslint/no-explicit-any": "warn", "@typescript-eslint/no-empty-object-type": "warn", "@typescript-eslint/no-unused-vars": [ "warn", { varsIgnorePattern: "^_", argsIgnorePattern: "^_" }, ], }, }, // Vue 文件专属配置:在 script 块中使用 TypeScript 解析器 { files: ["**/*.vue"], languageOptions: { parserOptions: { parser: ts.parser, extraFileExtensions: [".vue"], sourceType: "module", }, }, }, // 测试文件覆盖配置 { files: ["**/__tests__/*.{j,t}s?(x)", "**/tests/unit/**/*.spec.{j,t}s?(x)"], languageOptions: { globals: { ...globals.mocha, ...globals.jest, }, }, }, ];