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);