From 717e177a1dd05c9fc7eb5ecb4647c8ed0071928f Mon Sep 17 00:00:00 2001 From: Alan Pierce Date: Sun, 25 Sep 2016 08:53:52 -0700 Subject: [PATCH] Fix crash due to skipped children in create-element-to-jsx In #79, I made it so the transformation is skipped in some cases, in particular when the capitalization is invalid. This broke an assumption elsewhere in the code that `convertNodeToJSX` always returns a `JSXElement`, so there was a crash if a skipped element was used as a child. To fix, we can just wrap in a `JSXExpressionContainer` for that case. --- .../create-element-to-jsx-ignore-bad-capitalization.input.js | 1 + .../create-element-to-jsx-ignore-bad-capitalization.output.js | 1 + transforms/create-element-to-jsx.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.input.js b/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.input.js index abacdf9d..1e1a8a83 100644 --- a/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.input.js +++ b/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.input.js @@ -7,3 +7,4 @@ React.createElement('foo'); React.createElement(_foo); React.createElement('_foo'); React.createElement(foo.bar); +React.createElement(Foo, null, React.createElement(foo)); diff --git a/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.output.js b/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.output.js index 7940241b..9f73cfc4 100644 --- a/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.output.js +++ b/transforms/__testfixtures__/create-element-to-jsx-ignore-bad-capitalization.output.js @@ -7,3 +7,4 @@ React.createElement('Foo'); <_foo />; React.createElement('_foo'); ; +{React.createElement(foo)}; diff --git a/transforms/create-element-to-jsx.js b/transforms/create-element-to-jsx.js index b22d503a..0d21a8ca 100644 --- a/transforms/create-element-to-jsx.js +++ b/transforms/create-element-to-jsx.js @@ -170,7 +170,7 @@ module.exports = function(file, api, options) { child.callee.object.name === 'React' && child.callee.property.name === 'createElement') { const jsxChild = convertNodeToJSX(node.get('arguments', index + 2)); - if ((jsxChild.comments || []).length > 0) { + if (jsxChild.type !== 'JSXElement' || (jsxChild.comments || []).length > 0) { return j.jsxExpressionContainer(jsxChild); } else { return jsxChild;