Skip to content

Commit cfbfa12

Browse files
authored
Add suggestions for no-template-target-blank rule (#2111)
1 parent dd3df38 commit cfbfa12

File tree

2 files changed

+84
-6
lines changed

2 files changed

+84
-6
lines changed

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

+29-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,32 @@ function hasDynamicLink(node) {
6767
)
6868
}
6969

70+
/**
71+
* @param {VAttribute} node
72+
* @returns {Rule.SuggestionReportDescriptor}
73+
*/
74+
function getSuggestion(node) {
75+
const relAttributeNode = node.parent.attributes.find(
76+
(attribute) => attribute.key.name === 'rel'
77+
)
78+
79+
if (relAttributeNode) {
80+
return {
81+
desc: 'Change `rel` attribute value to `noopener noreferrer`.',
82+
fix(fixer) {
83+
return fixer.replaceText(relAttributeNode, 'rel="noopener noreferrer"')
84+
}
85+
}
86+
}
87+
88+
return {
89+
desc: 'Add `rel="noopener noreferrer"`.',
90+
fix(fixer) {
91+
return fixer.insertTextAfter(node, ' rel="noopener noreferrer"')
92+
}
93+
}
94+
}
95+
7096
module.exports = {
7197
meta: {
7298
type: 'problem',
@@ -76,6 +102,7 @@ module.exports = {
76102
categories: undefined,
77103
url: 'https://eslint.vuejs.org/rules/no-template-target-blank.html'
78104
},
105+
hasSuggestions: true,
79106
schema: [
80107
{
81108
type: 'object',
@@ -118,7 +145,8 @@ module.exports = {
118145
context.report({
119146
node,
120147
message:
121-
'Using target="_blank" without rel="noopener noreferrer" is a security risk.'
148+
'Using target="_blank" without rel="noopener noreferrer" is a security risk.',
149+
suggest: [getSuggestion(node)]
122150
})
123151
}
124152
}

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

+55-5
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)