diff --git a/packages/create-react-native-library/src/index.ts b/packages/create-react-native-library/src/index.ts
index 322d910a3..cbe912091 100644
--- a/packages/create-react-native-library/src/index.ts
+++ b/packages/create-react-native-library/src/index.ts
@@ -20,7 +20,7 @@ import { createInitialGitCommit } from './utils/initialCommit';
import { prompt } from './utils/prompt';
import { resolveNpmPackageVersion } from './utils/resolveNpmPackageVersion';
-const FALLBACK_BOB_VERSION = '0.40.4';
+const FALLBACK_BOB_VERSION = '0.40.5';
const FALLBACK_NITRO_MODULES_VERSION = '0.22.1';
const SUPPORTED_REACT_NATIVE_VERSION = '0.78.2';
diff --git a/packages/react-native-builder-bob/src/targets/codegen/index.ts b/packages/react-native-builder-bob/src/targets/codegen/index.ts
index 315424733..88dd2f6d6 100644
--- a/packages/react-native-builder-bob/src/targets/codegen/index.ts
+++ b/packages/react-native-builder-bob/src/targets/codegen/index.ts
@@ -4,7 +4,10 @@ import { patchCodegenAndroidPackage } from './patches/patchCodegenAndroidPackage
import fs from 'fs-extra';
import path from 'path';
import del from 'del';
-import { removeCodegenAppLevelCode } from './patches/removeCodegenAppLevelCode';
+import {
+ getCodegenCLISourceSupport,
+ removeCodegenAppLevelCode,
+} from './patches/removeCodegenAppLevelCode';
import { spawn } from '../../utils/spawn';
type Options = Omit;
@@ -42,12 +45,21 @@ export default async function build({ root, report }: Options) {
}
try {
- await spawn('npx', ['@react-native-community/cli', 'codegen']);
+ const codegenCLISupportsSource = await getCodegenCLISourceSupport();
+
+ await spawn('npx', [
+ '@react-native-community/cli',
+ 'codegen',
+ ...(codegenCLISupportsSource ? ['--source', 'library'] : []),
+ ]);
if (codegenType === 'modules' || codegenType === 'all') {
await patchCodegenAndroidPackage(root, packageJson, report);
}
- await removeCodegenAppLevelCode(root, packageJson);
+
+ if (!codegenCLISupportsSource) {
+ await removeCodegenAppLevelCode(root, packageJson);
+ }
report.success('Generated native code with codegen');
} catch (e: unknown) {
diff --git a/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts b/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts
index cf2f1594d..1154496a9 100644
--- a/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts
+++ b/packages/react-native-builder-bob/src/targets/codegen/patches/removeCodegenAppLevelCode.ts
@@ -1,6 +1,7 @@
import fs from 'fs-extra';
import path from 'path';
import { CODEGEN_DOCS } from './patchCodegenAndroidPackage';
+import { spawn } from '../../../utils/spawn';
const FILES_TO_REMOVE = [
'RCTAppDependencyProvider.h',
@@ -68,3 +69,18 @@ export async function removeCodegenAppLevelCode(
await Promise.allSettled([...androidPromises, ...iosPromises]);
}
+
+/**
+ * Codegen generates a different set of files if the target is an app instead.
+ * The following commit adds support for a --source argument to support calling codegen as a library:
+ * https://github.com/facebook/react-native/commit/98b8f178110472e5fed97de80766c03b0b5e988c
+ * Here we just check if the --source argument is supported.
+ */
+export async function getCodegenCLISourceSupport(): Promise {
+ const codegenCLIHelpOutput = await spawn('npx', [
+ '@react-native-community/cli',
+ 'codegen',
+ '--help',
+ ]);
+ return codegenCLIHelpOutput.includes('--source');
+}