Skip to content

Releases: ArnaudBarre/eslint-plugin-react-refresh

v0.5.7

Choose a tag to compare

@github-actions github-actions released this 14 Sep 16:11
fd40d83

Add allowCompoundComponents option (#117)

Default: false (true in vite config)

Don't warn when components are exported as an object gathering them. Every member of the object must be a component, and a member holding an anonymous function requires a component name as key.

This should be enabled if the fast refresh implementation correctly handles this case. Vite supports it since @vitejs/plugin-react 4.7.0, @vitejs/plugin-react-swc 3.11.0.

{
  "react-refresh/only-export-components": [
    "error",
    { "allowCompoundComponents": true }
  ]
}

Enabling this option allows code such as the following:

const Root = () => <></>;
const Label = () => <></>;
export const Tag = { Root, Label };

v0.5.6

Choose a tag to compare

@github-actions github-actions released this 02 Sep 10:34
  • Support re-exporting namespace components (fixes #116)

v0.5.5

Choose a tag to compare

@github-actions github-actions released this 26 Aug 07:22
  • Fix SCREAMING_SNAKE_CASE constant exported via export { Name } incorrectly treated as React component #114 (fixes #113)
  • Add contentType and size to allowExportNames in Next config #115

v0.5.4

Choose a tag to compare

@github-actions github-actions released this 10 Aug 13:29
e316617
  • Add instant to allowExportNames in Next config #112

v0.5.3

Choose a tag to compare

@github-actions github-actions released this 14 Jun 12:46
  • Fix check for non component class exported via export { } #110 (fixes #109)

v0.5.2

Choose a tag to compare

@github-actions github-actions released this 23 Feb 19:49
  • Support nested function calls for extraHOCs (actually fixes #104)

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 23 Feb 08:32
  • Mark ESLint v10 as supported
  • Support false positives with TypeScript function overloading (fixes #105)
  • Support nested function calls for extraHOCs (fixes #104)

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 01 Feb 10:04
daa2efb

Breaking changes

  • The package now ships as ESM and requires ESLint 9 + node 20. Because legacy config doesn't support ESM, this requires to use flat config
  • A new reactRefresh export is available and prefered over the default export. It's an object with two properties:
    • plugin: The plugin object with the rules
    • configs: An object containing configuration presets, each exposed as a function. These functions accept your custom options, merge them with sensible defaults for that config, and return the final config object.
  • customHOCs option was renamed to extraHOCs
  • Validation of HOCs calls is now more strict, you may need to add some HOCs to the extraHOCs option (like connect or styled)

Config example:

import { defineConfig } from "eslint/config";
import { reactRefresh } from "eslint-plugin-react-refresh";

export default defineConfig(
  /* Main config */
  reactRefresh.configs.vite({ extraHOCs: ["someLibHOC"] }),
);

Config example without config:

import { defineConfig } from "eslint/config";
import { reactRefresh } from "eslint-plugin-react-refresh";

export default defineConfig({
  files: ["**/*.ts", "**/*.tsx"],
  plugins: {
    // other plugins
    "react-refresh": reactRefresh.plugin,
  },
  rules: {
    // other rules
    "react-refresh/only-export-components": [
      "warn",
      { extraHOCs: ["someLibHOC"] },
    ],
  },
});

Why

This version follows a revamp of the internal logic to better make the difference between random call expressions like export const Enum = Object.keys(Record) and actual React HOC calls like export const MemoComponent = memo(Component). (fixes #93)

The rule now handles ternaries and patterns like export default customHOC(props)(Component) which makes it able to correctly support files like this one given this config:

{
  "react-refresh/only-export-components": [
    "warn",
    { "extraHOCs": ["createRootRouteWithContext"] }
  ]
}

Note

Actually createRoute functions from TanStack Router are not React HOCs, they return route objects that fake to be a memoized component but are not. When only doing createRootRoute({ component: Foo }), HMR will work fine, but as soon as you add a prop to the options that is not a React component, HMR will not work. I would recommend to avoid adding any TanStack function to extraHOCs it you want to preserve good HMR in the long term. Bluesky thread.

Because I'm not 100% sure this new logic doesn't introduce any false positive, this is done in a major-like version. This also give me the occasion to remove the hardcoded connect from the rule. If you are using connect from react-redux, you should now add it to extraHOCs like this:

{
  "react-refresh/only-export-components": ["warn", { "extraHOCs": ["connect"] }]
}

v0.4.26

Choose a tag to compare

@github-actions github-actions released this 16 Dec 23:26
  • Revert changes to fix #93 (fixes #95)

v0.4.25

Choose a tag to compare

@github-actions github-actions released this 14 Dec 18:23
  • Report cases like export const ENUM = Object.keys(TABLE) as EnumType[]; (fixes #93)
  • Allow _ in component names (#94)