diff --git a/CHANGELOG.md b/CHANGELOG.md
index bef2238f72..3b9d9ed001 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,8 +8,10 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
### Fixed
* [`prop-types`]: null-check rootNode before calling getScope ([#3762][] @crnhrv)
* [`boolean-prop-naming`]: avoid a crash with a spread prop ([#3733][] @ljharb)
+* [`jsx-boolean-value`]: `assumeUndefinedIsFalse` with `never` must not allow explicit `true` value ([#3757][] @6uliver)
[#3762]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3762
+[#3757]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3757
[#3733]: https://github.com/jsx-eslint/eslint-plugin-react/issues/3733
## [7.34.2] - 2024.05.24
diff --git a/lib/rules/jsx-boolean-value.js b/lib/rules/jsx-boolean-value.js
index 1cff171147..4572e7ff8d 100644
--- a/lib/rules/jsx-boolean-value.js
+++ b/lib/rules/jsx-boolean-value.js
@@ -132,7 +132,6 @@ module.exports = {
}
if (
isNever(configuration, exceptions, propName)
- && !configObject.assumeUndefinedIsFalse
&& value
&& value.type === 'JSXExpressionContainer'
&& value.expression.value === true
diff --git a/tests/lib/rules/jsx-boolean-value.js b/tests/lib/rules/jsx-boolean-value.js
index e8cbbb3e7f..f4216f2ce1 100644
--- a/tests/lib/rules/jsx-boolean-value.js
+++ b/tests/lib/rules/jsx-boolean-value.js
@@ -52,6 +52,10 @@ ruleTester.run('jsx-boolean-value', rule, {
code: ';',
options: ['never', { assumeUndefinedIsFalse: true }],
},
+ {
+ code: ';',
+ options: ['never', { assumeUndefinedIsFalse: false }],
+ },
{
code: ';',
options: ['never', { assumeUndefinedIsFalse: true, always: ['foo'] }],
@@ -145,6 +149,21 @@ ruleTester.run('jsx-boolean-value', rule, {
},
],
},
+ {
+ code: ';',
+ output: ';',
+ options: ['never', { assumeUndefinedIsFalse: true }],
+ errors: [
+ {
+ messageId: 'omitBoolean',
+ data: { propName: 'foo' },
+ },
+ {
+ messageId: 'omitPropAndBoolean',
+ data: { propName: 'bak' },
+ },
+ ],
+ },
{
code: ';',
output: ';',