Skip to content

Commit 9a58afb

Browse files
authored
fix(no-wildcard-imports): use local name when changing imports (#234)
* fix(no-wildcard-imports): use local name when changing imports * chore: remove unused sourceCode * chore: add changeset * chore: fix imports for hooks * chore: add fix for when we insert multiple imports * fix: move SelectPanel import to deprecated * chore: add to stable * test: update test * test: update expected output
1 parent e613e00 commit 9a58afb

File tree

4 files changed

+50
-29
lines changed

4 files changed

+50
-29
lines changed

.changeset/shy-news-care.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'eslint-plugin-primer-react': patch
3+
---
4+
5+
Update no-wildcard-imports rule to use local name for updated imports

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/rules/__tests__/no-wildcard-imports.test.js

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,22 +71,22 @@ ruleTester.run('no-wildcard-imports', rule, {
7171

7272
// Test default import
7373
{
74-
code: `import useIsomorphicLayoutEffect from '@primer/react/lib-esm/useIsomorphicLayoutEffect'`,
74+
code: `import useIsomorphicLayoutEffect from '@primer/react/lib-esm/utils/useIsomorphicLayoutEffect'`,
7575
output: `import {useIsomorphicLayoutEffect} from '@primer/react'`,
7676
errors: [
7777
{
7878
messageId: 'wildcardMigration',
7979
data: {
80-
wildcardEntrypoint: '@primer/react/lib-esm/useIsomorphicLayoutEffect',
80+
wildcardEntrypoint: '@primer/react/lib-esm/utils/useIsomorphicLayoutEffect',
8181
},
8282
},
8383
],
8484
},
8585

8686
// Test multiple wildcard imports into single entrypoint
8787
{
88-
code: `import useResizeObserver from '@primer/react/lib-esm/hooks/useResizeObserver'
89-
import useIsomorphicLayoutEffect from '@primer/react/lib-esm/useIsomorphicLayoutEffect'`,
88+
code: `import {useResizeObserver} from '@primer/react/lib-esm/hooks/useResizeObserver'
89+
import useIsomorphicLayoutEffect from '@primer/react/lib-esm/utils/useIsomorphicLayoutEffect'`,
9090
output: `import {useResizeObserver} from '@primer/react'
9191
import {useIsomorphicLayoutEffect} from '@primer/react'`,
9292
errors: [
@@ -99,7 +99,21 @@ ruleTester.run('no-wildcard-imports', rule, {
9999
{
100100
messageId: 'wildcardMigration',
101101
data: {
102-
wildcardEntrypoint: '@primer/react/lib-esm/useIsomorphicLayoutEffect',
102+
wildcardEntrypoint: '@primer/react/lib-esm/utils/useIsomorphicLayoutEffect',
103+
},
104+
},
105+
],
106+
},
107+
108+
// Test renamed wildcard imports
109+
{
110+
code: `import type {ItemProps} from '@primer/react/lib-esm/deprecated/ActionList/Item'`,
111+
output: `import type {ActionListItemProps as ItemProps} from '@primer/react/deprecated'`,
112+
errors: [
113+
{
114+
messageId: 'wildcardMigration',
115+
data: {
116+
wildcardEntrypoint: '@primer/react/lib-esm/deprecated/ActionList/Item',
103117
},
104118
},
105119
],
@@ -154,7 +168,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
154168
},
155169
{
156170
code: `import {SelectPanel} from '@primer/react/lib-esm/SelectPanel/SelectPanel'`,
157-
output: `import {SelectPanel} from '@primer/react/experimental'`,
171+
output: `import {SelectPanel} from '@primer/react'`,
158172
errors: [
159173
{
160174
messageId: 'wildcardMigration',
@@ -166,7 +180,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
166180
},
167181
{
168182
code: `import type {SelectPanelProps} from '@primer/react/lib-esm/SelectPanel/SelectPanel'`,
169-
output: `import type {SelectPanelProps} from '@primer/react/experimental'`,
183+
output: `import type {SelectPanelProps} from '@primer/react'`,
170184
errors: [
171185
{
172186
messageId: 'wildcardMigration',
@@ -226,7 +240,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
226240
},
227241
{
228242
code: `import type {ItemProps} from '@primer/react/lib-esm/deprecated/ActionList'`,
229-
output: `import type {ActionListItemProps} from '@primer/react/deprecated'`,
243+
output: `import type {ActionListItemProps as ItemProps} from '@primer/react/deprecated'`,
230244
errors: [
231245
{
232246
messageId: 'wildcardMigration',
@@ -238,7 +252,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
238252
},
239253
{
240254
code: `import type {GroupedListProps} from '@primer/react/lib-esm/deprecated/ActionList/List'`,
241-
output: `import type {ActionListGroupedListProps} from '@primer/react/deprecated'`,
255+
output: `import type {ActionListGroupedListProps as GroupedListProps} from '@primer/react/deprecated'`,
242256
errors: [
243257
{
244258
messageId: 'wildcardMigration',
@@ -250,7 +264,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
250264
},
251265
{
252266
code: `import {ItemInput} from '@primer/react/lib-esm/deprecated/ActionList/List'`,
253-
output: `import {ActionListItemInput} from '@primer/react/deprecated'`,
267+
output: `import {ActionListItemInput as ItemInput} from '@primer/react/deprecated'`,
254268
errors: [
255269
{
256270
messageId: 'wildcardMigration',
@@ -262,7 +276,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
262276
},
263277
{
264278
code: `import type {ItemProps} from '@primer/react/lib-esm/deprecated/ActionList/Item'`,
265-
output: `import type {ActionListItemProps} from '@primer/react/deprecated'`,
279+
output: `import type {ActionListItemProps as ItemProps} from '@primer/react/deprecated'`,
266280
errors: [
267281
{
268282
messageId: 'wildcardMigration',
@@ -277,21 +291,21 @@ import type {ButtonBaseProps} from '@primer/react'`,
277291

278292
// @primer/react/lib-esm/useIsomorphicLayoutEffect
279293
{
280-
code: `import useIsomorphicLayoutEffect from '@primer/react/lib-esm/useIsomorphicLayoutEffect'`,
294+
code: `import useIsomorphicLayoutEffect from '@primer/react/lib-esm/utils/useIsomorphicLayoutEffect'`,
281295
output: `import {useIsomorphicLayoutEffect} from '@primer/react'`,
282296
errors: [
283297
{
284298
messageId: 'wildcardMigration',
285299
data: {
286-
wildcardEntrypoint: '@primer/react/lib-esm/useIsomorphicLayoutEffect',
300+
wildcardEntrypoint: '@primer/react/lib-esm/utils/useIsomorphicLayoutEffect',
287301
},
288302
},
289303
],
290304
},
291305

292306
// @primer/react/lib-esm/hooks/useResizeObserver
293307
{
294-
code: `import useResizeObserver from '@primer/react/lib-esm/hooks/useResizeObserver'`,
308+
code: `import {useResizeObserver} from '@primer/react/lib-esm/hooks/useResizeObserver'`,
295309
output: `import {useResizeObserver} from '@primer/react'`,
296310
errors: [
297311
{
@@ -305,7 +319,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
305319

306320
// @primer/react/lib-esm/hooks/useProvidedRefOrCreate
307321
{
308-
code: `import useProvidedRefOrCreate from '@primer/react/lib-esm/hooks/useProvidedRefOrCreate'`,
322+
code: `import {useProvidedRefOrCreate} from '@primer/react/lib-esm/hooks/useProvidedRefOrCreate'`,
309323
output: `import {useProvidedRefOrCreate} from '@primer/react'`,
310324
errors: [
311325
{
@@ -319,7 +333,7 @@ import type {ButtonBaseProps} from '@primer/react'`,
319333

320334
// @primer/react/lib-esm/hooks/useResponsiveValue
321335
{
322-
code: `import useResponsiveValue from '@primer/react/lib-esm/hooks/useResponsiveValue'`,
336+
code: `import {useResponsiveValue} from '@primer/react/lib-esm/hooks/useResponsiveValue'`,
323337
output: `import {useResponsiveValue} from '@primer/react'`,
324338
errors: [
325339
{

src/rules/no-wildcard-imports.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,24 @@ const wildcardImports = new Map([
3535
name: 'Dialog',
3636
from: '@primer/react/experimental',
3737
},
38+
{
39+
name: 'DialogHeaderProps',
40+
from: '@primer/react/experimental',
41+
type: 'type',
42+
},
3843
],
3944
],
4045
[
4146
'@primer/react/lib-esm/SelectPanel/SelectPanel',
4247
[
4348
{
4449
name: 'SelectPanel',
45-
from: '@primer/react/experimental',
50+
from: '@primer/react',
4651
},
4752
{
4853
type: 'type',
4954
name: 'SelectPanelProps',
50-
from: '@primer/react/experimental',
55+
from: '@primer/react',
5156
},
5257
],
5358
],
@@ -132,7 +137,7 @@ const wildcardImports = new Map([
132137

133138
// Hooks
134139
[
135-
'@primer/react/lib-esm/useIsomorphicLayoutEffect',
140+
'@primer/react/lib-esm/utils/useIsomorphicLayoutEffect',
136141
[
137142
{
138143
name: 'default',
@@ -145,29 +150,26 @@ const wildcardImports = new Map([
145150
'@primer/react/lib-esm/hooks/useResizeObserver',
146151
[
147152
{
148-
name: 'default',
153+
name: 'useResizeObserver',
149154
from: '@primer/react',
150-
as: 'useResizeObserver',
151155
},
152156
],
153157
],
154158
[
155159
'@primer/react/lib-esm/hooks/useProvidedRefOrCreate',
156160
[
157161
{
158-
name: 'default',
162+
name: 'useProvidedRefOrCreate',
159163
from: '@primer/react',
160-
as: 'useProvidedRefOrCreate',
161164
},
162165
],
163166
],
164167
[
165168
'@primer/react/lib-esm/hooks/useResponsiveValue',
166169
[
167170
{
168-
name: 'default',
171+
name: 'useResponsiveValue',
169172
from: '@primer/react',
170-
as: 'useResponsiveValue',
171173
},
172174
],
173175
],
@@ -282,7 +284,7 @@ module.exports = {
282284
}
283285

284286
if (migration.as) {
285-
changes.get(migration.from).push([migration.as, migration.as, migration.type])
287+
changes.get(migration.from).push([migration.as, specifier.local.name, migration.type])
286288
} else {
287289
changes.get(migration.from).push([migration.name, specifier.local.name, migration.type])
288290
}
@@ -357,7 +359,7 @@ module.exports = {
357359
}
358360
return imported
359361
})
360-
yield fixer.insertTextAfter(node, `import type {${specifiers.join(', ')}} from '${entrypoint}'`)
362+
yield fixer.insertTextAfter(node, `\nimport type {${specifiers.join(', ')}} from '${entrypoint}'`)
361363
}
362364
}
363365
},

0 commit comments

Comments
 (0)