From 6bf15095a1357fc1031b7b7b58219eceee73fff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Tue, 19 Aug 2025 12:22:59 +0200 Subject: [PATCH 1/6] feat: support React Strict Dom elements (html.div, etc) --- lib/rules/forbid-dom-props.js | 9 ++++++--- tests/lib/rules/forbid-dom-props.js | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/rules/forbid-dom-props.js b/lib/rules/forbid-dom-props.js index 4638a8700d..79ae87a14b 100644 --- a/lib/rules/forbid-dom-props.js +++ b/lib/rules/forbid-dom-props.js @@ -96,9 +96,12 @@ module.exports = { return { JSXAttribute(node) { - const tag = node.parent.name.name; - if (!(tag && typeof tag === 'string' && tag[0] !== tag[0].toUpperCase())) { - // This is a Component, not a DOM node, so exit. + const parentName = node.parent.name; + // Extract a component name when using a "namespace", e.g. ``. + const tag = parentName.name || `${parentName.object.name}.${parentName.property.name}`; + const componentName = parentName.name || parentName.property.name; + const isDomNode = componentName && typeof componentName[0] === 'string' && componentName[0] !== componentName[0].toUpperCase(); + if (!isDomNode) { return; } diff --git a/tests/lib/rules/forbid-dom-props.js b/tests/lib/rules/forbid-dom-props.js index a11d39fe00..f0ab017541 100644 --- a/tests/lib/rules/forbid-dom-props.js +++ b/tests/lib/rules/forbid-dom-props.js @@ -324,5 +324,22 @@ ruleTester.run('forbid-dom-props', rule, { }, ], }, + { + code: ` + const First = (props) => ( + + ); + `, + options: [{ forbid: ['id'] }], + errors: [ + { + messageId: 'propIsForbidden', + data: { prop: 'id' }, + line: 3, + column: 16, + type: 'JSXAttribute', + }, + ], + }, ]), }); From 99d1de82e3316d01336231414fa6a5981c722975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Tue, 19 Aug 2025 12:44:29 +0200 Subject: [PATCH 2/6] more tests --- tests/lib/rules/forbid-dom-props.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/lib/rules/forbid-dom-props.js b/tests/lib/rules/forbid-dom-props.js index f0ab017541..82daa8ae17 100644 --- a/tests/lib/rules/forbid-dom-props.js +++ b/tests/lib/rules/forbid-dom-props.js @@ -112,6 +112,17 @@ ruleTester.run('forbid-dom-props', rule, { }, ], }, + { + code: ` + const First = (props) => ( + + ); + const Second = (props) => ( + + ); + `, + options: [{ forbid: ['id'] }], + }, ]), invalid: parsers.all([ @@ -329,6 +340,9 @@ ruleTester.run('forbid-dom-props', rule, { const First = (props) => ( ); + const Second = (props) => ( + + ); `, options: [{ forbid: ['id'] }], errors: [ @@ -339,6 +353,13 @@ ruleTester.run('forbid-dom-props', rule, { column: 16, type: 'JSXAttribute', }, + { + messageId: 'propIsForbidden', + data: { prop: 'id' }, + line: 6, + column: 16, + type: 'JSXAttribute', + }, ], }, ]), From 597b1ef92211c9606b6e2f8fac279f4de9aa311c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Tue, 19 Aug 2025 12:49:09 +0200 Subject: [PATCH 3/6] . --- tests/lib/rules/forbid-dom-props.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/forbid-dom-props.js b/tests/lib/rules/forbid-dom-props.js index 82daa8ae17..3bfedb1a0b 100644 --- a/tests/lib/rules/forbid-dom-props.js +++ b/tests/lib/rules/forbid-dom-props.js @@ -350,14 +350,14 @@ ruleTester.run('forbid-dom-props', rule, { messageId: 'propIsForbidden', data: { prop: 'id' }, line: 3, - column: 16, + column: 21, type: 'JSXAttribute', }, { messageId: 'propIsForbidden', data: { prop: 'id' }, line: 6, - column: 16, + column: 18, type: 'JSXAttribute', }, ], From 31f901c940e36c9fb270626559ff332b6efbf51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Tue, 19 Aug 2025 12:49:58 +0200 Subject: [PATCH 4/6] . --- lib/rules/forbid-dom-props.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/forbid-dom-props.js b/lib/rules/forbid-dom-props.js index 79ae87a14b..dddcef068e 100644 --- a/lib/rules/forbid-dom-props.js +++ b/lib/rules/forbid-dom-props.js @@ -97,7 +97,7 @@ module.exports = { return { JSXAttribute(node) { const parentName = node.parent.name; - // Extract a component name when using a "namespace", e.g. ``. + // Extract a component name when using a "namespace", e.g. ``. const tag = parentName.name || `${parentName.object.name}.${parentName.property.name}`; const componentName = parentName.name || parentName.property.name; const isDomNode = componentName && typeof componentName[0] === 'string' && componentName[0] !== componentName[0].toUpperCase(); From 48b582ae7c020753362169384e1cff3bab7fd517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Tue, 19 Aug 2025 13:56:50 +0200 Subject: [PATCH 5/6] fix cases with `this.foo` --- tests/lib/rules/forbid-dom-props.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/lib/rules/forbid-dom-props.js b/tests/lib/rules/forbid-dom-props.js index 3bfedb1a0b..29cd7f0da8 100644 --- a/tests/lib/rules/forbid-dom-props.js +++ b/tests/lib/rules/forbid-dom-props.js @@ -54,7 +54,7 @@ ruleTester.run('forbid-dom-props', rule, { var First = createReactClass({ propTypes: externalPropTypes, render: function() { - return ; + return ; } }); `, @@ -64,16 +64,16 @@ ruleTester.run('forbid-dom-props', rule, { code: ` class First extends createReactClass { render() { - return ; + return ; } } `, - options: [{ forbid: ['id'] }], + options: [{ forbid: ['style'] }], }, { code: ` const First = (props) => ( - + ); `, options: [{ forbid: ['id'] }], From 004f652565be36f90a7b59f7d1a46bcd9930a462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Jastrze=CC=A8bski?= Date: Wed, 20 Aug 2025 08:40:29 +0200 Subject: [PATCH 6/6] rollback not required changes --- tests/lib/rules/forbid-dom-props.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/forbid-dom-props.js b/tests/lib/rules/forbid-dom-props.js index 29cd7f0da8..e3ab279b39 100644 --- a/tests/lib/rules/forbid-dom-props.js +++ b/tests/lib/rules/forbid-dom-props.js @@ -54,7 +54,7 @@ ruleTester.run('forbid-dom-props', rule, { var First = createReactClass({ propTypes: externalPropTypes, render: function() { - return ; + return ; } }); `, @@ -73,7 +73,7 @@ ruleTester.run('forbid-dom-props', rule, { { code: ` const First = (props) => ( - + ); `, options: [{ forbid: ['id'] }],