@gooddata/oxlint-config 11.51.0-alpha.4 → 11.51.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.
@@ -0,0 +1,2255 @@
1
+ {
2
+ "categories": {},
3
+ "plugins": [
4
+ "oxc",
5
+ "eslint",
6
+ "typescript",
7
+ "import",
8
+ "vitest"
9
+ ],
10
+ "jsPlugins": [
11
+ {
12
+ "name": "headers",
13
+ "specifier": "eslint-plugin-headers"
14
+ },
15
+ {
16
+ "name": "no-barrel-files",
17
+ "specifier": "eslint-plugin-no-barrel-files"
18
+ },
19
+ {
20
+ "name": "sonarjs",
21
+ "specifier": "eslint-plugin-sonarjs"
22
+ },
23
+ {
24
+ "name": "vitest-js",
25
+ "specifier": "@vitest/eslint-plugin"
26
+ },
27
+ {
28
+ "name": "testing-library",
29
+ "specifier": "eslint-plugin-testing-library"
30
+ },
31
+ {
32
+ "name": "no-only-tests",
33
+ "specifier": "eslint-plugin-no-only-tests"
34
+ }
35
+ ],
36
+ "rules": {
37
+ "oxc/bad-array-method-on-arguments": "error",
38
+ "oxc/bad-char-at-comparison": "error",
39
+ "oxc/bad-comparison-sequence": "error",
40
+ "oxc/bad-min-max-func": "error",
41
+ "oxc/bad-object-literal-comparison": "error",
42
+ "oxc/bad-replace-all-arg": "error",
43
+ "oxc/const-comparisons": "error",
44
+ "oxc/double-comparisons": "error",
45
+ "oxc/erasing-op": "error",
46
+ "oxc/missing-throw": "error",
47
+ "oxc/number-arg-out-of-range": "error",
48
+ "oxc/only-used-in-recursion": "off",
49
+ "oxc/uninvoked-array-callback": "error",
50
+ "constructor-super": "error",
51
+ "for-direction": "error",
52
+ "getter-return": "error",
53
+ "no-async-promise-executor": "error",
54
+ "no-case-declarations": "error",
55
+ "no-class-assign": "error",
56
+ "no-compare-neg-zero": "error",
57
+ "no-cond-assign": "error",
58
+ "no-const-assign": "error",
59
+ "no-constant-binary-expression": "error",
60
+ "no-constant-condition": "error",
61
+ "no-control-regex": "error",
62
+ "no-debugger": "error",
63
+ "no-delete-var": 2,
64
+ "no-dupe-args": "error",
65
+ "no-dupe-class-members": "error",
66
+ "no-dupe-else-if": "error",
67
+ "no-dupe-keys": "error",
68
+ "no-duplicate-case": "error",
69
+ "no-empty": "error",
70
+ "no-empty-character-class": "error",
71
+ "no-empty-pattern": "error",
72
+ "no-empty-static-block": "error",
73
+ "no-ex-assign": "error",
74
+ "no-fallthrough": "error",
75
+ "no-func-assign": "error",
76
+ "no-global-assign": "error",
77
+ "no-import-assign": "error",
78
+ "no-invalid-regexp": "error",
79
+ "no-irregular-whitespace": "error",
80
+ "no-loss-of-precision": "error",
81
+ "no-misleading-character-class": "error",
82
+ "no-new-native-nonconstructor": "error",
83
+ "no-nonoctal-decimal-escape": "error",
84
+ "no-obj-calls": "error",
85
+ "no-octal": "error",
86
+ "no-prototype-builtins": "error",
87
+ "no-redeclare": "error",
88
+ "no-regex-spaces": "error",
89
+ "no-self-assign": "error",
90
+ "no-setter-return": "error",
91
+ "no-shadow-restricted-names": "error",
92
+ "no-sparse-arrays": "error",
93
+ "no-this-before-super": "error",
94
+ "no-undef": "error",
95
+ "no-unreachable": "error",
96
+ "no-unsafe-finally": "error",
97
+ "no-unsafe-negation": "error",
98
+ "no-unsafe-optional-chaining": "error",
99
+ "no-unused-labels": "error",
100
+ "no-unused-private-class-members": "error",
101
+ "no-unused-vars": "error",
102
+ "no-useless-backreference": "error",
103
+ "no-useless-catch": "error",
104
+ "no-with": "error",
105
+ "require-yield": "error",
106
+ "use-isnan": "error",
107
+ "valid-typeof": "error",
108
+ "no-restricted-imports": [
109
+ "error",
110
+ {
111
+ "paths": [
112
+ {
113
+ "name": "react",
114
+ "importNames": [
115
+ "default"
116
+ ],
117
+ "message": "Default import from React is not allowed. Use named imports instead."
118
+ },
119
+ {
120
+ "name": "react-dom",
121
+ "importNames": [
122
+ "default"
123
+ ],
124
+ "message": "Default import from React DOM is not allowed. Use named imports instead."
125
+ },
126
+ {
127
+ "name": "@gooddata/sdk-ui-kit",
128
+ "importNames": [
129
+ "Icon"
130
+ ],
131
+ "message": "The Icon export cannot be tree-shaken, use {IconName}Icon imports instead."
132
+ },
133
+ {
134
+ "name": "vitest",
135
+ "importNames": [
136
+ "test"
137
+ ],
138
+ "message": "Use 'it' instead of 'test' for consistency."
139
+ }
140
+ ],
141
+ "patterns": [
142
+ {
143
+ "group": [
144
+ "lodash-es"
145
+ ],
146
+ "importNames": [
147
+ "get",
148
+ "getOr"
149
+ ],
150
+ "message": "Please use the ?. and ?? operators instead."
151
+ },
152
+ {
153
+ "group": [
154
+ "lodash-es"
155
+ ],
156
+ "importNames": [
157
+ "keys"
158
+ ],
159
+ "message": "Please use Object.keys() instead."
160
+ },
161
+ {
162
+ "group": [
163
+ "lodash-es"
164
+ ],
165
+ "importNames": [
166
+ "values"
167
+ ],
168
+ "message": "Please use Object.values() instead."
169
+ },
170
+ {
171
+ "group": [
172
+ "lodash-es"
173
+ ],
174
+ "importNames": [
175
+ "entries",
176
+ "toPairs"
177
+ ],
178
+ "message": "Please use Object.entries() instead."
179
+ },
180
+ {
181
+ "group": [
182
+ "lodash-es"
183
+ ],
184
+ "importNames": [
185
+ "map"
186
+ ],
187
+ "message": "Please use Array.prototype.map() instead."
188
+ },
189
+ {
190
+ "group": [
191
+ "lodash-es"
192
+ ],
193
+ "importNames": [
194
+ "flatMap"
195
+ ],
196
+ "message": "Please use Array.prototype.flatMap() instead."
197
+ },
198
+ {
199
+ "group": [
200
+ "lodash-es"
201
+ ],
202
+ "importNames": [
203
+ "filter"
204
+ ],
205
+ "message": "Please use Array.prototype.filter() instead."
206
+ },
207
+ {
208
+ "group": [
209
+ "lodash-es"
210
+ ],
211
+ "importNames": [
212
+ "find"
213
+ ],
214
+ "message": "Please use Array.prototype.find() instead."
215
+ },
216
+ {
217
+ "group": [
218
+ "lodash-es"
219
+ ],
220
+ "importNames": [
221
+ "findIndex"
222
+ ],
223
+ "message": "Please use Array.prototype.findIndex() instead."
224
+ },
225
+ {
226
+ "group": [
227
+ "lodash-es"
228
+ ],
229
+ "importNames": [
230
+ "includes"
231
+ ],
232
+ "message": "Please use Array.prototype.includes() instead."
233
+ },
234
+ {
235
+ "group": [
236
+ "lodash-es"
237
+ ],
238
+ "importNames": [
239
+ "some"
240
+ ],
241
+ "message": "Please use Array.prototype.some() instead."
242
+ },
243
+ {
244
+ "group": [
245
+ "lodash-es"
246
+ ],
247
+ "importNames": [
248
+ "every"
249
+ ],
250
+ "message": "Please use Array.prototype.every() instead."
251
+ },
252
+ {
253
+ "group": [
254
+ "lodash-es"
255
+ ],
256
+ "importNames": [
257
+ "concat"
258
+ ],
259
+ "message": "Please use Array.prototype.concat() or spread [...arr1, ...arr2] instead."
260
+ },
261
+ {
262
+ "group": [
263
+ "lodash-es"
264
+ ],
265
+ "importNames": [
266
+ "reverse"
267
+ ],
268
+ "message": "Please use Array.prototype.reverse() instead."
269
+ },
270
+ {
271
+ "group": [
272
+ "lodash-es"
273
+ ],
274
+ "importNames": [
275
+ "slice"
276
+ ],
277
+ "message": "Please use Array.prototype.slice() instead."
278
+ },
279
+ {
280
+ "group": [
281
+ "lodash-es"
282
+ ],
283
+ "importNames": [
284
+ "indexOf"
285
+ ],
286
+ "message": "Please use Array.prototype.indexOf() instead."
287
+ },
288
+ {
289
+ "group": [
290
+ "lodash-es"
291
+ ],
292
+ "importNames": [
293
+ "lastIndexOf"
294
+ ],
295
+ "message": "Please use Array.prototype.lastIndexOf() instead."
296
+ },
297
+ {
298
+ "group": [
299
+ "lodash-es"
300
+ ],
301
+ "importNames": [
302
+ "fill"
303
+ ],
304
+ "message": "Please use Array.prototype.fill() instead."
305
+ },
306
+ {
307
+ "group": [
308
+ "lodash-es"
309
+ ],
310
+ "importNames": [
311
+ "startsWith"
312
+ ],
313
+ "message": "Please use String.prototype.startsWith() instead."
314
+ },
315
+ {
316
+ "group": [
317
+ "lodash-es"
318
+ ],
319
+ "importNames": [
320
+ "endsWith"
321
+ ],
322
+ "message": "Please use String.prototype.endsWith() instead."
323
+ },
324
+ {
325
+ "group": [
326
+ "lodash-es"
327
+ ],
328
+ "importNames": [
329
+ "repeat"
330
+ ],
331
+ "message": "Please use String.prototype.repeat() instead."
332
+ },
333
+ {
334
+ "group": [
335
+ "lodash-es"
336
+ ],
337
+ "importNames": [
338
+ "padStart"
339
+ ],
340
+ "message": "Please use String.prototype.padStart() instead."
341
+ },
342
+ {
343
+ "group": [
344
+ "lodash-es"
345
+ ],
346
+ "importNames": [
347
+ "padEnd"
348
+ ],
349
+ "message": "Please use String.prototype.padEnd() instead."
350
+ },
351
+ {
352
+ "group": [
353
+ "lodash-es"
354
+ ],
355
+ "importNames": [
356
+ "trim"
357
+ ],
358
+ "message": "Please use String.prototype.trim() instead."
359
+ },
360
+ {
361
+ "group": [
362
+ "lodash-es"
363
+ ],
364
+ "importNames": [
365
+ "trimStart",
366
+ "trimLeft"
367
+ ],
368
+ "message": "Please use String.prototype.trimStart() instead."
369
+ },
370
+ {
371
+ "group": [
372
+ "lodash-es"
373
+ ],
374
+ "importNames": [
375
+ "trimEnd",
376
+ "trimRight"
377
+ ],
378
+ "message": "Please use String.prototype.trimEnd() instead."
379
+ },
380
+ {
381
+ "group": [
382
+ "lodash-es"
383
+ ],
384
+ "importNames": [
385
+ "toUpper"
386
+ ],
387
+ "message": "Please use String.prototype.toUpperCase() instead."
388
+ },
389
+ {
390
+ "group": [
391
+ "lodash-es"
392
+ ],
393
+ "importNames": [
394
+ "toLower"
395
+ ],
396
+ "message": "Please use String.prototype.toLowerCase() instead."
397
+ },
398
+ {
399
+ "group": [
400
+ "lodash-es"
401
+ ],
402
+ "importNames": [
403
+ "isArray"
404
+ ],
405
+ "message": "Please use Array.isArray() instead."
406
+ },
407
+ {
408
+ "group": [
409
+ "lodash-es"
410
+ ],
411
+ "importNames": [
412
+ "isNaN"
413
+ ],
414
+ "message": "Please use Number.isNaN() instead."
415
+ },
416
+ {
417
+ "group": [
418
+ "lodash-es"
419
+ ],
420
+ "importNames": [
421
+ "isFinite"
422
+ ],
423
+ "message": "Please use Number.isFinite() instead."
424
+ },
425
+ {
426
+ "group": [
427
+ "lodash-es"
428
+ ],
429
+ "importNames": [
430
+ "isInteger"
431
+ ],
432
+ "message": "Please use Number.isInteger() instead."
433
+ },
434
+ {
435
+ "group": [
436
+ "lodash-es"
437
+ ],
438
+ "importNames": [
439
+ "isNull"
440
+ ],
441
+ "message": "Please use value === null instead."
442
+ },
443
+ {
444
+ "group": [
445
+ "lodash-es"
446
+ ],
447
+ "importNames": [
448
+ "isUndefined"
449
+ ],
450
+ "message": "Please use value === undefined instead."
451
+ },
452
+ {
453
+ "group": [
454
+ "lodash-es"
455
+ ],
456
+ "importNames": [
457
+ "defaultTo"
458
+ ],
459
+ "message": "Please use value ?? defaultValue instead."
460
+ },
461
+ {
462
+ "group": [
463
+ "lodash-es"
464
+ ],
465
+ "importNames": [
466
+ "assign"
467
+ ],
468
+ "message": "Please use Object.assign() or spread syntax {...obj} instead."
469
+ },
470
+ {
471
+ "group": [
472
+ "lodash-es"
473
+ ],
474
+ "importNames": [
475
+ "flatten"
476
+ ],
477
+ "message": "Please use Array.prototype.flat() instead."
478
+ },
479
+ {
480
+ "group": [
481
+ "lodash-es"
482
+ ],
483
+ "importNames": [
484
+ "flattenDeep"
485
+ ],
486
+ "message": "Please use Array.prototype.flat(Infinity) instead."
487
+ },
488
+ {
489
+ "group": [
490
+ "lodash-es"
491
+ ],
492
+ "importNames": [
493
+ "isNil"
494
+ ],
495
+ "message": "Please use value === null || value === undefined instead."
496
+ },
497
+ {
498
+ "group": [
499
+ "lodash-es"
500
+ ],
501
+ "importNames": [
502
+ "noop"
503
+ ],
504
+ "message": "Please use () => {} instead."
505
+ },
506
+ {
507
+ "group": [
508
+ "lodash-es"
509
+ ],
510
+ "importNames": [
511
+ "identity"
512
+ ],
513
+ "message": "Please use x => x instead."
514
+ },
515
+ {
516
+ "group": [
517
+ "lodash-es"
518
+ ],
519
+ "importNames": [
520
+ "first",
521
+ "head"
522
+ ],
523
+ "message": "Please use Array.prototype.at(0) instead."
524
+ },
525
+ {
526
+ "group": [
527
+ "lodash-es"
528
+ ],
529
+ "importNames": [
530
+ "last"
531
+ ],
532
+ "message": "Please use Array.prototype.at(-1) instead."
533
+ },
534
+ {
535
+ "group": [
536
+ "lodash-es"
537
+ ],
538
+ "importNames": [
539
+ "forEach"
540
+ ],
541
+ "message": "Please use Array.prototype.forEach() instead."
542
+ },
543
+ {
544
+ "group": [
545
+ "lodash-es"
546
+ ],
547
+ "importNames": [
548
+ "fromPairs"
549
+ ],
550
+ "message": "Please use Object.fromEntries() instead."
551
+ },
552
+ {
553
+ "group": [
554
+ "lodash-es"
555
+ ],
556
+ "importNames": [
557
+ "join"
558
+ ],
559
+ "message": "Please use Array.prototype.join() instead."
560
+ },
561
+ {
562
+ "group": [
563
+ "lodash-es"
564
+ ],
565
+ "importNames": [
566
+ "isDate"
567
+ ],
568
+ "message": "Please use val instanceof Date instead."
569
+ },
570
+ {
571
+ "group": [
572
+ "lodash-es"
573
+ ],
574
+ "importNames": [
575
+ "isFunction"
576
+ ],
577
+ "message": "Please use typeof val === 'function' instead."
578
+ },
579
+ {
580
+ "group": [
581
+ "lodash-es"
582
+ ],
583
+ "importNames": [
584
+ "isNumber"
585
+ ],
586
+ "message": "Please use typeof val === 'number' instead."
587
+ },
588
+ {
589
+ "group": [
590
+ "lodash-es"
591
+ ],
592
+ "importNames": [
593
+ "isObject"
594
+ ],
595
+ "message": "Please use val !== null && typeof val === 'object' instead."
596
+ },
597
+ {
598
+ "group": [
599
+ "lodash-es"
600
+ ],
601
+ "importNames": [
602
+ "isString"
603
+ ],
604
+ "message": "Please use typeof val === 'string' instead."
605
+ },
606
+ {
607
+ "group": [
608
+ "lodash-es"
609
+ ],
610
+ "importNames": [
611
+ "toString"
612
+ ],
613
+ "message": "Please use String(val) instead."
614
+ },
615
+ {
616
+ "group": [
617
+ "lodash-es"
618
+ ],
619
+ "importNames": [
620
+ "flow",
621
+ "flowRight"
622
+ ],
623
+ "message": "Please use refactoring your code instead."
624
+ }
625
+ ]
626
+ }
627
+ ],
628
+ "sort-imports": [
629
+ "error",
630
+ {
631
+ "ignoreCase": false,
632
+ "ignoreDeclarationSort": true,
633
+ "ignoreMemberSort": false
634
+ }
635
+ ],
636
+ "no-useless-escape": "off",
637
+ "no-unneeded-ternary": [
638
+ "error",
639
+ {
640
+ "defaultAssignment": false
641
+ }
642
+ ],
643
+ "no-extra-boolean-cast": "error",
644
+ "no-unexpected-multiline": "off",
645
+ "no-duplicate-imports": "error",
646
+ "prefer-const": "off",
647
+ "headers/header-format": [
648
+ "error",
649
+ {
650
+ "source": "string",
651
+ "style": "line",
652
+ "content": "(C) (years) GoodData Corporation",
653
+ "patterns": {
654
+ "years": {
655
+ "pattern": "\\d{4}(-\\d{4})?",
656
+ "defaultValue": "2026"
657
+ }
658
+ }
659
+ }
660
+ ],
661
+ "no-barrel-files/no-barrel-files": "error",
662
+ "import/named": "error",
663
+ "import/namespace": "error",
664
+ "import/default": "error",
665
+ "import/export": "error",
666
+ "import/no-named-as-default": "warn",
667
+ "import/no-named-as-default-member": "warn",
668
+ "import/no-duplicates": "warn",
669
+ "import/no-unassigned-import": "error",
670
+ "sonarjs/function-name": "off",
671
+ "sonarjs/max-lines": "off",
672
+ "sonarjs/no-tab": "off",
673
+ "sonarjs/variable-name": "off",
674
+ "sonarjs/comment-regex": "off",
675
+ "sonarjs/elseif-without-else": "off",
676
+ "sonarjs/no-fallthrough": "error",
677
+ "sonarjs/nested-control-flow": "off",
678
+ "sonarjs/too-many-break-or-continue-in-loop": "off",
679
+ "sonarjs/max-lines-per-function": "off",
680
+ "sonarjs/no-nested-incdec": "off",
681
+ "sonarjs/no-equals-in-for-termination": "error",
682
+ "sonarjs/no-extra-arguments": "error",
683
+ "sonarjs/no-collapsible-if": "off",
684
+ "sonarjs/expression-complexity": "off",
685
+ "sonarjs/no-redundant-parentheses": "off",
686
+ "sonarjs/no-labels": "error",
687
+ "sonarjs/no-redundant-boolean": "error",
688
+ "sonarjs/prefer-single-boolean-return": "error",
689
+ "sonarjs/unused-import": "error",
690
+ "sonarjs/useless-string-operation": "off",
691
+ "sonarjs/no-unused-function-argument": "off",
692
+ "sonarjs/no-case-label-in-switch": "error",
693
+ "sonarjs/no-parameter-reassignment": "error",
694
+ "sonarjs/prefer-while": "error",
695
+ "sonarjs/no-sonar-comments": "off",
696
+ "sonarjs/no-small-switch": "error",
697
+ "sonarjs/no-hardcoded-ip": "error",
698
+ "sonarjs/label-position": "error",
699
+ "sonarjs/file-header": "off",
700
+ "sonarjs/call-argument-line": "error",
701
+ "sonarjs/max-switch-cases": "error",
702
+ "sonarjs/prefer-immediate-return": "off",
703
+ "sonarjs/function-inside-loop": "error",
704
+ "sonarjs/no-variable-usage-before-declaration": "off",
705
+ "sonarjs/future-reserved-words": "error",
706
+ "sonarjs/array-constructor": "off",
707
+ "sonarjs/bitwise-operators": "error",
708
+ "sonarjs/no-function-declaration-in-block": "off",
709
+ "sonarjs/no-primitive-wrappers": "error",
710
+ "sonarjs/for-in": "off",
711
+ "sonarjs/cyclomatic-complexity": "off",
712
+ "sonarjs/no-identical-expressions": "error",
713
+ "sonarjs/no-nested-switch": "off",
714
+ "sonarjs/no-identical-conditions": "error",
715
+ "sonarjs/no-duplicated-branches": "error",
716
+ "sonarjs/misplaced-loop-counter": "error",
717
+ "sonarjs/sql-queries": "error",
718
+ "sonarjs/insecure-cookie": "error",
719
+ "sonarjs/no-useless-increment": "error",
720
+ "sonarjs/no-undefined-assignment": "off",
721
+ "sonarjs/no-wildcard-import": "off",
722
+ "sonarjs/for-loop-increment-sign": "error",
723
+ "sonarjs/cookies": "off",
724
+ "sonarjs/null-dereference": "error",
725
+ "sonarjs/updated-loop-counter": "error",
726
+ "sonarjs/block-scoped-var": "error",
727
+ "sonarjs/no-built-in-override": "off",
728
+ "sonarjs/prefer-object-literal": "off",
729
+ "sonarjs/no-gratuitous-expressions": "error",
730
+ "sonarjs/file-uploads": "error",
731
+ "sonarjs/file-permissions": "error",
732
+ "sonarjs/no-empty-character-class": "error",
733
+ "sonarjs/no-unenclosed-multiline-block": "error",
734
+ "sonarjs/index-of-compare-to-positive-number": "error",
735
+ "sonarjs/no-useless-catch": "error",
736
+ "sonarjs/xml-parser-xxe": "error",
737
+ "sonarjs/non-existent-operator": "error",
738
+ "sonarjs/web-sql-database": "off",
739
+ "sonarjs/no-array-delete": "error",
740
+ "sonarjs/no-incomplete-assertions": "error",
741
+ "sonarjs/no-global-this": "error",
742
+ "sonarjs/new-operator-misuse": "error",
743
+ "sonarjs/no-delete-var": "error",
744
+ "sonarjs/strings-comparison": "off",
745
+ "sonarjs/file-name-differ-from-class": "off",
746
+ "sonarjs/cookie-no-httponly": "error",
747
+ "sonarjs/no-incorrect-string-concat": "off",
748
+ "sonarjs/inverted-assertion-arguments": "error",
749
+ "sonarjs/shorthand-property-grouping": "off",
750
+ "sonarjs/updated-const-var": "error",
751
+ "sonarjs/arguments-usage": "off",
752
+ "sonarjs/destructuring-assignment-syntax": "off",
753
+ "sonarjs/arrow-function-convention": "off",
754
+ "sonarjs/class-prototype": "off",
755
+ "sonarjs/no-require-or-define": "off",
756
+ "sonarjs/no-associative-arrays": "error",
757
+ "sonarjs/comma-or-logical-or-case": "error",
758
+ "sonarjs/no-redundant-jump": "error",
759
+ "sonarjs/inconsistent-function-call": "error",
760
+ "sonarjs/no-use-of-empty-return-value": "error",
761
+ "sonarjs/enforce-trailing-comma": "off",
762
+ "sonarjs/operation-returning-nan": "off",
763
+ "sonarjs/values-not-convertible-to-numbers": "off",
764
+ "sonarjs/non-number-in-arithmetic-expression": "off",
765
+ "sonarjs/in-operator-type-error": "error",
766
+ "sonarjs/declarations-in-global-scope": "off",
767
+ "sonarjs/no-inconsistent-returns": "off",
768
+ "sonarjs/no-reference-error": "off",
769
+ "sonarjs/super-invocation": "error",
770
+ "sonarjs/no-all-duplicated-branches": "error",
771
+ "sonarjs/no-same-line-conditional": "error",
772
+ "sonarjs/conditional-indentation": "off",
773
+ "sonarjs/no-collection-size-mischeck": "error",
774
+ "sonarjs/no-unthrown-error": "error",
775
+ "sonarjs/no-unused-collection": "error",
776
+ "sonarjs/no-for-in-iterable": "off",
777
+ "sonarjs/no-element-overwrite": "error",
778
+ "sonarjs/no-identical-functions": "error",
779
+ "sonarjs/no-empty-collection": "error",
780
+ "sonarjs/no-redundant-assignments": "error",
781
+ "sonarjs/prefer-type-guard": "error",
782
+ "sonarjs/no-return-type-any": "off",
783
+ "sonarjs/no-implicit-dependencies": "off",
784
+ "sonarjs/weak-ssl": "error",
785
+ "sonarjs/no-weak-keys": "error",
786
+ "sonarjs/csrf": "error",
787
+ "sonarjs/production-debug": "error",
788
+ "sonarjs/no-in-misuse": "error",
789
+ "sonarjs/no-duplicate-in-composite": "error",
790
+ "sonarjs/max-union-size": "off",
791
+ "sonarjs/no-nested-template-literals": "error",
792
+ "sonarjs/regular-expr": "off",
793
+ "sonarjs/encryption": "off",
794
+ "sonarjs/hashing": "error",
795
+ "sonarjs/bool-param-default": "off",
796
+ "sonarjs/xpath": "off",
797
+ "sonarjs/sockets": "off",
798
+ "sonarjs/process-argv": "off",
799
+ "sonarjs/standard-input": "off",
800
+ "sonarjs/unverified-certificate": "error",
801
+ "sonarjs/cors": "error",
802
+ "sonarjs/disabled-auto-escaping": "error",
803
+ "sonarjs/no-table-as-layout": "error",
804
+ "sonarjs/table-header-reference": "error",
805
+ "sonarjs/object-alt-content": "error",
806
+ "sonarjs/publicly-writable-directories": "error",
807
+ "sonarjs/unverified-hostname": "error",
808
+ "sonarjs/encryption-secure-mode": "error",
809
+ "sonarjs/no-weak-cipher": "error",
810
+ "sonarjs/no-intrusive-permissions": "error",
811
+ "sonarjs/insecure-jwt-token": "error",
812
+ "sonarjs/x-powered-by": "error",
813
+ "sonarjs/hidden-files": "error",
814
+ "sonarjs/content-length": "error",
815
+ "sonarjs/disabled-resource-integrity": "error",
816
+ "sonarjs/content-security-policy": "error",
817
+ "sonarjs/no-mixed-content": "error",
818
+ "sonarjs/frame-ancestors": "error",
819
+ "sonarjs/no-mime-sniff": "error",
820
+ "sonarjs/no-referrer-policy": "error",
821
+ "sonarjs/strict-transport-security": "error",
822
+ "sonarjs/certificate-transparency": "off",
823
+ "sonarjs/dns-prefetching": "off",
824
+ "sonarjs/confidential-information-logging": "error",
825
+ "sonarjs/no-ip-forward": "error",
826
+ "sonarjs/no-invalid-regexp": "error",
827
+ "sonarjs/unused-named-groups": "error",
828
+ "sonarjs/no-same-argument-assert": "error",
829
+ "sonarjs/unicode-aware-regex": "off",
830
+ "sonarjs/no-misleading-character-class": "error",
831
+ "sonarjs/session-regeneration": "error",
832
+ "sonarjs/test-check-exception": "error",
833
+ "sonarjs/stable-tests": "error",
834
+ "sonarjs/no-empty-after-reluctant": "error",
835
+ "sonarjs/no-code-after-done": "error",
836
+ "sonarjs/disabled-timeout": "error",
837
+ "sonarjs/chai-determinate-assertion": "error",
838
+ "sonarjs/aws-s3-bucket-server-encryption": "off",
839
+ "sonarjs/aws-s3-bucket-insecure-http": "error",
840
+ "sonarjs/aws-s3-bucket-versioning": "error",
841
+ "sonarjs/aws-s3-bucket-granted-access": "error",
842
+ "sonarjs/no-angular-bypass-sanitization": "error",
843
+ "sonarjs/aws-iam-public-access": "error",
844
+ "sonarjs/aws-ec2-unencrypted-ebs-volume": "error",
845
+ "sonarjs/aws-s3-bucket-public-access": "error",
846
+ "sonarjs/no-vue-bypass-sanitization": "off",
847
+ "sonarjs/aws-iam-all-privileges": "error",
848
+ "sonarjs/aws-rds-unencrypted-databases": "error",
849
+ "sonarjs/aws-iam-all-resources-accessible": "off",
850
+ "sonarjs/aws-opensearchservice-domain": "error",
851
+ "sonarjs/aws-iam-privilege-escalation": "error",
852
+ "sonarjs/aws-sagemaker-unencrypted-notebook": "error",
853
+ "sonarjs/aws-restricted-ip-admin-access": "error",
854
+ "sonarjs/no-empty-alternatives": "error",
855
+ "sonarjs/no-regex-spaces": "error",
856
+ "sonarjs/aws-sns-unencrypted-topics": "error",
857
+ "sonarjs/existing-groups": "error",
858
+ "sonarjs/aws-ec2-rds-dms-public": "error",
859
+ "sonarjs/aws-sqs-unencrypted-queue": "error",
860
+ "sonarjs/no-empty-group": "error",
861
+ "sonarjs/aws-efs-unencrypted": "error",
862
+ "sonarjs/aws-apigateway-public-api": "error",
863
+ "sonarjs/stateful-regex": "error",
864
+ "sonarjs/single-char-in-character-classes": "error",
865
+ "sonarjs/no-exclusive-tests": "error",
866
+ "sonarjs/hardcoded-secret-signatures": "error",
867
+ "sonarjs/jsx-no-leaked-render": "error",
868
+ "sonarjs/no-hook-setter-in-body": "error",
869
+ "sonarjs/no-uniq-key": "error",
870
+ "sonarjs/no-internal-api-use": "error",
871
+ "sonarjs/no-literal-call": "error",
872
+ "sonarjs/review-blockchain-mnemonic": "error",
873
+ "sonarjs/dynamically-constructed-templates": "error",
874
+ "sonarjs/no-duplicate-string": "off",
875
+ "sonarjs/cognitive-complexity": "warn",
876
+ "sonarjs/todo-tag": "warn",
877
+ "sonarjs/no-hardcoded-passwords": "off",
878
+ "sonarjs/no-alphabetical-sort": "off",
879
+ "sonarjs/no-os-command-from-path": "off",
880
+ "sonarjs/os-command": "off",
881
+ "sonarjs/prefer-regexp-exec": "off",
882
+ "sonarjs/no-clear-text-protocols": "off",
883
+ "sonarjs/deprecation": "off",
884
+ "sonarjs/no-nested-conditional": "off",
885
+ "sonarjs/no-ignored-exceptions": "off",
886
+ "sonarjs/slow-regex": "off",
887
+ "sonarjs/prefer-read-only-props": "off",
888
+ "sonarjs/no-skipped-tests": "off",
889
+ "sonarjs/no-commented-code": "off",
890
+ "sonarjs/no-ignored-return": "off",
891
+ "sonarjs/array-callback-without-return": "off",
892
+ "sonarjs/pseudo-random": "off",
893
+ "sonarjs/no-nested-functions": "off",
894
+ "sonarjs/no-async-constructor": "off",
895
+ "sonarjs/assertions-in-tests": "off",
896
+ "sonarjs/function-return-type": "off",
897
+ "sonarjs/no-unused-vars": "off",
898
+ "sonarjs/no-invariant-returns": "off",
899
+ "sonarjs/different-types-comparison": "off",
900
+ "sonarjs/no-selector-parameter": "off",
901
+ "sonarjs/anchor-precedence": "off",
902
+ "sonarjs/redundant-type-aliases": "off",
903
+ "sonarjs/no-redundant-optional": "off",
904
+ "sonarjs/reduce-initial-value": "off",
905
+ "sonarjs/no-globals-shadowing": "off",
906
+ "sonarjs/use-type-alias": "off",
907
+ "sonarjs/void-use": "off",
908
+ "sonarjs/no-undefined-argument": "off",
909
+ "sonarjs/no-useless-react-setstate": "off",
910
+ "sonarjs/no-inverted-boolean-check": "off",
911
+ "sonarjs/concise-regex": "off",
912
+ "sonarjs/no-dead-store": "off",
913
+ "sonarjs/public-static-readonly": "off",
914
+ "sonarjs/code-eval": "off",
915
+ "sonarjs/no-misleading-array-reverse": "off",
916
+ "sonarjs/fixme-tag": "off",
917
+ "sonarjs/argument-type": "off",
918
+ "sonarjs/constructor-for-side-effects": "off",
919
+ "sonarjs/no-useless-intersection": "off",
920
+ "sonarjs/no-empty-test-file": "off",
921
+ "sonarjs/prefer-default-last": "off",
922
+ "sonarjs/prefer-promise-shorthand": "off",
923
+ "sonarjs/no-unsafe-unzip": "off",
924
+ "sonarjs/no-nested-assignment": "off",
925
+ "sonarjs/generator-without-yield": "off",
926
+ "sonarjs/no-try-promise": "off",
927
+ "sonarjs/single-character-alternation": "off",
928
+ "sonarjs/class-name": "off",
929
+ "sonarjs/no-hardcoded-secrets": "off",
930
+ "sonarjs/regex-complexity": "off",
931
+ "sonarjs/post-message": "off",
932
+ "sonarjs/link-with-target-blank": "off",
933
+ "sonarjs/duplicates-in-character-class": "off",
934
+ "sonarjs/arguments-order": "off",
935
+ "sonarjs/empty-string-repetition": "off",
936
+ "sonarjs/table-header": "off",
937
+ "sonarjs/no-implicit-global": "off",
938
+ "sonarjs/no-control-regex": "off",
939
+ "no-caller": 2,
940
+ "no-eval": 2,
941
+ "no-octal-escape": 2,
942
+ "vitest/no-conditional-expect": "error",
943
+ "vitest/no-import-node-test": "error",
944
+ "vitest/no-interpolation-in-snapshots": "error",
945
+ "vitest/no-mocks-import": "error",
946
+ "vitest/no-standalone-expect": "error",
947
+ "vitest/no-unneeded-async-expect-function": "error",
948
+ "vitest/prefer-called-exactly-once-with": "error",
949
+ "vitest/require-local-test-context-for-concurrent-snapshots": "error",
950
+ "vitest/valid-describe-callback": "error",
951
+ "vitest/expect-expect": "off",
952
+ "vitest/no-commented-out-tests": "warn",
953
+ "vitest/valid-title": "error",
954
+ "vitest/no-disabled-tests": "warn",
955
+ "vitest/no-focused-tests": "warn",
956
+ "vitest/no-identical-title": "warn",
957
+ "vitest-js/valid-expect": "warn",
958
+ "vitest-js/valid-expect-in-promise": "error",
959
+ "testing-library/await-async-queries": "error",
960
+ "testing-library/await-async-utils": "error",
961
+ "testing-library/no-await-sync-queries": "error",
962
+ "testing-library/no-global-regexp-flag-in-query": "error",
963
+ "testing-library/no-node-access": "error",
964
+ "testing-library/no-promise-in-fire-event": "error",
965
+ "testing-library/no-wait-for-multiple-assertions": "error",
966
+ "testing-library/no-wait-for-side-effects": "error",
967
+ "testing-library/no-wait-for-snapshot": "error",
968
+ "testing-library/prefer-find-by": "error",
969
+ "testing-library/prefer-presence-queries": "error",
970
+ "testing-library/prefer-query-by-disappearance": "error",
971
+ "testing-library/prefer-screen-queries": "error",
972
+ "testing-library/await-async-events": [
973
+ "error",
974
+ {
975
+ "eventModule": "userEvent"
976
+ }
977
+ ],
978
+ "testing-library/no-await-sync-events": [
979
+ "error",
980
+ {
981
+ "eventModules": [
982
+ "fire-event"
983
+ ]
984
+ }
985
+ ],
986
+ "testing-library/no-container": "error",
987
+ "testing-library/no-debugging-utils": "warn",
988
+ "testing-library/no-dom-import": [
989
+ "error",
990
+ "react"
991
+ ],
992
+ "testing-library/no-manual-cleanup": "error",
993
+ "testing-library/no-render-in-lifecycle": "error",
994
+ "testing-library/no-unnecessary-act": "error",
995
+ "testing-library/render-result-naming-convention": "error",
996
+ "no-only-tests/no-only-tests": [
997
+ "error",
998
+ {
999
+ "block": [
1000
+ "fixture"
1001
+ ],
1002
+ "focus": [
1003
+ "only"
1004
+ ]
1005
+ }
1006
+ ]
1007
+ },
1008
+ "overrides": [
1009
+ {
1010
+ "files": [
1011
+ "*"
1012
+ ],
1013
+ "env": {
1014
+ "node": true,
1015
+ "es2022": true
1016
+ }
1017
+ },
1018
+ {
1019
+ "files": [
1020
+ "**/*.ts",
1021
+ "**/*.tsx"
1022
+ ],
1023
+ "rules": {
1024
+ "no-restricted-imports": [
1025
+ "error",
1026
+ {
1027
+ "paths": [
1028
+ {
1029
+ "name": "react",
1030
+ "importNames": [
1031
+ "default"
1032
+ ],
1033
+ "message": "Default import from React is not allowed. Use named imports instead."
1034
+ },
1035
+ {
1036
+ "name": "react-dom",
1037
+ "importNames": [
1038
+ "default"
1039
+ ],
1040
+ "message": "Default import from React DOM is not allowed. Use named imports instead."
1041
+ },
1042
+ {
1043
+ "name": "@gooddata/sdk-ui-kit",
1044
+ "importNames": [
1045
+ "Icon"
1046
+ ],
1047
+ "message": "The Icon export cannot be tree-shaken, use {IconName}Icon imports instead."
1048
+ },
1049
+ {
1050
+ "name": "vitest",
1051
+ "importNames": [
1052
+ "test"
1053
+ ],
1054
+ "message": "Use 'it' instead of 'test' for consistency."
1055
+ }
1056
+ ],
1057
+ "patterns": [
1058
+ {
1059
+ "group": [
1060
+ "lodash-es"
1061
+ ],
1062
+ "importNames": [
1063
+ "get",
1064
+ "getOr"
1065
+ ],
1066
+ "message": "Please use the ?. and ?? operators instead."
1067
+ },
1068
+ {
1069
+ "group": [
1070
+ "lodash-es"
1071
+ ],
1072
+ "importNames": [
1073
+ "keys"
1074
+ ],
1075
+ "message": "Please use Object.keys() instead."
1076
+ },
1077
+ {
1078
+ "group": [
1079
+ "lodash-es"
1080
+ ],
1081
+ "importNames": [
1082
+ "values"
1083
+ ],
1084
+ "message": "Please use Object.values() instead."
1085
+ },
1086
+ {
1087
+ "group": [
1088
+ "lodash-es"
1089
+ ],
1090
+ "importNames": [
1091
+ "entries",
1092
+ "toPairs"
1093
+ ],
1094
+ "message": "Please use Object.entries() instead."
1095
+ },
1096
+ {
1097
+ "group": [
1098
+ "lodash-es"
1099
+ ],
1100
+ "importNames": [
1101
+ "map"
1102
+ ],
1103
+ "message": "Please use Array.prototype.map() instead."
1104
+ },
1105
+ {
1106
+ "group": [
1107
+ "lodash-es"
1108
+ ],
1109
+ "importNames": [
1110
+ "flatMap"
1111
+ ],
1112
+ "message": "Please use Array.prototype.flatMap() instead."
1113
+ },
1114
+ {
1115
+ "group": [
1116
+ "lodash-es"
1117
+ ],
1118
+ "importNames": [
1119
+ "filter"
1120
+ ],
1121
+ "message": "Please use Array.prototype.filter() instead."
1122
+ },
1123
+ {
1124
+ "group": [
1125
+ "lodash-es"
1126
+ ],
1127
+ "importNames": [
1128
+ "find"
1129
+ ],
1130
+ "message": "Please use Array.prototype.find() instead."
1131
+ },
1132
+ {
1133
+ "group": [
1134
+ "lodash-es"
1135
+ ],
1136
+ "importNames": [
1137
+ "findIndex"
1138
+ ],
1139
+ "message": "Please use Array.prototype.findIndex() instead."
1140
+ },
1141
+ {
1142
+ "group": [
1143
+ "lodash-es"
1144
+ ],
1145
+ "importNames": [
1146
+ "includes"
1147
+ ],
1148
+ "message": "Please use Array.prototype.includes() instead."
1149
+ },
1150
+ {
1151
+ "group": [
1152
+ "lodash-es"
1153
+ ],
1154
+ "importNames": [
1155
+ "some"
1156
+ ],
1157
+ "message": "Please use Array.prototype.some() instead."
1158
+ },
1159
+ {
1160
+ "group": [
1161
+ "lodash-es"
1162
+ ],
1163
+ "importNames": [
1164
+ "every"
1165
+ ],
1166
+ "message": "Please use Array.prototype.every() instead."
1167
+ },
1168
+ {
1169
+ "group": [
1170
+ "lodash-es"
1171
+ ],
1172
+ "importNames": [
1173
+ "concat"
1174
+ ],
1175
+ "message": "Please use Array.prototype.concat() or spread [...arr1, ...arr2] instead."
1176
+ },
1177
+ {
1178
+ "group": [
1179
+ "lodash-es"
1180
+ ],
1181
+ "importNames": [
1182
+ "reverse"
1183
+ ],
1184
+ "message": "Please use Array.prototype.reverse() instead."
1185
+ },
1186
+ {
1187
+ "group": [
1188
+ "lodash-es"
1189
+ ],
1190
+ "importNames": [
1191
+ "slice"
1192
+ ],
1193
+ "message": "Please use Array.prototype.slice() instead."
1194
+ },
1195
+ {
1196
+ "group": [
1197
+ "lodash-es"
1198
+ ],
1199
+ "importNames": [
1200
+ "indexOf"
1201
+ ],
1202
+ "message": "Please use Array.prototype.indexOf() instead."
1203
+ },
1204
+ {
1205
+ "group": [
1206
+ "lodash-es"
1207
+ ],
1208
+ "importNames": [
1209
+ "lastIndexOf"
1210
+ ],
1211
+ "message": "Please use Array.prototype.lastIndexOf() instead."
1212
+ },
1213
+ {
1214
+ "group": [
1215
+ "lodash-es"
1216
+ ],
1217
+ "importNames": [
1218
+ "fill"
1219
+ ],
1220
+ "message": "Please use Array.prototype.fill() instead."
1221
+ },
1222
+ {
1223
+ "group": [
1224
+ "lodash-es"
1225
+ ],
1226
+ "importNames": [
1227
+ "startsWith"
1228
+ ],
1229
+ "message": "Please use String.prototype.startsWith() instead."
1230
+ },
1231
+ {
1232
+ "group": [
1233
+ "lodash-es"
1234
+ ],
1235
+ "importNames": [
1236
+ "endsWith"
1237
+ ],
1238
+ "message": "Please use String.prototype.endsWith() instead."
1239
+ },
1240
+ {
1241
+ "group": [
1242
+ "lodash-es"
1243
+ ],
1244
+ "importNames": [
1245
+ "repeat"
1246
+ ],
1247
+ "message": "Please use String.prototype.repeat() instead."
1248
+ },
1249
+ {
1250
+ "group": [
1251
+ "lodash-es"
1252
+ ],
1253
+ "importNames": [
1254
+ "padStart"
1255
+ ],
1256
+ "message": "Please use String.prototype.padStart() instead."
1257
+ },
1258
+ {
1259
+ "group": [
1260
+ "lodash-es"
1261
+ ],
1262
+ "importNames": [
1263
+ "padEnd"
1264
+ ],
1265
+ "message": "Please use String.prototype.padEnd() instead."
1266
+ },
1267
+ {
1268
+ "group": [
1269
+ "lodash-es"
1270
+ ],
1271
+ "importNames": [
1272
+ "trim"
1273
+ ],
1274
+ "message": "Please use String.prototype.trim() instead."
1275
+ },
1276
+ {
1277
+ "group": [
1278
+ "lodash-es"
1279
+ ],
1280
+ "importNames": [
1281
+ "trimStart",
1282
+ "trimLeft"
1283
+ ],
1284
+ "message": "Please use String.prototype.trimStart() instead."
1285
+ },
1286
+ {
1287
+ "group": [
1288
+ "lodash-es"
1289
+ ],
1290
+ "importNames": [
1291
+ "trimEnd",
1292
+ "trimRight"
1293
+ ],
1294
+ "message": "Please use String.prototype.trimEnd() instead."
1295
+ },
1296
+ {
1297
+ "group": [
1298
+ "lodash-es"
1299
+ ],
1300
+ "importNames": [
1301
+ "toUpper"
1302
+ ],
1303
+ "message": "Please use String.prototype.toUpperCase() instead."
1304
+ },
1305
+ {
1306
+ "group": [
1307
+ "lodash-es"
1308
+ ],
1309
+ "importNames": [
1310
+ "toLower"
1311
+ ],
1312
+ "message": "Please use String.prototype.toLowerCase() instead."
1313
+ },
1314
+ {
1315
+ "group": [
1316
+ "lodash-es"
1317
+ ],
1318
+ "importNames": [
1319
+ "isArray"
1320
+ ],
1321
+ "message": "Please use Array.isArray() instead."
1322
+ },
1323
+ {
1324
+ "group": [
1325
+ "lodash-es"
1326
+ ],
1327
+ "importNames": [
1328
+ "isNaN"
1329
+ ],
1330
+ "message": "Please use Number.isNaN() instead."
1331
+ },
1332
+ {
1333
+ "group": [
1334
+ "lodash-es"
1335
+ ],
1336
+ "importNames": [
1337
+ "isFinite"
1338
+ ],
1339
+ "message": "Please use Number.isFinite() instead."
1340
+ },
1341
+ {
1342
+ "group": [
1343
+ "lodash-es"
1344
+ ],
1345
+ "importNames": [
1346
+ "isInteger"
1347
+ ],
1348
+ "message": "Please use Number.isInteger() instead."
1349
+ },
1350
+ {
1351
+ "group": [
1352
+ "lodash-es"
1353
+ ],
1354
+ "importNames": [
1355
+ "isNull"
1356
+ ],
1357
+ "message": "Please use value === null instead."
1358
+ },
1359
+ {
1360
+ "group": [
1361
+ "lodash-es"
1362
+ ],
1363
+ "importNames": [
1364
+ "isUndefined"
1365
+ ],
1366
+ "message": "Please use value === undefined instead."
1367
+ },
1368
+ {
1369
+ "group": [
1370
+ "lodash-es"
1371
+ ],
1372
+ "importNames": [
1373
+ "defaultTo"
1374
+ ],
1375
+ "message": "Please use value ?? defaultValue instead."
1376
+ },
1377
+ {
1378
+ "group": [
1379
+ "lodash-es"
1380
+ ],
1381
+ "importNames": [
1382
+ "assign"
1383
+ ],
1384
+ "message": "Please use Object.assign() or spread syntax {...obj} instead."
1385
+ },
1386
+ {
1387
+ "group": [
1388
+ "lodash-es"
1389
+ ],
1390
+ "importNames": [
1391
+ "flatten"
1392
+ ],
1393
+ "message": "Please use Array.prototype.flat() instead."
1394
+ },
1395
+ {
1396
+ "group": [
1397
+ "lodash-es"
1398
+ ],
1399
+ "importNames": [
1400
+ "flattenDeep"
1401
+ ],
1402
+ "message": "Please use Array.prototype.flat(Infinity) instead."
1403
+ },
1404
+ {
1405
+ "group": [
1406
+ "lodash-es"
1407
+ ],
1408
+ "importNames": [
1409
+ "isNil"
1410
+ ],
1411
+ "message": "Please use value === null || value === undefined instead."
1412
+ },
1413
+ {
1414
+ "group": [
1415
+ "lodash-es"
1416
+ ],
1417
+ "importNames": [
1418
+ "noop"
1419
+ ],
1420
+ "message": "Please use () => {} instead."
1421
+ },
1422
+ {
1423
+ "group": [
1424
+ "lodash-es"
1425
+ ],
1426
+ "importNames": [
1427
+ "identity"
1428
+ ],
1429
+ "message": "Please use x => x instead."
1430
+ },
1431
+ {
1432
+ "group": [
1433
+ "lodash-es"
1434
+ ],
1435
+ "importNames": [
1436
+ "first",
1437
+ "head"
1438
+ ],
1439
+ "message": "Please use Array.prototype.at(0) instead."
1440
+ },
1441
+ {
1442
+ "group": [
1443
+ "lodash-es"
1444
+ ],
1445
+ "importNames": [
1446
+ "last"
1447
+ ],
1448
+ "message": "Please use Array.prototype.at(-1) instead."
1449
+ },
1450
+ {
1451
+ "group": [
1452
+ "lodash-es"
1453
+ ],
1454
+ "importNames": [
1455
+ "forEach"
1456
+ ],
1457
+ "message": "Please use Array.prototype.forEach() instead."
1458
+ },
1459
+ {
1460
+ "group": [
1461
+ "lodash-es"
1462
+ ],
1463
+ "importNames": [
1464
+ "fromPairs"
1465
+ ],
1466
+ "message": "Please use Object.fromEntries() instead."
1467
+ },
1468
+ {
1469
+ "group": [
1470
+ "lodash-es"
1471
+ ],
1472
+ "importNames": [
1473
+ "join"
1474
+ ],
1475
+ "message": "Please use Array.prototype.join() instead."
1476
+ },
1477
+ {
1478
+ "group": [
1479
+ "lodash-es"
1480
+ ],
1481
+ "importNames": [
1482
+ "isDate"
1483
+ ],
1484
+ "message": "Please use val instanceof Date instead."
1485
+ },
1486
+ {
1487
+ "group": [
1488
+ "lodash-es"
1489
+ ],
1490
+ "importNames": [
1491
+ "isFunction"
1492
+ ],
1493
+ "message": "Please use typeof val === 'function' instead."
1494
+ },
1495
+ {
1496
+ "group": [
1497
+ "lodash-es"
1498
+ ],
1499
+ "importNames": [
1500
+ "isNumber"
1501
+ ],
1502
+ "message": "Please use typeof val === 'number' instead."
1503
+ },
1504
+ {
1505
+ "group": [
1506
+ "lodash-es"
1507
+ ],
1508
+ "importNames": [
1509
+ "isObject"
1510
+ ],
1511
+ "message": "Please use val !== null && typeof val === 'object' instead."
1512
+ },
1513
+ {
1514
+ "group": [
1515
+ "lodash-es"
1516
+ ],
1517
+ "importNames": [
1518
+ "isString"
1519
+ ],
1520
+ "message": "Please use typeof val === 'string' instead."
1521
+ },
1522
+ {
1523
+ "group": [
1524
+ "lodash-es"
1525
+ ],
1526
+ "importNames": [
1527
+ "toString"
1528
+ ],
1529
+ "message": "Please use String(val) instead."
1530
+ },
1531
+ {
1532
+ "group": [
1533
+ "lodash-es"
1534
+ ],
1535
+ "importNames": [
1536
+ "flow",
1537
+ "flowRight"
1538
+ ],
1539
+ "message": "Please use refactoring your code instead."
1540
+ },
1541
+ {
1542
+ "group": [
1543
+ "vitest"
1544
+ ],
1545
+ "message": "Importing from vitest is only allowed in test files."
1546
+ }
1547
+ ]
1548
+ }
1549
+ ]
1550
+ }
1551
+ },
1552
+ {
1553
+ "files": [
1554
+ "**/vitest.config.ts",
1555
+ "**/vitest.*.config.ts",
1556
+ "**/vitest.setup.ts",
1557
+ "**/vitest.setup.tsx",
1558
+ "**/*.test.ts",
1559
+ "**/*.test.tsx",
1560
+ "**/*.test.utils.ts",
1561
+ "**/*.test.utils.tsx",
1562
+ "**/*.test.helpers.ts",
1563
+ "**/*.test.helpers.tsx"
1564
+ ],
1565
+ "rules": {
1566
+ "no-restricted-imports": [
1567
+ "error",
1568
+ {
1569
+ "paths": [
1570
+ {
1571
+ "name": "react",
1572
+ "importNames": [
1573
+ "default"
1574
+ ],
1575
+ "message": "Default import from React is not allowed. Use named imports instead."
1576
+ },
1577
+ {
1578
+ "name": "react-dom",
1579
+ "importNames": [
1580
+ "default"
1581
+ ],
1582
+ "message": "Default import from React DOM is not allowed. Use named imports instead."
1583
+ },
1584
+ {
1585
+ "name": "@gooddata/sdk-ui-kit",
1586
+ "importNames": [
1587
+ "Icon"
1588
+ ],
1589
+ "message": "The Icon export cannot be tree-shaken, use {IconName}Icon imports instead."
1590
+ },
1591
+ {
1592
+ "name": "vitest",
1593
+ "importNames": [
1594
+ "test"
1595
+ ],
1596
+ "message": "Use 'it' instead of 'test' for consistency."
1597
+ }
1598
+ ],
1599
+ "patterns": [
1600
+ {
1601
+ "group": [
1602
+ "lodash-es"
1603
+ ],
1604
+ "importNames": [
1605
+ "get",
1606
+ "getOr"
1607
+ ],
1608
+ "message": "Please use the ?. and ?? operators instead."
1609
+ },
1610
+ {
1611
+ "group": [
1612
+ "lodash-es"
1613
+ ],
1614
+ "importNames": [
1615
+ "keys"
1616
+ ],
1617
+ "message": "Please use Object.keys() instead."
1618
+ },
1619
+ {
1620
+ "group": [
1621
+ "lodash-es"
1622
+ ],
1623
+ "importNames": [
1624
+ "values"
1625
+ ],
1626
+ "message": "Please use Object.values() instead."
1627
+ },
1628
+ {
1629
+ "group": [
1630
+ "lodash-es"
1631
+ ],
1632
+ "importNames": [
1633
+ "entries",
1634
+ "toPairs"
1635
+ ],
1636
+ "message": "Please use Object.entries() instead."
1637
+ },
1638
+ {
1639
+ "group": [
1640
+ "lodash-es"
1641
+ ],
1642
+ "importNames": [
1643
+ "map"
1644
+ ],
1645
+ "message": "Please use Array.prototype.map() instead."
1646
+ },
1647
+ {
1648
+ "group": [
1649
+ "lodash-es"
1650
+ ],
1651
+ "importNames": [
1652
+ "flatMap"
1653
+ ],
1654
+ "message": "Please use Array.prototype.flatMap() instead."
1655
+ },
1656
+ {
1657
+ "group": [
1658
+ "lodash-es"
1659
+ ],
1660
+ "importNames": [
1661
+ "filter"
1662
+ ],
1663
+ "message": "Please use Array.prototype.filter() instead."
1664
+ },
1665
+ {
1666
+ "group": [
1667
+ "lodash-es"
1668
+ ],
1669
+ "importNames": [
1670
+ "find"
1671
+ ],
1672
+ "message": "Please use Array.prototype.find() instead."
1673
+ },
1674
+ {
1675
+ "group": [
1676
+ "lodash-es"
1677
+ ],
1678
+ "importNames": [
1679
+ "findIndex"
1680
+ ],
1681
+ "message": "Please use Array.prototype.findIndex() instead."
1682
+ },
1683
+ {
1684
+ "group": [
1685
+ "lodash-es"
1686
+ ],
1687
+ "importNames": [
1688
+ "includes"
1689
+ ],
1690
+ "message": "Please use Array.prototype.includes() instead."
1691
+ },
1692
+ {
1693
+ "group": [
1694
+ "lodash-es"
1695
+ ],
1696
+ "importNames": [
1697
+ "some"
1698
+ ],
1699
+ "message": "Please use Array.prototype.some() instead."
1700
+ },
1701
+ {
1702
+ "group": [
1703
+ "lodash-es"
1704
+ ],
1705
+ "importNames": [
1706
+ "every"
1707
+ ],
1708
+ "message": "Please use Array.prototype.every() instead."
1709
+ },
1710
+ {
1711
+ "group": [
1712
+ "lodash-es"
1713
+ ],
1714
+ "importNames": [
1715
+ "concat"
1716
+ ],
1717
+ "message": "Please use Array.prototype.concat() or spread [...arr1, ...arr2] instead."
1718
+ },
1719
+ {
1720
+ "group": [
1721
+ "lodash-es"
1722
+ ],
1723
+ "importNames": [
1724
+ "reverse"
1725
+ ],
1726
+ "message": "Please use Array.prototype.reverse() instead."
1727
+ },
1728
+ {
1729
+ "group": [
1730
+ "lodash-es"
1731
+ ],
1732
+ "importNames": [
1733
+ "slice"
1734
+ ],
1735
+ "message": "Please use Array.prototype.slice() instead."
1736
+ },
1737
+ {
1738
+ "group": [
1739
+ "lodash-es"
1740
+ ],
1741
+ "importNames": [
1742
+ "indexOf"
1743
+ ],
1744
+ "message": "Please use Array.prototype.indexOf() instead."
1745
+ },
1746
+ {
1747
+ "group": [
1748
+ "lodash-es"
1749
+ ],
1750
+ "importNames": [
1751
+ "lastIndexOf"
1752
+ ],
1753
+ "message": "Please use Array.prototype.lastIndexOf() instead."
1754
+ },
1755
+ {
1756
+ "group": [
1757
+ "lodash-es"
1758
+ ],
1759
+ "importNames": [
1760
+ "fill"
1761
+ ],
1762
+ "message": "Please use Array.prototype.fill() instead."
1763
+ },
1764
+ {
1765
+ "group": [
1766
+ "lodash-es"
1767
+ ],
1768
+ "importNames": [
1769
+ "startsWith"
1770
+ ],
1771
+ "message": "Please use String.prototype.startsWith() instead."
1772
+ },
1773
+ {
1774
+ "group": [
1775
+ "lodash-es"
1776
+ ],
1777
+ "importNames": [
1778
+ "endsWith"
1779
+ ],
1780
+ "message": "Please use String.prototype.endsWith() instead."
1781
+ },
1782
+ {
1783
+ "group": [
1784
+ "lodash-es"
1785
+ ],
1786
+ "importNames": [
1787
+ "repeat"
1788
+ ],
1789
+ "message": "Please use String.prototype.repeat() instead."
1790
+ },
1791
+ {
1792
+ "group": [
1793
+ "lodash-es"
1794
+ ],
1795
+ "importNames": [
1796
+ "padStart"
1797
+ ],
1798
+ "message": "Please use String.prototype.padStart() instead."
1799
+ },
1800
+ {
1801
+ "group": [
1802
+ "lodash-es"
1803
+ ],
1804
+ "importNames": [
1805
+ "padEnd"
1806
+ ],
1807
+ "message": "Please use String.prototype.padEnd() instead."
1808
+ },
1809
+ {
1810
+ "group": [
1811
+ "lodash-es"
1812
+ ],
1813
+ "importNames": [
1814
+ "trim"
1815
+ ],
1816
+ "message": "Please use String.prototype.trim() instead."
1817
+ },
1818
+ {
1819
+ "group": [
1820
+ "lodash-es"
1821
+ ],
1822
+ "importNames": [
1823
+ "trimStart",
1824
+ "trimLeft"
1825
+ ],
1826
+ "message": "Please use String.prototype.trimStart() instead."
1827
+ },
1828
+ {
1829
+ "group": [
1830
+ "lodash-es"
1831
+ ],
1832
+ "importNames": [
1833
+ "trimEnd",
1834
+ "trimRight"
1835
+ ],
1836
+ "message": "Please use String.prototype.trimEnd() instead."
1837
+ },
1838
+ {
1839
+ "group": [
1840
+ "lodash-es"
1841
+ ],
1842
+ "importNames": [
1843
+ "toUpper"
1844
+ ],
1845
+ "message": "Please use String.prototype.toUpperCase() instead."
1846
+ },
1847
+ {
1848
+ "group": [
1849
+ "lodash-es"
1850
+ ],
1851
+ "importNames": [
1852
+ "toLower"
1853
+ ],
1854
+ "message": "Please use String.prototype.toLowerCase() instead."
1855
+ },
1856
+ {
1857
+ "group": [
1858
+ "lodash-es"
1859
+ ],
1860
+ "importNames": [
1861
+ "isArray"
1862
+ ],
1863
+ "message": "Please use Array.isArray() instead."
1864
+ },
1865
+ {
1866
+ "group": [
1867
+ "lodash-es"
1868
+ ],
1869
+ "importNames": [
1870
+ "isNaN"
1871
+ ],
1872
+ "message": "Please use Number.isNaN() instead."
1873
+ },
1874
+ {
1875
+ "group": [
1876
+ "lodash-es"
1877
+ ],
1878
+ "importNames": [
1879
+ "isFinite"
1880
+ ],
1881
+ "message": "Please use Number.isFinite() instead."
1882
+ },
1883
+ {
1884
+ "group": [
1885
+ "lodash-es"
1886
+ ],
1887
+ "importNames": [
1888
+ "isInteger"
1889
+ ],
1890
+ "message": "Please use Number.isInteger() instead."
1891
+ },
1892
+ {
1893
+ "group": [
1894
+ "lodash-es"
1895
+ ],
1896
+ "importNames": [
1897
+ "isNull"
1898
+ ],
1899
+ "message": "Please use value === null instead."
1900
+ },
1901
+ {
1902
+ "group": [
1903
+ "lodash-es"
1904
+ ],
1905
+ "importNames": [
1906
+ "isUndefined"
1907
+ ],
1908
+ "message": "Please use value === undefined instead."
1909
+ },
1910
+ {
1911
+ "group": [
1912
+ "lodash-es"
1913
+ ],
1914
+ "importNames": [
1915
+ "defaultTo"
1916
+ ],
1917
+ "message": "Please use value ?? defaultValue instead."
1918
+ },
1919
+ {
1920
+ "group": [
1921
+ "lodash-es"
1922
+ ],
1923
+ "importNames": [
1924
+ "assign"
1925
+ ],
1926
+ "message": "Please use Object.assign() or spread syntax {...obj} instead."
1927
+ },
1928
+ {
1929
+ "group": [
1930
+ "lodash-es"
1931
+ ],
1932
+ "importNames": [
1933
+ "flatten"
1934
+ ],
1935
+ "message": "Please use Array.prototype.flat() instead."
1936
+ },
1937
+ {
1938
+ "group": [
1939
+ "lodash-es"
1940
+ ],
1941
+ "importNames": [
1942
+ "flattenDeep"
1943
+ ],
1944
+ "message": "Please use Array.prototype.flat(Infinity) instead."
1945
+ },
1946
+ {
1947
+ "group": [
1948
+ "lodash-es"
1949
+ ],
1950
+ "importNames": [
1951
+ "isNil"
1952
+ ],
1953
+ "message": "Please use value === null || value === undefined instead."
1954
+ },
1955
+ {
1956
+ "group": [
1957
+ "lodash-es"
1958
+ ],
1959
+ "importNames": [
1960
+ "noop"
1961
+ ],
1962
+ "message": "Please use () => {} instead."
1963
+ },
1964
+ {
1965
+ "group": [
1966
+ "lodash-es"
1967
+ ],
1968
+ "importNames": [
1969
+ "identity"
1970
+ ],
1971
+ "message": "Please use x => x instead."
1972
+ },
1973
+ {
1974
+ "group": [
1975
+ "lodash-es"
1976
+ ],
1977
+ "importNames": [
1978
+ "first",
1979
+ "head"
1980
+ ],
1981
+ "message": "Please use Array.prototype.at(0) instead."
1982
+ },
1983
+ {
1984
+ "group": [
1985
+ "lodash-es"
1986
+ ],
1987
+ "importNames": [
1988
+ "last"
1989
+ ],
1990
+ "message": "Please use Array.prototype.at(-1) instead."
1991
+ },
1992
+ {
1993
+ "group": [
1994
+ "lodash-es"
1995
+ ],
1996
+ "importNames": [
1997
+ "forEach"
1998
+ ],
1999
+ "message": "Please use Array.prototype.forEach() instead."
2000
+ },
2001
+ {
2002
+ "group": [
2003
+ "lodash-es"
2004
+ ],
2005
+ "importNames": [
2006
+ "fromPairs"
2007
+ ],
2008
+ "message": "Please use Object.fromEntries() instead."
2009
+ },
2010
+ {
2011
+ "group": [
2012
+ "lodash-es"
2013
+ ],
2014
+ "importNames": [
2015
+ "join"
2016
+ ],
2017
+ "message": "Please use Array.prototype.join() instead."
2018
+ },
2019
+ {
2020
+ "group": [
2021
+ "lodash-es"
2022
+ ],
2023
+ "importNames": [
2024
+ "isDate"
2025
+ ],
2026
+ "message": "Please use val instanceof Date instead."
2027
+ },
2028
+ {
2029
+ "group": [
2030
+ "lodash-es"
2031
+ ],
2032
+ "importNames": [
2033
+ "isFunction"
2034
+ ],
2035
+ "message": "Please use typeof val === 'function' instead."
2036
+ },
2037
+ {
2038
+ "group": [
2039
+ "lodash-es"
2040
+ ],
2041
+ "importNames": [
2042
+ "isNumber"
2043
+ ],
2044
+ "message": "Please use typeof val === 'number' instead."
2045
+ },
2046
+ {
2047
+ "group": [
2048
+ "lodash-es"
2049
+ ],
2050
+ "importNames": [
2051
+ "isObject"
2052
+ ],
2053
+ "message": "Please use val !== null && typeof val === 'object' instead."
2054
+ },
2055
+ {
2056
+ "group": [
2057
+ "lodash-es"
2058
+ ],
2059
+ "importNames": [
2060
+ "isString"
2061
+ ],
2062
+ "message": "Please use typeof val === 'string' instead."
2063
+ },
2064
+ {
2065
+ "group": [
2066
+ "lodash-es"
2067
+ ],
2068
+ "importNames": [
2069
+ "toString"
2070
+ ],
2071
+ "message": "Please use String(val) instead."
2072
+ },
2073
+ {
2074
+ "group": [
2075
+ "lodash-es"
2076
+ ],
2077
+ "importNames": [
2078
+ "flow",
2079
+ "flowRight"
2080
+ ],
2081
+ "message": "Please use refactoring your code instead."
2082
+ }
2083
+ ]
2084
+ }
2085
+ ]
2086
+ }
2087
+ },
2088
+ {
2089
+ "files": [
2090
+ "**/eslint.config.ts",
2091
+ "**/eslint.config.js"
2092
+ ],
2093
+ "rules": {
2094
+ "no-restricted-exports": "off"
2095
+ }
2096
+ },
2097
+ {
2098
+ "files": [
2099
+ "**/*.ts",
2100
+ "**/*.tsx",
2101
+ "**/*.mts",
2102
+ "**/*.cts"
2103
+ ],
2104
+ "rules": {
2105
+ "constructor-super": "off",
2106
+ "getter-return": "off",
2107
+ "no-class-assign": "off",
2108
+ "no-const-assign": "off",
2109
+ "no-dupe-args": "off",
2110
+ "no-dupe-class-members": "off",
2111
+ "no-dupe-keys": "off",
2112
+ "no-func-assign": "off",
2113
+ "no-import-assign": "off",
2114
+ "no-new-native-nonconstructor": "off",
2115
+ "no-new-symbol": "off",
2116
+ "no-obj-calls": "off",
2117
+ "no-redeclare": "off",
2118
+ "no-setter-return": "off",
2119
+ "no-this-before-super": "off",
2120
+ "no-undef": "off",
2121
+ "no-unreachable": "off",
2122
+ "no-unsafe-negation": "off",
2123
+ "no-var": "error",
2124
+ "no-with": "off",
2125
+ "prefer-const": "error",
2126
+ "prefer-rest-params": "error",
2127
+ "prefer-spread": "error",
2128
+ "no-array-constructor": "off",
2129
+ "no-unused-expressions": "off",
2130
+ "no-unused-vars": "off",
2131
+ "@typescript-eslint/no-array-constructor": "error",
2132
+ "@typescript-eslint/no-duplicate-enum-values": "error",
2133
+ "@typescript-eslint/no-empty-object-type": "error",
2134
+ "@typescript-eslint/no-extra-non-null-assertion": "error",
2135
+ "@typescript-eslint/no-misused-new": "error",
2136
+ "@typescript-eslint/no-namespace": "error",
2137
+ "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
2138
+ "@typescript-eslint/no-require-imports": "error",
2139
+ "@typescript-eslint/no-this-alias": "error",
2140
+ "@typescript-eslint/no-unnecessary-type-constraint": "error",
2141
+ "@typescript-eslint/no-unsafe-declaration-merging": "error",
2142
+ "@typescript-eslint/prefer-as-const": "error",
2143
+ "@typescript-eslint/prefer-namespace-keyword": "error",
2144
+ "@typescript-eslint/triple-slash-reference": "error",
2145
+ "@typescript-eslint/explicit-function-return-type": 0,
2146
+ "@typescript-eslint/no-use-before-define": 0,
2147
+ "@typescript-eslint/no-empty-function": 0,
2148
+ "@typescript-eslint/no-unused-vars": [
2149
+ 2,
2150
+ {
2151
+ "varsIgnorePattern": "^_.*$",
2152
+ "argsIgnorePattern": "^_.*$"
2153
+ }
2154
+ ],
2155
+ "@typescript-eslint/no-explicit-any": "error",
2156
+ "@typescript-eslint/array-type": "off",
2157
+ "@typescript-eslint/ban-ts-comment": [
2158
+ "error",
2159
+ {
2160
+ "ts-expect-error": "allow-with-description"
2161
+ }
2162
+ ],
2163
+ "@typescript-eslint/no-wrapper-object-types": "error",
2164
+ "@typescript-eslint/no-unsafe-function-type": "error",
2165
+ "@typescript-eslint/no-restricted-types": [
2166
+ "error",
2167
+ {
2168
+ "types": {
2169
+ "String": {
2170
+ "message": "Use 'string' instead",
2171
+ "fixWith": "string"
2172
+ },
2173
+ "Number": {
2174
+ "message": "Use 'number' instead",
2175
+ "fixWith": "number"
2176
+ },
2177
+ "Boolean": {
2178
+ "message": "Use 'boolean' instead",
2179
+ "fixWith": "boolean"
2180
+ },
2181
+ "Symbol": {
2182
+ "message": "Use 'symbol' instead",
2183
+ "fixWith": "symbol"
2184
+ }
2185
+ }
2186
+ }
2187
+ ],
2188
+ "@typescript-eslint/explicit-member-accessibility": "off",
2189
+ "@typescript-eslint/interface-name-prefix": "off",
2190
+ "@typescript-eslint/member-ordering": "off",
2191
+ "@typescript-eslint/no-inferrable-types": "off",
2192
+ "@typescript-eslint/no-non-null-assertion": "off",
2193
+ "no-restricted-syntax": [
2194
+ "error",
2195
+ {
2196
+ "selector": "MemberExpression[object.name='React']",
2197
+ "message": "Do not use `React.*`. Use named imports instead."
2198
+ },
2199
+ {
2200
+ "selector": "TSTypeReference[typeName.type='TSQualifiedName'][typeName.left.name='React']",
2201
+ "message": "Do not use `React.*` types. Use named imports instead."
2202
+ },
2203
+ {
2204
+ "selector": "ExportNamespaceSpecifier",
2205
+ "message": "Usage of 'export * as …' is forbidden."
2206
+ },
2207
+ {
2208
+ "selector": "ExportAllDeclaration",
2209
+ "message": "Usage of `export * from` is forbidden."
2210
+ },
2211
+ {
2212
+ "selector": "ImportDeclaration[source.value=/^(?!.*reference_workspace)\\./] ImportNamespaceSpecifier",
2213
+ "message": "Do not use `import * as ...` from relative paths."
2214
+ }
2215
+ ],
2216
+ "@typescript-eslint/consistent-type-imports": [
2217
+ "error",
2218
+ {
2219
+ "prefer": "type-imports",
2220
+ "fixStyle": "inline-type-imports"
2221
+ }
2222
+ ]
2223
+ }
2224
+ },
2225
+ {
2226
+ "files": [
2227
+ "**/eslint.config.ts"
2228
+ ],
2229
+ "rules": {
2230
+ "no-barrel-files/no-barrel-files": "off"
2231
+ }
2232
+ },
2233
+ {
2234
+ "files": [
2235
+ "*.test.ts",
2236
+ "*.test.tsx",
2237
+ "*.spec.ts"
2238
+ ],
2239
+ "rules": {
2240
+ "sonarjs/no-identical-functions": "off"
2241
+ }
2242
+ },
2243
+ {
2244
+ "files": [
2245
+ "*"
2246
+ ],
2247
+ "env": {
2248
+ "browser": true
2249
+ }
2250
+ }
2251
+ ],
2252
+ "settings": {},
2253
+ "env": {},
2254
+ "ignorePatterns": []
2255
+ }