diff --git a/packages/create-react-native-library/src/index.ts b/packages/create-react-native-library/src/index.ts index 322d910a..cbe91209 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 31542473..88dd2f6d 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<Input, 'output'>; @@ -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 cf2f1594..1154496a 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<boolean> { + const codegenCLIHelpOutput = await spawn('npx', [ + '@react-native-community/cli', + 'codegen', + '--help', + ]); + return codegenCLIHelpOutput.includes('--source'); +}