166 lines
7.8 KiB
JavaScript
166 lines
7.8 KiB
JavaScript
import { defineConfig } from "eslint/config";
|
||
import eslint from "@eslint/js";
|
||
import globals from "globals";
|
||
import pluginVue from "eslint-plugin-vue";
|
||
import configPrettier from "eslint-config-prettier";
|
||
import pluginPrettier from "eslint-plugin-prettier";
|
||
import pluginTypeScript from "@typescript-eslint/eslint-plugin";
|
||
import * as parserVue from "vue-eslint-parser";
|
||
import * as parserTypeScript from "@typescript-eslint/parser";
|
||
import projectGlobals from "./.eslintrc-globals.js";
|
||
|
||
export default defineConfig([
|
||
eslint.configs.recommended,
|
||
{ ignores: ["**/.*", "**/dist/*", "*.d.ts", "public", "**/assets/*"] }, // 忽略文件配置单独放在一个对象,否则不生效
|
||
{
|
||
languageOptions: {
|
||
globals: {
|
||
...globals.browser,
|
||
...globals.es6,
|
||
...globals.node,
|
||
...projectGlobals,
|
||
},
|
||
},
|
||
plugins: {
|
||
prettier: pluginPrettier,
|
||
},
|
||
// 不指定 files,则默认是所有文件生效
|
||
rules: {
|
||
...configPrettier.rules,
|
||
...pluginPrettier.configs.recommended.rules,
|
||
"no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", // 禁用 debugger
|
||
"no-unused-vars": [process.env.NODE_ENV === "production" ? "warn" : "warn", { vars: "all", args: "none" }], // 禁止出现未使用的变量,函数和函数的参数
|
||
"no-undef": process.env.NODE_ENV === "production" ? "warn" : "warn", // 禁用未声明的变量,除非它们在 /*global */ 注释中被提到
|
||
"no-console": "off", // 禁用 console
|
||
"accessor-pairs": "error", // 强制 getter 和 setter 在对象中成对出现
|
||
eqeqeq: ["error", "always", { null: "ignore" }], // 要求使用 === 和 !==
|
||
"no-class-assign": "error", // 禁止修改类声明的变量
|
||
"no-cond-assign": "error", // 禁止条件表达式中出现赋值操作符
|
||
"no-const-assign": "error", // 禁止修改 const 声明的变量
|
||
"no-dupe-keys": "error", // 禁止对象字面量中出现重复的 key
|
||
"no-empty-pattern": "error", // 禁止使用空解构模式
|
||
"no-extra-boolean-cast": "error", // 禁止不必要的布尔转换
|
||
"no-func-assign": "error", // 禁止对 function 声明重新赋值
|
||
"no-irregular-whitespace": "error", // 禁止不规则的空白
|
||
"no-label-var": "error", // 不允许标签与变量同名
|
||
"no-labels": ["error", { allowLoop: false, allowSwitch: false }], // 禁用标签语句
|
||
"no-lone-blocks": "error", // 禁用不必要的嵌套块
|
||
"no-multi-str": "error", // 禁止多行字符串
|
||
"no-global-assign": "error", // 不允许修改只读全局变量
|
||
"no-new-native-nonconstructor": "error", // 禁止 new Symbol、new Array、new Map 等
|
||
"no-new-wrappers": "error", // 禁止对 String,Number 和 Boolean 使用 new 操作符
|
||
"no-obj-calls": "error", // 禁止把全局对象作为函数调用
|
||
"no-redeclare": "error", // 禁止多次声明同一变量
|
||
"no-return-assign": ["error", "except-parens"], // 禁止在 return 语句中使用赋值语句
|
||
"no-self-assign": "error", // 禁止自我赋值
|
||
"no-self-compare": "error", // 禁止自身比较
|
||
"no-sequences": "error", // 禁用逗号操作符
|
||
"func-call-spacing": "error", // 要求或禁止在函数标识符和其调用之间有空格
|
||
"no-undef-init": "error", // 禁止将变量初始化为 undefined
|
||
"no-unmodified-loop-condition": "error", // 该规则查找循环条件内的引用,然后检查这些引用的变量是否在循环中被修改
|
||
"no-unneeded-ternary": ["error", { defaultAssignment: false }], // 当存在更简单的选择时,此规则不允许三元运算符
|
||
"no-unreachable": "error", // 禁止在 return、throw、continue 和 break 语句后出现不可达代码
|
||
"no-unreachable-loop": "error", // 禁止循环体允许一次迭代的循环
|
||
"prefer-const": "error", // 要求使用 const 声明那些声明后不再被修改的变量
|
||
"no-useless-escape": "off", // 取消不必要的转义字符
|
||
},
|
||
},
|
||
{
|
||
files: ["**/*.vue"],
|
||
languageOptions: {
|
||
parser: parserVue,
|
||
parserOptions: {
|
||
parser: "@typescript-eslint/parser",
|
||
ecmaVersion: "latest",
|
||
ecmaFeatures: {
|
||
jsx: true,
|
||
},
|
||
extraFileExtensions: [".vue"],
|
||
sourceType: "module",
|
||
},
|
||
},
|
||
plugins: {
|
||
vue: pluginVue,
|
||
},
|
||
processor: pluginVue.processors[".vue"],
|
||
rules: {
|
||
...pluginVue.configs.base.rules,
|
||
...pluginVue.configs["essential"].rules,
|
||
...pluginVue.configs["recommended"].rules,
|
||
|
||
// vue (https://eslint.vuejs.org/rules)
|
||
"vue/v-slot-style": "error", // 强制执行 v-slot 指令样式
|
||
"vue/no-mutating-props": "off", // 不允许组件 prop 的改变
|
||
"vue/custom-event-name-casing": "off", // 为自定义事件名称强制使用特定大小写
|
||
"vue/attributes-order": "off", // vue api 使用顺序,强制执行属性顺序
|
||
"vue/one-component-per-file": "off", // 强制每个组件都应该在自己的文件中
|
||
"vue/html-closing-bracket-newline": "off", // 在标签的右括号之前要求或禁止换行
|
||
"vue/max-attributes-per-line": "off", // 强制每行的最大属性数
|
||
"vue/attribute-hyphenation": "off", // 对模板中的自定义组件强制执行属性命名样式
|
||
"vue/require-default-prop": "off", // 此规则要求为每个 prop 为必填时,必须提供默认值
|
||
"vue/multi-word-component-names": "off", // 要求组件名称始终为 “-” 链接的单词
|
||
"vue/valid-template-root": "off",
|
||
"vue/singleline-html-element-content-newline": "off", // 在单行元素的内容之前和之后需要换行符
|
||
"vue/multiline-html-element-content-newline": "off", // 在多行元素的内容之前和之后需要换行符
|
||
"vue/no-v-html": "off", // 禁止使用 v-html 来防止 XSS 攻击
|
||
},
|
||
},
|
||
{
|
||
files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
|
||
languageOptions: {
|
||
// 使用了 @typescript-eslint/parser 解析器,下面 parserOptions 是该解析器的配置信息,官网参考:https://typescript.eslint.org.cn/packages/parser/#jsxpragma
|
||
parser: parserTypeScript,
|
||
parserOptions: {
|
||
ecmaVersion: "latest",
|
||
sourceType: "module",
|
||
warnOnUnsupportedTypeScriptVersion: false,
|
||
},
|
||
},
|
||
plugins: {
|
||
"@typescript-eslint": pluginTypeScript,
|
||
},
|
||
rules: {
|
||
...pluginTypeScript.configs.strict.rules,
|
||
"@typescript-eslint/ban-types": "off",
|
||
"@typescript-eslint/no-redeclare": "error",
|
||
"@typescript-eslint/ban-ts-comment": "off",
|
||
"@typescript-eslint/no-explicit-any": "off",
|
||
"@typescript-eslint/prefer-as-const": "warn",
|
||
"@typescript-eslint/no-empty-function": "off",
|
||
"@typescript-eslint/no-non-null-assertion": "off",
|
||
"@typescript-eslint/no-unused-expressions": "off",
|
||
"@typescript-eslint/no-unsafe-function-type": "off",
|
||
"@typescript-eslint/no-import-type-side-effects": "error",
|
||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
||
"@typescript-eslint/no-wrapper-object-types": "off",
|
||
"@typescript-eslint/no-namespace": "off",
|
||
"@typescript-eslint/consistent-type-imports": [
|
||
"off",
|
||
{ disallowTypeAnnotations: false, fixStyle: "inline-type-imports" },
|
||
],
|
||
"@typescript-eslint/prefer-literal-enum-member": ["error", { allowBitwiseExpressions: true }],
|
||
"@typescript-eslint/no-unused-vars": [
|
||
"error",
|
||
{
|
||
argsIgnorePattern: "^_",
|
||
varsIgnorePattern: "^_",
|
||
},
|
||
],
|
||
"@typescript-eslint/no-dynamic-delete": "off",
|
||
},
|
||
},
|
||
{
|
||
files: ["**/*.d.ts"],
|
||
rules: {
|
||
"import/no-duplicates": "off",
|
||
},
|
||
},
|
||
{
|
||
files: ["**/*.?([cm])js"],
|
||
rules: {
|
||
"@typescript-eslint/no-require-imports": "off",
|
||
"@typescript-eslint/no-var-requires": "off",
|
||
},
|
||
},
|
||
]);
|