Skip to content

Commit 27c7e24

Browse files
add a fix to replace the path
1 parent 21a0497 commit 27c7e24

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/rules/__tests__/use-next-tooltip.test.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,27 @@ const ruleTester = new RuleTester({
1313

1414
ruleTester.run('use-next-tooltip', rule, {
1515
valid: [
16-
`import {Tooltip} from '@primer/react/next'`,
16+
`import {Tooltip} from '@primer/react/next';`,
1717
`import {UnderlineNav, Button} from '@primer/react';
1818
import {Tooltip} from '@primer/react/next';`,
1919
`import {UnderlineNav, Button} from '@primer/react';
2020
import {Tooltip, SelectPanel} from '@primer/react/next';`,
2121
],
2222
invalid: [
2323
{
24-
code: `import {Tooltip} from '@primer/react'`,
24+
code: `import {Tooltip} from '@primer/react';`,
2525
errors: [{messageId: 'useNextTooltip'}],
26+
output: `import {Tooltip} from '@primer/react/next';`,
2627
},
2728
{
28-
code: `import {Tooltip, Button} from '@primer/react'`,
29+
code: `import {Tooltip, Button} from '@primer/react';`,
2930
errors: [{messageId: 'useNextTooltip'}],
31+
output: `import {Button} from '@primer/react';\nimport {Tooltip} from '@primer/react/next';`,
32+
},
33+
{
34+
code: `import {ActionList, ActionMenu, Tooltip, Button} from '@primer/react';`,
35+
errors: [{messageId: 'useNextTooltip'}],
36+
output: `import {ActionList, ActionMenu, Button} from '@primer/react';\nimport {Tooltip} from '@primer/react/next';`,
3037
},
3138
],
3239
})

src/rules/use-next-tooltip.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module.exports = {
88
category: 'Best Practices',
99
recommended: true,
1010
},
11-
fixable: null,
11+
fixable: true,
1212
schema: [],
1313
messages: {
1414
useNextTooltip: 'Please use @primer/react/next Tooltip component that has accessibility improvements',
@@ -23,12 +23,36 @@ module.exports = {
2323
const hasTooltip = node.specifiers.some(
2424
specifier => specifier.imported && specifier.imported.name === 'Tooltip',
2525
)
26+
27+
const hasOtherImports = node.specifiers.some(
28+
specifier => specifier.imported && specifier.imported.name !== 'Tooltip',
29+
)
2630
if (!hasTooltip) {
2731
return
2832
}
2933
context.report({
3034
node,
3135
messageId: 'useNextTooltip',
36+
fix(fixer) {
37+
// If Tooltip is the only import, replace the whole import statement
38+
if (!hasOtherImports) {
39+
return fixer.replaceText(node.source, `'@primer/react/next'`)
40+
} else {
41+
// Otherwise, remove Tooltip from the import statement and add a new import statement with the correct path
42+
const tooltipSpecifier = node.specifiers.find(
43+
specifier => specifier.imported && specifier.imported.name === 'Tooltip',
44+
)
45+
return [
46+
// remove tooltip specifier and the space and comma after it
47+
fixer.removeRange([tooltipSpecifier.range[0], tooltipSpecifier.range[1] + 2]),
48+
// fixer.remove(tooltipSpecifier),
49+
fixer.insertTextAfterRange(
50+
[node.range[1], node.range[1]],
51+
`\nimport {Tooltip} from '@primer/react/next';`,
52+
),
53+
]
54+
}
55+
},
3256
})
3357
},
3458
}

0 commit comments

Comments
 (0)