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:
parent
d6646fb54f
commit
253918c30f
@ -5,7 +5,7 @@ define(["exports", "foo"], function (exports, _foo) {
|
|||||||
value: true
|
value: true
|
||||||
});
|
});
|
||||||
Object.keys(_foo).forEach(function (key) {
|
Object.keys(_foo).forEach(function (key) {
|
||||||
if (key === "default") return;
|
if (key === "default" || key === "__esModule") return;
|
||||||
Object.defineProperty(exports, key, {
|
Object.defineProperty(exports, key, {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get: function () {
|
get: function () {
|
||||||
|
|||||||
@ -33,7 +33,7 @@ let buildExportsAssignment = template(`
|
|||||||
|
|
||||||
let buildExportAll = template(`
|
let buildExportAll = template(`
|
||||||
Object.keys(OBJECT).forEach(function (key) {
|
Object.keys(OBJECT).forEach(function (key) {
|
||||||
if (key === "default") return;
|
if (key === "default" || key === "__esModule") return;
|
||||||
Object.defineProperty(exports, key, {
|
Object.defineProperty(exports, key, {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get: function () {
|
get: function () {
|
||||||
|
|||||||
@ -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"
|
||||||
|
);
|
||||||
|
});
|
||||||
@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|||||||
var _foo = require("foo");
|
var _foo = require("foo");
|
||||||
|
|
||||||
Object.keys(_foo).forEach(function (key) {
|
Object.keys(_foo).forEach(function (key) {
|
||||||
if (key === "default") return;
|
if (key === "default" || key === "__esModule") return;
|
||||||
Object.defineProperty(exports, key, {
|
Object.defineProperty(exports, key, {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get: function () {
|
get: function () {
|
||||||
|
|||||||
@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|||||||
var _bar = require('bar');
|
var _bar = require('bar');
|
||||||
|
|
||||||
Object.keys(_bar).forEach(function (key) {
|
Object.keys(_bar).forEach(function (key) {
|
||||||
if (key === "default") return;
|
if (key === "default" || key === "__esModule") return;
|
||||||
Object.defineProperty(exports, key, {
|
Object.defineProperty(exports, key, {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get: function () {
|
get: function () {
|
||||||
|
|||||||
@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|||||||
var _mod = require('mod');
|
var _mod = require('mod');
|
||||||
|
|
||||||
Object.keys(_mod).forEach(function (key) {
|
Object.keys(_mod).forEach(function (key) {
|
||||||
if (key === "default") return;
|
if (key === "default" || key === "__esModule") return;
|
||||||
Object.defineProperty(exports, key, {
|
Object.defineProperty(exports, key, {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get: function () {
|
get: function () {
|
||||||
|
|||||||
@ -18,7 +18,7 @@ let buildTemplate = template(`
|
|||||||
|
|
||||||
let buildExportAll = template(`
|
let buildExportAll = template(`
|
||||||
for (var KEY in TARGET) {
|
for (var KEY in TARGET) {
|
||||||
if (KEY !== "default") EXPORT_OBJ[KEY] = TARGET[KEY];
|
if (KEY !== "default" && key !== "__esModule") EXPORT_OBJ[KEY] = TARGET[KEY];
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ System.register(["foo"], function (_export, _context) {
|
|||||||
var _exportObj = {};
|
var _exportObj = {};
|
||||||
|
|
||||||
for (var _key in _foo) {
|
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;
|
_exportObj.foo = _foo.foo;
|
||||||
|
|||||||
@ -17,7 +17,7 @@
|
|||||||
value: true
|
value: true
|
||||||
});
|
});
|
||||||
Object.keys(_foo).forEach(function (key) {
|
Object.keys(_foo).forEach(function (key) {
|
||||||
if (key === "default") return;
|
if (key === "default" || key === "__esModule") return;
|
||||||
Object.defineProperty(exports, key, {
|
Object.defineProperty(exports, key, {
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
get: function () {
|
get: function () {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user