@alexlit/config-eslint 161.4.0 → 162.1.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.
@@ -17,14 +17,28 @@ const fixes = {
17
17
  ],
18
18
  };
19
19
 
20
- /** @see [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) */
21
- export const prettier = defineConfig([
22
- { files: FILES, ...plugin, rules: { ...plugin.rules, ...STYLE_RULES } },
23
- { files: VUE_FILES, rules: { ...fixes } },
24
- ]);
20
+ /**
21
+ * Форматирование кода самим Prettier (ESLint запускает Prettier как правило).
22
+ *
23
+ * @returns {import('eslint').Linter.Config[]}
24
+ *
25
+ * @see [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier)
26
+ */
27
+ export const prettier = () =>
28
+ defineConfig([
29
+ { files: FILES, ...plugin, rules: { ...plugin.rules, ...STYLE_RULES } },
30
+ { files: VUE_FILES, rules: { ...fixes } },
31
+ ]);
25
32
 
26
- /** @see [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier) */
27
- export const prettierConfig = defineConfig([
28
- { files: FILES, ...config, rules: { ...config.rules, ...STYLE_RULES } },
29
- { files: VUE_FILES, rules: { ...fixes } },
30
- ]);
33
+ /**
34
+ * Отключение правил, конфликтующих с Prettier.
35
+ *
36
+ * @returns {import('eslint').Linter.Config[]}
37
+ *
38
+ * @see [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier)
39
+ */
40
+ export const prettierConfig = () =>
41
+ defineConfig([
42
+ { files: FILES, ...config, rules: { ...config.rules, ...STYLE_RULES } },
43
+ { files: VUE_FILES, rules: { ...fixes } },
44
+ ]);
package/plugins/regexp.js CHANGED
@@ -3,13 +3,20 @@ import { defineConfig } from 'eslint/config';
3
3
 
4
4
  import { FILES } from '../base.js';
5
5
 
6
- /** @see [eslint-plugin-regexp](https://github.com/ota-meshi/eslint-plugin-regexp) */
7
- export const regexp = defineConfig([
8
- {
9
- files: FILES,
10
- ...plugin.configs['flat/recommended'],
11
- settings: {
12
- regexp: { allowedCharacterRanges: ['alphanumeric', 'а-я', 'А-Я'] },
6
+ /**
7
+ * Правила для регулярных выражений.
8
+ *
9
+ * @returns {import('eslint').Linter.Config[]}
10
+ *
11
+ * @see [eslint-plugin-regexp](https://github.com/ota-meshi/eslint-plugin-regexp)
12
+ */
13
+ export const regexp = () =>
14
+ defineConfig([
15
+ {
16
+ files: FILES,
17
+ ...plugin.configs['flat/recommended'],
18
+ settings: {
19
+ regexp: { allowedCharacterRanges: ['alphanumeric', 'а-я', 'А-Я'] },
20
+ },
13
21
  },
14
- },
15
- ]);
22
+ ]);
package/plugins/sonar.js CHANGED
@@ -3,16 +3,23 @@ import { defineConfig } from 'eslint/config';
3
3
 
4
4
  import { FILES } from '../base.js';
5
5
 
6
- /** @see [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/blob/master/packages/jsts/src/rules/README.md) */
7
- export const sonar = defineConfig([
8
- {
9
- files: FILES,
10
- ...plugin.configs.recommended,
11
- rules: {
12
- ...plugin.configs.recommended.rules,
13
- 'sonarjs/no-commented-code': 'warn',
14
- 'sonarjs/todo-tag': 'off',
15
- 'sonarjs/unused-import': 'off', // @typescript-eslint/no-unused-vars
6
+ /**
7
+ * Правила SonarJS.
8
+ *
9
+ * @returns {import('eslint').Linter.Config[]}
10
+ *
11
+ * @see [eslint-plugin-sonarjs](https://github.com/SonarSource/SonarJS/blob/master/packages/jsts/src/rules/README.md)
12
+ */
13
+ export const sonar = () =>
14
+ defineConfig([
15
+ {
16
+ files: FILES,
17
+ ...plugin.configs.recommended,
18
+ rules: {
19
+ ...plugin.configs.recommended.rules,
20
+ 'sonarjs/no-commented-code': 'warn',
21
+ 'sonarjs/todo-tag': 'off',
22
+ 'sonarjs/unused-import': 'off', // @typescript-eslint/no-unused-vars
23
+ },
16
24
  },
17
- },
18
- ]);
25
+ ]);
@@ -3,104 +3,111 @@ import { defineConfig } from 'eslint/config';
3
3
 
4
4
  import { DATA_FILES, FILES } from '../base.js';
5
5
 
6
- /** @see [@stylistic/eslint-plugin](https://eslint.style/) */
7
- export const stylistic = defineConfig([
8
- {
9
- ...plugin.configs.recommended,
10
- ignores: [...(plugin.configs.recommended.ignores ?? []), ...DATA_FILES],
11
- },
12
- {
13
- files: FILES,
14
- plugins: { '@stylistic': plugin },
15
- rules: {
16
- '@stylistic/lines-around-comment': [
17
- 'warn',
18
- {
19
- afterBlockComment: false,
20
- afterHashbangComment: true,
21
- afterLineComment: false,
22
- allowArrayEnd: true,
23
- allowArrayStart: true,
24
- allowBlockEnd: true,
25
- allowBlockStart: true,
26
- allowClassEnd: true,
27
- allowClassStart: true,
28
- allowEnumEnd: true,
29
- allowEnumStart: true,
30
- allowInterfaceEnd: true,
31
- allowInterfaceStart: true,
32
- allowModuleEnd: true,
33
- allowModuleStart: true,
34
- allowObjectEnd: true,
35
- allowObjectStart: true,
36
- allowTypeEnd: true,
37
- allowTypeStart: true,
38
- applyDefaultIgnorePatterns: true,
39
- beforeBlockComment: false,
40
- beforeLineComment: false,
41
- },
42
- ],
43
- '@stylistic/padding-line-between-statements': [
44
- 'warn',
45
- // always
46
- { blankLine: 'always', next: '*', prev: 'block-like' },
47
- { blankLine: 'always', next: '*', prev: 'case' },
48
- { blankLine: 'always', next: '*', prev: 'cjs-export' },
49
- { blankLine: 'always', next: '*', prev: 'cjs-import' },
50
- { blankLine: 'always', next: '*', prev: 'class' },
51
- { blankLine: 'always', next: '*', prev: 'default' },
52
- { blankLine: 'always', next: '*', prev: 'directive' },
53
- { blankLine: 'always', next: '*', prev: 'enum' },
54
- { blankLine: 'always', next: '*', prev: 'export' },
55
- { blankLine: 'always', next: '*', prev: 'expression' },
56
- { blankLine: 'always', next: '*', prev: 'iife' },
57
- { blankLine: 'always', next: '*', prev: 'import' },
58
- { blankLine: 'always', next: '*', prev: 'interface' },
59
- { blankLine: 'always', next: '*', prev: 'multiline-block-like' },
60
- { blankLine: 'always', next: '*', prev: 'multiline-const' },
61
- { blankLine: 'always', next: '*', prev: 'multiline-expression' },
62
- { blankLine: 'always', next: '*', prev: 'multiline-let' },
63
- { blankLine: 'always', next: '*', prev: 'multiline-var' },
64
- { blankLine: 'always', next: '*', prev: 'singleline-const' },
65
- { blankLine: 'always', next: '*', prev: 'singleline-let' },
66
- { blankLine: 'always', next: '*', prev: 'singleline-var' },
67
- { blankLine: 'always', next: '*', prev: 'type' },
68
- { blankLine: 'always', next: 'block-like', prev: '*' },
69
- { blankLine: 'always', next: 'cjs-export', prev: '*' },
70
- { blankLine: 'always', next: 'cjs-import', prev: '*' },
71
- { blankLine: 'always', next: 'class', prev: '*' },
72
- { blankLine: 'always', next: 'enum', prev: '*' },
73
- { blankLine: 'always', next: 'export', prev: '*' },
74
- { blankLine: 'always', next: 'expression', prev: '*' },
75
- { blankLine: 'always', next: 'function', prev: '*' },
76
- { blankLine: 'always', next: 'iife', prev: '*' },
77
- { blankLine: 'always', next: 'import', prev: '*' },
78
- { blankLine: 'always', next: 'interface', prev: '*' },
79
- { blankLine: 'always', next: 'multiline-block-like', prev: '*' },
80
- { blankLine: 'always', next: 'multiline-const', prev: '*' },
81
- { blankLine: 'always', next: 'multiline-expression', prev: '*' },
82
- { blankLine: 'always', next: 'multiline-let', prev: '*' },
83
- { blankLine: 'always', next: 'multiline-var', prev: '*' },
84
- { blankLine: 'always', next: 'return', prev: '*' },
85
- { blankLine: 'always', next: 'switch', prev: '*' },
86
- { blankLine: 'always', next: 'type', prev: '*' },
87
- // any
88
- { blankLine: 'any', next: 'expression', prev: 'expression' },
89
- {
90
- blankLine: 'any',
91
- next: 'singleline-const',
92
- prev: 'singleline-const',
93
- },
94
- { blankLine: 'any', next: 'export', prev: 'export' },
95
- { blankLine: 'any', next: 'import', prev: 'import' },
96
- { blankLine: 'any', next: 'singleline-let', prev: 'singleline-let' },
97
- { blankLine: 'any', next: 'singleline-var', prev: 'singleline-var' },
98
- // never
99
- { blankLine: 'never', next: 'cjs-export', prev: 'cjs-export' },
100
- { blankLine: 'never', next: 'cjs-import', prev: 'cjs-import' },
101
- { blankLine: 'never', next: 'directive', prev: 'directive' },
102
- { blankLine: 'never', next: 'function', prev: 'function-overload' },
103
- ],
6
+ /**
7
+ * Правила форматирования и стиля кода.
8
+ *
9
+ * @returns {import('eslint').Linter.Config[]}
10
+ *
11
+ * @see [@stylistic/eslint-plugin](https://eslint.style/)
12
+ */
13
+ export const stylistic = () =>
14
+ defineConfig([
15
+ {
16
+ ...plugin.configs.recommended,
17
+ ignores: [...(plugin.configs.recommended.ignores ?? []), ...DATA_FILES],
104
18
  },
105
- },
106
- ]);
19
+ {
20
+ files: FILES,
21
+ plugins: { '@stylistic': plugin },
22
+ rules: {
23
+ '@stylistic/lines-around-comment': [
24
+ 'warn',
25
+ {
26
+ afterBlockComment: false,
27
+ afterHashbangComment: true,
28
+ afterLineComment: false,
29
+ allowArrayEnd: true,
30
+ allowArrayStart: true,
31
+ allowBlockEnd: true,
32
+ allowBlockStart: true,
33
+ allowClassEnd: true,
34
+ allowClassStart: true,
35
+ allowEnumEnd: true,
36
+ allowEnumStart: true,
37
+ allowInterfaceEnd: true,
38
+ allowInterfaceStart: true,
39
+ allowModuleEnd: true,
40
+ allowModuleStart: true,
41
+ allowObjectEnd: true,
42
+ allowObjectStart: true,
43
+ allowTypeEnd: true,
44
+ allowTypeStart: true,
45
+ applyDefaultIgnorePatterns: true,
46
+ beforeBlockComment: false,
47
+ beforeLineComment: false,
48
+ },
49
+ ],
50
+ '@stylistic/padding-line-between-statements': [
51
+ 'warn',
52
+ // always
53
+ { blankLine: 'always', next: '*', prev: 'block-like' },
54
+ { blankLine: 'always', next: '*', prev: 'case' },
55
+ { blankLine: 'always', next: '*', prev: 'cjs-export' },
56
+ { blankLine: 'always', next: '*', prev: 'cjs-import' },
57
+ { blankLine: 'always', next: '*', prev: 'class' },
58
+ { blankLine: 'always', next: '*', prev: 'default' },
59
+ { blankLine: 'always', next: '*', prev: 'directive' },
60
+ { blankLine: 'always', next: '*', prev: 'enum' },
61
+ { blankLine: 'always', next: '*', prev: 'export' },
62
+ { blankLine: 'always', next: '*', prev: 'expression' },
63
+ { blankLine: 'always', next: '*', prev: 'iife' },
64
+ { blankLine: 'always', next: '*', prev: 'import' },
65
+ { blankLine: 'always', next: '*', prev: 'interface' },
66
+ { blankLine: 'always', next: '*', prev: 'multiline-block-like' },
67
+ { blankLine: 'always', next: '*', prev: 'multiline-const' },
68
+ { blankLine: 'always', next: '*', prev: 'multiline-expression' },
69
+ { blankLine: 'always', next: '*', prev: 'multiline-let' },
70
+ { blankLine: 'always', next: '*', prev: 'multiline-var' },
71
+ { blankLine: 'always', next: '*', prev: 'singleline-const' },
72
+ { blankLine: 'always', next: '*', prev: 'singleline-let' },
73
+ { blankLine: 'always', next: '*', prev: 'singleline-var' },
74
+ { blankLine: 'always', next: '*', prev: 'type' },
75
+ { blankLine: 'always', next: 'block-like', prev: '*' },
76
+ { blankLine: 'always', next: 'cjs-export', prev: '*' },
77
+ { blankLine: 'always', next: 'cjs-import', prev: '*' },
78
+ { blankLine: 'always', next: 'class', prev: '*' },
79
+ { blankLine: 'always', next: 'enum', prev: '*' },
80
+ { blankLine: 'always', next: 'export', prev: '*' },
81
+ { blankLine: 'always', next: 'expression', prev: '*' },
82
+ { blankLine: 'always', next: 'function', prev: '*' },
83
+ { blankLine: 'always', next: 'iife', prev: '*' },
84
+ { blankLine: 'always', next: 'import', prev: '*' },
85
+ { blankLine: 'always', next: 'interface', prev: '*' },
86
+ { blankLine: 'always', next: 'multiline-block-like', prev: '*' },
87
+ { blankLine: 'always', next: 'multiline-const', prev: '*' },
88
+ { blankLine: 'always', next: 'multiline-expression', prev: '*' },
89
+ { blankLine: 'always', next: 'multiline-let', prev: '*' },
90
+ { blankLine: 'always', next: 'multiline-var', prev: '*' },
91
+ { blankLine: 'always', next: 'return', prev: '*' },
92
+ { blankLine: 'always', next: 'switch', prev: '*' },
93
+ { blankLine: 'always', next: 'type', prev: '*' },
94
+ // any
95
+ { blankLine: 'any', next: 'expression', prev: 'expression' },
96
+ {
97
+ blankLine: 'any',
98
+ next: 'singleline-const',
99
+ prev: 'singleline-const',
100
+ },
101
+ { blankLine: 'any', next: 'export', prev: 'export' },
102
+ { blankLine: 'any', next: 'import', prev: 'import' },
103
+ { blankLine: 'any', next: 'singleline-let', prev: 'singleline-let' },
104
+ { blankLine: 'any', next: 'singleline-var', prev: 'singleline-var' },
105
+ // never
106
+ { blankLine: 'never', next: 'cjs-export', prev: 'cjs-export' },
107
+ { blankLine: 'never', next: 'cjs-import', prev: 'cjs-import' },
108
+ { blankLine: 'never', next: 'directive', prev: 'directive' },
109
+ { blankLine: 'never', next: 'function', prev: 'function-overload' },
110
+ ],
111
+ },
112
+ },
113
+ ]);
@@ -3,19 +3,30 @@ import { defineConfig } from 'eslint/config';
3
3
 
4
4
  import { FILES } from '../base.js';
5
5
 
6
+ const DEFAULT_CSS_CONFIG_PATH = './styles/tailwind.css';
7
+
6
8
  /**
9
+ * Правила для Tailwind CSS.
10
+ *
7
11
  * @example
8
12
  * import path from 'node:path';
13
+ * import { defineConfig, plugins } from '@alexlit/config-eslint';
14
+ *
15
+ * export default defineConfig([
16
+ * plugins.tailwindcss({
17
+ * cssConfigPath: path.resolve(import.meta.dirname, 'src/styles.css'),
18
+ * }),
19
+ * ]);
9
20
  *
10
- * tailwindcss({
11
- * cssConfigPath: path.resolve(import.meta.dirname, 'src/tailwind.css'),
12
- * });
21
+ * @param {import('eslint-plugin-tailwindcss').PluginSettings} [settings] -
22
+ * Настройки плагина `tailwindcss`. По умолчанию `cssConfigPath` равен
23
+ * `./styles/tailwind.css`.
13
24
  *
14
- * @param settings {import('eslint-plugin-tailwindcss').PluginSettings}
25
+ * @returns {import('eslint').Linter.Config[]}
15
26
  *
16
27
  * @see [eslint-plugin-tailwindcss](https://github.com/francoismassart/eslint-plugin-tailwindcss)
17
28
  */
18
- export const tailwindcss = (settings) =>
29
+ export const tailwindcss = (settings = {}) =>
19
30
  defineConfig([
20
31
  {
21
32
  files: FILES,
@@ -27,7 +38,7 @@ export const tailwindcss = (settings) =>
27
38
  },
28
39
  settings: {
29
40
  /** @type {import('eslint-plugin-tailwindcss').PluginSettings} */
30
- tailwindcss: { cssConfigPath: './styles/tailwind.css', ...settings },
41
+ tailwindcss: { cssConfigPath: DEFAULT_CSS_CONFIG_PATH, ...settings },
31
42
  },
32
43
  },
33
44
  ]);
@@ -3,12 +3,19 @@ import { defineConfig } from 'eslint/config';
3
3
 
4
4
  import { DATA_FILES } from '../base.js';
5
5
 
6
- /** @see [@tanstack/query](https://tanstack.com/query/latest/docs/eslint/eslint-plugin-query) */
7
- export const tanstackQuery = defineConfig([
8
- // The shipped config has no `files` key, so it would also cover data files.
9
- ...plugin.configs['flat/recommended'].map((config) => ({
10
- ...config,
11
- ignores: [...(config.ignores ?? []), ...DATA_FILES],
12
- })),
13
- { rules: { '@tanstack/query/infinite-query-property-order': 'off' } },
14
- ]);
6
+ /**
7
+ * Правила для TanStack Query.
8
+ *
9
+ * @returns {import('eslint').Linter.Config[]}
10
+ *
11
+ * @see [@tanstack/query](https://tanstack.com/query/latest/docs/eslint/eslint-plugin-query)
12
+ */
13
+ export const tanstackQuery = () =>
14
+ defineConfig([
15
+ // The shipped config has no `files` key, so it would also cover data files.
16
+ ...plugin.configs['flat/recommended'].map((config) => ({
17
+ ...config,
18
+ ignores: [...(config.ignores ?? []), ...DATA_FILES],
19
+ })),
20
+ { rules: { '@tanstack/query/infinite-query-property-order': 'off' } },
21
+ ]);
@@ -5,46 +5,51 @@ import { DATA_FILES, FILES, TEST_FILES, TS_FILES } from '../base.js';
5
5
  import { TS_RULES } from '../rules/typescript.js';
6
6
 
7
7
  /**
8
- * Type-aware TypeScript config.
8
+ * Type-aware правила TypeScript.
9
9
  *
10
10
  * Opt-in: requires a `tsconfig.json` in the project and needs type information,
11
11
  * which makes linting slower. Use it instead of `typescript`, not alongside
12
12
  * it.
13
13
  *
14
+ * @returns {import('eslint').Linter.Config[]}
15
+ *
14
16
  * @see [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint)
15
17
  */
16
- export const typescriptTypeChecked = defineConfig([
17
- // The parser is needed for every JS/TS/Vue file, not only for TypeScript ones,
18
- // otherwise `.js` files fall back to the default parser and modern syntax
19
- // (`import.meta`, top-level await) breaks.
20
- { ...plugin.configs.base, files: FILES },
18
+ export const typescriptTypeChecked = () =>
19
+ defineConfig([
20
+ // The parser is needed for every JS/TS/Vue file, not only for TypeScript ones,
21
+ // otherwise `.js` files fall back to the default parser and modern syntax
22
+ // (`import.meta`, top-level await) breaks.
23
+ { ...plugin.configs.base, files: FILES },
21
24
 
22
- // Non type-aware rules — the same scope as the regular `typescript` plugin,
23
- // so `.js`/`.vue` files keep the TypeScript versions of the rules.
24
- // `plugin.configs.strict`/`stylistic` contain blocks without a `files` key,
25
- // so they would also land on data files that are not JavaScript at all.
26
- ...[...plugin.configs.strict, ...plugin.configs.stylistic].map((config) => ({
27
- ...config,
28
- ignores: [...(config.ignores ?? []), ...DATA_FILES],
29
- })),
25
+ // Non type-aware rules - the same scope as the regular `typescript` plugin,
26
+ // so `.js`/`.vue` files keep the TypeScript versions of the rules.
27
+ // `plugin.configs.strict`/`stylistic` contain blocks without a `files` key,
28
+ // so they would also land on data files that are not JavaScript at all.
29
+ ...[...plugin.configs.strict, ...plugin.configs.stylistic].map(
30
+ (config) => ({
31
+ ...config,
32
+ ignores: [...(config.ignores ?? []), ...DATA_FILES],
33
+ }),
34
+ ),
30
35
 
31
- // Type-aware rules only make sense where the type information is available.
32
- ...plugin.configs.strictTypeChecked.map((config) => ({
33
- ...config,
34
- files: TS_FILES,
35
- })),
36
- ...plugin.configs.stylisticTypeChecked.map((config) => ({
37
- ...config,
38
- files: TS_FILES,
39
- })),
36
+ // Type-aware rules only make sense where the type information is available.
37
+ ...plugin.configs.strictTypeChecked.map((config) => ({
38
+ ...config,
39
+ files: TS_FILES,
40
+ })),
41
+ ...plugin.configs.stylisticTypeChecked.map((config) => ({
42
+ ...config,
43
+ files: TS_FILES,
44
+ })),
40
45
 
41
- {
42
- files: TS_FILES,
43
- languageOptions: { parserOptions: { projectService: true } },
44
- rules: TS_RULES,
45
- },
46
- {
47
- files: TEST_FILES,
48
- rules: { '@typescript-eslint/no-empty-function': 'off' },
49
- },
50
- ]);
46
+ {
47
+ files: TS_FILES,
48
+ languageOptions: { parserOptions: { projectService: true } },
49
+ rules: TS_RULES,
50
+ },
51
+ {
52
+ files: TEST_FILES,
53
+ rules: { '@typescript-eslint/no-empty-function': 'off' },
54
+ },
55
+ ]);
@@ -4,18 +4,27 @@ import plugin from 'typescript-eslint';
4
4
  import { DATA_FILES, FILES, TEST_FILES } from '../base.js';
5
5
  import { TS_RULES } from '../rules/typescript.js';
6
6
 
7
- /** @see [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint) */
8
- export const typescript = defineConfig([
9
- // `plugin.configs.strict`/`stylistic` contain blocks without a `files` key,
10
- // so they would also land on data files that are not JavaScript at all.
11
- ...[...plugin.configs.strict, ...plugin.configs.stylistic].map((config) => ({
12
- ...config,
13
- ignores: [...(config.ignores ?? []), ...DATA_FILES],
14
- })),
7
+ /**
8
+ * Правила TypeScript без анализа типов.
9
+ *
10
+ * @returns {import('eslint').Linter.Config[]}
11
+ *
12
+ * @see [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint)
13
+ */
14
+ export const typescript = () =>
15
+ defineConfig([
16
+ // `plugin.configs.strict`/`stylistic` contain blocks without a `files` key,
17
+ // so they would also land on data files that are not JavaScript at all.
18
+ ...[...plugin.configs.strict, ...plugin.configs.stylistic].map(
19
+ (config) => ({
20
+ ...config,
21
+ ignores: [...(config.ignores ?? []), ...DATA_FILES],
22
+ }),
23
+ ),
15
24
 
16
- { files: FILES, rules: TS_RULES },
17
- {
18
- files: TEST_FILES,
19
- rules: { '@typescript-eslint/no-empty-function': 'off' },
20
- },
21
- ]);
25
+ { files: FILES, rules: TS_RULES },
26
+ {
27
+ files: TEST_FILES,
28
+ rules: { '@typescript-eslint/no-empty-function': 'off' },
29
+ },
30
+ ]);