Skip to content

Commit 4415918

Browse files
authored
[new] - Better error reporting for aria-unsupported-elements (#57)
* [new] - Better error reporting for aria-unsupported-elements Instead of only listing the first error as it comes, we can list all of them in a `forEach` and say which prop is invalid for `aria-unsupported-elements` * clearer message for aria-unsupported-elements
1 parent 10a472a commit 4415918

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

src/rules/aria-unsupported-elements.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010

1111
import DOM from '../util/attributes/DOM';
1212
import ARIA from '../util/attributes/ARIA';
13-
import { hasAnyProp, elementType } from 'jsx-ast-utils';
13+
import { elementType } from 'jsx-ast-utils';
1414

15-
const errorMessage = 'This element does not support ARIA roles, states and properties.';
15+
const errorMessage = invalidProp =>
16+
`This element does not support ARIA roles, states and properties. Try removing the prop '${invalidProp}'.`;
1617

1718
module.exports = context => ({
1819
JSXOpeningElement: node => {
@@ -26,14 +27,15 @@ module.exports = context => ({
2627
}
2728

2829
const invalidAttributes = Object.keys(ARIA).concat('ROLE');
29-
const hasInvalidAttribute = hasAnyProp(node.attributes, invalidAttributes);
3030

31-
if (hasInvalidAttribute) {
32-
context.report({
33-
node,
34-
message: errorMessage
35-
});
36-
}
31+
node.attributes.forEach(prop => {
32+
if (invalidAttributes.indexOf(prop.name.name.toUpperCase()) > -1) {
33+
context.report({
34+
node,
35+
message: errorMessage(prop.name.name)
36+
});
37+
}
38+
});
3739
}
3840
});
3941

src/rules/role-supports-aria-props.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import ROLES from '../util/attributes/role';
1313
import ARIA from '../util/attributes/ARIA';
1414
import getImplicitRole from '../util/getImplicitRole';
15-
import { getProp, getLiteralPropValue, elementType, hasAnyProp } from 'jsx-ast-utils';
15+
import { getProp, getLiteralPropValue, elementType } from 'jsx-ast-utils';
1616

1717
const errorMessage = (attr, role, tag, isImplicit) => {
1818
if (isImplicit) {

tests/src/rules/aria-unsupported-elements.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ const ruleTester = new RuleTester();
2727

2828
import DOM from '../../../src/util/attributes/DOM';
2929

30-
const errorMessage = {
31-
message: 'This element does not support ARIA roles, states and properties.',
30+
const errorMessage = invalidProp => ({
31+
message: `This element does not support ARIA roles, states and properties. Try removing the prop '${invalidProp}'.`,
3232
type: 'JSXOpeningElement'
33-
};
33+
});
3434

3535
// Generate valid test cases
3636
const roleValidityTests = Object.keys(DOM).map(element => {
@@ -58,15 +58,15 @@ const invalidRoleValidityTests = Object.keys(DOM)
5858
.filter(element => Boolean(DOM[element].reserved))
5959
.map(reservedElem => ({
6060
code: `<${reservedElem} role />`,
61-
errors: [ errorMessage ],
61+
errors: [ errorMessage('role') ],
6262
parserOptions
6363
}));
6464

6565
const invalidAriaValidityTests = Object.keys(DOM)
6666
.filter(element => Boolean(DOM[element].reserved))
6767
.map(reservedElem => ({
6868
code: `<${reservedElem} aria-hidden />`,
69-
errors: [ errorMessage ],
69+
errors: [ errorMessage('aria-hidden') ],
7070
parserOptions
7171
}));
7272

0 commit comments

Comments
 (0)