Skip to content

Commit 5e1a64c

Browse files
committed
[Fix] no-danger-with-children: prevent infinite loop
Fixes #1571
1 parent 70e8a02 commit 5e1a64c

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

lib/rules/no-danger-with-children.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ module.exports = {
2929
* @param {object} node - ObjectExpression node
3030
* @param {string} propName - name of the prop to look for
3131
*/
32-
function findObjectProp(node, propName) {
32+
function findObjectProp(node, propName, seenProps) {
3333
if (!node.properties) {
3434
return false;
3535
}
@@ -39,7 +39,11 @@ module.exports = {
3939
} else if (prop.type === 'ExperimentalSpreadProperty') {
4040
const variable = findSpreadVariable(prop.argument.name);
4141
if (variable && variable.defs.length && variable.defs[0].node.init) {
42-
return findObjectProp(variable.defs[0].node.init, propName);
42+
if (seenProps.indexOf(prop.argument.name) > -1) {
43+
return false;
44+
}
45+
const newSeenProps = seenProps.concat(prop.argument.name || []);
46+
return findObjectProp(variable.defs[0].node.init, propName, newSeenProps);
4347
}
4448
}
4549
return false;
@@ -57,7 +61,7 @@ module.exports = {
5761
if (attribute.type === 'JSXSpreadAttribute') {
5862
const variable = findSpreadVariable(attribute.argument.name);
5963
if (variable && variable.defs.length && variable.defs[0].node.init) {
60-
return findObjectProp(variable.defs[0].node.init, propName);
64+
return findObjectProp(variable.defs[0].node.init, propName, []);
6165
}
6266
}
6367
return attribute.name && attribute.name.name === propName;
@@ -113,10 +117,10 @@ module.exports = {
113117
}
114118
}
115119

116-
const dangerously = findObjectProp(props, 'dangerouslySetInnerHTML');
120+
const dangerously = findObjectProp(props, 'dangerouslySetInnerHTML', []);
117121

118122
if (node.arguments.length === 2) {
119-
if (findObjectProp(props, 'children')) {
123+
if (findObjectProp(props, 'children', [])) {
120124
hasChildren = true;
121125
}
122126
} else {

tests/lib/rules/no-danger-with-children.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ ruleTester.run('no-danger-with-children', rule, {
9191
},
9292
{
9393
code: 'React.createElement("Hello", undefined, "Children")'
94+
},
95+
{
96+
code: `
97+
const props = {...props, scratch: {mode: 'edit'}};
98+
const component = shallow(<TaskEditableTitle {...props} />);
99+
`
94100
}
95101
],
96102
invalid: [

0 commit comments

Comments
 (0)