From 56bf634fa9721832b605dd91ced5329e0329a8f8 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Tue, 30 Apr 2024 23:41:29 -0400 Subject: fix(node): require.resolve - fallback to global cache when bare specifier from paths not found (#23618) Part of #22607 (probably closes it, but I haven't done thorough testing) Makes it so that `require.resolve` with `paths` specified will fallback to using the global cache when the paths can't be found when using a global cache (not when using a node_modules folder) --- ext/node/polyfills/01_require.js | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) (limited to 'ext/node') diff --git a/ext/node/polyfills/01_require.js b/ext/node/polyfills/01_require.js index 27c10bf58..efde1eb79 100644 --- a/ext/node/polyfills/01_require.js +++ b/ext/node/polyfills/01_require.js @@ -265,9 +265,6 @@ function setupBuiltinModules() { } setupBuiltinModules(); -// Map used to store CJS parsing data. -const cjsParseCache = new SafeWeakMap(); - function pathDirname(filepath) { if (filepath == null) { throw new Error("Empty filepath."); @@ -286,11 +283,10 @@ const nativeModulePolyfill = new SafeMap(); const relativeResolveCache = ObjectCreate(null); let requireDepth = 0; let statCache = null; -let isPreloading = false; let mainModule = null; let hasBrokenOnInspectBrk = false; let hasInspectBrk = false; -// Are we running with --node-modules-dir flag? +// Are we running with --node-modules-dir flag or byonm? let usesLocalNodeModulesDir = false; function stat(filename) { @@ -766,9 +762,7 @@ Module._resolveFilename = function ( if (typeof options === "object" && options !== null) { if (ArrayIsArray(options.paths)) { - const isRelative = op_require_is_request_relative( - request, - ); + const isRelative = op_require_is_request_relative(request); if (isRelative) { paths = options.paths; @@ -848,6 +842,29 @@ Module._resolveFilename = function ( const err = new Error(message); err.code = "MODULE_NOT_FOUND"; err.requireStack = requireStack; + + // fallback and attempt to resolve bare specifiers using + // the global cache when not using --node-modules-dir + if ( + !usesLocalNodeModulesDir && + ArrayIsArray(options?.paths) && + request[0] !== "." && + request[0] !== "#" && + !request.startsWith("file:///") && + !op_require_is_request_relative(request) && + !op_require_path_is_absolute(request) + ) { + try { + return Module._resolveFilename(request, parent, isMain, { + ...options, + paths: undefined, + }); + } catch { + // ignore + } + } + + // throw the original error throw err; }; -- cgit v1.2.3