-
Notifications
You must be signed in to change notification settings - Fork 387
Expand file tree
/
Copy pathrule-registry.ts
More file actions
3481 lines (3477 loc) · 101 KB
/
rule-registry.ts
File metadata and controls
3481 lines (3477 loc) · 101 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
// GENERATED FILE — do not edit by hand. Run `pnpm gen` to regenerate.
// Source of truth: every `export const <name> = defineRule({ id: "...", ... })`
// under `src/plugin/rules/<bucket>/<name>.ts`. The rule's `framework` and
// default `category` come from the bucket directory (see
// `scripts/generate-rule-registry.mjs`) — rule files only override
// `category` when needed. Adding a rule is a single-file operation:
// create the rule file, set its `id`, re-run codegen.
import type { Rule } from "./utils/rule.js";
import { advancedEventHandlerRefs } from "./rules/state-and-effects/advanced-event-handler-refs.js";
import { altText } from "./rules/a11y/alt-text.js";
import { anchorAmbiguousText } from "./rules/a11y/anchor-ambiguous-text.js";
import { anchorHasContent } from "./rules/a11y/anchor-has-content.js";
import { anchorIsValid } from "./rules/a11y/anchor-is-valid.js";
import { ariaActivedescendantHasTabindex } from "./rules/a11y/aria-activedescendant-has-tabindex.js";
import { ariaProps } from "./rules/a11y/aria-props.js";
import { ariaProptypes } from "./rules/a11y/aria-proptypes.js";
import { ariaRole } from "./rules/a11y/aria-role.js";
import { ariaUnsupportedElements } from "./rules/a11y/aria-unsupported-elements.js";
import { asyncAwaitInLoop } from "./rules/js-performance/async-await-in-loop.js";
import { asyncDeferAwait } from "./rules/performance/async-defer-await.js";
import { asyncParallel } from "./rules/js-performance/async-parallel.js";
import { autocompleteValid } from "./rules/a11y/autocomplete-valid.js";
import { buttonHasType } from "./rules/react-builtins/button-has-type.js";
import { checkedRequiresOnchangeOrReadonly } from "./rules/react-builtins/checked-requires-onchange-or-readonly.js";
import { clickEventsHaveKeyEvents } from "./rules/a11y/click-events-have-key-events.js";
import { clientLocalstorageNoVersion } from "./rules/client/client-localstorage-no-version.js";
import { clientPassiveEventListeners } from "./rules/client/client-passive-event-listeners.js";
import { controlHasAssociatedLabel } from "./rules/a11y/control-has-associated-label.js";
import { noEmDashInJsxText } from "./rules/react-ui/no-em-dash-in-jsx-text.js";
import { noRedundantPaddingAxes } from "./rules/react-ui/no-redundant-padding-axes.js";
import { noRedundantSizeAxes } from "./rules/react-ui/no-redundant-size-axes.js";
import { noSpaceOnFlexChildren } from "./rules/react-ui/no-space-on-flex-children.js";
import { noThreePeriodEllipsis } from "./rules/react-ui/no-three-period-ellipsis.js";
import { noVagueButtonLabel } from "./rules/react-ui/no-vague-button-label.js";
import { displayName } from "./rules/react-builtins/display-name.js";
import { effectNeedsCleanup } from "./rules/state-and-effects/effect-needs-cleanup.js";
import { exhaustiveDeps } from "./rules/react-builtins/exhaustive-deps.js";
import { forbidComponentProps } from "./rules/react-builtins/forbid-component-props.js";
import { forbidDomProps } from "./rules/react-builtins/forbid-dom-props.js";
import { forbidElements } from "./rules/react-builtins/forbid-elements.js";
import { forwardRefUsesRef } from "./rules/react-builtins/forward-ref-uses-ref.js";
import { headingHasContent } from "./rules/a11y/heading-has-content.js";
import { hookUseState } from "./rules/react-builtins/hook-use-state.js";
import { htmlHasLang } from "./rules/a11y/html-has-lang.js";
import { iframeHasTitle } from "./rules/a11y/iframe-has-title.js";
import { iframeMissingSandbox } from "./rules/react-builtins/iframe-missing-sandbox.js";
import { imgRedundantAlt } from "./rules/a11y/img-redundant-alt.js";
import { interactiveSupportsFocus } from "./rules/a11y/interactive-supports-focus.js";
import { jsBatchDomCss } from "./rules/js-performance/js-batch-dom-css.js";
import { jsCachePropertyAccess } from "./rules/js-performance/js-cache-property-access.js";
import { jsCacheStorage } from "./rules/js-performance/js-cache-storage.js";
import { jsCombineIterations } from "./rules/js-performance/js-combine-iterations.js";
import { jsEarlyExit } from "./rules/js-performance/js-early-exit.js";
import { jsFlatmapFilter } from "./rules/js-performance/js-flatmap-filter.js";
import { jsHoistIntl } from "./rules/js-performance/js-hoist-intl.js";
import { jsHoistRegexp } from "./rules/js-performance/js-hoist-regexp.js";
import { jsIndexMaps } from "./rules/js-performance/js-index-maps.js";
import { jsLengthCheckFirst } from "./rules/js-performance/js-length-check-first.js";
import { jsMinMaxLoop } from "./rules/js-performance/js-min-max-loop.js";
import { jsSetMapLookups } from "./rules/js-performance/js-set-map-lookups.js";
import { jsTosortedImmutable } from "./rules/js-performance/js-tosorted-immutable.js";
import { jsxBooleanValue } from "./rules/react-builtins/jsx-boolean-value.js";
import { jsxCurlyBracePresence } from "./rules/react-builtins/jsx-curly-brace-presence.js";
import { jsxFilenameExtension } from "./rules/react-builtins/jsx-filename-extension.js";
import { jsxFragments } from "./rules/react-builtins/jsx-fragments.js";
import { jsxHandlerNames } from "./rules/react-builtins/jsx-handler-names.js";
import { jsxKey } from "./rules/react-builtins/jsx-key.js";
import { jsxMaxDepth } from "./rules/react-builtins/jsx-max-depth.js";
import { jsxNoCommentTextnodes } from "./rules/react-builtins/jsx-no-comment-textnodes.js";
import { jsxNoConstructedContextValues } from "./rules/react-builtins/jsx-no-constructed-context-values.js";
import { jsxNoDuplicateProps } from "./rules/react-builtins/jsx-no-duplicate-props.js";
import { jsxNoJsxAsProp } from "./rules/react-builtins/jsx-no-jsx-as-prop.js";
import { jsxNoNewArrayAsProp } from "./rules/react-builtins/jsx-no-new-array-as-prop.js";
import { jsxNoNewFunctionAsProp } from "./rules/react-builtins/jsx-no-new-function-as-prop.js";
import { jsxNoNewObjectAsProp } from "./rules/react-builtins/jsx-no-new-object-as-prop.js";
import { jsxNoScriptUrl } from "./rules/react-builtins/jsx-no-script-url.js";
import { jsxNoTargetBlank } from "./rules/react-builtins/jsx-no-target-blank.js";
import { jsxNoUndef } from "./rules/react-builtins/jsx-no-undef.js";
import { jsxNoUselessFragment } from "./rules/react-builtins/jsx-no-useless-fragment.js";
import { jsxPascalCase } from "./rules/react-builtins/jsx-pascal-case.js";
import { jsxPropsNoSpreadMulti } from "./rules/react-builtins/jsx-props-no-spread-multi.js";
import { jsxPropsNoSpreading } from "./rules/react-builtins/jsx-props-no-spreading.js";
import { labelHasAssociatedControl } from "./rules/a11y/label-has-associated-control.js";
import { lang } from "./rules/a11y/lang.js";
import { mediaHasCaption } from "./rules/a11y/media-has-caption.js";
import { mouseEventsHaveKeyEvents } from "./rules/a11y/mouse-events-have-key-events.js";
import { nextjsAsyncClientComponent } from "./rules/nextjs/nextjs-async-client-component.js";
import { nextjsImageMissingSizes } from "./rules/nextjs/nextjs-image-missing-sizes.js";
import { nextjsInlineScriptMissingId } from "./rules/nextjs/nextjs-inline-script-missing-id.js";
import { nextjsMissingMetadata } from "./rules/nextjs/nextjs-missing-metadata.js";
import { nextjsNoAElement } from "./rules/nextjs/nextjs-no-a-element.js";
import { nextjsNoClientFetchForServerData } from "./rules/nextjs/nextjs-no-client-fetch-for-server-data.js";
import { nextjsNoClientSideRedirect } from "./rules/nextjs/nextjs-no-client-side-redirect.js";
import { nextjsNoCssLink } from "./rules/nextjs/nextjs-no-css-link.js";
import { nextjsNoFontLink } from "./rules/nextjs/nextjs-no-font-link.js";
import { nextjsNoHeadImport } from "./rules/nextjs/nextjs-no-head-import.js";
import { nextjsNoImgElement } from "./rules/nextjs/nextjs-no-img-element.js";
import { nextjsNoNativeScript } from "./rules/nextjs/nextjs-no-native-script.js";
import { nextjsNoPolyfillScript } from "./rules/nextjs/nextjs-no-polyfill-script.js";
import { nextjsNoRedirectInTryCatch } from "./rules/nextjs/nextjs-no-redirect-in-try-catch.js";
import { nextjsNoSideEffectInGetHandler } from "./rules/nextjs/nextjs-no-side-effect-in-get-handler.js";
import { nextjsNoUseSearchParamsWithoutSuspense } from "./rules/nextjs/nextjs-no-use-search-params-without-suspense.js";
import { noAccessKey } from "./rules/a11y/no-access-key.js";
import { noAdjustStateOnPropChange } from "./rules/state-and-effects/no-adjust-state-on-prop-change.js";
import { noAriaHiddenOnFocusable } from "./rules/a11y/no-aria-hidden-on-focusable.js";
import { noArrayIndexAsKey } from "./rules/correctness/no-array-index-as-key.js";
import { noArrayIndexKey } from "./rules/react-builtins/no-array-index-key.js";
import { noAutofocus } from "./rules/a11y/no-autofocus.js";
import { noBarrelImport } from "./rules/bundle-size/no-barrel-import.js";
import { noCascadingSetState } from "./rules/state-and-effects/no-cascading-set-state.js";
import { noChainStateUpdates } from "./rules/state-and-effects/no-chain-state-updates.js";
import { noChildrenProp } from "./rules/react-builtins/no-children-prop.js";
import { noCloneElement } from "./rules/react-builtins/no-clone-element.js";
import { noDanger } from "./rules/react-builtins/no-danger.js";
import { noDangerWithChildren } from "./rules/react-builtins/no-danger-with-children.js";
import { noDarkModeGlow } from "./rules/design/no-dark-mode-glow.js";
import { noDefaultProps } from "./rules/architecture/no-default-props.js";
import { noDerivedState } from "./rules/state-and-effects/no-derived-state.js";
import { noDerivedStateEffect } from "./rules/state-and-effects/no-derived-state-effect.js";
import { noDerivedUseState } from "./rules/state-and-effects/no-derived-use-state.js";
import { noDidMountSetState } from "./rules/react-builtins/no-did-mount-set-state.js";
import { noDidUpdateSetState } from "./rules/react-builtins/no-did-update-set-state.js";
import { noDirectMutationState } from "./rules/react-builtins/no-direct-mutation-state.js";
import { noDirectStateMutation } from "./rules/state-and-effects/no-direct-state-mutation.js";
import { noDisabledZoom } from "./rules/design/no-disabled-zoom.js";
import { noDistractingElements } from "./rules/a11y/no-distracting-elements.js";
import { noDocumentStartViewTransition } from "./rules/view-transitions/no-document-start-view-transition.js";
import { noDynamicImportPath } from "./rules/bundle-size/no-dynamic-import-path.js";
import { noEffectChain } from "./rules/state-and-effects/no-effect-chain.js";
import { noEffectEventHandler } from "./rules/state-and-effects/no-effect-event-handler.js";
import { noEffectEventInDeps } from "./rules/state-and-effects/no-effect-event-in-deps.js";
import { noEval } from "./rules/security/no-eval.js";
import { noEventHandler } from "./rules/state-and-effects/no-event-handler.js";
import { noEventTriggerState } from "./rules/state-and-effects/no-event-trigger-state.js";
import { noFetchInEffect } from "./rules/state-and-effects/no-fetch-in-effect.js";
import { noFindDomNode } from "./rules/react-builtins/no-find-dom-node.js";
import { noFlushSync } from "./rules/view-transitions/no-flush-sync.js";
import { noFullLodashImport } from "./rules/bundle-size/no-full-lodash-import.js";
import { noGenericHandlerNames } from "./rules/architecture/no-generic-handler-names.js";
import { noGiantComponent } from "./rules/architecture/no-giant-component.js";
import { noGlobalCssVariableAnimation } from "./rules/performance/no-global-css-variable-animation.js";
import { noGradientText } from "./rules/design/no-gradient-text.js";
import { noGrayOnColoredBackground } from "./rules/design/no-gray-on-colored-background.js";
import { noInitializeState } from "./rules/state-and-effects/no-initialize-state.js";
import { noInlineBounceEasing } from "./rules/design/no-inline-bounce-easing.js";
import { noInlineExhaustiveStyle } from "./rules/design/no-inline-exhaustive-style.js";
import { noInlinePropOnMemoComponent } from "./rules/performance/no-inline-prop-on-memo-component.js";
import { noInteractiveElementToNoninteractiveRole } from "./rules/a11y/no-interactive-element-to-noninteractive-role.js";
import { noIsMounted } from "./rules/react-builtins/no-is-mounted.js";
import { noJustifiedText } from "./rules/design/no-justified-text.js";
import { noLargeAnimatedBlur } from "./rules/performance/no-large-animated-blur.js";
import { noLayoutPropertyAnimation } from "./rules/performance/no-layout-property-animation.js";
import { noLayoutTransitionInline } from "./rules/design/no-layout-transition-inline.js";
import { noLegacyClassLifecycles } from "./rules/architecture/no-legacy-class-lifecycles.js";
import { noLegacyContextApi } from "./rules/architecture/no-legacy-context-api.js";
import { noLongTransitionDuration } from "./rules/design/no-long-transition-duration.js";
import { noManyBooleanProps } from "./rules/architecture/no-many-boolean-props.js";
import { noMirrorPropEffect } from "./rules/state-and-effects/no-mirror-prop-effect.js";
import { noMoment } from "./rules/bundle-size/no-moment.js";
import { noMultiComp } from "./rules/react-builtins/no-multi-comp.js";
import { noMutableInDeps } from "./rules/state-and-effects/no-mutable-in-deps.js";
import { noNamespace } from "./rules/react-builtins/no-namespace.js";
import { noNestedComponentDefinition } from "./rules/architecture/no-nested-component-definition.js";
import { noNoninteractiveElementInteractions } from "./rules/a11y/no-noninteractive-element-interactions.js";
import { noNoninteractiveElementToInteractiveRole } from "./rules/a11y/no-noninteractive-element-to-interactive-role.js";
import { noNoninteractiveTabindex } from "./rules/a11y/no-noninteractive-tabindex.js";
import { noOutlineNone } from "./rules/design/no-outline-none.js";
import { noPassDataToParent } from "./rules/state-and-effects/no-pass-data-to-parent.js";
import { noPassLiveStateToParent } from "./rules/state-and-effects/no-pass-live-state-to-parent.js";
import { noPermanentWillChange } from "./rules/performance/no-permanent-will-change.js";
import { noPolymorphicChildren } from "./rules/correctness/no-polymorphic-children.js";
import { noPreventDefault } from "./rules/correctness/no-prevent-default.js";
import { noPropCallbackInEffect } from "./rules/state-and-effects/no-prop-callback-in-effect.js";
import { noPureBlackBackground } from "./rules/design/no-pure-black-background.js";
import { noReactChildren } from "./rules/react-builtins/no-react-children.js";
import { noReactDomDeprecatedApis } from "./rules/architecture/no-react-dom-deprecated-apis.js";
import { noReact19DeprecatedApis } from "./rules/architecture/no-react19-deprecated-apis.js";
import { noRedundantRoles } from "./rules/a11y/no-redundant-roles.js";
import { noRedundantShouldComponentUpdate } from "./rules/react-builtins/no-redundant-should-component-update.js";
import { noRenderInRender } from "./rules/architecture/no-render-in-render.js";
import { noRenderPropChildren } from "./rules/architecture/no-render-prop-children.js";
import { noRenderReturnValue } from "./rules/react-builtins/no-render-return-value.js";
import { noResetAllStateOnPropChange } from "./rules/state-and-effects/no-reset-all-state-on-prop-change.js";
import { noScaleFromZero } from "./rules/performance/no-scale-from-zero.js";
import { noSecretsInClientCode } from "./rules/security/no-secrets-in-client-code.js";
import { noSetState } from "./rules/react-builtins/no-set-state.js";
import { noSetStateInRender } from "./rules/state-and-effects/no-set-state-in-render.js";
import { noSideTabBorder } from "./rules/design/no-side-tab-border.js";
import { noStaticElementInteractions } from "./rules/a11y/no-static-element-interactions.js";
import { noStringRefs } from "./rules/react-builtins/no-string-refs.js";
import { noThisInSfc } from "./rules/react-builtins/no-this-in-sfc.js";
import { noTinyText } from "./rules/design/no-tiny-text.js";
import { noTransitionAll } from "./rules/performance/no-transition-all.js";
import { noUncontrolledInput } from "./rules/correctness/no-uncontrolled-input.js";
import { noUndeferredThirdParty } from "./rules/bundle-size/no-undeferred-third-party.js";
import { noUnescapedEntities } from "./rules/react-builtins/no-unescaped-entities.js";
import { noUnknownProperty } from "./rules/react-builtins/no-unknown-property.js";
import { noUnsafe } from "./rules/react-builtins/no-unsafe.js";
import { noUnstableNestedComponents } from "./rules/react-builtins/no-unstable-nested-components.js";
import { noUsememoSimpleExpression } from "./rules/performance/no-usememo-simple-expression.js";
import { noWideLetterSpacing } from "./rules/design/no-wide-letter-spacing.js";
import { noWillUpdateSetState } from "./rules/react-builtins/no-will-update-set-state.js";
import { noZIndex9999 } from "./rules/design/no-z-index9999.js";
import { onlyExportComponents } from "./rules/react-builtins/only-export-components.js";
import { preferDynamicImport } from "./rules/bundle-size/prefer-dynamic-import.js";
import { preferEs6Class } from "./rules/react-builtins/prefer-es6-class.js";
import { preferFunctionComponent } from "./rules/react-builtins/prefer-function-component.js";
import { preferSchemaValidation } from "./rules/correctness/prefer-schema-validation.js";
import { preferTagOverRole } from "./rules/a11y/prefer-tag-over-role.js";
import { preferUseEffectEvent } from "./rules/state-and-effects/prefer-use-effect-event.js";
import { preferUseSyncExternalStore } from "./rules/state-and-effects/prefer-use-sync-external-store.js";
import { preferUseReducer } from "./rules/state-and-effects/prefer-use-reducer.js";
import { queryMutationMissingInvalidation } from "./rules/tanstack-query/query-mutation-missing-invalidation.js";
import { queryNoQueryInEffect } from "./rules/tanstack-query/query-no-query-in-effect.js";
import { queryNoRestDestructuring } from "./rules/tanstack-query/query-no-rest-destructuring.js";
import { queryNoUseQueryForMutation } from "./rules/tanstack-query/query-no-use-query-for-mutation.js";
import { queryNoVoidQueryFn } from "./rules/tanstack-query/query-no-void-query-fn.js";
import { queryStableQueryClient } from "./rules/tanstack-query/query-stable-query-client.js";
import { reactCompilerDestructureMethod } from "./rules/architecture/react-compiler-destructure-method.js";
import { reactInJsxScope } from "./rules/react-builtins/react-in-jsx-scope.js";
import { renderingAnimateSvgWrapper } from "./rules/performance/rendering-animate-svg-wrapper.js";
import { renderingConditionalRender } from "./rules/correctness/rendering-conditional-render.js";
import { renderingHoistJsx } from "./rules/performance/rendering-hoist-jsx.js";
import { renderingHydrationMismatchTime } from "./rules/performance/rendering-hydration-mismatch-time.js";
import { renderingHydrationNoFlicker } from "./rules/performance/rendering-hydration-no-flicker.js";
import { renderingScriptDeferAsync } from "./rules/performance/rendering-script-defer-async.js";
import { renderingSvgPrecision } from "./rules/correctness/rendering-svg-precision.js";
import { renderingUsetransitionLoading } from "./rules/performance/rendering-usetransition-loading.js";
import { requireRenderReturn } from "./rules/react-builtins/require-render-return.js";
import { rerenderDeferReadsHook } from "./rules/state-and-effects/rerender-defer-reads-hook.js";
import { rerenderDependencies } from "./rules/state-and-effects/rerender-dependencies.js";
import { rerenderDerivedStateFromHook } from "./rules/performance/rerender-derived-state-from-hook.js";
import { rerenderFunctionalSetstate } from "./rules/state-and-effects/rerender-functional-setstate.js";
import { rerenderLazyStateInit } from "./rules/state-and-effects/rerender-lazy-state-init.js";
import { rerenderMemoBeforeEarlyReturn } from "./rules/performance/rerender-memo-before-early-return.js";
import { rerenderMemoWithDefaultValue } from "./rules/performance/rerender-memo-with-default-value.js";
import { rerenderStateOnlyInHandlers } from "./rules/state-and-effects/rerender-state-only-in-handlers.js";
import { rerenderTransitionsScroll } from "./rules/performance/rerender-transitions-scroll.js";
import { rnAnimateLayoutProperty } from "./rules/react-native/rn-animate-layout-property.js";
import { rnAnimationReactionAsDerived } from "./rules/react-native/rn-animation-reaction-as-derived.js";
import { rnBottomSheetPreferNative } from "./rules/react-native/rn-bottom-sheet-prefer-native.js";
import { rnListCallbackPerRow } from "./rules/react-native/rn-list-callback-per-row.js";
import { rnListDataMapped } from "./rules/react-native/rn-list-data-mapped.js";
import { rnListRecyclableWithoutTypes } from "./rules/react-native/rn-list-recyclable-without-types.js";
import { rnNoDeprecatedModules } from "./rules/react-native/rn-no-deprecated-modules.js";
import { rnNoDimensionsGet } from "./rules/react-native/rn-no-dimensions-get.js";
import { rnNoInlineFlatlistRenderitem } from "./rules/react-native/rn-no-inline-flatlist-renderitem.js";
import { rnNoInlineObjectInListItem } from "./rules/react-native/rn-no-inline-object-in-list-item.js";
import { rnNoLegacyExpoPackages } from "./rules/react-native/rn-no-legacy-expo-packages.js";
import { rnNoLegacyShadowStyles } from "./rules/react-native/rn-no-legacy-shadow-styles.js";
import { rnNoNonNativeNavigator } from "./rules/react-native/rn-no-non-native-navigator.js";
import { rnNoRawText } from "./rules/react-native/rn-no-raw-text.js";
import { rnNoScrollState } from "./rules/react-native/rn-no-scroll-state.js";
import { rnNoScrollviewMappedList } from "./rules/react-native/rn-no-scrollview-mapped-list.js";
import { rnNoSingleElementStyleArray } from "./rules/react-native/rn-no-single-element-style-array.js";
import { rnPreferContentInsetAdjustment } from "./rules/react-native/rn-prefer-content-inset-adjustment.js";
import { rnPreferExpoImage } from "./rules/react-native/rn-prefer-expo-image.js";
import { rnPreferPressable } from "./rules/react-native/rn-prefer-pressable.js";
import { rnPreferReanimated } from "./rules/react-native/rn-prefer-reanimated.js";
import { rnPressableSharedValueMutation } from "./rules/react-native/rn-pressable-shared-value-mutation.js";
import { rnScrollviewDynamicPadding } from "./rules/react-native/rn-scrollview-dynamic-padding.js";
import { rnStylePreferBoxShadow } from "./rules/react-native/rn-style-prefer-box-shadow.js";
import { roleHasRequiredAriaProps } from "./rules/a11y/role-has-required-aria-props.js";
import { roleSupportsAriaProps } from "./rules/a11y/role-supports-aria-props.js";
import { rulesOfHooks } from "./rules/react-builtins/rules-of-hooks.js";
import { scope } from "./rules/a11y/scope.js";
import { selfClosingComp } from "./rules/react-builtins/self-closing-comp.js";
import { serverAfterNonblocking } from "./rules/server/server-after-nonblocking.js";
import { serverAuthActions } from "./rules/server/server-auth-actions.js";
import { serverCacheWithObjectLiteral } from "./rules/server/server-cache-with-object-literal.js";
import { serverDedupProps } from "./rules/server/server-dedup-props.js";
import { serverFetchWithoutRevalidate } from "./rules/server/server-fetch-without-revalidate.js";
import { serverHoistStaticIo } from "./rules/server/server-hoist-static-io.js";
import { serverNoMutableModuleState } from "./rules/server/server-no-mutable-module-state.js";
import { serverSequentialIndependentAwait } from "./rules/server/server-sequential-independent-await.js";
import { stateInConstructor } from "./rules/react-builtins/state-in-constructor.js";
import { stylePropObject } from "./rules/react-builtins/style-prop-object.js";
import { tabindexNoPositive } from "./rules/a11y/tabindex-no-positive.js";
import { tanstackStartGetMutation } from "./rules/tanstack-start/tanstack-start-get-mutation.js";
import { tanstackStartLoaderParallelFetch } from "./rules/tanstack-start/tanstack-start-loader-parallel-fetch.js";
import { tanstackStartMissingHeadContent } from "./rules/tanstack-start/tanstack-start-missing-head-content.js";
import { tanstackStartNoAnchorElement } from "./rules/tanstack-start/tanstack-start-no-anchor-element.js";
import { tanstackStartNoDirectFetchInLoader } from "./rules/tanstack-start/tanstack-start-no-direct-fetch-in-loader.js";
import { tanstackStartNoDynamicServerFnImport } from "./rules/tanstack-start/tanstack-start-no-dynamic-server-fn-import.js";
import { tanstackStartNoNavigateInRender } from "./rules/tanstack-start/tanstack-start-no-navigate-in-render.js";
import { tanstackStartNoSecretsInLoader } from "./rules/tanstack-start/tanstack-start-no-secrets-in-loader.js";
import { tanstackStartNoUseServerInHandler } from "./rules/tanstack-start/tanstack-start-no-use-server-in-handler.js";
import { tanstackStartNoUseEffectFetch } from "./rules/tanstack-start/tanstack-start-no-use-effect-fetch.js";
import { tanstackStartRedirectInTryCatch } from "./rules/tanstack-start/tanstack-start-redirect-in-try-catch.js";
import { tanstackStartRoutePropertyOrder } from "./rules/tanstack-start/tanstack-start-route-property-order.js";
import { tanstackStartServerFnMethodOrder } from "./rules/tanstack-start/tanstack-start-server-fn-method-order.js";
import { tanstackStartServerFnValidateInput } from "./rules/tanstack-start/tanstack-start-server-fn-validate-input.js";
import { useLazyMotion } from "./rules/bundle-size/use-lazy-motion.js";
import { voidDomElementsNoChildren } from "./rules/react-builtins/void-dom-elements-no-children.js";
export const reactDoctorRules = [
{
key: "react-doctor/advanced-event-handler-refs",
id: "advanced-event-handler-refs",
source: "react-doctor",
originallyExternal: false,
rule: {
...advancedEventHandlerRefs,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/alt-text",
id: "alt-text",
source: "react-doctor",
originallyExternal: true,
rule: {
...altText,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/anchor-ambiguous-text",
id: "anchor-ambiguous-text",
source: "react-doctor",
originallyExternal: true,
rule: {
...anchorAmbiguousText,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/anchor-has-content",
id: "anchor-has-content",
source: "react-doctor",
originallyExternal: true,
rule: {
...anchorHasContent,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/anchor-is-valid",
id: "anchor-is-valid",
source: "react-doctor",
originallyExternal: true,
rule: {
...anchorIsValid,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/aria-activedescendant-has-tabindex",
id: "aria-activedescendant-has-tabindex",
source: "react-doctor",
originallyExternal: true,
rule: {
...ariaActivedescendantHasTabindex,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/aria-props",
id: "aria-props",
source: "react-doctor",
originallyExternal: true,
rule: {
...ariaProps,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/aria-proptypes",
id: "aria-proptypes",
source: "react-doctor",
originallyExternal: true,
rule: {
...ariaProptypes,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/aria-role",
id: "aria-role",
source: "react-doctor",
originallyExternal: true,
rule: {
...ariaRole,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/aria-unsupported-elements",
id: "aria-unsupported-elements",
source: "react-doctor",
originallyExternal: true,
rule: {
...ariaUnsupportedElements,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/async-await-in-loop",
id: "async-await-in-loop",
source: "react-doctor",
originallyExternal: false,
rule: {
...asyncAwaitInLoop,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/async-defer-await",
id: "async-defer-await",
source: "react-doctor",
originallyExternal: false,
rule: {
...asyncDeferAwait,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/async-parallel",
id: "async-parallel",
source: "react-doctor",
originallyExternal: false,
rule: {
...asyncParallel,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/autocomplete-valid",
id: "autocomplete-valid",
source: "react-doctor",
originallyExternal: true,
rule: {
...autocompleteValid,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/button-has-type",
id: "button-has-type",
source: "react-doctor",
originallyExternal: true,
rule: {
...buttonHasType,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/checked-requires-onchange-or-readonly",
id: "checked-requires-onchange-or-readonly",
source: "react-doctor",
originallyExternal: true,
rule: {
...checkedRequiresOnchangeOrReadonly,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/click-events-have-key-events",
id: "click-events-have-key-events",
source: "react-doctor",
originallyExternal: true,
rule: {
...clickEventsHaveKeyEvents,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/client-localstorage-no-version",
id: "client-localstorage-no-version",
source: "react-doctor",
originallyExternal: false,
rule: {
...clientLocalstorageNoVersion,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/client-passive-event-listeners",
id: "client-passive-event-listeners",
source: "react-doctor",
originallyExternal: false,
rule: {
...clientPassiveEventListeners,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/control-has-associated-label",
id: "control-has-associated-label",
source: "react-doctor",
originallyExternal: true,
rule: {
...controlHasAssociatedLabel,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/design-no-em-dash-in-jsx-text",
id: "design-no-em-dash-in-jsx-text",
source: "react-doctor",
originallyExternal: false,
rule: {
...noEmDashInJsxText,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/design-no-redundant-padding-axes",
id: "design-no-redundant-padding-axes",
source: "react-doctor",
originallyExternal: false,
rule: {
...noRedundantPaddingAxes,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/design-no-redundant-size-axes",
id: "design-no-redundant-size-axes",
source: "react-doctor",
originallyExternal: false,
rule: {
...noRedundantSizeAxes,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/design-no-space-on-flex-children",
id: "design-no-space-on-flex-children",
source: "react-doctor",
originallyExternal: false,
rule: {
...noSpaceOnFlexChildren,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/design-no-three-period-ellipsis",
id: "design-no-three-period-ellipsis",
source: "react-doctor",
originallyExternal: false,
rule: {
...noThreePeriodEllipsis,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/design-no-vague-button-label",
id: "design-no-vague-button-label",
source: "react-doctor",
originallyExternal: false,
rule: {
...noVagueButtonLabel,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/display-name",
id: "display-name",
source: "react-doctor",
originallyExternal: true,
rule: {
...displayName,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/effect-needs-cleanup",
id: "effect-needs-cleanup",
source: "react-doctor",
originallyExternal: false,
rule: {
...effectNeedsCleanup,
framework: "global",
category: "State & Effects",
},
},
{
key: "react-doctor/exhaustive-deps",
id: "exhaustive-deps",
source: "react-doctor",
originallyExternal: true,
rule: {
...exhaustiveDeps,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/forbid-component-props",
id: "forbid-component-props",
source: "react-doctor",
originallyExternal: true,
rule: {
...forbidComponentProps,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/forbid-dom-props",
id: "forbid-dom-props",
source: "react-doctor",
originallyExternal: true,
rule: {
...forbidDomProps,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/forbid-elements",
id: "forbid-elements",
source: "react-doctor",
originallyExternal: true,
rule: {
...forbidElements,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/forward-ref-uses-ref",
id: "forward-ref-uses-ref",
source: "react-doctor",
originallyExternal: true,
rule: {
...forwardRefUsesRef,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/heading-has-content",
id: "heading-has-content",
source: "react-doctor",
originallyExternal: true,
rule: {
...headingHasContent,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/hook-use-state",
id: "hook-use-state",
source: "react-doctor",
originallyExternal: true,
rule: {
...hookUseState,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/html-has-lang",
id: "html-has-lang",
source: "react-doctor",
originallyExternal: true,
rule: {
...htmlHasLang,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/iframe-has-title",
id: "iframe-has-title",
source: "react-doctor",
originallyExternal: true,
rule: {
...iframeHasTitle,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/iframe-missing-sandbox",
id: "iframe-missing-sandbox",
source: "react-doctor",
originallyExternal: true,
rule: {
...iframeMissingSandbox,
framework: "global",
category: "Security",
},
},
{
key: "react-doctor/img-redundant-alt",
id: "img-redundant-alt",
source: "react-doctor",
originallyExternal: true,
rule: {
...imgRedundantAlt,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/interactive-supports-focus",
id: "interactive-supports-focus",
source: "react-doctor",
originallyExternal: true,
rule: {
...interactiveSupportsFocus,
framework: "global",
category: "Accessibility",
},
},
{
key: "react-doctor/js-batch-dom-css",
id: "js-batch-dom-css",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsBatchDomCss,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-cache-property-access",
id: "js-cache-property-access",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsCachePropertyAccess,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-cache-storage",
id: "js-cache-storage",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsCacheStorage,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-combine-iterations",
id: "js-combine-iterations",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsCombineIterations,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-early-exit",
id: "js-early-exit",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsEarlyExit,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-flatmap-filter",
id: "js-flatmap-filter",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsFlatmapFilter,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-hoist-intl",
id: "js-hoist-intl",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsHoistIntl,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-hoist-regexp",
id: "js-hoist-regexp",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsHoistRegexp,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-index-maps",
id: "js-index-maps",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsIndexMaps,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-length-check-first",
id: "js-length-check-first",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsLengthCheckFirst,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-min-max-loop",
id: "js-min-max-loop",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsMinMaxLoop,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-set-map-lookups",
id: "js-set-map-lookups",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsSetMapLookups,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/js-tosorted-immutable",
id: "js-tosorted-immutable",
source: "react-doctor",
originallyExternal: false,
rule: {
...jsTosortedImmutable,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/jsx-boolean-value",
id: "jsx-boolean-value",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxBooleanValue,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/jsx-curly-brace-presence",
id: "jsx-curly-brace-presence",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxCurlyBracePresence,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/jsx-filename-extension",
id: "jsx-filename-extension",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxFilenameExtension,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/jsx-fragments",
id: "jsx-fragments",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxFragments,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/jsx-handler-names",
id: "jsx-handler-names",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxHandlerNames,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/jsx-key",
id: "jsx-key",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxKey,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/jsx-max-depth",
id: "jsx-max-depth",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxMaxDepth,
framework: "global",
category: "Architecture",
},
},
{
key: "react-doctor/jsx-no-comment-textnodes",
id: "jsx-no-comment-textnodes",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxNoCommentTextnodes,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/jsx-no-constructed-context-values",
id: "jsx-no-constructed-context-values",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxNoConstructedContextValues,
framework: "global",
category: "Performance",
},
},
{
key: "react-doctor/jsx-no-duplicate-props",
id: "jsx-no-duplicate-props",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxNoDuplicateProps,
framework: "global",
category: "Correctness",
},
},
{
key: "react-doctor/jsx-no-jsx-as-prop",
id: "jsx-no-jsx-as-prop",
source: "react-doctor",
originallyExternal: true,
rule: {
...jsxNoJsxAsProp,
framework: "global",
category: "Performance",