diff --git a/babel.config.js b/babel.config.js index d57134718f4d..ae3026b99996 100644 --- a/babel.config.js +++ b/babel.config.js @@ -725,6 +725,8 @@ function pluginAddImportExtension() { if ( source.value.startsWith("lodash/") || source.value.startsWith("core-js-compat/") || + source.value === "core-js/stable/index" || + source.value === "regenerator-runtime/runtime" || source.value === "babel-plugin-dynamic-import-node/utils" ) { source.value += ".js"; diff --git a/jest.config.js b/jest.config.js index 984394e6f8e0..72e4bfb09663 100644 --- a/jest.config.js +++ b/jest.config.js @@ -43,9 +43,7 @@ module.exports = { // Some tests require internal files of bundled packages, which are not available // in production builds. They are marked using the .skip-bundled.js extension. ...(isPublishBundle ? ["\\.skip-bundled\\.js$"] : []), - ...(LIB_USE_ESM - ? ["/babel-node/", "/babel-register/", "/babel-helpers/"] - : []), + ...(LIB_USE_ESM ? ["/babel-helpers/"] : []), ], testEnvironment: "node", transformIgnorePatterns: [ diff --git a/packages/babel-node/src/_babel-node.ts b/packages/babel-node/src/_babel-node.ts index 979ec4433816..ce9be2a90012 100644 --- a/packages/babel-node/src/_babel-node.ts +++ b/packages/babel-node/src/_babel-node.ts @@ -5,7 +5,7 @@ import path from "path"; import repl from "repl"; import * as babel from "@babel/core"; import vm from "vm"; -import "core-js/stable"; +import "core-js/stable/index"; import "regenerator-runtime/runtime"; import register from "@babel/register"; import { fileURLToPath } from "url"; diff --git a/packages/babel-node/test/fixtures/cli/--config-file/in-files/index.js b/packages/babel-node/test/fixtures/cli/--config-file/in-files/index.js index 4d4dfd2c0f57..29c671ec0164 100644 --- a/packages/babel-node/test/fixtures/cli/--config-file/in-files/index.js +++ b/packages/babel-node/test/fixtures/cli/--config-file/in-files/index.js @@ -1,3 +1,3 @@ // See https://github.com/babel/babel/pull/14025#issuecomment-986296424 -// for the reason behind using setImmediate. -setImmediate(() => console.log("foo")); +// for the reason behind using setTimeout. +setTimeout(() => console.log("foo"), 50); diff --git a/packages/babel-node/test/fixtures/cli/--env-name/in-files/index.js b/packages/babel-node/test/fixtures/cli/--env-name/in-files/index.js index 4d4dfd2c0f57..29c671ec0164 100644 --- a/packages/babel-node/test/fixtures/cli/--env-name/in-files/index.js +++ b/packages/babel-node/test/fixtures/cli/--env-name/in-files/index.js @@ -1,3 +1,3 @@ // See https://github.com/babel/babel/pull/14025#issuecomment-986296424 -// for the reason behind using setImmediate. -setImmediate(() => console.log("foo")); +// for the reason behind using setTimeout. +setTimeout(() => console.log("foo"), 50); diff --git a/packages/babel-node/test/fixtures/cli/--presets/in-files/index.js b/packages/babel-node/test/fixtures/cli/--presets/in-files/index.js index 4d4dfd2c0f57..29c671ec0164 100644 --- a/packages/babel-node/test/fixtures/cli/--presets/in-files/index.js +++ b/packages/babel-node/test/fixtures/cli/--presets/in-files/index.js @@ -1,3 +1,3 @@ // See https://github.com/babel/babel/pull/14025#issuecomment-986296424 -// for the reason behind using setImmediate. -setImmediate(() => console.log("foo")); +// for the reason behind using setTimeout. +setTimeout(() => console.log("foo"), 50); diff --git a/packages/babel-node/test/fixtures/cli/-b/in-files/index.js b/packages/babel-node/test/fixtures/cli/-b/in-files/index.js index 4d4dfd2c0f57..29c671ec0164 100644 --- a/packages/babel-node/test/fixtures/cli/-b/in-files/index.js +++ b/packages/babel-node/test/fixtures/cli/-b/in-files/index.js @@ -1,3 +1,3 @@ // See https://github.com/babel/babel/pull/14025#issuecomment-986296424 -// for the reason behind using setImmediate. -setImmediate(() => console.log("foo")); +// for the reason behind using setTimeout. +setTimeout(() => console.log("foo"), 50); diff --git a/packages/babel-register/package.json b/packages/babel-register/package.json index 9275fc8640fa..11ab440c47f1 100644 --- a/packages/babel-register/package.json +++ b/packages/babel-register/package.json @@ -44,12 +44,6 @@ { "exports": null } - ], - "USE_ESM": [ - { - "type": "module" - }, - null ] }, "exports": { diff --git a/packages/babel-register/src/experimental-worker.js b/packages/babel-register/src/experimental-worker.js index 4f26ec5d88d4..eb299ee1bf52 100644 --- a/packages/babel-register/src/experimental-worker.js +++ b/packages/babel-register/src/experimental-worker.js @@ -13,7 +13,11 @@ if (major < 12 || (major === 12 && minor < 3)) { const hook = require("./hook"); const { WorkerClient } = require("./worker-client"); -const register = hook.register.bind(null, new WorkerClient()); +let client; +function register(opts) { + client ||= new WorkerClient(); + return hook.register(client, opts); +} module.exports = Object.assign(register, { revert: hook.revert, diff --git a/packages/babel-register/src/index.js b/packages/babel-register/src/index.js index 3b827d75af20..87cfd91a6801 100644 --- a/packages/babel-register/src/index.js +++ b/packages/babel-register/src/index.js @@ -4,7 +4,9 @@ * from a compiled Babel import. */ -if (process.env.BABEL_8_BREAKING) { +if (USE_ESM) { + module.exports = require("./experimental-worker"); +} else if (process.env.BABEL_8_BREAKING) { module.exports = require("./experimental-worker"); } else { exports = module.exports = function (...args) { diff --git a/packages/babel-register/src/worker/babel-core.js b/packages/babel-register/src/worker/babel-core.js index 06197e85977b..bf770b010e19 100644 --- a/packages/babel-register/src/worker/babel-core.js +++ b/packages/babel-register/src/worker/babel-core.js @@ -1,3 +1,5 @@ +const cache = require("./cache"); + function initialize(babel) { exports.init = null; exports.version = babel.version; @@ -10,11 +12,13 @@ function initialize(babel) { exports.OptionManager = babel.OptionManager; exports.transformSync = babel.transformSync; } + + cache.initializeCacheFilename(); } -if (process.env.BABEL_8_BREAKING) { +if (USE_ESM) { // @ts-expect-error CJS-ESM interop. - exports.init = import("@babel/core").then(ns => initialize(ns.default)); + exports.init = import("@babel/core").then(initialize); } else { initialize(require("@babel/core")); } diff --git a/packages/babel-register/src/worker/cache.js b/packages/babel-register/src/worker/cache.js index 6f818b1a42b3..d8226e0cfd0c 100644 --- a/packages/babel-register/src/worker/cache.js +++ b/packages/babel-register/src/worker/cache.js @@ -3,17 +3,21 @@ const path = require("path"); const fs = require("fs"); const os = require("os"); -const babel = require("@babel/core"); const findCacheDir = require("find-cache-dir"); -const DEFAULT_CACHE_DIR = - findCacheDir({ name: "@babel/register" }) || os.homedir() || os.tmpdir(); -const DEFAULT_FILENAME = path.join( - DEFAULT_CACHE_DIR, - `.babel.${babel.version}.${babel.getEnv()}.json`, -); +let FILENAME = process.env.BABEL_CACHE_PATH; + +// This function needs to be exported before requiring ./babel-core, because +// there is a circular dependency between these two files. +exports.initializeCacheFilename = function () { + FILENAME ||= path.join( + findCacheDir({ name: "@babel/register" }) || os.homedir() || os.tmpdir(), + `.babel.${babel.version}.${babel.getEnv()}.json`, + ); +}; + +const babel = require("./babel-core"); -const FILENAME = process.env.BABEL_CACHE_PATH || DEFAULT_FILENAME; let data = {}; let cacheDirty = false; diff --git a/packages/babel-register/test/index.js b/packages/babel-register/test/index.js index 99ea1749ed9f..e13fbb6a572f 100644 --- a/packages/babel-register/test/index.js +++ b/packages/babel-register/test/index.js @@ -36,6 +36,14 @@ function resetCache() { const OLD_JEST_MOCKS = !!jest.doMock; +let USE_ESM = false; +try { + const type = fs + .readFileSync(new URL("../../../.module-type", import.meta.url), "utf-8") + .trim(); + USE_ESM = type === "module"; +} catch {} + describe("@babel/register", function () { let currentHook, currentOptions, sourceMapSupport; @@ -86,7 +94,7 @@ describe("@babel/register", function () { }); } - if (!process.env.BABEL_8_BREAKING) { + if (!USE_ESM && !process.env.BABEL_8_BREAKING) { describe("babel 7", () => { if (!OLD_JEST_MOCKS) { beforeEach(() => { diff --git a/scripts/set-module-type.js b/scripts/set-module-type.js index a8062dc4533a..fe5b7dd25fd6 100755 --- a/scripts/set-module-type.js +++ b/scripts/set-module-type.js @@ -31,6 +31,11 @@ if (moduleType === "clean") { fs.statSync(dir).isDirectory() && fs.existsSync(`${dir}/package.json`) ) .forEach(dir => { + if (dir.endsWith("babel-register")) { + // This is a CJS package + return; + } + if (moduleType === "clean") { try { fs.unlinkSync(`${dir}/lib/package.json`);