Break Circular Dependency between React-Codegen and React-Fabric (#36210)

Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/36210

One of the circular dependencies we have in OSS was between React-Codegen and React-Fabric.

React-Codegen generates component which has to depends on React-Fabric because they need to use the files contained in the `react/renderer/view` folder.

React-Fabric contains some components that depends on RNCore, which was generated inside the React-Codegen folder.

This change generates the RNCore components inside the `ReactCommon/react/renderer/components/rncore` folder, breaking the dependency as `rncore` folder is now contained by React-Fabric itself.

**Fun Fact:** That's how it always should have been. There was already a line in the `.gitignore` to exclude the content of `ReactCommon/react/renderer/components/rncore` folder. I guess that with some of the refactoring/previous projects on Codegen, this requirements has slipped.

## Changelog:
[iOS][Breaking] -  generates RNCore components inside the ReactCommon folder and create a new pod for platform-specific ImageManager classes

Reviewed By: sammy-SC, dmytrorykun

Differential Revision: D43304641

fbshipit-source-id: ebb5033ce73dbcd03f880c3e204511fdce04b816
This commit is contained in:
Riccardo Cipolleschi
2023-02-20 11:50:10 -08:00
committed by Facebook GitHub Bot
parent 6d34952420
commit 5d175c6775
16 changed files with 130 additions and 38 deletions
@@ -25,13 +25,16 @@ const RN_ROOT = path.join(__dirname, '../..');
const CODEGEN_DEPENDENCY_NAME = '@react-native/codegen';
const CODEGEN_REPO_PATH = `${RN_ROOT}/packages/react-native-codegen`;
const CODEGEN_NPM_PATH = `${RN_ROOT}/../${CODEGEN_DEPENDENCY_NAME}`;
const CORE_LIBRARIES = new Set(['rncore', 'FBReactNativeSpec']);
const CORE_LIBRARIES_WITH_OUTPUT_FOLDER = {
rncore: path.join(RN_ROOT, 'ReactCommon'),
FBReactNativeSpec: null,
};
const REACT_NATIVE_DEPENDENCY_NAME = 'react-native';
// HELPERS
function isReactNativeCoreLibrary(libraryName) {
return CORE_LIBRARIES.has(libraryName);
return libraryName in CORE_LIBRARIES_WITH_OUTPUT_FOLDER;
}
function executeNodeScript(node, script) {
@@ -273,7 +276,6 @@ function handleInAppLibraries(
}
// CodeGen
function getCodeGenCliPath() {
let codegenCliPath;
if (fs.existsSync(CODEGEN_REPO_PATH)) {
@@ -345,8 +347,10 @@ function generateCode(iosOutputDir, library, tmpDir, node, pathToSchema) {
);
// Finally, copy artifacts to the final output directory.
fs.mkdirSync(iosOutputDir, {recursive: true});
execSync(`cp -R ${tmpOutputDir}/* ${iosOutputDir}`);
const outputDir =
CORE_LIBRARIES_WITH_OUTPUT_FOLDER[library.config.name] ?? iosOutputDir;
fs.mkdirSync(outputDir, {recursive: true});
execSync(`cp -R ${tmpOutputDir}/* ${outputDir}`);
console.log(`[Codegen] Generated artifacts: ${iosOutputDir}`);
}