From 981315521d908447c3784129487bd95ce07650e1 Mon Sep 17 00:00:00 2001 From: Riccardo Cipolleschi Date: Tue, 15 Oct 2024 08:13:14 -0700 Subject: [PATCH] Codegen fails with Local Module (#47027) Summary: While I was writing the documentation for extracting a module in a library, I realized that Codegen ignored the local node modules. The reason is that `require.resolve` fails to resolve a local path. ## Changelog [General][Fixed] - Make Codegen work with local modules Reviewed By: cortinico Differential Revision: D64242713 --- .../codegen/generate-artifacts-executor.js | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/react-native/scripts/codegen/generate-artifacts-executor.js b/packages/react-native/scripts/codegen/generate-artifacts-executor.js index bfb5463d2149..8e89bf0007ff 100644 --- a/packages/react-native/scripts/codegen/generate-artifacts-executor.js +++ b/packages/react-native/scripts/codegen/generate-artifacts-executor.js @@ -254,17 +254,29 @@ function findExternalLibraries(pkgJson, projectRoot) { ); // Handle third-party libraries return Object.keys(dependencies).flatMap(dependency => { + let configFilePath = ''; try { - const configFilePath = require.resolve( - path.join(dependency, 'package.json'), - {paths: [projectRoot]}, - ); - const configFile = JSON.parse(fs.readFileSync(configFilePath)); - const codegenConfigFileDir = path.dirname(configFilePath); - return extractLibrariesFromJSON(configFile, codegenConfigFileDir); + configFilePath = require.resolve(path.join(dependency, 'package.json'), { + paths: [projectRoot], + }); } catch (e) { - return []; + // require.resolve fails if the dependency is a local node module. + if ( + dependencies[dependency].startsWith('.') || // handles relative paths + dependencies[dependency].startsWith('/') // handles absolute paths + ) { + configFilePath = path.join( + projectRoot, + pkgJson.dependencies[dependency], + 'package.json', + ); + } else { + return []; + } } + const configFile = JSON.parse(fs.readFileSync(configFilePath)); + const codegenConfigFileDir = path.dirname(configFilePath); + return extractLibrariesFromJSON(configFile, codegenConfigFileDir); }); }