@alexlit/lint-kit 124.0.0 → 124.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/lint-kit",
3
- "version": "124.0.0",
3
+ "version": "124.2.0",
4
4
  "private": false,
5
5
  "description": "Preset of configuration files and dependencies for linting web applications (designed for Vue.js with TypeScript)",
6
6
  "keywords": [
@@ -31,3 +31,7 @@ npm i @alexlit/config-eslint -D
31
31
 
32
32
  export default [...typescript, ...unicorn, ...vitest];
33
33
  ```
34
+
35
+ ## Usefull links
36
+
37
+ - [Awesome ESLint](https://github.com/dustinspecker/awesome-eslint)
@@ -4,8 +4,10 @@ import globals from 'globals';
4
4
  import { javascript } from './plugins/javascript.js';
5
5
  import { jsdoc } from './plugins/jsdoc.js';
6
6
  import { perfectionist } from './plugins/perfectionist.js';
7
+ import { prettier, prettierConfig } from './plugins/prettier.js';
7
8
  import { regexp } from './plugins/regexp.js';
8
9
  import { sonar } from './plugins/sonar.js';
10
+ import { stylistic } from './plugins/stylistic.js';
9
11
  import { tanstackQuery } from './plugins/tanstack-query.js';
10
12
  import { typescript } from './plugins/typescript.js';
11
13
  import { unicorn } from './plugins/unicorn.js';
@@ -15,7 +17,24 @@ import { vueI18n } from './plugins/vue-i18n.js';
15
17
  import { vue } from './plugins/vue.js';
16
18
 
17
19
  export const config = [
18
- { files: ['**/*.{js,mjs,cjs,typescript,vue}'] },
20
+ {
21
+ files: ['**/*.{js,mjs,cjs,typescript,vue}'],
22
+ },
23
+
24
+ {
25
+ ignores: [
26
+ '**/.temp',
27
+ '**/mockServiceWorker.js',
28
+ '.histoire',
29
+ '.nuxt',
30
+ 'build',
31
+ 'dist',
32
+ 'docs',
33
+ 'storybook-*',
34
+ 'sw.js',
35
+ ],
36
+ },
37
+
19
38
  { languageOptions: { globals: globals.browser } },
20
39
 
21
40
  ...javascript,
@@ -23,6 +42,7 @@ export const config = [
23
42
  ...perfectionist,
24
43
  ...regexp,
25
44
  ...sonar,
45
+ ...stylistic,
26
46
  ...tanstackQuery,
27
47
  ...typescript,
28
48
  ...unicorn,
@@ -30,14 +50,19 @@ export const config = [
30
50
  ...vue,
31
51
  ...vueAccessibility,
32
52
  ...vueI18n,
53
+
54
+ ...prettierConfig, // must be last
33
55
  ];
34
56
 
35
57
  export {
36
58
  javascript,
37
59
  jsdoc,
38
60
  perfectionist,
61
+ prettier,
62
+ prettierConfig,
39
63
  regexp,
40
64
  sonar,
65
+ stylistic,
41
66
  tanstackQuery,
42
67
  typescript,
43
68
  unicorn,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/config-eslint",
3
- "version": "91.0.0",
3
+ "version": "92.1.0",
4
4
  "private": false,
5
5
  "description": "Eslint config",
6
6
  "keywords": [
@@ -24,10 +24,12 @@
24
24
  "type": "module",
25
25
  "main": "index.js",
26
26
  "files": [
27
+ "plugins",
27
28
  "README.md",
28
29
  "index.js"
29
30
  ],
30
31
  "scripts": {
32
+ "inspect": "npx @eslint/config-inspector@latest",
31
33
  "release": "../../scripts/release.sh",
32
34
  "semver": "../../scripts/semver.sh",
33
35
  "up": "../../scripts/up.sh"
@@ -35,19 +37,22 @@
35
37
  "dependencies": {
36
38
  "@eslint/js": "^9.8.0",
37
39
  "@intlify/eslint-plugin-vue-i18n": "^3.0.0",
40
+ "@stylistic/eslint-plugin": "^2.6.1",
38
41
  "@tanstack/eslint-plugin-query": "^5.51.15",
39
42
  "eslint": "^9.8.0",
40
- "eslint-plugin-jsdoc": "^48.10.1",
41
- "eslint-plugin-perfectionist": "^3.0.0",
43
+ "eslint-config-prettier": "^9.1.0",
44
+ "eslint-plugin-jsdoc": "^48.11.0",
45
+ "eslint-plugin-perfectionist": "^3.1.1",
46
+ "eslint-plugin-prettier": "^5.2.1",
42
47
  "eslint-plugin-regexp": "^2.6.0",
43
48
  "eslint-plugin-sonarjs": "^1.0.4",
44
49
  "eslint-plugin-unicorn": "^55.0.0",
45
50
  "eslint-plugin-vitest": "^0.5.4",
46
51
  "eslint-plugin-vue": "^9.27.0",
47
52
  "eslint-plugin-vuejs-accessibility": "^2.4.1",
48
- "globals": "^15.8.0",
53
+ "globals": "^15.9.0",
49
54
  "typescript": "^5.5.4",
50
- "typescript-eslint": "^7.18.0"
55
+ "typescript-eslint": "^8.0.0"
51
56
  },
52
57
  "engines": {
53
58
  "node": ">=18.18"
@@ -1,4 +1,3 @@
1
- /* eslint-disable sonarjs/no-duplicate-string */
2
1
  import plugin from '@eslint/js';
3
2
 
4
3
  /** @see [eslint](https://eslint.org) */
@@ -7,40 +6,11 @@ export const javascript = [
7
6
 
8
7
  {
9
8
  rules: {
10
- 'class-methods-use-this': 'off',
11
9
  curly: 'error',
12
10
  'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
13
11
  'grouped-accessor-pairs': ['error', 'getBeforeSet'],
14
-
15
- 'lines-around-comment': [
16
- 'warn',
17
- {
18
- afterBlockComment: false,
19
- afterLineComment: false,
20
-
21
- allowArrayEnd: true,
22
- allowArrayStart: true,
23
-
24
- allowBlockEnd: true,
25
- allowBlockStart: true,
26
-
27
- allowClassEnd: true,
28
- allowClassStart: true,
29
-
30
- allowObjectEnd: true,
31
- allowObjectStart: true,
32
-
33
- beforeBlockComment: true,
34
- beforeLineComment: false,
35
- },
36
- ],
37
-
38
- 'no-console': 'warn',
39
-
40
12
  'no-implicit-coercion': 'error',
41
-
42
13
  'no-param-reassign': ['error', { props: false }],
43
-
44
14
  'no-restricted-exports': [
45
15
  'error',
46
16
  {
@@ -49,7 +19,6 @@ export const javascript = [
49
19
  ],
50
20
  },
51
21
  ],
52
-
53
22
  'no-restricted-imports': [
54
23
  'error',
55
24
  {
@@ -65,79 +34,7 @@ export const javascript = [
65
34
  ],
66
35
  },
67
36
  ],
68
-
69
- 'no-return-await': 'off',
70
- 'no-shadow': 'off',
71
- 'no-underscore-dangle': 'off',
72
- 'no-unused-vars': 'off',
73
- 'no-use-before-define': 'off',
74
- 'nonblock-statement-body-position': ['error', 'below'],
75
- 'padding-line-between-statements': [
76
- 'warn',
77
- // always
78
- { blankLine: 'always', next: '*', prev: 'block-like' },
79
- { blankLine: 'always', next: '*', prev: 'case' },
80
- { blankLine: 'always', next: '*', prev: 'cjs-export' },
81
- { blankLine: 'always', next: '*', prev: 'cjs-import' },
82
- { blankLine: 'always', next: '*', prev: 'class' },
83
- { blankLine: 'always', next: '*', prev: 'default' },
84
- { blankLine: 'always', next: '*', prev: 'directive' },
85
- { blankLine: 'always', next: '*', prev: 'expression' },
86
- { blankLine: 'always', next: '*', prev: 'iife' },
87
- { blankLine: 'always', next: '*', prev: 'multiline-block-like' },
88
- { blankLine: 'always', next: '*', prev: 'multiline-const' },
89
- { blankLine: 'always', next: '*', prev: 'multiline-expression' },
90
- { blankLine: 'always', next: '*', prev: 'multiline-let' },
91
- { blankLine: 'always', next: '*', prev: 'multiline-var' },
92
- { blankLine: 'always', next: '*', prev: 'singleline-const' },
93
- { blankLine: 'always', next: '*', prev: 'singleline-let' },
94
- { blankLine: 'always', next: '*', prev: 'singleline-var' },
95
- { blankLine: 'always', next: 'block-like', prev: '*' },
96
- { blankLine: 'always', next: 'cjs-export', prev: '*' },
97
- { blankLine: 'always', next: 'cjs-import', prev: '*' },
98
- { blankLine: 'always', next: 'class', prev: '*' },
99
- { blankLine: 'always', next: 'expression', prev: '*' },
100
- { blankLine: 'always', next: 'function', prev: '*' },
101
- { blankLine: 'always', next: 'iife', prev: '*' },
102
- { blankLine: 'always', next: 'multiline-block-like', prev: '*' },
103
- { blankLine: 'always', next: 'multiline-const', prev: '*' },
104
- { blankLine: 'always', next: 'multiline-expression', prev: '*' },
105
- { blankLine: 'always', next: 'multiline-let', prev: '*' },
106
- { blankLine: 'always', next: 'multiline-var', prev: '*' },
107
- { blankLine: 'always', next: 'return', prev: '*' },
108
- { blankLine: 'always', next: 'switch', prev: '*' },
109
- // any
110
- { blankLine: 'any', next: 'expression', prev: 'expression' },
111
- {
112
- blankLine: 'any',
113
- next: 'singleline-const',
114
- prev: 'singleline-const',
115
- },
116
- { blankLine: 'any', next: 'singleline-let', prev: 'singleline-let' },
117
- { blankLine: 'any', next: 'singleline-var', prev: 'singleline-var' },
118
- // never
119
- { blankLine: 'never', next: 'cjs-export', prev: 'cjs-export' },
120
- { blankLine: 'never', next: 'cjs-import', prev: 'cjs-import' },
121
- { blankLine: 'never', next: 'directive', prev: 'directive' },
122
- ],
123
-
124
- quotes: ['error', 'single'],
125
- 'require-await': 'off',
126
-
127
- 'sort-imports': [
128
- 'warn',
129
- {
130
- allowSeparatedGroups: true,
131
- ignoreCase: true,
132
- ignoreDeclarationSort: true,
133
- ignoreMemberSort: false,
134
- memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
135
- },
136
- ],
137
-
138
- 'sort-keys': 'off',
139
-
140
- 'sort-vars': 'warn',
37
+ 'prefer-template': 'warn',
141
38
  },
142
39
  },
143
40
  ];
@@ -14,7 +14,7 @@ export const jsdoc = [
14
14
 
15
15
  require: {
16
16
  ArrowFunctionExpression: false,
17
- ClassDeclaration: true,
17
+ ClassDeclaration: false,
18
18
  ClassExpression: false,
19
19
  FunctionDeclaration: false,
20
20
  FunctionExpression: false,
@@ -0,0 +1,37 @@
1
+ import config from 'eslint-config-prettier';
2
+ import plugin from 'eslint-plugin-prettier/recommended';
3
+
4
+ const fixes = {
5
+ // fix for prettier/vue
6
+ 'vue/html-self-closing': [
7
+ 'error',
8
+ {
9
+ html: {
10
+ component: 'always',
11
+ normal: 'never',
12
+ void: 'always',
13
+ },
14
+
15
+ math: 'always',
16
+ svg: 'always',
17
+ },
18
+ ],
19
+ };
20
+
21
+ /** @see [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) */
22
+ export const prettier = [
23
+ plugin,
24
+ {
25
+ files: ['**/*.vue'],
26
+ rules: { ...fixes },
27
+ },
28
+ ];
29
+
30
+ /** @see [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) */
31
+ export const prettierConfig = [
32
+ config,
33
+ {
34
+ files: ['**/*.vue'],
35
+ rules: { ...fixes },
36
+ },
37
+ ];
@@ -0,0 +1,95 @@
1
+ /* eslint-disable sonarjs/no-duplicate-string */
2
+ import plugin from '@stylistic/eslint-plugin';
3
+
4
+ /** @see [@stylistic/eslint-plugin](https://eslint.style/) */
5
+ export const stylistic = [
6
+ {
7
+ plugins: {
8
+ '@stylistic': plugin,
9
+ },
10
+ rules: {
11
+ '@stylistic/lines-around-comment': [
12
+ 'warn',
13
+ {
14
+ afterBlockComment: false,
15
+ afterHashbangComment: true,
16
+ afterLineComment: false,
17
+ allowArrayEnd: true,
18
+ allowArrayStart: true,
19
+ allowBlockEnd: true,
20
+ allowBlockStart: true,
21
+ allowClassEnd: true,
22
+ allowClassStart: true,
23
+ allowEnumEnd: true,
24
+ allowEnumStart: true,
25
+ allowInterfaceEnd: true,
26
+ allowInterfaceStart: true,
27
+ allowModuleEnd: true,
28
+ allowModuleStart: true,
29
+ allowObjectEnd: true,
30
+ allowObjectStart: true,
31
+ allowTypeEnd: true,
32
+ allowTypeStart: true,
33
+ applyDefaultIgnorePatterns: true,
34
+ beforeBlockComment: true,
35
+ beforeLineComment: false,
36
+ },
37
+ ],
38
+ '@stylistic/padding-line-between-statements': [
39
+ 'warn',
40
+ // always
41
+ { blankLine: 'always', next: '*', prev: 'block-like' },
42
+ { blankLine: 'always', next: '*', prev: 'case' },
43
+ { blankLine: 'always', next: '*', prev: 'cjs-export' },
44
+ { blankLine: 'always', next: '*', prev: 'cjs-import' },
45
+ { blankLine: 'always', next: '*', prev: 'class' },
46
+ { blankLine: 'always', next: '*', prev: 'default' },
47
+ { blankLine: 'always', next: '*', prev: 'directive' },
48
+ { blankLine: 'always', next: '*', prev: 'expression' },
49
+ { blankLine: 'always', next: '*', prev: 'iife' },
50
+ { blankLine: 'always', next: '*', prev: 'multiline-block-like' },
51
+ { blankLine: 'always', next: '*', prev: 'multiline-const' },
52
+ { blankLine: 'always', next: '*', prev: 'multiline-expression' },
53
+ { blankLine: 'always', next: '*', prev: 'multiline-let' },
54
+ { blankLine: 'always', next: '*', prev: 'multiline-var' },
55
+ { blankLine: 'always', next: '*', prev: 'singleline-const' },
56
+ { blankLine: 'always', next: '*', prev: 'singleline-let' },
57
+ { blankLine: 'always', next: '*', prev: 'singleline-var' },
58
+ { blankLine: 'always', next: 'block-like', prev: '*' },
59
+ { blankLine: 'always', next: 'cjs-export', prev: '*' },
60
+ { blankLine: 'always', next: 'cjs-import', prev: '*' },
61
+ { blankLine: 'always', next: 'class', prev: '*' },
62
+ { blankLine: 'always', next: 'enum', prev: '*' },
63
+ { blankLine: 'always', next: 'expression', prev: '*' },
64
+ { blankLine: 'always', next: 'function', prev: '*' },
65
+ { blankLine: 'always', next: 'iife', prev: '*' },
66
+ { blankLine: 'always', next: 'interface', prev: '*' },
67
+ { blankLine: 'always', next: 'multiline-block-like', prev: '*' },
68
+ { blankLine: 'always', next: 'multiline-const', prev: '*' },
69
+ { blankLine: 'always', next: 'multiline-expression', prev: '*' },
70
+ { blankLine: 'always', next: 'multiline-let', prev: '*' },
71
+ { blankLine: 'always', next: 'multiline-var', prev: '*' },
72
+ { blankLine: 'always', next: 'return', prev: '*' },
73
+ { blankLine: 'always', next: 'switch', prev: '*' },
74
+ { blankLine: 'always', next: 'type', prev: '*' },
75
+ { blankLine: 'always', next: '*', prev: 'enum' },
76
+ { blankLine: 'always', next: '*', prev: 'interface' },
77
+ { blankLine: 'always', next: '*', prev: 'type' },
78
+ // any
79
+ { blankLine: 'any', next: 'expression', prev: 'expression' },
80
+ {
81
+ blankLine: 'any',
82
+ next: 'singleline-const',
83
+ prev: 'singleline-const',
84
+ },
85
+ { blankLine: 'any', next: 'singleline-let', prev: 'singleline-let' },
86
+ { blankLine: 'any', next: 'singleline-var', prev: 'singleline-var' },
87
+ // never
88
+ { blankLine: 'never', next: 'cjs-export', prev: 'cjs-export' },
89
+ { blankLine: 'never', next: 'cjs-import', prev: 'cjs-import' },
90
+ { blankLine: 'never', next: 'directive', prev: 'directive' },
91
+ { blankLine: 'never', next: 'function', prev: 'function-overload' },
92
+ ],
93
+ },
94
+ },
95
+ ];
@@ -4,6 +4,7 @@ import plugin from 'eslint-plugin-vuejs-accessibility';
4
4
  export const vueAccessibility = [
5
5
  ...plugin.configs['flat/recommended'],
6
6
  {
7
+ files: ['**/*.vue'],
7
8
  rules: {
8
9
  'vuejs-accessibility/label-has-for': [
9
10
  'warn',
@@ -4,6 +4,7 @@ import plugin from '@intlify/eslint-plugin-vue-i18n';
4
4
  export const vueI18n = [
5
5
  ...plugin.configs['flat/recommended'],
6
6
  {
7
+ files: ['**/*.vue'],
7
8
  rules: {
8
9
  '@intlify/vue-i18n/key-format-style': [
9
10
  'error',
@@ -7,18 +7,13 @@ export const vue = [
7
7
  {
8
8
  files: ['**/*.vue'],
9
9
  languageOptions: { parserOptions: { parser: typescript.parser } },
10
- },
11
- {
12
- files: ['**/pages/**/*', '**/layouts/**/*'],
13
- rules: { 'vue/multi-word-component-names': 'off' },
14
- },
15
- {
16
10
  rules: {
17
11
  'vue/attributes-order': ['error', { alphabetical: true }],
18
12
  'vue/block-lang': [
19
13
  'error',
20
14
  { script: { lang: 'ts' }, style: { lang: 'scss' }, template: {} },
21
15
  ],
16
+ 'vue/block-order': ['error', { order: ['script', 'template', 'style'] }],
22
17
  'vue/component-api-style': ['error', ['script-setup']],
23
18
  'vue/component-definition-name-casing': ['error', 'kebab-case'],
24
19
  'vue/component-name-in-template-casing': [
@@ -27,10 +22,6 @@ export const vue = [
27
22
  { registeredComponentsOnly: false },
28
23
  ],
29
24
  'vue/component-options-name-casing': ['error', 'PascalCase'],
30
- 'vue/component-tags-order': [
31
- 'error',
32
- { order: ['script', 'template', 'style'] },
33
- ],
34
25
  'vue/define-emits-declaration': ['error'],
35
26
  'vue/define-macros-order': [
36
27
  'error',
@@ -85,7 +76,6 @@ export const vue = [
85
76
  'vue/no-deprecated-slot-scope-attribute': ['error'],
86
77
  'vue/no-duplicate-attr-inheritance': ['error'],
87
78
  'vue/no-empty-component-block': ['error'],
88
- 'vue/no-invalid-model-keys': ['error'],
89
79
  'vue/no-irregular-whitespace': ['error'],
90
80
  'vue/no-loss-of-precision': ['error'],
91
81
  'vue/no-multiple-objects-in-class': ['error'],
@@ -169,4 +159,8 @@ export const vue = [
169
159
  'vue/valid-v-slot': ['error'],
170
160
  },
171
161
  },
162
+ {
163
+ files: ['**/pages/**/*.vue', '**/layouts/**/*.vue'],
164
+ rules: { 'vue/multi-word-component-names': 'off' },
165
+ },
172
166
  ];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/config-hooks",
3
- "version": "4.2.1",
3
+ "version": "4.2.2",
4
4
  "private": false,
5
5
  "description": "Hooks config",
6
6
  "keywords": [
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "husky": "^9.1.4",
38
- "lint-staged": "^15.2.7"
38
+ "lint-staged": "^15.2.8"
39
39
  },
40
40
  "engines": {
41
41
  "node": ">=18.18"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/config-htmllint",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "private": false,
5
5
  "description": "htmllint config",
6
6
  "keywords": [
@@ -35,7 +35,7 @@
35
35
  "up": "../../scripts/up.sh"
36
36
  },
37
37
  "dependencies": {
38
- "@linthtml/linthtml": "^0.10.0",
38
+ "@linthtml/linthtml": "^0.10.1",
39
39
  "@linthtml/linthtml-config-recommended": "^0.1.0"
40
40
  },
41
41
  "engines": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alexlit/config-stylelint",
3
- "version": "45.12.1",
3
+ "version": "45.13.0",
4
4
  "private": false,
5
5
  "description": "Stylelint config",
6
6
  "keywords": [
@@ -54,7 +54,7 @@
54
54
  "stylelint-order": "^6.0.4",
55
55
  "stylelint-plugin-logical-css": "^1.2.1",
56
56
  "stylelint-prettier": "^5.0.2",
57
- "stylelint-scss": "^6.4.1",
57
+ "stylelint-scss": "^6.5.0",
58
58
  "stylelint-selector-no-empty": "^1.0.9",
59
59
  "stylelint-use-nesting": "^5.1.2"
60
60
  },