Skip to content

Commit

Permalink
refactor jsx-no-target-blank.js with ES2015 features
Browse files Browse the repository at this point in the history
  • Loading branch information
gfx committed May 22, 2017
1 parent 664e5df commit 89c33b6
Showing 1 changed file with 30 additions and 31 deletions.
61 changes: 30 additions & 31 deletions lib/rules/jsx-no-target-blank.js
Expand Up @@ -8,6 +8,31 @@
// Rule Definition
// ------------------------------------------------------------------------------

function isTargetBlank(attr) {
return attr.name.name === 'target' &&
attr.value.type === 'Literal' &&
attr.value.value.toLowerCase() === '_blank';
}

function hasExternalLink(element) {
return element.attributes.find(function (attr) {
return attr.name &&
attr.name.name === 'href' &&
attr.value.type === 'Literal' &&
/^(?:\w+:|\/\/)/.test(attr.value.value);
});
}

function hasSecureRel(element) {
return element.attributes.find(function (attr) {
if (attr.name.name === 'rel') {
var tags = attr.value.type === 'Literal' && attr.value.value.toLowerCase().split(' ');
return !tags || (tags.indexOf('noopener') >= 0 && tags.indexOf('noreferrer') >= 0);
}
return false;
});
}

module.exports = {
meta: {
docs: {
Expand All @@ -26,38 +51,12 @@ module.exports = {
}

if (
node.name.name === 'target' &&
node.value.type === 'Literal' &&
node.value.value.toLowerCase() === '_blank'
isTargetBlank(node) &&
hasExternalLink(node.parent) &&
!hasSecureRel(node.parent)
) {
var relFound = false;
var attrs = node.parent.attributes;
for (var idx in attrs) {
if (!Object.prototype.hasOwnProperty.call(attrs, idx)) {
continue;
}
var attr = attrs[idx];
if (!attr.name) {
continue;
}
if (attr.name.name === 'href') {
if (attr.value.type === 'Literal' && !/^(?:\w+:|\/\/)/.test(attr.value.value)) {
// it's safe because it is not an external link (i.e. doesn't start with a protocol)
return;
}
}
if (attr.name.name === 'rel') {
var tags = attr.value.type === 'Literal' && attr.value.value.toLowerCase().split(' ');
if (!tags || (tags.indexOf('noopener') >= 0 && tags.indexOf('noreferrer') >= 0)) {
relFound = true;
break;
}
}
}
if (!relFound) {
context.report(node, 'Using target="_blank" without rel="noopener noreferrer" ' +
'is a security risk: see https://mathiasbynens.github.io/rel-noopener');
}
context.report(node, 'Using target="_blank" without rel="noopener noreferrer" ' +
'is a security risk: see https://mathiasbynens.github.io/rel-noopener');
}
}
};
Expand Down

0 comments on commit 89c33b6

Please sign in to comment.