Skip to content

Commit 58b78b0

Browse files
committed
Update babel-preset to support esmodules target
1 parent 793a4ff commit 58b78b0

File tree

1 file changed

+39
-19
lines changed

1 file changed

+39
-19
lines changed

packages/babel-preset-react-app/create.js

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ module.exports = function(api, opts, env) {
2727
var isEnvProduction = env === 'production';
2828
var isEnvTest = env === 'test';
2929
var isFlowEnabled = validateBoolOption('flow', opts.flow, true);
30+
var isModern = validateBoolOption('modern', opts.modern, false);
3031

3132
if (!isEnvDevelopment && !isEnvProduction && !isEnvTest) {
3233
throw new Error(
@@ -38,7 +39,30 @@ module.exports = function(api, opts, env) {
3839
);
3940
}
4041

41-
return {
42+
function getEnvOptions({ isModern }) {
43+
const defaultOpts = {
44+
// `entry` transforms `@babel/polyfill` into individual requires for
45+
// the targeted browsers. This is safer than `usage` which performs
46+
// static code analysis to determine what's required.
47+
// This is probably a fine default to help trim down bundles when
48+
// end-users inevitably import '@babel/polyfill'.
49+
useBuiltIns: 'entry',
50+
// Do not transform modules to CJS
51+
modules: false,
52+
};
53+
54+
if (isModern) {
55+
return Object.assign(defaultOpts, {
56+
targets: {
57+
esmodules: true,
58+
},
59+
});
60+
}
61+
62+
return defaultOpts;
63+
}
64+
65+
const babelPreset = {
4266
presets: [
4367
isEnvTest && [
4468
// ES features necessary for user's Node version
@@ -52,16 +76,7 @@ module.exports = function(api, opts, env) {
5276
(isEnvProduction || isEnvDevelopment) && [
5377
// Latest stable ECMAScript features
5478
require('@babel/preset-env').default,
55-
{
56-
// `entry` transforms `@babel/polyfill` into individual requires for
57-
// the targeted browsers. This is safer than `usage` which performs
58-
// static code analysis to determine what's required.
59-
// This is probably a fine default to help trim down bundles when
60-
// end-users inevitably import '@babel/polyfill'.
61-
useBuiltIns: 'entry',
62-
// Do not transform modules to CJS
63-
modules: false,
64-
},
79+
getEnvOptions({ isModern }),
6580
],
6681
[
6782
require('@babel/preset-react').default,
@@ -103,7 +118,7 @@ module.exports = function(api, opts, env) {
103118
},
104119
],
105120
// Polyfills the runtime needed for async/await and generators
106-
[
121+
!isModern && [
107122
require('@babel/plugin-transform-runtime').default,
108123
{
109124
helpers: false,
@@ -119,18 +134,23 @@ module.exports = function(api, opts, env) {
119134
},
120135
],
121136
// function* () { yield 42; yield 43; }
122-
!isEnvTest && [
123-
require('@babel/plugin-transform-regenerator').default,
124-
{
125-
// Async functions are converted to generators by @babel/preset-env
126-
async: false,
127-
},
128-
],
137+
!isEnvTest &&
138+
!isModern && [
139+
require('@babel/plugin-transform-regenerator').default,
140+
{
141+
// Async functions are converted to generators by @babel/preset-env
142+
async: false,
143+
},
144+
],
129145
// Adds syntax support for import()
130146
require('@babel/plugin-syntax-dynamic-import').default,
131147
isEnvTest &&
132148
// Transform dynamic import to require
133149
require('babel-plugin-transform-dynamic-import').default,
134150
].filter(Boolean),
135151
};
152+
153+
// console.log('PRESET', JSON.stringify(babelPreset)
154+
155+
return babelPreset;
136156
};

0 commit comments

Comments
 (0)