eslint.config.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // https://eslint.org/docs/latest/use/configure/configuration-files-new
  2. import eslint from "@eslint/js";
  3. import globals from "globals";
  4. // TypeScript支持
  5. import * as typescriptEslint from "typescript-eslint";
  6. // Vue支持
  7. import pluginVue from "eslint-plugin-vue";
  8. import vueParser from "vue-eslint-parser";
  9. // 代码风格与格式化
  10. import configPrettier from "eslint-config-prettier";
  11. import prettierPlugin from "eslint-plugin-prettier";
  12. // 解析自动导入配置
  13. import fs from "node:fs";
  14. let autoImportGlobals = {};
  15. try {
  16. autoImportGlobals =
  17. JSON.parse(fs.readFileSync("./.eslintrc-auto-import.json", "utf-8")).globals || {};
  18. } catch (error) {
  19. // 文件不存在或解析错误时使用空对象
  20. console.warn("Could not load auto-import globals", error);
  21. }
  22. // Element Plus组件
  23. const elementPlusComponents = {
  24. // Element Plus 组件添加为全局变量,避免 no-undef 报错
  25. ElInput: "readonly",
  26. ElSelect: "readonly",
  27. ElSwitch: "readonly",
  28. ElCascader: "readonly",
  29. ElInputNumber: "readonly",
  30. ElTimePicker: "readonly",
  31. ElTimeSelect: "readonly",
  32. ElDatePicker: "readonly",
  33. ElTreeSelect: "readonly",
  34. ElText: "readonly",
  35. ElRadioGroup: "readonly",
  36. ElCheckboxGroup: "readonly",
  37. ElOption: "readonly",
  38. ElRadio: "readonly",
  39. ElCheckbox: "readonly",
  40. ElInputTag: "readonly",
  41. ElForm: "readonly",
  42. ElFormItem: "readonly",
  43. ElTable: "readonly",
  44. ElTableColumn: "readonly",
  45. ElButton: "readonly",
  46. ElDialog: "readonly",
  47. ElPagination: "readonly",
  48. ElMessage: "readonly",
  49. ElMessageBox: "readonly",
  50. ElNotification: "readonly",
  51. ElTree: "readonly",
  52. };
  53. export default [
  54. // 忽略文件配置
  55. {
  56. ignores: [
  57. "**/node_modules/**",
  58. "**/dist/**",
  59. "**/*.min.*",
  60. "**/auto-imports.d.ts",
  61. "**/components.d.ts",
  62. "**/types/**/*.d.ts",
  63. ],
  64. },
  65. // 基础 JavaScript 配置
  66. eslint.configs.recommended,
  67. // Vue 推荐配置
  68. ...pluginVue.configs["flat/recommended"],
  69. // TypeScript 推荐配置
  70. ...typescriptEslint.configs.recommended,
  71. // 全局配置
  72. {
  73. // 指定要检查的文件
  74. files: ["**/*.{js,mjs,cjs,ts,mts,cts,vue}"],
  75. languageOptions: {
  76. ecmaVersion: "latest",
  77. sourceType: "module",
  78. globals: {
  79. ...globals.browser, // 浏览器环境全局变量
  80. ...globals.node, // Node.js 环境全局变量
  81. ...globals.es2022, // ES2022 全局对象
  82. ...autoImportGlobals, // 自动导入的 API 函数
  83. ...elementPlusComponents, // Element Plus 组件
  84. // 全局类型定义,解决 TypeScript 中定义但 ESLint 不识别的问题
  85. PageQuery: "readonly",
  86. PageResult: "readonly",
  87. OptionType: "readonly",
  88. ApiResponse: "readonly",
  89. ExcelResult: "readonly",
  90. CommonType: "readonly",
  91. updatorType: "readonly",
  92. creatorType: "readonly",
  93. TagView: "readonly",
  94. AppSettings: "readonly",
  95. __APP_INFO__: "readonly",
  96. },
  97. },
  98. plugins: {
  99. vue: pluginVue,
  100. "@typescript-eslint": typescriptEslint.plugin,
  101. },
  102. rules: {
  103. // 基础规则
  104. "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",
  105. "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off",
  106. // ES6+ 规则
  107. "prefer-const": "error",
  108. "no-var": "error",
  109. "object-shorthand": "error",
  110. // 最佳实践
  111. eqeqeq: "off",
  112. "no-multi-spaces": "error",
  113. "no-multiple-empty-lines": ["error", { max: 1, maxBOF: 0, maxEOF: 0 }],
  114. // 禁用与 TypeScript 冲突的规则
  115. "no-unused-vars": "off",
  116. "no-undef": "off",
  117. "no-redeclare": "off",
  118. "@typescript-eslint/ban-ts-comment": "off",
  119. },
  120. },
  121. // Vue 文件特定配置
  122. {
  123. files: ["**/*.vue"],
  124. languageOptions: {
  125. parser: vueParser,
  126. parserOptions: {
  127. ecmaVersion: "latest",
  128. sourceType: "module",
  129. parser: typescriptEslint.parser,
  130. extraFileExtensions: [".vue"],
  131. tsconfigRootDir: __dirname,
  132. },
  133. },
  134. rules: {
  135. // Vue 规则
  136. "vue/multi-word-component-names": "off",
  137. "vue/no-v-html": "off",
  138. "vue/require-default-prop": "off",
  139. "vue/require-explicit-emits": "error",
  140. "vue/no-unused-vars": "error",
  141. "vue/no-mutating-props": "off",
  142. "vue/valid-v-for": "warn",
  143. "vue/no-template-shadow": "warn",
  144. "vue/return-in-computed-property": "warn",
  145. "vue/block-order": [
  146. "error",
  147. {
  148. order: ["template", "script", "style"],
  149. },
  150. ],
  151. "vue/html-self-closing": [
  152. "error",
  153. {
  154. html: {
  155. void: "always",
  156. normal: "never",
  157. component: "always",
  158. },
  159. svg: "always",
  160. math: "always",
  161. },
  162. ],
  163. "vue/component-name-in-template-casing": ["error", "PascalCase"],
  164. "@typescript-eslint/no-explicit-any": "off",
  165. },
  166. },
  167. // TypeScript 文件特定配置
  168. {
  169. files: ["**/*.{ts,tsx,mts,cts}"],
  170. languageOptions: {
  171. parser: typescriptEslint.parser,
  172. parserOptions: {
  173. ecmaVersion: "latest",
  174. sourceType: "module",
  175. project: "./tsconfig.json",
  176. tsconfigRootDir: __dirname,
  177. },
  178. },
  179. rules: {
  180. // TypeScript 规则
  181. "@typescript-eslint/no-explicit-any": "off", // 允许使用any类型,方便开发
  182. "@typescript-eslint/no-empty-function": "off",
  183. "@typescript-eslint/no-empty-object-type": "off",
  184. "@typescript-eslint/ban-ts-comment": "off",
  185. "@typescript-eslint/no-non-null-assertion": "off",
  186. "@typescript-eslint/no-unused-vars": "warn", // 降级为警告
  187. "@typescript-eslint/no-unused-expressions": "warn", // 降级为警告
  188. "@typescript-eslint/consistent-type-imports": "off", // 关闭强制使用type import
  189. "@typescript-eslint/no-import-type-side-effects": "error",
  190. },
  191. },
  192. // .d.ts 文件配置
  193. {
  194. files: ["**/*.d.ts"],
  195. rules: {
  196. "@typescript-eslint/no-explicit-any": "off",
  197. "@typescript-eslint/no-unused-vars": "off",
  198. },
  199. },
  200. // CURD 组件配置
  201. {
  202. files: ["**/components/CURD/**/*.{ts,vue}"],
  203. rules: {
  204. "no-unused-vars": "off",
  205. "@typescript-eslint/no-unused-vars": "off",
  206. "@typescript-eslint/no-explicit-any": "off",
  207. },
  208. },
  209. // Prettier 集成(必须放在最后)
  210. {
  211. plugins: {
  212. prettier: prettierPlugin, // 将 Prettier 的输出作为 ESLint 的问题来报告
  213. },
  214. rules: {
  215. ...configPrettier.rules,
  216. "prettier/prettier": ["error", {}, { usePrettierrc: true }],
  217. "arrow-body-style": "off",
  218. "prefer-arrow-callback": "off",
  219. },
  220. },
  221. ];