Skip to content

Commit e9864f1

Browse files
committed
Add suggestions for no-template-target-blank rule
1 parent dd3df38 commit e9864f1

File tree

2 files changed

+86
-6
lines changed

2 files changed

+86
-6
lines changed

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,34 @@ function hasDynamicLink(node) {
6767
)
6868
}
6969

70+
/** @param {VAttribute} node */
71+
function getSuggestions(node) {
72+
/** @type {Rule.SuggestionReportDescriptor[]} */
73+
const suggestions = []
74+
75+
const relAttributeNode = node.parent.attributes.find(
76+
(attribute) => attribute.key.name === 'rel'
77+
)
78+
79+
if (relAttributeNode) {
80+
suggestions.push({
81+
desc: 'Change `rel` attribute value to `noopener noreferrer`.',
82+
fix(fixer) {
83+
return fixer.replaceText(relAttributeNode, 'rel="noopener noreferrer"')
84+
}
85+
})
86+
} else {
87+
suggestions.push({
88+
desc: 'Add `rel="noopener noreferrer"`.',
89+
fix(fixer) {
90+
return fixer.insertTextAfter(node, ' rel="noopener noreferrer"')
91+
}
92+
})
93+
}
94+
95+
return suggestions
96+
}
97+
7098
module.exports = {
7199
meta: {
72100
type: 'problem',
@@ -76,6 +104,7 @@ module.exports = {
76104
categories: undefined,
77105
url: 'https://eslint.vuejs.org/rules/no-template-target-blank.html'
78106
},
107+
hasSuggestions: true,
79108
schema: [
80109
{
81110
type: 'object',
@@ -118,7 +147,8 @@ module.exports = {
118147
context.report({
119148
node,
120149
message:
121-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
150+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
151+
suggest: getSuggestions(node)
122152
})
123153
}
124154
}

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

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,31 +49,81 @@ ruleTester.run('no-template-target-blank', rule, {
4949
{
5050
code: '<template><a href="https://eslint.vuejs.org" target="_blank">link</a></template>',
5151
errors: [
52-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
52+
{
53+
message:
54+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
55+
suggestions: [
56+
{
57+
desc: 'Add `rel="noopener noreferrer"`.',
58+
output:
59+
'<template><a href="https://eslint.vuejs.org" target="_blank" rel="noopener noreferrer">link</a></template>'
60+
}
61+
]
62+
}
5363
]
5464
},
5565
{
5666
code: '<template><a href="https://eslint.vuejs.org" target="_blank" rel="noopenernoreferrer">link</a></template>',
5767
errors: [
58-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
68+
{
69+
message:
70+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
71+
suggestions: [
72+
{
73+
desc: 'Change `rel` attribute value to `noopener noreferrer`.',
74+
output:
75+
'<template><a href="https://eslint.vuejs.org" target="_blank" rel="noopener noreferrer">link</a></template>'
76+
}
77+
]
78+
}
5979
]
6080
},
6181
{
6282
code: '<template><a :href="link" target="_blank" rel=3>link</a></template>',
6383
errors: [
64-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
84+
{
85+
message:
86+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
87+
suggestions: [
88+
{
89+
desc: 'Change `rel` attribute value to `noopener noreferrer`.',
90+
output:
91+
'<template><a :href="link" target="_blank" rel="noopener noreferrer">link</a></template>'
92+
}
93+
]
94+
}
6595
]
6696
},
6797
{
6898
code: '<template><a :href="link" target="_blank">link</a></template>',
6999
errors: [
70-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
100+
{
101+
message:
102+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
103+
suggestions: [
104+
{
105+
desc: 'Add `rel="noopener noreferrer"`.',
106+
output:
107+
'<template><a :href="link" target="_blank" rel="noopener noreferrer">link</a></template>'
108+
}
109+
]
110+
}
71111
]
72112
},
73113
{
74114
code: '<template><a href="https://eslint.vuejs.org" target="_blank" rel="noopener">link</a></template>',
75115
errors: [
76-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
116+
{
117+
message:
118+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
119+
suggestions: [
120+
{
121+
desc: 'Change `rel` attribute value to `noopener noreferrer`.',
122+
output:
123+
'<template><a href="https://eslint.vuejs.org" target="_blank" rel="noopener noreferrer">link</a></template>'
124+
}
125+
]
126+
}
77127
]
78128
}
79129
]

0 commit comments

Comments
 (0)