Skip to content

Commit fa7172c

Browse files
committed
rework: rework hooks rules
1 parent bf9472c commit fa7172c

File tree

107 files changed

+529
-6334
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+529
-6334
lines changed

.pkgs/configs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"@stylistic/eslint-plugin": "^5.3.1",
2424
"eslint-plugin-de-morgan": "^1.3.1",
2525
"eslint-plugin-function": "^0.0.25",
26-
"eslint-plugin-jsdoc": "^54.4.0",
26+
"eslint-plugin-jsdoc": "^54.5.0",
2727
"eslint-plugin-perfectionist": "^4.15.0",
2828
"eslint-plugin-regexp": "^2.10.0",
2929
"eslint-plugin-unicorn": "^61.0.1",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@typescript-eslint/types": "^8.42.0",
3434
"@typescript-eslint/utils": "^8.42.0",
3535
"eslint-plugin-de-morgan": "^1.3.1",
36-
"eslint-plugin-jsdoc": "^54.4.0",
36+
"eslint-plugin-jsdoc": "^54.5.0",
3737
"eslint-plugin-perfectionist": "^4.15.0",
3838
"eslint-plugin-regexp": "^2.10.0",
3939
"eslint-plugin-unicorn": "^61.0.1",

apps/website/content/docs/configuration/configure-analyzer.mdx

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -56,26 +56,6 @@ Example with `polymorphicPropName` set to `as`:
5656
// Evaluated as an h3 element
5757
```
5858

59-
### `additionalHooks` (Experimental)
60-
61-
<Callout type="warn">
62-
Intended for edge cases. We suggest to use this option **very sparingly, if at
63-
all**. Generally saying, we recommend most custom Hooks do not vary the
64-
built-in React Hooks, and instead provide a higher-level API that is more
65-
focused around a specific use case.
66-
</Callout>
67-
68-
Alias variants to built-in React Hooks for rule compatibility:
69-
70-
```js
71-
additionalHooks: {
72-
useEffect: ["useIsomorphicLayoutEffect"],
73-
useLayoutEffect: ["useIsomorphicLayoutEffect"]
74-
}
75-
```
76-
77-
Treats `useIsomorphicLayoutEffect` as both `useEffect` and `useLayoutEffect` in rule checks.
78-
7959
## Complete Configuration Example
8060

8161
```ts title="eslint.config.js"
@@ -89,12 +69,6 @@ export default [
8969
version: "19.1.0", // Specify the React version for semantic analysis (can be "detect" for auto-detection)
9070
importSource: "react", // Customize the import source for the React module (defaults to "react")
9171
polymorphicPropName: "as", // Define the prop name used for polymorphic components (e.g., <Component as="div">)
92-
93-
// (Experimental) Alias custom Hooks to built-in React Hooks for rule compatibility
94-
additionalHooks: {
95-
useEffect: ["useIsomorphicLayoutEffect"],
96-
useLayoutEffect: ["useIsomorphicLayoutEffect"],
97-
},
9872
},
9973
},
10074
},

apps/website/content/docs/configuration/configure-analyzer.tsx

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,9 @@
11
/* eslint-disable perfectionist/sort-objects */
2-
import { CodeBlock } from "#/components/ui/CodeBlock";
3-
import dedent from "dedent";
42
import { TypeTable } from "fumadocs-ui/components/type-table";
53

64
import { Link } from "next-view-transitions";
75

86
const properties = {
9-
additionalHooks: {
10-
type: "Record<ReactBuiltInHookName, string[]>",
11-
description: <Link href="#additionalhooks">An object of aliases for React built-in Hooks ⤵</Link>,
12-
default: "{}",
13-
typeDescription: (
14-
<CodeBlock
15-
code={dedent`
16-
type ReactBuiltInHookName =
17-
| "use"
18-
| "useActionState"
19-
| "useCallback"
20-
| "useContext"
21-
| "useDebugValue"
22-
| "useDeferredValue"
23-
| "useEffect"
24-
| "useFormStatus"
25-
| "useId"
26-
| "useImperativeHandle"
27-
| "useInsertionEffect"
28-
| "useLayoutEffect"
29-
| "useMemo"
30-
| "useOptimistic"
31-
| "useReducer"
32-
| "useRef"
33-
| "useState"
34-
| "useSyncExternalStore"
35-
| "useTransition";
36-
`}
37-
lang="ts"
38-
/>
39-
),
40-
},
417
polymorphicPropName: {
428
type: "string",
439
description: <Link href="#polymorphicpropname">The prop your code uses to create polymorphic components ⤵</Link>,

apps/website/content/docs/deprecated.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@ full: true
66

77
## Rules
88

9-
| Rule | Replaced by | Deprecated in |
10-
| :--------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------- | :------------ |
11-
| [`ensure-custom-hooks-using-other-hooks`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | [`no-unnecessary-use-prefix`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | 1.13.0 |
12-
| [`ensure-forward-ref-using-ref`](/docs/rules/ensure-forward-ref-using-ref) | [`no-useless-forward-ref`](/docs/rules/no-useless-forward-ref) | 1.33.0 |
13-
| [`ensure-use-callback-has-non-empty-deps`](/docs/rules/hooks-extra-ensure-use-callback-has-non-empty-deps) | [`no-unnecessary-use-callback`](/docs/rules/hooks-extra-no-unnecessary-use-callback) | 1.13.0 |
14-
| [`ensure-use-memo-has-non-empty-deps`](/docs/rules/hooks-extra-ensure-use-memo-has-non-empty-deps) | [`no-unnecessary-use-memo`](/docs/rules/hooks-extra-no-unnecessary-use-memo) | 1.13.0 |
15-
| [`no-children-in-void-dom-elements`](/docs/rules/dom-no-children-in-void-dom-elements) | [`no-void-elements-with-children`](/docs/rules/dom-no-void-elements-with-children) | 1.22.0 |
16-
| [`no-complicated-conditional-rendering`](/docs/rules/no-complicated-conditional-rendering) | [`no-complex-conditional-rendering`](/docs/rules/no-complex-conditional-rendering) | 1.6.0 |
17-
| [`jsx-no-duplicate-props`](/docs/rules/jsx-no-duplicate-props) | [`jsx-no-duplicate-props`](/docs/rules/jsx-no-duplicate-props) | 1.22.0 |
18-
| [`no-nested-components`](/docs/rules/no-nested-components) | [`no-nested-component-definitions`](/docs/rules/no-nested-component-definitions) | 1.34.0 |
19-
| [`no-redundant-custom-hook`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | [`no-unnecessary-use-prefix`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | 1.21.0 |
20-
| [`no-useless-custom-hooks`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | [`no-unnecessary-use-prefix`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | 1.21.0 |
21-
| [`use-jsx-vars`](/docs/rules/use-jsx-vars) | [`jsx-uses-vars`](/docs/rules/jsx-uses-vars) | 1.22.0 |
9+
| Rule | Replaced by | Deprecated in |
10+
| :------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------- | :------------ |
11+
| [`ensure-forward-ref-using-ref`](/docs/rules/ensure-forward-ref-using-ref) | [`no-useless-forward-ref`](/docs/rules/no-useless-forward-ref) | 1.33.0 |
12+
| [`jsx-no-duplicate-props`](/docs/rules/jsx-no-duplicate-props) | [`jsx-no-duplicate-props`](/docs/rules/jsx-no-duplicate-props) | 1.22.0 |
13+
| [`no-complicated-conditional-rendering`](/docs/rules/no-complicated-conditional-rendering) | [`no-complex-conditional-rendering`](/docs/rules/no-complex-conditional-rendering) | 1.6.0 |
14+
| [`no-nested-components`](/docs/rules/no-nested-components) | [`no-nested-component-definitions`](/docs/rules/no-nested-component-definitions) | 1.34.0 |
15+
| [`use-jsx-vars`](/docs/rules/use-jsx-vars) | [`jsx-uses-vars`](/docs/rules/jsx-uses-vars) | 1.22.0 |
16+
| [`dom/no-children-in-void-dom-elements`](/docs/rules/dom-no-children-in-void-dom-elements) | [`dom/no-void-elements-with-children`](/docs/rules/dom-no-void-elements-with-children) | 1.22.0 |
17+
| [`hooks-extra/ensure-custom-hooks-using-other-hooks`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | [`hooks-extra/no-unnecessary-use-prefix`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | 1.13.0 |
18+
| [`hooks-extra/ensure-use-callback-has-non-empty-deps`](/docs/rules/hooks-extra-ensure-use-callback-has-non-empty-deps) | [`hooks-extra/no-unnecessary-use-callback`](/docs/rules/hooks-extra-no-unnecessary-use-callback) | 1.13.0 |
19+
| [`hooks-extra/ensure-use-memo-has-non-empty-deps`](/docs/rules/hooks-extra-ensure-use-memo-has-non-empty-deps) | [`hooks-extra/no-unnecessary-use-memo`](/docs/rules/hooks-extra-no-unnecessary-use-memo) | 1.13.0 |
20+
| [`hooks-extra/no-direct-set-state-in-use-layout-effect`](/docs/rules/hooks-extra-no-direct-set-state-in-use-layout-effect) | [`hooks-extra/no-direct-set-state-in-use-effect`](/docs/rules/hooks-extra-no-direct-set-state-in-use-effect) | 2.0.0 |
21+
| [`hooks-extra/no-redundant-custom-hook`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | [`hooks-extra/no-unnecessary-use-prefix`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | 1.21.0 |
22+
| [`hooks-extra/no-useless-custom-hooks`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | [`hooks-extra/no-unnecessary-use-prefix`](/docs/rules/hooks-extra-no-unnecessary-use-prefix) | 1.21.0 |
2223

2324
## Presets
2425

apps/website/content/docs/rules/meta.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
"web-api-no-leaked-timeout",
9191
"---Hooks Extra Rules---",
9292
"hooks-extra-no-direct-set-state-in-use-effect",
93-
"hooks-extra-no-direct-set-state-in-use-layout-effect",
9493
"---Naming Convention Rules---",
9594
"naming-convention-component-name",
9695
"naming-convention-context-name",

apps/website/content/docs/rules/overview.mdx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,9 @@ full: true
128128
This section contains rules that are not part of the official `eslint-plugin-react-hooks` plugin but are useful for specific use cases or patterns.
129129
</Callout>
130130

131-
| Rule || 🌟 | Description |
132-
| :--------------------------------------------------------------------------------------------------- | :-- | :--: | :----------------------------------------------------------------------------- |
133-
| [`no-direct-set-state-in-use-effect`](./hooks-extra-no-direct-set-state-in-use-effect) | 1️⃣ | `🧪` | Disallow direct calls to the `set` function of `useState` in `useEffect` |
134-
| [`no-direct-set-state-in-use-layout-effect`](./hooks-extra-no-direct-set-state-in-use-layout-effect) | 0️⃣ | `🧪` | Disallow direct calls to the `set` function of `useState` in `useLayoutEffect` |
131+
| Rule || 🌟 | Description |
132+
| :------------------------------------------------------------------------------------- | :-- | :--: | :----------------------------------------------------------------------- |
133+
| [`no-direct-set-state-in-use-effect`](./hooks-extra-no-direct-set-state-in-use-effect) | 1️⃣ | `🧪` | Disallow direct calls to the `set` function of `useState` in `useEffect` |
135134

136135
## Naming Convention Rules
137136

examples/react-dom-js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"eslint-plugin-react-hooks": "^5.2.0",
2626
"eslint-plugin-react-refresh": "^0.4.20",
2727
"globals": "^16.3.0",
28-
"vite": "^7.1.4"
28+
"vite": "^7.1.5"
2929
},
3030
"engines": {
3131
"node": ">=20.19.0"

examples/react-dom-v1/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"@eslint/js": "^9.35.0",
2121
"@tsconfig/node22": "^22.0.2",
2222
"@tsconfig/strictest": "^2.0.5",
23-
"@tsconfig/vite-react": "^7.0.0",
23+
"@tsconfig/vite-react": "^7.0.1",
2424
"@types/react": "^19.1.12",
2525
"@types/react-dom": "^19.1.9",
2626
"@vitejs/plugin-react": "^5.0.2",
@@ -29,7 +29,7 @@
2929
"eslint-plugin-react-refresh": "^0.4.20",
3030
"typescript": "^5.9.2",
3131
"typescript-eslint": "^8.42.0",
32-
"vite": "^7.1.4"
32+
"vite": "^7.1.5"
3333
},
3434
"engines": {
3535
"node": ">=20.19.0"

examples/react-dom/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"@eslint/js": "^9.35.0",
2121
"@tsconfig/node22": "^22.0.2",
2222
"@tsconfig/strictest": "^2.0.5",
23-
"@tsconfig/vite-react": "^7.0.0",
23+
"@tsconfig/vite-react": "^7.0.1",
2424
"@types/react": "^19.1.12",
2525
"@types/react-dom": "^19.1.9",
2626
"@vitejs/plugin-react": "^5.0.2",
@@ -29,7 +29,7 @@
2929
"eslint-plugin-react-refresh": "^0.4.20",
3030
"typescript": "^5.9.2",
3131
"typescript-eslint": "^8.42.0",
32-
"vite": "^7.1.4"
32+
"vite": "^7.1.5"
3333
},
3434
"engines": {
3535
"node": ">=20.19.0"

0 commit comments

Comments
 (0)