diff --git a/packages/babel-preset-env/package.json b/packages/babel-preset-env/package.json index 285af9f080d7..d8b68bfbeaa2 100644 --- a/packages/babel-preset-env/package.json +++ b/packages/babel-preset-env/package.json @@ -22,6 +22,7 @@ "@babel/plugin-proposal-async-generator-functions": "^7.10.4", "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-export-namespace-from": "^7.10.4", "@babel/plugin-proposal-json-strings": "^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", "@babel/plugin-proposal-numeric-separator": "^7.10.4", @@ -33,6 +34,7 @@ "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-class-properties": "^7.10.4", "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4", diff --git a/packages/babel-preset-env/src/available-plugins.js b/packages/babel-preset-env/src/available-plugins.js index 939199ae987d..9fd8e49100b2 100644 --- a/packages/babel-preset-env/src/available-plugins.js +++ b/packages/babel-preset-env/src/available-plugins.js @@ -4,6 +4,7 @@ import syntaxAsyncGenerators from "@babel/plugin-syntax-async-generators"; import syntaxClassProperties from "@babel/plugin-syntax-class-properties"; import syntaxDynamicImport from "@babel/plugin-syntax-dynamic-import"; +import syntaxExportNamespaceFrom from "@babel/plugin-syntax-export-namespace-from"; import syntaxJsonStrings from "@babel/plugin-syntax-json-strings"; import syntaxNullishCoalescingOperator from "@babel/plugin-syntax-nullish-coalescing-operator"; import syntaxNumericSeparator from "@babel/plugin-syntax-numeric-separator"; @@ -14,6 +15,7 @@ import syntaxTopLevelAwait from "@babel/plugin-syntax-top-level-await"; import proposalAsyncGeneratorFunctions from "@babel/plugin-proposal-async-generator-functions"; import proposalClassProperties from "@babel/plugin-proposal-class-properties"; import proposalDynamicImport from "@babel/plugin-proposal-dynamic-import"; +import proposalExportNamespaceFrom from "@babel/plugin-proposal-export-namespace-from"; import proposalJsonStrings from "@babel/plugin-proposal-json-strings"; import proposalNullishCoalescingOperator from "@babel/plugin-proposal-nullish-coalescing-operator"; import proposalNumericSeparator from "@babel/plugin-proposal-numeric-separator"; @@ -72,6 +74,7 @@ export default { "proposal-async-generator-functions": proposalAsyncGeneratorFunctions, "proposal-class-properties": proposalClassProperties, "proposal-dynamic-import": proposalDynamicImport, + "proposal-export-namespace-from": proposalExportNamespaceFrom, "proposal-json-strings": proposalJsonStrings, "proposal-nullish-coalescing-operator": proposalNullishCoalescingOperator, "proposal-numeric-separator": proposalNumericSeparator, @@ -83,6 +86,7 @@ export default { "syntax-async-generators": syntaxAsyncGenerators, "syntax-class-properties": syntaxClassProperties, "syntax-dynamic-import": syntaxDynamicImport, + "syntax-export-namespace-from": syntaxExportNamespaceFrom, "syntax-json-strings": syntaxJsonStrings, "syntax-nullish-coalescing-operator": syntaxNullishCoalescingOperator, "syntax-numeric-separator": syntaxNumericSeparator, diff --git a/packages/babel-preset-env/src/index.js b/packages/babel-preset-env/src/index.js index 1fe9bfe424e3..be15fae66028 100644 --- a/packages/babel-preset-env/src/index.js +++ b/packages/babel-preset-env/src/index.js @@ -99,14 +99,16 @@ export const getModulesPluginNames = ({ transformations, shouldTransformESM, shouldTransformDynamicImport, + shouldTransformExportNamespaceFrom, shouldParseTopLevelAwait, -}: { +}: {| modules: ModuleOption, transformations: ModuleTransformationsType, shouldTransformESM: boolean, shouldTransformDynamicImport: boolean, + shouldTransformExportNamespaceFrom: boolean, shouldParseTopLevelAwait: boolean, -}) => { +|}) => { const modulesPluginNames = []; if (modules !== false && transformations[modules]) { if (shouldTransformESM) { @@ -132,6 +134,12 @@ export const getModulesPluginNames = ({ modulesPluginNames.push("syntax-dynamic-import"); } + if (shouldTransformExportNamespaceFrom) { + modulesPluginNames.push("proposal-export-namespace-from"); + } else { + modulesPluginNames.push("syntax-export-namespace-from"); + } + if (shouldParseTopLevelAwait) { modulesPluginNames.push("syntax-top-level-await"); } @@ -206,6 +214,10 @@ function supportsDynamicImport(caller) { return !!caller?.supportsDynamicImport; } +function supportsExportNamespaceFrom(caller) { + return !!caller?.supportsExportNamespaceFrom; +} + function supportsTopLevelAwait(caller) { return !!caller?.supportsTopLevelAwait; } @@ -265,6 +277,7 @@ export default declare((api, opts) => { const transformTargets = forceAllTransforms || hasUglifyTarget ? {} : targets; + const compatData = getPluginList(shippedProposals, bugfixes); const modulesPluginNames = getModulesPluginNames({ modules, transformations: moduleTransformations, @@ -273,11 +286,20 @@ export default declare((api, opts) => { shouldTransformESM: modules !== "auto" || !api.caller?.(supportsStaticESM), shouldTransformDynamicImport: modules !== "auto" || !api.caller?.(supportsDynamicImport), + shouldTransformExportNamespaceFrom: !( + (modules === "auto" && api.caller?.(supportsExportNamespaceFrom)) || + (modules === false && + !isRequired("proposal-export-namespace-from", transformTargets, { + compatData, + includes: include.plugins, + excludes: exclude.plugins, + })) + ), shouldParseTopLevelAwait: !api.caller || api.caller(supportsTopLevelAwait), }); const pluginNames = filterItems( - getPluginList(shippedProposals, bugfixes), + compatData, include.plugins, exclude.plugins, transformTargets, diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/input.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/input.mjs new file mode 100644 index 000000000000..3d03df801311 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/input.mjs @@ -0,0 +1 @@ +export * as foo from "./foo.mjs"; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/options.json b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/options.json new file mode 100644 index 000000000000..7796846968f4 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/options.json @@ -0,0 +1,10 @@ +{ + "validateLogs": true, + "caller": { + "name": "test-fixture", + "supportsStaticESM": false, + "supportsDynamicImport": false, + "supportsExportNamespaceFrom": false + }, + "presets": ["env"] +} diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/output.js b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/output.js new file mode 100644 index 000000000000..26e344a3dfb8 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-esm-not-supported/output.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.foo = void 0; + +var _foo = _interopRequireDefault(require("./foo.mjs")); + +exports.foo = _foo; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/input.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/input.mjs new file mode 100644 index 000000000000..3d03df801311 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/input.mjs @@ -0,0 +1 @@ +export * as foo from "./foo.mjs"; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/options.json b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/options.json new file mode 100644 index 000000000000..8ba60ebe9eb5 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/options.json @@ -0,0 +1,9 @@ +{ + "caller": { + "name": "test-fixture", + "supportsStaticESM": true, + "supportsDynamicImport": true, + "supportsExportNamespaceFrom": false + }, + "presets": ["env"] +} diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/output.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/output.mjs new file mode 100644 index 000000000000..da4d09cb8227 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/auto-export-namespace-not-supported/output.mjs @@ -0,0 +1,2 @@ +import * as _foo from "./foo.mjs"; +export { _foo as foo }; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/input.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/input.mjs new file mode 100644 index 000000000000..3d03df801311 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/input.mjs @@ -0,0 +1 @@ +export * as foo from "./foo.mjs"; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/options.json b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/options.json new file mode 100644 index 000000000000..a996d7e96ea7 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/options.json @@ -0,0 +1,7 @@ +{ + "caller": { + "name": "test-fixture", + "supportsExportNamespaceFrom": true + }, + "presets": [["env", { "modules": false, "targets": "chrome 71" }]] +} diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/output.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/output.mjs new file mode 100644 index 000000000000..da4d09cb8227 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported-caller-supported/output.mjs @@ -0,0 +1,2 @@ +import * as _foo from "./foo.mjs"; +export { _foo as foo }; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/input.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/input.mjs new file mode 100644 index 000000000000..3d03df801311 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/input.mjs @@ -0,0 +1 @@ +export * as foo from "./foo.mjs"; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/options.json b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/options.json new file mode 100644 index 000000000000..9d6ac234690f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/options.json @@ -0,0 +1,7 @@ +{ + "caller": { + "name": "test-fixture", + "supportsExportNamespaceFrom": false + }, + "presets": [["env", { "modules": false, "targets": "chrome 71" }]] +} diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/output.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/output.mjs new file mode 100644 index 000000000000..da4d09cb8227 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-not-supported/output.mjs @@ -0,0 +1,2 @@ +import * as _foo from "./foo.mjs"; +export { _foo as foo }; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/input.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/input.mjs new file mode 100644 index 000000000000..3d03df801311 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/input.mjs @@ -0,0 +1 @@ +export * as foo from "./foo.mjs"; diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/options.json b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/options.json new file mode 100644 index 000000000000..e60343c1b6a5 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/options.json @@ -0,0 +1,7 @@ +{ + "caller": { + "name": "test-fixture", + "supportsExportNamespaceFrom": false + }, + "presets": [["env", { "modules": false, "targets": "chrome 72" }]] +} diff --git a/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/output.mjs b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/output.mjs new file mode 100644 index 000000000000..3d03df801311 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/export-namespace-from/false-export-namespace-supported/output.mjs @@ -0,0 +1 @@ +export * as foo from "./foo.mjs";