1
1
'use strict'
2
+ const { getJSXOpeningElementAttribute} = require ( '../utils/get-jsx-opening-element-attribute' )
3
+ const { getJSXOpeningElementName} = require ( '../utils/get-jsx-opening-element-name' )
2
4
3
5
module . exports = {
4
6
meta : {
@@ -28,9 +30,7 @@ module.exports = {
28
30
specifier => specifier . imported && specifier . imported . name === 'Tooltip' ,
29
31
)
30
32
31
- const hasOtherImports = node . specifiers . some (
32
- specifier => specifier . imported && specifier . imported . name !== 'Tooltip' ,
33
- )
33
+ const hasOtherImports = node . specifiers . length > 1
34
34
if ( ! hasTooltip ) {
35
35
return
36
36
}
@@ -46,10 +46,26 @@ module.exports = {
46
46
const tooltipSpecifier = node . specifiers . find (
47
47
specifier => specifier . imported && specifier . imported . name === 'Tooltip' ,
48
48
)
49
+
50
+ const tokensToRemove = [ ' ' , ',' ]
51
+ const tooltipIsFirstImport = tooltipSpecifier === node . specifiers [ 0 ]
52
+ const tooltipIsLastImport = tooltipSpecifier === node . specifiers [ node . specifiers . length - 1 ]
53
+ const tooltipIsNotFirstOrLastImport = ! tooltipIsFirstImport && ! tooltipIsLastImport
54
+
55
+ const sourceCode = context . getSourceCode ( )
56
+ const canRemoveBefore = tooltipIsNotFirstOrLastImport
57
+ ? false
58
+ : tokensToRemove . includes ( sourceCode . getTokenBefore ( tooltipSpecifier ) . value )
59
+ const canRemoveAfter = tokensToRemove . includes ( sourceCode . getTokenAfter ( tooltipSpecifier ) . value )
60
+ const start = canRemoveBefore
61
+ ? sourceCode . getTokenBefore ( tooltipSpecifier ) . range [ 0 ]
62
+ : tooltipSpecifier . range [ 0 ]
63
+ const end = canRemoveAfter
64
+ ? sourceCode . getTokenAfter ( tooltipSpecifier ) . range [ 1 ] + 1
65
+ : tooltipSpecifier . range [ 1 ]
49
66
return [
50
67
// remove tooltip specifier and the space and comma after it
51
- fixer . removeRange ( [ tooltipSpecifier . range [ 0 ] , tooltipSpecifier . range [ 1 ] + 2 ] ) ,
52
- // fixer.remove(tooltipSpecifier),
68
+ fixer . removeRange ( [ start , end ] ) ,
53
69
fixer . insertTextAfterRange (
54
70
[ node . range [ 1 ] , node . range [ 1 ] ] ,
55
71
`\nimport {Tooltip} from '@primer/react/experimental';` ,
@@ -59,40 +75,48 @@ module.exports = {
59
75
} ,
60
76
} )
61
77
} ,
62
- JSXAttribute ( node ) {
63
- if ( node . name . name === 'aria-label' ) {
78
+ JSXOpeningElement ( node ) {
79
+ const openingElName = getJSXOpeningElementName ( node )
80
+ if ( openingElName !== 'Tooltip' ) {
81
+ return
82
+ }
83
+ const ariaLabel = getJSXOpeningElementAttribute ( node , 'aria-label' )
84
+ if ( ariaLabel !== undefined ) {
64
85
context . report ( {
65
86
node,
66
87
messageId : 'useTextProp' ,
67
88
fix ( fixer ) {
68
- return fixer . replaceText ( node . name , 'text' )
89
+ return fixer . replaceText ( ariaLabel . name , 'text' )
69
90
} ,
70
91
} )
71
92
}
72
- if ( node . name . name === 'noDelay' ) {
93
+ const noDelay = getJSXOpeningElementAttribute ( node , 'noDelay' )
94
+ if ( noDelay !== undefined ) {
73
95
context . report ( {
74
96
node,
75
97
messageId : 'noDelayRemoved' ,
76
98
fix ( fixer ) {
77
- return fixer . remove ( node )
99
+ return fixer . remove ( noDelay )
78
100
} ,
79
101
} )
80
102
}
81
- if ( node . name . name === 'wrap' ) {
103
+ const wrap = getJSXOpeningElementAttribute ( node , 'wrap' )
104
+ if ( wrap !== undefined ) {
82
105
context . report ( {
83
106
node,
84
107
messageId : 'wrapRemoved' ,
85
108
fix ( fixer ) {
86
- return fixer . remove ( node )
109
+ return fixer . remove ( wrap )
87
110
} ,
88
111
} )
89
112
}
90
- if ( node . name . name === 'align' ) {
113
+ const align = getJSXOpeningElementAttribute ( node , 'align' )
114
+ if ( align !== undefined ) {
91
115
context . report ( {
92
116
node,
93
117
messageId : 'alignRemoved' ,
94
118
fix ( fixer ) {
95
- return fixer . remove ( node )
119
+ return fixer . remove ( align )
96
120
} ,
97
121
} )
98
122
}
0 commit comments