Skip to content

Commit e69b113

Browse files
odinholjharb
authored andcommitted
[Fix] jsx-no-target-blank: allow rel to be an expression
Previously this would be an error, since the rel wasn't read: <a target={"_blank"} href={"//"} rel={"noopener noreferrer"}> Now this works, so you can enable this rule together with `jsx-curly-brace-presence`. Fixes #2508.
1 parent fc6e406 commit e69b113

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

lib/rules/jsx-no-target-blank.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,17 @@ function hasDynamicLink(element, linkAttribute) {
4343
function hasSecureRel(element, allowReferrer) {
4444
return element.attributes.find((attr) => {
4545
if (attr.type === 'JSXAttribute' && attr.name.name === 'rel') {
46-
const tags = attr.value && attr.value.type === 'Literal' && attr.value.value.toLowerCase().split(' ');
47-
return tags && (tags.indexOf('noopener') >= 0 && (allowReferrer || tags.indexOf('noreferrer') >= 0));
46+
const value = attr.value &&
47+
((
48+
attr.value.type === 'Literal' &&
49+
attr.value.value
50+
) || (
51+
attr.value.type === 'JSXExpressionContainer' &&
52+
attr.value.expression &&
53+
attr.value.expression.value
54+
));
55+
const tags = value && value.toLowerCase && value.toLowerCase().split(' ');
56+
return tags && tags.indexOf('noopener') >= 0 && (allowReferrer || tags.indexOf('noreferrer') >= 0);
4857
}
4958
return false;
5059
});

tests/lib/rules/jsx-no-target-blank.js

+12
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,23 @@ ruleTester.run('jsx-no-target-blank', rule, {
3636
{code: '<a randomTag></a>'},
3737
{code: '<a target />'},
3838
{code: '<a href="foobar" target="_blank" rel="noopener noreferrer"></a>'},
39+
{code: '<a href="foobar" target="_blank" rel={"noopener noreferrer"}></a>'},
40+
{code: '<a href={"foobar"} target={"_blank"} rel={"noopener noreferrer"}></a>'},
41+
{code: '<a href={\'foobar\'} target={\'_blank\'} rel={\'noopener noreferrer\'}></a>'},
42+
{code: '<a href={`foobar`} target={`_blank`} rel={`noopener noreferrer`}></a>'},
3943
{code: '<a target="_blank" {...spreadProps} rel="noopener noreferrer"></a>'},
4044
{code: '<a {...spreadProps} target="_blank" rel="noopener noreferrer" href="http://example.com">s</a>'},
4145
{code: '<a target="_blank" rel="noopener noreferrer" {...spreadProps}></a>'},
4246
{code: '<p target="_blank"></p>'},
4347
{code: '<a href="foobar" target="_BLANK" rel="NOOPENER noreferrer"></a>'},
4448
{code: '<a target="_blank" rel={relValue}></a>'},
4549
{code: '<a target={targetValue} rel="noopener noreferrer"></a>'},
50+
{code: '<a target={targetValue} rel={"noopener noreferrer"}></a>'},
4651
{code: '<a target={targetValue} href="relative/path"></a>'},
4752
{code: '<a target={targetValue} href="/absolute/path"></a>'},
4853
{code: '<a target={\'targetValue\'} href="/absolute/path"></a>'},
4954
{code: '<a target={"targetValue"} href="/absolute/path"></a>'},
55+
{code: '<a target={null} href="//example.com"></a>'},
5056
{
5157
code: '<a target="_blank" href={ dynamicLink }></a>',
5258
options: [{enforceDynamicLinks: 'never'}]
@@ -98,6 +104,12 @@ ruleTester.run('jsx-no-target-blank', rule, {
98104
}, {
99105
code: '<a target="_blank" href="//example.com" rel={null}></a>',
100106
errors: defaultErrors
107+
}, {
108+
code: '<a target="_blank" href="//example.com" rel={"noopenernoreferrer"}></a>',
109+
errors: defaultErrors
110+
}, {
111+
code: '<a target={"_blank"} href={"//example.com"} rel={"noopenernoreferrer"}></a>',
112+
errors: defaultErrors
101113
}, {
102114
code: '<a target="_blank" href="//example.com" rel></a>',
103115
errors: defaultErrors

0 commit comments

Comments
 (0)