diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b2b5bcf38..8497f49c61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange ### Fixed * [`no-danger`]: avoid a crash on a nested component name ([#3833][] @ljharb) * [Fix] types: correct generated type declaration ([#3840][] @ocavue) +* [`no-unknown-property`]: support `precedence` prop in react 19 ([#3829][] @acusti) ### Changed * [Tests] [`jsx-no-script-url`]: Improve tests ([#3849][] @radu2147) @@ -19,6 +20,7 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange [#3841]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3841 [#3840]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3840 [#3833]: https://github.com/jsx-eslint/eslint-plugin-react/issues/3833 +[#3829]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3829 ## [7.37.2] - 2024.10.22 diff --git a/lib/rules/no-unknown-property.js b/lib/rules/no-unknown-property.js index dc5018007a..9a21c96fad 100644 --- a/lib/rules/no-unknown-property.js +++ b/lib/rules/no-unknown-property.js @@ -363,16 +363,24 @@ const REACT_ON_PROPS = [ ]; function getDOMPropertyNames(context) { - const ALL_DOM_PROPERTY_NAMES = DOM_PROPERTY_NAMES_TWO_WORDS.concat(DOM_PROPERTY_NAMES_ONE_WORD); - // this was removed in React v16.1+, see https://github.com/facebook/react/pull/10823 - if (!testReactVersion(context, '>= 16.1.0')) { - return ALL_DOM_PROPERTY_NAMES.concat('allowTransparency'); - } - // these were added in React v16.4.0, see https://reactjs.org/blog/2018/05/23/react-v-16-4.html and https://github.com/facebook/react/pull/12507 - if (testReactVersion(context, '>= 16.4.0')) { - return ALL_DOM_PROPERTY_NAMES.concat(REACT_ON_PROPS); - } - return ALL_DOM_PROPERTY_NAMES; + return [].concat( + DOM_PROPERTY_NAMES_TWO_WORDS, + DOM_PROPERTY_NAMES_ONE_WORD, + + testReactVersion(context, '>= 16.1.0') ? [].concat( + testReactVersion(context, '>= 16.4.0') ? [].concat( + // these were added in React v16.4.0, see https://reactjs.org/blog/2018/05/23/react-v-16-4.html and https://github.com/facebook/react/pull/12507 + REACT_ON_PROPS, + testReactVersion(context, '>= 19') ? [ + // precedence was added in React v19, see https://react.dev/blog/2024/04/25/react-19#support-for-stylesheets + 'precedence', + ] : [] + ) : [] + ) : [ + // this was removed in React v16.1+, see https://github.com/facebook/react/pull/10823 + 'allowTransparency', + ] + ); } // ------------------------------------------------------------------------------ @@ -501,6 +509,7 @@ function getStandardName(name, context) { return SVGDOM_ATTRIBUTE_NAMES[/** @type {keyof SVGDOM_ATTRIBUTE_NAMES} */ (name)]; } const names = getDOMPropertyNames(context); + // Let's find a possible attribute match with a case-insensitive search. return names.find((element) => element.toLowerCase() === name.toLowerCase()); } diff --git a/tests/lib/rules/no-unknown-property.js b/tests/lib/rules/no-unknown-property.js index 32e6c6d6b3..97ae42ea57 100644 --- a/tests/lib/rules/no-unknown-property.js +++ b/tests/lib/rules/no-unknown-property.js @@ -89,6 +89,12 @@ ruleTester.run('no-unknown-property', rule, { { code: '
' }, { code: '' }, { code: '' }, + { + code: '', + settings: { + react: { version: '19.0.0' }, + }, + }, // Case ignored attributes, for `charset` discussion see https://github.com/jsx-eslint/eslint-plugin-react/pull/1863 { code: ';' }, { code: ';' },