From 2fc03f51f1aeaafd788155f022c1b8562fe7a730 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 8 Jun 2026 11:53:33 -0500 Subject: [PATCH 1/3] Enforce React Refresh component exports --- eslint.config.mjs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index 056631b78df..ede0ab4cda8 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,6 +10,7 @@ import githubPlugin from 'eslint-plugin-github' import storybook from 'eslint-plugin-storybook' import react from 'eslint-plugin-react' import reactHooks from 'eslint-plugin-react-hooks' +import {reactRefresh} from 'eslint-plugin-react-refresh' import {unsupportedPatterns as reactCompilerUnsupported} from './packages/react/script/react-compiler.mjs' import playwright from 'eslint-plugin-playwright' import prettierRecommended from 'eslint-plugin-prettier/recommended' @@ -58,6 +59,22 @@ const config = defineConfig([ ...fixupConfigRules([react.configs.flat.recommended, react.configs.flat['jsx-runtime']]), reactHooks.configs.flat['recommended-latest'], + { + files: ['**/*.{jsx,tsx}'], + plugins: { + 'react-refresh': reactRefresh, + }, + rules: { + 'react-refresh/only-export-components': [ + 'error', + { + allowConstantExport: true, + allowExportNames: ['metadata'], + extraHOCs: ['assign', 'fixedForwardRef'], + }, + ], + }, + }, // Disable react-compiler rule for files not yet migrated { files: reactCompilerUnsupported.map(p => `packages/react/${p}`), From dabe9f6f35ebc36c9a96fb555667360a66b95e24 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 8 Jun 2026 11:54:37 -0500 Subject: [PATCH 2/3] Fix React Refresh ESLint plugin import --- eslint.config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index ede0ab4cda8..33a80566770 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,7 +10,7 @@ import githubPlugin from 'eslint-plugin-github' import storybook from 'eslint-plugin-storybook' import react from 'eslint-plugin-react' import reactHooks from 'eslint-plugin-react-hooks' -import {reactRefresh} from 'eslint-plugin-react-refresh' +import reactRefreshPlugin from 'eslint-plugin-react-refresh' import {unsupportedPatterns as reactCompilerUnsupported} from './packages/react/script/react-compiler.mjs' import playwright from 'eslint-plugin-playwright' import prettierRecommended from 'eslint-plugin-prettier/recommended' @@ -62,7 +62,7 @@ const config = defineConfig([ { files: ['**/*.{jsx,tsx}'], plugins: { - 'react-refresh': reactRefresh, + 'react-refresh': reactRefreshPlugin, }, rules: { 'react-refresh/only-export-components': [ From 9cd72d804e334c7138ac671ee6348762a9ed1915 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Mon, 8 Jun 2026 12:02:11 -0500 Subject: [PATCH 3/3] Skip styled-react barrel for React Refresh rule --- eslint.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index 33a80566770..ca4fcc0bd4f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -61,6 +61,7 @@ const config = defineConfig([ reactHooks.configs.flat['recommended-latest'], { files: ['**/*.{jsx,tsx}'], + ignores: ['packages/styled-react/src/index.tsx'], plugins: { 'react-refresh': reactRefreshPlugin, },