diff --git a/packages/babel-preset-react-app/create.js b/packages/babel-preset-react-app/create.js index 5eb16619c6a..88f4759c506 100644 --- a/packages/babel-preset-react-app/create.js +++ b/packages/babel-preset-react-app/create.js @@ -27,6 +27,7 @@ module.exports = function(api, opts, env) { var isEnvProduction = env === 'production'; var isEnvTest = env === 'test'; var isFlowEnabled = validateBoolOption('flow', opts.flow, true); + var areHelpersEnabled = validateBoolOption('helpers', opts.helpers, true); if (!isEnvDevelopment && !isEnvProduction && !isEnvTest) { throw new Error( @@ -113,7 +114,7 @@ module.exports = function(api, opts, env) { require('@babel/plugin-transform-runtime').default, { corejs: false, - helpers: false, + helpers: areHelpersEnabled, regenerator: true, // https://babeljs.io/docs/en/babel-plugin-transform-runtime#useesmodules // We should turn this on once the lowest version of Node LTS diff --git a/packages/babel-preset-react-app/dependencies.js b/packages/babel-preset-react-app/dependencies.js index ca04e8616fc..6c8e431f985 100644 --- a/packages/babel-preset-react-app/dependencies.js +++ b/packages/babel-preset-react-app/dependencies.js @@ -6,6 +6,18 @@ */ 'use strict'; +const validateBoolOption = (name, value, defaultValue) => { + if (typeof value === 'undefined') { + value = defaultValue; + } + + if (typeof value !== 'boolean') { + throw new Error(`Preset react-app: '${name}' option must be a boolean.`); + } + + return value; +}; + module.exports = function(api, opts) { if (!opts) { opts = {}; @@ -21,6 +33,7 @@ module.exports = function(api, opts) { var isEnvDevelopment = env === 'development'; var isEnvProduction = env === 'production'; var isEnvTest = env === 'test'; + var areHelpersEnabled = validateBoolOption('helpers', opts.helpers, false); if (!isEnvDevelopment && !isEnvProduction && !isEnvTest) { throw new Error( 'Using `babel-preset-react-app` requires that you specify `NODE_ENV` or ' + @@ -76,7 +89,7 @@ module.exports = function(api, opts) { require('@babel/plugin-transform-runtime').default, { corejs: false, - helpers: false, + helpers: areHelpersEnabled, regenerator: true, // https://babeljs.io/docs/en/babel-plugin-transform-runtime#useesmodules // We should turn this on once the lowest version of Node LTS diff --git a/packages/babel-preset-react-app/dev.js b/packages/babel-preset-react-app/dev.js index 8eb986bd59c..ce87adea4fa 100644 --- a/packages/babel-preset-react-app/dev.js +++ b/packages/babel-preset-react-app/dev.js @@ -9,5 +9,5 @@ const create = require('./create'); module.exports = function(api, opts) { - return create(api, opts, 'development'); + return create(api, Object.assign({ helpers: false }, opts), 'development'); }; diff --git a/packages/babel-preset-react-app/prod.js b/packages/babel-preset-react-app/prod.js index 9e3697f3eea..0873aee7258 100644 --- a/packages/babel-preset-react-app/prod.js +++ b/packages/babel-preset-react-app/prod.js @@ -9,5 +9,5 @@ const create = require('./create'); module.exports = function(api, opts) { - return create(api, opts, 'production'); + return create(api, Object.assign({ helpers: false }, opts), 'production'); }; diff --git a/packages/babel-preset-react-app/test.js b/packages/babel-preset-react-app/test.js index 15558ff2c4b..be189fc3265 100644 --- a/packages/babel-preset-react-app/test.js +++ b/packages/babel-preset-react-app/test.js @@ -9,5 +9,5 @@ const create = require('./create'); module.exports = function(api, opts) { - return create(api, opts, 'test'); + return create(api, Object.assign({ helpers: false }, opts), 'test'); }; diff --git a/packages/react-error-overlay/webpack.config.iframe.js b/packages/react-error-overlay/webpack.config.iframe.js index 67157bad440..6a39584ffdf 100644 --- a/packages/react-error-overlay/webpack.config.iframe.js +++ b/packages/react-error-overlay/webpack.config.iframe.js @@ -32,12 +32,15 @@ module.exports = { // Dependencies { test: /\.js$/, + exclude: /@babel\/runtime/, use: { loader: 'babel-loader', options: { babelrc: false, compact: false, - presets: ['babel-preset-react-app/dependencies'], + presets: [ + ['babel-preset-react-app/dependencies', { helpers: true }], + ], }, }, }, diff --git a/packages/react-scripts/config/webpack.config.dev.js b/packages/react-scripts/config/webpack.config.dev.js index 24f51c018b7..09e282caa4a 100644 --- a/packages/react-scripts/config/webpack.config.dev.js +++ b/packages/react-scripts/config/webpack.config.dev.js @@ -275,6 +275,7 @@ module.exports = { // Unlike the application JS, we only compile the standard ES features. { test: /\.js$/, + exclude: /@babel\/runtime/, use: [ // This loader parallelizes code compilation, it is optional but // improves compile time on larger projects @@ -290,7 +291,10 @@ module.exports = { babelrc: false, compact: false, presets: [ - require.resolve('babel-preset-react-app/dependencies'), + [ + require.resolve('babel-preset-react-app/dependencies'), + { helpers: true }, + ], ], cacheDirectory: true, // Don't waste time on Gzipping the cache diff --git a/packages/react-scripts/config/webpack.config.prod.js b/packages/react-scripts/config/webpack.config.prod.js index 76e767faddf..ec94170fd6e 100644 --- a/packages/react-scripts/config/webpack.config.prod.js +++ b/packages/react-scripts/config/webpack.config.prod.js @@ -314,6 +314,7 @@ module.exports = { // Unlike the application JS, we only compile the standard ES features. { test: /\.js$/, + exclude: /@babel\/runtime/, use: [ // This loader parallelizes code compilation, it is optional but // improves compile time on larger projects @@ -324,7 +325,10 @@ module.exports = { babelrc: false, compact: false, presets: [ - require.resolve('babel-preset-react-app/dependencies'), + [ + require.resolve('babel-preset-react-app/dependencies'), + { helpers: true }, + ], ], cacheDirectory: true, // Save disk space when time isn't as important diff --git a/tasks/e2e-kitchensink.sh b/tasks/e2e-kitchensink.sh index a4cb3438f26..345d0358b54 100755 --- a/tasks/e2e-kitchensink.sh +++ b/tasks/e2e-kitchensink.sh @@ -146,8 +146,8 @@ PORT=3001 \ nohup yarn start &>$tmp_server_log & grep -q 'You can now view' <(tail -f $tmp_server_log) -# Before running Mocha, specify that it should use our preset -# TODO: this is very hacky and we should find some other solution +# We haven't ejected yet which means there's no `babel` key +# in package.json yet echo '{"presets":["react-app"]}' > .babelrc # Test "development" environment