diff --git a/packages/babel-helper-builder-react-jsx/src/index.js b/packages/babel-helper-builder-react-jsx/src/index.js
index 7d1301deb0fe9..2438070df0d74 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 0000000000000..4caacb6aa17d4
--- /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 0000000000000..3baf37938e7d5
--- /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 0000000000000..4caacb6aa17d4
--- /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 0000000000000..ecbc7d94b1625
--- /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 0000000000000..2404117dccceb
--- /dev/null
+++ b/packages/babel-plugin-transform-react-jsx/test/fixtures/useBuiltIns/options.json
@@ -0,0 +1,3 @@
+{
+ "plugins": [["transform-react-jsx", { "useBuiltIns": true }]]
+}