From 1f49b46ea8929480c988ea22e3b1135afa49abf3 Mon Sep 17 00:00:00 2001 From: Andrei Alecu Date: Tue, 19 Oct 2021 13:48:58 +0300 Subject: [PATCH 1/2] fix(utils): Fix `loadModule` when using PnP Fixes #4076 --- packages/utils/src/node.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/utils/src/node.ts b/packages/utils/src/node.ts index 18d29fc3144f..c694ffe4942c 100644 --- a/packages/utils/src/node.ts +++ b/packages/utils/src/node.ts @@ -39,6 +39,19 @@ export function dynamicRequire(mod: any, request: string): any { export function loadModule(moduleName: string): T | undefined { let mod: T | undefined; + try { + if (require.main) { + const { createRequire } = dynamicRequire(module, 'module'); + const req = createRequire(require.main.filename); + mod = req(moduleName); + if (mod) { + return mod; + } + } + } catch (e) { + // no-empty + } + try { mod = dynamicRequire(module, moduleName); } catch (e) { From 3f9ceabcce56a2b4de6f3f29a49dbd2a16a1cecd Mon Sep 17 00:00:00 2001 From: Andrei Alecu Date: Thu, 28 Oct 2021 12:04:08 +0300 Subject: [PATCH 2/2] fixup! fix(utils): Fix `loadModule` when using PnP --- packages/utils/src/node.ts | 36 ++++-------------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/packages/utils/src/node.ts b/packages/utils/src/node.ts index c694ffe4942c..d7a58204f974 100644 --- a/packages/utils/src/node.ts +++ b/packages/utils/src/node.ts @@ -25,45 +25,17 @@ export function dynamicRequire(mod: any, request: string): any { /** * Helper for dynamically loading module that should work with linked dependencies. - * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))` + * This is equivalent of using `require(require.resolve(moduleName, { paths: [cwd()] }))` * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during - * build time. `require.resolve` is also not available in any other way, so we cannot create, - * a fake helper like we do with `dynamicRequire`. - * - * We always prefer to use local package, thus the value is not returned early from each `try/catch` block. - * That is to mimic the behavior of `require.resolve` exactly. + * build time. * * @param moduleName module name to require * @returns possibly required module */ export function loadModule(moduleName: string): T | undefined { - let mod: T | undefined; - - try { - if (require.main) { - const { createRequire } = dynamicRequire(module, 'module'); - const req = createRequire(require.main.filename); - mod = req(moduleName); - if (mod) { - return mod; - } - } - } catch (e) { - // no-empty - } - try { - mod = dynamicRequire(module, moduleName); + return dynamicRequire(require.main, moduleName); } catch (e) { - // no-empty + return undefined; } - - try { - const { cwd } = dynamicRequire(module, 'process'); - mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) as T; - } catch (e) { - // no-empty - } - - return mod; }