From fb63fac846a138eec0b049c2c2c2be7b68216e50 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sat, 7 Feb 2026 00:06:34 +0800 Subject: [PATCH] feat(react): sync recommend rules --- package.json | 2 +- pnpm-lock.yaml | 291 ++++++++++++++------- pnpm-workspace.yaml | 2 +- src/cli/constants-generated.ts | 2 +- src/configs/react.ts | 45 +++- test/__snapshots__/factory/full-on.snap.js | 34 ++- 6 files changed, 260 insertions(+), 116 deletions(-) diff --git a/package.json b/package.json index 1f7c4bda0f..4196848c2f 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "prepare": "simple-git-hooks" }, "peerDependencies": { - "@eslint-react/eslint-plugin": "^2.0.1", + "@eslint-react/eslint-plugin": "^2.11.0", "@next/eslint-plugin-next": ">=15.0.0", "@prettier/plugin-xml": "^3.4.1", "@unocss/eslint-plugin": ">=0.50.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f33fcc03b..a5103b84e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,8 +57,8 @@ catalogs: version: 1.0.1 peer: '@eslint-react/eslint-plugin': - specifier: ^2.7.2 - version: 2.7.2 + specifier: ^2.11.0 + version: 2.11.0 '@next/eslint-plugin-next': specifier: ^16.1.4 version: 16.1.4 @@ -354,7 +354,7 @@ importers: version: 28.2.0 '@eslint-react/eslint-plugin': specifier: catalog:peer - version: 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@eslint/config-inspector': specifier: catalog:dev version: 1.4.2(eslint@9.39.2(jiti@2.6.1)) @@ -909,40 +909,40 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.7.2': - resolution: {integrity: sha512-RB8AVNjboN6/md9Da4rUG4WqxLT+DqUR+qXIR6iAD0+xxp6Dtihu541+lKLZ3GCstunbBcDwu7gdhSbz+BHSuQ==} + '@eslint-react/ast@2.11.0': + resolution: {integrity: sha512-DuX/NO6o/hJIWzhaoimtRP5u4/A+DHTz0bBwsCx3N7gGNct4UDHGt5lG1UCZqHM091SvEptbFmWsQEHZEoL7eg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/core@2.7.2': - resolution: {integrity: sha512-QOYh8OWwUGMYLhuvb8WcmoS2jYXb0SJbpX+Ozk+Ht2G9XGRAahl+8PDy/o2l2lLnFXv5JQGfLrN+m2WPTi104g==} + '@eslint-react/core@2.11.0': + resolution: {integrity: sha512-7Gv9yhfePucqzTEe2EhrN+gF8NEdGT4Y/U+fKhCoGaClLZMHS4jHYg+sP5IcqGNcpvxNittC8ckoCDJ3mHR8ug==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/eff@2.7.2': - resolution: {integrity: sha512-AzQGbidoI8g8izka/1H9xCKW56NR7xWGGPMccBCUZwbCoJZ4wyRKcE10E7ot7LwBv5kBoUQp3GJ9UXCcg/Er0w==} + '@eslint-react/eff@2.11.0': + resolution: {integrity: sha512-0aY73uncaEBulziyLYtui95duvjxaNIrIh/6TFgY14kRcacb36Sxu0zDReQHWhrlnI/H6nFNGAdUJN/1GbERuw==} engines: {node: '>=20.19.0'} - '@eslint-react/eslint-plugin@2.7.2': - resolution: {integrity: sha512-h9T5cc2TxsKMv/8iO63KKamXyJjHHAmeG2MJVjeIm4FaZdsX0/2Bx254B3Fa8IDqQi4X81AMyJ8ohtbxsn6pOw==} + '@eslint-react/eslint-plugin@2.11.0': + resolution: {integrity: sha512-zmo84rwDs+ZUSO7eQeK2A8FE5Rz9gKwv4K7QGwmGNPbGp6Rz9ZZd81v6dDbWt7AeSGTWH+YE3O16NG1p/9uX5w==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/shared@2.7.2': - resolution: {integrity: sha512-U1H3dLaTj7kvEbyJyJEgn6xX3BmrCH1f9f+tg9gLWlN7askgWT5NF56wfX1l+jtwiEAZD/78W1TfICKkMnZDxQ==} + '@eslint-react/shared@2.11.0': + resolution: {integrity: sha512-tqk3mEbi0/BYKjAOexFgF0Eg1zDwKO56cHHmrMhpb56Ka3qvzLKUUmGiNfHSAl1FQNRaKSktxf8kKm7Tp9Zvlg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/var@2.7.2': - resolution: {integrity: sha512-sPnXmikpzmAdIWh6lqqKm4Bu0ypKTCAQ7WxGuR5ejxtrA/HjQQuKMBIyPkBdjHWlF9ADdh9pKuo1j2RQwUWiqA==} + '@eslint-react/var@2.11.0': + resolution: {integrity: sha512-YlvGQZHUPoJjMlL7U+SCUIJV2JcryjMsNKorhTFGFOLsjKa3hpCIkKnoDxIodUAeLvZJWkKloIBINvE9SRyvsg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 @@ -1455,16 +1455,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.53.1': resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.53.1': resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.53.1': resolution: {integrity: sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1472,6 +1488,13 @@ packages: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.39.2 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.53.1': resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1482,6 +1505,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.53.1': resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1493,6 +1522,10 @@ packages: resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@unocss/config@66.6.0': resolution: {integrity: sha512-YvNk/b9jGmT1TQGDbHR+0VALnTsPLzSTzw90t09ggny9YxeF0XnsP06M5+H0EJPwpmdigBC++KEIMaK8SYDsaQ==} engines: {node: '>=14'} @@ -2161,15 +2194,15 @@ packages: peerDependencies: eslint: ^9.39.2 - eslint-plugin-react-dom@2.7.2: - resolution: {integrity: sha512-Qzd4HAFwsxvOJoAycLIRxziOTJwEZ6EGAA6jEFFBSD1BbFVnDlozMvOLp9/+GrZW3cE0FGmAS6QXnjuMf0QYLQ==} + eslint-plugin-react-dom@2.11.0: + resolution: {integrity: sha512-hqZkFOpE6yU8WaRjvUNXHlaujw9/Cn2Iyk7lRw23edOUUDhpa+X4NH2FyZh0b23uuhHegJayKjwqnxFZDPKZZw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-hooks-extra@2.7.2: - resolution: {integrity: sha512-wcjQeBO1naCFPV47osw7nnK2p81eudCE2PhasKLtBV+GcAEi34jbt9QGULzQYueP+zd1aW53SmnVrTinY4DC6w==} + eslint-plugin-react-hooks-extra@2.11.0: + resolution: {integrity: sha512-d/O0wdz2026wmaVt0buVmi25MtYz7c8Mn7DtTihkoXR5GyZUFJ/5v/7kbOfC8hW3MyCEjuf02e0H107jyZ7JuQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 @@ -2181,8 +2214,8 @@ packages: peerDependencies: eslint: ^9.39.2 - eslint-plugin-react-naming-convention@2.7.2: - resolution: {integrity: sha512-T+/RQFEda3AgCzBHguE3isLQetn8KUOZ14SnDBQSOZSWS/GjgQn+gmqHi3EVHX/sDdL+LsIUKRsRR6KmmYWMiw==} + eslint-plugin-react-naming-convention@2.11.0: + resolution: {integrity: sha512-hmH7/jta2L3eXW1do7pHaZqxPH/EQwSa1SAnXB/XVHkkwZzvXCVUwEvJnMhPdKDrXQeDDXZUmbuw6eCfBSQu4Q==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 @@ -2193,15 +2226,22 @@ packages: peerDependencies: eslint: ^9.39.2 - eslint-plugin-react-web-api@2.7.2: - resolution: {integrity: sha512-iA3D8jbwasMeeUfK8XucGkgrjQvZowCTi1+TzA43U7IFsWzyQWQpbN/I9B0BY/g6/JU9falC5b7qv6HB7P5JhA==} + eslint-plugin-react-rsc@2.11.0: + resolution: {integrity: sha512-hJRnl2C/pi36kgjvCLNGPmGRDnKUzjrwLCNMp5/upV0Du+1ume23DhYuzzbail/WRp11xccfK2fHJGbUSVpmDw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-x@2.7.2: - resolution: {integrity: sha512-0NbYqJhc3tZQVluaFMVCOg6HEFarlNNXe+DHa/JrLAR0PVb9AtJGk8FBEDdxaUZO8ph0sAekUNLB7gymftj4Dw==} + eslint-plugin-react-web-api@2.11.0: + resolution: {integrity: sha512-T8062QNhIHYDiwRVSnyZpSbjdsXEmw3hTnj5+g9wUWySacCaaMpJEX6MV7I7RMS9RnHzsvUnbvs7bneEZ6xg/g==} + engines: {node: '>=20.19.0'} + peerDependencies: + eslint: ^9.39.2 + typescript: '>=4.8.4 <6.0.0' + + eslint-plugin-react-x@2.11.0: + resolution: {integrity: sha512-yEv2uIZc7wyYlEic6FbBS0PYuWRdUhS6UjQGJUbLE84Lb2XTnO6yn1+B2zXd/LrHxCDKwnXHLxPK9MBEVG0yVw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.39.2 @@ -4234,11 +4274,11 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/ast@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.7.2 + '@eslint-react/eff': 2.11.0 '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) string-ts: 2.3.1 @@ -4246,46 +4286,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint-react/core@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/core@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - birecord: 0.1.1 eslint: 9.39.2(jiti@2.6.1) ts-pattern: 5.9.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/eff@2.7.2': {} + '@eslint-react/eff@2.11.0': {} - '@eslint-react/eslint-plugin@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/eslint-plugin@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-dom: 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-web-api: 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-x: 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-dom: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-rsc: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x: 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/shared@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/shared@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.7.2 + '@eslint-react/eff': 2.11.0 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) ts-pattern: 5.9.0 @@ -4294,11 +4334,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint-react/var@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/var@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@typescript-eslint/scope-manager': 8.53.1 + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) @@ -4718,15 +4759,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.53.1': dependencies: '@typescript-eslint/types': 8.53.1 '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/scope-manager@8.54.0': + dependencies: + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.53.1 @@ -4739,6 +4798,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.53.1': {} '@typescript-eslint/typescript-estree@8.53.1(typescript@5.9.3)': @@ -4756,6 +4827,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -4772,6 +4858,11 @@ snapshots: '@typescript-eslint/types': 8.53.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.54.0': + dependencies: + '@typescript-eslint/types': 8.53.1 + eslint-visitor-keys: 4.2.1 + '@unocss/config@66.6.0': dependencies: '@unocss/core': 66.6.0 @@ -5622,37 +5713,35 @@ snapshots: yaml: 2.8.2 yaml-eslint-parser: 2.0.0 - eslint-plugin-react-dom@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-dom@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.2(jiti@2.6.1) - string-ts: 2.3.1 ts-pattern: 5.9.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-hooks-extra@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) - string-ts: 2.3.1 ts-pattern: 5.9.0 typescript: 5.9.3 transitivePeerDependencies: @@ -5669,15 +5758,15 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-naming-convention@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 @@ -5692,38 +5781,50 @@ snapshots: dependencies: eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-web-api@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-rsc@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) - string-ts: 2.3.1 ts-pattern: 5.9.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-web-api@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.7.2 - '@eslint-react/shared': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.7.2(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + birecord: 0.1.1 + eslint: 9.39.2(jiti@2.6.1) + ts-pattern: 5.9.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-x@2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.11.0 + '@eslint-react/shared': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.11.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/types': 8.53.1 '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.2(jiti@2.6.1) is-immutable-type: 5.0.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - string-ts: 2.3.1 ts-api-utils: 2.4.0(typescript@5.9.3) ts-pattern: 5.9.0 typescript: 5.9.3 @@ -6286,7 +6387,7 @@ snapshots: is-immutable-type@5.0.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 40633f0aee..40e557e7ad 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -35,7 +35,7 @@ catalogs: find-up-simple: ^1.0.1 peer: '@eslint-community/eslint-utils': ^4.9.1 - '@eslint-react/eslint-plugin': ^2.7.2 + '@eslint-react/eslint-plugin': ^2.11.0 '@next/eslint-plugin-next': ^16.1.4 '@prettier/plugin-xml': ^3.4.2 '@typescript-eslint/types': ^8.53.1 diff --git a/src/cli/constants-generated.ts b/src/cli/constants-generated.ts index 85b682cae2..1eecf7e456 100644 --- a/src/cli/constants-generated.ts +++ b/src/cli/constants-generated.ts @@ -1,5 +1,5 @@ export const versionsMap = { - "@eslint-react/eslint-plugin": "^2.7.2", + "@eslint-react/eslint-plugin": "^2.11.0", "@next/eslint-plugin-next": "^16.1.4", "@unocss/eslint-plugin": "^66.6.0", "astro-eslint-parser": "^1.2.2", diff --git a/src/configs/react.ts b/src/configs/react.ts index f977cc2ce2..6cc806ae37 100644 --- a/src/configs/react.ts +++ b/src/configs/react.ts @@ -54,6 +54,7 @@ export async function react( const typeAwareRules: TypedFlatConfigItem['rules'] = { 'react/no-leaked-conditional-rendering': 'warn', + 'react/no-implicit-key': 'error', } const [ @@ -83,6 +84,7 @@ export async function react( 'react-hooks-extra': plugins['@eslint-react/hooks-extra'], 'react-naming-convention': plugins['@eslint-react/naming-convention'], 'react-refresh': pluginReactRefresh, + 'react-rsc': plugins['@eslint-react/rsc'], 'react-web-api': plugins['@eslint-react/web-api'], }, }, @@ -119,9 +121,7 @@ export async function react( 'react/no-create-ref': 'error', 'react/no-default-props': 'error', 'react/no-direct-mutation-state': 'error', - 'react/no-duplicate-key': 'error', 'react/no-forward-ref': 'warn', - 'react/no-implicit-key': 'warn', 'react/no-missing-key': 'error', 'react/no-nested-component-definitions': 'error', 'react/no-nested-lazy-component-declarations': 'error', @@ -135,11 +135,16 @@ export async function react( 'react/no-unsafe-component-will-mount': 'warn', 'react/no-unsafe-component-will-receive-props': 'warn', 'react/no-unsafe-component-will-update': 'warn', + 'react/no-unused-class-component-members': 'warn', 'react/no-use-context': 'warn', 'react/no-useless-forward-ref': 'warn', 'react/prefer-use-state-lazy-initialization': 'warn', + 'react/prefer-namespace-import': 'error', + // recommended rules from eslint-plugin-react-rsc https://eslint-react.xyz/docs/rules/overview#rsc-rules + 'react-rsc/function-definition': 'error', + // recommended rules from eslint-plugin-react-dom https://eslint-react.xyz/docs/rules/overview#dom-rules 'react-dom/no-dangerously-set-innerhtml': 'warn', 'react-dom/no-dangerously-set-innerhtml-with-children': 'error', @@ -154,6 +159,20 @@ export async function react( 'react-dom/no-use-form-state': 'error', 'react-dom/no-void-elements-with-children': 'error', + // recommended rules from eslint-plugin-react-hooks-extra https://eslint-react.xyz/docs/rules/overview#hooks-extra-rules + 'react-hooks-extra/no-direct-set-state-in-use-effect': 'warn', + + // recommended rules from eslint-plugin-react-naming-convention https://eslint-react.xyz/docs/rules/overview#naming-convention-rules + 'react-naming-convention/context-name': 'warn', + 'react-naming-convention/ref-name': 'warn', + 'react-naming-convention/use-state': 'warn', + + // recommended rules from eslint-plugin-react-web-api https://eslint-react.xyz/docs/rules/overview#web-api-rules + 'react-web-api/no-leaked-event-listener': 'warn', + 'react-web-api/no-leaked-interval': 'warn', + 'react-web-api/no-leaked-resize-observer': 'warn', + 'react-web-api/no-leaked-timeout': 'warn', + // recommended rules eslint-plugin-react-hooks https://github.com/facebook/react/blob/main/packages/eslint-plugin-react-hooks/README.md // Core hooks rules 'react-hooks/rules-of-hooks': 'error', @@ -180,15 +199,6 @@ export async function react( } : {}), - // recommended rules from eslint-plugin-react-hooks-extra https://eslint-react.xyz/docs/rules/overview#hooks-extra-rules - 'react-hooks-extra/no-direct-set-state-in-use-effect': 'warn', - - // recommended rules from eslint-plugin-react-web-api https://eslint-react.xyz/docs/rules/overview#web-api-rules - 'react-web-api/no-leaked-event-listener': 'warn', - 'react-web-api/no-leaked-interval': 'warn', - 'react-web-api/no-leaked-resize-observer': 'warn', - 'react-web-api/no-leaked-timeout': 'warn', - // preconfigured rules from eslint-plugin-react-refresh https://github.com/ArnaudBarre/eslint-plugin-react-refresh/tree/main/src 'react-refresh/only-export-components': [ 'error', @@ -240,6 +250,19 @@ export async function react( ...overrides, }, }, + { + files: filesTypeAware, + name: 'antfu/react/typescript', + rules: { + // Disables rules that are already handled by TypeScript + 'react-dom/no-string-style-prop': 'off', + 'react-dom/no-unknown-property': 'off', + 'react/jsx-no-duplicate-props': 'off', + 'react/jsx-no-undef': 'off', + 'react/jsx-uses-react': 'off', + 'react/jsx-uses-vars': 'off', + }, + }, ...isTypeAware ? [{ files: filesTypeAware, diff --git a/test/__snapshots__/factory/full-on.snap.js b/test/__snapshots__/factory/full-on.snap.js index 9bcc6e439f..57cfa34b0d 100644 --- a/test/__snapshots__/factory/full-on.snap.js +++ b/test/__snapshots__/factory/full-on.snap.js @@ -860,6 +860,7 @@ "react-hooks-extra", "react-naming-convention", "react-refresh", + "react-rsc", "react-web-api", ], }, @@ -897,9 +898,7 @@ "react/no-create-ref", "react/no-default-props", "react/no-direct-mutation-state", - "react/no-duplicate-key", "react/no-forward-ref", - "react/no-implicit-key", "react/no-missing-key", "react/no-nested-component-definitions", "react/no-nested-lazy-component-declarations", @@ -913,10 +912,12 @@ "react/no-unsafe-component-will-mount", "react/no-unsafe-component-will-receive-props", "react/no-unsafe-component-will-update", + "react/no-unused-class-component-members", "react/no-use-context", "react/no-useless-forward-ref", "react/prefer-use-state-lazy-initialization", "react/prefer-namespace-import", + "react-rsc/function-definition", "react-dom/no-dangerously-set-innerhtml", "react-dom/no-dangerously-set-innerhtml-with-children", "react-dom/no-find-dom-node", @@ -929,6 +930,14 @@ "react-dom/no-unsafe-iframe-sandbox", "react-dom/no-use-form-state", "react-dom/no-void-elements-with-children", + "react-hooks-extra/no-direct-set-state-in-use-effect", + "react-naming-convention/context-name", + "react-naming-convention/ref-name", + "react-naming-convention/use-state", + "react-web-api/no-leaked-event-listener", + "react-web-api/no-leaked-interval", + "react-web-api/no-leaked-resize-observer", + "react-web-api/no-leaked-timeout", "react-hooks/rules-of-hooks", "react-hooks/exhaustive-deps", "react-hooks/config", @@ -946,14 +955,24 @@ "react-hooks/unsupported-syntax", "react-hooks/use-memo", "react-hooks/incompatible-library", - "react-hooks-extra/no-direct-set-state-in-use-effect", - "react-web-api/no-leaked-event-listener", - "react-web-api/no-leaked-interval", - "react-web-api/no-leaked-resize-observer", - "react-web-api/no-leaked-timeout", "react-refresh/only-export-components", ], }, + { + "files": [ + "**/*.?([cm])ts", + "**/*.?([cm])tsx", + ], + "name": "antfu/react/typescript", + "rules": [ + "- react-dom/no-string-style-prop", + "- react-dom/no-unknown-property", + "- react/jsx-no-duplicate-props", + "- react/jsx-no-undef", + "- react/jsx-uses-react", + "- react/jsx-uses-vars", + ], + }, { "files": [ "**/*.?([cm])ts", @@ -966,6 +985,7 @@ "name": "antfu/react/type-aware-rules", "rules": [ "react/no-leaked-conditional-rendering", + "react/no-implicit-key", ], }, {