diff --git a/package.json b/package.json
index 97054c3516..6d4612a677 100644
--- a/package.json
+++ b/package.json
@@ -49,9 +49,9 @@
"devDependencies": {
"@changesets/cli": "^2.27.9",
"@effect/language-service": "^0.2.0",
- "@effect/platform": "^0.69.9",
- "@effect/platform-bun": "^0.49.10",
- "@effect/platform-node": "^0.64.10",
+ "@effect/platform": "^0.69.10",
+ "@effect/platform-bun": "^0.49.11",
+ "@effect/platform-node": "^0.64.11",
"@effect/schema": "^0.75.5",
"@eslint/config-inspector": "^0.5.5",
"@eslint/js": "^9.13.0",
@@ -71,7 +71,7 @@
"concurrently": "^9.0.1",
"cspell": "^8.15.4",
"dprint": "^0.47.5",
- "effect": "^3.10.4",
+ "effect": "^3.10.5",
"esbuild": "^0.24.0",
"eslint": "^9.13.0",
"eslint-config-flat-gitignore": "^0.3.0",
@@ -87,7 +87,7 @@
"eslint-plugin-unicorn": "^56.0.0",
"eslint-plugin-vitest": "^0.5.4",
"importx": "^0.5.0",
- "lefthook": "^1.8.1",
+ "lefthook": "^1.8.2",
"markdownlint": "^0.36.1",
"publint": "^0.2.12",
"react": "^18.3.1",
diff --git a/packages/plugins/eslint-plugin-react-x/README.md b/packages/plugins/eslint-plugin-react-x/README.md
index 2a8f13068b..b1eb252270 100644
--- a/packages/plugins/eslint-plugin-react-x/README.md
+++ b/packages/plugins/eslint-plugin-react-x/README.md
@@ -30,6 +30,7 @@ export default [
rules: {
// react-x recommended rules
"react-x/ensure-forward-ref-using-ref": "warn",
+ "react-x/jsx-uses-vars": "warn",
"react-x/no-access-state-in-setstate": "error",
"react-x/no-array-index-key": "warn",
"react-x/no-children-count": "warn",
@@ -74,6 +75,7 @@ export default [
| `avoid-shorthand-boolean` | Prevents using shorthand syntax for boolean attributes. | 🎨 | | |
| `avoid-shorthand-fragment` | Prevents using shorthand syntax for fragments. | 🎨 | | |
| `ensure-forward-ref-using-ref` | Requires that components wrapped with `forwardRef` must have a `ref` parameter. | ✔️ | | |
+| `jsx-uses-vars | Prevents variables used in JSX to be marked as unused. | ✔️ | | |
| `no-access-state-in-setstate` | Prevents accessing `this.state` inside `setState` calls. | ✔️ | | |
| `no-array-index-key` | Prevents using array `index` as `key`. | 🧐 | | |
| `no-children-count` | Prevents using `Children.count`. | ⛔ | | |
diff --git a/packages/plugins/eslint-plugin-react-x/src/index.ts b/packages/plugins/eslint-plugin-react-x/src/index.ts
index a1cbd3acba..b147dd9b66 100644
--- a/packages/plugins/eslint-plugin-react-x/src/index.ts
+++ b/packages/plugins/eslint-plugin-react-x/src/index.ts
@@ -5,6 +5,7 @@ import { name, version } from "../package.json";
import avoidShorthandBoolean from "./rules/avoid-shorthand-boolean";
import avoidShorthandFragment from "./rules/avoid-shorthand-fragment";
import forwardRefUsingRef from "./rules/ensure-forward-ref-using-ref";
+import jsxUsesVars from "./rules/jsx-uses-vars";
import noAccessStateInSetstate from "./rules/no-access-state-in-setstate";
import noArrayIndexKey from "./rules/no-array-index-key";
import noChildrenCount from "./rules/no-children-count";
@@ -70,6 +71,7 @@ export default {
"avoid-shorthand-boolean": avoidShorthandBoolean,
"avoid-shorthand-fragment": avoidShorthandFragment,
"ensure-forward-ref-using-ref": forwardRefUsingRef,
+ "jsx-uses-vars": jsxUsesVars,
"no-access-state-in-setstate": noAccessStateInSetstate,
"no-array-index-key": noArrayIndexKey,
"no-children-count": noChildrenCount,
diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-vars.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-vars.spec.ts
new file mode 100644
index 0000000000..3021218949
--- /dev/null
+++ b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-vars.spec.ts
@@ -0,0 +1,95 @@
+import { allValid, ruleTester } from "../../../../../test";
+import rule, { RULE_NAME } from "./jsx-uses-vars";
+
+ruleTester.run(RULE_NAME, rule, {
+ invalid: [],
+ valid: [
+ ...allValid,
+ {
+ code: /* tsx */ `
+ function foo() {
+ var App;
+ var bar = React.render();
+ return bar;
+ };
+ foo()
+ `,
+ },
+ {
+ code: /* tsx */ `
+ var App;
+ React.render();
+ `,
+ },
+ {
+ code: /* tsx */ `
+ var a = 1;
+ React.render(
);
+ `,
+ },
+ {
+ code: /* tsx */ `
+ var App;
+ function f() {
+ return ;
+ }
+ f();
+ `,
+ },
+ {
+ code: /* tsx */ `
+ var App;
+
+ `,
+ },
+ {
+ code: /* tsx */ `
+ class HelloMessage {};
+
+ `,
+ },
+ {
+ code: /* tsx */ `
+ class HelloMessage {
+ render() {
+ var HelloMessage =
Hello
;
+ return HelloMessage;
+ }
+ };
+
+ `,
+ },
+ {
+ code: /* tsx */ `
+ function foo() {
+ var App = { Foo: { Bar: {} } };
+ var bar = React.render();
+ return bar;
+ };
+ foo()
+ `,
+ },
+ {
+ code: /* tsx */ `
+ function foo() {
+ var App = { Foo: { Bar: { Baz: {} } } };
+ var bar = React.render();
+ return bar;
+ };
+ foo()
+ `,
+ },
+ {
+ code: /* tsx */ `
+ var object;
+ React.render();
+ `,
+ },
+ {
+ code: /* tsx */ `
+ var object;
+ React.render();
+ `,
+ },
+ ],
+});
diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-vars.ts b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-vars.ts
new file mode 100644
index 0000000000..5ebfd28cbb
--- /dev/null
+++ b/packages/plugins/eslint-plugin-react-x/src/rules/jsx-uses-vars.ts
@@ -0,0 +1,46 @@
+import { O } from "@eslint-react/tools";
+import type { TSESTree } from "@typescript-eslint/types";
+import { AST_NODE_TYPES } from "@typescript-eslint/types";
+import type { CamelCase } from "string-ts";
+
+import { createRule } from "../utils";
+
+export const RULE_NAME = "jsx-uses-vars";
+
+export type MessageID = CamelCase;
+
+export default createRule<[], MessageID>({
+ meta: {
+ type: "problem",
+ docs: {
+ // eslint-disable-next-line eslint-plugin/require-meta-docs-description
+ description: "a helper rule to mark variables as used",
+ },
+ messages: {
+ jsxUsesVars: "",
+ },
+ schema: [],
+ },
+ name: RULE_NAME,
+ create(context) {
+ function getName(node: TSESTree.Node): O.Option {
+ switch (node.type) {
+ case AST_NODE_TYPES.JSXIdentifier:
+ return O.some(node.name);
+ case AST_NODE_TYPES.JSXMemberExpression:
+ return getName(node.object);
+ default:
+ return O.none();
+ }
+ }
+ return {
+ JSXOpeningElement(node) {
+ if (node.name.type === AST_NODE_TYPES.JSXIdentifier && /^[a-z]/u.test(node.name.name)) return;
+ O.map(getName(node.name), (name) => {
+ context.sourceCode.markVariableAsUsed(name, node);
+ });
+ },
+ };
+ },
+ defaultOptions: [],
+});
diff --git a/packages/plugins/eslint-plugin/src/index.ts b/packages/plugins/eslint-plugin/src/index.ts
index 830845318e..dd34433f2b 100644
--- a/packages/plugins/eslint-plugin/src/index.ts
+++ b/packages/plugins/eslint-plugin/src/index.ts
@@ -15,7 +15,10 @@ import { padKeysLeft } from "./utils";
const allPreset = {
// Part: Core
+ "avoid-shorthand-boolean": "warn",
+ "avoid-shorthand-fragment": "warn",
"ensure-forward-ref-using-ref": "warn",
+ "jsx-uses-vars": "warn",
"no-access-state-in-setstate": "error",
"no-array-index-key": "warn",
"no-children-count": "warn",
@@ -58,9 +61,6 @@ const allPreset = {
// "prefer-read-only-props": "warn", // This rule requires type information
"prefer-shorthand-boolean": "warn",
"prefer-shorthand-fragment": "warn",
- // eslint-disable-next-line perfectionist/sort-objects
- "avoid-shorthand-boolean": "warn",
- "avoid-shorthand-fragment": "warn",
// Part: DOM
"dom/no-children-in-void-dom-elements": "warn",
@@ -96,9 +96,10 @@ const allPreset = {
} as const satisfies RulePreset;
const corePreset = {
+ "ensure-forward-ref-using-ref": "warn",
// "avoid-shorthand-boolean": "warn",
// "avoid-shorthand-fragment": "warn",
- "ensure-forward-ref-using-ref": "warn",
+ "jsx-uses-vars": "warn",
"no-access-state-in-setstate": "error",
"no-array-index-key": "warn",
"no-children-count": "warn",
diff --git a/packages/tools/package.json b/packages/tools/package.json
index eba4d45f6b..4102cc046f 100644
--- a/packages/tools/package.json
+++ b/packages/tools/package.json
@@ -42,7 +42,7 @@
"publish": "pnpm run build && pnpm run lint:publish"
},
"devDependencies": {
- "effect": "^3.10.4",
+ "effect": "^3.10.5",
"tsup": "^8.3.5"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1f6c72786b..92faecf484 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -27,17 +27,17 @@ importers:
specifier: ^0.2.0
version: 0.2.0
'@effect/platform':
- specifier: ^0.69.9
- version: 0.69.9(effect@3.10.4)
+ specifier: ^0.69.10
+ version: 0.69.10(effect@3.10.5)
'@effect/platform-bun':
- specifier: ^0.49.10
- version: 0.49.10(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)
+ specifier: ^0.49.11
+ version: 0.49.11(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)
'@effect/platform-node':
- specifier: ^0.64.10
- version: 0.64.10(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)
+ specifier: ^0.64.11
+ version: 0.64.11(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)
'@effect/schema':
specifier: ^0.75.5
- version: 0.75.5(effect@3.10.4)
+ version: 0.75.5(effect@3.10.5)
'@eslint/config-inspector':
specifier: ^0.5.5
version: 0.5.5(eslint@9.13.0(jiti@2.3.3))
@@ -93,8 +93,8 @@ importers:
specifier: ^0.47.5
version: 0.47.5
effect:
- specifier: ^3.10.4
- version: 3.10.4
+ specifier: ^3.10.5
+ version: 3.10.5
esbuild:
specifier: ^0.24.0
version: 0.24.0
@@ -141,8 +141,8 @@ importers:
specifier: ^0.5.0
version: 0.5.0
lefthook:
- specifier: ^1.8.1
- version: 1.8.1
+ specifier: ^1.8.2
+ version: 1.8.2
markdownlint:
specifier: ^0.36.1
version: 0.36.1
@@ -876,8 +876,8 @@ importers:
packages/tools:
devDependencies:
effect:
- specifier: ^3.10.4
- version: 3.10.4
+ specifier: ^3.10.5
+ version: 3.10.5
tsup:
specifier: ^8.3.5
version: 8.3.5(@swc/core@1.7.40(@swc/helpers@0.5.13))(jiti@2.3.3)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0)
@@ -1055,8 +1055,8 @@ importers:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.47)
effect:
- specifier: ^3.10.4
- version: 3.10.4
+ specifier: ^3.10.5
+ version: 3.10.5
eslint:
specifier: ^9.13.0
version: 9.13.0(jiti@2.3.3)
@@ -2032,28 +2032,28 @@ packages:
'@effect/language-service@0.2.0':
resolution: {integrity: sha512-DoK41yKGyQv79o0ca8gxEogMlt+IphXkdCXwgenbQjH1BXKD7tJAr0+VsDhblycQcvQ39f1l9NZN9CBqjM9ALA==}
- '@effect/platform-bun@0.49.10':
- resolution: {integrity: sha512-YY1di/7d3uexcnlPJ6KFhFxyu4OBDQdCxqAQs1aC/EDMUkl4qUQ6pgKDB2+L1LtbuIvYyNjyGkdUhMtOeG8TZw==}
+ '@effect/platform-bun@0.49.11':
+ resolution: {integrity: sha512-1OCkJuJ+sVMM1LusTXe0HD8KyZ7TelzyiHG9SWPGvwpSJI7dfcAsHy0TTZCptuGe2FNtWgTikCx/+DPtSVvOSA==}
peerDependencies:
- '@effect/platform': ^0.69.9
- effect: ^3.10.4
+ '@effect/platform': ^0.69.10
+ effect: ^3.10.5
- '@effect/platform-node-shared@0.19.9':
- resolution: {integrity: sha512-XR5EraZRIJ9Uhgh/A6u3cuOH0uVfKdD7DhpStpjJAw8ShntDLjRwI0QKWrJTL3Z3zDqVkGvdZoFSxBeF4cOcxA==}
+ '@effect/platform-node-shared@0.19.10':
+ resolution: {integrity: sha512-vGBriNQ69XE+eMdg8gAAocpPRXjJxKArgO2CvdQ7+O0/0Ph2+0Edq0LEhpXNVnjmfUDRPYGLD9TS+AIquKARDA==}
peerDependencies:
- '@effect/platform': ^0.69.9
- effect: ^3.10.4
+ '@effect/platform': ^0.69.10
+ effect: ^3.10.5
- '@effect/platform-node@0.64.10':
- resolution: {integrity: sha512-V8dC6GGxC5VBGEoTApSX5+MJTKDNPeSFzdQiZroDvAulOoA18hTj3jVz2pgtP9DjlJ8EIUEW8lMETD149FMbWA==}
+ '@effect/platform-node@0.64.11':
+ resolution: {integrity: sha512-oUhGB0YlZJvv0USTMQXDT0dc9VuGuoWeCanhMvL/J1YVSLWwMMinkxchNQCawyJNiOBBaRXstHR4lPJaT6Z6ZA==}
peerDependencies:
- '@effect/platform': ^0.69.9
- effect: ^3.10.4
+ '@effect/platform': ^0.69.10
+ effect: ^3.10.5
- '@effect/platform@0.69.9':
- resolution: {integrity: sha512-gdp5rLxKLBBI895ycBRkuwCQHnYf8g6+Sdg5tFhuH+axIdgP4J8dGzIvYBGAkRMw/4k2BYeSKKf8ZONYnNWcWg==}
+ '@effect/platform@0.69.10':
+ resolution: {integrity: sha512-GhCB9WFajOQzzpU4X0IE8L8slx4ALfuTA5iK/36fXp8CyUbp88ZYhic6jt6b8L0u14qPHYLrkxO/2pSBXRgcZA==}
peerDependencies:
- effect: ^3.10.4
+ effect: ^3.10.5
'@effect/schema@0.75.5':
resolution: {integrity: sha512-TQInulTVCuF+9EIbJpyLP6dvxbQJMphrnRqgexm/Ze39rSjfhJuufF7XvU3SxTgg3HnL7B/kpORTJbHhlE6thw==}
@@ -4856,8 +4856,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- effect@3.10.4:
- resolution: {integrity: sha512-D7Mryq8jylT0fIGrgXEn2TublO/BhduRwzlqV5z1l/QFY6grs7UOyyomlAOFMK9ArSYiLgrOSMQ/Cr/cIOeU2Q==}
+ effect@3.10.5:
+ resolution: {integrity: sha512-Um6eCaBAXqNLO+lQy3t7fop+OX3+r5JqfCTwW/nD7mce7K0Crdpwf/k74ScD5ONg4yRit6xqUkRhR9ubPcPAtg==}
effect@3.3.2:
resolution: {integrity: sha512-695XQBtp+UUYG50oREG9ujnRoeQU7xhwHDhT6ZAexm3Q+umdml1kjxcPoYRrS65crmaLlhVpjZHePJNzWOODnA==}
@@ -6025,58 +6025,58 @@ packages:
layout-base@2.0.1:
resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
- lefthook-darwin-arm64@1.8.1:
- resolution: {integrity: sha512-zTUb0NcMWKDqck9UobqJZCzihksk5Dv/D+zD3jrxi50vQvgl4wfTO3sP78WmVdhGkMCyHy5udOB+L72fyJqcdw==}
+ lefthook-darwin-arm64@1.8.2:
+ resolution: {integrity: sha512-g41SoFUv8SzHpG1NOPkHUEPhC1tJM5FF3Vo+HESmLmL9cDfd7JncHFPy59rVnC9Q8nOS0rvoik5HTq+3/wcfww==}
cpu: [arm64]
os: [darwin]
- lefthook-darwin-x64@1.8.1:
- resolution: {integrity: sha512-f9DY+UBd+g6TZ/nHdNZnfGeWT/0n18bkYi56biKEBXIgRlnuTNCrk0TUiSxlWF2GUQdxHM8YSWDkPRtHLg+3zg==}
+ lefthook-darwin-x64@1.8.2:
+ resolution: {integrity: sha512-IlCm4PrA/aAZ1MChiExYTbladC87GaxmYHOMHCeChLecqn+lypAuiYLgf7w5r2s3MjH5rbXImfU925NRKi6RXQ==}
cpu: [x64]
os: [darwin]
- lefthook-freebsd-arm64@1.8.1:
- resolution: {integrity: sha512-ZWx0PtYRtd0tlygUjLKP1eSztyLx2pOnI06h5/PyxWcmF+1/WjYPZM7Mt1nBwpqZcFNYkQ3VefFfg1f0URuLJQ==}
+ lefthook-freebsd-arm64@1.8.2:
+ resolution: {integrity: sha512-f7AIvuIEXUUR1ZutIFxjYKFDAVUBrdsLm+cbwOCjdfpJh7j2Fjg6nKXbDcglPXlX9Ix+nw9pHbJE2DAgzkI1Vw==}
cpu: [arm64]
os: [freebsd]
- lefthook-freebsd-x64@1.8.1:
- resolution: {integrity: sha512-F5rd7JMwQJosZclsyqJciAn5CBZCZGTGEXLWEwOhgFZbbsUubGSekAhJNoHFm4eJZaDhhWnckghCjXCfBjDSYg==}
+ lefthook-freebsd-x64@1.8.2:
+ resolution: {integrity: sha512-DSDL64fRLSNSWOa1y2bGXwXPiwU1fbAXpj63j6jeQ0jkgu6k+3XL/PBXKh80cI6MvCKz/KQKCtIencXZZ2Ua4Q==}
cpu: [x64]
os: [freebsd]
- lefthook-linux-arm64@1.8.1:
- resolution: {integrity: sha512-CTsqVHW2B291wLXonod1AMUJEOZqtG8lY+la97Id301kY4TzgbBKQvU2LF/hBIS8c62DjPMzEM4NYfbVzrK1QA==}
+ lefthook-linux-arm64@1.8.2:
+ resolution: {integrity: sha512-sJ95X+ZH8ayIE7ApiGEq5ZF9KGA+eKiocJU+536bLbAIHw5WjGmv2x3llFqUxH/zAmLe3k542oZ4d84wEO0EGQ==}
cpu: [arm64]
os: [linux]
- lefthook-linux-x64@1.8.1:
- resolution: {integrity: sha512-fw8WwUjr+mCfH/Gbmfj/7J0oX8NjfaACUQlYr3kVHz3c+LYMoRv7O/7dn2OXVO5vEdK5zH/NZlMml4C4qhxwEA==}
+ lefthook-linux-x64@1.8.2:
+ resolution: {integrity: sha512-2eirc61M0WjlbSHamAgGf9iWsQTYz4IT6PAPm66vUaeG34+5D66xFicIV6pK2niRGUOPtNs8Kt4lboKtW+ba5g==}
cpu: [x64]
os: [linux]
- lefthook-openbsd-arm64@1.8.1:
- resolution: {integrity: sha512-Za9K1ZAoRRM2Pq0eXZHbUppUZArZfgVcTDawKf/FRkbvAsTnBPEcH8Qtjcsm12qLQZ45KtPzZ/GEl/nxnWpeVQ==}
+ lefthook-openbsd-arm64@1.8.2:
+ resolution: {integrity: sha512-ZMop7htaSwP3MiL06WHUV36EX05N33o0WzNzC8NO5KEubn8Z74vbXcaq6qYezmgi+erkG6dtTnlbcZy5PFvFIA==}
cpu: [arm64]
os: [openbsd]
- lefthook-openbsd-x64@1.8.1:
- resolution: {integrity: sha512-NgzcIouZobNZw1eEIC3Vh3z4bzVgIGIyJ41g5PGe6d1IXVkmnc5qpFP7jgnaaLK7TPahzIOREQrtYgR62Hg5bw==}
+ lefthook-openbsd-x64@1.8.2:
+ resolution: {integrity: sha512-jXFoxmpYXO6ZafgQJVvk3MYlRgOBJD3n7H8A1Bj1E2yrLzOhKevUKlTNwZTxQdxlnvoo33yD6SjVSujZavEGpw==}
cpu: [x64]
os: [openbsd]
- lefthook-windows-arm64@1.8.1:
- resolution: {integrity: sha512-NUIwnV56YLUmHZf+C5gQA9tIdWjdHu5Ql6hNdFbYYrGxNvNFh2juHRaPKHUGjYk5iu9bxgjogw7mHfN+LanBcQ==}
+ lefthook-windows-arm64@1.8.2:
+ resolution: {integrity: sha512-hsQUSk6kmB8E0UMD3Mk6ROoa7qv6XmigfPsn9tFjmbZ2aO+kpBfWitZ5v+gcjNp44yaECs3YTMIfv3QFwXlRCw==}
cpu: [arm64]
os: [win32]
- lefthook-windows-x64@1.8.1:
- resolution: {integrity: sha512-9cnvWe8tYBwUxJFvW/TJ3P4Al+52QJcLdkJJ1aKgr3F7EydPPZk+jWFy0b1SSan1S7M7OuoPC9jcKS3PGjB6tw==}
+ lefthook-windows-x64@1.8.2:
+ resolution: {integrity: sha512-YypbMhvgAtkL7y+O3OlF81vwua7X4jloBz5hO3fILAuzaGAiPE1VbeuqRweV8VuKK4L/ZVVKqmpesygBUNDp9w==}
cpu: [x64]
os: [win32]
- lefthook@1.8.1:
- resolution: {integrity: sha512-DTm2F7kf+mQ0UgxSOuCSIwAMC4RJOH5x77okcsFfeJOJ0y7/xGgpfmPb9ZPBDXeJ6UxfI0ngRgWoEctYMlMr4A==}
+ lefthook@1.8.2:
+ resolution: {integrity: sha512-lMXbcFHNDr+gzy/7ghuJDVB/Yyycj+ZL/7pN3Gm/s5Xqrc9+5sj3IrDAPylcEJ1cKCbUnXbwESrhhqpcYv4d4g==}
hasBin: true
levn@0.4.1:
@@ -9608,24 +9608,24 @@ snapshots:
'@effect/language-service@0.2.0': {}
- '@effect/platform-bun@0.49.10(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)':
+ '@effect/platform-bun@0.49.11(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)':
dependencies:
- '@effect/platform': 0.69.9(effect@3.10.4)
- '@effect/platform-node-shared': 0.19.9(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)
- effect: 3.10.4
+ '@effect/platform': 0.69.10(effect@3.10.5)
+ '@effect/platform-node-shared': 0.19.10(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)
+ effect: 3.10.5
- '@effect/platform-node-shared@0.19.9(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)':
+ '@effect/platform-node-shared@0.19.10(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)':
dependencies:
- '@effect/platform': 0.69.9(effect@3.10.4)
+ '@effect/platform': 0.69.10(effect@3.10.5)
'@parcel/watcher': 2.4.1
- effect: 3.10.4
+ effect: 3.10.5
multipasta: 0.2.5
- '@effect/platform-node@0.64.10(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)':
+ '@effect/platform-node@0.64.11(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)':
dependencies:
- '@effect/platform': 0.69.9(effect@3.10.4)
- '@effect/platform-node-shared': 0.19.9(@effect/platform@0.69.9(effect@3.10.4))(effect@3.10.4)
- effect: 3.10.4
+ '@effect/platform': 0.69.10(effect@3.10.5)
+ '@effect/platform-node-shared': 0.19.10(@effect/platform@0.69.10(effect@3.10.5))(effect@3.10.5)
+ effect: 3.10.5
mime: 3.0.0
undici: 6.20.1
ws: 8.18.0
@@ -9633,15 +9633,15 @@ snapshots:
- bufferutil
- utf-8-validate
- '@effect/platform@0.69.9(effect@3.10.4)':
+ '@effect/platform@0.69.10(effect@3.10.5)':
dependencies:
- effect: 3.10.4
+ effect: 3.10.5
find-my-way-ts: 0.1.5
multipasta: 0.2.5
- '@effect/schema@0.75.5(effect@3.10.4)':
+ '@effect/schema@0.75.5(effect@3.10.5)':
dependencies:
- effect: 3.10.4
+ effect: 3.10.5
fast-check: 3.22.0
'@emnapi/core@1.3.1':
@@ -12459,7 +12459,7 @@ snapshots:
ee-first@1.1.1: {}
- effect@3.10.4:
+ effect@3.10.5:
dependencies:
fast-check: 3.22.0
@@ -13845,48 +13845,48 @@ snapshots:
layout-base@2.0.1: {}
- lefthook-darwin-arm64@1.8.1:
+ lefthook-darwin-arm64@1.8.2:
optional: true
- lefthook-darwin-x64@1.8.1:
+ lefthook-darwin-x64@1.8.2:
optional: true
- lefthook-freebsd-arm64@1.8.1:
+ lefthook-freebsd-arm64@1.8.2:
optional: true
- lefthook-freebsd-x64@1.8.1:
+ lefthook-freebsd-x64@1.8.2:
optional: true
- lefthook-linux-arm64@1.8.1:
+ lefthook-linux-arm64@1.8.2:
optional: true
- lefthook-linux-x64@1.8.1:
+ lefthook-linux-x64@1.8.2:
optional: true
- lefthook-openbsd-arm64@1.8.1:
+ lefthook-openbsd-arm64@1.8.2:
optional: true
- lefthook-openbsd-x64@1.8.1:
+ lefthook-openbsd-x64@1.8.2:
optional: true
- lefthook-windows-arm64@1.8.1:
+ lefthook-windows-arm64@1.8.2:
optional: true
- lefthook-windows-x64@1.8.1:
+ lefthook-windows-x64@1.8.2:
optional: true
- lefthook@1.8.1:
+ lefthook@1.8.2:
optionalDependencies:
- lefthook-darwin-arm64: 1.8.1
- lefthook-darwin-x64: 1.8.1
- lefthook-freebsd-arm64: 1.8.1
- lefthook-freebsd-x64: 1.8.1
- lefthook-linux-arm64: 1.8.1
- lefthook-linux-x64: 1.8.1
- lefthook-openbsd-arm64: 1.8.1
- lefthook-openbsd-x64: 1.8.1
- lefthook-windows-arm64: 1.8.1
- lefthook-windows-x64: 1.8.1
+ lefthook-darwin-arm64: 1.8.2
+ lefthook-darwin-x64: 1.8.2
+ lefthook-freebsd-arm64: 1.8.2
+ lefthook-freebsd-x64: 1.8.2
+ lefthook-linux-arm64: 1.8.2
+ lefthook-linux-x64: 1.8.2
+ lefthook-openbsd-arm64: 1.8.2
+ lefthook-openbsd-x64: 1.8.2
+ lefthook-windows-arm64: 1.8.2
+ lefthook-windows-x64: 1.8.2
levn@0.4.1:
dependencies:
diff --git a/website/package.json b/website/package.json
index 1b08e9651e..a98613146e 100644
--- a/website/package.json
+++ b/website/package.json
@@ -31,7 +31,7 @@
"@vanilla-extract/next-plugin": "^2.4.6",
"@vitejs/plugin-react": "^4.3.3",
"autoprefixer": "^10.4.20",
- "effect": "^3.10.4",
+ "effect": "^3.10.5",
"eslint": "^9.13.0",
"eslint-plugin-mdx": "^3.1.5",
"eslint-plugin-react-hooks": "^5.0.0",
diff --git a/website/pages/docs/rules/_meta.ts b/website/pages/docs/rules/_meta.ts
index 876d3d4685..92348aa9e1 100644
--- a/website/pages/docs/rules/_meta.ts
+++ b/website/pages/docs/rules/_meta.ts
@@ -9,6 +9,7 @@ export default {
type: "separator",
},
"ensure-forward-ref-using-ref": "ensure-forward-ref-using-ref",
+ "jsx-uses-vars": "jsx-uses-vars",
"no-access-state-in-setstate": "no-access-state-in-setstate",
"no-array-index-key": "no-array-index-key",
"no-children-count": "no-children-count",
diff --git a/website/pages/docs/rules/jsx-uses-vars.mdx b/website/pages/docs/rules/jsx-uses-vars.mdx
new file mode 100644
index 0000000000..e42f0c712b
--- /dev/null
+++ b/website/pages/docs/rules/jsx-uses-vars.mdx
@@ -0,0 +1,27 @@
+# jsx-uses-vars
+
+## Rule category
+
+Correctness.
+
+## What it does
+
+## Examples
+
+Since 0.17.0 the eslint `no-unused-var`s rule does not detect variables used in JSX (see details). This rule will find variables used in JSX and mark them as used.
+
+This rule only has an effect when the `no-unused-vars` rule is enabled.
+
+### Failing
+
+```tsx
+const Hello = require('./Hello');
+```
+
+### Passing
+
+```tsx
+const Hello = require('./Hello');
+
+;
+```
diff --git a/website/pages/docs/rules/overview.md b/website/pages/docs/rules/overview.md
index e73db1efec..c99e08e8cd 100644
--- a/website/pages/docs/rules/overview.md
+++ b/website/pages/docs/rules/overview.md
@@ -26,6 +26,7 @@
| [`avoid-shorthand-boolean`](avoid-shorthand-boolean) | Prevents using shorthand syntax for boolean attributes. | 🎨 | | |
| [`avoid-shorthand-fragment`](avoid-shorthand-fragment) | Prevents using shorthand syntax for fragments. | 🎨 | | |
| [`ensure-forward-ref-using-ref`](ensure-forward-ref-using-ref) | Requires that components wrapped with `forwardRef` must have a `ref` parameter. | ✔️ | | |
+| [`jsx-uses-vars`](jsx-uses-vars) | Prevents variables used in JSX to be marked as unused. | ✔️ | | |
| [`no-access-state-in-setstate`](no-access-state-in-setstate) | Prevents accessing `this.state` inside `setState` calls. | ✔️ | | |
| [`no-array-index-key`](no-array-index-key) | Prevents using array `index` as `key`. | 🧐 | | |
| [`no-children-count`](no-children-count) | Prevents using `Children.count`. | ⛔ | | |