From 253918c30fff6a653a4abf8335f4425ba9417c9a Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Sat, 23 Jul 2016 13:21:07 -0400 Subject: [PATCH] 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 --- .../fixtures/amd/exports-from/expected.js | 2 +- .../src/index.js | 2 +- .../test/esmodule-flag.js | 37 +++++++++++++++++++ .../fixtures/interop/exports-from/expected.js | 4 +- .../fixtures/regression/T7165/expected.js | 2 +- .../fixtures/strict/export-all/expected.js | 2 +- .../src/index.js | 2 +- .../systemjs/exports-from/expected.js | 4 +- .../fixtures/umd/exports-from/expected.js | 2 +- 9 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/esmodule-flag.js diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/exports-from/expected.js b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/exports-from/expected.js index 4466708b3e..ccb70fb277 100644 --- a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/exports-from/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/exports-from/expected.js @@ -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 () { diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js index 260af8e5c3..6ee1caf84f 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js @@ -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 () { diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/esmodule-flag.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/esmodule-flag.js new file mode 100644 index 0000000000..465936d67a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/esmodule-flag.js @@ -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" + ); +}); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/exports-from/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/exports-from/expected.js index 5fb9821a05..91934b2ef4 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/exports-from/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/exports-from/expected.js @@ -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; } -}); \ No newline at end of file +}); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7165/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7165/expected.js index 3cc2ee4048..cbeec985f9 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7165/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/regression/T7165/expected.js @@ -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 () { diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/export-all/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/export-all/expected.js index 4915e85892..db0cd4f011 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/export-all/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/export-all/expected.js @@ -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 () { diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js b/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js index 325ef08189..1f332b384a 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/src/index.js @@ -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]; } `); diff --git a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/exports-from/expected.js b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/exports-from/expected.js index 17868b9c27..15ea9c2784 100644 --- a/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/exports-from/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-systemjs/test/fixtures/systemjs/exports-from/expected.js @@ -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 () {} }; -}); \ No newline at end of file +}); diff --git a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/exports-from/expected.js b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/exports-from/expected.js index 3eddd0e894..a3ddb0d4fe 100644 --- a/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/exports-from/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-umd/test/fixtures/umd/exports-from/expected.js @@ -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 () {