diff --git a/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js b/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js index 6e49f106225..7a16802296a 100644 --- a/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js +++ b/packages/react-native/scripts/codegen/__tests__/generate-artifacts-executor-test.js @@ -83,24 +83,16 @@ describe('generateCode', () => { describe('extractLibrariesFromJSON', () => { it('throws if in react-native and no dependencies found', () => { - let libraries = []; let configFile = {}; expect(() => { - underTest._extractLibrariesFromJSON( - configFile, - libraries, - codegenConfigKey, - ); + underTest._extractLibrariesFromJSON(configFile, codegenConfigKey); }).toThrow(); }); it('it skips if not into react-native and no dependencies found', () => { - let libraries = []; let configFile = {}; - - underTest._extractLibrariesFromJSON( + let libraries = underTest._extractLibrariesFromJSON( configFile, - libraries, codegenConfigKey, 'some-node-module', 'node_modules/some', @@ -109,11 +101,9 @@ describe('extractLibrariesFromJSON', () => { }); it('extracts a single dependency when config has no libraries', () => { - let libraries = []; let configFile = fixtures.noLibrariesConfigFile; - underTest._extractLibrariesFromJSON( + let libraries = underTest._extractLibrariesFromJSON( configFile, - libraries, codegenConfigKey, 'my-app', '.', @@ -131,11 +121,9 @@ describe('extractLibrariesFromJSON', () => { it("extract codegenConfig when it's empty", () => { const configFile = {codegenConfig: {libraries: []}}; - let libraries = []; - underTest._extractLibrariesFromJSON( + let libraries = underTest._extractLibrariesFromJSON( configFile, codegenConfigKey, - libraries, reactNativeDependencyName, rootPath, ); @@ -144,10 +132,8 @@ describe('extractLibrariesFromJSON', () => { it('extract codegenConfig when dependency is one', () => { const configFile = fixtures.singleLibraryCodegenConfig; - let libraries = []; - underTest._extractLibrariesFromJSON( + let libraries = underTest._extractLibrariesFromJSON( configFile, - libraries, codegenConfigKey, reactNativeDependencyName, rootPath, @@ -167,10 +153,8 @@ describe('extractLibrariesFromJSON', () => { const configFile = fixtures.multipleLibrariesCodegenConfig; const myDependency = 'my-dependency'; const myDependencyPath = path.join(__dirname, myDependency); - let libraries = []; - underTest._extractLibrariesFromJSON( + let libraries = underTest._extractLibrariesFromJSON( configFile, - libraries, codegenConfigKey, myDependency, myDependencyPath, diff --git a/packages/react-native/scripts/codegen/generate-artifacts-executor.js b/packages/react-native/scripts/codegen/generate-artifacts-executor.js index 9cce4ffab73..9f925f1e29e 100644 --- a/packages/react-native/scripts/codegen/generate-artifacts-executor.js +++ b/packages/react-native/scripts/codegen/generate-artifacts-executor.js @@ -104,21 +104,18 @@ function printDeprecationWarningIfNeeded(dependency) { function extractLibrariesFromConfigurationArray( configFile, codegenConfigKey, - libraries, dependencyPath, ) { - configFile[codegenConfigKey].libraries.forEach(config => { - const libraryConfig = { + return configFile[codegenConfigKey].libraries.map(config => { + return { config, libraryPath: dependencyPath, }; - libraries.push(libraryConfig); }); } function extractLibrariesFromJSON( configFile, - libraries, codegenConfigKey, dependency, dependencyPath, @@ -136,29 +133,29 @@ function extractLibrariesFromJSON( if (isBlocking) { throw `[Codegen] Error: Could not find codegen config for ${dependency} .`; } - return; + return []; } console.log(`[Codegen] Found ${dependency}`); if (configFile[codegenConfigKey].libraries == null) { var config = configFile[codegenConfigKey]; - libraries.push({ - config, - libraryPath: dependencyPath, - }); + return [ + { + config, + libraryPath: dependencyPath, + }, + ]; } else { printDeprecationWarningIfNeeded(dependency); - extractLibrariesFromConfigurationArray( + return extractLibrariesFromConfigurationArray( configFile, codegenConfigKey, - libraries, dependencyPath, ); } } function handleReactNativeCoreLibraries( - libraries, codegenConfigFilename, codegenConfigKey, ) { @@ -173,11 +170,10 @@ function handleReactNativeCoreLibraries( throw '[Codegen] Error: Could not find config file for react-native.'; } const reactNativeConfigFile = JSON.parse(fs.readFileSync(reactNativePkgJson)); - extractLibrariesFromJSON(reactNativeConfigFile, libraries, codegenConfigKey); + return extractLibrariesFromJSON(reactNativeConfigFile, codegenConfigKey); } function handleThirdPartyLibraries( - libraries, baseCodegenConfigFileDir, dependencies, codegenConfigFilename, @@ -192,31 +188,30 @@ function handleThirdPartyLibraries( ); // Handle third-party libraries - Object.keys(dependencies).forEach(dependency => { + return Object.keys(dependencies).flatMap(dependency => { if (dependency === REACT_NATIVE_DEPENDENCY_NAME) { // react-native should already be added. - return; + return []; } const codegenConfigFileDir = path.join(configDir, dependency); const configFilePath = path.join( codegenConfigFileDir, codegenConfigFilename, ); - if (fs.existsSync(configFilePath)) { - const configFile = JSON.parse(fs.readFileSync(configFilePath)); - extractLibrariesFromJSON( - configFile, - libraries, - codegenConfigKey, - dependency, - codegenConfigFileDir, - ); + if (!fs.existsSync(configFilePath)) { + return []; } + const configFile = JSON.parse(fs.readFileSync(configFilePath)); + return extractLibrariesFromJSON( + configFile, + codegenConfigKey, + dependency, + codegenConfigFileDir, + ); }); } function handleLibrariesFromReactNativeConfig( - libraries, codegenConfigKey, codegenConfigFilename, appRootDir, @@ -229,54 +224,51 @@ function handleLibrariesFromReactNativeConfig( const rnConfigFilePath = path.resolve(appRootDir, rnConfigFileName); - if (fs.existsSync(rnConfigFilePath)) { - const rnConfig = require(rnConfigFilePath); - - if (rnConfig.dependencies != null) { - Object.keys(rnConfig.dependencies).forEach(name => { - const dependencyConfig = rnConfig.dependencies[name]; - - if (dependencyConfig.root) { - const codegenConfigFileDir = path.resolve( - appRootDir, - dependencyConfig.root, - ); - const configFilePath = path.join( - codegenConfigFileDir, - codegenConfigFilename, - ); - const pkgJsonPath = path.join(codegenConfigFileDir, 'package.json'); - - if (fs.existsSync(configFilePath)) { - const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath)); - const configFile = JSON.parse(fs.readFileSync(configFilePath)); - extractLibrariesFromJSON( - configFile, - libraries, - codegenConfigKey, - pkgJson.name, - codegenConfigFileDir, - ); - } - } - }); - } + if (!fs.existsSync(rnConfigFilePath)) { + return []; } + const rnConfig = require(rnConfigFilePath); + + if (rnConfig.dependencies == null) { + return []; + } + return Object.keys(rnConfig.dependencies).flatMap(name => { + const dependencyConfig = rnConfig.dependencies[name]; + + if (!dependencyConfig.root) { + return []; + } + const codegenConfigFileDir = path.resolve( + appRootDir, + dependencyConfig.root, + ); + const configFilePath = path.join( + codegenConfigFileDir, + codegenConfigFilename, + ); + if (!fs.existsSync(configFilePath)) { + return []; + } + const pkgJsonPath = path.join(codegenConfigFileDir, 'package.json'); + const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath)); + const configFile = JSON.parse(fs.readFileSync(configFilePath)); + + return extractLibrariesFromJSON( + configFile, + codegenConfigKey, + pkgJson.name, + codegenConfigFileDir, + ); + }); } -function handleInAppLibraries( - libraries, - pkgJson, - codegenConfigKey, - appRootDir, -) { +function handleInAppLibraries(pkgJson, codegenConfigKey, appRootDir) { console.log( '\n\n[Codegen] >>>>> Searching for codegen-enabled libraries in the app', ); - extractLibrariesFromJSON( + return extractLibrariesFromJSON( pkgJson, - libraries, codegenConfigKey, pkgJson.name, appRootDir, @@ -433,29 +425,21 @@ function findCodegenEnabledLibraries( ) { const pkgJson = readPackageJSON(appRootDir); const dependencies = {...pkgJson.dependencies, ...pkgJson.devDependencies}; - const libraries = []; - - handleReactNativeCoreLibraries( - libraries, - codegenConfigFilename, - codegenConfigKey, - ); - handleThirdPartyLibraries( - libraries, - baseCodegenConfigFileDir, - dependencies, - codegenConfigFilename, - codegenConfigKey, - ); - handleLibrariesFromReactNativeConfig( - libraries, - codegenConfigKey, - codegenConfigFilename, - appRootDir, - ); - handleInAppLibraries(libraries, pkgJson, codegenConfigKey, appRootDir); - - return libraries; + return [ + ...handleReactNativeCoreLibraries(codegenConfigFilename, codegenConfigKey), + ...handleThirdPartyLibraries( + baseCodegenConfigFileDir, + dependencies, + codegenConfigFilename, + codegenConfigKey, + ), + ...handleLibrariesFromReactNativeConfig( + codegenConfigKey, + codegenConfigFilename, + appRootDir, + ), + ...handleInAppLibraries(pkgJson, codegenConfigKey, appRootDir), + ]; } // It removes all the empty files and empty folders