Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove useESModules in favor of conditional exports for @babel/runtime #12295

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 12 additions & 18 deletions .gitignore
Expand Up @@ -27,28 +27,22 @@ package-lock.json

/packages/babel-compat-data/build

/packages/babel-runtime/helpers/*.js
!/packages/babel-runtime/helpers/toArray.js
!/packages/babel-runtime/helpers/iterableToArray.js
!/packages/babel-runtime/helpers/temporalRef.js
/packages/babel-runtime/helpers/esm/*.js
!/packages/babel-runtime/helpers/esm/toArray.js
!/packages/babel-runtime/helpers/esm/iterableToArray.js
!/packages/babel-runtime/helpers/esm/temporalRef.js
/packages/babel-runtime/helpers/*/*.js
/packages/babel-runtime/helpers/*/*.mjs
!/packages/babel-runtime/helpers/toArray/*
!/packages/babel-runtime/helpers/iterableToArray/*
!/packages/babel-runtime/helpers/temporalRef/*

/packages/babel-runtime-corejs2/helpers/*.js
!/packages/babel-runtime-corejs2/helpers/toArray.js
!/packages/babel-runtime-corejs2/helpers/iterableToArray.js
!/packages/babel-runtime-corejs2/helpers/temporalRef.js
/packages/babel-runtime-corejs2/helpers/esm/*.js
!/packages/babel-runtime-corejs2/helpers/esm/toArray.js
!/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js
!/packages/babel-runtime-corejs2/helpers/esm/temporalRef.js
/packages/babel-runtime-corejs2/helpers/*/*.js
/packages/babel-runtime-corejs2/helpers/*/*.mjs
!/packages/babel-runtime-corejs2/helpers/toArray/*
!/packages/babel-runtime-corejs2/helpers/iterableToArray/*
!/packages/babel-runtime-corejs2/helpers/temporalRef/*
/packages/babel-runtime-corejs2/core-js/**/*.js
!/packages/babel-runtime-corejs2/core-js/map.js

/packages/babel-runtime-corejs3/helpers/*.js
/packages/babel-runtime-corejs3/helpers/esm/*.js
/packages/babel-runtime-corejs3/helpers/*/*.js
/packages/babel-runtime-corejs3/helpers/*/*.mjs
/packages/babel-runtime-corejs3/core-js/**/*.js
/packages/babel-runtime-corejs3/core-js-stable/**/*.js

Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;

var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));

Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault3 = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireDefault3 = require("@babel/runtime/helpers/interopRequireDefault").default;

exports.__esModule = true;

Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;

var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));

Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault3 = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireDefault3 = require("@babel/runtime/helpers/interopRequireDefault").default;

Object.defineProperty(exports, "__esModule", {
value: true
Expand Down
97 changes: 60 additions & 37 deletions packages/babel-plugin-transform-runtime/scripts/build-dist.js
Expand Up @@ -92,51 +92,59 @@ function writeCorejsExports(pkgDirname, runtimeRoot, paths) {
outputFile(pkgJsonPath, JSON.stringify(pkgJson, undefined, 2) + "\n");
}

function writeHelpers(runtimeName, { corejs } = {}) {
const helperPaths = writeHelperFiles(runtimeName, { corejs, esm: false });
const helperESMPaths = writeHelperFiles(runtimeName, { corejs, esm: true });
writeHelperExports(runtimeName, helperPaths.concat(helperESMPaths));
function writeHelperFile(
runtimeName,
pkgDirname,
helperPath,
helperName,
{ esm, corejs }
) {
const filePath = path.join(helperPath, esm ? "index.mjs" : "index.js");
const fullPath = path.join(pkgDirname, filePath);

outputFile(
fullPath,
buildHelper(runtimeName, pkgDirname, fullPath, helperName, { esm, corejs })
);

return `./${filePath}`;
}

function writeHelperExports(runtimeName, helperPaths) {
function writeHelpers(runtimeName, { corejs } = {}) {
const pkgDirname = getRuntimeRoot(runtimeName);
const helperSubExports = {};
for (const helperPath of helperPaths) {
helperSubExports[helperPath.replace(".js", "")] = helperPath;
for (const helperName of helpers.list) {
const helperPath = path.join("helpers", helperName);
helperSubExports[`./${helperPath}`] = {
node: writeHelperFile(runtimeName, pkgDirname, helperPath, helperName, {
esm: false,
corejs,
}),
module: writeHelperFile(runtimeName, pkgDirname, helperPath, helperName, {
esm: true,
corejs,
}),
get default() {
return this.module;
},
};
}

writeHelperExports(runtimeName, helperSubExports);
}

function writeHelperExports(runtimeName, helperSubExports) {
const exports = {
"./helpers/": "./helpers/",
...helperSubExports,
"./package": "./package.json",
"./package.json": "./package.json",
"./regenerator": "./regenerator/index.js",
"./regenerator/": "./regenerator/",
"./package.json": "./package.json",
};
const pkgDirname = getRuntimeRoot(runtimeName);
const pkgJsonPath = require.resolve(`${pkgDirname}/package.json`);
const pkgJson = require(pkgJsonPath);
pkgJson.exports = exports;
outputFile(pkgJsonPath, JSON.stringify(pkgJson, undefined, 2) + "\n");
}
function writeHelperFiles(runtimeName, { esm, corejs }) {
const pkgDirname = getRuntimeRoot(runtimeName);
const helperPaths = [];
for (const helperName of helpers.list) {
const helperPath =
"./" + path.join("helpers", esm ? "esm" : "", `${helperName}.js`);
const helperFilename = path.join(pkgDirname, helperPath);
outputFile(
helperFilename,
buildHelper(runtimeName, pkgDirname, helperFilename, helperName, {
esm,
corejs,
})
);

helperPaths.push(helperPath);
}

return helperPaths;
}

function getRuntimeRoot(runtimeName) {
return path.resolve(
Expand Down Expand Up @@ -164,7 +172,7 @@ function buildHelper(
for (const dep of helpers.getDependencies(helperName)) {
const id = (dependencies[dep] = t.identifier(t.toIdentifier(dep)));
tree.body.push(template.statement.ast`
var ${id} = require("${`./${dep}`}");
var ${id} = require("${dep}");
`);
bindings.push(id.name);
}
Expand All @@ -191,8 +199,9 @@ function buildHelper(
transformRuntime,
{ corejs, useESModules: esm, version: runtimeVersion },
],
buildRuntimeRewritePlugin(runtimeName, helperName, esm),
],
buildRuntimeRewritePlugin(runtimeName, helperName),
esm ? null : addDefaultCJSExport,
].filter(Boolean),
overrides: [
{
exclude: /typeof/,
Expand All @@ -202,8 +211,7 @@ function buildHelper(
}).code;
}

function buildRuntimeRewritePlugin(runtimeName, helperName, esm) {
const helperPath = esm ? "helpers/esm" : "helpers";
function buildRuntimeRewritePlugin(runtimeName, helperName) {
/**
* rewrite helpers imports to runtime imports
* @example
Expand All @@ -213,7 +221,7 @@ function buildRuntimeRewritePlugin(runtimeName, helperName, esm) {
*/
function adjustImportPath(node) {
if (helpers.list.includes(node.value)) {
node.value = `${runtimeName}/${helperPath}/${node.value}`;
node.value = `${runtimeName}/helpers/${node.value}`;
}
}

Expand Down Expand Up @@ -246,3 +254,18 @@ function buildRuntimeRewritePlugin(runtimeName, helperName, esm) {
},
};
}

function addDefaultCJSExport({ template }) {
return {
visitor: {
Program: {
exit(path) {
path.pushContainer(
"body",
template.statement.ast`module.exports.default = module.exports`
);
},
},
},
};
}
31 changes: 9 additions & 22 deletions packages/babel-plugin-transform-runtime/src/index.js
Expand Up @@ -6,18 +6,13 @@ import getCoreJS3Definitions from "./runtime-corejs3-definitions";
import { typeAnnotationToString } from "./helpers";
import getRuntimePath from "./get-runtime-path";

function supportsStaticESM(caller) {
return !!caller?.supportsStaticESM;
}

export default declare((api, options, dirname) => {
api.assertVersion(7);

const {
corejs,
helpers: useRuntimeHelpers = true,
regenerator: useRuntimeRegenerator = true,
useESModules = false,
version: runtimeVersion = "7.0.0-beta.0",
absoluteRuntime = false,
} = options;
Expand Down Expand Up @@ -67,12 +62,6 @@ export default declare((api, options, dirname) => {
throw new Error("The 'helpers' option must be undefined, or a boolean.");
}

if (typeof useESModules !== "boolean" && useESModules !== "auto") {
throw new Error(
"The 'useESModules' option must be undefined, or a boolean, or 'auto'.",
);
}

if (
typeof absoluteRuntime !== "boolean" &&
typeof absoluteRuntime !== "string"
Expand Down Expand Up @@ -163,9 +152,6 @@ export default declare((api, options, dirname) => {
);
}

const esModules =
useESModules === "auto" ? api.caller(supportsStaticESM) : useESModules;

const injectCoreJS = corejsVersion !== false;

const moduleName = injectCoreJS ? "@babel/runtime-corejs3" : "@babel/runtime";
Expand Down Expand Up @@ -206,22 +192,23 @@ export default declare((api, options, dirname) => {
const blockHoist =
isInteropHelper && !isModule(file.path) ? 4 : undefined;

const helpersDir =
esModules && file.path.node.sourceType === "module"
? "helpers/esm"
: "helpers";

return this.addDefaultImport(
`${modulePath}/${helpersDir}/${name}`,
`${modulePath}/helpers/${name}`,
name,
blockHoist,
true,
);
});
}

const cache = new Map();

this.addDefaultImport = (source, nameHint, blockHoist) => {
this.addDefaultImport = (
source,
nameHint,
blockHoist,
isHelper = false,
) => {
// 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.
Expand All @@ -233,7 +220,7 @@ export default declare((api, options, dirname) => {
cached = t.cloneNode(cached);
} else {
cached = addDefault(file.path, source, {
importedInterop: "uncompiled",
importedInterop: isHelper ? "compiled" : "uncompiled",
nameHint,
blockHoist,
});
Expand Down
@@ -1,4 +1,4 @@
var _classCallCheck = require("<CWD>/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/relative/subfolder/node_modules/@babel/runtime/helpers/classCallCheck");
var _classCallCheck = require("<CWD>/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/relative/subfolder/node_modules/@babel/runtime/helpers/classCallCheck").default;

let Foo = function Foo() {
"use strict";
Expand Down
@@ -1,4 +1,4 @@
var _classCallCheck = require("<CWD>/packages/babel-runtime/helpers/classCallCheck");
var _classCallCheck = require("<CWD>/packages/babel-runtime/helpers/classCallCheck").default;

let Foo = function Foo() {
"use strict";
Expand Down
@@ -1,4 +1,4 @@
var _classCallCheck = require("@babel/runtime-corejs3/helpers/classCallCheck");
var _classCallCheck = require("@babel/runtime-corejs3/helpers/classCallCheck").default;

let Foo = function Foo() {
"use strict";
Expand Down
@@ -1,4 +1,4 @@
var _createForOfIteratorHelper = require("@babel/runtime-corejs3/helpers/createForOfIteratorHelper");
var _createForOfIteratorHelper = require("@babel/runtime-corejs3/helpers/createForOfIteratorHelper").default;

var _iterator = _createForOfIteratorHelper(arr),
_step;
Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));

Expand Down
Expand Up @@ -6,7 +6,7 @@ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/in

var _context;

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;

exports.__esModule = true;
var _exportNames = {
Expand Down
Expand Up @@ -6,7 +6,7 @@ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/in

var _context;

var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;

var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");

Expand Down
@@ -1,4 +1,4 @@
var _classCallCheck = require("@babel/runtime/helpers/classCallCheck");
var _classCallCheck = require("@babel/runtime/helpers/classCallCheck").default;

let Foo = function Foo() {
"use strict";
Expand Down
@@ -1,4 +1,4 @@
var _createForOfIteratorHelper = require("@babel/runtime/helpers/createForOfIteratorHelper");
var _createForOfIteratorHelper = require("@babel/runtime/helpers/createForOfIteratorHelper").default;

var _iterator = _createForOfIteratorHelper(arr),
_step;
Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));

Expand Down
@@ -1,6 +1,6 @@
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;

Object.defineProperty(exports, "__esModule", {
value: true
Expand Down
@@ -1,8 +1,8 @@
import _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct";
import _classCallCheck from "@babel/runtime-corejs3/helpers/esm/classCallCheck";
import _inherits from "@babel/runtime-corejs3/helpers/esm/inherits";
import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/esm/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime-corejs3/helpers/esm/getPrototypeOf";
import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is useES6Modules a thing (it's in the fixture path)? Seems like maybe this test is not relevant any longer?

import _inherits from "@babel/runtime-corejs3/helpers/inherits";
import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf";

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }

Expand Down