import eslint from "@eslint/js"; import globals from "globals"; import * as typescriptEslint from "typescript-eslint"; import pluginVue from "eslint-plugin-vue"; import vueParser from "vue-eslint-parser"; import configPrettier from "eslint-config-prettier"; export default [ { ignores: [ "**/node_modules/**", "**/dist/**", "**/*.min.*", "**/auto-imports.d.ts", "**/components.d.ts", "types/**/*.d.ts", ], }, eslint.configs.recommended, ...pluginVue.configs["flat/recommended"], ...typescriptEslint.configs.recommended, { files: ["**/*.{js,mjs,cjs,ts,mts,cts,vue}"], languageOptions: { ecmaVersion: "latest", sourceType: "module", globals: { ...globals.es2022, }, }, plugins: { vue: pluginVue, "@typescript-eslint": typescriptEslint.plugin, }, rules: { // 基础规则 "no-console": ["error", { allow: ["warn", "error", "debug"] }], "no-debugger": "error", // ES6+ 规则 "prefer-const": "error", "no-var": "error", "object-shorthand": "error", // 最佳实践 eqeqeq: ["error", "always", { null: "ignore" }], "no-multi-spaces": "error", "no-multiple-empty-lines": ["error", { max: 1, maxBOF: 0, maxEOF: 0 }], // 禁用与 TypeScript 冲突的规则 "no-unused-vars": "off", "no-undef": "off", "no-redeclare": "off", }, }, { files: ["src/**/*.{js,ts,vue}"], languageOptions: { globals: { ...globals.browser, __APP_INFO__: "readonly" } }, }, { files: ["*.{js,mjs,cjs,ts}", "mock/**/*.ts"], languageOptions: { globals: globals.node }, rules: { "no-console": "off" }, }, { files: ["**/*.{js,mjs,cjs}"], rules: { "no-undef": "error" }, }, { files: ["**/*.vue"], languageOptions: { parser: vueParser, parserOptions: { ecmaVersion: "latest", sourceType: "module", parser: typescriptEslint.parser, extraFileExtensions: [".vue"], tsconfigRootDir: import.meta.dirname, }, }, rules: { "vue/multi-word-component-names": "off", "vue/no-v-html": "off", "vue/require-default-prop": "off", "vue/require-explicit-emits": "error", "vue/no-unused-vars": "error", "vue/no-mutating-props": "warn", "vue/valid-v-for": "warn", "vue/no-template-shadow": "warn", // 组件由 unplugin-vue-components 自动注册,ESLint 侧拿不到已注册组件清单 "vue/no-undef-components": "off", "vue/return-in-computed-property": "error", "vue/block-order": [ "error", { order: ["template", "script", "style"], }, ], "vue/html-self-closing": [ "error", { html: { void: "always", normal: "never", component: "always", }, svg: "always", math: "always", }, ], "vue/component-name-in-template-casing": ["error", "PascalCase"], }, }, { files: ["**/*.{ts,tsx,mts,cts}"], languageOptions: { parser: typescriptEslint.parser, parserOptions: { ecmaVersion: "latest", sourceType: "module", project: "./tsconfig.eslint.json", tsconfigRootDir: import.meta.dirname, }, }, rules: { "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-empty-object-type": "off", "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-unused-expressions": "warn", }, }, { // Vue 与 TS 共用的脚本规则:同一段代码放在 .ts 或