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(
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) {

View File

@ -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 {

View File

@ -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__*/

View File

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

View File

@ -31,7 +31,7 @@ _foo2 = babelHelpers.interopRequireDefault(require("foo2"))
var
/*before*/
foo2 = babelHelpers.interopRequireWildcard(require("foo3"))
foo2 = babelHelpers.interopRequireDefault(require("foo3"))
/*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);

View File

@ -1,4 +1,5 @@
{
"sourceType": "module",
"plugins": [
"external-helpers",
["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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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 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 () {

View File

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

View File

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

View File

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