index.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. "use strict";
  2. /* eslint-disable global-require */
  3. module.exports = {
  4. rules: {
  5. 'accessible-emoji': require('./rules/accessible-emoji'),
  6. 'alt-text': require('./rules/alt-text'),
  7. 'anchor-ambiguous-text': require('./rules/anchor-ambiguous-text'),
  8. 'anchor-has-content': require('./rules/anchor-has-content'),
  9. 'anchor-is-valid': require('./rules/anchor-is-valid'),
  10. 'aria-activedescendant-has-tabindex': require('./rules/aria-activedescendant-has-tabindex'),
  11. 'aria-props': require('./rules/aria-props'),
  12. 'aria-proptypes': require('./rules/aria-proptypes'),
  13. 'aria-role': require('./rules/aria-role'),
  14. 'aria-unsupported-elements': require('./rules/aria-unsupported-elements'),
  15. 'autocomplete-valid': require('./rules/autocomplete-valid'),
  16. 'click-events-have-key-events': require('./rules/click-events-have-key-events'),
  17. 'control-has-associated-label': require('./rules/control-has-associated-label'),
  18. 'heading-has-content': require('./rules/heading-has-content'),
  19. 'html-has-lang': require('./rules/html-has-lang'),
  20. 'iframe-has-title': require('./rules/iframe-has-title'),
  21. 'img-redundant-alt': require('./rules/img-redundant-alt'),
  22. 'interactive-supports-focus': require('./rules/interactive-supports-focus'),
  23. 'label-has-associated-control': require('./rules/label-has-associated-control'),
  24. 'label-has-for': require('./rules/label-has-for'),
  25. lang: require('./rules/lang'),
  26. 'media-has-caption': require('./rules/media-has-caption'),
  27. 'mouse-events-have-key-events': require('./rules/mouse-events-have-key-events'),
  28. 'no-access-key': require('./rules/no-access-key'),
  29. 'no-aria-hidden-on-focusable': require('./rules/no-aria-hidden-on-focusable'),
  30. 'no-autofocus': require('./rules/no-autofocus'),
  31. 'no-distracting-elements': require('./rules/no-distracting-elements'),
  32. 'no-interactive-element-to-noninteractive-role': require('./rules/no-interactive-element-to-noninteractive-role'),
  33. 'no-noninteractive-element-interactions': require('./rules/no-noninteractive-element-interactions'),
  34. 'no-noninteractive-element-to-interactive-role': require('./rules/no-noninteractive-element-to-interactive-role'),
  35. 'no-noninteractive-tabindex': require('./rules/no-noninteractive-tabindex'),
  36. 'no-onchange': require('./rules/no-onchange'),
  37. 'no-redundant-roles': require('./rules/no-redundant-roles'),
  38. 'no-static-element-interactions': require('./rules/no-static-element-interactions'),
  39. 'prefer-tag-over-role': require('./rules/prefer-tag-over-role'),
  40. 'role-has-required-aria-props': require('./rules/role-has-required-aria-props'),
  41. 'role-supports-aria-props': require('./rules/role-supports-aria-props'),
  42. scope: require('./rules/scope'),
  43. 'tabindex-no-positive': require('./rules/tabindex-no-positive')
  44. },
  45. configs: {
  46. recommended: {
  47. plugins: ['jsx-a11y'],
  48. parserOptions: {
  49. ecmaFeatures: {
  50. jsx: true
  51. }
  52. },
  53. rules: {
  54. 'jsx-a11y/alt-text': 'error',
  55. 'jsx-a11y/anchor-ambiguous-text': 'off',
  56. // TODO: error
  57. 'jsx-a11y/anchor-has-content': 'error',
  58. 'jsx-a11y/anchor-is-valid': 'error',
  59. 'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
  60. 'jsx-a11y/aria-props': 'error',
  61. 'jsx-a11y/aria-proptypes': 'error',
  62. 'jsx-a11y/aria-role': 'error',
  63. 'jsx-a11y/aria-unsupported-elements': 'error',
  64. 'jsx-a11y/autocomplete-valid': 'error',
  65. 'jsx-a11y/click-events-have-key-events': 'error',
  66. 'jsx-a11y/control-has-associated-label': ['off', {
  67. ignoreElements: ['audio', 'canvas', 'embed', 'input', 'textarea', 'tr', 'video'],
  68. ignoreRoles: ['grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'row', 'tablist', 'toolbar', 'tree', 'treegrid'],
  69. includeRoles: ['alert', 'dialog']
  70. }],
  71. 'jsx-a11y/heading-has-content': 'error',
  72. 'jsx-a11y/html-has-lang': 'error',
  73. 'jsx-a11y/iframe-has-title': 'error',
  74. 'jsx-a11y/img-redundant-alt': 'error',
  75. 'jsx-a11y/interactive-supports-focus': ['error', {
  76. tabbable: ['button', 'checkbox', 'link', 'searchbox', 'spinbutton', 'switch', 'textbox']
  77. }],
  78. 'jsx-a11y/label-has-associated-control': 'error',
  79. 'jsx-a11y/label-has-for': 'off',
  80. 'jsx-a11y/media-has-caption': 'error',
  81. 'jsx-a11y/mouse-events-have-key-events': 'error',
  82. 'jsx-a11y/no-access-key': 'error',
  83. 'jsx-a11y/no-autofocus': 'error',
  84. 'jsx-a11y/no-distracting-elements': 'error',
  85. 'jsx-a11y/no-interactive-element-to-noninteractive-role': ['error', {
  86. tr: ['none', 'presentation'],
  87. canvas: ['img']
  88. }],
  89. 'jsx-a11y/no-noninteractive-element-interactions': ['error', {
  90. handlers: ['onClick', 'onError', 'onLoad', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp'],
  91. alert: ['onKeyUp', 'onKeyDown', 'onKeyPress'],
  92. body: ['onError', 'onLoad'],
  93. dialog: ['onKeyUp', 'onKeyDown', 'onKeyPress'],
  94. iframe: ['onError', 'onLoad'],
  95. img: ['onError', 'onLoad']
  96. }],
  97. 'jsx-a11y/no-noninteractive-element-to-interactive-role': ['error', {
  98. ul: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
  99. ol: ['listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'],
  100. li: ['menuitem', 'option', 'row', 'tab', 'treeitem'],
  101. table: ['grid'],
  102. td: ['gridcell'],
  103. fieldset: ['radiogroup', 'presentation']
  104. }],
  105. 'jsx-a11y/no-noninteractive-tabindex': ['error', {
  106. tags: [],
  107. roles: ['tabpanel'],
  108. allowExpressionValues: true
  109. }],
  110. 'jsx-a11y/no-redundant-roles': 'error',
  111. 'jsx-a11y/no-static-element-interactions': ['error', {
  112. allowExpressionValues: true,
  113. handlers: ['onClick', 'onMouseDown', 'onMouseUp', 'onKeyPress', 'onKeyDown', 'onKeyUp']
  114. }],
  115. 'jsx-a11y/role-has-required-aria-props': 'error',
  116. 'jsx-a11y/role-supports-aria-props': 'error',
  117. 'jsx-a11y/scope': 'error',
  118. 'jsx-a11y/tabindex-no-positive': 'error'
  119. }
  120. },
  121. strict: {
  122. plugins: ['jsx-a11y'],
  123. parserOptions: {
  124. ecmaFeatures: {
  125. jsx: true
  126. }
  127. },
  128. rules: {
  129. 'jsx-a11y/alt-text': 'error',
  130. 'jsx-a11y/anchor-has-content': 'error',
  131. 'jsx-a11y/anchor-is-valid': 'error',
  132. 'jsx-a11y/aria-activedescendant-has-tabindex': 'error',
  133. 'jsx-a11y/aria-props': 'error',
  134. 'jsx-a11y/aria-proptypes': 'error',
  135. 'jsx-a11y/aria-role': 'error',
  136. 'jsx-a11y/aria-unsupported-elements': 'error',
  137. 'jsx-a11y/autocomplete-valid': 'error',
  138. 'jsx-a11y/click-events-have-key-events': 'error',
  139. 'jsx-a11y/control-has-associated-label': ['off', {
  140. ignoreElements: ['audio', 'canvas', 'embed', 'input', 'textarea', 'tr', 'video'],
  141. ignoreRoles: ['grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'row', 'tablist', 'toolbar', 'tree', 'treegrid'],
  142. includeRoles: ['alert', 'dialog']
  143. }],
  144. 'jsx-a11y/heading-has-content': 'error',
  145. 'jsx-a11y/html-has-lang': 'error',
  146. 'jsx-a11y/iframe-has-title': 'error',
  147. 'jsx-a11y/img-redundant-alt': 'error',
  148. 'jsx-a11y/interactive-supports-focus': ['error', {
  149. tabbable: ['button', 'checkbox', 'link', 'progressbar', 'searchbox', 'slider', 'spinbutton', 'switch', 'textbox']
  150. }],
  151. 'jsx-a11y/label-has-for': 'off',
  152. 'jsx-a11y/label-has-associated-control': 'error',
  153. 'jsx-a11y/media-has-caption': 'error',
  154. 'jsx-a11y/mouse-events-have-key-events': 'error',
  155. 'jsx-a11y/no-access-key': 'error',
  156. 'jsx-a11y/no-autofocus': 'error',
  157. 'jsx-a11y/no-distracting-elements': 'error',
  158. 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'error',
  159. 'jsx-a11y/no-noninteractive-element-interactions': ['error', {
  160. body: ['onError', 'onLoad'],
  161. iframe: ['onError', 'onLoad'],
  162. img: ['onError', 'onLoad']
  163. }],
  164. 'jsx-a11y/no-noninteractive-element-to-interactive-role': 'error',
  165. 'jsx-a11y/no-noninteractive-tabindex': 'error',
  166. 'jsx-a11y/no-redundant-roles': 'error',
  167. 'jsx-a11y/no-static-element-interactions': 'error',
  168. 'jsx-a11y/role-has-required-aria-props': 'error',
  169. 'jsx-a11y/role-supports-aria-props': 'error',
  170. 'jsx-a11y/scope': 'error',
  171. 'jsx-a11y/tabindex-no-positive': 'error'
  172. }
  173. }
  174. }
  175. };