Fix buildExportAll to account for commonjs/amd/systemjs (#3591)

* Fix buildExportAll to account for commonjs/amd

If the re-exported module was generated with Babel and it is a commonjs or amd module and so is the current module, this will result in an attempt to redefine the __esModule property, which throws a runtime error.

* Add test: don't overwrite __esModule on re-export

(Failing.)

* fixup tests

* Add fix for systemjs
This commit is contained in:
Henry Zhu 2016-07-23 13:21:07 -04:00 committed by GitHub
parent d6646fb54f
commit 253918c30f
9 changed files with 47 additions and 10 deletions

View File

@ -5,7 +5,7 @@ define(["exports", "foo"], function (exports, _foo) {
value: true
});
Object.keys(_foo).forEach(function (key) {
if (key === "default") return;
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {

View File

@ -33,7 +33,7 @@ let buildExportsAssignment = template(`
let buildExportAll = template(`
Object.keys(OBJECT).forEach(function (key) {
if (key === "default") return;
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {

View File

@ -0,0 +1,37 @@
var assert = require("assert");
var babel = require("babel-core");
var vm = require("vm");
test("Re-export doesn't overwrite __esModule flag", function () {
var code = 'export * from "./dep";';
var depStub = {
__esModule: false,
};
var context = {
module: {
exports: {}
},
require: function (id) {
if (id === "./dep") return depStub;
return require(id);
},
};
context.exports = context.module.exports;
code = babel.transform(code, {
"plugins": [
[require("../"), {loose: true}],
],
"ast": false,
}).code;
vm.runInNewContext(code, context);
// exports.__esModule shouldn't be overwritten.
assert.equal(
context.exports.__esModule,
true,
"Expected exports.__esModule === true"
);
});

View File

@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
var _foo = require("foo");
Object.keys(_foo).forEach(function (key) {
if (key === "default") return;
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
@ -62,4 +62,4 @@ Object.defineProperty(exports, "foo", {
get: function () {
return babelHelpers.interopRequireDefault(_foo).default;
}
});
});

View File

@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
var _bar = require('bar');
Object.keys(_bar).forEach(function (key) {
if (key === "default") return;
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {

View File

@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
var _mod = require('mod');
Object.keys(_mod).forEach(function (key) {
if (key === "default") return;
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {

View File

@ -18,7 +18,7 @@ let buildTemplate = template(`
let buildExportAll = template(`
for (var KEY in TARGET) {
if (KEY !== "default") EXPORT_OBJ[KEY] = TARGET[KEY];
if (KEY !== "default" && key !== "__esModule") EXPORT_OBJ[KEY] = TARGET[KEY];
}
`);

View File

@ -6,7 +6,7 @@ System.register(["foo"], function (_export, _context) {
var _exportObj = {};
for (var _key in _foo) {
if (_key !== "default") _exportObj[_key] = _foo[_key];
if (_key !== "default" && key !== "__esModule") _exportObj[_key] = _foo[_key];
}
_exportObj.foo = _foo.foo;
@ -21,4 +21,4 @@ System.register(["foo"], function (_export, _context) {
}],
execute: function () {}
};
});
});

View File

@ -17,7 +17,7 @@
value: true
});
Object.keys(_foo).forEach(function (key) {
if (key === "default") return;
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {