@bfra.me/eslint-config 0.45.1 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -2731,6 +2731,204 @@ interface Rules {
2731
2731
  * @see https://ota-meshi.github.io/eslint-plugin-jsonc/rules/vue-custom-block/no-parsing-error.html
2732
2732
  */
2733
2733
  'jsonc/vue-custom-block/no-parsing-error'?: Linter.RuleEntry<[]>
2734
+ /**
2735
+ * Enforce emojis are wrapped in `<span>` and provide screen reader access.
2736
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/accessible-emoji.md
2737
+ * @deprecated
2738
+ */
2739
+ 'jsx-a11y/accessible-emoji'?: Linter.RuleEntry<JsxA11YAccessibleEmoji>
2740
+ /**
2741
+ * Enforce all elements that require alternative text have meaningful information to relay back to end user.
2742
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/alt-text.md
2743
+ */
2744
+ 'jsx-a11y/alt-text'?: Linter.RuleEntry<JsxA11YAltText>
2745
+ /**
2746
+ * Enforce `<a>` text to not exactly match "click here", "here", "link", or "a link".
2747
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-ambiguous-text.md
2748
+ */
2749
+ 'jsx-a11y/anchor-ambiguous-text'?: Linter.RuleEntry<JsxA11YAnchorAmbiguousText>
2750
+ /**
2751
+ * Enforce all anchors to contain accessible content.
2752
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-has-content.md
2753
+ */
2754
+ 'jsx-a11y/anchor-has-content'?: Linter.RuleEntry<JsxA11YAnchorHasContent>
2755
+ /**
2756
+ * Enforce all anchors are valid, navigable elements.
2757
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-is-valid.md
2758
+ */
2759
+ 'jsx-a11y/anchor-is-valid'?: Linter.RuleEntry<JsxA11YAnchorIsValid>
2760
+ /**
2761
+ * Enforce elements with aria-activedescendant are tabbable.
2762
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-activedescendant-has-tabindex.md
2763
+ */
2764
+ 'jsx-a11y/aria-activedescendant-has-tabindex'?: Linter.RuleEntry<JsxA11YAriaActivedescendantHasTabindex>
2765
+ /**
2766
+ * Enforce all `aria-*` props are valid.
2767
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-props.md
2768
+ */
2769
+ 'jsx-a11y/aria-props'?: Linter.RuleEntry<JsxA11YAriaProps>
2770
+ /**
2771
+ * Enforce ARIA state and property values are valid.
2772
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-proptypes.md
2773
+ */
2774
+ 'jsx-a11y/aria-proptypes'?: Linter.RuleEntry<JsxA11YAriaProptypes>
2775
+ /**
2776
+ * Enforce that elements with ARIA roles must use a valid, non-abstract ARIA role.
2777
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-role.md
2778
+ */
2779
+ 'jsx-a11y/aria-role'?: Linter.RuleEntry<JsxA11YAriaRole>
2780
+ /**
2781
+ * Enforce that elements that do not support ARIA roles, states, and properties do not have those attributes.
2782
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-unsupported-elements.md
2783
+ */
2784
+ 'jsx-a11y/aria-unsupported-elements'?: Linter.RuleEntry<JsxA11YAriaUnsupportedElements>
2785
+ /**
2786
+ * Enforce that autocomplete attributes are used correctly.
2787
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/autocomplete-valid.md
2788
+ */
2789
+ 'jsx-a11y/autocomplete-valid'?: Linter.RuleEntry<JsxA11YAutocompleteValid>
2790
+ /**
2791
+ * Enforce a clickable non-interactive element has at least one keyboard event listener.
2792
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/click-events-have-key-events.md
2793
+ */
2794
+ 'jsx-a11y/click-events-have-key-events'?: Linter.RuleEntry<JsxA11YClickEventsHaveKeyEvents>
2795
+ /**
2796
+ * Enforce that a control (an interactive element) has a text label.
2797
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/control-has-associated-label.md
2798
+ */
2799
+ 'jsx-a11y/control-has-associated-label'?: Linter.RuleEntry<JsxA11YControlHasAssociatedLabel>
2800
+ /**
2801
+ * Enforce heading (`h1`, `h2`, etc) elements contain accessible content.
2802
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/heading-has-content.md
2803
+ */
2804
+ 'jsx-a11y/heading-has-content'?: Linter.RuleEntry<JsxA11YHeadingHasContent>
2805
+ /**
2806
+ * Enforce `<html>` element has `lang` prop.
2807
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/html-has-lang.md
2808
+ */
2809
+ 'jsx-a11y/html-has-lang'?: Linter.RuleEntry<JsxA11YHtmlHasLang>
2810
+ /**
2811
+ * Enforce iframe elements have a title attribute.
2812
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/iframe-has-title.md
2813
+ */
2814
+ 'jsx-a11y/iframe-has-title'?: Linter.RuleEntry<JsxA11YIframeHasTitle>
2815
+ /**
2816
+ * Enforce `<img>` alt prop does not contain the word "image", "picture", or "photo".
2817
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/img-redundant-alt.md
2818
+ */
2819
+ 'jsx-a11y/img-redundant-alt'?: Linter.RuleEntry<JsxA11YImgRedundantAlt>
2820
+ /**
2821
+ * Enforce that elements with interactive handlers like `onClick` must be focusable.
2822
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/interactive-supports-focus.md
2823
+ */
2824
+ 'jsx-a11y/interactive-supports-focus'?: Linter.RuleEntry<JsxA11YInteractiveSupportsFocus>
2825
+ /**
2826
+ * Enforce that a `label` tag has a text label and an associated control.
2827
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/label-has-associated-control.md
2828
+ */
2829
+ 'jsx-a11y/label-has-associated-control'?: Linter.RuleEntry<JsxA11YLabelHasAssociatedControl>
2830
+ /**
2831
+ * Enforce that `<label>` elements have the `htmlFor` prop.
2832
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/label-has-for.md
2833
+ * @deprecated
2834
+ */
2835
+ 'jsx-a11y/label-has-for'?: Linter.RuleEntry<JsxA11YLabelHasFor>
2836
+ /**
2837
+ * Enforce lang attribute has a valid value.
2838
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/lang.md
2839
+ */
2840
+ 'jsx-a11y/lang'?: Linter.RuleEntry<JsxA11YLang>
2841
+ /**
2842
+ * Enforces that `<audio>` and `<video>` elements must have a `<track>` for captions.
2843
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/media-has-caption.md
2844
+ */
2845
+ 'jsx-a11y/media-has-caption'?: Linter.RuleEntry<JsxA11YMediaHasCaption>
2846
+ /**
2847
+ * Enforce that `onMouseOver`/`onMouseOut` are accompanied by `onFocus`/`onBlur` for keyboard-only users.
2848
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/mouse-events-have-key-events.md
2849
+ */
2850
+ 'jsx-a11y/mouse-events-have-key-events'?: Linter.RuleEntry<JsxA11YMouseEventsHaveKeyEvents>
2851
+ /**
2852
+ * Enforce that the `accessKey` prop is not used on any element to avoid complications with keyboard commands used by a screen reader.
2853
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-access-key.md
2854
+ */
2855
+ 'jsx-a11y/no-access-key'?: Linter.RuleEntry<JsxA11YNoAccessKey>
2856
+ /**
2857
+ * Disallow `aria-hidden="true"` from being set on focusable elements.
2858
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-aria-hidden-on-focusable.md
2859
+ */
2860
+ 'jsx-a11y/no-aria-hidden-on-focusable'?: Linter.RuleEntry<JsxA11YNoAriaHiddenOnFocusable>
2861
+ /**
2862
+ * Enforce autoFocus prop is not used.
2863
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-autofocus.md
2864
+ */
2865
+ 'jsx-a11y/no-autofocus'?: Linter.RuleEntry<JsxA11YNoAutofocus>
2866
+ /**
2867
+ * Enforce distracting elements are not used.
2868
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-distracting-elements.md
2869
+ */
2870
+ 'jsx-a11y/no-distracting-elements'?: Linter.RuleEntry<JsxA11YNoDistractingElements>
2871
+ /**
2872
+ * Interactive elements should not be assigned non-interactive roles.
2873
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-interactive-element-to-noninteractive-role.md
2874
+ */
2875
+ 'jsx-a11y/no-interactive-element-to-noninteractive-role'?: Linter.RuleEntry<JsxA11YNoInteractiveElementToNoninteractiveRole>
2876
+ /**
2877
+ * Non-interactive elements should not be assigned mouse or keyboard event listeners.
2878
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-element-interactions.md
2879
+ */
2880
+ 'jsx-a11y/no-noninteractive-element-interactions'?: Linter.RuleEntry<JsxA11YNoNoninteractiveElementInteractions>
2881
+ /**
2882
+ * Non-interactive elements should not be assigned interactive roles.
2883
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-element-to-interactive-role.md
2884
+ */
2885
+ 'jsx-a11y/no-noninteractive-element-to-interactive-role'?: Linter.RuleEntry<JsxA11YNoNoninteractiveElementToInteractiveRole>
2886
+ /**
2887
+ * `tabIndex` should only be declared on interactive elements.
2888
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-tabindex.md
2889
+ */
2890
+ 'jsx-a11y/no-noninteractive-tabindex'?: Linter.RuleEntry<JsxA11YNoNoninteractiveTabindex>
2891
+ /**
2892
+ * Enforce usage of `onBlur` over `onChange` on select menus for accessibility.
2893
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-onchange.md
2894
+ * @deprecated
2895
+ */
2896
+ 'jsx-a11y/no-onchange'?: Linter.RuleEntry<JsxA11YNoOnchange>
2897
+ /**
2898
+ * Enforce explicit role property is not the same as implicit/default role property on element.
2899
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-redundant-roles.md
2900
+ */
2901
+ 'jsx-a11y/no-redundant-roles'?: Linter.RuleEntry<JsxA11YNoRedundantRoles>
2902
+ /**
2903
+ * Enforce that non-interactive, visible elements (such as `<div>`) that have click handlers use the role attribute.
2904
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-static-element-interactions.md
2905
+ */
2906
+ 'jsx-a11y/no-static-element-interactions'?: Linter.RuleEntry<JsxA11YNoStaticElementInteractions>
2907
+ /**
2908
+ * Enforces using semantic DOM elements over the ARIA `role` property.
2909
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/prefer-tag-over-role.md
2910
+ */
2911
+ 'jsx-a11y/prefer-tag-over-role'?: Linter.RuleEntry<JsxA11YPreferTagOverRole>
2912
+ /**
2913
+ * Enforce that elements with ARIA roles must have all required attributes for that role.
2914
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/role-has-required-aria-props.md
2915
+ */
2916
+ 'jsx-a11y/role-has-required-aria-props'?: Linter.RuleEntry<JsxA11YRoleHasRequiredAriaProps>
2917
+ /**
2918
+ * Enforce that elements with explicit or implicit roles defined contain only `aria-*` properties supported by that `role`.
2919
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/role-supports-aria-props.md
2920
+ */
2921
+ 'jsx-a11y/role-supports-aria-props'?: Linter.RuleEntry<JsxA11YRoleSupportsAriaProps>
2922
+ /**
2923
+ * Enforce `scope` prop is only used on `<th>` elements.
2924
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/scope.md
2925
+ */
2926
+ 'jsx-a11y/scope'?: Linter.RuleEntry<JsxA11YScope>
2927
+ /**
2928
+ * Enforce `tabIndex` value is not greater than zero.
2929
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/tabindex-no-positive.md
2930
+ */
2931
+ 'jsx-a11y/tabindex-no-positive'?: Linter.RuleEntry<JsxA11YTabindexNoPositive>
2734
2932
  /**
2735
2933
  * Enforce the consistent use of either double or single quotes in JSX attributes
2736
2934
  * @see https://eslint.org/docs/latest/rules/jsx-quotes
@@ -11143,6 +11341,221 @@ type JsoncSpaceUnaryOps = []|[{
11143
11341
  [k: string]: boolean | undefined
11144
11342
  }
11145
11343
  }]
11344
+ // ----- jsx-a11y/accessible-emoji -----
11345
+ type JsxA11YAccessibleEmoji = []|[{
11346
+ [k: string]: unknown | undefined
11347
+ }]
11348
+ // ----- jsx-a11y/alt-text -----
11349
+ type JsxA11YAltText = []|[{
11350
+ elements?: string[]
11351
+ img?: string[]
11352
+ object?: string[]
11353
+ area?: string[]
11354
+ "input[type=\"image\"]"?: string[]
11355
+ [k: string]: unknown | undefined
11356
+ }]
11357
+ // ----- jsx-a11y/anchor-ambiguous-text -----
11358
+ type JsxA11YAnchorAmbiguousText = []|[{
11359
+ words?: string[]
11360
+ [k: string]: unknown | undefined
11361
+ }]
11362
+ // ----- jsx-a11y/anchor-has-content -----
11363
+ type JsxA11YAnchorHasContent = []|[{
11364
+ components?: string[]
11365
+ [k: string]: unknown | undefined
11366
+ }]
11367
+ // ----- jsx-a11y/anchor-is-valid -----
11368
+ type JsxA11YAnchorIsValid = []|[{
11369
+ components?: string[]
11370
+ specialLink?: string[]
11371
+
11372
+ aspects?: [("noHref" | "invalidHref" | "preferButton"), ...(("noHref" | "invalidHref" | "preferButton"))[]]
11373
+ [k: string]: unknown | undefined
11374
+ }]
11375
+ // ----- jsx-a11y/aria-activedescendant-has-tabindex -----
11376
+ type JsxA11YAriaActivedescendantHasTabindex = []|[{
11377
+ [k: string]: unknown | undefined
11378
+ }]
11379
+ // ----- jsx-a11y/aria-props -----
11380
+ type JsxA11YAriaProps = []|[{
11381
+ [k: string]: unknown | undefined
11382
+ }]
11383
+ // ----- jsx-a11y/aria-proptypes -----
11384
+ type JsxA11YAriaProptypes = []|[{
11385
+ [k: string]: unknown | undefined
11386
+ }]
11387
+ // ----- jsx-a11y/aria-role -----
11388
+ type JsxA11YAriaRole = []|[{
11389
+ allowedInvalidRoles?: string[]
11390
+ ignoreNonDOM?: boolean
11391
+ [k: string]: unknown | undefined
11392
+ }]
11393
+ // ----- jsx-a11y/aria-unsupported-elements -----
11394
+ type JsxA11YAriaUnsupportedElements = []|[{
11395
+ [k: string]: unknown | undefined
11396
+ }]
11397
+ // ----- jsx-a11y/autocomplete-valid -----
11398
+ type JsxA11YAutocompleteValid = []|[{
11399
+ inputComponents?: string[]
11400
+ [k: string]: unknown | undefined
11401
+ }]
11402
+ // ----- jsx-a11y/click-events-have-key-events -----
11403
+ type JsxA11YClickEventsHaveKeyEvents = []|[{
11404
+ [k: string]: unknown | undefined
11405
+ }]
11406
+ // ----- jsx-a11y/control-has-associated-label -----
11407
+ type JsxA11YControlHasAssociatedLabel = []|[{
11408
+ labelAttributes?: string[]
11409
+ controlComponents?: string[]
11410
+ ignoreElements?: string[]
11411
+ ignoreRoles?: string[]
11412
+
11413
+ depth?: number
11414
+ [k: string]: unknown | undefined
11415
+ }]
11416
+ // ----- jsx-a11y/heading-has-content -----
11417
+ type JsxA11YHeadingHasContent = []|[{
11418
+ components?: string[]
11419
+ [k: string]: unknown | undefined
11420
+ }]
11421
+ // ----- jsx-a11y/html-has-lang -----
11422
+ type JsxA11YHtmlHasLang = []|[{
11423
+ [k: string]: unknown | undefined
11424
+ }]
11425
+ // ----- jsx-a11y/iframe-has-title -----
11426
+ type JsxA11YIframeHasTitle = []|[{
11427
+ [k: string]: unknown | undefined
11428
+ }]
11429
+ // ----- jsx-a11y/img-redundant-alt -----
11430
+ type JsxA11YImgRedundantAlt = []|[{
11431
+ components?: string[]
11432
+ words?: string[]
11433
+ [k: string]: unknown | undefined
11434
+ }]
11435
+ // ----- jsx-a11y/interactive-supports-focus -----
11436
+ type JsxA11YInteractiveSupportsFocus = []|[{
11437
+
11438
+ tabbable?: ("button" | "checkbox" | "columnheader" | "combobox" | "grid" | "gridcell" | "link" | "listbox" | "menu" | "menubar" | "menuitem" | "menuitemcheckbox" | "menuitemradio" | "option" | "progressbar" | "radio" | "radiogroup" | "row" | "rowheader" | "scrollbar" | "searchbox" | "slider" | "spinbutton" | "switch" | "tab" | "tablist" | "textbox" | "tree" | "treegrid" | "treeitem" | "doc-backlink" | "doc-biblioref" | "doc-glossref" | "doc-noteref")[]
11439
+ [k: string]: unknown | undefined
11440
+ }]
11441
+ // ----- jsx-a11y/label-has-associated-control -----
11442
+ type JsxA11YLabelHasAssociatedControl = []|[{
11443
+ labelComponents?: string[]
11444
+ labelAttributes?: string[]
11445
+ controlComponents?: string[]
11446
+
11447
+ assert?: ("htmlFor" | "nesting" | "both" | "either")
11448
+
11449
+ depth?: number
11450
+ [k: string]: unknown | undefined
11451
+ }]
11452
+ // ----- jsx-a11y/label-has-for -----
11453
+ type JsxA11YLabelHasFor = []|[{
11454
+ components?: string[]
11455
+ required?: (("nesting" | "id") | {
11456
+
11457
+ some: ("nesting" | "id")[]
11458
+ [k: string]: unknown | undefined
11459
+ } | {
11460
+
11461
+ every: ("nesting" | "id")[]
11462
+ [k: string]: unknown | undefined
11463
+ })
11464
+ allowChildren?: boolean
11465
+ [k: string]: unknown | undefined
11466
+ }]
11467
+ // ----- jsx-a11y/lang -----
11468
+ type JsxA11YLang = []|[{
11469
+ [k: string]: unknown | undefined
11470
+ }]
11471
+ // ----- jsx-a11y/media-has-caption -----
11472
+ type JsxA11YMediaHasCaption = []|[{
11473
+ audio?: string[]
11474
+ video?: string[]
11475
+ track?: string[]
11476
+ [k: string]: unknown | undefined
11477
+ }]
11478
+ // ----- jsx-a11y/mouse-events-have-key-events -----
11479
+ type JsxA11YMouseEventsHaveKeyEvents = []|[{
11480
+
11481
+ hoverInHandlers?: string[]
11482
+
11483
+ hoverOutHandlers?: string[]
11484
+ [k: string]: unknown | undefined
11485
+ }]
11486
+ // ----- jsx-a11y/no-access-key -----
11487
+ type JsxA11YNoAccessKey = []|[{
11488
+ [k: string]: unknown | undefined
11489
+ }]
11490
+ // ----- jsx-a11y/no-aria-hidden-on-focusable -----
11491
+ type JsxA11YNoAriaHiddenOnFocusable = []|[{
11492
+ [k: string]: unknown | undefined
11493
+ }]
11494
+ // ----- jsx-a11y/no-autofocus -----
11495
+ type JsxA11YNoAutofocus = []|[{
11496
+ ignoreNonDOM?: boolean
11497
+ [k: string]: unknown | undefined
11498
+ }]
11499
+ // ----- jsx-a11y/no-distracting-elements -----
11500
+ type JsxA11YNoDistractingElements = []|[{
11501
+
11502
+ elements?: ("marquee" | "blink")[]
11503
+ [k: string]: unknown | undefined
11504
+ }]
11505
+ // ----- jsx-a11y/no-interactive-element-to-noninteractive-role -----
11506
+ type JsxA11YNoInteractiveElementToNoninteractiveRole = []|[{
11507
+ [k: string]: string[] | undefined
11508
+ }]
11509
+ // ----- jsx-a11y/no-noninteractive-element-interactions -----
11510
+ type JsxA11YNoNoninteractiveElementInteractions = []|[{
11511
+ handlers?: string[]
11512
+ [k: string]: unknown | undefined
11513
+ }]
11514
+ // ----- jsx-a11y/no-noninteractive-element-to-interactive-role -----
11515
+ type JsxA11YNoNoninteractiveElementToInteractiveRole = []|[{
11516
+ [k: string]: string[] | undefined
11517
+ }]
11518
+ // ----- jsx-a11y/no-noninteractive-tabindex -----
11519
+ type JsxA11YNoNoninteractiveTabindex = []|[{
11520
+
11521
+ roles?: string[]
11522
+
11523
+ tags?: string[]
11524
+ [k: string]: unknown | undefined
11525
+ }]
11526
+ // ----- jsx-a11y/no-onchange -----
11527
+ type JsxA11YNoOnchange = []|[{
11528
+ [k: string]: unknown | undefined
11529
+ }]
11530
+ // ----- jsx-a11y/no-redundant-roles -----
11531
+ type JsxA11YNoRedundantRoles = []|[{
11532
+ [k: string]: string[] | undefined
11533
+ }]
11534
+ // ----- jsx-a11y/no-static-element-interactions -----
11535
+ type JsxA11YNoStaticElementInteractions = []|[{
11536
+ handlers?: string[]
11537
+ [k: string]: unknown | undefined
11538
+ }]
11539
+ // ----- jsx-a11y/prefer-tag-over-role -----
11540
+ type JsxA11YPreferTagOverRole = []|[{
11541
+ [k: string]: unknown | undefined
11542
+ }]
11543
+ // ----- jsx-a11y/role-has-required-aria-props -----
11544
+ type JsxA11YRoleHasRequiredAriaProps = []|[{
11545
+ [k: string]: unknown | undefined
11546
+ }]
11547
+ // ----- jsx-a11y/role-supports-aria-props -----
11548
+ type JsxA11YRoleSupportsAriaProps = []|[{
11549
+ [k: string]: unknown | undefined
11550
+ }]
11551
+ // ----- jsx-a11y/scope -----
11552
+ type JsxA11YScope = []|[{
11553
+ [k: string]: unknown | undefined
11554
+ }]
11555
+ // ----- jsx-a11y/tabindex-no-positive -----
11556
+ type JsxA11YTabindexNoPositive = []|[{
11557
+ [k: string]: unknown | undefined
11558
+ }]
11146
11559
  // ----- jsx-quotes -----
11147
11560
  type JsxQuotes = []|[("prefer-single" | "prefer-double")]
11148
11561
  // ----- key-spacing -----
@@ -16789,7 +17202,30 @@ interface FallbackOptions {
16789
17202
  }
16790
17203
  declare function fallback(missingList?: string[], options?: FallbackOptions): Promise<Config[]>;
16791
17204
 
16792
- declare function ignores(ignores?: string[]): Promise<Config[]>;
17205
+ /**
17206
+ * Generates an ESLint configuration section that merges built-in glob exclusions
17207
+ * with user-provided ignore patterns.
17208
+ *
17209
+ * Accepts either:
17210
+ * - An array of glob patterns to append to the default exclusions.
17211
+ * - A function that receives the original exclusions and returns a transformed array.
17212
+ *
17213
+ * The result is a single configuration entry named `@bfra.me/ignores` containing the
17214
+ * computed ignore list.
17215
+ *
17216
+ * @param userIgnores - An array of glob patterns to add to the defaults, or a
17217
+ * function that maps the original exclusions to a new set. Defaults to an empty array.
17218
+ * @returns A promise resolving to an array with one `Config` object that includes the merged ignores.
17219
+ *
17220
+ * @example
17221
+ * // Append additional patterns
17222
+ * await ignores(['dist/**', 'coverage/**'])
17223
+ *
17224
+ * @example
17225
+ * // Transform the defaults
17226
+ * await ignores((originals) => originals.filter((p) => !p.includes('node_modules')))
17227
+ */
17228
+ declare function ignores(userIgnores?: string[] | ((originals: string[]) => string[])): Promise<Config[]>;
16793
17229
  declare function gitignore(gitignoreOptions?: FlatGitignoreOptions): Promise<Config[]>;
16794
17230
 
16795
17231
  /**
@@ -17494,6 +17930,15 @@ type Options = Flatten<{
17494
17930
  * @default true
17495
17931
  */
17496
17932
  gitignore?: boolean | FlatGitignoreOptions;
17933
+ /**
17934
+ * Extend the global ignores.
17935
+ *
17936
+ * Passing an array to extends the ignores.
17937
+ * Passing a function to modify the default ignores.
17938
+ *
17939
+ * @default []
17940
+ */
17941
+ ignores?: string[] | ((originals: string[]) => string[]);
17497
17942
  /**
17498
17943
  * Options to override the behavior of import-related rules.
17499
17944
  *
package/lib/index.js CHANGED
@@ -112,7 +112,7 @@ var GLOB_EXCLUDE = [
112
112
  import { fileURLToPath } from "url";
113
113
 
114
114
  // package.json
115
- var version = "0.45.1";
115
+ var version = "0.46.0";
116
116
 
117
117
  // src/parsers/any-parser.ts
118
118
  var lineBreakPattern = /\r\n|[\n\r\u2028\u2029]/u;
@@ -350,11 +350,17 @@ function eslintComments() {
350
350
  }
351
351
 
352
352
  // src/configs/ignores.ts
353
- async function ignores(ignores2 = []) {
353
+ async function ignores(userIgnores = []) {
354
+ let ignores2 = [...GLOB_EXCLUDE];
355
+ if (typeof userIgnores === "function") {
356
+ ignores2 = userIgnores(ignores2);
357
+ } else {
358
+ ignores2.push(...userIgnores);
359
+ }
354
360
  return [
355
361
  {
356
362
  name: "@bfra.me/ignores",
357
- ignores: [...GLOB_EXCLUDE, ...ignores2]
363
+ ignores: ignores2
358
364
  }
359
365
  ];
360
366
  }
@@ -2222,6 +2228,7 @@ async function defineConfig(options = {}, ...userConfigs) {
2222
2228
  const {
2223
2229
  astro: enableAstro = false,
2224
2230
  gitignore: enableGitignore = true,
2231
+ ignores: userIgnores = [],
2225
2232
  imports: enableImports = true,
2226
2233
  jsx: enableJsx = true,
2227
2234
  nextjs: enableNextjs = false,
@@ -2252,7 +2259,7 @@ async function defineConfig(options = {}, ...userConfigs) {
2252
2259
  configs.push(gitignore(enableGitignore === true ? { strict: false } : enableGitignore));
2253
2260
  }
2254
2261
  configs.push(
2255
- ignores(options.ignores),
2262
+ ignores(userIgnores),
2256
2263
  javascript({ isInEditor, overrides: getOverrides(options, "javascript") }),
2257
2264
  eslintComments(),
2258
2265
  node(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bfra.me/eslint-config",
3
- "version": "0.45.1",
3
+ "version": "0.46.0",
4
4
  "description": "Shared ESLint configuration for bfra.me",
5
5
  "keywords": [
6
6
  "bfra.me",
@@ -66,7 +66,7 @@
66
66
  "@eslint-react/eslint-plugin": "2.3.9",
67
67
  "@eslint/config-inspector": "1.4.2",
68
68
  "@eslint/core": "1.0.0",
69
- "@next/eslint-plugin-next": "16.0.4",
69
+ "@next/eslint-plugin-next": "16.0.5",
70
70
  "@types/eslint-config-prettier": "6.11.3",
71
71
  "@types/eslint-plugin-jsx-a11y": "6.10.1",
72
72
  "@typescript-eslint/types": "8.48.0",
@@ -3,11 +3,44 @@ import type {Config} from '../config'
3
3
  import {GLOB_EXCLUDE} from '../globs'
4
4
  import {interopDefault} from '../utils'
5
5
 
6
- export async function ignores(ignores: string[] = []): Promise<Config[]> {
6
+ /**
7
+ * Generates an ESLint configuration section that merges built-in glob exclusions
8
+ * with user-provided ignore patterns.
9
+ *
10
+ * Accepts either:
11
+ * - An array of glob patterns to append to the default exclusions.
12
+ * - A function that receives the original exclusions and returns a transformed array.
13
+ *
14
+ * The result is a single configuration entry named `@bfra.me/ignores` containing the
15
+ * computed ignore list.
16
+ *
17
+ * @param userIgnores - An array of glob patterns to add to the defaults, or a
18
+ * function that maps the original exclusions to a new set. Defaults to an empty array.
19
+ * @returns A promise resolving to an array with one `Config` object that includes the merged ignores.
20
+ *
21
+ * @example
22
+ * // Append additional patterns
23
+ * await ignores(['dist/**', 'coverage/**'])
24
+ *
25
+ * @example
26
+ * // Transform the defaults
27
+ * await ignores((originals) => originals.filter((p) => !p.includes('node_modules')))
28
+ */
29
+ export async function ignores(
30
+ userIgnores: string[] | ((originals: string[]) => string[]) = [],
31
+ ): Promise<Config[]> {
32
+ let ignores = [...GLOB_EXCLUDE]
33
+
34
+ if (typeof userIgnores === 'function') {
35
+ ignores = userIgnores(ignores)
36
+ } else {
37
+ ignores.push(...userIgnores)
38
+ }
39
+
7
40
  return [
8
41
  {
9
42
  name: '@bfra.me/ignores',
10
- ignores: [...GLOB_EXCLUDE, ...ignores],
43
+ ignores,
11
44
  },
12
45
  ]
13
46
  }
@@ -66,6 +66,7 @@ export async function defineConfig<C extends Config = Config, CN extends ConfigN
66
66
  const {
67
67
  astro: enableAstro = false,
68
68
  gitignore: enableGitignore = true,
69
+ ignores: userIgnores = [],
69
70
  imports: enableImports = true,
70
71
  jsx: enableJsx = true,
71
72
  nextjs: enableNextjs = false,
@@ -108,7 +109,7 @@ export async function defineConfig<C extends Config = Config, CN extends ConfigN
108
109
  }
109
110
 
110
111
  configs.push(
111
- ignores(options.ignores),
112
+ ignores(userIgnores),
112
113
  javascript({isInEditor, overrides: getOverrides(options, 'javascript')}),
113
114
  eslintComments(),
114
115
  node(),
package/src/options.ts CHANGED
@@ -207,6 +207,16 @@ export type Options = Flatten<
207
207
  */
208
208
  gitignore?: boolean | FlatGitignoreOptions
209
209
 
210
+ /**
211
+ * Extend the global ignores.
212
+ *
213
+ * Passing an array to extends the ignores.
214
+ * Passing a function to modify the default ignores.
215
+ *
216
+ * @default []
217
+ */
218
+ ignores?: string[] | ((originals: string[]) => string[])
219
+
210
220
  /**
211
221
  * Options to override the behavior of import-related rules.
212
222
  *
package/src/rules.d.ts CHANGED
@@ -2722,6 +2722,204 @@ export interface Rules {
2722
2722
  * @see https://ota-meshi.github.io/eslint-plugin-jsonc/rules/vue-custom-block/no-parsing-error.html
2723
2723
  */
2724
2724
  'jsonc/vue-custom-block/no-parsing-error'?: Linter.RuleEntry<[]>
2725
+ /**
2726
+ * Enforce emojis are wrapped in `<span>` and provide screen reader access.
2727
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/accessible-emoji.md
2728
+ * @deprecated
2729
+ */
2730
+ 'jsx-a11y/accessible-emoji'?: Linter.RuleEntry<JsxA11YAccessibleEmoji>
2731
+ /**
2732
+ * Enforce all elements that require alternative text have meaningful information to relay back to end user.
2733
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/alt-text.md
2734
+ */
2735
+ 'jsx-a11y/alt-text'?: Linter.RuleEntry<JsxA11YAltText>
2736
+ /**
2737
+ * Enforce `<a>` text to not exactly match "click here", "here", "link", or "a link".
2738
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-ambiguous-text.md
2739
+ */
2740
+ 'jsx-a11y/anchor-ambiguous-text'?: Linter.RuleEntry<JsxA11YAnchorAmbiguousText>
2741
+ /**
2742
+ * Enforce all anchors to contain accessible content.
2743
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-has-content.md
2744
+ */
2745
+ 'jsx-a11y/anchor-has-content'?: Linter.RuleEntry<JsxA11YAnchorHasContent>
2746
+ /**
2747
+ * Enforce all anchors are valid, navigable elements.
2748
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/anchor-is-valid.md
2749
+ */
2750
+ 'jsx-a11y/anchor-is-valid'?: Linter.RuleEntry<JsxA11YAnchorIsValid>
2751
+ /**
2752
+ * Enforce elements with aria-activedescendant are tabbable.
2753
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-activedescendant-has-tabindex.md
2754
+ */
2755
+ 'jsx-a11y/aria-activedescendant-has-tabindex'?: Linter.RuleEntry<JsxA11YAriaActivedescendantHasTabindex>
2756
+ /**
2757
+ * Enforce all `aria-*` props are valid.
2758
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-props.md
2759
+ */
2760
+ 'jsx-a11y/aria-props'?: Linter.RuleEntry<JsxA11YAriaProps>
2761
+ /**
2762
+ * Enforce ARIA state and property values are valid.
2763
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-proptypes.md
2764
+ */
2765
+ 'jsx-a11y/aria-proptypes'?: Linter.RuleEntry<JsxA11YAriaProptypes>
2766
+ /**
2767
+ * Enforce that elements with ARIA roles must use a valid, non-abstract ARIA role.
2768
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-role.md
2769
+ */
2770
+ 'jsx-a11y/aria-role'?: Linter.RuleEntry<JsxA11YAriaRole>
2771
+ /**
2772
+ * Enforce that elements that do not support ARIA roles, states, and properties do not have those attributes.
2773
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/aria-unsupported-elements.md
2774
+ */
2775
+ 'jsx-a11y/aria-unsupported-elements'?: Linter.RuleEntry<JsxA11YAriaUnsupportedElements>
2776
+ /**
2777
+ * Enforce that autocomplete attributes are used correctly.
2778
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/autocomplete-valid.md
2779
+ */
2780
+ 'jsx-a11y/autocomplete-valid'?: Linter.RuleEntry<JsxA11YAutocompleteValid>
2781
+ /**
2782
+ * Enforce a clickable non-interactive element has at least one keyboard event listener.
2783
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/click-events-have-key-events.md
2784
+ */
2785
+ 'jsx-a11y/click-events-have-key-events'?: Linter.RuleEntry<JsxA11YClickEventsHaveKeyEvents>
2786
+ /**
2787
+ * Enforce that a control (an interactive element) has a text label.
2788
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/control-has-associated-label.md
2789
+ */
2790
+ 'jsx-a11y/control-has-associated-label'?: Linter.RuleEntry<JsxA11YControlHasAssociatedLabel>
2791
+ /**
2792
+ * Enforce heading (`h1`, `h2`, etc) elements contain accessible content.
2793
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/heading-has-content.md
2794
+ */
2795
+ 'jsx-a11y/heading-has-content'?: Linter.RuleEntry<JsxA11YHeadingHasContent>
2796
+ /**
2797
+ * Enforce `<html>` element has `lang` prop.
2798
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/html-has-lang.md
2799
+ */
2800
+ 'jsx-a11y/html-has-lang'?: Linter.RuleEntry<JsxA11YHtmlHasLang>
2801
+ /**
2802
+ * Enforce iframe elements have a title attribute.
2803
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/iframe-has-title.md
2804
+ */
2805
+ 'jsx-a11y/iframe-has-title'?: Linter.RuleEntry<JsxA11YIframeHasTitle>
2806
+ /**
2807
+ * Enforce `<img>` alt prop does not contain the word "image", "picture", or "photo".
2808
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/img-redundant-alt.md
2809
+ */
2810
+ 'jsx-a11y/img-redundant-alt'?: Linter.RuleEntry<JsxA11YImgRedundantAlt>
2811
+ /**
2812
+ * Enforce that elements with interactive handlers like `onClick` must be focusable.
2813
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/interactive-supports-focus.md
2814
+ */
2815
+ 'jsx-a11y/interactive-supports-focus'?: Linter.RuleEntry<JsxA11YInteractiveSupportsFocus>
2816
+ /**
2817
+ * Enforce that a `label` tag has a text label and an associated control.
2818
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/docs/rules/label-has-associated-control.md
2819
+ */
2820
+ 'jsx-a11y/label-has-associated-control'?: Linter.RuleEntry<JsxA11YLabelHasAssociatedControl>
2821
+ /**
2822
+ * Enforce that `<label>` elements have the `htmlFor` prop.
2823
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/label-has-for.md
2824
+ * @deprecated
2825
+ */
2826
+ 'jsx-a11y/label-has-for'?: Linter.RuleEntry<JsxA11YLabelHasFor>
2827
+ /**
2828
+ * Enforce lang attribute has a valid value.
2829
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/lang.md
2830
+ */
2831
+ 'jsx-a11y/lang'?: Linter.RuleEntry<JsxA11YLang>
2832
+ /**
2833
+ * Enforces that `<audio>` and `<video>` elements must have a `<track>` for captions.
2834
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/media-has-caption.md
2835
+ */
2836
+ 'jsx-a11y/media-has-caption'?: Linter.RuleEntry<JsxA11YMediaHasCaption>
2837
+ /**
2838
+ * Enforce that `onMouseOver`/`onMouseOut` are accompanied by `onFocus`/`onBlur` for keyboard-only users.
2839
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/mouse-events-have-key-events.md
2840
+ */
2841
+ 'jsx-a11y/mouse-events-have-key-events'?: Linter.RuleEntry<JsxA11YMouseEventsHaveKeyEvents>
2842
+ /**
2843
+ * Enforce that the `accessKey` prop is not used on any element to avoid complications with keyboard commands used by a screen reader.
2844
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-access-key.md
2845
+ */
2846
+ 'jsx-a11y/no-access-key'?: Linter.RuleEntry<JsxA11YNoAccessKey>
2847
+ /**
2848
+ * Disallow `aria-hidden="true"` from being set on focusable elements.
2849
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-aria-hidden-on-focusable.md
2850
+ */
2851
+ 'jsx-a11y/no-aria-hidden-on-focusable'?: Linter.RuleEntry<JsxA11YNoAriaHiddenOnFocusable>
2852
+ /**
2853
+ * Enforce autoFocus prop is not used.
2854
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-autofocus.md
2855
+ */
2856
+ 'jsx-a11y/no-autofocus'?: Linter.RuleEntry<JsxA11YNoAutofocus>
2857
+ /**
2858
+ * Enforce distracting elements are not used.
2859
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-distracting-elements.md
2860
+ */
2861
+ 'jsx-a11y/no-distracting-elements'?: Linter.RuleEntry<JsxA11YNoDistractingElements>
2862
+ /**
2863
+ * Interactive elements should not be assigned non-interactive roles.
2864
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-interactive-element-to-noninteractive-role.md
2865
+ */
2866
+ 'jsx-a11y/no-interactive-element-to-noninteractive-role'?: Linter.RuleEntry<JsxA11YNoInteractiveElementToNoninteractiveRole>
2867
+ /**
2868
+ * Non-interactive elements should not be assigned mouse or keyboard event listeners.
2869
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-element-interactions.md
2870
+ */
2871
+ 'jsx-a11y/no-noninteractive-element-interactions'?: Linter.RuleEntry<JsxA11YNoNoninteractiveElementInteractions>
2872
+ /**
2873
+ * Non-interactive elements should not be assigned interactive roles.
2874
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-element-to-interactive-role.md
2875
+ */
2876
+ 'jsx-a11y/no-noninteractive-element-to-interactive-role'?: Linter.RuleEntry<JsxA11YNoNoninteractiveElementToInteractiveRole>
2877
+ /**
2878
+ * `tabIndex` should only be declared on interactive elements.
2879
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-noninteractive-tabindex.md
2880
+ */
2881
+ 'jsx-a11y/no-noninteractive-tabindex'?: Linter.RuleEntry<JsxA11YNoNoninteractiveTabindex>
2882
+ /**
2883
+ * Enforce usage of `onBlur` over `onChange` on select menus for accessibility.
2884
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-onchange.md
2885
+ * @deprecated
2886
+ */
2887
+ 'jsx-a11y/no-onchange'?: Linter.RuleEntry<JsxA11YNoOnchange>
2888
+ /**
2889
+ * Enforce explicit role property is not the same as implicit/default role property on element.
2890
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-redundant-roles.md
2891
+ */
2892
+ 'jsx-a11y/no-redundant-roles'?: Linter.RuleEntry<JsxA11YNoRedundantRoles>
2893
+ /**
2894
+ * Enforce that non-interactive, visible elements (such as `<div>`) that have click handlers use the role attribute.
2895
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/no-static-element-interactions.md
2896
+ */
2897
+ 'jsx-a11y/no-static-element-interactions'?: Linter.RuleEntry<JsxA11YNoStaticElementInteractions>
2898
+ /**
2899
+ * Enforces using semantic DOM elements over the ARIA `role` property.
2900
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/prefer-tag-over-role.md
2901
+ */
2902
+ 'jsx-a11y/prefer-tag-over-role'?: Linter.RuleEntry<JsxA11YPreferTagOverRole>
2903
+ /**
2904
+ * Enforce that elements with ARIA roles must have all required attributes for that role.
2905
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/role-has-required-aria-props.md
2906
+ */
2907
+ 'jsx-a11y/role-has-required-aria-props'?: Linter.RuleEntry<JsxA11YRoleHasRequiredAriaProps>
2908
+ /**
2909
+ * Enforce that elements with explicit or implicit roles defined contain only `aria-*` properties supported by that `role`.
2910
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/role-supports-aria-props.md
2911
+ */
2912
+ 'jsx-a11y/role-supports-aria-props'?: Linter.RuleEntry<JsxA11YRoleSupportsAriaProps>
2913
+ /**
2914
+ * Enforce `scope` prop is only used on `<th>` elements.
2915
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/scope.md
2916
+ */
2917
+ 'jsx-a11y/scope'?: Linter.RuleEntry<JsxA11YScope>
2918
+ /**
2919
+ * Enforce `tabIndex` value is not greater than zero.
2920
+ * @see https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/tree/HEAD/docs/rules/tabindex-no-positive.md
2921
+ */
2922
+ 'jsx-a11y/tabindex-no-positive'?: Linter.RuleEntry<JsxA11YTabindexNoPositive>
2725
2923
  /**
2726
2924
  * Enforce the consistent use of either double or single quotes in JSX attributes
2727
2925
  * @see https://eslint.org/docs/latest/rules/jsx-quotes
@@ -11134,6 +11332,221 @@ type JsoncSpaceUnaryOps = []|[{
11134
11332
  [k: string]: boolean | undefined
11135
11333
  }
11136
11334
  }]
11335
+ // ----- jsx-a11y/accessible-emoji -----
11336
+ type JsxA11YAccessibleEmoji = []|[{
11337
+ [k: string]: unknown | undefined
11338
+ }]
11339
+ // ----- jsx-a11y/alt-text -----
11340
+ type JsxA11YAltText = []|[{
11341
+ elements?: string[]
11342
+ img?: string[]
11343
+ object?: string[]
11344
+ area?: string[]
11345
+ "input[type=\"image\"]"?: string[]
11346
+ [k: string]: unknown | undefined
11347
+ }]
11348
+ // ----- jsx-a11y/anchor-ambiguous-text -----
11349
+ type JsxA11YAnchorAmbiguousText = []|[{
11350
+ words?: string[]
11351
+ [k: string]: unknown | undefined
11352
+ }]
11353
+ // ----- jsx-a11y/anchor-has-content -----
11354
+ type JsxA11YAnchorHasContent = []|[{
11355
+ components?: string[]
11356
+ [k: string]: unknown | undefined
11357
+ }]
11358
+ // ----- jsx-a11y/anchor-is-valid -----
11359
+ type JsxA11YAnchorIsValid = []|[{
11360
+ components?: string[]
11361
+ specialLink?: string[]
11362
+
11363
+ aspects?: [("noHref" | "invalidHref" | "preferButton"), ...(("noHref" | "invalidHref" | "preferButton"))[]]
11364
+ [k: string]: unknown | undefined
11365
+ }]
11366
+ // ----- jsx-a11y/aria-activedescendant-has-tabindex -----
11367
+ type JsxA11YAriaActivedescendantHasTabindex = []|[{
11368
+ [k: string]: unknown | undefined
11369
+ }]
11370
+ // ----- jsx-a11y/aria-props -----
11371
+ type JsxA11YAriaProps = []|[{
11372
+ [k: string]: unknown | undefined
11373
+ }]
11374
+ // ----- jsx-a11y/aria-proptypes -----
11375
+ type JsxA11YAriaProptypes = []|[{
11376
+ [k: string]: unknown | undefined
11377
+ }]
11378
+ // ----- jsx-a11y/aria-role -----
11379
+ type JsxA11YAriaRole = []|[{
11380
+ allowedInvalidRoles?: string[]
11381
+ ignoreNonDOM?: boolean
11382
+ [k: string]: unknown | undefined
11383
+ }]
11384
+ // ----- jsx-a11y/aria-unsupported-elements -----
11385
+ type JsxA11YAriaUnsupportedElements = []|[{
11386
+ [k: string]: unknown | undefined
11387
+ }]
11388
+ // ----- jsx-a11y/autocomplete-valid -----
11389
+ type JsxA11YAutocompleteValid = []|[{
11390
+ inputComponents?: string[]
11391
+ [k: string]: unknown | undefined
11392
+ }]
11393
+ // ----- jsx-a11y/click-events-have-key-events -----
11394
+ type JsxA11YClickEventsHaveKeyEvents = []|[{
11395
+ [k: string]: unknown | undefined
11396
+ }]
11397
+ // ----- jsx-a11y/control-has-associated-label -----
11398
+ type JsxA11YControlHasAssociatedLabel = []|[{
11399
+ labelAttributes?: string[]
11400
+ controlComponents?: string[]
11401
+ ignoreElements?: string[]
11402
+ ignoreRoles?: string[]
11403
+
11404
+ depth?: number
11405
+ [k: string]: unknown | undefined
11406
+ }]
11407
+ // ----- jsx-a11y/heading-has-content -----
11408
+ type JsxA11YHeadingHasContent = []|[{
11409
+ components?: string[]
11410
+ [k: string]: unknown | undefined
11411
+ }]
11412
+ // ----- jsx-a11y/html-has-lang -----
11413
+ type JsxA11YHtmlHasLang = []|[{
11414
+ [k: string]: unknown | undefined
11415
+ }]
11416
+ // ----- jsx-a11y/iframe-has-title -----
11417
+ type JsxA11YIframeHasTitle = []|[{
11418
+ [k: string]: unknown | undefined
11419
+ }]
11420
+ // ----- jsx-a11y/img-redundant-alt -----
11421
+ type JsxA11YImgRedundantAlt = []|[{
11422
+ components?: string[]
11423
+ words?: string[]
11424
+ [k: string]: unknown | undefined
11425
+ }]
11426
+ // ----- jsx-a11y/interactive-supports-focus -----
11427
+ type JsxA11YInteractiveSupportsFocus = []|[{
11428
+
11429
+ tabbable?: ("button" | "checkbox" | "columnheader" | "combobox" | "grid" | "gridcell" | "link" | "listbox" | "menu" | "menubar" | "menuitem" | "menuitemcheckbox" | "menuitemradio" | "option" | "progressbar" | "radio" | "radiogroup" | "row" | "rowheader" | "scrollbar" | "searchbox" | "slider" | "spinbutton" | "switch" | "tab" | "tablist" | "textbox" | "tree" | "treegrid" | "treeitem" | "doc-backlink" | "doc-biblioref" | "doc-glossref" | "doc-noteref")[]
11430
+ [k: string]: unknown | undefined
11431
+ }]
11432
+ // ----- jsx-a11y/label-has-associated-control -----
11433
+ type JsxA11YLabelHasAssociatedControl = []|[{
11434
+ labelComponents?: string[]
11435
+ labelAttributes?: string[]
11436
+ controlComponents?: string[]
11437
+
11438
+ assert?: ("htmlFor" | "nesting" | "both" | "either")
11439
+
11440
+ depth?: number
11441
+ [k: string]: unknown | undefined
11442
+ }]
11443
+ // ----- jsx-a11y/label-has-for -----
11444
+ type JsxA11YLabelHasFor = []|[{
11445
+ components?: string[]
11446
+ required?: (("nesting" | "id") | {
11447
+
11448
+ some: ("nesting" | "id")[]
11449
+ [k: string]: unknown | undefined
11450
+ } | {
11451
+
11452
+ every: ("nesting" | "id")[]
11453
+ [k: string]: unknown | undefined
11454
+ })
11455
+ allowChildren?: boolean
11456
+ [k: string]: unknown | undefined
11457
+ }]
11458
+ // ----- jsx-a11y/lang -----
11459
+ type JsxA11YLang = []|[{
11460
+ [k: string]: unknown | undefined
11461
+ }]
11462
+ // ----- jsx-a11y/media-has-caption -----
11463
+ type JsxA11YMediaHasCaption = []|[{
11464
+ audio?: string[]
11465
+ video?: string[]
11466
+ track?: string[]
11467
+ [k: string]: unknown | undefined
11468
+ }]
11469
+ // ----- jsx-a11y/mouse-events-have-key-events -----
11470
+ type JsxA11YMouseEventsHaveKeyEvents = []|[{
11471
+
11472
+ hoverInHandlers?: string[]
11473
+
11474
+ hoverOutHandlers?: string[]
11475
+ [k: string]: unknown | undefined
11476
+ }]
11477
+ // ----- jsx-a11y/no-access-key -----
11478
+ type JsxA11YNoAccessKey = []|[{
11479
+ [k: string]: unknown | undefined
11480
+ }]
11481
+ // ----- jsx-a11y/no-aria-hidden-on-focusable -----
11482
+ type JsxA11YNoAriaHiddenOnFocusable = []|[{
11483
+ [k: string]: unknown | undefined
11484
+ }]
11485
+ // ----- jsx-a11y/no-autofocus -----
11486
+ type JsxA11YNoAutofocus = []|[{
11487
+ ignoreNonDOM?: boolean
11488
+ [k: string]: unknown | undefined
11489
+ }]
11490
+ // ----- jsx-a11y/no-distracting-elements -----
11491
+ type JsxA11YNoDistractingElements = []|[{
11492
+
11493
+ elements?: ("marquee" | "blink")[]
11494
+ [k: string]: unknown | undefined
11495
+ }]
11496
+ // ----- jsx-a11y/no-interactive-element-to-noninteractive-role -----
11497
+ type JsxA11YNoInteractiveElementToNoninteractiveRole = []|[{
11498
+ [k: string]: string[] | undefined
11499
+ }]
11500
+ // ----- jsx-a11y/no-noninteractive-element-interactions -----
11501
+ type JsxA11YNoNoninteractiveElementInteractions = []|[{
11502
+ handlers?: string[]
11503
+ [k: string]: unknown | undefined
11504
+ }]
11505
+ // ----- jsx-a11y/no-noninteractive-element-to-interactive-role -----
11506
+ type JsxA11YNoNoninteractiveElementToInteractiveRole = []|[{
11507
+ [k: string]: string[] | undefined
11508
+ }]
11509
+ // ----- jsx-a11y/no-noninteractive-tabindex -----
11510
+ type JsxA11YNoNoninteractiveTabindex = []|[{
11511
+
11512
+ roles?: string[]
11513
+
11514
+ tags?: string[]
11515
+ [k: string]: unknown | undefined
11516
+ }]
11517
+ // ----- jsx-a11y/no-onchange -----
11518
+ type JsxA11YNoOnchange = []|[{
11519
+ [k: string]: unknown | undefined
11520
+ }]
11521
+ // ----- jsx-a11y/no-redundant-roles -----
11522
+ type JsxA11YNoRedundantRoles = []|[{
11523
+ [k: string]: string[] | undefined
11524
+ }]
11525
+ // ----- jsx-a11y/no-static-element-interactions -----
11526
+ type JsxA11YNoStaticElementInteractions = []|[{
11527
+ handlers?: string[]
11528
+ [k: string]: unknown | undefined
11529
+ }]
11530
+ // ----- jsx-a11y/prefer-tag-over-role -----
11531
+ type JsxA11YPreferTagOverRole = []|[{
11532
+ [k: string]: unknown | undefined
11533
+ }]
11534
+ // ----- jsx-a11y/role-has-required-aria-props -----
11535
+ type JsxA11YRoleHasRequiredAriaProps = []|[{
11536
+ [k: string]: unknown | undefined
11537
+ }]
11538
+ // ----- jsx-a11y/role-supports-aria-props -----
11539
+ type JsxA11YRoleSupportsAriaProps = []|[{
11540
+ [k: string]: unknown | undefined
11541
+ }]
11542
+ // ----- jsx-a11y/scope -----
11543
+ type JsxA11YScope = []|[{
11544
+ [k: string]: unknown | undefined
11545
+ }]
11546
+ // ----- jsx-a11y/tabindex-no-positive -----
11547
+ type JsxA11YTabindexNoPositive = []|[{
11548
+ [k: string]: unknown | undefined
11549
+ }]
11137
11550
  // ----- jsx-quotes -----
11138
11551
  type JsxQuotes = []|[("prefer-single" | "prefer-double")]
11139
11552
  // ----- key-spacing -----