8000 Use `require.resolve` instead of the `resolve` package (#12439) · babel/babel@208acb1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 208acb1

Browse files
Use require.resolve instead of the resolve package (#12439)
1 parent 8478027 commit 208acb1

File tree

22 files changed

+89
-67
lines changed

22 files changed

+89
-67
lines changed

babel.config.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module.exports = function (api) {
2121
let convertESM = true;
2222
let ignoreLib = true;
2323
let includeRegeneratorRuntime = false;
24+
let polyfillRequireResolve = false;
2425

2526
let transformRuntimeOptions;
2627

@@ -53,13 +54,15 @@ module.exports = function (api) {
5354
"packages/babel-compat-data"
5455
);
5556
if (env === "rollup") envOpts.targets = { node: nodeVersion };
57+
polyfillRequireResolve = true;
5658
break;
5759
case "test-legacy": // In test-legacy environment, we build babel on latest node but test on minimum supported legacy versions
5860
case "production":
5961
// Config during builds before publish.
6062
envOpts.targets = {
6163
node: nodeVersion,
6264
};
65+
polyfillRequireResolve = true;
6366
break;
6467
case "development":
6568
envOpts.debug = true;
@@ -116,6 +119,7 @@ module.exports = function (api) {
116119

117120
convertESM ? "@babel/proposal-export-namespace-from" : null,
118121
convertESM ? "@babel/transform-modules-commonjs" : null,
122+
polyfillRequireResolve && pluginPolyfillRequireResolve,
119123
].filter(Boolean),
120124
overrides: [
121125
{
@@ -160,3 +164,43 @@ module.exports = function (api) {
160164

161165
return config;
162166
};
167+
168+
// TODO(Babel 8) This polyfill is only needed for Node.js 6 and 8
169+
function pluginPolyfillRequireResolve({ template, types: t }) {
170+
return {
171+
visitor: {
172+
MemberExpression(path) {
173+
if (!path.matchesPattern("require.resolve")) return;
174+
if (!t.isCallExpression(path.parent, { callee: path.node })) return;
175+
176+
const args = path.parent.arguments;
177+
if (args.length < 2) return;
178+
if (
179+
!t.isObjectExpression(args[1]) ||
180+
args[1].properties.length !== 1 ||
181+
!t.isIdentifier(args[1].properties[0].key, { name: "paths" }) ||
182+
!t.isArrayExpression(args[1].properties[0].value) ||
183+
args[1].properties[0].value.elements.length !== 1
184+
) {
185+
throw path.parentPath.buildCodeFrameError(
186+
"This 'require.resolve' usage is not supported by the inline polyfill."
187+
);
188+
}
189+
190+
// require.resolve's paths option has been introduced in Node.js 8.9
191+
// https://nodejs.org/api/modules.html#modules_require_resolve_request_options
192+
path.replaceWith(template.ast`
193+
parseFloat(process.versions.node) >= 8.9
194+
? require.resolve
195+
: (/* request */ r, { paths: [/* base */ b] }, M = require("module")) => {
196+
let /* filename */ f = M._findPath(r, M._nodeModulePaths(b).concat(b));
197+
if (f) return f;
198+
f = new Error(\`Cannot resolve module '\${r}'\`);
199+
f.code = "MODULE_NOT_FOUND";
200+
throw f;
201+
}
202+
`);
203+
},
204+
},
205+
};
206+
}

lib/third-party-libs.js.flow

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ declare module "debug" {
66
declare export default (namespace: string) => (formatter: string, ...args: any[]) => void;
77
}
88

9-
declare module "resolve" {
10-
declare export default {
11-
(string, {| basedir: string |}, (err: ?Error, res: string) => void): void;
12-
sync: (string, {| basedir: string |}) => string;
13-
};
14-
}
9+
declare var require: {
10+
resolve(specifier: string, opts?: {
11+
paths: string[]
12+
}): string,
13+
};
1514

1615
declare module "json5" {
1716
declare export default {

packages/babel-core/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
"gensync": "^1.0.0-beta.1",
5757
"json5": "^2.1.2",
5858
"lodash": "^4.17.19",
59-
"resolve": "^1.3.2",
6059
"semver": "^5.4.1",
6160
"source-map": "^0.5.0"
6261
},

packages/babel-core/src/config/files/configuration.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import type { FilePackageData, RelativeConfig, ConfigFile } from "./types";
1717
import type { CallerMetadata } from "../validation/options";
1818

1919
import * as fs from "../../gensync-utils/fs";
20-
import resolve from "../../gensync-utils/resolve";
2120

2221
const debug = buildDebug("babel:config:loading:files:configuration");
2322

@@ -136,7 +135,7 @@ export function* loadConfig(
136135
envName: string,
137136
caller: CallerMetadata | void,
138137
): Handler<ConfigFile> {
139-
const filepath = yield* resolve(name, { basedir: dirname });
138+
const filepath = require.resolve(name, { paths: [dirname] });
140139

141140
const conf = yield* readConfig(filepath, envName, caller);
142141
if (!conf) {

packages/babel-core/src/config/files/plugins.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66

77
import buildDebug from "debug";
8-
import resolve from "resolve";
98
import path from "path";
109

1110
const debug = buildDebug("babel:config:loading:files:plugins");
@@ -96,14 +95,18 @@ function resolveStandardizedName(
9695
const standardizedName = standardizeName(type, name);
9796

9897
try {
99-
return resolve.sync(standardizedName, { basedir: dirname });
98+
return require.resolve(standardizedName, {
99+
paths: [dirname],
100+
});
100101
} catch (e) {
101102
if (e.code !== "MODULE_NOT_FOUND") throw e;
102103

103104
if (standardizedName !== name) {
104105
let resolvedOriginal = false;
105106
try {
106-
resolve.sync(name, { basedir: dirname });
107+
require.resolve(name, {
108+
paths: [dirname],
109+
});
107110
resolvedOriginal = true;
108111
} catch {}
109112

@@ -114,8 +117,8 @@ function resolveStandardizedName(
114117

115118
let resolvedBabel = false;
116119
try {
117-
resolve.sync(standardizeName(type, "@babel/" + name), {
118-
basedir: dirname,
120+
require.resolve(standardizeName(type, "@babel/" + name), {
121+
paths: [dirname],
119122
});
120123
resolvedBabel = true;
121124
} catch {}
@@ -127,7 +130,9 @@ function resolveStandardizedName(
127130
let resolvedOppositeType = false;
128131
const oppositeType = type === "preset" ? "plugin" : "preset";
129132
try {
130-
resolve.sync(standardizeName(oppositeType, name), { basedir: dirname });
133+
require.resolve(standardizeName(oppositeType, name), {
134+
paths: [dirname],
135+
});
131136
resolvedOppositeType = true;
132137
} catch {}
133138

packages/babel-core/src/gensync-utils/resolve.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

packages/babel-core/test/api.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,13 @@ describe("parser and generator options", function () {
144144
describe("api", function () {
145145
it("exposes the resolvePlugin method", function () {
146146
expect(() => babel.resolvePlugin("nonexistent-plugin")).toThrow(
147-
/Cannot find module 'babel-plugin-nonexistent-plugin'/,
147+
/Cannot resolve module 'babel-plugin-nonexistent-plugin'/,
148148
);
149149
});
150150

151151
it("exposes the resolvePreset method", function () {
152152
expect(() => babel.resolvePreset("nonexistent-preset")).toThrow(
153-
/Cannot find module 'babel-preset-nonexistent-preset'/,
153+
/Cannot resolve module 'babel-preset-nonexistent-preset'/,
154154
);
155155
});
156156

packages/babel-core/test/resolution.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ describe("addon resolution", function () {
344344
presets: ["foo"],
345345
});
346346
}).toThrow(
347-
/Cannot find module 'babel-preset-foo'.*\n- If you want to resolve "foo", use "module:foo"/,
347+
/Cannot resolve module 'babel-preset-foo'.*\n- If you want to resolve "foo", use "module:foo"/,
348348
);
349349
});
350350

@@ -358,7 +358,7 @@ describe("addon resolution", function () {
358358
plugins: ["foo"],
359359
});
360360
}).toThrow(
361- /Cannot find module 'babel-plugin-foo'.*\n- If you want to resolve "foo", use "module:foo"/,
361+
/Cannot resolve module 'babel-plugin-foo'.*\n- If you want to resolve "foo", use "module:foo"/,
362362
);
363363
});
364364

@@ -372,7 +372,7 @@ describe("addon resolution", function () {
372372
presets: ["foo"],
373373
});
374374
}).toThrow(
375-
/Cannot find module 'babel-preset-foo'.*\n- Did you mean "@babel\/foo"\?/,
375+
/Cannot resolve module 'babel-preset-foo'.*\n- Did you mean "@babel\/foo"\?/,
376376
);
377377
});
378378

@@ -386,7 +386,7 @@ describe("addon resolution", function () {
386386
plugins: ["foo"],
387387
});
388388
}).toThrow(
389-
/Cannot find module 'babel-plugin-foo'.*\n- Did you mean "@babel\/foo"\?/,
389+
/Cannot resolve module 'babel-plugin-foo'.*\n- Did you mean "@babel\/foo"\?/,
390390
);
391391
});
392392

@@ -400,7 +400,7 @@ describe("addon resolution", function () {
400400
presets: ["testplugin"],
401401
});
402402
}).toThrow(
403-
/Cannot find module 'babel-preset-testplugin'.*\n- Did you accidentally pass a plugin as a preset\?/,
403+
/Cannot resolve module 'babel-preset-testplugin'.*\n- Did you accidentally pass a plugin as a preset\?/,
404404
);
405405
});
406406

@@ -414,7 +414,7 @@ describe("addon resolution", function () {
414414
plugins: ["testpreset"],
415415
});
416416
}).toThrow(
417-
/Cannot find module 'babel-plugin-testpreset'.*\n- Did you accidentally pass a preset as a plugin\?/,
417+
/Cannot resolve module 'babel-plugin-testpreset'.*\n- Did you accidentally pass a preset as a plugin\?/,
418418
);
419419
});
420420

@@ -427,7 +427,7 @@ describe("addon resolution", function () {
427427
babelrc: false,
428428
presets: ["foo"],
429429
});
430-
}).toThrow(/Cannot find module 'babel-preset-foo'/);
430+
}).toThrow(/Cannot resolve module 'babel-preset-foo'/);
431431
});
432432

433433
it("should throw about missing plugins", function () {
@@ -439,6 +439,6 @@ describe("addon resolution", function () {
439439
babelrc: false,
440440
plugins: ["foo"],
441441
});
442-
}).toThrow(/Cannot find module 'babel-plugin-foo'/);
442+
}).toThrow(/Cannot resolve module 'babel-plugin-foo'/);
443443
});
444444
});

packages/babel-helper-transform-fixture-test-runner/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"jest-diff": "^24.8.0",
2424
"lodash": "^4.17.19",
2525
"quick-lru": "5.1.0",
26-
"resolve": "^1.3.2",
2726
"source-map": "^0.5.0"
2827
}
2928
}

packages/babel-helper-transform-fixture-test-runner/src/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { codeFrameColumns } from "@babel/code-frame";
77
import escapeRegExp from "lodash/escapeRegExp";
88
import * as helpers from "./helpers";
99
import merge from "lodash/merge";
10-
import resolve from "resolve";
1110
import assert from "assert";
1211
import fs from "fs";
1312
import path from "path";
@@ -107,8 +106,8 @@ function runModuleInTestContext(
107106
context: Context,
108107
moduleCache: Object,
109108
) {
110-
const filename = resolve.sync(id, {
111-
basedir: path.dirname(relativeFilename),
109+
const filename = require.resolve(id, {
110+
paths: [path.dirname(relativeFilename)],
112111
});
113112

114113
// Expose Node-internal modules if the tests want them. Note, this will not execute inside

0 commit comments

Comments
 (0)
0