diff --git a/.changeset/pink-feet-provide.md b/.changeset/pink-feet-provide.md new file mode 100644 index 00000000..09e4dae9 --- /dev/null +++ b/.changeset/pink-feet-provide.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-primer-react': patch +--- + +Update no-wildcard-imports rule to work for imports that specify value and type imports diff --git a/src/rules/__tests__/no-wildcard-imports.test.js b/src/rules/__tests__/no-wildcard-imports.test.js index d87b67a6..db11f077 100644 --- a/src/rules/__tests__/no-wildcard-imports.test.js +++ b/src/rules/__tests__/no-wildcard-imports.test.js @@ -119,8 +119,37 @@ ruleTester.run('no-wildcard-imports', rule, { ], }, + // Test mixed imports + { + code: `import {Dialog, type DialogProps} from '@primer/react/lib-esm/Dialog/Dialog'`, + output: `import {Dialog} from '@primer/react/experimental' +import type {DialogProps} from '@primer/react/experimental'`, + errors: [ + { + messageId: 'wildcardMigration', + data: { + wildcardEntrypoint: '@primer/react/lib-esm/Dialog/Dialog', + }, + }, + ], + }, + // Test migrations + // Test helpers ------------------------------------------------------------ + { + code: `import '@primer/react/lib-esm/utils/test-helpers'`, + output: `import '@primer/react/test-helpers'`, + errors: [ + { + messageId: 'wildcardMigration', + data: { + wildcardEntrypoint: '@primer/react/lib-esm/utils/test-helpers', + }, + }, + ], + }, + // Components -------------------------------------------------------------- { code: `import {ButtonBase} from '@primer/react/lib-esm/Button/ButtonBase'; @@ -344,6 +373,18 @@ import type {ButtonBaseProps} from '@primer/react'`, }, ], }, + { + code: `import type {ResponsiveValue} from '@primer/react/lib-esm/hooks/useResponsiveValue'`, + output: `import type {ResponsiveValue} from '@primer/react'`, + errors: [ + { + messageId: 'wildcardMigration', + data: { + wildcardEntrypoint: '@primer/react/lib-esm/hooks/useResponsiveValue', + }, + }, + ], + }, // Utilities --------------------------------------------------------------- diff --git a/src/rules/no-wildcard-imports.js b/src/rules/no-wildcard-imports.js index c45797ad..82e3c164 100644 --- a/src/rules/no-wildcard-imports.js +++ b/src/rules/no-wildcard-imports.js @@ -40,6 +40,16 @@ const wildcardImports = new Map([ from: '@primer/react/experimental', type: 'type', }, + { + name: 'DialogProps', + from: '@primer/react/experimental', + type: 'type', + }, + { + name: 'DialogButtonProps', + from: '@primer/react/experimental', + type: 'type', + }, ], ], [ @@ -171,6 +181,11 @@ const wildcardImports = new Map([ name: 'useResponsiveValue', from: '@primer/react', }, + { + type: 'type', + name: 'ResponsiveValue', + from: '@primer/react', + }, ], ], @@ -204,6 +219,15 @@ const wildcardImports = new Map([ }, ], ], + [ + '@primer/react/lib-esm/FeatureFlags/useFeatureFlag', + [ + { + name: 'useFeatureFlag', + from: '@primer/react/experimental', + }, + ], + ], [ '@primer/react/lib-esm/theme', [ @@ -245,6 +269,20 @@ module.exports = { return } + if (node.source.value === '@primer/react/lib-esm/utils/test-helpers') { + context.report({ + node, + messageId: 'wildcardMigration', + data: { + wildcardEntrypoint: node.source.value, + }, + fix(fixer) { + return fixer.replaceText(node.source, `'@primer/react/test-helpers'`) + }, + }) + return + } + const wildcardImportMigrations = wildcardImports.get(node.source.value) if (!wildcardImportMigrations) { context.report({ @@ -353,7 +391,7 @@ module.exports = { yield fixer.replaceText(node, `import {${specifiers.join(', ')}} from '${entrypoint}'`) if (typeSpecifiers.length > 0) { - const specifiers = valueSpecifiers.map(([imported, local]) => { + const specifiers = typeSpecifiers.map(([imported, local]) => { if (imported !== local) { return `${imported} as ${local}` }