diff --git a/packages/babel-helper-builder-react-jsx/src/index.js b/packages/babel-helper-builder-react-jsx/src/index.js index 7d1301deb0fe..2438070df0d7 100644 --- a/packages/babel-helper-builder-react-jsx/src/index.js +++ b/packages/babel-helper-builder-react-jsx/src/index.js @@ -118,7 +118,7 @@ export default function (opts) { /** * The logic for this is quite terse. It's because we need to * support spread elements. We loop over all attributes, - * breaking on spreads, we then push a new object containg + * breaking on spreads, we then push a new object containing * all prior attributes to an array for later processing. */ @@ -126,6 +126,11 @@ export default function (opts) { let _props = []; let objs = []; + let useBuiltIns = file.opts.useBuiltIns || false; + if (typeof useBuiltIns !== "boolean") { + throw new Error("transform-react-jsx currently only accepts a boolean option for useBuiltIns (defaults to false)"); + } + function pushProps() { if (!_props.length) return; @@ -154,11 +159,12 @@ export default function (opts) { objs.unshift(t.objectExpression([])); } + const helper = useBuiltIns ? + t.memberExpression(t.identifier("Object"), t.identifier("assign")) : + file.addHelper("extends"); + // spread it - attribs = t.callExpression( - file.addHelper("extends"), - objs - ); + attribs = t.callExpression(helper, objs); } return attribs; diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment-invalid-option/actual.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment-invalid-option/actual.js new file mode 100644 index 000000000000..4caacb6aa17d --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment-invalid-option/actual.js @@ -0,0 +1 @@ +var div = diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment-invalid-option/options.json b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment-invalid-option/options.json new file mode 100644 index 000000000000..3baf37938e7d --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment-invalid-option/options.json @@ -0,0 +1,4 @@ +{ + "plugins": [["transform-react-jsx", { "useBuiltIns": "invalidOption" }]], + "throws": "transform-react-jsx currently only accepts a boolean option for useBuiltIns (defaults to false)" +} diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment/actual.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment/actual.js new file mode 100644 index 000000000000..4caacb6aa17d --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment/actual.js @@ -0,0 +1 @@ +var div = diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment/expected.js b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment/expected.js new file mode 100644 index 000000000000..ecbc7d94b162 --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/assignment/expected.js @@ -0,0 +1 @@ +var div = React.createElement(Component, Object.assign({}, props, { foo: "bar" })); diff --git a/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/options.json b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/options.json new file mode 100644 index 000000000000..2404117dccce --- /dev/null +++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["transform-react-jsx", { "useBuiltIns": true }]] +}