From 0d1edb9811694d25df2ef75a1e8de773624ec6b8 Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 6 Mar 2017 14:21:58 -0500 Subject: [PATCH] Add `noInterop` option to `babel-plugin-transform-es2015-modules-commonjs`. The intent of this option is to toggle module interop behavior. When `true` no `interopRequireXXX` helper invocations will be emitted. --- .../fixtures/amd/noInterop-export-from/actual.js | 1 + .../fixtures/amd/noInterop-export-from/expected.js | 13 +++++++++++++ .../amd/noInterop-export-from/options.json | 3 +++ .../amd/noInterop-import-default-only/actual.js | 3 +++ .../amd/noInterop-import-default-only/expected.js | 5 +++++ .../amd/noInterop-import-default-only/options.json | 3 +++ .../src/index.js | 7 ++++--- .../test/fixtures/noInterop/export-from/actual.js | 1 + .../fixtures/noInterop/export-from/expected.js | 14 ++++++++++++++ .../noInterop/import-default-only/actual.js | 3 +++ .../noInterop/import-default-only/expected.js | 5 +++++ .../fixtures/noInterop/import-wildcard/actual.js | 4 ++++ .../fixtures/noInterop/import-wildcard/expected.js | 6 ++++++ .../test/fixtures/noInterop/options.json | 3 +++ .../test/fixtures/strict/import-wildcard/actual.js | 4 ++++ .../fixtures/strict/import-wildcard/expected.js | 6 ++++++ 16 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/expected.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/options.json create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/actual.js create mode 100644 packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/expected.js diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/actual.js b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/actual.js new file mode 100644 index 0000000000..7d2c9b022e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/actual.js @@ -0,0 +1 @@ +export { default } from 'foo'; diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/expected.js b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/expected.js new file mode 100644 index 0000000000..cd5f804ab6 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/expected.js @@ -0,0 +1,13 @@ +define(['exports', 'foo'], function (exports, _foo) { + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + Object.defineProperty(exports, 'default', { + enumerable: true, + get: function () { + return _foo.default; + } + }); +}); diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/options.json b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/options.json new file mode 100644 index 0000000000..096d2b9404 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-export-from/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", ["transform-es2015-modules-amd", { "noInterop": true }]] +} diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/actual.js b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/actual.js new file mode 100644 index 0000000000..44567cb185 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/actual.js @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo; diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/expected.js b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/expected.js new file mode 100644 index 0000000000..acdfb3b580 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/expected.js @@ -0,0 +1,5 @@ +define(["foo"], function (_foo) { + "use strict"; + + _foo.default; +}); diff --git a/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/options.json b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/options.json new file mode 100644 index 0000000000..096d2b9404 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-amd/test/fixtures/amd/noInterop-import-default-only/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", ["transform-es2015-modules-amd", { "noInterop": true }]] +} 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 6c6dc9848e..a9178da61e 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js @@ -151,6 +151,7 @@ export default function () { this.ranCommonJS = true; const strict = !!this.opts.strict; + const noInterop = !!this.opts.noInterop; const { scope } = path; @@ -327,7 +328,7 @@ export default function () { } else if (specifier.isExportDefaultSpecifier()) { // todo } else if (specifier.isExportSpecifier()) { - if (specifier.node.local.name === "default") { + if (!noInterop && specifier.node.local.name === "default") { topNodes.push(buildExportsFrom(t.stringLiteral(specifier.node.exported.name), t.memberExpression( t.callExpression(this.addHelper("interopRequireDefault"), [ref]), @@ -371,7 +372,7 @@ export default function () { for (let i = 0; i < specifiers.length; i++) { const specifier = specifiers[i]; if (t.isImportNamespaceSpecifier(specifier)) { - if (strict) { + if (strict || noInterop) { remaps[specifier.local.name] = uid; } else { const varDecl = t.variableDeclaration("var", [ @@ -402,7 +403,7 @@ export default function () { if (specifier.imported.name === "default") { if (wildcard) { target = wildcard; - } else { + } else if (!noInterop) { target = wildcard = path.scope.generateUidIdentifier(uid.name); const varDecl = t.variableDeclaration("var", [ t.variableDeclarator( diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/actual.js new file mode 100644 index 0000000000..7d2c9b022e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/actual.js @@ -0,0 +1 @@ +export { default } from 'foo'; diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/expected.js new file mode 100644 index 0000000000..c986dfedbb --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/export-from/expected.js @@ -0,0 +1,14 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _foo = require('foo'); + +Object.defineProperty(exports, 'default', { + enumerable: true, + get: function () { + return _foo.default; + } +}); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/actual.js new file mode 100644 index 0000000000..65b75b7293 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/actual.js @@ -0,0 +1,3 @@ +import foo from "foo"; + +foo(); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/expected.js new file mode 100644 index 0000000000..1bc59ef949 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-default-only/expected.js @@ -0,0 +1,5 @@ +"use strict"; + +var _foo = require("foo"); + +(0, _foo.default)(); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/actual.js new file mode 100644 index 0000000000..bf67ef46a2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/actual.js @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/expected.js new file mode 100644 index 0000000000..284db9decd --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/import-wildcard/expected.js @@ -0,0 +1,6 @@ +'use strict'; + +var _foo = require('foo'); + +_foo.bar(); +_foo.baz(); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/options.json b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/options.json new file mode 100644 index 0000000000..b2a35b9fc8 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/noInterop/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", ["transform-es2015-modules-commonjs", { "noInterop": true }]] +} diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/actual.js new file mode 100644 index 0000000000..bf67ef46a2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/actual.js @@ -0,0 +1,4 @@ +import * as foo from 'foo'; + +foo.bar(); +foo.baz(); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/expected.js new file mode 100644 index 0000000000..284db9decd --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/strict/import-wildcard/expected.js @@ -0,0 +1,6 @@ +'use strict'; + +var _foo = require('foo'); + +_foo.bar(); +_foo.baz();