diff --git a/crates/oxc_linter/src/rules/react/button_has_type.rs b/crates/oxc_linter/src/rules/react/button_has_type.rs index a48e27e7456dc..53610f337599e 100644 --- a/crates/oxc_linter/src/rules/react/button_has_type.rs +++ b/crates/oxc_linter/src/rules/react/button_has_type.rs @@ -293,6 +293,9 @@ fn test() { "#, None, ), + // Issue #20938: document.createElement('button') / document["createElement"]("button") should not raise an error because it object callee is from document + (r#"document.createElement("button");"#, None), + (r#"document["createElement"]("button");"#, None), ]; let fail = vec![ diff --git a/crates/oxc_linter/src/utils/react.rs b/crates/oxc_linter/src/utils/react.rs index f34503874b5f8..fe67db907b7d6 100644 --- a/crates/oxc_linter/src/utils/react.rs +++ b/crates/oxc_linter/src/utils/react.rs @@ -21,9 +21,25 @@ use crate::{LintContext, OxlintSettings}; pub fn is_create_element_call(call_expr: &CallExpression) -> bool { match &call_expr.callee { Expression::StaticMemberExpression(member_expr) => { + if member_expr + .object + .get_identifier_reference() + .is_some_and(|object_caller| object_caller.name == "document") + { + return false; + } + member_expr.property.name == "createElement" } Expression::ComputedMemberExpression(member_expr) => { + if member_expr + .object + .get_identifier_reference() + .is_some_and(|object_caller| object_caller.name == "document") + { + return false; + } + member_expr.static_property_name().is_some_and(|name| name == "createElement") } Expression::Identifier(ident) => ident.name == "createElement",