linter-bundle 2.24.0 → 2.25.1

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
@@ -6,7 +6,41 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v2.24.0...HEAD)
9
+ [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v2.25.1...HEAD)
10
+
11
+ ## [2.25.1] - 2022-10-20
12
+
13
+ ### Removed
14
+
15
+ - [eslint/overrides-react] Revert: Replaced deprecated `react/jsx-sort-default-props` rule by new [`react/sort-default-props`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/sort-default-props.md) rule
16
+ - [eslint/overrides-react] Revert: Activate `allowDestructuredState` option of [`react/hook-use-state`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/hook-use-state.md) rule
17
+
18
+ [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v2.25.0...v2.25.1)
19
+
20
+ ## [2.25.0] - 2022-10-20
21
+
22
+ ### Changed
23
+
24
+ - [eslint] Updated `@typescript-eslint` from `5.38.0` to `5.40.1`
25
+ - [eslint] Updated `eslint` from `8.23.1` to `8.25.0`
26
+ - [eslint] Updated `eslint-import-resolver-typescript` from `3.5.1` to `3.5.2`
27
+ - [eslint] Updated `eslint-plugin-functional` from `4.4.0` to `4.4.1`
28
+ - [eslint] Updated `eslint-plugin-jest` from `27.0.4` to `27.1.3`
29
+ - [eslint] Updated `eslint-plugin-jsdoc` from `39.3.6` to `39.3.14`
30
+ - [eslint] Updated `eslint-plugin-promise` from `6.0.1` to `6.1.1`
31
+ - [eslint] Updated `eslint-plugin-react` from `7.31.8` to `7.31.10`
32
+ - [eslint] Updated `eslint-plugin-unicorn` from `43.0.2` to `44.0.2`
33
+ - [eslint] Moved `eslint-plugin-jsx-a11y` configuration to `eslint/overrides-react`
34
+ - [eslint] Added new [`logical-assignment-operators`](https://eslint.org/docs/latest/rules/logical-assignment-operators) rule with option `"always"`
35
+ - [eslint] Added new [`promise/no-multiple-resolved`](https://github.com/eslint-community/eslint-plugin-promise/blob/main/docs/rules/no-multiple-resolved.md) rule
36
+ - [eslint] Make use of new [`unicorn/no-unnecessary-await`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/no-unnecessary-await.md) rule
37
+ - [eslint] Make use of new [`unicorn/switch-case-braces`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/switch-case-braces.md) rule with option `"avoid"`
38
+ - [eslint/overrides-jest] Added but disable new [`jest/no-restricted-jest-methods`](https://github.com/jest-community/eslint-plugin-jest/blob/main/docs/rules/no-restricted-jest-methods.md) rule
39
+ - [eslint/overrides-react] Added new [`react/no-object-type-as-default-prop`](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/docs/rules/no-object-type-as-default-prop.md) rule
40
+ - [stylelint] Updated `stylelint` from `14.12.1` to `14.14.0`
41
+ - [stylelint] Ignore `!default` annotation in [`annotation-no-unknown`](https://stylelint.io/user-guide/rules/annotation-no-unknown/) rule
42
+
43
+ [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v2.24.0...v2.25.0)
10
44
 
11
45
  ## [2.24.0] - 2022-09-23
12
46
 
@@ -730,9 +764,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
730
764
  - [eslint] Make use of new [`unicorn/prefer-object-has-own`](https://github.com/sindresorhus/eslint-plugin-unicorn/blob/main/docs/rules/prefer-object-has-own.md) rule
731
765
  - [eslint] Activated [`import/no-import-module-exports`](https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-import-module-exports.md) rule
732
766
  - [eslint] Change `@typescript-eslint/method-signature-style` to `property`
733
- - [eslint/overrides-react] Activate options `forbidDefaultForRequired` and `ignoreFunctionalComponents` of `react/require-default-props` rule
734
767
  - [eslint] Make use of [`eslint-import-resolver-typescript`](https://www.npmjs.com/package/eslint-import-resolver-typescript) package
735
768
  - [eslint] Activated [`import/no-unresolved`](https://github.com/import-js/eslint-plugin-import/blob/master/docs/rules/no-unresolved.md) rule
769
+ - [eslint/overrides-react] Activate options `forbidDefaultForRequired` and `ignoreFunctionalComponents` of `react/require-default-props` rule
736
770
 
737
771
  [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v1.21.0...v1.22.0)
738
772
 
@@ -742,7 +776,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
742
776
 
743
777
  - [eslint] Updated `@typescript-eslint` from v4.24.0 to v4.25.0
744
778
  - [eslint] Updated `eslint-plugin-jsdoc` from v34.8.2 to v35.0.0
745
- - [eslint] Actived `ignoreNonDOM` option for `jsx-a11y/no-autofocus` rule
779
+ - [eslint] Activated `ignoreNonDOM` option for `jsx-a11y/no-autofocus` rule
746
780
 
747
781
  [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v1.20.0...v1.21.0)
748
782
 
@@ -762,7 +796,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
762
796
 
763
797
  ### Changed
764
798
 
765
- - [styleint] Enforce the `all` property to be the first property in `import/order`.
799
+ - [stylelint] Enforce the `all` property to be the first property in `import/order`.
766
800
 
767
801
  [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v1.18.0...v1.19.0)
768
802
 
@@ -1078,7 +1112,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1078
1112
 
1079
1113
  ### Fixed
1080
1114
 
1081
- - [tsc] Changed the way how TypeScript is resolved to prevent compatility issues if multiple TypeScript versions are installed
1115
+ - [tsc] Changed the way how TypeScript is resolved to prevent compatibility issues if multiple TypeScript versions are installed
1082
1116
 
1083
1117
  [Show all code changes](https://github.com/jens-duttke/linter-bundle/compare/v0.16.3...v0.16.4)
1084
1118
 
package/eslint/index.js CHANGED
@@ -101,142 +101,167 @@ module.exports = {
101
101
  *
102
102
  * @see https://eslint.org/docs/rules/
103
103
  */
104
-
105
- // Possible Errors
106
- 'for-direction': 'error',
107
- 'getter-return': 'error',
108
- 'no-async-promise-executor': 'error',
109
- 'no-await-in-loop': 'error',
110
- 'no-compare-neg-zero': 'error',
111
- 'no-cond-assign': 'error',
112
- 'no-console': 'error',
113
- 'no-constant-condition': 'error',
114
- 'no-control-regex': 'off', // This rule does not make sense to me
115
- 'no-debugger': 'error',
116
- 'no-dupe-args': 'error',
117
- 'no-dupe-else-if': 'error',
118
- 'no-dupe-keys': 'error',
119
- 'no-duplicate-case': 'error',
120
- 'no-empty': 'error',
121
- 'no-empty-character-class': 'error',
122
- 'no-ex-assign': 'error',
123
- 'no-extra-boolean-cast': 'error',
124
- 'no-extra-parens': 'off', // Covered by @typescript-eslint/no-extra-parens
125
- 'no-extra-semi': 'off', // Covered by @typescript-eslint/no-extra-semi
126
- 'no-func-assign': 'error',
127
- 'no-import-assign': 'error',
128
- 'no-inner-declarations': ['error', 'both'],
129
- 'no-invalid-regexp': 'error',
130
- 'no-irregular-whitespace': 'error',
131
- 'no-misleading-character-class': 'error',
132
- 'no-obj-calls': 'error',
133
- 'no-promise-executor-return': 'error',
134
- 'no-prototype-builtins': 'error',
135
- 'no-regex-spaces': 'error',
136
- 'no-setter-return': 'error',
137
- 'no-sparse-arrays': 'error',
138
- 'no-template-curly-in-string': 'error',
139
- 'no-unexpected-multiline': 'error',
140
- 'no-unreachable': 'error',
141
- 'no-unreachable-loop': 'error',
142
- 'no-unsafe-finally': 'error',
143
- 'no-unsafe-negation': 'error',
144
- 'no-unsafe-optional-chaining': 'error',
145
- 'no-unused-private-class-members': 'error',
146
- 'no-useless-backreference': 'error',
147
- 'require-atomic-updates': 'error',
148
- 'use-isnan': 'error',
149
- 'valid-typeof': ['error', { requireStringLiterals: true }],
150
-
151
- // Best Practices
152
104
  'accessor-pairs': 'error',
105
+ 'array-bracket-newline': ['error', 'consistent'],
106
+ 'array-bracket-spacing': 'error',
153
107
  'array-callback-return': 'error',
108
+ 'array-element-newline': 'off', // Line breaks should be used in such a way that maximum readability is achieved. This cannot be represented by a fixed rule.
109
+ 'arrow-body-style': 'error',
110
+ 'arrow-parens': 'error',
111
+ 'arrow-spacing': 'error',
154
112
  'block-scoped-var': 'error',
113
+ 'block-spacing': 'error',
114
+ 'brace-style': 'off', // Covered by @typescript-eslint/brace-style
115
+ 'camelcase': 'off', // Covered by @typescript-eslint/naming-convention
116
+ 'capitalized-comments': 'off',
155
117
  'class-methods-use-this': ['error', { exceptMethods: ['componentDidMount', 'componentDidUpdate', 'componentWillUnmount', 'shouldComponentUpdate'] }],
118
+ 'comma-dangle': 'off', // Covered by @typescript-eslint/comma-dangle
119
+ 'comma-spacing': 'off', // Covered by @typescript-eslint/comma-spacing
120
+ 'comma-style': 'error',
156
121
  'complexity': ['error', { max: 20 }],
122
+ 'computed-property-spacing': 'error',
157
123
  'consistent-return': 'off', // Handled by TypeScript type annotations
124
+ 'consistent-this': 'error',
125
+ 'constructor-super': 'error',
158
126
  'curly': 'error',
159
- 'default-case': 'error',
160
127
  'default-case-last': 'error',
128
+ 'default-case': 'error',
161
129
  'default-param-last': 'off', // @todo It should be valid to have optional parameters after default parameters
162
130
  'dot-location': ['error', 'property'],
163
131
  'dot-notation': 'off', // Covered by @typescript-eslint/dot-notation
132
+ 'eol-last': 'error',
164
133
  'eqeqeq': 'error',
134
+ 'for-direction': 'error',
135
+ 'func-call-spacing': 'off', // Covered by @typescript-eslint/func-call-spacing
136
+ 'func-name-matching': 'error',
137
+ 'func-names': 'error',
138
+ 'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
139
+ 'function-call-argument-newline': 'off', // @todo Multiple multi-line object arguments are not allowed, so this option is not usable right now
140
+ 'function-paren-newline': ['error', 'multiline-arguments'],
141
+ 'generator-star-spacing': 'error',
142
+ 'getter-return': 'error',
165
143
  'grouped-accessor-pairs': 'error',
166
144
  'guard-for-in': 'error',
145
+ 'id-denylist': 'error',
146
+ 'id-length': ['error', { exceptions: ['a', 'b', 'i', 'j', 'n', 'x', 'y', 'z'] }],
147
+ 'id-match': 'error',
148
+ 'implicit-arrow-linebreak': 'error',
149
+ 'indent': 'off', // Covered by @typescript-eslint/indent
150
+ 'init-declarations': 'off', // @todo It should be possible to ignore predefined consts like MAX_RADIX
151
+ 'jsx-quotes': 'error',
152
+ 'key-spacing': 'error',
153
+ 'keyword-spacing': 'error',
154
+ 'line-comment-position': 'off',
155
+ 'linebreak-style': 'error',
156
+ 'lines-around-comment': 'off', // Doesn't work with interfaces; sometimes doesn't make sense if the comment is related to the code above it
157
+ 'lines-between-class-members': 'off', // @todo Deactivated till we have a JSDoc description for all class members
158
+ 'logical-assignment-operators': ['error', 'always'],
167
159
  'max-classes-per-file': 'error',
160
+ 'max-depth': ['error', { max: 5 }],
161
+ 'max-len': ['error', {
162
+ code: 300,
163
+ tabWidth: 4,
164
+ comments: 300,
165
+ ignoreUrls: true
166
+ }],
167
+ 'max-lines-per-function': ['error', { max: 200, skipBlankLines: true, skipComments: true }],
168
+ 'max-lines': ['error', { max: 500, skipBlankLines: true, skipComments: true }],
169
+ 'max-nested-callbacks': 'error',
170
+ 'max-params': ['error', { max: 5 }],
171
+ 'max-statements-per-line': ['error', { max: 3 }],
172
+ 'max-statements': ['error', 50, { ignoreTopLevelFunctions: true }],
173
+ 'multiline-comment-style': 'off', // Comment style must be decided from case to case
174
+ 'multiline-ternary': 'off', // I would prefer this style: `(a === b ? (\ntrue\n) : {\notherwise: false\n})`, which means line-breaks should be only allowed, if the operand is wrapped into `(`, `{` or `[`.
175
+ 'new-cap': ['error', { properties: false }],
176
+ 'new-parens': 'error',
177
+ 'newline-per-chained-call': ['error', { ignoreChainWithDepth: 4 }],
168
178
  'no-alert': 'error',
179
+ 'no-array-constructor': 'off', // Covered by @typescript-eslint/no-array-constructor
180
+ 'no-async-promise-executor': 'error',
181
+ 'no-await-in-loop': 'error',
182
+ 'no-bitwise': ['error', { allow: ['^', '~', '<<', '>>', '>>>', '|=', '&=', '^=', '<<=', '>>=', '>>>='] }], // Disallow "&" and "|".
169
183
  'no-caller': 'error',
170
184
  'no-case-declarations': 'error',
185
+ 'no-class-assign': 'error',
186
+ 'no-compare-neg-zero': 'error',
187
+ 'no-cond-assign': 'error',
188
+ 'no-confusing-arrow': ['error', { allowParens: true }],
189
+ 'no-console': 'error',
190
+ 'no-const-assign': 'error',
191
+ 'no-constant-condition': 'error',
171
192
  'no-constructor-return': 'error',
193
+ 'no-continue': 'off', // If it makes the code more readable, wer are using `continue`
194
+ 'no-control-regex': 'off', // This rule does not make sense to me
195
+ 'no-debugger': 'error',
196
+ 'no-delete-var': 'error',
172
197
  'no-div-regex': 'error',
198
+ 'no-dupe-args': 'error',
199
+ 'no-dupe-class-members': 'off', // Covered by @typescript-eslint/no-dupe-class-members
200
+ 'no-dupe-else-if': 'error',
201
+ 'no-dupe-keys': 'error',
202
+ 'no-duplicate-case': 'error',
203
+ 'no-duplicate-imports': 'off', // Covered by import/no-duplicates (see https://github.com/typescript-eslint/typescript-eslint/issues/2315)
173
204
  'no-else-return': 'error',
205
+ 'no-empty-character-class': 'error',
174
206
  'no-empty-function': 'off', // Covered by @typescript-eslint/no-empty-function
175
207
  'no-empty-pattern': 'error',
208
+ 'no-empty': 'error',
176
209
  'no-eq-null': 'error',
177
210
  'no-eval': 'error',
211
+ 'no-ex-assign': 'error',
178
212
  'no-extend-native': 'error',
179
213
  'no-extra-bind': 'error',
214
+ 'no-extra-boolean-cast': 'error',
180
215
  'no-extra-label': 'error',
216
+ 'no-extra-parens': 'off', // Covered by @typescript-eslint/no-extra-parens
217
+ 'no-extra-semi': 'off', // Covered by @typescript-eslint/no-extra-semi
181
218
  'no-fallthrough': ['error', { allowEmptyCase: true }],
182
219
  'no-floating-decimal': 'error',
220
+ 'no-func-assign': 'error',
183
221
  'no-global-assign': 'error',
184
222
  'no-implicit-coercion': ['error', { disallowTemplateShorthand: true }],
185
223
  'no-implicit-globals': 'error',
186
224
  'no-implied-eval': 'error',
225
+ 'no-import-assign': 'error',
226
+ 'no-inline-comments': 'off',
227
+ 'no-inner-declarations': ['error', 'both'],
228
+ 'no-invalid-regexp': 'error',
187
229
  'no-invalid-this': 'off', // Covered by @typescript-eslint/no-invalid-this
230
+ 'no-irregular-whitespace': 'error',
188
231
  'no-iterator': 'error',
232
+ 'no-label-var': 'error',
189
233
  'no-labels': ['error', { allowLoop: true }],
190
234
  'no-lone-blocks': 'error',
235
+ 'no-lonely-if': 'off', // Covered by unicorn/no-lonely-if
191
236
  'no-loop-func': 'off', // Covered by @typescript-eslint/no-loop-func
192
237
  'no-loss-of-precision': 'off', // Covered by @typescript-eslint/no-loss-of-precision
193
238
  'no-magic-numbers': 'off', // Covered by @typescript-eslint/no-magic-numbers
239
+ 'no-misleading-character-class': 'error',
240
+ 'no-mixed-operators': 'error',
241
+ 'no-mixed-spaces-and-tabs': 'error',
242
+ 'no-multi-assign': 'error',
194
243
  'no-multi-spaces': 'error',
195
244
  'no-multi-str': 'error',
196
- 'no-new': 'error',
245
+ 'no-multiple-empty-lines': ['error', { max: 1 }],
246
+ 'no-negated-condition': 'off',
247
+ 'no-nested-ternary': 'error',
197
248
  'no-new-func': 'error',
249
+ 'no-new-object': 'error',
250
+ 'no-new-symbol': 'error',
198
251
  'no-new-wrappers': 'error',
252
+ 'no-new': 'error',
199
253
  'no-nonoctal-decimal-escape': 'error',
200
- 'no-octal': 'error',
254
+ 'no-obj-calls': 'error',
201
255
  'no-octal-escape': 'error',
256
+ 'no-octal': 'error',
202
257
  'no-param-reassign': 'off', // Parameter reassignment used wisely makes the code more readable
258
+ 'no-plusplus': 'off',
259
+ 'no-promise-executor-return': 'error',
203
260
  'no-proto': 'error',
261
+ 'no-prototype-builtins': 'error',
204
262
  'no-redeclare': 'off', // Covered by @typescript-eslint/no-redeclare
205
- 'no-return-assign': 'error',
206
- 'no-return-await': 'off', // Covered by @typescript-eslint/return-await
207
- 'no-script-url': 'error',
208
- 'no-self-assign': 'error',
209
- 'no-self-compare': 'error',
210
- 'no-sequences': 'error',
211
- 'no-throw-literal': 'off', // Covered by @typescript-eslint/no-throw-literal
212
- 'no-unmodified-loop-condition': 'error',
213
- 'no-unused-expressions': 'off', // Covered by @typescript-eslint/no-unused-expressions
214
- 'no-unused-labels': 'error',
215
- 'no-useless-call': 'off', // @todo Produces into false-positives for CharsetConverter → `internalMap.encoder.call(encoding, str.toLowerCase())`
216
- 'no-useless-catch': 'error',
217
- 'no-useless-concat': 'error',
218
- 'no-useless-escape': 'error',
219
- 'no-useless-return': 'off', // @todo Option to ignore switch-case blocks: In switch-case blocks it makes sense to keep all cases equal, instead of removing the 'return' from the last case, because this could produce bugs in later adjustments.
220
- 'no-void': 'off', // This is in conflict with @typescript-eslint/no-floating-promises which expects either `await` or `void`
221
- 'no-warning-comments': 'error',
222
- 'no-with': 'error',
223
- 'prefer-named-capture-group': 'off', // ES2018+, not supported in most browsers yet
224
- 'prefer-promise-reject-errors': 'error',
225
- 'prefer-regex-literals': 'error',
226
- 'radix': 'error',
227
- 'require-await': 'off', // Covered by @typescript-eslint/require-await
228
- 'require-unicode-regexp': 'error',
229
- 'vars-on-top': 'error',
230
- 'wrap-iife': 'error',
231
- 'yoda': 'error',
232
-
233
- // Strict Mode
234
- 'strict': 'error',
235
-
236
- // Variables
237
- 'init-declarations': 'off', // @todo It should be possible to ignore predefined consts like MAX_RADIX
238
- 'no-delete-var': 'error',
239
- 'no-label-var': 'error',
263
+ 'no-regex-spaces': 'error',
264
+ 'no-restricted-exports': 'error',
240
265
  'no-restricted-globals': [
241
266
  'error',
242
267
  {
@@ -245,6 +270,7 @@ module.exports = {
245
270
  },
246
271
  ...ensureType.array(global.linterBundleSettings?.overrides?.general?.['no-restricted-globals']?.additionalRestictions)
247
272
  ],
273
+ 'no-restricted-imports': 'off', // Covered by @typescript-eslint/no-restricted-imports
248
274
  'no-restricted-properties': [
249
275
  'error',
250
276
  ...ensureType.array(global.linterBundleSettings?.overrides?.general?.['no-restricted-properties']?.additionalRestictions)
@@ -253,146 +279,109 @@ module.exports = {
253
279
  'error',
254
280
  ...ensureType.array(global.linterBundleSettings?.overrides?.general?.['no-restricted-syntax']?.additionalRestictions)
255
281
  ],
256
- 'no-shadow': 'off', // Covered by @typescript-eslint/no-shadow
282
+ 'no-return-assign': 'error',
283
+ 'no-return-await': 'off', // Covered by @typescript-eslint/return-await
284
+ 'no-script-url': 'error',
285
+ 'no-self-assign': 'error',
286
+ 'no-self-compare': 'error',
287
+ 'no-sequences': 'error',
288
+ 'no-setter-return': 'error',
257
289
  'no-shadow-restricted-names': 'error',
258
- 'no-undef': 'off', // Covered by TypeScript
259
- 'no-undef-init': 'error',
260
- 'no-undefined': 'off', // @todo "Using the void operator to generate the value of undefined if necessary." should be disableable
261
- 'no-unused-vars': 'off', // Covered by @typescript-eslint/no-unused-vars
262
- 'no-use-before-define': 'off', // Covered by @typescript-eslint/no-use-before-define
263
-
264
- // Stylistic Issues
265
- 'array-bracket-newline': ['error', 'consistent'],
266
- 'array-bracket-spacing': 'error',
267
- 'array-element-newline': 'off', // Line breaks should be used in such a way that maximum readability is achieved. This cannot be represented by a fixed rule.
268
- 'block-spacing': 'error',
269
- 'brace-style': 'off', // Covered by @typescript-eslint/brace-style
270
- 'camelcase': 'off', // Covered by @typescript-eslint/naming-convention
271
- 'capitalized-comments': 'off',
272
- 'comma-dangle': 'off', // Covered by @typescript-eslint/comma-dangle
273
- 'comma-spacing': 'off', // Covered by @typescript-eslint/comma-spacing
274
- 'comma-style': 'error',
275
- 'computed-property-spacing': 'error',
276
- 'consistent-this': 'error',
277
- 'eol-last': 'error',
278
- 'func-call-spacing': 'off', // Covered by @typescript-eslint/func-call-spacing
279
- 'func-name-matching': 'error',
280
- 'func-names': 'error',
281
- 'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
282
- 'function-call-argument-newline': 'off', // @todo Multiple multi-line object arguments are not allowed, so this option is not usable right now
283
- 'function-paren-newline': ['error', 'multiline-arguments'],
284
- 'id-denylist': 'error',
285
- 'id-length': ['error', { exceptions: ['a', 'b', 'i', 'j', 'n', 'x', 'y', 'z'] }],
286
- 'id-match': 'error',
287
- 'implicit-arrow-linebreak': 'error',
288
- 'indent': 'off', // Covered by @typescript-eslint/indent
289
- 'jsx-quotes': 'error',
290
- 'key-spacing': 'error',
291
- 'keyword-spacing': 'error',
292
- 'line-comment-position': 'off',
293
- 'linebreak-style': 'error',
294
- 'lines-around-comment': 'off', // Doesn't work with interfaces; sometimes doesn't make sense if the comment is related to the code above it
295
- 'lines-between-class-members': 'off', // @todo Deactivated till we have a JSDoc description for all class members
296
- 'max-depth': ['error', { max: 5 }],
297
- 'max-len': ['error', {
298
- code: 300,
299
- tabWidth: 4,
300
- comments: 300,
301
- ignoreUrls: true
302
- }],
303
- 'max-lines': ['error', { max: 500, skipBlankLines: true, skipComments: true }],
304
- 'max-lines-per-function': ['error', { max: 200, skipBlankLines: true, skipComments: true }],
305
- 'max-nested-callbacks': 'error',
306
- 'max-params': ['error', { max: 5 }],
307
- 'max-statements': ['error', 50, { ignoreTopLevelFunctions: true }],
308
- 'max-statements-per-line': ['error', { max: 3 }],
309
- 'multiline-comment-style': 'off', // Comment style must be decided from case to case
310
- 'multiline-ternary': 'off', // I would prefer this style: `(a === b ? (\ntrue\n) : {\notherwise: false\n})`, which means line-breaks should be only allowed, if the operand is wrapped into `(`, `{` or `[`.
311
- 'new-cap': ['error', { properties: false }],
312
- 'new-parens': 'error',
313
- 'newline-per-chained-call': ['error', { ignoreChainWithDepth: 4 }],
314
- 'no-array-constructor': 'off', // Covered by @typescript-eslint/no-array-constructor
315
- 'no-bitwise': ['error', { allow: ['^', '~', '<<', '>>', '>>>', '|=', '&=', '^=', '<<=', '>>=', '>>>='] }], // Disallow "&" and "|".
316
- 'no-continue': 'off', // If it makes the code more readable, wer are using `continue`
317
- 'no-inline-comments': 'off',
318
- 'no-lonely-if': 'off', // Covered by unicorn/no-lonely-if
319
- 'no-mixed-operators': 'error',
320
- 'no-mixed-spaces-and-tabs': 'error',
321
- 'no-multi-assign': 'error',
322
- 'no-multiple-empty-lines': ['error', { max: 1 }],
323
- 'no-negated-condition': 'off',
324
- 'no-nested-ternary': 'error',
325
- 'no-new-object': 'error',
326
- 'no-plusplus': 'off',
290
+ 'no-shadow': 'off', // Covered by @typescript-eslint/no-shadow
291
+ 'no-sparse-arrays': 'error',
327
292
  'no-tabs': ['error', { allowIndentationTabs: true }],
293
+ 'no-template-curly-in-string': 'error',
328
294
  'no-ternary': 'off',
295
+ 'no-this-before-super': 'error',
296
+ 'no-throw-literal': 'off', // Covered by @typescript-eslint/no-throw-literal
329
297
  'no-trailing-spaces': 'error',
298
+ 'no-undef-init': 'error',
299
+ 'no-undef': 'off', // Covered by TypeScript
300
+ 'no-undefined': 'off', // @todo "Using the void operator to generate the value of undefined if necessary." should be disableable
330
301
  'no-underscore-dangle': ['error', { allow: ['__DEV__'], allowAfterThis: true }],
302
+ 'no-unexpected-multiline': 'error',
303
+ 'no-unmodified-loop-condition': 'error',
331
304
  'no-unneeded-ternary': 'error',
305
+ 'no-unreachable-loop': 'error',
306
+ 'no-unreachable': 'error',
307
+ 'no-unsafe-finally': 'error',
308
+ 'no-unsafe-negation': 'error',
309
+ 'no-unsafe-optional-chaining': 'error',
310
+ 'no-unused-expressions': 'off', // Covered by @typescript-eslint/no-unused-expressions
311
+ 'no-unused-labels': 'error',
312
+ 'no-unused-private-class-members': 'error',
313
+ 'no-unused-vars': 'off', // Covered by @typescript-eslint/no-unused-vars
314
+ 'no-use-before-define': 'off', // Covered by @typescript-eslint/no-use-before-define
315
+ 'no-useless-backreference': 'error',
316
+ 'no-useless-call': 'off', // @todo Produces into false-positives for CharsetConverter → `internalMap.encoder.call(encoding, str.toLowerCase())`
317
+ 'no-useless-catch': 'error',
318
+ 'no-useless-computed-key': 'error',
319
+ 'no-useless-concat': 'error',
320
+ 'no-useless-constructor': 'off', // Covered by @typescript-eslint/no-useless-constructor
321
+ 'no-useless-escape': 'error',
322
+ 'no-useless-rename': 'error',
323
+ 'no-useless-return': 'off', // @todo Option to ignore switch-case blocks: In switch-case blocks it makes sense to keep all cases equal, instead of removing the 'return' from the last case, because this could produce bugs in later adjustments.
324
+ 'no-var': 'error',
325
+ 'no-void': 'off', // This is in conflict with @typescript-eslint/no-floating-promises which expects either `await` or `void`
326
+ 'no-warning-comments': 'error',
332
327
  'no-whitespace-before-property': 'error',
328
+ 'no-with': 'error',
333
329
  'nonblock-statement-body-position': 'error',
334
330
  'object-curly-newline': 'error',
335
331
  'object-curly-spacing': 'off', // Covered by @typescript-eslint/object-curly-spacing
336
332
  'object-property-newline': ['error', { allowAllPropertiesOnSameLine: true }],
337
- 'one-var': ['error', { initialized: 'never', uninitialized: 'never' }],
333
+ 'object-shorthand': 'error',
338
334
  'one-var-declaration-per-line': 'error',
335
+ 'one-var': ['error', { initialized: 'never', uninitialized: 'never' }],
339
336
  'operator-assignment': 'error',
340
337
  'operator-linebreak': ['error', 'after', { overrides: { ':': 'ignore' } }],
341
338
  'padded-blocks': ['error', 'never'],
342
339
  'padding-line-between-statements': 'error',
340
+ 'prefer-arrow-callback': ['error', { allowNamedFunctions: true }],
341
+ 'prefer-const': 'error',
342
+ 'prefer-destructuring': 'off', // We don't prefer destructuring if a type is specified ['error', { VariableDeclarator: { array: true, object: true }, AssignmentExpression: { array: false, object: false } }],
343
343
  'prefer-exponentiation-operator': 'error',
344
+ 'prefer-named-capture-group': 'off', // ES2018+, not supported in most browsers yet
345
+ 'prefer-numeric-literals': 'error',
344
346
  'prefer-object-spread': 'error',
347
+ 'prefer-promise-reject-errors': 'error',
348
+ 'prefer-regex-literals': 'error',
349
+ 'prefer-rest-params': 'error',
350
+ 'prefer-spread': 'error',
351
+ 'prefer-template': 'error',
345
352
  'quote-props': ['error', 'consistent-as-needed'],
346
353
  'quotes': 'off', // Covered by @typescript-eslint/quotes
347
- 'semi': 'off', // Covered by @typescript-eslint/semi
354
+ 'radix': 'error',
355
+ 'require-atomic-updates': 'error',
356
+ 'require-await': 'off', // Covered by @typescript-eslint/require-await
357
+ 'require-unicode-regexp': 'error',
358
+ 'require-yield': 'error',
359
+ 'rest-spread-spacing': 'error',
348
360
  'semi-spacing': 'error',
349
361
  'semi-style': 'error',
362
+ 'semi': 'off', // Covered by @typescript-eslint/semi
363
+ 'sort-imports': 'off', // import/order
350
364
  'sort-keys': 'off', // Keys should be grouped by their scope/category, not by their name
351
- 'sort-vars': 'off', // Something like `for (let pos = 4 + addressLength, dataPos = 0; pos < length - 2; pos += 2, dataPos++) {` should be sorted by importanance
365
+ 'sort-vars': 'off', // Something like `for (let pos = 4 + addressLength, dataPos = 0; pos < length - 2; pos += 2, dataPos++) {` should be sorted by importance
352
366
  'space-before-blocks': 'error',
353
367
  'space-before-function-paren': 'off', // Covered by @typescript-eslint/space-before-function-paren
354
368
  'space-in-parens': 'error',
355
369
  'space-infix-ops': 'off', // Covered by @typescript-eslint/space-infix-ops
356
370
  'space-unary-ops': 'error',
357
371
  'spaced-comment': ['error', 'always', { markers: ['/'], block: { markers: ['!'], balanced: true } }],
372
+ 'strict': 'error',
358
373
  'switch-colon-spacing': 'error',
374
+ 'symbol-description': 'error',
375
+ 'template-curly-spacing': 'error',
359
376
  'template-tag-spacing': 'error',
360
377
  'unicode-bom': 'error',
378
+ 'use-isnan': 'error',
379
+ 'valid-typeof': ['error', { requireStringLiterals: true }],
380
+ 'vars-on-top': 'error',
381
+ 'wrap-iife': 'error',
361
382
  'wrap-regex': 'error',
362
-
363
- // ECMAScript 6
364
- 'arrow-body-style': 'error',
365
- 'arrow-parens': 'error',
366
- 'arrow-spacing': 'error',
367
- 'constructor-super': 'error',
368
- 'generator-star-spacing': 'error',
369
- 'no-class-assign': 'error',
370
- 'no-confusing-arrow': ['error', { allowParens: true }],
371
- 'no-const-assign': 'error',
372
- 'no-dupe-class-members': 'off', // Covered by @typescript-eslint/no-dupe-class-members
373
- 'no-duplicate-imports': 'off', // Covered by import/no-duplicates (see https://github.com/typescript-eslint/typescript-eslint/issues/2315)
374
- 'no-new-symbol': 'error',
375
- 'no-restricted-exports': 'error',
376
- 'no-restricted-imports': 'off', // Covered by @typescript-eslint/no-restricted-imports
377
- 'no-this-before-super': 'error',
378
- 'no-useless-computed-key': 'error',
379
- 'no-useless-constructor': 'off', // Covered by @typescript-eslint/no-useless-constructor
380
- 'no-useless-rename': 'error',
381
- 'no-var': 'error',
382
- 'object-shorthand': 'error',
383
- 'prefer-arrow-callback': ['error', { allowNamedFunctions: true }],
384
- 'prefer-const': 'error',
385
- 'prefer-destructuring': 'off', // We don't prefer destructuring if a type is specified ['error', { VariableDeclarator: { array: true, object: true }, AssignmentExpression: { array: false, object: false } }],
386
- 'prefer-numeric-literals': 'error',
387
- 'prefer-rest-params': 'error',
388
- 'prefer-spread': 'error',
389
- 'prefer-template': 'error',
390
- 'require-yield': 'error',
391
- 'rest-spread-spacing': 'error',
392
- 'sort-imports': 'off', // import/order
393
- 'symbol-description': 'error',
394
- 'template-curly-spacing': 'error',
395
383
  'yield-star-spacing': ['error', { before: true, after: false }],
384
+ 'yoda': 'error',
396
385
 
397
386
  /**
398
387
  * typescript-eslint
@@ -845,43 +834,6 @@ module.exports = {
845
834
  'import/prefer-default-export': 'off',
846
835
  'import/unambiguous': 'off',
847
836
 
848
- /**
849
- * eslint-plugin-jsx-a11y
850
- *
851
- * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y
852
- */
853
- 'jsx-a11y/alt-text': 'error',
854
- 'jsx-a11y/anchor-has-content': 'error',
855
- 'jsx-a11y/anchor-is-valid': 'error',
856
- 'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
857
- 'jsx-a11y/aria-props': 'error',
858
- 'jsx-a11y/aria-proptypes': 'error',
859
- 'jsx-a11y/aria-role': 'error',
860
- 'jsx-a11y/aria-unsupported-elements': 'error',
861
- 'jsx-a11y/autocomplete-valid': 'error',
862
- 'jsx-a11y/click-events-have-key-events': 'error',
863
- 'jsx-a11y/heading-has-content': 'error',
864
- 'jsx-a11y/html-has-lang': 'off', // <html> elements set by react-helmet automatically have a lang attribute set
865
- 'jsx-a11y/iframe-has-title': 'error',
866
- 'jsx-a11y/img-redundant-alt': 'error',
867
- 'jsx-a11y/interactive-supports-focus': 'error',
868
- 'jsx-a11y/label-has-associated-control': 'error',
869
- 'jsx-a11y/media-has-caption': 'error',
870
- 'jsx-a11y/mouse-events-have-key-events': 'error',
871
- 'jsx-a11y/no-access-key': 'off', // If you explicitly specify an access key, you usually have a reason for this, so it should not be prevented by a rule
872
- 'jsx-a11y/no-autofocus': ['error', { ignoreNonDOM: true }],
873
- 'jsx-a11y/no-distracting-elements': 'error',
874
- 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'error',
875
- 'jsx-a11y/no-noninteractive-element-interactions': 'error',
876
- 'jsx-a11y/no-noninteractive-element-to-interactive-role': 'error',
877
- 'jsx-a11y/no-noninteractive-tabindex': 'error',
878
- 'jsx-a11y/no-redundant-roles': 'error',
879
- 'jsx-a11y/no-static-element-interactions': 'error',
880
- 'jsx-a11y/role-has-required-aria-props': 'error',
881
- 'jsx-a11y/role-supports-aria-props': 'error',
882
- 'jsx-a11y/scope': 'error',
883
- 'jsx-a11y/tabindex-no-positive': 'error',
884
-
885
837
  /**
886
838
  * eslint-plugin-eslint-comments
887
839
  *
@@ -906,6 +858,7 @@ module.exports = {
906
858
  'promise/avoid-new': 'off',
907
859
  'promise/catch-or-return': 'error',
908
860
  'promise/no-callback-in-promise': 'off',
861
+ 'promise/no-multiple-resolved': 'error',
909
862
  'promise/no-native': 'off',
910
863
  'promise/no-nesting': 'off',
911
864
  'promise/no-new-statics': 'error',
@@ -967,6 +920,7 @@ module.exports = {
967
920
  'unicorn/no-static-only-class': 'error',
968
921
  'unicorn/no-thenable': 'error',
969
922
  'unicorn/no-this-assignment': 'error',
923
+ 'unicorn/no-unnecessary-await': 'error',
970
924
  'unicorn/no-unreadable-array-destructuring': 'error',
971
925
  'unicorn/no-unreadable-iife': 'error',
972
926
  'unicorn/no-unsafe-regex': 'off',
@@ -1037,6 +991,7 @@ module.exports = {
1037
991
  '->': '→'
1038
992
  }
1039
993
  }],
994
+ 'unicorn/switch-case-braces': ['error', 'avoid'],
1040
995
  'unicorn/template-indent': 'error',
1041
996
  'unicorn/text-encoding-identifier-case': 'off',
1042
997
  'unicorn/throw-new-error': 'error'
@@ -51,40 +51,32 @@ module.exports = {
51
51
  *
52
52
  * @see https://github.com/eslint-community/eslint-plugin-n
53
53
  */
54
-
55
- // Possible Errors
54
+ 'n/callback-return': 'error',
55
+ 'n/exports-style': 'error',
56
+ 'n/file-extension-in-import': 'error',
57
+ 'n/global-require': 'off',
56
58
  'n/handle-callback-err': 'error',
57
59
  'n/no-callback-literal': 'error',
60
+ 'n/no-deprecated-api': 'error',
58
61
  'n/no-exports-assign': 'error',
59
62
  'n/no-extraneous-import': 'error',
60
63
  'n/no-extraneous-require': 'error',
61
64
  'n/no-missing-import': 'error',
62
65
  'n/no-missing-require': 'error',
66
+ 'n/no-mixed-requires': 'error',
63
67
  'n/no-new-require': 'error',
64
68
  'n/no-path-concat': 'error',
69
+ 'n/no-process-env': 'error',
65
70
  'n/no-process-exit': 'error',
71
+ 'n/no-restricted-import': 'error',
72
+ 'n/no-restricted-require': 'error',
73
+ 'n/no-sync': 'off', // Since the .js files are used in the CLI, preventing the use of sync functions is not required
66
74
  'n/no-unpublished-bin': 'error',
67
75
  'n/no-unpublished-import': 'error',
68
76
  'n/no-unpublished-require': 'off', // Since we use .js files only for the dev-environment, we don't need this rule
69
77
  'n/no-unsupported-features/es-builtins': 'error',
70
78
  'n/no-unsupported-features/es-syntax': 'error',
71
79
  'n/no-unsupported-features/node-builtins': 'error',
72
- 'n/process-exit-as-throw': 'error',
73
- 'n/shebang': 'error',
74
-
75
- // Best Practices
76
- 'n/no-deprecated-api': 'error',
77
-
78
- // Stylistic Issues
79
- 'n/callback-return': 'error',
80
- 'n/exports-style': 'error',
81
- 'n/file-extension-in-import': 'error',
82
- 'n/global-require': 'off',
83
- 'n/no-mixed-requires': 'error',
84
- 'n/no-process-env': 'error',
85
- 'n/no-restricted-import': 'error',
86
- 'n/no-restricted-require': 'error',
87
- 'n/no-sync': 'off', // Since the .js files are used in the CLI, preventing the use of sync functions is not required
88
80
  'n/prefer-global/buffer': 'error',
89
81
  'n/prefer-global/console': 'error',
90
82
  'n/prefer-global/process': 'error',
@@ -94,6 +86,8 @@ module.exports = {
94
86
  'n/prefer-global/url': 'error',
95
87
  'n/prefer-promises/dns': 'error',
96
88
  'n/prefer-promises/fs': 'error',
89
+ 'n/process-exit-as-throw': 'error',
90
+ 'n/shebang': 'error',
97
91
 
98
92
  /**
99
93
  * eslint-plugin-unicorn
@@ -80,6 +80,7 @@ module.exports = {
80
80
  'jest/no-jasmine-globals': 'error',
81
81
  'jest/no-large-snapshots': 'error',
82
82
  'jest/no-mocks-import': 'error',
83
+ 'jest/no-restricted-jest-methods': 'off', // Right now, there are no specific restrictions
83
84
  'jest/no-restricted-matchers': ['error', {
84
85
  resolves: 'Use `expect(await promise)` instead.',
85
86
  toBeFalsy: 'Avoid `toBeFalsy`',
@@ -29,6 +29,43 @@ module.exports = {
29
29
  ]
30
30
  }],
31
31
 
32
+ /**
33
+ * eslint-plugin-jsx-a11y
34
+ *
35
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y
36
+ */
37
+ 'jsx-a11y/alt-text': 'error',
38
+ 'jsx-a11y/anchor-has-content': 'error',
39
+ 'jsx-a11y/anchor-is-valid': 'error',
40
+ 'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
41
+ 'jsx-a11y/aria-props': 'error',
42
+ 'jsx-a11y/aria-proptypes': 'error',
43
+ 'jsx-a11y/aria-role': 'error',
44
+ 'jsx-a11y/aria-unsupported-elements': 'error',
45
+ 'jsx-a11y/autocomplete-valid': 'error',
46
+ 'jsx-a11y/click-events-have-key-events': 'error',
47
+ 'jsx-a11y/heading-has-content': 'error',
48
+ 'jsx-a11y/html-has-lang': 'off', // <html> elements set by react-helmet automatically have a lang attribute set
49
+ 'jsx-a11y/iframe-has-title': 'error',
50
+ 'jsx-a11y/img-redundant-alt': 'error',
51
+ 'jsx-a11y/interactive-supports-focus': 'error',
52
+ 'jsx-a11y/label-has-associated-control': 'error',
53
+ 'jsx-a11y/media-has-caption': 'error',
54
+ 'jsx-a11y/mouse-events-have-key-events': 'error',
55
+ 'jsx-a11y/no-access-key': 'off', // If you explicitly specify an access key, you usually have a reason for this, so it should not be prevented by a rule
56
+ 'jsx-a11y/no-autofocus': ['error', { ignoreNonDOM: true }],
57
+ 'jsx-a11y/no-distracting-elements': 'error',
58
+ 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'error',
59
+ 'jsx-a11y/no-noninteractive-element-interactions': 'error',
60
+ 'jsx-a11y/no-noninteractive-element-to-interactive-role': 'error',
61
+ 'jsx-a11y/no-noninteractive-tabindex': 'error',
62
+ 'jsx-a11y/no-redundant-roles': 'error',
63
+ 'jsx-a11y/no-static-element-interactions': 'error',
64
+ 'jsx-a11y/role-has-required-aria-props': 'error',
65
+ 'jsx-a11y/role-supports-aria-props': 'error',
66
+ 'jsx-a11y/scope': 'error',
67
+ 'jsx-a11y/tabindex-no-positive': 'error',
68
+
32
69
  /**
33
70
  * eslint-plugin-react-hooks
34
71
  *
@@ -60,19 +97,64 @@ module.exports = {
60
97
  ] }],
61
98
  'react/forbid-dom-props': 'error',
62
99
  'react/forbid-elements': 'error',
63
- 'react/forbid-prop-types': 'error',
64
100
  'react/forbid-foreign-prop-types': 'error',
101
+ 'react/forbid-prop-types': 'error',
65
102
  'react/function-component-definition': ['off', { // @todo Doesn't work with Component-Factories, which shall return named components `return function MyComponent () {}`, while in modules, `const MyComponent = () => {}` shall be used
66
103
  namedComponents: 'arrow-function',
67
104
  unnamedComponents: 'arrow-function'
68
105
  }],
69
- 'react/hook-use-state': 'error',
106
+ 'react/hook-use-state': 'error', // ['error', { allowDestructuredState: true }],
107
+ 'react/jsx-boolean-value': ['error', 'always'],
108
+ 'react/jsx-child-element-spacing': 'off', // @todo Why is this disabled? Could it be, that the faulty behaviour is fixed in the meantime?
109
+ 'react/jsx-closing-bracket-location': 'error',
110
+ 'react/jsx-closing-tag-location': 'error',
111
+ 'react/jsx-curly-brace-presence': ['error', { propElementValues: 'always' }],
112
+ 'react/jsx-curly-newline': 'off',
113
+ 'react/jsx-curly-spacing': 'error',
114
+ 'react/jsx-equals-spacing': 'error',
115
+ 'react/jsx-filename-extension': ['error', { extensions: ['.tsx'] }],
116
+ 'react/jsx-first-prop-new-line': 'error',
117
+ 'react/jsx-fragments': ['error', 'element'],
118
+ 'react/jsx-handler-names': 'off', // @todo There should be an option which checks if the function is used multiple times in a class (like this.closeTooltip()) - in that case, the 'handle' prefix should not be mandatory
119
+ 'react/jsx-indent-props': ['error', 'tab'],
120
+ 'react/jsx-indent': ['error', 'tab', { checkAttributes: true, indentLogicalExpressions: true }],
121
+ 'react/jsx-key': ['error', { checkKeyMustBeforeSpread: true, warnOnDuplicates: true }],
122
+ 'react/jsx-max-depth': ['error', { max: 8 }],
123
+ 'react/jsx-max-props-per-line': ['error', { maximum: { single: 5, multi: 1 } }],
124
+ 'react/jsx-newline': 'off', // @todo Why is this rule deactivated?
125
+ 'react/jsx-no-bind': ['error', { ignoreDOMComponents: true }],
126
+ 'react/jsx-no-comment-textnodes': 'error',
127
+ 'react/jsx-no-constructed-context-values': 'error',
128
+ 'react/jsx-no-duplicate-props': 'error',
129
+ 'react/jsx-no-leaked-render': 'off', // Should be covered by boolean-types in TypeScript, otherwise unnecessary type-castings from boolean to boolean would be required
130
+ 'react/jsx-no-literals': 'off',
131
+ 'react/jsx-no-script-url': 'error',
132
+ 'react/jsx-no-target-blank': ['error', { allowReferrer: true, forms: true }],
133
+ 'react/jsx-no-undef': 'error',
134
+ 'react/jsx-no-useless-fragment': ['error', { allowExpressions: true }],
135
+ 'react/jsx-one-expression-per-line': ['off', { allow: 'single-child' }], // @todo Doesn't work with something like "Text <a href="...">Link</a> More Text", which should be valid
136
+ 'react/jsx-pascal-case': ['error', { allowAllCaps: true }],
137
+ 'react/jsx-props-no-multi-spaces': 'error',
138
+ 'react/jsx-props-no-spreading': 'off',
139
+ 'react/jsx-sort-props': ['error', {
140
+ ignoreCase: true,
141
+ callbacksLast: true,
142
+ shorthandFirst: true,
143
+ shorthandLast: false,
144
+ noSortAlphabetically: true,
145
+ reservedFirst: true
146
+ }],
147
+ 'react/jsx-tag-spacing': 'error',
148
+ 'react/jsx-uses-react': 'error',
149
+ 'react/jsx-uses-vars': 'error',
150
+ 'react/jsx-wrap-multilines': 'error',
70
151
  'react/no-access-state-in-setstate': 'error',
152
+ 'react/no-adjacent-inline-elements': 'off', // @todo There is an issue if inline and block elements are mixed. Simple example: `<span>Text</span><br />` here, the space between the SPAN and BR should not be forced, because a space at the end of a line does not make sense.
71
153
  'react/no-array-index-key': 'error',
72
154
  'react/no-arrow-function-lifecycle': 'error',
73
155
  'react/no-children-prop': 'error',
74
- 'react/no-danger': 'off',
75
156
  'react/no-danger-with-children': 'error',
157
+ 'react/no-danger': 'off',
76
158
  'react/no-deprecated': 'error',
77
159
  'react/no-did-mount-set-state': 'error',
78
160
  'react/no-did-update-set-state': 'error',
@@ -82,12 +164,13 @@ module.exports = {
82
164
  'react/no-is-mounted': 'error',
83
165
  'react/no-multi-comp': 'error',
84
166
  'react/no-namespace': 'error',
167
+ 'react/no-object-type-as-default-prop': 'error',
85
168
  'react/no-redundant-should-component-update': 'error',
86
169
  'react/no-render-return-value': 'error',
87
170
  'react/no-set-state': 'off',
88
- 'react/no-typos': 'error',
89
171
  'react/no-string-refs': 'error',
90
172
  'react/no-this-in-sfc': 'error',
173
+ 'react/no-typos': 'error',
91
174
  'react/no-unescaped-entities': 'error',
92
175
  'react/no-unknown-property': 'error',
93
176
  'react/no-unsafe': 'error',
@@ -122,59 +205,12 @@ module.exports = {
122
205
  'static-methods'
123
206
  ]
124
207
  }],
208
+ 'react/jsx-sort-default-props': 'error', // sort-default-props
125
209
  'react/sort-prop-types': 'error',
126
210
  'react/state-in-constructor': 'error',
127
211
  'react/static-property-placement': 'error',
128
212
  'react/style-prop-object': 'error',
129
- 'react/void-dom-elements-no-children': 'error',
130
-
131
- // JSX-specific rules
132
- 'react/jsx-boolean-value': ['error', 'always'],
133
- 'react/jsx-child-element-spacing': 'off', // @todo Why is this disabled? Could it be, that the faulty behaviour is fixed in the meantime?
134
- 'react/jsx-closing-bracket-location': 'error',
135
- 'react/jsx-closing-tag-location': 'error',
136
- 'react/jsx-curly-newline': 'off',
137
- 'react/jsx-curly-spacing': 'error',
138
- 'react/jsx-equals-spacing': 'error',
139
- 'react/jsx-filename-extension': ['error', { extensions: ['.tsx'] }],
140
- 'react/jsx-first-prop-new-line': 'error',
141
- 'react/jsx-handler-names': 'off', // @todo There should be an option which checks if the function is used multiple times in a class (like this.closeTooltip()) - in that case, the 'handle' prefix should not be mandatory
142
- 'react/jsx-indent': ['error', 'tab', { checkAttributes: true, indentLogicalExpressions: true }],
143
- 'react/jsx-indent-props': ['error', 'tab'],
144
- 'react/jsx-key': ['error', { checkKeyMustBeforeSpread: true, warnOnDuplicates: true }],
145
- 'react/jsx-max-depth': ['error', { max: 8 }],
146
- 'react/jsx-max-props-per-line': ['error', { maximum: { single: 5, multi: 1 } }],
147
- 'react/no-adjacent-inline-elements': 'off', // @todo There is an issue if inline and block elements are mixed. Simple example: `<span>Text</span><br />` here, the space between the SPAN and BR should not be forced, because a space at the end of a line does not make sense.
148
- 'react/jsx-newline': 'off', // @todo Why is this rule deactivated?
149
- 'react/jsx-no-bind': ['error', { ignoreDOMComponents: true }],
150
- 'react/jsx-no-comment-textnodes': 'error',
151
- 'react/jsx-no-constructed-context-values': 'error',
152
- 'react/jsx-no-duplicate-props': 'error',
153
- 'react/jsx-no-leaked-render': 'off', // Should be covered by boolean-types in TypeScript, otherwise unnecessary type-castings from boolean to boolean would be required
154
- 'react/jsx-no-literals': 'off',
155
- 'react/jsx-no-script-url': 'error',
156
- 'react/jsx-no-target-blank': ['error', { allowReferrer: true, forms: true }],
157
- 'react/jsx-no-undef': 'error',
158
- 'react/jsx-no-useless-fragment': ['error', { allowExpressions: true }],
159
- 'react/jsx-one-expression-per-line': ['off', { allow: 'single-child' }], // @todo Doesn't work with something like "Text <a href="...">Link</a> More Text", which should be valid
160
- 'react/jsx-curly-brace-presence': ['error', { propElementValues: 'always' }],
161
- 'react/jsx-fragments': ['error', 'element'],
162
- 'react/jsx-pascal-case': ['error', { allowAllCaps: true }],
163
- 'react/jsx-props-no-multi-spaces': 'error',
164
- 'react/jsx-props-no-spreading': 'off',
165
- 'react/jsx-sort-default-props': 'error',
166
- 'react/jsx-sort-props': ['error', {
167
- ignoreCase: true,
168
- callbacksLast: true,
169
- shorthandFirst: true,
170
- shorthandLast: false,
171
- noSortAlphabetically: true,
172
- reservedFirst: true
173
- }],
174
- 'react/jsx-tag-spacing': 'error',
175
- 'react/jsx-uses-react': 'error',
176
- 'react/jsx-uses-vars': 'error',
177
- 'react/jsx-wrap-multilines': 'error'
213
+ 'react/void-dom-elements-no-children': 'error'
178
214
  }
179
215
  }
180
216
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linter-bundle",
3
- "version": "2.24.0",
3
+ "version": "2.25.1",
4
4
  "description": "Ready-to use bundle of linting tools, containing configurations for ESLint, stylelint and markdownlint.",
5
5
  "keywords": [
6
6
  "eslint",
@@ -40,27 +40,27 @@
40
40
  "check-outdated": "npx --yes -- check-outdated --ignore-pre-releases"
41
41
  },
42
42
  "dependencies": {
43
- "@typescript-eslint/eslint-plugin": "5.38.0",
44
- "@typescript-eslint/parser": "5.38.0",
45
- "@typescript-eslint/utils": "5.38.0",
46
- "eslint": "8.23.1",
47
- "eslint-import-resolver-typescript": "3.5.1",
43
+ "@typescript-eslint/eslint-plugin": "5.40.1",
44
+ "@typescript-eslint/parser": "5.40.1",
45
+ "@typescript-eslint/utils": "5.40.1",
46
+ "eslint": "8.25.0",
47
+ "eslint-import-resolver-typescript": "3.5.2",
48
48
  "eslint-import-resolver-webpack": "0.13.2",
49
49
  "eslint-plugin-eslint-comments": "3.2.0",
50
- "eslint-plugin-functional": "4.4.0",
50
+ "eslint-plugin-functional": "4.4.1",
51
51
  "eslint-plugin-import": "2.26.0",
52
- "eslint-plugin-jest": "27.0.4",
53
- "eslint-plugin-jsdoc": "39.3.6",
52
+ "eslint-plugin-jest": "27.1.3",
53
+ "eslint-plugin-jsdoc": "39.3.14",
54
54
  "eslint-plugin-jsx-a11y": "6.6.1",
55
55
  "eslint-plugin-n": "15.3.0",
56
- "eslint-plugin-promise": "6.0.1",
57
- "eslint-plugin-react": "7.31.8",
56
+ "eslint-plugin-promise": "6.1.1",
57
+ "eslint-plugin-react": "7.31.10",
58
58
  "eslint-plugin-react-hooks": "4.6.0",
59
- "eslint-plugin-unicorn": "43.0.2",
59
+ "eslint-plugin-unicorn": "44.0.2",
60
60
  "markdownlint-cli": "0.32.2",
61
61
  "micromatch": "4.0.5",
62
62
  "postcss-scss": "4.0.5",
63
- "stylelint": "14.12.1",
63
+ "stylelint": "14.14.0",
64
64
  "stylelint-declaration-block-no-ignored-properties": "2.5.0",
65
65
  "stylelint-order": "5.0.0",
66
66
  "stylelint-scss": "4.3.0",
@@ -72,10 +72,10 @@
72
72
  "typescript": "^4.0.0"
73
73
  },
74
74
  "devDependencies": {
75
- "@types/eslint": "8.4.6",
75
+ "@types/eslint": "8.4.7",
76
76
  "@types/micromatch": "4.0.2",
77
- "@types/node": "18.7.18",
77
+ "@types/node": "18.11.3",
78
78
  "stylelint-find-new-rules": "4.0.0",
79
- "typescript": "4.8.3"
79
+ "typescript": "4.8.4"
80
80
  }
81
81
  }
@@ -68,7 +68,7 @@ module.exports = {
68
68
  * @see https://github.com/stylelint/stylelint/tree/master/lib/rules
69
69
  */
70
70
  'alpha-value-notation': 'number', // @todo change that to 'percentage'?
71
- 'annotation-no-unknown': true,
71
+ 'annotation-no-unknown': [true, { ignoreAnnotations: 'default' }],
72
72
  'at-rule-allowed-list': null,
73
73
  'at-rule-disallowed-list': null,
74
74
  'at-rule-empty-line-before': [