Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ const {
findCodegenEnabledLibraries,
pkgJsonIncludesGeneratedCode,
readPkgJsonInDirectory,
readReactNativeConfig,
findDisabledLibrariesByPlatform,
} = require('./utils');
const path = require('path');

Expand Down Expand Up @@ -83,9 +85,14 @@ function execute(
buildCodegenIfNeeded();
}

const libraries = findCodegenEnabledLibraries(pkgJson, projectRoot);
const reactNativeConfig = readReactNativeConfig(projectRoot);
const codegenEnabledLibraries = findCodegenEnabledLibraries(
pkgJson,
projectRoot,
reactNativeConfig,
);

if (libraries.length === 0) {
if (codegenEnabledLibraries.length === 0) {
codegenLog('No codegen-enabled libraries found.', true);
return;
}
Expand All @@ -94,6 +101,18 @@ function execute(
targetPlatform === 'all' ? supportedPlatforms : [targetPlatform];

for (const platform of platforms) {
const disabledLibraries = findDisabledLibrariesByPlatform(
reactNativeConfig,
platform,
);
const libraries = codegenEnabledLibraries.filter(
({name}) => !disabledLibraries.includes(name),
);

if (!libraries.length) {
continue;
}

const outputPath = computeOutputPath(
projectRoot,
baseOutputPath,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,18 +94,28 @@ function cleanupEmptyFilesAndFolders(filepath) {
}
}

function readReactNativeConfig(projectRoot) {
const rnConfigFilePath = path.resolve(projectRoot, 'react-native.config.js');

if (!fs.existsSync(rnConfigFilePath)) {
return {};
}

return require(rnConfigFilePath);
}

/**
* Finding libraries!
*/
function findCodegenEnabledLibraries(pkgJson, projectRoot) {
function findCodegenEnabledLibraries(pkgJson, projectRoot, reactNativeConfig) {
const projectLibraries = findProjectRootLibraries(pkgJson, projectRoot);
if (pkgJsonIncludesGeneratedCode(pkgJson)) {
return projectLibraries;
} else {
return [
...projectLibraries,
...findExternalLibraries(pkgJson, projectRoot),
...findLibrariesFromReactNativeConfig(projectRoot),
...findLibrariesFromReactNativeConfig(projectRoot, reactNativeConfig),
];
}
}
Expand All @@ -128,22 +138,13 @@ function findProjectRootLibraries(pkgJson, projectRoot) {
return extractLibrariesFromJSON(pkgJson, projectRoot);
}

function findLibrariesFromReactNativeConfig(projectRoot) {
const rnConfigFileName = 'react-native.config.js';

function findLibrariesFromReactNativeConfig(projectRoot, rnConfig) {
codegenLog(
`Searching for codegen-enabled libraries in ${rnConfigFileName}`,
`Searching for codegen-enabled libraries in react-native.config.js`,
true,
);

const rnConfigFilePath = path.resolve(projectRoot, rnConfigFileName);

if (!fs.existsSync(rnConfigFilePath)) {
return [];
}
const rnConfig = require(rnConfigFilePath);

if (rnConfig.dependencies == null) {
if (!rnConfig.dependencies) {
return [];
}
return Object.keys(rnConfig.dependencies).flatMap(name => {
Expand Down Expand Up @@ -366,6 +367,19 @@ function getLibraryName(library) {
).name;
}

/**
* Finds all disabled libraries by platform based the react native config.
*
* This is needed when selectively disabling libraries in react-native.config.js since codegen should exclude those libraries as well.
*/
function findDisabledLibrariesByPlatform(reactNativeConfig, platform) {
const dependencies = reactNativeConfig.dependencies ?? {};

return Object.keys(dependencies).filter(
dependency => dependencies[dependency].platforms?.[platform] === null,
);
}

module.exports = {
buildCodegenIfNeeded,
pkgJsonIncludesGeneratedCode,
Expand All @@ -377,4 +391,6 @@ module.exports = {
findProjectRootLibraries,
extractLibrariesFromJSON,
parseiOSAnnotations,
readReactNativeConfig,
findDisabledLibrariesByPlatform,
};