diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index ce07b94e4a..859b63989f 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -22,7 +22,16 @@ export { hasExports, isSideEffectImport, isModule }; */ export function rewriteModuleStatementsAndPrepareHeader( path: NodePath, - { exportName, strict, allowTopLevelThis, strictMode, loose, noInterop, lazy }, + { + exportName, + strict, + allowTopLevelThis, + strictMode, + loose, + noInterop, + lazy, + esNamespaceOnly, + }, ) { assert(isModule(path), "Cannot process module statements in a script"); path.node.sourceType = "script"; @@ -31,6 +40,7 @@ export function rewriteModuleStatementsAndPrepareHeader( noInterop, loose, lazy, + esNamespaceOnly, }); if (!allowTopLevelThis) { diff --git a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js index 0b649b5593..8ffda28444 100644 --- a/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js +++ b/packages/babel-helper-module-transforms/src/normalize-and-load-metadata.js @@ -86,7 +86,12 @@ export function isSideEffectImport(source: SourceModuleMetadata) { export default function normalizeModuleAndLoadMetadata( programPath: NodePath, exportName?: string, - { noInterop = false, loose = false, lazy = false } = {}, + { + noInterop = false, + loose = false, + lazy = false, + esNamespaceOnly = false, + } = {}, ): ModuleMetadata { if (!exportName) { exportName = programPath.scope.generateUidIdentifier("exports").name; @@ -107,6 +112,16 @@ export default function normalizeModuleAndLoadMetadata( } if (noInterop) metadata.interop = "none"; + else if (esNamespaceOnly) { + // Both the default and namespace interops pass through __esModule + // objects, but the namespace interop is used to enable Babel's + // destructuring-like interop behavior for normal CommonJS. + // Since some tooling has started to remove that behavior, we expose + // it as the `esNamespace` option. + if (metadata.interop === "namespace") { + metadata.interop = "default"; + } + } } return { diff --git a/packages/babel-plugin-transform-classes/test/fixtures/regression/2775/output.js b/packages/babel-plugin-transform-classes/test/fixtures/regression/2775/output.js index 786d7c177d..599a3a5438 100644 --- a/packages/babel-plugin-transform-classes/test/fixtures/regression/2775/output.js +++ b/packages/babel-plugin-transform-classes/test/fixtures/regression/2775/output.js @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _react = babelHelpers.interopRequireWildcard(require("react")); +var _react = babelHelpers.interopRequireDefault(require("react")); var RandomComponent = /*#__PURE__*/ diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index e1f1431ff2..6bf6ff4829 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -15,6 +15,14 @@ export default declare((api, options) => { const { loose, + + // 'true' for non-mjs files to strictly have .default, instead of having + // destructuring-like behavior for their properties. + strictNamespace = false, + + // 'true' for mjs files to strictly have .default, instead of having + // destructuring-like behavior for their properties. + mjsStrictNamespace = true, allowTopLevelThis, strict, strictMode, @@ -32,6 +40,13 @@ export default declare((api, options) => { throw new Error(`.lazy must be a boolean, array of strings, or a function`); } + if (typeof strictNamespace !== "boolean") { + throw new Error(`.strictNamespace must be a boolean, or undefined`); + } + if (typeof mjsStrictNamespace !== "boolean") { + throw new Error(`.mjsStrictNamespace must be a boolean, or undefined`); + } + const getAssertion = localName => template.expression.ast` (function(){ throw new Error( @@ -103,7 +118,7 @@ export default declare((api, options) => { return { visitor: { Program: { - exit(path) { + exit(path, state) { if (!isModule(path)) return; // Rename the bindings auto-injected into the scope so there is no @@ -137,6 +152,11 @@ export default declare((api, options) => { allowTopLevelThis, noInterop, lazy, + esNamespaceOnly: + typeof state.filename === "string" && + /\.mjs$/.test(state.filename) + ? mjsStrictNamespace + : strictNamespace, }, ); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/auxiliary-comment/overview/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/auxiliary-comment/overview/output.js index 6d16e52641..dfa19a51ab 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/auxiliary-comment/overview/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/auxiliary-comment/overview/output.js @@ -31,7 +31,7 @@ _foo2 = babelHelpers.interopRequireDefault(require("foo2")) var /*before*/ -foo2 = babelHelpers.interopRequireWildcard(require("foo3")) +foo2 = babelHelpers.interopRequireDefault(require("foo3")) /*after*/ ; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/input.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-glob/input.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-hoisting/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-hoisting/output.js index b1133b75bd..f3ae7f0971 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-hoisting/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-hoisting/output.js @@ -1,5 +1,9 @@ -var _taggedTemplateLiteral = require("@babel/runtime/helpers/taggedTemplateLiteral"); +"use strict"; -var _templateObject = /*#__PURE__*/ _taggedTemplateLiteral(["foo"]); +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); + +var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); + +var _templateObject = /*#__PURE__*/ (0, _taggedTemplateLiteral2.default)(["foo"]); tag(_templateObject); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/input.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/imports-mixing/input.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/options.json index 4a31dd9de2..0f456743bc 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/options.json +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/options.json @@ -1,4 +1,5 @@ { + "sourceType": "module", "plugins": [ "external-helpers", ["transform-modules-commonjs", { "loose": true }] diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/input.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop-loose/overview/input.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/input.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-glob/input.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-hoisting/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-hoisting/output.js index b1133b75bd..f3ae7f0971 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-hoisting/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-hoisting/output.js @@ -1,5 +1,9 @@ -var _taggedTemplateLiteral = require("@babel/runtime/helpers/taggedTemplateLiteral"); +"use strict"; -var _templateObject = /*#__PURE__*/ _taggedTemplateLiteral(["foo"]); +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); + +var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); + +var _templateObject = /*#__PURE__*/ (0, _taggedTemplateLiteral2.default)(["foo"]); tag(_templateObject); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/input.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/imports-mixing/input.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/options.json index e38115115d..47d0b962b9 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/options.json +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/options.json @@ -1,3 +1,4 @@ { + "sourceType": "module", "plugins": ["external-helpers", "transform-modules-commonjs"] } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/input.js similarity index 100% rename from packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/input.mjs rename to packages/babel-plugin-transform-modules-commonjs/test/fixtures/interop/overview/input.js diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/output.js index e720a87205..ef26faaebc 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/import-namespace/output.js @@ -1,7 +1,7 @@ "use strict"; function foo() { - const data = babelHelpers.interopRequireWildcard(require("foo")); + const data = babelHelpers.interopRequireDefault(require("foo")); foo = function () { return data; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/output.js index 239f67e25a..cb6dab1f41 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-dep/reexport-namespace/output.js @@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { exports.namespace = void 0; function namespace() { - const data = babelHelpers.interopRequireWildcard(require("foo")); + const data = babelHelpers.interopRequireDefault(require("foo")); namespace = function () { return data; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/output.js index d041921ee4..ffdc4d8163 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/import-namespace/output.js @@ -1,4 +1,4 @@ "use strict"; -var foo = babelHelpers.interopRequireWildcard(require("./foo")); +var foo = babelHelpers.interopRequireDefault(require("./foo")); console.log(foo); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/output.js index 6aad5e4726..82e3c24904 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-local/reexport-namespace/output.js @@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.namespace = void 0; -var namespace = babelHelpers.interopRequireWildcard(require("./foo")); +var namespace = babelHelpers.interopRequireDefault(require("./foo")); exports.namespace = namespace; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/output.js index 703d0cdd86..848b8cb1d3 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/import-namespace/output.js @@ -1,9 +1,9 @@ "use strict"; -var foo1 = babelHelpers.interopRequireWildcard(require("white")); +var foo1 = babelHelpers.interopRequireDefault(require("white")); function foo2() { - const data = babelHelpers.interopRequireWildcard(require("black")); + const data = babelHelpers.interopRequireDefault(require("black")); foo2 = function () { return data; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/output.js index 7e52454406..999143700b 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/lazy-whitelist/reexport-namespace/output.js @@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.namespace2 = exports.namespace1 = void 0; -var namespace1 = babelHelpers.interopRequireWildcard(require("white")); +var namespace1 = babelHelpers.interopRequireDefault(require("white")); exports.namespace1 = namespace1; function namespace2() { - const data = babelHelpers.interopRequireWildcard(require("black")); + const data = babelHelpers.interopRequireDefault(require("black")); namespace2 = function () { return data; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/options.json new file mode 100644 index 0000000000..fd06b45cf2 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters-star/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + ["transform-modules-commonjs", { "mjsStrictNamespace": false }] + ] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters/output.js index c545f5310d..721f9af381 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/copy-getters-setters/output.js @@ -16,6 +16,6 @@ Object.defineProperty(exports, "baz", { } }); -var _moduleWithGetter = _interopRequireWildcard(require("./moduleWithGetter")); +var _moduleWithGetter = _interopRequireDefault(require("./moduleWithGetter")); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/import-const-throw/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/import-const-throw/output.js index 2433845dbd..7b05f0c824 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/import-const-throw/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/import-const-throw/output.js @@ -2,12 +2,10 @@ var _foo = _interopRequireDefault(require("foo")); -var Bar = _interopRequireWildcard(require("bar")); +var Bar = _interopRequireDefault(require("bar")); var _baz = require("baz"); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } _foo.default = (42, function () { diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/reference-source-map/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/reference-source-map/output.js index b09c24ce46..c40ee11036 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/reference-source-map/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/reference-source-map/output.js @@ -6,7 +6,7 @@ var _two = require("two"); var _three = require("three"); -var aNamespace = babelHelpers.interopRequireWildcard(require("four")); +var aNamespace = babelHelpers.interopRequireDefault(require("four")); console.log(_one.default); console.log(_two.aNamed); console.log(_three.orig); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/lazy-7176/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/lazy-7176/output.js index 1d580efea9..7ed4c7dfaf 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/lazy-7176/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/lazy-7176/output.js @@ -1,7 +1,7 @@ "use strict"; function mod() { - const data = babelHelpers.interopRequireWildcard(require("mod")); + const data = babelHelpers.interopRequireDefault(require("mod")); mod = function () { return data; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/strict/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/strict/options.json index 4b1163fa61..1654d4e359 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/strict/options.json +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/strict/options.json @@ -2,6 +2,6 @@ "plugins": [ "external-helpers", "syntax-object-rest-spread", - ["transform-modules-commonjs", { "strict": true }] + ["transform-modules-commonjs", { "strict": true, "mjsStrictNamespace": false }] ] }