diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/imports-hoisting/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/imports-hoisting/expected.js index c48d60f6e2..3fe83b718c 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/imports-hoisting/expected.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/imports-hoisting/expected.js @@ -1,9 +1,5 @@ -"use strict"; +var _taggedTemplateLiteral = require("babel-runtime/helpers/taggedTemplateLiteral").default; -var _taggedTemplateLiteral2 = _interopRequireDefault(require("babel-runtime/helpers/taggedTemplateLiteral")); - -var _templateObject = (0, _taggedTemplateLiteral2.default)(["foo"], ["foo"]); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _templateObject = _taggedTemplateLiteral(["foo"], ["foo"]); tag(_templateObject); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/actual.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/actual.js new file mode 100644 index 0000000000..c21dca024a --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/actual.js @@ -0,0 +1,3 @@ +export {}; + +console.log(helper); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/expected.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/expected.js new file mode 100644 index 0000000000..a25580a1aa --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/expected.js @@ -0,0 +1,7 @@ +"use strict"; + +var _interopRequireDefault3 = require("babel-runtime/helpers/interopRequireDefault").default; + +var _interopRequireDefault2 = _interopRequireDefault3(require("babel-runtime/helpers/interopRequireDefault")); + +console.log(_interopRequireDefault2.default); diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/options.json b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/options.json new file mode 100644 index 0000000000..a967c87acd --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + "transform-es2015-modules-commonjs", + "transform-runtime", + "./plugin" + ] +} diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/plugin.js b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/plugin.js new file mode 100644 index 0000000000..22a13dab2d --- /dev/null +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/test/fixtures/interop/multi-load/plugin.js @@ -0,0 +1,11 @@ +module.exports = function() { + return { + visitor: { + Identifier: function(path) { + if (path.node.name !== "helper") return; + + path.replaceWith(this.addHelper("interopRequireDefault")); + }, + }, + }; +}; diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/expected.js b/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/expected.js index a92d32a6a9..db75009829 100644 --- a/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/expected.js +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/regression/T7041/expected.js @@ -1,19 +1,15 @@ -"use strict"; +var _regeneratorRuntime = require("babel-runtime/regenerator").default; -var _regenerator = _interopRequireDefault(require("babel-runtime/regenerator")); - -var _keys = _interopRequireDefault(require("babel-runtime/core-js/object/keys")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _Object$keys = require("babel-runtime/core-js/object/keys").default; var _marked = /*#__PURE__*/ -_regenerator.default.mark(fn); +_regeneratorRuntime.mark(fn); -(0, _keys.default)({}); +_Object$keys({}); function fn() { - return _regenerator.default.wrap(function fn$(_context) { + return _regeneratorRuntime.wrap(function fn$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: diff --git a/packages/babel-plugin-transform-runtime/package.json b/packages/babel-plugin-transform-runtime/package.json index c153cba2ff..0ec49afe6f 100644 --- a/packages/babel-plugin-transform-runtime/package.json +++ b/packages/babel-plugin-transform-runtime/package.json @@ -8,6 +8,9 @@ "keywords": [ "babel-plugin" ], + "dependencies": { + "babel-helper-module-imports": "7.0.0-beta.2" + }, "devDependencies": { "babel-helper-plugin-test-runner": "7.0.0-beta.2" } diff --git a/packages/babel-plugin-transform-runtime/src/index.js b/packages/babel-plugin-transform-runtime/src/index.js index 7fb4f15ed8..fff182e7a3 100644 --- a/packages/babel-plugin-transform-runtime/src/index.js +++ b/packages/babel-plugin-transform-runtime/src/index.js @@ -1,3 +1,5 @@ +import { addDefault, isModule } from "babel-helper-module-imports"; + import definitions from "./definitions"; export default function({ types: t }) { @@ -9,7 +11,7 @@ export default function({ types: t }) { return Object.prototype.hasOwnProperty.call(obj, key); } - const HELPER_BLACKLIST = ["interopRequireWildcard", "interopRequireDefault"]; + const HEADER_HELPERS = ["interopRequireWildcard", "interopRequireDefault"]; return { pre(file) { @@ -23,12 +25,19 @@ export default function({ types: t }) { ? `${baseHelpersDir}/es6` : baseHelpersDir; file.set("helperGenerator", name => { - if (HELPER_BLACKLIST.indexOf(name) < 0) { - return this.addDefaultImport( - `${moduleName}/${helpersDir}/${name}`, - name, - ); - } + const isInteropHelper = HEADER_HELPERS.indexOf(name) !== -1; + + // Explicitly set the CommonJS interop helpers to their reserve + // blockHoist of 4 so they are guaranteed to exist + // when other things used them to import. + const blockHoist = + isInteropHelper && !isModule(file.path) ? 4 : undefined; + + return this.addDefaultImport( + `${moduleName}/${helpersDir}/${name}`, + name, + blockHoist, + ); }); } @@ -40,8 +49,28 @@ export default function({ types: t }) { this.moduleName = moduleName; - this.addDefaultImport = (source, nameHint) => { - return file.addImport(source, "default", nameHint); + const cache = new Map(); + + this.addDefaultImport = (source, nameHint, blockHoist) => { + // If something on the page adds a helper when the file is an ES6 + // file, we can't reused the cached helper name after things have been + // transformed because it has almost certainly been renamed. + const cacheKey = isModule(file.path); + const key = `${source}:${nameHint}:${cacheKey || ""}`; + + let cached = cache.get(key); + if (cached) { + cached = t.cloneDeep(cached); + } else { + cached = addDefault(file.path, source, { + importedInterop: "compiled", + nameHint, + blockHoist, + }); + + cache.set(key, cached); + } + return cached; }; }, diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/aliased-constructors/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/aliased-constructors/expected.js index 1cb089296d..e9af3f9463 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/aliased-constructors/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/aliased-constructors/expected.js @@ -1,6 +1,9 @@ -import _Map from "babel-runtime/core-js/map"; -import _Symbol from "babel-runtime/core-js/symbol"; -import _Promise from "babel-runtime/core-js/promise"; +var _Map = require("babel-runtime/core-js/map").default; + +var _Symbol = require("babel-runtime/core-js/symbol").default; + +var _Promise = require("babel-runtime/core-js/promise").default; + obj.constructor === Object; obj.constructor === _Promise; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/catch-all/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/catch-all/expected.js index 97b8bf8e3b..dfe1f85728 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/catch-all/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/catch-all/expected.js @@ -1,2 +1,3 @@ -import _Promise from "babel-runtime/core-js/promise"; +var _Promise = require("babel-runtime/core-js/promise").default; + _Promise.resolve; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/class/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/class/expected.js index 698463f783..62f7026093 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/class/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/class/expected.js @@ -1,4 +1,4 @@ -import _classCallCheck from "babel-runtime/helpers/classCallCheck"; +var _classCallCheck = require("babel-runtime/helpers/classCallCheck").default; let Foo = function Foo() { _classCallCheck(this, Foo); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/es6-for-of/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/es6-for-of/expected.js index 838e15fd3d..2b6d04b822 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/es6-for-of/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/es6-for-of/expected.js @@ -1,4 +1,5 @@ -import _getIterator from "babel-runtime/core-js/get-iterator"; +var _getIterator = require("babel-runtime/core-js/get-iterator").default; + var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/actual.mjs b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/actual.mjs new file mode 100644 index 0000000000..368b106310 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/actual.mjs @@ -0,0 +1,5 @@ +import foo from "foo"; + +class Example { + method() {} +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/expected.js new file mode 100644 index 0000000000..853c42e84b --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/expected.js @@ -0,0 +1,23 @@ +"use strict"; + +var _interopRequireDefault = require("babel-runtime/helpers/interopRequireDefault").default; + +var _classCallCheck2 = _interopRequireDefault(require("babel-runtime/helpers/classCallCheck")); + +var _createClass2 = _interopRequireDefault(require("babel-runtime/helpers/createClass")); + +var _foo = _interopRequireDefault(require("foo")); + +let Example = +/*#__PURE__*/ +function () { + function Example() { + (0, _classCallCheck2.default)(this, Example); + } + + (0, _createClass2.default)(Example, [{ + key: "method", + value: function method() {} + }]); + return Example; +}(); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/options.json b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/options.json new file mode 100644 index 0000000000..304a7fdde2 --- /dev/null +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules-helpers/options.json @@ -0,0 +1,7 @@ +{ + "plugins": [ + "transform-runtime", + "transform-es2015-modules-commonjs", + "transform-es2015-classes" + ] +} diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules/expected.js index fef9aa0bb8..742c943e04 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/modules/expected.js @@ -1,7 +1,11 @@ "use strict"; -import _Object$defineProperty from "babel-runtime/core-js/object/define-property"; -import _Object$keys from "babel-runtime/core-js/object/keys"; +var _interopRequireDefault = require("babel-runtime/helpers/interopRequireDefault").default; + +var _Object$defineProperty = require("babel-runtime/core-js/object/define-property").default; + +var _Object$keys = require("babel-runtime/core-js/object/keys").default; + Object.defineProperty(exports, "__esModule", { value: true }); @@ -21,6 +25,4 @@ _Object$keys(_mod).forEach(function (key) { }); }); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - _bar.default; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/regenerator-runtime/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/regenerator-runtime/expected.js index a5046aeb3b..af1647cc2e 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/regenerator-runtime/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/regenerator-runtime/expected.js @@ -1,4 +1,5 @@ -import _regeneratorRuntime from "babel-runtime/regenerator"; +var _regeneratorRuntime = require("babel-runtime/regenerator").default; + void /*#__PURE__*/ _regeneratorRuntime.mark(function _callee() { diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator-in/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator-in/expected.js index 97b293263d..c426027195 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator-in/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator-in/expected.js @@ -1,3 +1,3 @@ -import _isIterable from "babel-runtime/core-js/is-iterable"; +var _isIterable = require("babel-runtime/core-js/is-iterable").default; _isIterable(Object(arr)); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator/expected.js index 5b72708826..0d5b32855c 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/runtime/symbol-iterator/expected.js @@ -1,2 +1,3 @@ -import _Symbol$iterator from "babel-runtime/core-js/symbol/iterator"; +var _Symbol$iterator = require("babel-runtime/core-js/symbol/iterator").default; + _Symbol$iterator; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns-useESModules/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns-useESModules/expected.js index 17c83a4dc1..06770b5e0d 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns-useESModules/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns-useESModules/expected.js @@ -1,6 +1,8 @@ -import _classCallCheck from "babel-runtime/helpers/builtin/es6/classCallCheck"; -import _possibleConstructorReturn from "babel-runtime/helpers/builtin/es6/possibleConstructorReturn"; -import _inherits from "babel-runtime/helpers/builtin/es6/inherits"; +var _classCallCheck = require("babel-runtime/helpers/builtin/es6/classCallCheck").default; + +var _possibleConstructorReturn = require("babel-runtime/helpers/builtin/es6/possibleConstructorReturn").default; + +var _inherits = require("babel-runtime/helpers/builtin/es6/inherits").default; let Foo = /*#__PURE__*/ diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns/expected.js index 6213695eff..cfdbd19017 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useBuiltIns/expected.js @@ -1,6 +1,8 @@ -import _classCallCheck from "babel-runtime/helpers/builtin/classCallCheck"; -import _possibleConstructorReturn from "babel-runtime/helpers/builtin/possibleConstructorReturn"; -import _inherits from "babel-runtime/helpers/builtin/inherits"; +var _classCallCheck = require("babel-runtime/helpers/builtin/classCallCheck").default; + +var _possibleConstructorReturn = require("babel-runtime/helpers/builtin/possibleConstructorReturn").default; + +var _inherits = require("babel-runtime/helpers/builtin/inherits").default; let Foo = /*#__PURE__*/ diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useESModules/expected.js b/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useESModules/expected.js index 4c28b4f76e..3a7695f281 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useESModules/expected.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/use-options/useESModules/expected.js @@ -1,7 +1,10 @@ -import _Object$getPrototypeOf from "babel-runtime/core-js/object/get-prototype-of"; -import _classCallCheck from "babel-runtime/helpers/es6/classCallCheck"; -import _possibleConstructorReturn from "babel-runtime/helpers/es6/possibleConstructorReturn"; -import _inherits from "babel-runtime/helpers/es6/inherits"; +var _Object$getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of").default; + +var _classCallCheck = require("babel-runtime/helpers/es6/classCallCheck").default; + +var _possibleConstructorReturn = require("babel-runtime/helpers/es6/possibleConstructorReturn").default; + +var _inherits = require("babel-runtime/helpers/es6/inherits").default; let Foo = /*#__PURE__*/