Skip to content

Commit

Permalink
Introduce "codegenConfig.isLibrary" property (facebook#41655)
Browse files Browse the repository at this point in the history
Summary:

This diff adds support for checked-in codegen artifacts for libraries.
It introduces a new property to `coegenConfig`, called `isLibrary`. If codegen sees `isLibrary: true` in a project's dependency, it assumes that the library has codegen artifacts in it, and will not generate any code.

Changelog: [General][Added] - Introduce "codegenConfig.isLibrary" property.

Reviewed By: cipolleschi

Differential Revision: D51207265
  • Loading branch information
dmytrorykun authored and facebook-github-bot committed Dec 15, 2023
1 parent d45a01d commit 7f3646e
Showing 1 changed file with 38 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ const REACT_NATIVE = 'react-native';

// HELPERS

function isLibrary(pkgJson) {
return pkgJson.codegenConfig && pkgJson.codegenConfig.isLibrary;
}

function isReactNativeCoreLibrary(libraryName) {
return libraryName in CORE_LIBRARIES_WITH_OUTPUT_FOLDER;
}
Expand Down Expand Up @@ -195,7 +199,12 @@ function computeOutputPath(projectRoot, baseOutputPath, pkgJson) {
baseOutputPath = projectRoot;
}
}
return path.join(baseOutputPath, 'build', 'generated', 'ios');
if (isLibrary(pkgJson)) {
// Don't create nested directories for libraries to make importing generated headers easier.
return baseOutputPath;
} else {
return path.join(baseOutputPath, 'build', 'generated', 'ios');
}
}

function generateSchemaInfo(library) {
Expand Down Expand Up @@ -260,6 +269,16 @@ function needsThirdPartyComponentProvider(schemaInfo) {
return !isReactNativeCoreLibrary(schemaInfo.library.config.name);
}

function mustGenerateNativeCode(includeLibraryPath, schemaInfo) {
// If library's 'codegenConfig' sets 'isLibrary' to 'true',
// then we assume that native code is shipped with the library,
// and we don't need to generate it.
return (
schemaInfo.library.libraryPath === includeLibraryPath ||
!schemaInfo.library.config.isLibrary
);
}

function createComponentProvider(schemas) {
console.log('\n\n>>>>> Creating component provider');
const outputDir = path.join(
Expand All @@ -281,10 +300,12 @@ function createComponentProvider(schemas) {
}

function findCodegenEnabledLibraries(pkgJson, projectRoot) {
return [
...findExternalLibraries(pkgJson),
...findProjectRootLibraries(pkgJson, projectRoot),
];
const projectLibraries = findProjectRootLibraries(pkgJson, projectRoot);
if (isLibrary(pkgJson)) {
return projectLibraries;
} else {
return [...projectLibraries, ...findExternalLibraries(pkgJson)];
}
}

// It removes all the empty files and empty folders
Expand Down Expand Up @@ -355,12 +376,19 @@ function execute(projectRoot, baseOutputPath) {
const outputPath = computeOutputPath(projectRoot, baseOutputPath, pkgJson);

const schemaInfos = generateSchemaInfos(libraries);
generateNativeCode(outputPath, schemaInfos);
generateNativeCode(
outputPath,
schemaInfos.filter(schemaInfo =>
mustGenerateNativeCode(projectRoot, schemaInfo),
),
);

const schemas = schemaInfos
.filter(needsThirdPartyComponentProvider)
.map(schemaInfo => schemaInfo.schema);
createComponentProvider(schemas);
if (!isLibrary(pkgJson)) {
const schemas = schemaInfos
.filter(needsThirdPartyComponentProvider)
.map(schemaInfo => schemaInfo.schema);
createComponentProvider(schemas);
}
cleanupEmptyFilesAndFolders(outputPath);
} catch (err) {
console.error(err);
Expand Down

0 comments on commit 7f3646e

Please sign in to comment.