From 543a929ba0ac11dc0fb42c23ce62c601c60a5a4f Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Wed, 1 Aug 2018 21:45:47 -0700 Subject: [PATCH 1/5] Enable Object Rest Spread by default This uses Babel's plugin: https://babeljs.io/docs/en/babel-plugin-transform-object-rest-spread Spec: https://tc39.github.io/ecma262/#sec-object-initializer-runtime-semantics-propertydefinitionevaluation Fixes #1221, #1422 --- src/assets/JSAsset.js | 2 +- .../object-rest-spread/object-rest-spread.js | 7 +++++++ test/javascript.js | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/integration/object-rest-spread/object-rest-spread.js diff --git a/src/assets/JSAsset.js b/src/assets/JSAsset.js index 3e089da0924..fda7e9a005d 100644 --- a/src/assets/JSAsset.js +++ b/src/assets/JSAsset.js @@ -70,7 +70,7 @@ class JSAsset extends Asset { strictMode: false, sourceType: 'module', locations: true, - plugins: ['exportExtensions', 'dynamicImport'] + plugins: ['exportExtensions', 'dynamicImport', 'objectRestSpread'] }; // Check if there is a babel config file. If so, determine which parser plugins to enable diff --git a/test/integration/object-rest-spread/object-rest-spread.js b/test/integration/object-rest-spread/object-rest-spread.js new file mode 100644 index 00000000000..5a47ee9be8f --- /dev/null +++ b/test/integration/object-rest-spread/object-rest-spread.js @@ -0,0 +1,7 @@ +var x = {a: 'a', b: 'b'}; +var {a: y, ...ys} = x; +var z = {y, ...ys}; + +export default function () { + return {x, y, z, ys}; +} diff --git a/test/javascript.js b/test/javascript.js index 5a05db1b17b..e0c3096d68d 100644 --- a/test/javascript.js +++ b/test/javascript.js @@ -28,6 +28,21 @@ describe('javascript', function() { assert.equal(output.default(), 3); }); + it('should produce a basic JS bundle with object rest spread support', async function() { + let b = await bundle(__dirname + '/integration/es6/object-rest-spread.js'); + + assert.equal(b.assets.size, 1); + + let output = await run(b); + assert.equal(typeof output, 'object'); + assert.equal(typeof output.default, 'function'); + + let res = output.default(); + assert.equal(res.y, 'a'); + assert.deepEqual(res.z, {y: 'a', b: 'b'}); + assert.deepEqual(res.ys, {b: 'b'}); + }); + it('should bundle node_modules on --target=browser', async function() { let b = await bundle(__dirname + '/integration/node_require/main.js', { target: 'browser' From 532528448d42f82bce160d216d77ca7d8e32fe98 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 2 Aug 2018 10:22:16 -0700 Subject: [PATCH 2/5] Add babel-plugin-transform-object-rest-spread to package.json --- package.json | 1 + yarn.lock | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/package.json b/package.json index fe02cf5cd76..bbda5fc5be3 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "babel-core": "^6.25.0", "babel-generator": "^6.25.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-react-jsx": "^6.24.1", "babel-preset-env": "^1.7.0", "babel-template": "^6.26.0", diff --git a/yarn.lock b/yarn.lock index 21ec9283731..fa1b85b3f9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -543,6 +543,10 @@ babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" @@ -737,6 +741,13 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" +babel-plugin-transform-object-rest-spread@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.26.0" + babel-plugin-transform-react-jsx@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" From 59194acd1b083bd1a8a2355053f897265ec6ee70 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Fri, 10 Aug 2018 10:19:54 -0700 Subject: [PATCH 3/5] Fix test --- test/javascript.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/javascript.js b/test/javascript.js index e0c3096d68d..0a9840624e9 100644 --- a/test/javascript.js +++ b/test/javascript.js @@ -29,7 +29,7 @@ describe('javascript', function() { }); it('should produce a basic JS bundle with object rest spread support', async function() { - let b = await bundle(__dirname + '/integration/es6/object-rest-spread.js'); + let b = await bundle(__dirname + '/integration/object-rest-spread/object-rest-spread.js'); assert.equal(b.assets.size, 1); From 3ecb57c89378a663d7fcfb95b0a105f891ae5238 Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Fri, 10 Aug 2018 15:34:47 -0700 Subject: [PATCH 4/5] Make sure we add the transformer too --- src/transforms/babel.js | 8 ++++++++ test/javascript.js | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/transforms/babel.js b/src/transforms/babel.js index 841d6a65ba9..4b14dfe6f27 100644 --- a/src/transforms/babel.js +++ b/src/transforms/babel.js @@ -265,6 +265,14 @@ async function getEnvPlugins(targets, useBuiltIns = false) { {}, {targets, modules: false, useBuiltIns: useBuiltIns ? 'entry' : false} ).plugins; + + // babel-preset-env version 6.x does not cover object-rest-spread so always + // add it. + plugins.push([ + require('babel-plugin-transform-object-rest-spread'), + {useBuiltIns} + ]); + envCache.set(key, plugins); return plugins; } diff --git a/test/javascript.js b/test/javascript.js index 0a9840624e9..e2a28891da5 100644 --- a/test/javascript.js +++ b/test/javascript.js @@ -29,7 +29,9 @@ describe('javascript', function() { }); it('should produce a basic JS bundle with object rest spread support', async function() { - let b = await bundle(__dirname + '/integration/object-rest-spread/object-rest-spread.js'); + let b = await bundle( + __dirname + '/integration/object-rest-spread/object-rest-spread.js' + ); assert.equal(b.assets.size, 1); From 6a1fc494ab2e262fbf821c6c4219c65eb2ccfdeb Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Fri, 10 Aug 2018 17:13:00 -0700 Subject: [PATCH 5/5] Update JSAsset.js --- src/assets/JSAsset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/JSAsset.js b/src/assets/JSAsset.js index fda7e9a005d..3e089da0924 100644 --- a/src/assets/JSAsset.js +++ b/src/assets/JSAsset.js @@ -70,7 +70,7 @@ class JSAsset extends Asset { strictMode: false, sourceType: 'module', locations: true, - plugins: ['exportExtensions', 'dynamicImport', 'objectRestSpread'] + plugins: ['exportExtensions', 'dynamicImport'] }; // Check if there is a babel config file. If so, determine which parser plugins to enable