Skip to content

Commit f247946

Browse files
author
Ethan Cohen
committed
Handle null valued props for valid-aria-role.
Fixes #4
1 parent d1b873b commit f247946

File tree

2 files changed

+15
-7
lines changed

2 files changed

+15
-7
lines changed

src/rules/valid-aria-role.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,34 @@ import getAttributeValue from '../util/getAttributeValue';
1313

1414
const errorMessage = 'Elements with ARIA roles must use a valid, non-abstract ARIA role.';
1515

16+
const report = (context, node) => context.report({
17+
node,
18+
message: errorMessage
19+
});
20+
1621
module.exports = context => ({
1722
JSXAttribute: attribute => {
1823
const normalizedName = attribute.name.name.toUpperCase();
19-
const normalizedType = attribute.value.type.toUpperCase();
20-
2124
if (normalizedName !== 'ROLE') {
2225
return;
2326
}
2427

28+
const normalizedType = attribute.value === null ? 'NULL' : attribute.value.type.toUpperCase();
29+
2530
// Only check literals, as we cannot enforce variables representing role types.
2631
// Check expression containers to determine null or undefined values.
2732
if (normalizedType === 'JSXEXPRESSIONCONTAINER') {
2833
const expressionValue = getAttributeValue(attribute);
2934
const isUndefinedOrNull = expressionValue === undefined || expressionValue === null;
3035

3136
if (isUndefinedOrNull) {
32-
context.report({
33-
node: attribute,
34-
message: errorMessage
35-
});
37+
report(context, attribute);
3638
}
3739

40+
return;
41+
} else if (normalizedType === 'NULL') {
42+
// Report when <div role /> -- this assumes property truthiness, which is not a valid role.
43+
report(context, attribute);
3844
return;
3945
} else if (normalizedType !== 'LITERAL') {
4046
return;

tests/src/rules/valid-aria-role.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,16 @@ ruleTester.run('valid-aria-role', rule, {
4545
{ code: '<div></div>', parserOptions },
4646
{ code: '<div role={role} />', parserOptions },
4747
{ code: '<div role={role || "button"} />', parserOptions },
48-
{ code: '<div role={role || "foobar"} />', parserOptions }
48+
{ code: '<div role={role || "foobar"} />', parserOptions },
49+
{ code: '<Bar baz />', parserOptions }
4950
].concat(basicValidityTests),
5051
invalid: [
5152
{ code: '<div role="foobar" />', errors: [ errorMessage ], parserOptions },
5253
{ code: '<div role="datepicker"></div>', errors: [ errorMessage ], parserOptions },
5354
{ code: '<div role="range"></div>', errors: [ errorMessage ], parserOptions },
5455
{ code: '<div role=""></div>', errors: [ errorMessage ], parserOptions },
5556
{ code: '<div role={undefined}></div>', errors: [ errorMessage ], parserOptions },
57+
{ code: '<div role />', errors: [ errorMessage ], parserOptions },
5658
{ code: '<div role={null}></div>', errors: [ errorMessage ], parserOptions }
5759
]
5860
});

0 commit comments

Comments
 (0)