@cto.af/eslint-config 3.0.2 → 4.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/rules/js.js ADDED
@@ -0,0 +1,392 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ rules: {
5
+ // Check: @, @stylistic, n
6
+
7
+ // [Possible Problems](https://eslint.org/docs/rules/#possible-problems)
8
+ 'array-callback-return': ['error', {allowImplicit: true}],
9
+ 'constructor-super': 'error',
10
+ 'for-direction': 'error',
11
+ 'getter-return': 'error',
12
+ 'no-async-promise-executor': 'error',
13
+ 'no-await-in-loop': 'off', // I'll figure these out myself.
14
+ 'no-class-assign': 'error',
15
+ 'no-compare-neg-zero': 'error',
16
+ 'no-cond-assign': 'error',
17
+ 'no-const-assign': 'error',
18
+ 'no-constant-binary-expression': 'error',
19
+ 'no-constant-condition': 'error',
20
+ 'no-constructor-return': 'error',
21
+ 'no-control-regex': 'error',
22
+ 'no-debugger': 'error',
23
+ 'no-dupe-args': 'error',
24
+ 'no-dupe-class-members': 'error',
25
+ 'no-dupe-else-if': 'error',
26
+ 'no-dupe-keys': 'error',
27
+ 'no-duplicate-case': 'error',
28
+ 'no-duplicate-imports': 'error',
29
+ 'no-empty-character-class': 'error',
30
+ 'no-empty-pattern': 'error',
31
+ 'no-ex-assign': 'error',
32
+ 'no-fallthrough': 'error',
33
+ 'no-func-assign': 'error',
34
+ 'no-import-assign': 'error',
35
+ 'no-inner-declarations': 'error',
36
+ 'no-invalid-regexp': 'error',
37
+ 'no-irregular-whitespace': 'error',
38
+ 'no-loss-of-precision': 'error',
39
+ 'no-misleading-character-class': 'error',
40
+ 'no-new-native-nonconstructor': 'error',
41
+ 'no-new-symbol': 'error',
42
+ 'no-obj-calls': 'error',
43
+ 'no-promise-executor-return': 'error',
44
+ 'no-prototype-builtins': 'error',
45
+ 'no-self-assign': 'error',
46
+ 'no-self-compare': 'error',
47
+ 'no-setter-return': 'error',
48
+ 'no-sparse-arrays': 'error',
49
+ 'no-template-curly-in-string': 'error',
50
+ 'no-this-before-super': 'error',
51
+ 'no-undef': 'error',
52
+ 'no-unexpected-multiline': 'error',
53
+ 'no-unmodified-loop-condition': 'error',
54
+ 'no-unreachable': 'error',
55
+ 'no-unreachable-loop': 'error',
56
+ 'no-unsafe-finally': 'error',
57
+ 'no-unsafe-negation': 'error',
58
+ 'no-unsafe-optional-chaining': 'error',
59
+ 'no-unused-private-class-members': 'error',
60
+ 'no-unused-vars': [
61
+ 'error', {
62
+ args: 'none',
63
+ argsIgnorePattern: '^_',
64
+ caughtErrors: 'all',
65
+ caughtErrorsIgnorePattern: '^(_|ignore)',
66
+ varsIgnorePattern: '^_',
67
+ },
68
+ ],
69
+ 'no-use-before-define': 'error',
70
+ 'no-useless-backreference': 'error',
71
+ 'require-atomic-updates': 'error',
72
+ 'use-isnan': 'error',
73
+ 'valid-typeof': ['error', {requireStringLiterals: true}],
74
+
75
+ // [Suggestions](https://eslint.org/docs/rules/#suggestions)
76
+ 'accessor-pairs': 'error',
77
+ 'arrow-body-style': ['error', 'as-needed'],
78
+ 'block-scoped-var': 'error',
79
+ 'camelcase': 'off', // If I had started with this.
80
+ 'capitalized-comments': ['error', 'always', {
81
+ ignoreConsecutiveComments: true,
82
+ ignorePattern: 'c8',
83
+ }],
84
+ 'class-methods-use-this': 'warn',
85
+ // This one is pedantic even for me.
86
+ 'complexity': 'off',
87
+ 'consistent-return': 'error',
88
+ 'consistent-this': 'off', // Not needed anymore with =>
89
+ 'curly': ['error', 'multi-line'],
90
+ // I use exhastive cases a lot, which makes the default unreachable
91
+ 'default-case': 'off',
92
+ 'default-case-last': 'error',
93
+ 'default-param-last': 'error',
94
+ 'dot-notation': 'error',
95
+ 'eqeqeq': ['error', 'always', {null: 'ignore'}],
96
+ 'func-name-matching': 'error',
97
+ 'func-names': ['error', 'as-needed'],
98
+ 'func-style': ['error', 'declaration', {allowArrowFunctions: true}],
99
+ 'grouped-accessor-pairs': 'error',
100
+ 'guard-for-in': 'error',
101
+ 'id-denylist': 'off', // Not needed
102
+ 'id-length': 'off', // Not needed
103
+ 'id-match': 'off', // Not needed
104
+ 'init-declarations': 'error',
105
+ 'line-comment-position': 'off', // I'm all over the place on these
106
+ 'logical-assignment-operators': 'off', // No.
107
+ 'max-classes-per-file': 'off', // No.
108
+ 'max-depth': 'off', // No.
109
+ 'max-lines': 'off', // No.
110
+ 'max-lines-per-function': 'off', // No.
111
+ 'max-nested-callbacks': 'off', // No.
112
+ 'max-params': ['error', 4],
113
+ 'max-statements': 'off', // No.
114
+ 'multiline-comment-style': ['error', 'separate-lines'],
115
+ 'new-cap': 'error',
116
+ 'no-alert': 'error',
117
+ 'no-array-constructor': 'error',
118
+ 'no-bitwise': 'off', // Lol. Not in these projects
119
+ 'no-caller': 'error',
120
+ 'no-case-declarations': 'error',
121
+ 'no-console': 'error',
122
+ 'no-continue': 'off', // Why?
123
+ 'no-delete-var': 'error',
124
+ 'no-div-regex': 'error',
125
+ 'no-else-return': 'error',
126
+ 'no-empty': 'error',
127
+ 'no-empty-function': 'error',
128
+ 'no-empty-static-block': 'error',
129
+ 'no-eq-null': 'off', // I disagree with this one.
130
+ 'no-eval': 'error',
131
+ 'no-extend-native': 'error',
132
+ 'no-extra-bind': 'error',
133
+ 'no-extra-boolean-cast': 'error',
134
+ 'no-extra-label': 'error',
135
+ 'no-global-assign': 'error',
136
+ 'no-implicit-coercion': 'error',
137
+ 'no-implicit-globals': 'error',
138
+ 'no-implied-eval': 'error',
139
+ 'no-inline-comments': 'off', // Meta.
140
+ 'no-invalid-this': 'error',
141
+ 'no-iterator': 'error',
142
+ 'no-label-var': 'error',
143
+ 'no-labels': 'error',
144
+ 'no-lone-blocks': 'error',
145
+ 'no-lonely-if': 'error',
146
+ 'no-loop-func': 'error',
147
+ 'no-magic-numbers': 'off', // No shot at this for node-cbor. For other projects, yes.
148
+ 'no-multi-assign': 'error',
149
+ 'no-multi-str': 'error',
150
+ 'no-negated-condition': 'error',
151
+ 'no-nested-ternary': 'error',
152
+ 'no-new': 'error',
153
+ 'no-new-func': 'error',
154
+ 'no-new-wrappers': 'warn',
155
+ 'no-nonoctal-decimal-escape': 'error',
156
+ 'no-object-constructor': 'error',
157
+ 'no-octal': 'error',
158
+ 'no-octal-escape': 'warn',
159
+ 'no-param-reassign': 'off', // I do this all the time.
160
+ 'no-plusplus': 'off', // What?
161
+ 'no-proto': 'error',
162
+ 'no-redeclare': 'error',
163
+ 'no-regex-spaces': 'error',
164
+ 'no-restricted-exports': 'off', // Not needed
165
+ 'no-restricted-globals': 'off', // Not needed
166
+ 'no-restricted-imports': 'off', // Not needed
167
+ 'no-restricted-properties': 'off', // Not needed
168
+ 'no-restricted-syntax': 'off', // Not needed
169
+ 'no-return-assign': 'error',
170
+ 'no-script-url': 'error',
171
+ 'no-sequences': 'error',
172
+ 'no-shadow': 'error',
173
+ 'no-shadow-restricted-names': 'error',
174
+ 'no-ternary': 'off', // No.
175
+ 'no-throw-literal': 'error',
176
+ 'no-undef-init': 'off', // Turns out I need this often enough
177
+ 'no-undefined': 'off', // No.
178
+ 'no-underscore-dangle': 'off', // Maybe one day.
179
+ 'no-unneeded-ternary': 'error',
180
+ 'no-unused-expressions': ['error', {allowShortCircuit: true}],
181
+ 'no-unused-labels': 'error',
182
+ 'no-useless-call': 'error',
183
+ 'no-useless-catch': 'error',
184
+ 'no-useless-computed-key': 'error',
185
+ 'no-useless-concat': 'error',
186
+ 'no-useless-constructor': 'off', // I like useless constructors
187
+ 'no-useless-escape': 'error',
188
+ 'no-useless-rename': 'error',
189
+ 'no-useless-return': 'error',
190
+ 'no-var': 'error',
191
+ 'no-void': 'error',
192
+ 'no-warning-comments': 'off', // Only turn this on periodically
193
+ 'no-with': 'error',
194
+ 'object-shorthand': 'error',
195
+ 'one-var': ['error', 'never'],
196
+ 'operator-assignment': 'error',
197
+ 'prefer-arrow-callback': 'error',
198
+ 'prefer-const': 'error',
199
+ 'prefer-destructuring': 'error',
200
+ 'prefer-exponentiation-operator': 'error',
201
+ 'prefer-named-capture-group': 'error',
202
+ 'prefer-numeric-literals': 'error',
203
+ 'prefer-object-has-own': 'off', // Not yet
204
+ 'prefer-object-spread': 'error',
205
+ 'prefer-promise-reject-errors': 'warn',
206
+ 'prefer-regex-literals': 'error',
207
+ 'prefer-rest-params': 'error',
208
+ 'prefer-spread': 'error',
209
+ 'prefer-template': 'error',
210
+ 'radix': 'error',
211
+ 'require-await': 'error',
212
+ 'require-unicode-regexp': 'off', // No.
213
+ 'require-yield': 'error',
214
+ 'sort-imports': 'error',
215
+ 'sort-keys': 'off', // Pedantic
216
+ 'sort-vars': 'off', // Pedantic
217
+ 'strict': ['error', 'global'],
218
+ 'symbol-description': 'error',
219
+ 'unicode-bom': 'error',
220
+ 'vars-on-top': 'error',
221
+ 'yoda': ['error', 'never', {exceptRange: true}],
222
+
223
+ // [Stylistc](https://eslint.style/packages/default)
224
+ '@stylistic/array-bracket-newline': ['error', 'consistent'],
225
+ '@stylistic/array-bracket-spacing': ['error', 'never'],
226
+ '@stylistic/array-element-newline': ['error', 'consistent'],
227
+ '@stylistic/arrow-parens': ['error', 'as-needed'],
228
+ '@stylistic/arrow-spacing': 'error',
229
+ '@stylistic/block-spacing': ['error', 'always'],
230
+ '@stylistic/brace-style': ['error', '1tbs'],
231
+ '@stylistic/comma-dangle': ['error', {
232
+ arrays: 'always-multiline',
233
+ objects: 'always-multiline',
234
+ imports: 'always-multiline',
235
+ exports: 'always-multiline',
236
+ functions: 'never',
237
+ enums: 'always-multiline',
238
+ tuples: 'always-multiline',
239
+ }],
240
+ '@stylistic/comma-spacing': 'error',
241
+ '@stylistic/comma-style': ['error', 'last'],
242
+ '@stylistic/computed-property-spacing': 'error',
243
+ '@stylistic/dot-location': ['error', 'property'],
244
+ '@stylistic/eol-last': 'error',
245
+ '@stylistic/func-call-spacing': 'off', // Renamed
246
+ '@stylistic/function-call-argument-newline': ['error', 'consistent'],
247
+ '@stylistic/function-call-spacing': 'error',
248
+ '@stylistic/function-paren-newline': ['error', 'consistent'],
249
+ '@stylistic/generator-star-spacing': 'error',
250
+ '@stylistic/implicit-arrow-linebreak': ['error', 'beside'],
251
+ '@stylistic/indent': ['error', 2, {SwitchCase: 1}],
252
+ '@stylistic/indent-binary-ops': 'off', // Not good enough
253
+
254
+ '@stylistic/jsx-child-element-spacing': 'off', // Not needed
255
+ '@stylistic/jsx-closing-bracket-location': 'off', // Not needed
256
+ '@stylistic/jsx-closing-tag-location': 'off', // Not needed
257
+ '@stylistic/jsx-curly-brace-presence': 'off', // Not needed
258
+ '@stylistic/jsx-curly-newline': 'off', // Not needed
259
+ '@stylistic/jsx-curly-spacing': 'off', // Not needed
260
+ '@stylistic/jsx-equals-spacing': 'off', // Not needed
261
+ '@stylistic/jsx-first-prop-new-line': 'off', // Not needed
262
+ '@stylistic/jsx-indent': 'off', // Not needed
263
+ '@stylistic/jsx-indent-props': 'off', // Not needed
264
+ '@stylistic/jsx-max-props-per-line': 'off', // Not needed
265
+ '@stylistic/jsx-newline': 'off', // Not needed
266
+ '@stylistic/jsx-one-expression-per-line': 'off', // Not needed
267
+ '@stylistic/jsx-pascal-case': 'off', // Not needed
268
+ '@stylistic/jsx-props-no-multi-spaces': 'off', // Not needed
269
+ '@stylistic/jsx-quotes': 'off', // Not needed
270
+ '@stylistic/jsx-self-closing-comp': 'off', // Not needed
271
+ '@stylistic/jsx-sort-props': 'off', // Not needed
272
+ '@stylistic/jsx-tag-spacing': 'off', // Not needed
273
+ '@stylistic/jsx-wrap-multilines': 'off', // Not needed
274
+
275
+ '@stylistic/key-spacing': 'error',
276
+ '@stylistic/keyword-spacing': 'error',
277
+ '@stylistic/linebreak-style': 'error',
278
+ '@stylistic/lines-around-comment': ['error', {
279
+ allowArrayStart: true,
280
+ allowBlockStart: true,
281
+ allowClassStart: true,
282
+ allowEnumStart: true,
283
+ allowInterfaceStart: true,
284
+ allowObjectStart: true,
285
+ allowTypeStart: true,
286
+ }],
287
+ '@stylistic/lines-between-class-members': ['error', 'always', {
288
+ exceptAfterSingleLine: true,
289
+ }],
290
+ '@stylistic/max-len': ['error', 80, {
291
+ ignoreRegExpLiterals: true,
292
+ ignoreStrings: true,
293
+ ignoreTemplateLiterals: true,
294
+ ignoreUrls: true,
295
+ }],
296
+ '@stylistic/max-statements-per-line': 'off',
297
+ '@stylistic/member-delimiter-style': 'off',
298
+ '@stylistic/multiline-ternary': ['error', 'always-multiline'],
299
+ '@stylistic/new-parens': 'error',
300
+ '@stylistic/newline-per-chained-call': 'error',
301
+ '@stylistic/no-confusing-arrow': 'error',
302
+ '@stylistic/no-extra-parens': 'off', // Too fiddly to torn off everything.
303
+ '@stylistic/no-extra-semi': 'error',
304
+ '@stylistic/no-floating-decimal': 'error',
305
+ '@stylistic/no-mixed-operators': 'error',
306
+ '@stylistic/no-mixed-spaces-and-tabs': 'error',
307
+ '@stylistic/no-multi-spaces': 'error',
308
+ '@stylistic/no-multiple-empty-lines': ['error', {max: 1}],
309
+ '@stylistic/no-tabs': 'error',
310
+ '@stylistic/no-trailing-spaces': 'error',
311
+ '@stylistic/no-whitespace-before-property': 'error',
312
+ '@stylistic/nonblock-statement-body-position': 'error',
313
+ '@stylistic/object-curly-newline': 'error',
314
+ '@stylistic/object-curly-spacing': ['error', 'never'],
315
+ '@stylistic/object-property-newline': ['error', {allowAllPropertiesOnSameLine: true}],
316
+ '@stylistic/one-var-declaration-per-line': 'error',
317
+ '@stylistic/operator-linebreak': ['error', 'after'],
318
+ '@stylistic/padded-blocks': ['error', 'never'],
319
+ '@stylistic/padding-line-between-statements': 'error',
320
+ '@stylistic/quote-props': ['error', 'consistent-as-needed'],
321
+ '@stylistic/quotes': ['error', 'single', {avoidEscape: true}],
322
+ '@stylistic/rest-spread-spacing': ['error', 'never'],
323
+ '@stylistic/semi': ['error', 'always'],
324
+ '@stylistic/semi-spacing': 'error',
325
+ '@stylistic/semi-style': ['error'],
326
+ '@stylistic/space-before-blocks': 'error',
327
+ '@stylistic/space-before-function-paren': ['error', 'never'],
328
+ '@stylistic/space-in-parens': 'error',
329
+ '@stylistic/space-infix-ops': ['error', {int32Hint: false}],
330
+ '@stylistic/space-unary-ops': 'error',
331
+ '@stylistic/spaced-comment': ['error', 'always'],
332
+ '@stylistic/switch-colon-spacing': 'error',
333
+ '@stylistic/template-curly-spacing': 'error',
334
+ '@stylistic/template-tag-spacing': 'error',
335
+ '@stylistic/type-annotation-spacing': 'off', // Not TS.
336
+ '@stylistic/type-generic-spacing': 'off', // Not TS.
337
+ '@stylistic/type-named-tuple-spacing': 'off', // Not TS.
338
+ '@stylistic/wrap-iife': 'error',
339
+ '@stylistic/wrap-regex': 'off', // No.
340
+ '@stylistic/yield-star-spacing': ['error', 'before'],
341
+
342
+ // [Possible Errors](https://github.com/eslint-community/eslint-plugin-n#possible-errors)
343
+ 'n/handle-callback-err': ['error', 'er'],
344
+ 'n/no-callback-literal': 'error',
345
+ 'n/no-exports-assign': 'error',
346
+ 'n/no-extraneous-import': 'error',
347
+ 'n/no-extraneous-require': 'error',
348
+ 'n/no-missing-import': ['error', {
349
+ allowModules: ['ava'], // Ava uses fancy new stuff, so shows up unavailable.
350
+ }],
351
+ 'n/no-missing-require': 'off', // This one doesn't work yet:
352
+ 'n/no-new-require': 'error',
353
+ 'n/no-path-concat': 'error',
354
+ 'n/no-process-exit': 'off', // No.
355
+ 'n/no-unpublished-bin': 'error',
356
+ 'n/no-unpublished-import': 'off', // Doesn't work
357
+ 'n/no-unpublished-require': 'off', // Doesn't work
358
+ 'n/no-unsupported-features/es-builtins': 'error',
359
+ 'n/no-unsupported-features/es-syntax': 'error',
360
+ 'n/no-unsupported-features/node-builtins': 'error',
361
+ 'n/process-exit-as-throw': 'error',
362
+ 'n/shebang': 'off', // This always seems to be wrong
363
+
364
+ // [Best Practices](https://github.com/eslint-community/eslint-plugin-n#best-practices)
365
+ 'n/no-deprecated-api': 'error',
366
+
367
+ // [Stylistic Issues](https://github.com/eslint-community/eslint-plugin-n#stylistic-issues)
368
+ 'n/callback-return': 'off', // No
369
+ 'n/exports-style': 'off',
370
+ // Doesn't work for `import 'regenerator-runtime/runtime'`
371
+ 'n/file-extension-in-import': 'error',
372
+ 'n/global-require': 'off',
373
+ 'n/no-mixed-requires': 'error',
374
+ // No
375
+ 'n/no-process-env': 'off',
376
+ 'n/no-restricted-import': 'off',
377
+ 'n/no-restricted-require': 'off',
378
+ 'n/no-sync': 'off',
379
+
380
+ 'n/prefer-global/buffer': ['error', 'never'],
381
+ // Hopefully only used in tests and cli
382
+ 'n/prefer-global/console': 'off',
383
+ 'n/prefer-global/process': 'off',
384
+ 'n/prefer-global/text-decoder': ['error', 'always'],
385
+ 'n/prefer-global/text-encoder': ['error', 'always'],
386
+ 'n/prefer-global/url': ['error', 'always'],
387
+ 'n/prefer-global/url-search-params': ['error', 'always'],
388
+ // Not yet
389
+ 'n/prefer-promises/dns': 'off',
390
+ 'n/prefer-promises/fs': 'off',
391
+ },
392
+ };
package/rules/jsdoc.js ADDED
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ rules: {
5
+ // Check: jsdoc
6
+ // [Stylistic Issues](https://eslint.org/docs/rules/#stylistic-issues)
7
+
8
+ 'jsdoc/check-access': 'error',
9
+ 'jsdoc/check-alignment': 'error',
10
+ // https://github.com/eslint/eslint/issues/14745
11
+ 'jsdoc/check-examples': 'off',
12
+ 'jsdoc/check-indentation': 'off',
13
+ 'jsdoc/check-line-alignment': ['error', 'never', {
14
+ wrapIndent: ' ',
15
+ }],
16
+ 'jsdoc/check-param-names': 'error',
17
+ 'jsdoc/check-property-names': 'error',
18
+ 'jsdoc/check-syntax': 'error',
19
+ 'jsdoc/check-tag-names': 'error',
20
+ 'jsdoc/check-types': 'error',
21
+ 'jsdoc/check-values': 'error',
22
+ 'jsdoc/empty-tags': 'error',
23
+ 'jsdoc/implements-on-classes': 'error',
24
+ 'jsdoc/imports-as-dependencies': 'error',
25
+ 'jsdoc/informative-docs': 'off', // This sounds annoying
26
+ 'jsdoc/match-description': 'error',
27
+ 'jsdoc/match-name': 'off',
28
+ 'jsdoc/multiline-blocks': 'error',
29
+ 'jsdoc/no-bad-blocks': 'error',
30
+ 'jsdoc/no-blank-block-descriptions': 'off', // I use blank lines intentionally
31
+ 'jsdoc/no-blank-blocks': 'error',
32
+ 'jsdoc/no-defaults': 'off',
33
+ 'jsdoc/no-missing-syntax': 'off',
34
+ 'jsdoc/no-multi-asterisks': 'error',
35
+ 'jsdoc/no-restricted-syntax': 'off',
36
+ 'jsdoc/no-types': 'off',
37
+ 'jsdoc/no-undefined-types': 'off', // Use typedoc
38
+ 'jsdoc/require-asterisk-prefix': 'error',
39
+ 'jsdoc/require-description': ['error', {exemptedBy: ['inheritdoc', 'private', 'ignore']}],
40
+ 'jsdoc/require-description-complete-sentence': 'error',
41
+ 'jsdoc/require-example': 'off',
42
+ 'jsdoc/require-file-overview': 'off',
43
+ 'jsdoc/require-hyphen-before-param-description': ['error', 'never'],
44
+ 'jsdoc/require-jsdoc': ['error', {
45
+ publicOnly: {ancestorsOnly: true},
46
+ }],
47
+ 'jsdoc/require-param': ['error', {exemptedBy: ['inheritdoc', 'private', 'ignore']}],
48
+ 'jsdoc/require-param-description': 'error',
49
+ 'jsdoc/require-param-name': 'error',
50
+ 'jsdoc/require-param-type': 'error',
51
+ 'jsdoc/require-property': 'error',
52
+ 'jsdoc/require-property-description': 'error',
53
+ 'jsdoc/require-property-name': 'error',
54
+ 'jsdoc/require-property-type': 'error',
55
+ 'jsdoc/require-returns': ['error', {
56
+ exemptedBy: ['ignore'],
57
+ }],
58
+ 'jsdoc/require-returns-check': 'error',
59
+ 'jsdoc/require-returns-description': 'error',
60
+ 'jsdoc/require-returns-type': 'error',
61
+ 'jsdoc/require-throws': 'error',
62
+ 'jsdoc/require-yields': 'error',
63
+ 'jsdoc/require-yields-check': 'error',
64
+ 'jsdoc/sort-tags': 'error',
65
+ 'jsdoc/tag-lines': 'off',
66
+ 'jsdoc/text-escaping': 'off', // Painful
67
+ 'jsdoc/valid-types': 'error',
68
+ },
69
+ };