@gooddata/eslint-config 4.1.0 → 11.4.0-alpha.4

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.
@@ -0,0 +1,790 @@
1
+ {
2
+ "plugins": [
3
+ "header",
4
+ "import",
5
+ "no-only-tests",
6
+ "sonarjs",
7
+ "tsdoc",
8
+ "eslint-comments",
9
+ "react",
10
+ "react-hooks",
11
+ "@vitest"
12
+ ],
13
+ "extends": [
14
+ "eslint:recommended",
15
+ "plugin:import/errors",
16
+ "plugin:prettier/recommended",
17
+ "plugin:regexp/recommended",
18
+ "plugin:sonarjs/recommended",
19
+ "plugin:react-hooks/recommended",
20
+ "plugin:@vitest/legacy-recommended"
21
+ ],
22
+ "rules": {
23
+ "no-console": [
24
+ 2,
25
+ {
26
+ "allow": [
27
+ "warn",
28
+ "error"
29
+ ]
30
+ }
31
+ ],
32
+ "no-duplicate-imports": "error",
33
+ "no-restricted-imports": [
34
+ "error",
35
+ {
36
+ "paths": [
37
+ {
38
+ "name": "react",
39
+ "importNames": [
40
+ "default"
41
+ ],
42
+ "message": "Default import from React is not allowed. Use named imports instead."
43
+ }
44
+ ],
45
+ "patterns": [
46
+ {
47
+ "group": [
48
+ "lodash-es"
49
+ ],
50
+ "importNames": [
51
+ "get",
52
+ "getOr"
53
+ ],
54
+ "message": "Please use the ?. and ?? operators instead."
55
+ },
56
+ {
57
+ "group": [
58
+ "lodash-es"
59
+ ],
60
+ "importNames": [
61
+ "keys"
62
+ ],
63
+ "message": "Please use Object.keys() instead."
64
+ },
65
+ {
66
+ "group": [
67
+ "lodash-es"
68
+ ],
69
+ "importNames": [
70
+ "values"
71
+ ],
72
+ "message": "Please use Object.values() instead."
73
+ },
74
+ {
75
+ "group": [
76
+ "lodash-es"
77
+ ],
78
+ "importNames": [
79
+ "entries",
80
+ "toPairs"
81
+ ],
82
+ "message": "Please use Object.entries() instead."
83
+ },
84
+ {
85
+ "group": [
86
+ "lodash-es"
87
+ ],
88
+ "importNames": [
89
+ "map"
90
+ ],
91
+ "message": "Please use Array.prototype.map() instead."
92
+ },
93
+ {
94
+ "group": [
95
+ "lodash-es"
96
+ ],
97
+ "importNames": [
98
+ "flatMap"
99
+ ],
100
+ "message": "Please use Array.prototype.flatMap() instead."
101
+ },
102
+ {
103
+ "group": [
104
+ "lodash-es"
105
+ ],
106
+ "importNames": [
107
+ "filter"
108
+ ],
109
+ "message": "Please use Array.prototype.filter() instead."
110
+ },
111
+ {
112
+ "group": [
113
+ "lodash-es"
114
+ ],
115
+ "importNames": [
116
+ "find"
117
+ ],
118
+ "message": "Please use Array.prototype.find() instead."
119
+ },
120
+ {
121
+ "group": [
122
+ "lodash-es"
123
+ ],
124
+ "importNames": [
125
+ "findIndex"
126
+ ],
127
+ "message": "Please use Array.prototype.findIndex() instead."
128
+ },
129
+ {
130
+ "group": [
131
+ "lodash-es"
132
+ ],
133
+ "importNames": [
134
+ "includes"
135
+ ],
136
+ "message": "Please use Array.prototype.includes() instead."
137
+ },
138
+ {
139
+ "group": [
140
+ "lodash-es"
141
+ ],
142
+ "importNames": [
143
+ "some"
144
+ ],
145
+ "message": "Please use Array.prototype.some() instead."
146
+ },
147
+ {
148
+ "group": [
149
+ "lodash-es"
150
+ ],
151
+ "importNames": [
152
+ "every"
153
+ ],
154
+ "message": "Please use Array.prototype.every() instead."
155
+ },
156
+ {
157
+ "group": [
158
+ "lodash-es"
159
+ ],
160
+ "importNames": [
161
+ "concat"
162
+ ],
163
+ "message": "Please use Array.prototype.concat() or spread [...arr1, ...arr2] instead."
164
+ },
165
+ {
166
+ "group": [
167
+ "lodash-es"
168
+ ],
169
+ "importNames": [
170
+ "reverse"
171
+ ],
172
+ "message": "Please use Array.prototype.reverse() instead."
173
+ },
174
+ {
175
+ "group": [
176
+ "lodash-es"
177
+ ],
178
+ "importNames": [
179
+ "slice"
180
+ ],
181
+ "message": "Please use Array.prototype.slice() instead."
182
+ },
183
+ {
184
+ "group": [
185
+ "lodash-es"
186
+ ],
187
+ "importNames": [
188
+ "indexOf"
189
+ ],
190
+ "message": "Please use Array.prototype.indexOf() instead."
191
+ },
192
+ {
193
+ "group": [
194
+ "lodash-es"
195
+ ],
196
+ "importNames": [
197
+ "lastIndexOf"
198
+ ],
199
+ "message": "Please use Array.prototype.lastIndexOf() instead."
200
+ },
201
+ {
202
+ "group": [
203
+ "lodash-es"
204
+ ],
205
+ "importNames": [
206
+ "fill"
207
+ ],
208
+ "message": "Please use Array.prototype.fill() instead."
209
+ },
210
+ {
211
+ "group": [
212
+ "lodash-es"
213
+ ],
214
+ "importNames": [
215
+ "startsWith"
216
+ ],
217
+ "message": "Please use String.prototype.startsWith() instead."
218
+ },
219
+ {
220
+ "group": [
221
+ "lodash-es"
222
+ ],
223
+ "importNames": [
224
+ "endsWith"
225
+ ],
226
+ "message": "Please use String.prototype.endsWith() instead."
227
+ },
228
+ {
229
+ "group": [
230
+ "lodash-es"
231
+ ],
232
+ "importNames": [
233
+ "repeat"
234
+ ],
235
+ "message": "Please use String.prototype.repeat() instead."
236
+ },
237
+ {
238
+ "group": [
239
+ "lodash-es"
240
+ ],
241
+ "importNames": [
242
+ "padStart"
243
+ ],
244
+ "message": "Please use String.prototype.padStart() instead."
245
+ },
246
+ {
247
+ "group": [
248
+ "lodash-es"
249
+ ],
250
+ "importNames": [
251
+ "padEnd"
252
+ ],
253
+ "message": "Please use String.prototype.padEnd() instead."
254
+ },
255
+ {
256
+ "group": [
257
+ "lodash-es"
258
+ ],
259
+ "importNames": [
260
+ "trim"
261
+ ],
262
+ "message": "Please use String.prototype.trim() instead."
263
+ },
264
+ {
265
+ "group": [
266
+ "lodash-es"
267
+ ],
268
+ "importNames": [
269
+ "trimStart",
270
+ "trimLeft"
271
+ ],
272
+ "message": "Please use String.prototype.trimStart() instead."
273
+ },
274
+ {
275
+ "group": [
276
+ "lodash-es"
277
+ ],
278
+ "importNames": [
279
+ "trimEnd",
280
+ "trimRight"
281
+ ],
282
+ "message": "Please use String.prototype.trimEnd() instead."
283
+ },
284
+ {
285
+ "group": [
286
+ "lodash-es"
287
+ ],
288
+ "importNames": [
289
+ "toUpper"
290
+ ],
291
+ "message": "Please use String.prototype.toUpperCase() instead."
292
+ },
293
+ {
294
+ "group": [
295
+ "lodash-es"
296
+ ],
297
+ "importNames": [
298
+ "toLower"
299
+ ],
300
+ "message": "Please use String.prototype.toLowerCase() instead."
301
+ },
302
+ {
303
+ "group": [
304
+ "lodash-es"
305
+ ],
306
+ "importNames": [
307
+ "isArray"
308
+ ],
309
+ "message": "Please use Array.isArray() instead."
310
+ },
311
+ {
312
+ "group": [
313
+ "lodash-es"
314
+ ],
315
+ "importNames": [
316
+ "isNaN"
317
+ ],
318
+ "message": "Please use Number.isNaN() instead."
319
+ },
320
+ {
321
+ "group": [
322
+ "lodash-es"
323
+ ],
324
+ "importNames": [
325
+ "isFinite"
326
+ ],
327
+ "message": "Please use Number.isFinite() instead."
328
+ },
329
+ {
330
+ "group": [
331
+ "lodash-es"
332
+ ],
333
+ "importNames": [
334
+ "isInteger"
335
+ ],
336
+ "message": "Please use Number.isInteger() instead."
337
+ },
338
+ {
339
+ "group": [
340
+ "lodash-es"
341
+ ],
342
+ "importNames": [
343
+ "isNull"
344
+ ],
345
+ "message": "Please use value === null instead."
346
+ },
347
+ {
348
+ "group": [
349
+ "lodash-es"
350
+ ],
351
+ "importNames": [
352
+ "isUndefined"
353
+ ],
354
+ "message": "Please use value === undefined instead."
355
+ },
356
+ {
357
+ "group": [
358
+ "lodash-es"
359
+ ],
360
+ "importNames": [
361
+ "defaultTo"
362
+ ],
363
+ "message": "Please use value ?? defaultValue instead."
364
+ },
365
+ {
366
+ "group": [
367
+ "lodash-es"
368
+ ],
369
+ "importNames": [
370
+ "assign"
371
+ ],
372
+ "message": "Please use Object.assign() or spread syntax {...obj} instead."
373
+ },
374
+ {
375
+ "group": [
376
+ "lodash-es"
377
+ ],
378
+ "importNames": [
379
+ "flatten"
380
+ ],
381
+ "message": "Please use Array.prototype.flat() instead."
382
+ },
383
+ {
384
+ "group": [
385
+ "lodash-es"
386
+ ],
387
+ "importNames": [
388
+ "flattenDeep"
389
+ ],
390
+ "message": "Please use Array.prototype.flat(Infinity) instead."
391
+ },
392
+ {
393
+ "group": [
394
+ "lodash-es"
395
+ ],
396
+ "importNames": [
397
+ "isNil"
398
+ ],
399
+ "message": "Please use value === null || value === undefined instead."
400
+ },
401
+ {
402
+ "group": [
403
+ "lodash-es"
404
+ ],
405
+ "importNames": [
406
+ "noop"
407
+ ],
408
+ "message": "Please use () => {} instead."
409
+ },
410
+ {
411
+ "group": [
412
+ "lodash-es"
413
+ ],
414
+ "importNames": [
415
+ "identity"
416
+ ],
417
+ "message": "Please use x => x instead."
418
+ },
419
+ {
420
+ "group": [
421
+ "lodash-es"
422
+ ],
423
+ "importNames": [
424
+ "first",
425
+ "head"
426
+ ],
427
+ "message": "Please use Array.prototype.at(0) instead."
428
+ },
429
+ {
430
+ "group": [
431
+ "lodash-es"
432
+ ],
433
+ "importNames": [
434
+ "last"
435
+ ],
436
+ "message": "Please use Array.prototype.at(-1) instead."
437
+ },
438
+ {
439
+ "group": [
440
+ "lodash-es"
441
+ ],
442
+ "importNames": [
443
+ "forEach"
444
+ ],
445
+ "message": "Please use Array.prototype.forEach() instead."
446
+ },
447
+ {
448
+ "group": [
449
+ "lodash-es"
450
+ ],
451
+ "importNames": [
452
+ "fromPairs"
453
+ ],
454
+ "message": "Please use Object.fromEntries() instead."
455
+ },
456
+ {
457
+ "group": [
458
+ "lodash-es"
459
+ ],
460
+ "importNames": [
461
+ "join"
462
+ ],
463
+ "message": "Please use Array.prototype.join() instead."
464
+ },
465
+ {
466
+ "group": [
467
+ "lodash-es"
468
+ ],
469
+ "importNames": [
470
+ "isDate"
471
+ ],
472
+ "message": "Please use val instanceof Date instead."
473
+ },
474
+ {
475
+ "group": [
476
+ "lodash-es"
477
+ ],
478
+ "importNames": [
479
+ "isFunction"
480
+ ],
481
+ "message": "Please use typeof val === 'function' instead."
482
+ },
483
+ {
484
+ "group": [
485
+ "lodash-es"
486
+ ],
487
+ "importNames": [
488
+ "isNumber"
489
+ ],
490
+ "message": "Please use typeof val === 'number' instead."
491
+ },
492
+ {
493
+ "group": [
494
+ "lodash-es"
495
+ ],
496
+ "importNames": [
497
+ "isObject"
498
+ ],
499
+ "message": "Please use val !== null && typeof val === 'object' instead."
500
+ },
501
+ {
502
+ "group": [
503
+ "lodash-es"
504
+ ],
505
+ "importNames": [
506
+ "isString"
507
+ ],
508
+ "message": "Please use typeof val === 'string' instead."
509
+ },
510
+ {
511
+ "group": [
512
+ "lodash-es"
513
+ ],
514
+ "importNames": [
515
+ "toString"
516
+ ],
517
+ "message": "Please use String(val) instead."
518
+ },
519
+ {
520
+ "group": [
521
+ "lodash-es"
522
+ ],
523
+ "importNames": [
524
+ "flow",
525
+ "flowRight"
526
+ ],
527
+ "message": "Please refactor your code instead."
528
+ }
529
+ ]
530
+ }
531
+ ],
532
+ "no-restricted-syntax": [
533
+ "error",
534
+ {
535
+ "selector": "MemberExpression[object.name='React']",
536
+ "message": "Do not use `React.*`. Use named imports instead."
537
+ }
538
+ ],
539
+ "sort-imports": [
540
+ "error",
541
+ {
542
+ "ignoreCase": false,
543
+ "ignoreDeclarationSort": true,
544
+ "ignoreMemberSort": false
545
+ }
546
+ ],
547
+ "no-useless-escape": "off",
548
+ "no-negated-condition": "error",
549
+ "no-unneeded-ternary": [
550
+ "error",
551
+ {
552
+ "defaultAssignment": false
553
+ }
554
+ ],
555
+ "no-extra-boolean-cast": "error",
556
+ "no-unexpected-multiline": "off",
557
+ "header/header": [
558
+ 2,
559
+ "line",
560
+ {
561
+ "pattern": "^ \\(C\\) \\d{4}(-\\d{4})? GoodData Corporation$",
562
+ "template": " (C) 2025 GoodData Corporation"
563
+ }
564
+ ],
565
+ "import/order": [
566
+ "error",
567
+ {
568
+ "pathGroups": [
569
+ {
570
+ "pattern": "react",
571
+ "group": "external",
572
+ "position": "before"
573
+ },
574
+ {
575
+ "pattern": "@gooddata/**",
576
+ "group": "external",
577
+ "position": "after"
578
+ }
579
+ ],
580
+ "groups": [
581
+ "builtin",
582
+ "external",
583
+ "internal",
584
+ [
585
+ "parent",
586
+ "sibling",
587
+ "index"
588
+ ]
589
+ ],
590
+ "pathGroupsExcludedImportTypes": [
591
+ "react"
592
+ ],
593
+ "alphabetize": {
594
+ "order": "asc",
595
+ "caseInsensitive": true
596
+ },
597
+ "newlines-between": "always"
598
+ }
599
+ ],
600
+ "import/no-unassigned-import": "error",
601
+ "no-only-tests/no-only-tests": [
602
+ "error",
603
+ {
604
+ "block": [
605
+ "fixture"
606
+ ],
607
+ "focus": [
608
+ "only"
609
+ ]
610
+ }
611
+ ],
612
+ "regexp/prefer-d": "off",
613
+ "regexp/prefer-w": "off",
614
+ "sonarjs/no-duplicate-string": "off",
615
+ "sonarjs/cognitive-complexity": "warn",
616
+ "tsdoc/syntax": "error",
617
+ "eslint-comments/no-unused-disable": "error",
618
+ "no-caller": 2,
619
+ "no-eval": 2,
620
+ "no-delete-var": 2,
621
+ "no-octal-escape": 2,
622
+ "react/no-danger": "error",
623
+ "react/prop-types": "off",
624
+ "react/function-component-definition": [
625
+ "error",
626
+ {
627
+ "namedComponents": "function-declaration",
628
+ "unnamedComponents": "arrow-function"
629
+ }
630
+ ],
631
+ "react/jsx-no-leaked-render": [
632
+ "warn",
633
+ {
634
+ "validStrategies": [
635
+ "ternary",
636
+ "coerce"
637
+ ]
638
+ }
639
+ ],
640
+ "react/jsx-boolean-value": [
641
+ "error",
642
+ "never"
643
+ ],
644
+ "react/react-in-jsx-scope": "off",
645
+ "react-hooks/rules-of-hooks": "error",
646
+ "react-hooks/exhaustive-deps": "error",
647
+ "@vitest/expect-expect": "off",
648
+ "@vitest/no-commented-out-tests": "warn",
649
+ "@vitest/valid-title": "warn",
650
+ "@vitest/no-disabled-tests": "warn",
651
+ "@vitest/no-focused-tests": "warn",
652
+ "@vitest/no-identical-title": "warn",
653
+ "@vitest/valid-expect": "warn"
654
+ },
655
+ "overrides": [
656
+ {
657
+ "parser": "@typescript-eslint/parser",
658
+ "files": [
659
+ "**/*.ts",
660
+ "**/*.tsx"
661
+ ],
662
+ "extends": [
663
+ "plugin:@typescript-eslint/recommended-type-checked"
664
+ ],
665
+ "parserOptions": {
666
+ "ecmaVersion": 2022,
667
+ "sourceType": "module"
668
+ },
669
+ "rules": {
670
+ "@typescript-eslint/explicit-function-return-type": 0,
671
+ "@typescript-eslint/no-use-before-define": 0,
672
+ "@typescript-eslint/no-empty-function": 0,
673
+ "@typescript-eslint/naming-convention": [
674
+ "error",
675
+ {
676
+ "selector": "interface",
677
+ "format": [
678
+ "PascalCase"
679
+ ],
680
+ "custom": {
681
+ "regex": "^I[A-Z]",
682
+ "match": true
683
+ }
684
+ }
685
+ ],
686
+ "@typescript-eslint/no-unused-vars": [
687
+ 2,
688
+ {
689
+ "varsIgnorePattern": "^_.*$",
690
+ "argsIgnorePattern": "^_.*$"
691
+ }
692
+ ],
693
+ "@typescript-eslint/no-explicit-any": 0,
694
+ "@typescript-eslint/array-type": "off",
695
+ "@typescript-eslint/ban-ts-comment": [
696
+ "error",
697
+ {
698
+ "ts-expect-error": "allow-with-description"
699
+ }
700
+ ],
701
+ "@typescript-eslint/no-wrapper-object-types": "error",
702
+ "@typescript-eslint/no-unsafe-function-type": "error",
703
+ "@typescript-eslint/no-restricted-types": [
704
+ "error",
705
+ {
706
+ "types": {
707
+ "String": {
708
+ "message": "Use 'string' instead",
709
+ "fixWith": "string"
710
+ },
711
+ "Number": {
712
+ "message": "Use 'number' instead",
713
+ "fixWith": "number"
714
+ },
715
+ "Boolean": {
716
+ "message": "Use 'boolean' instead",
717
+ "fixWith": "boolean"
718
+ },
719
+ "Symbol": {
720
+ "message": "Use 'symbol' instead",
721
+ "fixWith": "symbol"
722
+ }
723
+ }
724
+ }
725
+ ],
726
+ "@typescript-eslint/consistent-type-exports": [
727
+ "error",
728
+ {
729
+ "fixMixedExportsWithInlineTypeSpecifier": false
730
+ }
731
+ ],
732
+ "@typescript-eslint/explicit-member-accessibility": "off",
733
+ "@typescript-eslint/interface-name-prefix": "off",
734
+ "@typescript-eslint/member-ordering": "off",
735
+ "@typescript-eslint/no-inferrable-types": "off",
736
+ "@typescript-eslint/no-non-null-assertion": "off",
737
+ "@typescript-eslint/prefer-optional-chain": "error",
738
+ "no-restricted-syntax": [
739
+ "error",
740
+ {
741
+ "selector": "MemberExpression[object.name='React']",
742
+ "message": "Do not use `React.*`. Use named imports instead."
743
+ },
744
+ {
745
+ "selector": "TSTypeReference[typeName.type='TSQualifiedName'][typeName.left.name='React']",
746
+ "message": "Do not use `React.*` types. Use named imports instead."
747
+ }
748
+ ]
749
+ }
750
+ },
751
+ {
752
+ "parser": "@typescript-eslint/parser",
753
+ "files": [
754
+ "**/*.ts",
755
+ "**/*.tsx"
756
+ ],
757
+ "extends": [
758
+ "plugin:import/typescript"
759
+ ]
760
+ },
761
+ {
762
+ "files": [
763
+ "*.test.ts",
764
+ "*.test.tsx",
765
+ "*.spec.ts"
766
+ ],
767
+ "rules": {
768
+ "sonarjs/no-identical-functions": "off"
769
+ }
770
+ }
771
+ ],
772
+ "settings": {
773
+ "react": {
774
+ "version": "detect"
775
+ }
776
+ },
777
+ "env": {
778
+ "node": true,
779
+ "es2022": true,
780
+ "browser": true
781
+ },
782
+ "ignorePatterns": [
783
+ "**/dist/**/*.*",
784
+ "**/esm/**/*.*"
785
+ ],
786
+ "parserOptions": {
787
+ "ecmaVersion": 2022,
788
+ "sourceType": "module"
789
+ }
790
+ }