@@ -4,22 +4,67 @@ require('@rushstack/eslint-patch/modern-module-resolution')
44module . exports = {
55 root : true ,
66 extends : [
7- 'plugin:vue/vue3-strongly- recommended' ,
7+ 'plugin:vue/vue3-recommended' ,
88 'eslint:recommended' ,
9+ 'plugin:@typescript-eslint/recommended' ,
10+ 'plugin:@typescript-eslint/recommended-requiring-type-checking' ,
911 '@vue/eslint-config-typescript/recommended' ,
1012 '@vue/eslint-config-prettier/skip-formatting'
1113 ] ,
14+ parser : 'vue-eslint-parser' ,
1215 parserOptions : {
13- ecmaVersion : 'latest'
16+ parser : '@typescript-eslint/parser' ,
17+ ecmaVersion : 'latest' ,
18+ sourceType : 'module' ,
19+ project : [ './tsconfig.json' , './tsconfig.node.json' ] ,
20+ tsconfigRootDir : __dirname ,
21+ extraFileExtensions : [ '.vue' ]
1422 } ,
23+ ignorePatterns : [ '.eslintrc.cjs' , 'dist' , 'node_modules' ] ,
1524 rules : {
16- 'no-console' : 'off' ,
17- 'no-debugger' : 'error' ,
25+ // Line length
26+ 'max-len' : [ 'error' , {
27+ code : 120 ,
28+ ignoreComments : true ,
29+ ignoreStrings : true ,
30+ ignoreTemplateLiterals : true ,
31+ ignoreRegExpLiterals : true
32+ } ] ,
33+
34+ // General rules
35+ 'no-console' : process . env . NODE_ENV === 'production' ? 'warn' : 'off' ,
36+ 'no-debugger' : process . env . NODE_ENV === 'production' ? 'error' : 'warn' ,
1837 'no-var' : 'error' ,
1938 'prefer-const' : 'error' ,
2039 'prefer-arrow-callback' : 'error' ,
21- '@typescript-eslint/no-unused-vars' : 'error' ,
40+ 'eqeqeq' : [ 'error' , 'always' ] ,
41+ 'curly' : [ 'error' , 'all' ] ,
42+
43+ // TypeScript rules
44+ '@typescript-eslint/no-unused-vars' : [ 'error' , {
45+ argsIgnorePattern : '^_' ,
46+ varsIgnorePattern : '^_'
47+ } ] ,
2248 '@typescript-eslint/no-explicit-any' : 'warn' ,
49+ '@typescript-eslint/explicit-function-return-type' : 'off' ,
50+ '@typescript-eslint/explicit-module-boundary-types' : 'off' ,
51+ '@typescript-eslint/no-non-null-assertion' : 'warn' ,
52+ '@typescript-eslint/no-floating-promises' : 'error' ,
53+ '@typescript-eslint/no-misused-promises' : 'error' ,
54+ '@typescript-eslint/await-thenable' : 'error' ,
55+ '@typescript-eslint/no-unnecessary-type-assertion' : 'error' ,
56+ '@typescript-eslint/prefer-as-const' : 'error' ,
57+ '@typescript-eslint/consistent-type-imports' : [ 'error' , {
58+ prefer : 'type-imports'
59+ } ] ,
60+ // Relax rules for external library types
61+ '@typescript-eslint/no-unsafe-assignment' : 'off' ,
62+ '@typescript-eslint/no-unsafe-member-access' : 'off' ,
63+ '@typescript-eslint/no-unsafe-call' : 'off' ,
64+ '@typescript-eslint/no-unsafe-argument' : 'off' ,
65+ '@typescript-eslint/restrict-template-expressions' : 'off' ,
66+
67+ // Vue rules
2368 'vue/multi-word-component-names' : 'off' ,
2469 'vue/no-unused-components' : 'error' ,
2570 'vue/no-unused-vars' : 'error' ,
@@ -28,7 +73,20 @@ module.exports = {
2873 } ] ,
2974 'vue/block-tag-newline' : 'error' ,
3075 'vue/component-name-in-template-casing' : [ 'error' , 'PascalCase' ] ,
31- 'vue/define-props-declaration' : 'error' ,
32- 'vue/no-empty-component-block' : 'error'
76+ 'vue/define-props-declaration' : [ 'error' , 'type-based' ] ,
77+ 'vue/define-emits-declaration' : [ 'error' , 'type-based' ] ,
78+ 'vue/no-empty-component-block' : 'error' ,
79+ 'vue/padding-line-between-blocks' : 'error' ,
80+ 'vue/prefer-separate-static-class' : 'error' ,
81+ 'vue/prefer-true-attribute-shorthand' : 'error' ,
82+ 'vue/v-on-function-call' : [ 'error' , 'never' ] ,
83+ 'vue/no-useless-v-bind' : 'error' ,
84+ 'vue/no-useless-mustaches' : 'error' ,
85+ 'vue/no-constant-condition' : 'warn' ,
86+ 'vue/require-macro-variable-name' : 'error' ,
87+ 'vue/valid-define-options' : 'error' ,
88+ 'vue/block-lang' : [ 'error' , {
89+ 'script' : { 'lang' : 'ts' }
90+ } ]
3391 }
3492}
0 commit comments