diff --git a/vendor/fbtransform/transforms/__tests__/react-test.js b/vendor/fbtransform/transforms/__tests__/react-test.js
index 82f7856904..772acc9706 100644
--- a/vendor/fbtransform/transforms/__tests__/react-test.js
+++ b/vendor/fbtransform/transforms/__tests__/react-test.js
@@ -379,12 +379,25 @@ describe('react jsx', function() {
'';
var result =
- 'React.createElement(Component, Object.assign({}, x , {y: \n' +
+ 'React.createElement(Component, Object.assign({}, x , {y: \n' +
'2, z: true}))';
expect(transform(code).code).toBe(result);
});
+ it('adds appropriate newlines when using spread attribute', function() {
+ var code =
+ '';
+ var result =
+ 'React.createElement(Component, Object.assign({}, \n' +
+ ' this.props, \n' +
+ ' {sound: "moo"}))';
+
+ expect(transform(code).code).toBe(result);
+ });
+
it('should transform known hyphenated tags', function() {
var code = [
'/**',
diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js
index a99e552ce1..11ed7a8f28 100644
--- a/vendor/fbtransform/transforms/react.js
+++ b/vendor/fbtransform/transforms/react.js
@@ -142,16 +142,17 @@ function visitReactTag(traverse, object, path, state) {
var isLast = index === attributesObject.length - 1;
if (attr.type === Syntax.XJSSpreadAttribute) {
- // Plus 1 to skip `{`.
- utils.move(attr.range[0] + 1, state);
-
// Close the previous object or initial object
if (!previousWasSpread) {
utils.append('}, ', state);
}
+
// Move to the expression start, ignoring everything except parenthesis
// and whitespace.
+ utils.catchup(attr.range[0], state, stripNonWhiteParen);
+ // Plus 1 to skip `{`.
+ utils.move(attr.range[0] + 1, state);
utils.catchup(attr.argument.range[0], state, stripNonWhiteParen);
traverse(attr.argument, path, state);