Use strict namespace behavior for mjs files. (#7545)

This commit is contained in:
Logan Smyth 2018-03-15 13:27:01 -07:00 committed by GitHub
parent b6e54800b4
commit c662c2ada2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 83 additions and 25 deletions

View File

@ -22,7 +22,16 @@ export { hasExports, isSideEffectImport, isModule };
*/ */
export function rewriteModuleStatementsAndPrepareHeader( export function rewriteModuleStatementsAndPrepareHeader(
path: NodePath, 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"); assert(isModule(path), "Cannot process module statements in a script");
path.node.sourceType = "script"; path.node.sourceType = "script";
@ -31,6 +40,7 @@ export function rewriteModuleStatementsAndPrepareHeader(
noInterop, noInterop,
loose, loose,
lazy, lazy,
esNamespaceOnly,
}); });
if (!allowTopLevelThis) { if (!allowTopLevelThis) {

View File

@ -86,7 +86,12 @@ export function isSideEffectImport(source: SourceModuleMetadata) {
export default function normalizeModuleAndLoadMetadata( export default function normalizeModuleAndLoadMetadata(
programPath: NodePath, programPath: NodePath,
exportName?: string, exportName?: string,
{ noInterop = false, loose = false, lazy = false } = {}, {
noInterop = false,
loose = false,
lazy = false,
esNamespaceOnly = false,
} = {},
): ModuleMetadata { ): ModuleMetadata {
if (!exportName) { if (!exportName) {
exportName = programPath.scope.generateUidIdentifier("exports").name; exportName = programPath.scope.generateUidIdentifier("exports").name;
@ -107,6 +112,16 @@ export default function normalizeModuleAndLoadMetadata(
} }
if (noInterop) metadata.interop = "none"; 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 { return {

View File

@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
}); });
exports.default = void 0; exports.default = void 0;
var _react = babelHelpers.interopRequireWildcard(require("react")); var _react = babelHelpers.interopRequireDefault(require("react"));
var RandomComponent = var RandomComponent =
/*#__PURE__*/ /*#__PURE__*/

View File

@ -15,6 +15,14 @@ export default declare((api, options) => {
const { const {
loose, 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, allowTopLevelThis,
strict, strict,
strictMode, strictMode,
@ -32,6 +40,13 @@ export default declare((api, options) => {
throw new Error(`.lazy must be a boolean, array of strings, or a function`); 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` const getAssertion = localName => template.expression.ast`
(function(){ (function(){
throw new Error( throw new Error(
@ -103,7 +118,7 @@ export default declare((api, options) => {
return { return {
visitor: { visitor: {
Program: { Program: {
exit(path) { exit(path, state) {
if (!isModule(path)) return; if (!isModule(path)) return;
// Rename the bindings auto-injected into the scope so there is no // Rename the bindings auto-injected into the scope so there is no
@ -137,6 +152,11 @@ export default declare((api, options) => {
allowTopLevelThis, allowTopLevelThis,
noInterop, noInterop,
lazy, lazy,
esNamespaceOnly:
typeof state.filename === "string" &&
/\.mjs$/.test(state.filename)
? mjsStrictNamespace
: strictNamespace,
}, },
); );

View File

@ -31,7 +31,7 @@ _foo2 = babelHelpers.interopRequireDefault(require("foo2"))
var var
/*before*/ /*before*/
foo2 = babelHelpers.interopRequireWildcard(require("foo3")) foo2 = babelHelpers.interopRequireDefault(require("foo3"))
/*after*/ /*after*/
; ;

View File

@ -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); tag(_templateObject);

View File

@ -1,4 +1,5 @@
{ {
"sourceType": "module",
"plugins": [ "plugins": [
"external-helpers", "external-helpers",
["transform-modules-commonjs", { "loose": true }] ["transform-modules-commonjs", { "loose": true }]

View File

@ -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); tag(_templateObject);

View File

@ -1,3 +1,4 @@
{ {
"sourceType": "module",
"plugins": ["external-helpers", "transform-modules-commonjs"] "plugins": ["external-helpers", "transform-modules-commonjs"]
} }

View File

@ -1,7 +1,7 @@
"use strict"; "use strict";
function foo() { function foo() {
const data = babelHelpers.interopRequireWildcard(require("foo")); const data = babelHelpers.interopRequireDefault(require("foo"));
foo = function () { foo = function () {
return data; return data;

View File

@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
exports.namespace = void 0; exports.namespace = void 0;
function namespace() { function namespace() {
const data = babelHelpers.interopRequireWildcard(require("foo")); const data = babelHelpers.interopRequireDefault(require("foo"));
namespace = function () { namespace = function () {
return data; return data;

View File

@ -1,4 +1,4 @@
"use strict"; "use strict";
var foo = babelHelpers.interopRequireWildcard(require("./foo")); var foo = babelHelpers.interopRequireDefault(require("./foo"));
console.log(foo); console.log(foo);

View File

@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports.namespace = void 0; exports.namespace = void 0;
var namespace = babelHelpers.interopRequireWildcard(require("./foo")); var namespace = babelHelpers.interopRequireDefault(require("./foo"));
exports.namespace = namespace; exports.namespace = namespace;

View File

@ -1,9 +1,9 @@
"use strict"; "use strict";
var foo1 = babelHelpers.interopRequireWildcard(require("white")); var foo1 = babelHelpers.interopRequireDefault(require("white"));
function foo2() { function foo2() {
const data = babelHelpers.interopRequireWildcard(require("black")); const data = babelHelpers.interopRequireDefault(require("black"));
foo2 = function () { foo2 = function () {
return data; return data;

View File

@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports.namespace2 = exports.namespace1 = void 0; exports.namespace2 = exports.namespace1 = void 0;
var namespace1 = babelHelpers.interopRequireWildcard(require("white")); var namespace1 = babelHelpers.interopRequireDefault(require("white"));
exports.namespace1 = namespace1; exports.namespace1 = namespace1;
function namespace2() { function namespace2() {
const data = babelHelpers.interopRequireWildcard(require("black")); const data = babelHelpers.interopRequireDefault(require("black"));
namespace2 = function () { namespace2 = function () {
return data; return data;

View File

@ -0,0 +1,5 @@
{
"plugins": [
["transform-modules-commonjs", { "mjsStrictNamespace": false }]
]
}

View File

@ -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 }; }

View File

@ -2,12 +2,10 @@
var _foo = _interopRequireDefault(require("foo")); var _foo = _interopRequireDefault(require("foo"));
var Bar = _interopRequireWildcard(require("bar")); var Bar = _interopRequireDefault(require("bar"));
var _baz = require("baz"); 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 }; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_foo.default = (42, function () { _foo.default = (42, function () {

View File

@ -6,7 +6,7 @@ var _two = require("two");
var _three = require("three"); var _three = require("three");
var aNamespace = babelHelpers.interopRequireWildcard(require("four")); var aNamespace = babelHelpers.interopRequireDefault(require("four"));
console.log(_one.default); console.log(_one.default);
console.log(_two.aNamed); console.log(_two.aNamed);
console.log(_three.orig); console.log(_three.orig);

View File

@ -1,7 +1,7 @@
"use strict"; "use strict";
function mod() { function mod() {
const data = babelHelpers.interopRequireWildcard(require("mod")); const data = babelHelpers.interopRequireDefault(require("mod"));
mod = function () { mod = function () {
return data; return data;

View File

@ -2,6 +2,6 @@
"plugins": [ "plugins": [
"external-helpers", "external-helpers",
"syntax-object-rest-spread", "syntax-object-rest-spread",
["transform-modules-commonjs", { "strict": true }] ["transform-modules-commonjs", { "strict": true, "mjsStrictNamespace": false }]
] ]
} }