diff --git a/babel.config.js b/babel.config.js index e1b84525c139..684bafe7a0bd 100644 --- a/babel.config.js +++ b/babel.config.js @@ -21,6 +21,7 @@ module.exports = function (api) { let convertESM = true; let ignoreLib = true; let includeRegeneratorRuntime = false; + let polyfillRequireResolve = false; let transformRuntimeOptions; @@ -53,6 +54,7 @@ module.exports = function (api) { "packages/babel-compat-data" ); if (env === "rollup") envOpts.targets = { node: nodeVersion }; + polyfillRequireResolve = true; break; case "test-legacy": // In test-legacy environment, we build babel on latest node but test on minimum supported legacy versions case "production": @@ -60,6 +62,7 @@ module.exports = function (api) { envOpts.targets = { node: nodeVersion, }; + polyfillRequireResolve = true; break; case "development": envOpts.debug = true; @@ -116,6 +119,7 @@ module.exports = function (api) { convertESM ? "@babel/proposal-export-namespace-from" : null, convertESM ? "@babel/transform-modules-commonjs" : null, + polyfillRequireResolve && pluginPolyfillRequireResolve, ].filter(Boolean), overrides: [ { @@ -160,3 +164,43 @@ module.exports = function (api) { return config; }; + +// TODO(Babel 8) This polyfill is only needed for Node.js 6 and 8 +function pluginPolyfillRequireResolve({ template, types: t }) { + return { + visitor: { + MemberExpression(path) { + if (!path.matchesPattern("require.resolve")) return; + if (!t.isCallExpression(path.parent, { callee: path.node })) return; + + const args = path.parent.arguments; + if (args.length < 2) return; + if ( + !t.isObjectExpression(args[1]) || + args[1].properties.length !== 1 || + !t.isIdentifier(args[1].properties[0].key, { name: "paths" }) || + !t.isArrayExpression(args[1].properties[0].value) || + args[1].properties[0].value.elements.length !== 1 + ) { + throw path.parentPath.buildCodeFrameError( + "This 'require.resolve' usage is not supported by the inline polyfill." + ); + } + + // require.resolve's paths option has been introduced in Node.js 8.9 + // https://nodejs.org/api/modules.html#modules_require_resolve_request_options + path.replaceWith(template.ast` + parseFloat(process.versions.node) >= 8.9 + ? require.resolve + : (/* request */ r, { paths: [/* base */ b] }, M = require("module")) => { + let /* filename */ f = M._findPath(r, M._nodeModulePaths(b).concat(b)); + if (f) return f; + f = new Error(\`Cannot resolve module '\${r}'\`); + f.code = "MODULE_NOT_FOUND"; + throw f; + } + `); + }, + }, + }; +} diff --git a/lib/third-party-libs.js.flow b/lib/third-party-libs.js.flow index f9723ea6fe4e..f114c0bc1ef6 100644 --- a/lib/third-party-libs.js.flow +++ b/lib/third-party-libs.js.flow @@ -6,12 +6,11 @@ declare module "debug" { declare export default (namespace: string) => (formatter: string, ...args: any[]) => void; } -declare module "resolve" { - declare export default { - (string, {| basedir: string |}, (err: ?Error, res: string) => void): void; - sync: (string, {| basedir: string |}) => string; - }; -} +declare var require: { + resolve(specifier: string, opts?: { + paths: string[] + }): string, +}; declare module "json5" { declare export default { diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 0b6347318869..bb4db25349da 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -56,7 +56,6 @@ "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, diff --git a/packages/babel-core/src/config/files/configuration.js b/packages/babel-core/src/config/files/configuration.js index 3107786cf3d8..8a3bed914fab 100644 --- a/packages/babel-core/src/config/files/configuration.js +++ b/packages/babel-core/src/config/files/configuration.js @@ -17,7 +17,6 @@ import type { FilePackageData, RelativeConfig, ConfigFile } from "./types"; import type { CallerMetadata } from "../validation/options"; import * as fs from "../../gensync-utils/fs"; -import resolve from "../../gensync-utils/resolve"; const debug = buildDebug("babel:config:loading:files:configuration"); @@ -136,7 +135,7 @@ export function* loadConfig( envName: string, caller: CallerMetadata | void, ): Handler { - const filepath = yield* resolve(name, { basedir: dirname }); + const filepath = require.resolve(name, { paths: [dirname] }); const conf = yield* readConfig(filepath, envName, caller); if (!conf) { diff --git a/packages/babel-core/src/config/files/plugins.js b/packages/babel-core/src/config/files/plugins.js index 47cfa8645003..298843e2d609 100644 --- a/packages/babel-core/src/config/files/plugins.js +++ b/packages/babel-core/src/config/files/plugins.js @@ -5,7 +5,6 @@ */ import buildDebug from "debug"; -import resolve from "resolve"; import path from "path"; const debug = buildDebug("babel:config:loading:files:plugins"); @@ -96,14 +95,18 @@ function resolveStandardizedName( const standardizedName = standardizeName(type, name); try { - return resolve.sync(standardizedName, { basedir: dirname }); + return require.resolve(standardizedName, { + paths: [dirname], + }); } catch (e) { if (e.code !== "MODULE_NOT_FOUND") throw e; if (standardizedName !== name) { let resolvedOriginal = false; try { - resolve.sync(name, { basedir: dirname }); + require.resolve(name, { + paths: [dirname], + }); resolvedOriginal = true; } catch {} @@ -114,8 +117,8 @@ function resolveStandardizedName( let resolvedBabel = false; try { - resolve.sync(standardizeName(type, "@babel/" + name), { - basedir: dirname, + require.resolve(standardizeName(type, "@babel/" + name), { + paths: [dirname], }); resolvedBabel = true; } catch {} @@ -127,7 +130,9 @@ function resolveStandardizedName( let resolvedOppositeType = false; const oppositeType = type === "preset" ? "plugin" : "preset"; try { - resolve.sync(standardizeName(oppositeType, name), { basedir: dirname }); + require.resolve(standardizeName(oppositeType, name), { + paths: [dirname], + }); resolvedOppositeType = true; } catch {} diff --git a/packages/babel-core/src/gensync-utils/resolve.js b/packages/babel-core/src/gensync-utils/resolve.js deleted file mode 100644 index d16f6e7c4b2c..000000000000 --- a/packages/babel-core/src/gensync-utils/resolve.js +++ /dev/null @@ -1,9 +0,0 @@ -// @flow - -import resolve from "resolve"; -import gensync from "gensync"; - -export default gensync<[string, {| basedir: string |}], string>({ - sync: resolve.sync, - errback: resolve, -}); diff --git a/packages/babel-core/test/api.js b/packages/babel-core/test/api.js index bf714bc6e9f5..9e04d85a623a 100644 --- a/packages/babel-core/test/api.js +++ b/packages/babel-core/test/api.js @@ -144,13 +144,13 @@ describe("parser and generator options", function () { describe("api", function () { it("exposes the resolvePlugin method", function () { expect(() => babel.resolvePlugin("nonexistent-plugin")).toThrow( - /Cannot find module 'babel-plugin-nonexistent-plugin'/, + /Cannot resolve module 'babel-plugin-nonexistent-plugin'/, ); }); it("exposes the resolvePreset method", function () { expect(() => babel.resolvePreset("nonexistent-preset")).toThrow( - /Cannot find module 'babel-preset-nonexistent-preset'/, + /Cannot resolve module 'babel-preset-nonexistent-preset'/, ); }); diff --git a/packages/babel-core/test/resolution.js b/packages/babel-core/test/resolution.js index 7ec7a628ef24..aa0db96736f8 100644 --- a/packages/babel-core/test/resolution.js +++ b/packages/babel-core/test/resolution.js @@ -344,7 +344,7 @@ describe("addon resolution", function () { presets: ["foo"], }); }).toThrow( - /Cannot find module 'babel-preset-foo'.*\n- If you want to resolve "foo", use "module:foo"/, + /Cannot resolve module 'babel-preset-foo'.*\n- If you want to resolve "foo", use "module:foo"/, ); }); @@ -358,7 +358,7 @@ describe("addon resolution", function () { plugins: ["foo"], }); }).toThrow( - /Cannot find module 'babel-plugin-foo'.*\n- If you want to resolve "foo", use "module:foo"/, + /Cannot resolve module 'babel-plugin-foo'.*\n- If you want to resolve "foo", use "module:foo"/, ); }); @@ -372,7 +372,7 @@ describe("addon resolution", function () { presets: ["foo"], }); }).toThrow( - /Cannot find module 'babel-preset-foo'.*\n- Did you mean "@babel\/foo"\?/, + /Cannot resolve module 'babel-preset-foo'.*\n- Did you mean "@babel\/foo"\?/, ); }); @@ -386,7 +386,7 @@ describe("addon resolution", function () { plugins: ["foo"], }); }).toThrow( - /Cannot find module 'babel-plugin-foo'.*\n- Did you mean "@babel\/foo"\?/, + /Cannot resolve module 'babel-plugin-foo'.*\n- Did you mean "@babel\/foo"\?/, ); }); @@ -400,7 +400,7 @@ describe("addon resolution", function () { presets: ["testplugin"], }); }).toThrow( - /Cannot find module 'babel-preset-testplugin'.*\n- Did you accidentally pass a plugin as a preset\?/, + /Cannot resolve module 'babel-preset-testplugin'.*\n- Did you accidentally pass a plugin as a preset\?/, ); }); @@ -414,7 +414,7 @@ describe("addon resolution", function () { plugins: ["testpreset"], }); }).toThrow( - /Cannot find module 'babel-plugin-testpreset'.*\n- Did you accidentally pass a preset as a plugin\?/, + /Cannot resolve module 'babel-plugin-testpreset'.*\n- Did you accidentally pass a preset as a plugin\?/, ); }); @@ -427,7 +427,7 @@ describe("addon resolution", function () { babelrc: false, presets: ["foo"], }); - }).toThrow(/Cannot find module 'babel-preset-foo'/); + }).toThrow(/Cannot resolve module 'babel-preset-foo'/); }); it("should throw about missing plugins", function () { @@ -439,6 +439,6 @@ describe("addon resolution", function () { babelrc: false, plugins: ["foo"], }); - }).toThrow(/Cannot find module 'babel-plugin-foo'/); + }).toThrow(/Cannot resolve module 'babel-plugin-foo'/); }); }); diff --git a/packages/babel-helper-transform-fixture-test-runner/package.json b/packages/babel-helper-transform-fixture-test-runner/package.json index 4f638d5028e4..426d9318c13b 100644 --- a/packages/babel-helper-transform-fixture-test-runner/package.json +++ b/packages/babel-helper-transform-fixture-test-runner/package.json @@ -23,7 +23,6 @@ "jest-diff": "^24.8.0", "lodash": "^4.17.19", "quick-lru": "5.1.0", - "resolve": "^1.3.2", "source-map": "^0.5.0" } } diff --git a/packages/babel-helper-transform-fixture-test-runner/src/index.js b/packages/babel-helper-transform-fixture-test-runner/src/index.js index 30dc091523e1..d51755de4920 100644 --- a/packages/babel-helper-transform-fixture-test-runner/src/index.js +++ b/packages/babel-helper-transform-fixture-test-runner/src/index.js @@ -7,7 +7,6 @@ import { codeFrameColumns } from "@babel/code-frame"; import escapeRegExp from "lodash/escapeRegExp"; import * as helpers from "./helpers"; import merge from "lodash/merge"; -import resolve from "resolve"; import assert from "assert"; import fs from "fs"; import path from "path"; @@ -107,8 +106,8 @@ function runModuleInTestContext( context: Context, moduleCache: Object, ) { - const filename = resolve.sync(id, { - basedir: path.dirname(relativeFilename), + const filename = require.resolve(id, { + paths: [path.dirname(relativeFilename)], }); // Expose Node-internal modules if the tests want them. Note, this will not execute inside diff --git a/packages/babel-node/package.json b/packages/babel-node/package.json index 8fb76048c0e2..6f65a8823288 100644 --- a/packages/babel-node/package.json +++ b/packages/babel-node/package.json @@ -29,7 +29,6 @@ "lodash": "^4.17.19", "node-environment-flags": "^1.0.5", "regenerator-runtime": "^0.13.4", - "resolve": "^1.13.1", "v8flags": "^3.1.1" }, "peerDependencies": { diff --git a/packages/babel-node/src/_babel-node.js b/packages/babel-node/src/_babel-node.js index 93812e6f07f6..0ef8c0a09595 100644 --- a/packages/babel-node/src/_babel-node.js +++ b/packages/babel-node/src/_babel-node.js @@ -8,7 +8,6 @@ import vm from "vm"; import "core-js/stable"; import "regenerator-runtime/runtime"; import register from "@babel/register"; -import resolve from "resolve"; import pkg from "../package.json"; @@ -209,8 +208,8 @@ if (program.eval || program.print) { // We have to handle require ourselves, as we want to require it in the context of babel-register function requireArgs() { if (program.require) { - require(resolve.sync(program.require, { - basedir: process.cwd(), + require(require.resolve(program.require, { + paths: [process.cwd()], })); } } diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-10339/exec.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-10339/exec.js index 9073078104c7..f8b3f6b3699f 100644 --- a/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-10339/exec.js +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/general/issue-10339/exec.js @@ -15,7 +15,7 @@ let functionPath; transform(code, { configFile: false, plugins: [ - "../../../../lib", + __dirname + "/../../../../lib", { post({ path }) { programPath = path; diff --git a/packages/babel-plugin-transform-runtime/package.json b/packages/babel-plugin-transform-runtime/package.json index a37b8553090c..1898914c9c7a 100644 --- a/packages/babel-plugin-transform-runtime/package.json +++ b/packages/babel-plugin-transform-runtime/package.json @@ -22,7 +22,6 @@ "dependencies": { "@babel/helper-module-imports": "workspace:^7.12.1", "@babel/helper-plugin-utils": "workspace:^7.10.4", - "resolve": "^1.8.1", "semver": "^5.5.1" }, "peerDependencies": { diff --git a/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.js b/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.js index 911d8e719bc2..c7a9c09d9228 100644 --- a/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.js +++ b/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.js @@ -1,5 +1,4 @@ import path from "path"; -import resolve from "resolve"; export default function (moduleName, dirname, absoluteRuntime) { if (absoluteRuntime === false) return moduleName; @@ -13,7 +12,9 @@ export default function (moduleName, dirname, absoluteRuntime) { function resolveAbsoluteRuntime(moduleName: string, dirname: string) { try { return path - .dirname(resolve.sync(`${moduleName}/package.json`, { basedir: dirname })) + .dirname( + require.resolve(`${moduleName}/package.json`, { paths: [dirname] }), + ) .replace(/\\/g, "/"); } catch (err) { if (err.code !== "MODULE_NOT_FOUND") throw err; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-proposals/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-proposals/output.js index 7e7c2b7b5559..6ce2d805f7b2 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-proposals/output.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-proposals/output.js @@ -1,6 +1,6 @@ -var _regeneratorRuntime = require("/node_modules/@babel/runtime-corejs3/regenerator"); +var _regeneratorRuntime = require("/packages/babel-runtime-corejs3/regenerator"); -var _mapInstanceProperty = require("/node_modules/@babel/runtime-corejs3/core-js/instance/map"); +var _mapInstanceProperty = require("/packages/babel-runtime-corejs3/core-js/instance/map"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(makeIterator); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-stable/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-stable/output.js index 923997b7ffd5..436be8baaefe 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-stable/output.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true-corejs3-stable/output.js @@ -1,6 +1,6 @@ -var _regeneratorRuntime = require("/node_modules/@babel/runtime-corejs3/regenerator"); +var _regeneratorRuntime = require("/packages/babel-runtime-corejs3/regenerator"); -var _mapInstanceProperty = require("/node_modules/@babel/runtime-corejs3/core-js-stable/instance/map"); +var _mapInstanceProperty = require("/packages/babel-runtime-corejs3/core-js-stable/instance/map"); var _marked = /*#__PURE__*/_regeneratorRuntime.mark(makeIterator); diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js index e783188c9e48..e1b6927ae714 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/absoluteRuntime/true/output.js @@ -1,4 +1,4 @@ -var _classCallCheck = require("/packages/babel-plugin-transform-runtime/node_modules/@babel/runtime/helpers/classCallCheck"); +var _classCallCheck = require("/packages/babel-runtime/helpers/classCallCheck"); let Foo = function Foo() { "use strict"; diff --git a/packages/babel-plugin-transform-runtime/test/fixtures/windows/absoluteRuntime/output.js b/packages/babel-plugin-transform-runtime/test/fixtures/windows/absoluteRuntime/output.js index 323f1271c204..dded9de0698a 100644 --- a/packages/babel-plugin-transform-runtime/test/fixtures/windows/absoluteRuntime/output.js +++ b/packages/babel-plugin-transform-runtime/test/fixtures/windows/absoluteRuntime/output.js @@ -1,4 +1,4 @@ -var _asyncToGenerator = require("/packages/babel-plugin-transform-runtime/node_modules/@babel/runtime/helpers/asyncToGenerator"); +var _asyncToGenerator = require("/packages/babel-runtime/helpers/asyncToGenerator"); function test() { return _test.apply(this, arguments); diff --git a/packages/babel-plugin-transform-typeof-symbol/package.json b/packages/babel-plugin-transform-typeof-symbol/package.json index 964ca75741d2..518efca5bed0 100644 --- a/packages/babel-plugin-transform-typeof-symbol/package.json +++ b/packages/babel-plugin-transform-typeof-symbol/package.json @@ -26,7 +26,6 @@ "@babel/helper-plugin-test-runner": "workspace:*", "@babel/runtime": "workspace:*", "@babel/runtime-corejs2": "workspace:*", - "@babel/runtime-corejs3": "workspace:*", - "resolve": "^1.15.0" + "@babel/runtime-corejs3": "workspace:*" } } diff --git a/packages/babel-plugin-transform-typeof-symbol/test/helper.spec.js b/packages/babel-plugin-transform-typeof-symbol/test/helper.spec.js index 9a89884a3c5f..74f6b1379230 100644 --- a/packages/babel-plugin-transform-typeof-symbol/test/helper.spec.js +++ b/packages/babel-plugin-transform-typeof-symbol/test/helper.spec.js @@ -1,13 +1,8 @@ import * as babel from "@babel/core"; -import resolvePath from "resolve"; import fs from "fs"; import transformTypeofSymbol from ".."; -const resolve = path => - new Promise((resolve, reject) => - resolvePath(path, (err, path) => (err ? reject(err) : resolve(path))), - ); const readFile = path => new Promise((resolve, reject) => fs.readFile(path, "utf8", (err, contents) => { @@ -28,7 +23,7 @@ describe("@babel/plugin-transform-typeof-symbol", () => { `( "shouldn't transpile the $type $runtime helper", async ({ type, runtime }) => { - const path = await resolve( + const path = require.resolve( `${runtime}/helpers${type === "esm" ? "/esm/" : "/"}typeof`, ); const src = await readFile(path); diff --git a/yarn.lock b/yarn.lock index 1b996f6633bd..949e0f78e4e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -141,7 +141,6 @@ __metadata: gensync: ^1.0.0-beta.1 json5: ^2.1.2 lodash: ^4.17.19 - resolve: ^1.3.2 semver: ^5.4.1 source-map: ^0.5.0 languageName: unknown @@ -756,7 +755,6 @@ __metadata: jest-diff: ^24.8.0 lodash: ^4.17.19 quick-lru: 5.1.0 - resolve: ^1.3.2 source-map: ^0.5.0 languageName: unknown linkType: soft @@ -872,7 +870,6 @@ __metadata: make-dir: ^2.1.0 node-environment-flags: ^1.0.5 regenerator-runtime: ^0.13.4 - resolve: ^1.13.1 rimraf: ^3.0.0 v8flags: ^3.1.1 peerDependencies: @@ -2665,7 +2662,6 @@ __metadata: "@babel/template": "workspace:*" "@babel/types": "workspace:*" make-dir: ^2.1.0 - resolve: ^1.8.1 semver: ^5.5.1 peerDependencies: "@babel/core": ^7.0.0-0 @@ -2801,7 +2797,6 @@ __metadata: "@babel/runtime": "workspace:*" "@babel/runtime-corejs2": "workspace:*" "@babel/runtime-corejs3": "workspace:*" - resolve: ^1.15.0 peerDependencies: "@babel/core": ^7.0.0-0 languageName: unknown @@ -11628,7 +11623,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.13.1, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1": +"resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1": version: 1.18.1 resolution: "resolve@npm:1.18.1" dependencies: @@ -11638,7 +11633,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.4#builtin, resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.1.7#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.11.0#builtin, resolve@patch:resolve@^1.13.1#builtin, resolve@patch:resolve@^1.15.0#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.3.2#builtin, resolve@patch:resolve@^1.4.0#builtin, resolve@patch:resolve@^1.8.1#builtin": +"resolve@patch:resolve@^1.1.4#builtin, resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.1.7#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.11.0#builtin, resolve@patch:resolve@^1.13.1#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.3.2#builtin, resolve@patch:resolve@^1.4.0#builtin, resolve@patch:resolve@^1.8.1#builtin": version: 1.18.1 resolution: "resolve@patch:resolve@npm%3A1.18.1#builtin::version=1.18.1&hash=3388aa" dependencies: