Skip to content

Commit 7e25eff

Browse files
authored
fix: fixed the forward compatibility of eslint-plugin-react-hooks-extra (#1121)
1 parent b628b70 commit 7e25eff

23 files changed

+2568
-433
lines changed

.pkgs/configs/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
"eslint-plugin-de-morgan": "^1.2.1",
2525
"eslint-plugin-function": "^0.0.21",
2626
"eslint-plugin-jsdoc": "^50.7.1",
27-
"eslint-plugin-perfectionist": "^4.13.0",
28-
"eslint-plugin-regexp": "^2.7.0",
27+
"eslint-plugin-perfectionist": "^4.14.0",
28+
"eslint-plugin-regexp": "^2.8.0",
2929
"eslint-plugin-unicorn": "^59.0.1",
3030
"typescript-eslint": "^8.33.1"
3131
}

.pkgs/eslint-plugin-local/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
"@typescript-eslint/utils": "^8.33.1",
3535
"eslint-plugin-de-morgan": "^1.2.1",
3636
"eslint-plugin-jsdoc": "^50.7.1",
37-
"eslint-plugin-perfectionist": "^4.13.0",
38-
"eslint-plugin-regexp": "^2.7.0",
37+
"eslint-plugin-perfectionist": "^4.14.0",
38+
"eslint-plugin-regexp": "^2.8.0",
3939
"eslint-plugin-unicorn": "^59.0.1",
4040
"string-ts": "^2.2.1",
4141
"ts-pattern": "^5.7.1"

apps/website/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"fumadocs-twoslash": "3.1.3",
2121
"fumadocs-typescript": "4.0.5",
2222
"fumadocs-ui": "15.5.0",
23-
"lucide-react": "^0.511.0",
23+
"lucide-react": "^0.512.0",
2424
"next": "^15.3.3",
2525
"next-view-transitions": "^0.3.4",
2626
"react": "^19.1.0",
@@ -52,7 +52,7 @@
5252
"eslint": "^9.28.0",
5353
"eslint-plugin-de-morgan": "^1.2.1",
5454
"eslint-plugin-import-x": "^4.15.0",
55-
"eslint-plugin-perfectionist": "^4.13.0",
55+
"eslint-plugin-perfectionist": "^4.14.0",
5656
"eslint-plugin-react-hooks": "^5.2.0",
5757
"eslint-plugin-react-refresh": "^0.4.20",
5858
"eslint-plugin-unicorn": "^59.0.1",

examples/vite-react-dom-js-with-babel-eslint-parser-app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
},
1717
"devDependencies": {
1818
"@babel/core": "^7.27.4",
19-
"@babel/eslint-parser": "^7.27.1",
19+
"@babel/eslint-parser": "^7.27.5",
2020
"@babel/preset-env": "^7.27.2",
2121
"@babel/preset-react": "^7.27.1",
2222
"@eslint/config-inspector": "^1.0.2",

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
"typedoc-plugin-mdn-links": "^5.0.2",
9393
"typescript": "^5.8.3",
9494
"typescript-eslint": "^8.33.1",
95-
"vitest": "^3.2.0"
95+
"vitest": "^3.2.1"
9696
},
9797
"packageManager": "[email protected]",
9898
"engines": {
@@ -112,7 +112,7 @@
112112
"@types/react-dom": "^19.1.5",
113113
"cross-spawn": "^7.0.6",
114114
"esbuild": "^0.25.5",
115-
"lucide-react": "^0.511.0",
115+
"lucide-react": "^0.512.0",
116116
"next": "^15.3.3",
117117
"react": "^19.1.0",
118118
"react-dom": "^19.1.0",

packages/plugins/eslint-plugin-react-hooks-extra/src/plugin.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { name, version } from "../package.json";
2+
3+
import noUnnecessaryUseCallback from "./rules-removed/no-unnecessary-use-callback";
4+
import noUnnecessaryUseMemo from "./rules-removed/no-unnecessary-use-memo";
5+
import noUnnecessaryUsePrefix from "./rules-removed/no-unnecessary-use-prefix";
6+
import preferUseStateLazyInitialization from "./rules-removed/prefer-use-state-lazy-initialization";
7+
28
import noDirectSetStateInUseEffect from "./rules/no-direct-set-state-in-use-effect";
39
import noDirectSetStateInUseLayoutEffect from "./rules/no-direct-set-state-in-use-layout-effect";
410

@@ -10,5 +16,26 @@ export const plugin = {
1016
rules: {
1117
"no-direct-set-state-in-use-effect": noDirectSetStateInUseEffect,
1218
"no-direct-set-state-in-use-layout-effect": noDirectSetStateInUseLayoutEffect,
19+
20+
/**
21+
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
22+
* @see https://next.eslint-react.xyz/docs/rules/no-unnecessary-use-callback
23+
*/
24+
"no-unnecessary-use-callback": noUnnecessaryUseCallback,
25+
/**
26+
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
27+
* @see https://next.eslint-react.xyz/docs/rules/no-unnecessary-use-memo
28+
*/
29+
"no-unnecessary-use-memo": noUnnecessaryUseMemo,
30+
/**
31+
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
32+
* @see https://next.eslint-react.xyz/docs/rules/no-unnecessary-use-prefix
33+
*/
34+
"no-unnecessary-use-prefix": noUnnecessaryUsePrefix,
35+
/**
36+
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
37+
* @see https://next.eslint-react.xyz/docs/rules/prefer-use-state-lazy-initialization
38+
*/
39+
"prefer-use-state-lazy-initialization": preferUseStateLazyInitialization,
1340
},
1441
} as const;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
---
2+
title: no-unnecessary-use-callback
3+
---
4+
5+
**Full Name in `eslint-plugin-react-hooks-extra`**
6+
7+
```sh copy
8+
react-hooks-extra/no-unnecessary-use-callback
9+
```
10+
11+
**Full Name in `@eslint-react/eslint-plugin`**
12+
13+
```sh copy
14+
@eslint-react/hooks-extra/no-unnecessary-use-callback
15+
```
16+
17+
**Features**
18+
19+
`🧪`
20+
21+
## Description
22+
23+
Disallow unnecessary usage of `useCallback`.
24+
25+
React Hooks `useCallback` has empty dependencies array like what's in the examples, are unnecessary. The hook can be removed and it's value can be created in the component body or hoisted to the outer scope of the component.
26+
27+
## Examples
28+
29+
### Failing
30+
31+
```tsx
32+
import React, { useCallback } from "react";
33+
34+
function MyComponent() {
35+
const onClick = useCallback(() => {
36+
console.log("clicked");
37+
}, []);
38+
39+
return <button type="button" onClick={onClick} />;
40+
}
41+
```
42+
43+
### Passing
44+
45+
```tsx
46+
import React from "react";
47+
48+
function onClick() {
49+
console.log("clicked");
50+
}
51+
52+
function MyComponent() {
53+
return <button type="button" onClick={onClick} />;
54+
}
55+
```
56+
57+
## Implementation
58+
59+
- [Rule source](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-callback.ts)
60+
- [Test source](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-callback.spec.ts)
61+
62+
---
63+
64+
## See Also
65+
66+
- [`no-unnecessary-use-memo`](./no-unnecessary-use-memo)\
67+
Disallows unnecessary usage of `useMemo`.

0 commit comments

Comments
 (0)