diff --git a/packages/babel-preset-env/src/index.js b/packages/babel-preset-env/src/index.js index bed18c728b..338a25a6ab 100644 --- a/packages/babel-preset-env/src/index.js +++ b/packages/babel-preset-env/src/index.js @@ -155,6 +155,10 @@ const filterItems = ( return result; }; +function supportsStaticESM(caller) { + return !!(caller && caller.supportsStaticESM); +} + export default declare((api, opts) => { api.assertVersion(7); @@ -232,9 +236,15 @@ export default declare((api, opts) => { const plugins = []; const pluginUseBuiltIns = useBuiltIns !== false; - // NOTE: not giving spec here yet to avoid compatibility issues when - // transform-modules-commonjs gets its spec mode - if (modules !== false && moduleTransformations[modules]) { + if ( + modules !== false && + moduleTransformations[modules] && + // TODO: Remove the 'api.caller' check eventually. Just here to prevent + // unnecessary breakage in the short term for users on older betas/RCs. + (modules !== "auto" || !api.caller || !api.caller(supportsStaticESM)) + ) { + // NOTE: not giving spec here yet to avoid compatibility issues when + // transform-modules-commonjs gets its spec mode plugins.push([getPlugin(moduleTransformations[modules]), { loose }]); } diff --git a/packages/babel-preset-env/src/module-transformations.js b/packages/babel-preset-env/src/module-transformations.js index ad50bdc263..a98f8dd044 100644 --- a/packages/babel-preset-env/src/module-transformations.js +++ b/packages/babel-preset-env/src/module-transformations.js @@ -1,4 +1,5 @@ export default { + auto: "transform-modules-commonjs", amd: "transform-modules-amd", commonjs: "transform-modules-commonjs", cjs: "transform-modules-commonjs", diff --git a/packages/babel-preset-env/src/normalize-options.js b/packages/babel-preset-env/src/normalize-options.js index 838625ecc2..6d1e58ffce 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -128,13 +128,16 @@ export const validateIgnoreBrowserslistConfig = ( ); export const validateModulesOption = ( - modulesOpt: ModuleOption = ModulesOption.commonjs, + modulesOpt: ModuleOption = ModulesOption.auto, ) => { invariant( ModulesOption[modulesOpt] || ModulesOption[modulesOpt] === ModulesOption.false, - `Invalid Option: The 'modules' option must be either 'false' to indicate no modules, or a - module type which can be be one of: 'commonjs' (default), 'amd', 'umd', 'systemjs'.`, + `Invalid Option: The 'modules' option must be one of \n` + + ` - 'false' to indicate no module processing\n` + + ` - a specific module type: 'commonjs', 'amd', 'umd', 'systemjs'` + + ` - 'auto' (default) which will automatically select 'false' if the current\n` + + ` process is known to support ES module syntax, or "commonjs" otherwise\n`, ); return modulesOpt; diff --git a/packages/babel-preset-env/src/options.js b/packages/babel-preset-env/src/options.js index b201bac971..e1f08ccd9b 100644 --- a/packages/babel-preset-env/src/options.js +++ b/packages/babel-preset-env/src/options.js @@ -15,6 +15,7 @@ export const TopLevelOptions = { export const ModulesOption = { false: false, + auto: "auto", amd: "amd", commonjs: "commonjs", cjs: "cjs", diff --git a/packages/babel-preset-env/test/debug-fixtures/android/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/android/stdout.txt index 32f42d1280..1d18dada55 100644 --- a/packages/babel-preset-env/test/debug-fixtures/android/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/android/stdout.txt @@ -5,7 +5,7 @@ Using targets: "android": "4" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "android":"4" } @@ -147,4 +147,4 @@ Using polyfills with `entry` option: web.timers { "android":"4" } web.immediate { "android":"4" } web.dom.iterable { "android":"4" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/builtins-no-import/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/builtins-no-import/stdout.txt index a45e0cafb7..57be73e15b 100644 --- a/packages/babel-preset-env/test/debug-fixtures/builtins-no-import/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/builtins-no-import/stdout.txt @@ -5,7 +5,7 @@ Using targets: "node": "6" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-function-name { "node":"6" } @@ -21,4 +21,4 @@ Using plugins: Using polyfills with `entry` option: [/src/in.js] `import '@babel/polyfill'` was not found. -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/builtins/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/builtins/stdout.txt index d348725928..580b0a9b53 100644 --- a/packages/babel-preset-env/test/debug-fixtures/builtins/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/builtins/stdout.txt @@ -7,7 +7,7 @@ Using targets: "node": "6" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "ie":"10" } @@ -163,4 +163,4 @@ Using polyfills with `entry` option: web.timers { "chrome":"54", "ie":"10", "node":"6" } web.immediate { "chrome":"54", "ie":"10", "node":"6" } web.dom.iterable { "chrome":"54", "ie":"10", "node":"6" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/electron/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/electron/stdout.txt index 888b2f76e6..2259bf76bc 100644 --- a/packages/babel-preset-env/test/debug-fixtures/electron/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/electron/stdout.txt @@ -12,7 +12,7 @@ Using targets: "electron": "0.36" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-function-name { "electron":"0.36" } @@ -123,4 +123,4 @@ Using polyfills with `entry` option: web.timers { "electron":"0.36" } web.immediate { "electron":"0.36" } web.dom.iterable { "electron":"0.36" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/plugins-only/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/plugins-only/stdout.txt index fe38b35270..79448e6036 100644 --- a/packages/babel-preset-env/test/debug-fixtures/plugins-only/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/plugins-only/stdout.txt @@ -13,7 +13,7 @@ Using targets: "node": "7.4" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-literals { "firefox":"52" } @@ -26,4 +26,4 @@ Using plugins: proposal-unicode-property-regex { "firefox":"52", "node":"7.4" } Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set. -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/stdout.txt index 99e76ef7e1..673f11cefe 100644 --- a/packages/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/shippedProposals-chrome60/stdout.txt @@ -5,7 +5,7 @@ Using targets: "chrome": "60" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-dotall-regex { "chrome":"60" } @@ -27,4 +27,4 @@ Using polyfills with `entry` option: web.timers { "chrome":"60" } web.immediate { "chrome":"60" } web.dom.iterable { "chrome":"60" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/shippedProposals/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/shippedProposals/stdout.txt index ea90165dbb..eeb2dbe2ea 100644 --- a/packages/babel-preset-env/test/debug-fixtures/shippedProposals/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/shippedProposals/stdout.txt @@ -3,7 +3,7 @@ Using targets: {} -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals {} @@ -181,4 +181,4 @@ Using polyfills with `entry` option: web.timers {} web.immediate {} web.dom.iterable {} -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/specific-targets/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/specific-targets/stdout.txt index da1dc462cd..4a68987092 100644 --- a/packages/babel-preset-env/test/debug-fixtures/specific-targets/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/specific-targets/stdout.txt @@ -10,7 +10,7 @@ Using targets: "safari": "7" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "ie":"10", "safari":"7" } @@ -167,4 +167,4 @@ Using polyfills with `entry` option: web.timers { "chrome":"54", "edge":"13", "firefox":"49", "ie":"10", "ios":"9", "safari":"7" } web.immediate { "chrome":"54", "edge":"13", "firefox":"49", "ie":"10", "ios":"9", "safari":"7" } web.dom.iterable { "chrome":"54", "edge":"13", "firefox":"49", "ie":"10", "ios":"9", "safari":"7" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/usage-none/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/usage-none/stdout.txt index 7f52fcadcb..3303a2c986 100644 --- a/packages/babel-preset-env/test/debug-fixtures/usage-none/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/usage-none/stdout.txt @@ -7,7 +7,7 @@ Using targets: "ie": "11" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "ie":"11" } @@ -41,4 +41,4 @@ Using polyfills with `usage` option: [/src/in.js] Based on your code and targets, none were added. [/src/in2.js] Based on your code and targets, none were added. -Successfully compiled 2 files with Babel. \ No newline at end of file +Successfully compiled 2 files with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/usage-with-import/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/usage-with-import/stdout.txt index f081a8e44a..a7fc655f05 100644 --- a/packages/babel-preset-env/test/debug-fixtures/usage-with-import/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/usage-with-import/stdout.txt @@ -5,7 +5,7 @@ Using targets: "chrome": "55" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-dotall-regex { "chrome":"55" } @@ -16,4 +16,4 @@ Using plugins: Using polyfills with `usage` option: [/src/in.js] Based on your code and targets, none were added. -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/usage/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/usage/stdout.txt index cfda6d7e23..e4c25e2257 100644 --- a/packages/babel-preset-env/test/debug-fixtures/usage/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/usage/stdout.txt @@ -7,7 +7,7 @@ Using targets: "ie": "11" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "ie":"11" } @@ -47,4 +47,4 @@ Using polyfills with `usage` option: [/src/in2.js] Added following polyfills: regenerator-runtime { "chrome":"52", "firefox":"50", "ie":"11" } web.dom.iterable { "chrome":"52", "firefox":"50", "ie":"11" } -Successfully compiled 2 files with Babel. \ No newline at end of file +Successfully compiled 2 files with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/versions-decimals/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/versions-decimals/stdout.txt index 73d1851f32..5a8cf6876c 100644 --- a/packages/babel-preset-env/test/debug-fixtures/versions-decimals/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/versions-decimals/stdout.txt @@ -16,7 +16,7 @@ Using targets: "node": "6.1" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "ie":"10" } @@ -193,4 +193,4 @@ Using polyfills with `entry` option: web.timers { "chrome":"54", "electron":"0.36", "ie":"10", "node":"6.1" } web.immediate { "chrome":"54", "electron":"0.36", "ie":"10", "node":"6.1" } web.dom.iterable { "chrome":"54", "electron":"0.36", "ie":"10", "node":"6.1" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/debug-fixtures/versions-strings/stdout.txt b/packages/babel-preset-env/test/debug-fixtures/versions-strings/stdout.txt index dba1eb2172..73ef76a11f 100644 --- a/packages/babel-preset-env/test/debug-fixtures/versions-strings/stdout.txt +++ b/packages/babel-preset-env/test/debug-fixtures/versions-strings/stdout.txt @@ -7,7 +7,7 @@ Using targets: "node": "6.10" } -Using modules transform: commonjs +Using modules transform: auto Using plugins: transform-template-literals { "ie":"10" } @@ -163,4 +163,4 @@ Using polyfills with `entry` option: web.timers { "chrome":"54", "ie":"10", "node":"6.10" } web.immediate { "chrome":"54", "ie":"10", "node":"6.10" } web.dom.iterable { "chrome":"54", "ie":"10", "node":"6.10" } -Successfully compiled 1 file with Babel. \ No newline at end of file +Successfully compiled 1 file with Babel. diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-cjs/input.mjs b/packages/babel-preset-env/test/fixtures/modules/auto-cjs/input.mjs new file mode 100644 index 0000000000..e5a2b28c2f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-cjs/input.mjs @@ -0,0 +1,2 @@ +import mod from "mod"; +console.log(mod); diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-cjs/options.json b/packages/babel-preset-env/test/fixtures/modules/auto-cjs/options.json new file mode 100644 index 0000000000..e35c724b5a --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-cjs/options.json @@ -0,0 +1,9 @@ +{ + "caller": { + "name": "test-fixture", + "supportsStaticESM": false + }, + "presets": [ + "env" + ] +} diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-cjs/output.js b/packages/babel-preset-env/test/fixtures/modules/auto-cjs/output.js new file mode 100644 index 0000000000..d79cb698b5 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-cjs/output.js @@ -0,0 +1,7 @@ +"use strict"; + +var _mod = _interopRequireDefault(require("mod")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +console.log(_mod.default); diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-esm/input.mjs b/packages/babel-preset-env/test/fixtures/modules/auto-esm/input.mjs new file mode 100644 index 0000000000..e5a2b28c2f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-esm/input.mjs @@ -0,0 +1,2 @@ +import mod from "mod"; +console.log(mod); diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-esm/options.json b/packages/babel-preset-env/test/fixtures/modules/auto-esm/options.json new file mode 100644 index 0000000000..a4e6bf5cde --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-esm/options.json @@ -0,0 +1,9 @@ +{ + "caller": { + "name": "test-fixture", + "supportsStaticESM": true + }, + "presets": [ + "env" + ] +} diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-esm/output.mjs b/packages/babel-preset-env/test/fixtures/modules/auto-esm/output.mjs new file mode 100644 index 0000000000..e5a2b28c2f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-esm/output.mjs @@ -0,0 +1,2 @@ +import mod from "mod"; +console.log(mod); diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-unknown/input.mjs b/packages/babel-preset-env/test/fixtures/modules/auto-unknown/input.mjs new file mode 100644 index 0000000000..e5a2b28c2f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-unknown/input.mjs @@ -0,0 +1,2 @@ +import mod from "mod"; +console.log(mod); diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-unknown/options.json b/packages/babel-preset-env/test/fixtures/modules/auto-unknown/options.json new file mode 100644 index 0000000000..b207aefdde --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-unknown/options.json @@ -0,0 +1,5 @@ +{ + "presets": [ + "env" + ] +} diff --git a/packages/babel-preset-env/test/fixtures/modules/auto-unknown/output.js b/packages/babel-preset-env/test/fixtures/modules/auto-unknown/output.js new file mode 100644 index 0000000000..d79cb698b5 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/modules/auto-unknown/output.js @@ -0,0 +1,7 @@ +"use strict"; + +var _mod = _interopRequireDefault(require("mod")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +console.log(_mod.default); diff --git a/packages/babel-preset-env/test/normalize-options.spec.js b/packages/babel-preset-env/test/normalize-options.spec.js index abe163e0cf..7a0f481f7b 100644 --- a/packages/babel-preset-env/test/normalize-options.spec.js +++ b/packages/babel-preset-env/test/normalize-options.spec.js @@ -134,16 +134,20 @@ describe("normalize-options", () => { }); describe("validateModulesOption", () => { - it("`undefined` option returns commonjs", () => { - expect(validateModulesOption()).toBe("commonjs"); + it("`undefined` option returns auto", () => { + expect(validateModulesOption()).toBe("auto"); }); - it("`false` option returns commonjs", () => { + it("`false` option returns false", () => { expect(validateModulesOption(false)).toBe(false); }); + it("auto option is valid", () => { + expect(validateModulesOption("auto")).toBe("auto"); + }); + it("commonjs option is valid", () => { - expect(validateModulesOption()).toBe("commonjs"); + expect(validateModulesOption("commonjs")).toBe("commonjs"); }); it("systemjs option is valid", () => {