Skip to content

Commit a758c4a

Browse files
authored
[new] - Add no-autofocus rule. (#147)
1 parent abd4ca4 commit a758c4a

File tree

5 files changed

+107
-0
lines changed

5 files changed

+107
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ You can also enable all the recommended rules at once. Add `plugin:jsx-a11y/reco
100100
- [lang](docs/rules/lang.md): Enforce lang attribute has a valid value.
101101
- [mouse-events-have-key-events](docs/rules/mouse-events-have-key-events.md): Enforce that `onMouseOver`/`onMouseOut` are accompanied by `onFocus`/`onBlur` for keyboard-only users.
102102
- [no-access-key](docs/rules/no-access-key.md): Enforce that the `accessKey` prop is not used on any element to avoid complications with keyboard commands used by a screenreader.
103+
- [no-autofocus](docs/rules/no-autofocus.md): Enforce autoFocus prop is not used.
103104
- [no-distracting-elements](docs/rules/no-distracting-elements.md): Enforce distracting elements are not used.
104105
- [no-onchange](docs/rules/no-onchange.md): Enforce usage of `onBlur` over `onChange` on select menus for accessibility.
105106
- [no-static-element-interactions](docs/rules/no-static-element-interactions.md): Enforce non-interactive elements have no interactive handlers.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* eslint-env jest */
2+
/**
3+
* @fileoverview Enforce autoFocus prop is not used.
4+
* @author Ethan Cohen <@evcohen>
5+
*/
6+
7+
// -----------------------------------------------------------------------------
8+
// Requirements
9+
// -----------------------------------------------------------------------------
10+
11+
import { RuleTester } from 'eslint';
12+
import rule from '../../../src/rules/no-autofocus';
13+
14+
const parserOptions = {
15+
ecmaVersion: 6,
16+
ecmaFeatures: {
17+
jsx: true,
18+
},
19+
};
20+
21+
// -----------------------------------------------------------------------------
22+
// Tests
23+
// -----------------------------------------------------------------------------
24+
25+
const ruleTester = new RuleTester();
26+
27+
const expectedError = {
28+
message: 'The autoFocus prop should not be used, as it can reduce usability and accessibility for users.',
29+
type: 'JSXAttribute',
30+
};
31+
32+
ruleTester.run('no-autofocus', rule, {
33+
valid: [
34+
{ code: '<div />;', parserOptions },
35+
{ code: '<div autofocus />;', parserOptions },
36+
{ code: '<input autofocus="true" />;', parserOptions },
37+
],
38+
invalid: [
39+
{ code: '<div autoFocus />', errors: [expectedError], parserOptions },
40+
{ code: '<div autoFocus={true} />', errors: [expectedError], parserOptions },
41+
{ code: '<div autoFocus={false} />', errors: [expectedError], parserOptions },
42+
{ code: '<div autoFocus={undefined} />', errors: [expectedError], parserOptions },
43+
{ code: '<div autoFocus="true" />', errors: [expectedError], parserOptions },
44+
{ code: '<div autoFocus="false" />', errors: [expectedError], parserOptions },
45+
{ code: '<input autoFocus />', errors: [expectedError], parserOptions },
46+
],
47+
});

docs/rules/no-autofocus.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# no-autofocus
2+
3+
Enforce that autoFocus prop is not used on elements. Autofocusing elements can cause usability issues for sighted and non-sighted users, alike.
4+
5+
#### References
6+
1. [w3c](https://w3c.github.io/html/sec-forms.html#autofocusing-a-form-control-the-autofocus-attribute)
7+
8+
## Rule details
9+
10+
This rule takes no arguments.
11+
12+
### Succeed
13+
```jsx
14+
<div />
15+
```
16+
17+
### Fail
18+
```jsx
19+
<div autoFocus />
20+
<div autoFocus="true" />
21+
<div autoFocus="false" />
22+
<div autoFocus={undefined} />
23+
```

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module.exports = {
2020
lang: require('./rules/lang'),
2121
'mouse-events-have-key-events': require('./rules/mouse-events-have-key-events'),
2222
'no-access-key': require('./rules/no-access-key'),
23+
'no-autofocus': require('./rules/no-autofocus'),
2324
'no-distracting-elements': require('./rules/no-distracting-elements'),
2425
'no-onchange': require('./rules/no-onchange'),
2526
'no-static-element-interactions': require('./rules/no-static-element-interactions'),
@@ -55,6 +56,7 @@ module.exports = {
5556
'jsx-a11y/label-has-for': 'error',
5657
'jsx-a11y/mouse-events-have-key-events': 'error',
5758
'jsx-a11y/no-access-key': 'error',
59+
'jsx-a11y/no-autofocus': 'error',
5860
'jsx-a11y/no-distracting-elements': 'error',
5961
'jsx-a11y/no-onchange': 'error',
6062
'jsx-a11y/no-static-element-interactions': 'warn',

src/rules/no-autofocus.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* @fileoverview Enforce autoFocus prop is not used.
3+
* @author Ethan Cohen <@evcohen>
4+
*/
5+
6+
// ----------------------------------------------------------------------------
7+
// Rule Definition
8+
// ----------------------------------------------------------------------------
9+
10+
import { propName } from 'jsx-ast-utils';
11+
import { generateObjSchema } from '../util/schemas';
12+
13+
const errorMessage = 'The autoFocus prop should not be used, as it can reduce usability and accessibility for users.';
14+
15+
const schema = generateObjSchema();
16+
17+
module.exports = {
18+
meta: {
19+
docs: {},
20+
schema: [schema],
21+
},
22+
23+
create: context => ({
24+
JSXAttribute: (attribute) => {
25+
// Don't normalize, since React only recognizes autoFocus on low-level DOM elements.
26+
if (propName(attribute) === 'autoFocus') {
27+
context.report({
28+
node: attribute,
29+
message: errorMessage,
30+
});
31+
}
32+
},
33+
}),
34+
};

0 commit comments

Comments
 (0)