From 15a20fd96dae540ee2c852b9956cfed4d5e639e8 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Tue, 24 Sep 2024 16:32:10 -0500 Subject: [PATCH 1/4] fix(no-wildcard-imports): add test case for mix-and-match --- .../__tests__/no-wildcard-imports.test.js | 29 ++++++++++++++ src/rules/no-wildcard-imports.js | 40 ++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/rules/__tests__/no-wildcard-imports.test.js b/src/rules/__tests__/no-wildcard-imports.test.js index d87b67a6..11c8d6b4 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'; diff --git a/src/rules/no-wildcard-imports.js b/src/rules/no-wildcard-imports.js index c45797ad..b0526038 100644 --- a/src/rules/no-wildcard-imports.js +++ b/src/rules/no-wildcard-imports.js @@ -28,6 +28,20 @@ const wildcardImports = new Map([ }, ], ], + [ + '@primer/react/lib-esm/Dialog', + [ + { + name: 'Dialog', + from: '@primer/react/experimental', + }, + { + name: 'DialogHeaderProps', + from: '@primer/react/experimental', + type: 'type', + }, + ], + ], [ '@primer/react/lib-esm/Dialog/Dialog', [ @@ -40,6 +54,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', + }, ], ], [ @@ -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}` } From 2f8281c4830be22aac08e3fa1893c3ebcba2aadd Mon Sep 17 00:00:00 2001 From: Josh Black Date: Tue, 24 Sep 2024 16:32:39 -0500 Subject: [PATCH 2/4] chore: add changeset --- .changeset/pink-feet-provide.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/pink-feet-provide.md 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 From 62e1ae8979e826f2a73f13acbacdc6bbca13ec5a Mon Sep 17 00:00:00 2001 From: Josh Black Date: Tue, 24 Sep 2024 16:54:36 -0500 Subject: [PATCH 3/4] feat: add support for ResponsiveValue --- .../__tests__/no-wildcard-imports.test.js | 12 ++++++++++++ src/rules/no-wildcard-imports.js | 19 +++++-------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/rules/__tests__/no-wildcard-imports.test.js b/src/rules/__tests__/no-wildcard-imports.test.js index 11c8d6b4..db11f077 100644 --- a/src/rules/__tests__/no-wildcard-imports.test.js +++ b/src/rules/__tests__/no-wildcard-imports.test.js @@ -373,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 b0526038..e1c36b0a 100644 --- a/src/rules/no-wildcard-imports.js +++ b/src/rules/no-wildcard-imports.js @@ -28,20 +28,6 @@ const wildcardImports = new Map([ }, ], ], - [ - '@primer/react/lib-esm/Dialog', - [ - { - name: 'Dialog', - from: '@primer/react/experimental', - }, - { - name: 'DialogHeaderProps', - from: '@primer/react/experimental', - type: 'type', - }, - ], - ], [ '@primer/react/lib-esm/Dialog/Dialog', [ @@ -195,6 +181,11 @@ const wildcardImports = new Map([ name: 'useResponsiveValue', from: '@primer/react', }, + { + type: 'type', + name: 'ResponsiveValue', + from: '@primer/react', + }, ], ], From 2d99a97ff8eab10c0d7f3623a20031c89cfd7d86 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 7 Oct 2024 10:31:01 -0500 Subject: [PATCH 4/4] feat: add support for useFeatureFlag migration --- src/rules/no-wildcard-imports.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/rules/no-wildcard-imports.js b/src/rules/no-wildcard-imports.js index e1c36b0a..82e3c164 100644 --- a/src/rules/no-wildcard-imports.js +++ b/src/rules/no-wildcard-imports.js @@ -219,6 +219,15 @@ const wildcardImports = new Map([ }, ], ], + [ + '@primer/react/lib-esm/FeatureFlags/useFeatureFlag', + [ + { + name: 'useFeatureFlag', + from: '@primer/react/experimental', + }, + ], + ], [ '@primer/react/lib-esm/theme', [