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