@@ -65,7 +65,7 @@ function hasDynamicLink(node, linkAttribute) {
65
65
}
66
66
}
67
67
68
- function getStringFromValue ( value ) {
68
+ function getStringFromValue ( value , targetValue ) {
69
69
if ( value ) {
70
70
if ( value . type === 'Literal' ) {
71
71
return value . value ;
@@ -75,24 +75,32 @@ function getStringFromValue(value) {
75
75
return value . expression . quasis [ 0 ] . value . cooked ;
76
76
}
77
77
const expr = value . expression ;
78
- return expr && (
79
- expr . type === 'ConditionalExpression'
80
- ? [ expr . consequent . value , expr . alternate . value ]
81
- : expr . value
82
- ) ;
78
+ if ( expr && ( expr . type === 'ConditionalExpression' ) ) {
79
+ const relValues = [ expr . consequent . value , expr . alternate . value ] ;
80
+ if ( targetValue . type === 'JSXExpressionContainer' && targetValue . expression && targetValue . expression . type === 'ConditionalExpression' ) {
81
+ const targetTestCond = targetValue . expression . test . name ;
82
+ const relTestCond = value . expression . test . name ;
83
+ const targetBlankIndex = [ targetValue . expression . consequent . value , targetValue . expression . alternate . value ] . indexOf ( '_blank' ) ;
84
+ if ( targetTestCond === relTestCond ) return relValues [ targetBlankIndex ] ;
85
+ }
86
+ return relValues ;
87
+ }
88
+ return expr . value ;
83
89
}
84
90
}
85
91
return null ;
86
92
}
87
93
88
94
function hasSecureRel ( node , allowReferrer , warnOnSpreadAttributes , spreadAttributeIndex ) {
89
95
const relIndex = findLastIndex ( node . attributes , ( attr ) => ( attr . type === 'JSXAttribute' && attr . name . name === 'rel' ) ) ;
96
+ const targetIndex = findLastIndex ( node . attributes , ( attr ) => ( attr . type === 'JSXAttribute' && attr . name . name === 'target' ) ) ;
90
97
if ( relIndex === - 1 || ( warnOnSpreadAttributes && relIndex < spreadAttributeIndex ) ) {
91
98
return false ;
92
99
}
93
100
94
101
const relAttribute = node . attributes [ relIndex ] ;
95
- const value = getStringFromValue ( relAttribute . value ) ;
102
+ const targetAttributeValue = node . attributes [ targetIndex ] && node . attributes [ targetIndex ] . value ;
103
+ const value = getStringFromValue ( relAttribute . value , targetAttributeValue ) ;
96
104
return [ ] . concat ( value ) . every ( ( item ) => {
97
105
const tags = typeof item === 'string' ? item . toLowerCase ( ) . split ( ' ' ) : false ;
98
106
const noreferrer = tags && tags . indexOf ( 'noreferrer' ) >= 0 ;
0 commit comments