@darksheep/eslint 4.4.20 โ†’ 5.0.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/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.0.0](https://github.com/DarkSheepSoftware/eslint/compare/v4.4.20...v5.0.0) (2024-07-23)
4
+
5
+
6
+ ### โš  BREAKING CHANGES
7
+
8
+ * Add perfectionist plugin
9
+
10
+ ### ๐ŸŒŸ Features
11
+
12
+ * Add perfectionist plugin ([bbe8aab](https://github.com/DarkSheepSoftware/eslint/commit/bbe8aab9115806ff56d4ccfff09b6e8bcc969406))
13
+
14
+
15
+ ### ๐Ÿ› Fixes
16
+
17
+ * Patch perfectionist stypes ([38fec1b](https://github.com/DarkSheepSoftware/eslint/commit/38fec1b881d405b7bc8a9b381596a05aebed1bc8))
18
+ * Replace deprecated "ban-types" rule ([664b987](https://github.com/DarkSheepSoftware/eslint/commit/664b987841f014608cfbb752f98f5a24ca58b7fc))
19
+ * Run perfectionist on the repo ([0938cd3](https://github.com/DarkSheepSoftware/eslint/commit/0938cd31faa9c77644187008bd8f7d13dc9c796f))
20
+
21
+
22
+ ### ๐Ÿ“ฆ Dependencies
23
+
24
+ * **dev:** update dependency @types/eslint to v8.56.11 ([#515](https://github.com/DarkSheepSoftware/eslint/issues/515)) ([f39356a](https://github.com/DarkSheepSoftware/eslint/commit/f39356a1f70c01cccf4c7b569f75db3d43a8602c))
25
+ * **dev:** update dependency @types/eslint to v9 ([#517](https://github.com/DarkSheepSoftware/eslint/issues/517)) ([24502a8](https://github.com/DarkSheepSoftware/eslint/commit/24502a8a9bbfa4ea1dc0aff9c5de37acb89e1326))
26
+ * **dev:** update dependency @types/eslint__eslintrc to v2.1.2 ([#516](https://github.com/DarkSheepSoftware/eslint/issues/516)) ([80da38b](https://github.com/DarkSheepSoftware/eslint/commit/80da38b171085503fcc056ae6f5f121a5173f2c7))
27
+ * **dev:** update dependency @types/node to v20.14.11 ([#505](https://github.com/DarkSheepSoftware/eslint/issues/505)) ([c165262](https://github.com/DarkSheepSoftware/eslint/commit/c165262bcea1d48ba976f6fff87800f3347a5fdd))
28
+ * **dev:** update dependency type-fest to ~4.21.0 ([#502](https://github.com/DarkSheepSoftware/eslint/issues/502)) ([affd367](https://github.com/DarkSheepSoftware/eslint/commit/affd367f1bbc1b6ea671f26cdee21c66c4b368e8))
29
+ * **dev:** update dependency type-fest to ~4.23.0 ([#512](https://github.com/DarkSheepSoftware/eslint/issues/512)) ([fe6942e](https://github.com/DarkSheepSoftware/eslint/commit/fe6942e2709db20df1283e88f8b17b5807a46f6a))
30
+ * **dev:** update dependency typescript to v5.5.3 ([#500](https://github.com/DarkSheepSoftware/eslint/issues/500)) ([4df508e](https://github.com/DarkSheepSoftware/eslint/commit/4df508e8d4a3fa0af59004a100cb7f29e103114a))
31
+ * **dev:** update dependency typescript to v5.5.4 ([#518](https://github.com/DarkSheepSoftware/eslint/issues/518)) ([4a8eba5](https://github.com/DarkSheepSoftware/eslint/commit/4a8eba57d427b96582dd52942eae78ae7f91702e))
32
+ * **lock:** lock file maintenance ([#506](https://github.com/DarkSheepSoftware/eslint/issues/506)) ([e5792f3](https://github.com/DarkSheepSoftware/eslint/commit/e5792f33fc8c18e6e7d5d2fb24c156e2d52a6718))
33
+ * **pkg:** update dependency eslint-plugin-jsdoc to v48.5.2 ([#504](https://github.com/DarkSheepSoftware/eslint/issues/504)) ([4d926be](https://github.com/DarkSheepSoftware/eslint/commit/4d926be8b34424f5f3bf0df64028a8334345399b))
34
+ * **pkg:** update dependency eslint-plugin-jsdoc to v48.8.3 ([#508](https://github.com/DarkSheepSoftware/eslint/issues/508)) ([bf13633](https://github.com/DarkSheepSoftware/eslint/commit/bf13633ef1d6d45a975604848f2549431a4b6a21))
35
+ * **pkg:** update dependency eslint-plugin-package-json to v0.15.2 ([#509](https://github.com/DarkSheepSoftware/eslint/issues/509)) ([8b1ebe6](https://github.com/DarkSheepSoftware/eslint/commit/8b1ebe6b53d7c04cd0a9f544ad65520a20b9c054))
36
+ * **pkg:** update dependency eslint-plugin-promise to v6.6.0 ([#513](https://github.com/DarkSheepSoftware/eslint/issues/513)) ([89b51e2](https://github.com/DarkSheepSoftware/eslint/commit/89b51e250bb0a2759d9a2075ca0cac422c0c8054))
37
+ * **pkg:** update dependency eslint-plugin-react to v7.35.0 ([#511](https://github.com/DarkSheepSoftware/eslint/issues/511)) ([0149b92](https://github.com/DarkSheepSoftware/eslint/commit/0149b9213fb7179a1e89e431c07c91d083bc470a))
38
+ * **pkg:** update dependency eslint-plugin-unused-imports to v4.0.1 ([#514](https://github.com/DarkSheepSoftware/eslint/issues/514)) ([92b028c](https://github.com/DarkSheepSoftware/eslint/commit/92b028c3e2163be1939244293720ded1fa40161f))
39
+ * **pkg:** update eslint monorepo to v9.7.0 ([#510](https://github.com/DarkSheepSoftware/eslint/issues/510)) ([9f6c49d](https://github.com/DarkSheepSoftware/eslint/commit/9f6c49dd1813285a220f0463b3d535ef59a3d533))
40
+ * **pkg:** update typescript-eslint monorepo to v7.15.0 ([#501](https://github.com/DarkSheepSoftware/eslint/issues/501)) ([dc7dbce](https://github.com/DarkSheepSoftware/eslint/commit/dc7dbce5a22cdcb80fcc57dd64f8855026d09058))
41
+ * **pkg:** update typescript-eslint monorepo to v7.17.0 ([#507](https://github.com/DarkSheepSoftware/eslint/issues/507)) ([0cb3d8e](https://github.com/DarkSheepSoftware/eslint/commit/0cb3d8ea325cb6072435a9b032a3e5620042924a))
42
+
43
+
44
+ ### ๐Ÿ”จ Refactoring
45
+
46
+ * Rename style and node configs ([815e77c](https://github.com/DarkSheepSoftware/eslint/commit/815e77c8c3b74ff39664777993c219ca30c33938))
47
+
48
+
49
+ ### ๐Ÿงน Chores
50
+
51
+ * remove jest and a11y from lock ([8ce7add](https://github.com/DarkSheepSoftware/eslint/commit/8ce7add8d28c08d4486c8c34a70785f2d73e44cf))
52
+ * Remove jest rules ([76f0fab](https://github.com/DarkSheepSoftware/eslint/commit/76f0fab6128b8ff1d7d688321099b116b70c435d))
53
+ * Remove jsx-a11y rules ([8846a01](https://github.com/DarkSheepSoftware/eslint/commit/8846a0118b0bdd1113f7f9343a98a3236014520e))
54
+ * Resolve to [@ts-eslint](https://github.com/ts-eslint) to ^8 ([64d59fb](https://github.com/DarkSheepSoftware/eslint/commit/64d59fb5c16e7680123b912417813690b977b31e))
55
+
3
56
  ## [4.4.20](https://github.com/DarkSheepSoftware/eslint/compare/v4.4.19...v4.4.20) (2024-07-01)
4
57
 
5
58
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darksheep/eslint",
3
- "version": "4.4.20",
3
+ "version": "5.0.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/DarkSheepSoftware/eslint"
@@ -21,38 +21,43 @@
21
21
  "scripts": {
22
22
  "githooks": "git config core.hooksPath .githooks"
23
23
  },
24
+ "resolutions": {
25
+ "@typescript-eslint/eslint-plugin": "^8.0.0-0",
26
+ "@typescript-eslint/parser": "^8.0.0-0",
27
+ "@typescript-eslint/type-utils": "^8.0.0-0",
28
+ "@typescript-eslint/utils": "^8.0.0-0"
29
+ },
24
30
  "dependencies": {
25
31
  "@eslint-community/eslint-plugin-eslint-comments": "4.3.0",
26
32
  "@eslint/eslintrc": "3.1.0",
27
- "@eslint/js": "9.6.0",
33
+ "@eslint/js": "9.7.0",
28
34
  "@stylistic/eslint-plugin": "2.3.0",
29
- "@typescript-eslint/eslint-plugin": "7.14.1",
30
- "@typescript-eslint/parser": "7.14.1",
35
+ "@typescript-eslint/eslint-plugin": "7.17.0",
36
+ "@typescript-eslint/parser": "7.17.0",
31
37
  "editorconfig": "2.0.0",
32
- "eslint": "9.6.0",
33
- "eslint-plugin-jest": "28.6.0",
34
- "eslint-plugin-jsdoc": "48.5.0",
38
+ "eslint": "9.7.0",
39
+ "eslint-plugin-jsdoc": "48.8.3",
35
40
  "eslint-plugin-jsonc": "2.16.0",
36
- "eslint-plugin-jsx-a11y": "6.9.0",
37
41
  "eslint-plugin-n": "17.9.0",
38
- "eslint-plugin-package-json": "0.15.0",
39
- "eslint-plugin-promise": "6.4.0",
40
- "eslint-plugin-react": "7.34.3",
42
+ "eslint-plugin-package-json": "0.15.2",
43
+ "eslint-plugin-perfectionist": "3.0.0",
44
+ "eslint-plugin-promise": "6.6.0",
45
+ "eslint-plugin-react": "7.35.0",
41
46
  "eslint-plugin-regexp": "2.6.0",
42
47
  "eslint-plugin-security": "3.0.1",
43
48
  "eslint-plugin-sonarjs": "1.0.3",
44
49
  "eslint-plugin-unicorn": "54.0.0",
45
- "eslint-plugin-unused-imports": "4.0.0",
50
+ "eslint-plugin-unused-imports": "4.0.1",
46
51
  "jsonc-eslint-parser": "2.4.0"
47
52
  },
48
53
  "devDependencies": {
49
54
  "@darksheep/eslint-formatter-github": "2.0.1",
50
- "@types/eslint": "~8.56.0",
55
+ "@types/eslint": "~9.6.0",
51
56
  "@types/eslint__eslintrc": "~2.1.1",
52
57
  "@types/eslint__js": "~8.42.3",
53
58
  "@types/estree": "~1.0.2",
54
59
  "@types/node": "~20.14.0",
55
- "type-fest": "~4.20.0",
60
+ "type-fest": "~4.23.0",
56
61
  "typescript": "~5.5.0"
57
62
  },
58
63
  "peerDependenciesMeta": {
@@ -1,6 +1,7 @@
1
1
  import * as fs from 'node:fs/promises';
2
2
  import { resolve } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
+
4
5
  import { findUp } from '../utilities/filesystem.js';
5
6
 
6
7
  /**
@@ -15,7 +15,7 @@ const rules = {
15
15
  * @param {import('node:url').URL} root root url
16
16
  * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
17
17
  */
18
- export async function createStyleConfigs(root) {
18
+ export async function createStyleConfig(root) {
19
19
  return [
20
20
  { rules },
21
21
  ...await createEditorOverrides(root),
@@ -1,5 +1,5 @@
1
- import noUselessExpression from './no-useless-expression.js';
2
1
  import looseTypes from './loose-types.js';
2
+ import noUselessExpression from './no-useless-expression.js';
3
3
  import sequenceExpression from './sequence-expression.js';
4
4
 
5
5
  export default {
package/src/index.js CHANGED
@@ -1,18 +1,16 @@
1
1
  import { pathToFileURL, URL } from 'node:url';
2
2
 
3
- import { createEslintIgnoresConfig } from './configs/eslint-ignores.js';
4
3
  import { createEslintBaseConfig } from './configs/eslint-base.js';
5
- import { createEslintRecommendsConfig } from './configs/eslint-recommended.js';
6
4
  import { createEslintComplexityConfig } from './configs/eslint-complexity.js';
7
- import { createStyleConfigs } from './configs/eslint-style.js';
8
-
5
+ import { createEslintIgnoresConfig } from './configs/eslint-ignores.js';
6
+ import { createEslintRecommendsConfig } from './configs/eslint-recommended.js';
7
+ import { createStyleConfig } from './configs/eslint-style.js';
9
8
  import { createEslintCommentsConfig } from './plugins/eslint-comments.js';
10
- import { createEslintJestConfig } from './plugins/jest.js';
11
9
  import { createEslintJSDocConfig } from './plugins/jsdoc.js';
12
- import { createEslintPackageJsonConfig } from './plugins/package-json.js';
13
10
  import { createEslintJsonConfig } from './plugins/json.js';
14
- import { createEslintJsxA11yConfig } from './plugins/jsx-a11y.js';
15
- import { createEslintNodeConfigs } from './plugins/node.js';
11
+ import { createEslintNodeConfig } from './plugins/node.js';
12
+ import { createEslintPackageJsonConfig } from './plugins/package-json.js';
13
+ import { createEslintPerfectionistConfig } from './plugins/perfectionist.js';
16
14
  import { createEslintPromiseConfig } from './plugins/promise.js';
17
15
  import { createEslintReactConfig } from './plugins/react.js';
18
16
  import { createEslintRegexpConfig } from './plugins/regexp.js';
@@ -29,22 +27,21 @@ const configBuilders = [
29
27
  createEslintRecommendsConfig,
30
28
  createEslintBaseConfig,
31
29
  createEslintComplexityConfig,
32
- createStyleConfigs,
30
+ createStyleConfig,
33
31
  createEslintCommentsConfig,
34
- createEslintNodeConfigs,
32
+ createEslintNodeConfig,
33
+ createEslintPerfectionistConfig,
35
34
  createEslintPackageJsonConfig,
36
35
  createEslintJsonConfig,
37
36
  createEslintPromiseConfig,
38
37
  createEslintTypescriptConfig,
39
38
  createEslintReactConfig,
40
- createEslintJsxA11yConfig,
41
39
  createEslintSecurityConfig,
42
40
  createEslintUnicornConfig,
43
41
  createEslintRegexpConfig,
44
42
  createEslintSCAConfig,
45
43
  createEslintSonarJSConfig,
46
44
  createEslintStyleConfig,
47
- createEslintJestConfig,
48
45
  createEslintUnusedImportsConfig,
49
46
  createEslintJSDocConfig,
50
47
  ];
@@ -1,13 +1,14 @@
1
- import { fileURLToPath } from 'node:url';
2
1
  import { dirname } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
3
 
4
4
  import n from 'eslint-plugin-n';
5
+
5
6
  import {
6
7
  getCommonFiles,
7
- getModuleFiles,
8
- getTypescriptFiles,
9
8
  getExampleFiles,
9
+ getModuleFiles,
10
10
  getTestFiles,
11
+ getTypescriptFiles,
11
12
  } from '../utilities/eslint-files.js';
12
13
 
13
14
  const script = n.configs['flat/recommended-script'];
@@ -67,7 +68,7 @@ function toExt(globs) {
67
68
  * @param {URL} root root url
68
69
  * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
69
70
  */
70
- export async function createEslintNodeConfigs(root) {
71
+ export async function createEslintNodeConfig(root) {
71
72
  const commonFiles = await getCommonFiles(root);
72
73
  const moduleFiles = await getModuleFiles(root);
73
74
  const typescriptFiles = getTypescriptFiles();
@@ -0,0 +1,130 @@
1
+ import perfectionist from 'eslint-plugin-perfectionist';
2
+
3
+ import {
4
+ getCommonFiles,
5
+ getModuleFiles,
6
+ getTypescriptFiles,
7
+ } from '../utilities/eslint-files.js';
8
+
9
+ const groupClasses = [
10
+ 'index-signature',
11
+ 'static-property',
12
+ 'private-property',
13
+ 'property',
14
+ 'constructor',
15
+ 'static-method',
16
+ 'private-method',
17
+ 'static-private-method',
18
+ 'method',
19
+ [ 'get-method', 'set-method' ],
20
+ 'unknown',
21
+ ];
22
+
23
+ const groupImports = [
24
+ 'type',
25
+ 'builtin',
26
+ 'external',
27
+ 'internal-type',
28
+ 'internal',
29
+ [ 'parent-type', 'sibling-type', 'index-type' ],
30
+ [ 'parent', 'sibling', 'index' ],
31
+ 'object',
32
+ 'unknown',
33
+ ];
34
+
35
+ /** @type {import('eslint').Linter.RulesRecord} */
36
+ const commonRules = {
37
+ 'perfectionist/sort-classes': [
38
+ 'warn',
39
+ {
40
+ type: 'natural',
41
+ order: 'asc',
42
+ groups: groupClasses,
43
+ },
44
+ ],
45
+ 'perfectionist/sort-array-includes': 0,
46
+ 'perfectionist/sort-maps': 0,
47
+ 'perfectionist/sort-objects': 0,
48
+ };
49
+
50
+ /** @type {import('eslint').Linter.RulesRecord} */
51
+ const moduleRules = {
52
+ 'perfectionist/sort-exports': [
53
+ 'warn',
54
+ {
55
+ type: 'natural',
56
+ order: 'asc',
57
+ },
58
+ ],
59
+ 'perfectionist/sort-imports': [
60
+ 'warn',
61
+ {
62
+ type: 'natural',
63
+ order: 'asc',
64
+ newlinesBetween: 'always',
65
+ groups: groupImports,
66
+ },
67
+ ],
68
+ 'perfectionist/sort-named-exports': [
69
+ 'warn',
70
+ {
71
+ order: 'asc',
72
+ type: 'natural',
73
+ groupKind: 'types-first',
74
+ },
75
+ ],
76
+ 'perfectionist/sort-named-imports': [
77
+ 'warn',
78
+ {
79
+ order: 'asc',
80
+ type: 'natural',
81
+ groupKind: 'types-first',
82
+ },
83
+ ],
84
+ };
85
+
86
+ /** @type {import('eslint').Linter.RulesRecord} */
87
+ const typescriptRules = {
88
+ 'perfectionist/sort-interfaces': 1,
89
+ 'perfectionist/sort-object-types': 1,
90
+ 'perfectionist/sort-objects': 1,
91
+ 'perfectionist/sort-union-types': 1,
92
+ };
93
+
94
+ /**
95
+ * Get ESLint config for imports check
96
+ * @param {URL} root The root of the package being linted
97
+ * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
98
+ */
99
+ export async function createEslintPerfectionistConfig(root) {
100
+ const commonFiles = await getCommonFiles(root);
101
+ const moduleFiles = await getModuleFiles(root);
102
+ const typescriptFiles = getTypescriptFiles();
103
+
104
+ return [
105
+ {
106
+ files: commonFiles,
107
+ plugins: { perfectionist },
108
+ rules: {
109
+ ...commonRules,
110
+ },
111
+ },
112
+ {
113
+ files: moduleFiles,
114
+ plugins: { perfectionist },
115
+ rules: {
116
+ ...commonRules,
117
+ ...moduleRules,
118
+ },
119
+ },
120
+ {
121
+ files: typescriptFiles,
122
+ plugins: { perfectionist },
123
+ rules: {
124
+ ...commonRules,
125
+ ...moduleRules,
126
+ ...typescriptRules,
127
+ },
128
+ },
129
+ ];
130
+ }
@@ -67,7 +67,9 @@ export async function createEslintTypescriptConfig(root) {
67
67
 
68
68
  // ts eslint recommended
69
69
  '@typescript-eslint/ban-ts-comment': 'error',
70
- '@typescript-eslint/ban-types': 'error',
70
+ '@typescript-eslint/no-empty-object-type': 'error',
71
+ '@typescript-eslint/no-unsafe-function-type': 'error',
72
+ '@typescript-eslint/no-wrapper-object-types': 'error',
71
73
  '@typescript-eslint/no-array-constructor': 'error',
72
74
  '@typescript-eslint/no-duplicate-enum-values': 'error',
73
75
  '@typescript-eslint/no-explicit-any': 'error',
package/src/types.d.ts CHANGED
@@ -10,40 +10,40 @@ declare module '@eslint-community/eslint-plugin-eslint-comments' {
10
10
  declare module 'eslint-plugin-import' {
11
11
  import type { ESLint, Linter } from 'eslint';
12
12
  export default {} as {
13
- rules: Required<ESLint.Plugin['rules']>;
14
13
  configs: {
15
- 'recommended': {
16
- plugins: Required<ESLint.ConfigData['plugins']>;
17
- rules: Linter.RulesRecord;
18
- parserOptions: Required<ESLint.ConfigData['parserOptions']>;
14
+ 'electron': {
15
+ settings: Required<ESLint.ConfigData['settings']>;
19
16
  };
20
17
  'errors': {
21
18
  plugins: Required<ESLint.ConfigData['plugins']>;
22
19
  rules: Linter.RulesRecord;
23
20
  };
24
- 'warnings': {
25
- plugins: Required<ESLint.ConfigData['plugins']>;
26
- rules: Linter.RulesRecord;
27
- };
28
- 'stage-0': {
29
- plugins: Required<ESLint.ConfigData['plugins']>;
30
- rules: Linter.RulesRecord;
31
- };
32
21
  'react': {
33
- settings: Required<ESLint.ConfigData['settings']>;
34
22
  parserOptions: Required<ESLint.ConfigData['parserOptions']>;
23
+ settings: Required<ESLint.ConfigData['settings']>;
35
24
  };
36
25
  'react-native': {
37
26
  settings: Required<ESLint.ConfigData['settings']>;
38
27
  };
39
- 'electron': {
40
- settings: Required<ESLint.ConfigData['settings']>;
28
+ 'recommended': {
29
+ parserOptions: Required<ESLint.ConfigData['parserOptions']>;
30
+ plugins: Required<ESLint.ConfigData['plugins']>;
31
+ rules: Linter.RulesRecord;
32
+ };
33
+ 'stage-0': {
34
+ plugins: Required<ESLint.ConfigData['plugins']>;
35
+ rules: Linter.RulesRecord;
41
36
  };
42
37
  'typescript': {
38
+ rules: Linter.RulesRecord;
43
39
  settings: Required<ESLint.ConfigData['settings']>;
40
+ };
41
+ 'warnings': {
42
+ plugins: Required<ESLint.ConfigData['plugins']>;
44
43
  rules: Linter.RulesRecord;
45
44
  };
46
45
  };
46
+ rules: Required<ESLint.Plugin['rules']>;
47
47
  };
48
48
  }
49
49
 
@@ -52,6 +52,11 @@ declare module 'eslint-plugin-jest' {
52
52
  export default {} as WithRequired<ESLint.Plugin, 'environments'>;
53
53
  }
54
54
 
55
+ declare module 'eslint-plugin-perfectionist' {
56
+ import type { ESLint } from 'eslint';
57
+ export default {} as WithRequired<ESLint.Plugin, 'environments'>;
58
+ }
59
+
55
60
  declare module 'eslint-plugin-jsdoc' {
56
61
  import type { ESLint } from 'eslint';
57
62
  export default {} as WithRequired<ESLint.Plugin, 'environments'>;
@@ -70,10 +75,10 @@ declare module 'eslint-plugin-jsx-a11y' {
70
75
  declare module 'eslint-plugin-promise' {
71
76
  import type { ESLint } from 'eslint';
72
77
  export default {} as {
73
- rules: Required<ESLint.Plugin['rules']>;
74
78
  configs: {
75
79
  recommended: WithRequired<ESLint.ConfigData, 'plugins' | 'rules'>;
76
80
  };
81
+ rules: Required<ESLint.Plugin['rules']>;
77
82
  };
78
83
  }
79
84
 
@@ -85,10 +90,10 @@ declare module 'eslint-plugin-react' {
85
90
  declare module 'eslint-plugin-security' {
86
91
  import type { ESLint } from 'eslint';
87
92
  export default {} as {
88
- rules: Required<ESLint.Plugin['rules']>;
89
93
  configs: {
90
94
  recommended: WithRequired<ESLint.ConfigData, 'plugins' | 'rules'>;
91
95
  };
96
+ rules: Required<ESLint.Plugin['rules']>;
92
97
  };
93
98
  }
94
99
 
@@ -100,19 +105,19 @@ declare module 'eslint-plugin-unused-imports' {
100
105
  declare module 'eslint-plugin-n' {
101
106
  import type { ESLint, Linter } from 'eslint';
102
107
  export default {} as {
108
+ configs: {
109
+ 'flat/mixed-esm-and-cjs': Linter.FlatConfig;
110
+ 'flat/recommended': Linter.FlatConfig;
111
+ 'flat/recommended-module': Linter.FlatConfig;
112
+ 'flat/recommended-script': Linter.FlatConfig;
113
+ 'recommended': ESLint.ConfigData;
114
+ 'recommended-module': ESLint.ConfigData;
115
+ 'recommended-script': ESLint.ConfigData;
116
+ };
103
117
  meta: {
104
118
  name: string;
105
119
  version: string;
106
120
  };
107
121
  rules: Required<ESLint.Plugin['rules']>;
108
- configs: {
109
- 'recommended-module': ESLint.ConfigData;
110
- 'recommended-script': ESLint.ConfigData;
111
- 'recommended': ESLint.ConfigData;
112
- 'flat/recommended-module': Linter.FlatConfig;
113
- 'flat/recommended-script': Linter.FlatConfig;
114
- 'flat/recommended': Linter.FlatConfig;
115
- 'flat/mixed-esm-and-cjs': Linter.FlatConfig;
116
- };
117
122
  };
118
123
  }
@@ -3,8 +3,9 @@ import { resolve } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
 
5
5
  import { parseBuffer } from 'editorconfig';
6
- import { findUp } from './filesystem.js';
6
+
7
7
  import { expandGlob } from './expand-glob.js';
8
+ import { findUp } from './filesystem.js';
8
9
 
9
10
  /**
10
11
  * @typedef {Object} RuleSet
@@ -1,5 +1,5 @@
1
- import { getPackageJson } from './package.js';
2
1
  import { expandGlob } from './expand-glob.js';
2
+ import { getPackageJson } from './package.js';
3
3
 
4
4
  /**
5
5
  * @param {string[]} files [description]
@@ -1,5 +1,5 @@
1
- import * as Path from 'node:path';
2
1
  import { stat } from 'node:fs/promises';
2
+ import * as Path from 'node:path';
3
3
 
4
4
  /**
5
5
  * @param {string} path The absolute path to the file to check
@@ -1,6 +1,7 @@
1
- import { createRequire } from 'node:module';
2
1
  import { readFile } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
3
  import { fileURLToPath } from 'node:url';
4
+
4
5
  import { findUp } from './filesystem.js';
5
6
 
6
7
  const errorCodesToSkip = new Set([
@@ -1,2 +1,2 @@
1
1
  export default config;
2
- declare const config: import("eslint").Linter.FlatConfig<import("eslint").Linter.RulesRecord>[];
2
+ declare const config: import("eslint").Linter.FlatConfig[];
@@ -3,4 +3,4 @@
3
3
  * @param {import('node:url').URL} root root url
4
4
  * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
5
5
  */
6
- export function createStyleConfigs(root: import("node:url").URL): Promise<import("eslint").Linter.FlatConfig[]>;
6
+ export function createStyleConfig(root: import("node:url").URL): Promise<import("eslint").Linter.FlatConfig[]>;
@@ -3,4 +3,4 @@
3
3
  * @param {URL} root root url
4
4
  * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
5
5
  */
6
- export function createEslintNodeConfigs(root: URL): Promise<import("eslint").Linter.FlatConfig[]>;
6
+ export function createEslintNodeConfig(root: URL): Promise<import("eslint").Linter.FlatConfig[]>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Get ESLint config for imports check
3
+ * @param {URL} root The root of the package being linted
4
+ * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
5
+ */
6
+ export function createEslintPerfectionistConfig(root: URL): Promise<import("eslint").Linter.FlatConfig[]>;
@@ -1,124 +0,0 @@
1
- import jest from 'eslint-plugin-jest';
2
- import { getPackageJson } from '../utilities/package.js';
3
- import { expandGlob } from '../utilities/expand-glob.js';
4
-
5
- const { globals } = jest.environments.globals;
6
-
7
- /**
8
- * Get ESLint config jest plugin
9
- * @param {import('node:url').URL} root root url
10
- * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
11
- */
12
- export async function createEslintJestConfig(root) {
13
- const packageJson = await getPackageJson(root, 'jest');
14
-
15
- // Jest not installed
16
- if (packageJson == null) {
17
- return [];
18
- }
19
-
20
- return [
21
- {
22
- files: expandGlob('**/*.{test,spec}.{js,ts}'),
23
- plugins: { jest },
24
- languageOptions: { globals },
25
- settings: {
26
- jest: { version: packageJson?.version },
27
- // node: { allowModules: [ '@jest/globals' ] },
28
- },
29
- rules: {
30
- 'max-lines': 'off',
31
- 'max-lines-per-function': 'off',
32
- 'max-nested-callbacks': 'off',
33
- 'class-methods-use-this': 'off',
34
-
35
- 'i6-custom-rules/moment/no-date': 'off',
36
- 'import/no-webpack-loader-syntax': 'off',
37
- 'import/first': 'off',
38
- // 'node/no-extraneous-import': 'off',
39
- 'sonarjs/no-duplicate-string': 'off',
40
-
41
- 'jest/consistent-test-it': [
42
- 'error', {
43
- fn: 'test',
44
- withinDescribe: 'test',
45
- },
46
- ],
47
- 'jest/expect-expect': [
48
- 'error',
49
- { assertFunctionNames: [ 'expect' ] },
50
- ],
51
- 'jest/lowercase-name': 'off',
52
- 'jest/no-alias-methods': 'error',
53
-
54
- 'jest/no-commented-out-tests': 'error',
55
- 'jest/no-disabled-tests': 'warn',
56
- 'jest/no-focused-tests': 'warn',
57
-
58
- 'jest/no-duplicate-hooks': 'error',
59
- 'jest/no-export': 'error',
60
- 'jest/no-hooks': 'off',
61
- 'jest/no-identical-title': 'error',
62
- 'jest/no-jasmine-globals': 'error',
63
- 'jest/no-large-snapshots': 'off',
64
- 'jest/no-mocks-import': 'error',
65
- 'jest/prefer-snapshot-hint': 'off',
66
-
67
- 'jest/no-conditional-expect': 'error',
68
- 'jest/no-conditional-in-test': 'warn',
69
- 'jest/no-deprecated-functions': 'error',
70
- 'jest/no-restricted-jest-methods': 'off',
71
- 'jest/no-restricted-matchers': [
72
- 'error',
73
- {
74
- toBeTruthy: 'Avoid `toBeTruthy`',
75
- toBeFalsy: 'Avoid `toBeFalsy`',
76
- resolves: 'Use `expect(await promise)` instead.',
77
- },
78
- ],
79
-
80
- 'jest/no-done-callback': 'error',
81
- 'jest/no-standalone-expect': 'error',
82
- 'jest/no-test-prefixes': 'error',
83
- 'jest/no-test-return-statement': 'error',
84
- 'jest/prefer-called-with': 'warn',
85
- 'jest/prefer-expect-assertions': [ 'warn', { onlyFunctionsWithAsyncKeyword: true } ],
86
- 'jest/prefer-comparison-matcher': 'warn',
87
- 'jest/prefer-equality-matcher': 'warn',
88
- 'jest/prefer-hooks-in-order': 'warn',
89
- 'jest/prefer-hooks-on-top': 'warn',
90
- 'jest/prefer-to-be': 'warn',
91
- 'jest/prefer-to-contain': 'warn',
92
- 'jest/prefer-to-have-length': 'warn',
93
- 'jest/prefer-todo': 'warn',
94
- 'jest/require-to-throw-message': 'error',
95
- 'jest/require-top-level-describe': 'error',
96
- 'jest/valid-describe-callback': 'error',
97
- 'jest/valid-expect': 'error',
98
- 'jest/valid-expect-in-promise': 'error',
99
- 'jest/valid-title': 'error',
100
-
101
- 'jest/prefer-spy-on': 'warn',
102
- 'jest/prefer-strict-equal': 'error',
103
- },
104
- },
105
- {
106
- files: [
107
- '**/jest.{js,ts}',
108
- '**/jest/**/*.{js,ts}',
109
- '**/__mocks__/**/*.{js,ts}',
110
- '**/test/**/*.{js,ts}',
111
- '**/spec/**/*.{js,ts}',
112
- '**/*.spec.ts',
113
- '**/*.test.ts',
114
- ],
115
- languageOptions: {
116
- globals: {
117
- __filename: true,
118
- __dirname: true,
119
- ...globals,
120
- },
121
- },
122
- },
123
- ];
124
- }
@@ -1,100 +0,0 @@
1
- import jsxa11y from 'eslint-plugin-jsx-a11y';
2
-
3
- /** @type {import('eslint').Linter.RulesRecord} */
4
- const rules = {
5
- 'jsx-a11y/alt-text': 'error',
6
- 'jsx-a11y/anchor-ambiguous-text': 'off',
7
- // TODO: error
8
- 'jsx-a11y/anchor-has-content': 'error',
9
- 'jsx-a11y/anchor-is-valid': 'error',
10
- 'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
11
- 'jsx-a11y/aria-props': 'error',
12
- 'jsx-a11y/aria-proptypes': 'error',
13
- 'jsx-a11y/aria-role': 'error',
14
- 'jsx-a11y/aria-unsupported-elements': 'error',
15
- 'jsx-a11y/autocomplete-valid': 'error',
16
- 'jsx-a11y/click-events-have-key-events': 'error',
17
- 'jsx-a11y/control-has-associated-label': [ 'off', {
18
- ignoreElements: [ 'audio', 'canvas', 'embed', 'input', 'textarea', 'tr', 'video' ],
19
- ignoreRoles: [ 'grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'row', 'tablist', 'toolbar', 'tree', 'treegrid' ],
20
- includeRoles: [ 'alert', 'dialog' ],
21
- } ],
22
- 'jsx-a11y/heading-has-content': 'error',
23
- 'jsx-a11y/html-has-lang': 'error',
24
- 'jsx-a11y/iframe-has-title': 'error',
25
- 'jsx-a11y/img-redundant-alt': 'error',
26
- 'jsx-a11y/interactive-supports-focus': [ 'error', {
27
- tabbable: [ 'button', 'checkbox', 'link', 'searchbox', 'spinbutton', 'switch', 'textbox' ],
28
- } ],
29
- 'jsx-a11y/label-has-associated-control': 'error',
30
- 'jsx-a11y/label-has-for': 'off',
31
- 'jsx-a11y/media-has-caption': 'error',
32
- 'jsx-a11y/mouse-events-have-key-events': 'error',
33
- 'jsx-a11y/no-access-key': 'error',
34
- 'jsx-a11y/no-autofocus': 'error',
35
- 'jsx-a11y/no-distracting-elements': 'error',
36
- 'jsx-a11y/no-interactive-element-to-noninteractive-role': [ 'error', {
37
- tr: [ 'none', 'presentation' ],
38
- canvas: [ 'img' ],
39
- } ],
40
- 'jsx-a11y/no-noninteractive-element-interactions': [ 'error', {
41
- handlers: [ 'onClick', 'onError', 'onLoad', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp' ],
42
- alert: [ 'onKeyUp', 'onKeyDown', 'onKeyPress' ],
43
- body: [ 'onError', 'onLoad' ],
44
- dialog: [ 'onKeyUp', 'onKeyDown', 'onKeyPress' ],
45
- iframe: [ 'onError', 'onLoad' ],
46
- img: [ 'onError', 'onLoad' ],
47
- } ],
48
- 'jsx-a11y/no-noninteractive-element-to-interactive-role': [ 'error', {
49
- ul: [ 'listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid' ],
50
- ol: [ 'listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid' ],
51
- li: [ 'menuitem', 'option', 'row', 'tab', 'treeitem' ],
52
- table: [ 'grid' ],
53
- td: [ 'gridcell' ],
54
- fieldset: [ 'radiogroup', 'presentation' ],
55
- } ],
56
- 'jsx-a11y/no-noninteractive-tabindex': [ 'error', {
57
- tags: [],
58
- roles: [ 'tabpanel' ],
59
- allowExpressionValues: true,
60
- } ],
61
- 'jsx-a11y/no-redundant-roles': 'error',
62
- 'jsx-a11y/no-static-element-interactions': [ 'error', {
63
- allowExpressionValues: true,
64
- handlers: [ 'onClick', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp' ],
65
- } ],
66
- 'jsx-a11y/role-has-required-aria-props': 'error',
67
- 'jsx-a11y/role-supports-aria-props': 'error',
68
- 'jsx-a11y/scope': 'error',
69
- 'jsx-a11y/tabindex-no-positive': 'error',
70
- };
71
-
72
- /**
73
- * Get ESLint config for imports check
74
- * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
75
- */
76
- export async function createEslintJsxA11yConfig() {
77
- return [
78
- {
79
- files: [ '**/*.jsx' ],
80
- languageOptions: {
81
- parserOptions: {
82
- ecmaFeatures: { jsx: true },
83
- },
84
- },
85
- plugins: { 'jsx-a11y': jsxa11y },
86
- rules: rules,
87
- },
88
- {
89
- files: [ '**/*.tsx' ],
90
- languageOptions: {
91
- parserOptions: {
92
- ecmaFeatures: { jsx: true },
93
- jsxPragma: null, // for @typescript/eslint-parser
94
- },
95
- },
96
- plugins: { 'jsx-a11y': jsxa11y },
97
- rules: rules,
98
- },
99
- ];
100
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * Get ESLint config jest plugin
3
- * @param {import('node:url').URL} root root url
4
- * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
5
- */
6
- export function createEslintJestConfig(root: import("node:url").URL): Promise<import("eslint").Linter.FlatConfig[]>;
@@ -1,5 +0,0 @@
1
- /**
2
- * Get ESLint config for imports check
3
- * @returns {Promise<import('eslint').Linter.FlatConfig[]>}
4
- */
5
- export function createEslintJsxA11yConfig(): Promise<import("eslint").Linter.FlatConfig[]>;