From e45b3a5130375007fd84b44fbb050776befb518d Mon Sep 17 00:00:00 2001 From: szymonrybczak Date: Tue, 18 Feb 2025 17:27:10 +0100 Subject: [PATCH 1/4] feat(0.79): run codgen before `pod install` --- .../cli-config-apple/src/tools/installPods.ts | 38 ++++++++++++++++++- packages/cli-config-apple/src/tools/pods.ts | 8 ++++ packages/cli/src/commands/init/init.ts | 11 +++++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/packages/cli-config-apple/src/tools/installPods.ts b/packages/cli-config-apple/src/tools/installPods.ts index 32bd75eea..6b9449454 100644 --- a/packages/cli-config-apple/src/tools/installPods.ts +++ b/packages/cli-config-apple/src/tools/installPods.ts @@ -10,27 +10,55 @@ import { runSudo, } from '@react-native-community/cli-tools'; import runBundleInstall from './runBundleInstall'; +import path from 'path'; interface PodInstallOptions { skipBundleInstall?: boolean; newArchEnabled?: boolean; iosFolderPath?: string; + platform: string; + root: string; } interface RunPodInstallOptions { + root: string; + platform: string; shouldHandleRepoUpdate?: boolean; newArchEnabled?: boolean; } -async function runPodInstall(loader: Ora, options?: RunPodInstallOptions) { +async function runPodInstall(loader: Ora, options: RunPodInstallOptions) { const shouldHandleRepoUpdate = options?.shouldHandleRepoUpdate || true; try { + if (fs.existsSync('build')) { + fs.rmSync('build', {recursive: true}); + } + loader.start( `Installing CocoaPods dependencies ${chalk.bold( options?.newArchEnabled ? 'with New Architecture' : '', )} ${chalk.dim('(this may take a few minutes)')}`, ); + const reactNativePath = path.dirname( + require.resolve('react-native', {paths: [process.cwd()]}), + ); + const codegenScript = path.join( + reactNativePath, + 'scripts', + 'generate-codegen-artifacts.js', + ); + + execa.sync('node', [ + codegenScript, + '-p', + options.root, + '-o', + process.cwd(), + '-t', + options.platform, + ]); + await execa('bundle', ['exec', 'pod', 'install'], { env: { RCT_NEW_ARCH_ENABLED: options?.newArchEnabled ? '1' : '0', @@ -53,6 +81,8 @@ async function runPodInstall(loader: Ora, options?: RunPodInstallOptions) { await runPodInstall(loader, { shouldHandleRepoUpdate: false, newArchEnabled: options?.newArchEnabled, + platform: options.platform, + root: options.root, }); } else { loader.fail(); @@ -156,7 +186,11 @@ async function installPods(loader?: Ora, options?: PodInstallOptions) { await installCocoaPods(loader); } - await runPodInstall(loader, {newArchEnabled: options?.newArchEnabled}); + await runPodInstall(loader, { + newArchEnabled: options?.newArchEnabled, + platform: options?.platform ?? 'ios', + root: options?.root ?? process.cwd(), + }); } finally { process.chdir('..'); } diff --git a/packages/cli-config-apple/src/tools/pods.ts b/packages/cli-config-apple/src/tools/pods.ts index b3edf7327..10e6e901b 100644 --- a/packages/cli-config-apple/src/tools/pods.ts +++ b/packages/cli-config-apple/src/tools/pods.ts @@ -89,12 +89,16 @@ async function install( cachedDependenciesHash: string | undefined, currentDependenciesHash: string, iosFolderPath: string, + platform: string, + root: string, ) { const loader = getLoader('Installing CocoaPods...'); try { await installPods(loader, { skipBundleInstall: !!cachedDependenciesHash, iosFolderPath, + platform, + root, }); cacheManager.set(packageJson.name, 'dependencies', currentDependenciesHash); loader.succeed(); @@ -154,6 +158,8 @@ export default async function resolvePods( cachedDependenciesHash, currentDependenciesHash, platformFolderPath, + platformName, + root, ); } else if ( arePodsInstalled && @@ -175,6 +181,8 @@ export default async function resolvePods( skipBundleInstall: !!cachedDependenciesHash, newArchEnabled: options?.newArchEnabled, iosFolderPath: platformFolderPath, + platform: platformName, + root, }); cacheManager.set( packageJson.name, diff --git a/packages/cli/src/commands/init/init.ts b/packages/cli/src/commands/init/init.ts index 819f77cf6..32739c516 100644 --- a/packages/cli/src/commands/init/init.ts +++ b/packages/cli/src/commands/init/init.ts @@ -284,7 +284,10 @@ async function createFromTemplate({ try { if (installPodsValue === 'true') { didInstallPods = true; - await installPods(loader); + await installPods(loader, { + platform: 'ios', + root: projectDirectory, + }); loader.succeed(); setEmptyHashForCachedDependencies(projectName); } else if (installPodsValue === 'undefined') { @@ -298,7 +301,11 @@ async function createFromTemplate({ didInstallPods = installCocoapods; if (installCocoapods) { - await installPods(loader, {newArchEnabled: true}); + await installPods(loader, { + newArchEnabled: true, + platform: 'ios', + root: projectDirectory, + }); loader.succeed(); setEmptyHashForCachedDependencies(projectName); } From 4b922655c238603844aa80cfa04c38a700c623aa Mon Sep 17 00:00:00 2001 From: szymonrybczak Date: Tue, 18 Feb 2025 18:14:10 +0100 Subject: [PATCH 2/4] chore: move logic to `runCodegen` fn --- packages/cli-config-apple/src/index.ts | 2 +- .../cli-config-apple/src/tools/installPods.ts | 33 ----------------- packages/cli-config-apple/src/tools/pods.ts | 9 ++--- .../cli-config-apple/src/tools/runCodegen.ts | 35 +++++++++++++++++++ packages/cli/src/commands/init/init.ts | 12 ++++--- 5 files changed, 48 insertions(+), 43 deletions(-) create mode 100644 packages/cli-config-apple/src/tools/runCodegen.ts diff --git a/packages/cli-config-apple/src/index.ts b/packages/cli-config-apple/src/index.ts index d5079a753..545292fbc 100644 --- a/packages/cli-config-apple/src/index.ts +++ b/packages/cli-config-apple/src/index.ts @@ -3,7 +3,7 @@ export { getProjectConfig, findPodfilePaths, } from './config'; - +export {default as runCodegen} from './tools/runCodegen'; export {default as installPods} from './tools/installPods'; export {default as resolvePods} from './tools/pods'; export {default as findXcodeProject} from './config/findXcodeProject'; diff --git a/packages/cli-config-apple/src/tools/installPods.ts b/packages/cli-config-apple/src/tools/installPods.ts index 6b9449454..8f69d726c 100644 --- a/packages/cli-config-apple/src/tools/installPods.ts +++ b/packages/cli-config-apple/src/tools/installPods.ts @@ -10,19 +10,14 @@ import { runSudo, } from '@react-native-community/cli-tools'; import runBundleInstall from './runBundleInstall'; -import path from 'path'; interface PodInstallOptions { skipBundleInstall?: boolean; newArchEnabled?: boolean; iosFolderPath?: string; - platform: string; - root: string; } interface RunPodInstallOptions { - root: string; - platform: string; shouldHandleRepoUpdate?: boolean; newArchEnabled?: boolean; } @@ -30,35 +25,12 @@ interface RunPodInstallOptions { async function runPodInstall(loader: Ora, options: RunPodInstallOptions) { const shouldHandleRepoUpdate = options?.shouldHandleRepoUpdate || true; try { - if (fs.existsSync('build')) { - fs.rmSync('build', {recursive: true}); - } - loader.start( `Installing CocoaPods dependencies ${chalk.bold( options?.newArchEnabled ? 'with New Architecture' : '', )} ${chalk.dim('(this may take a few minutes)')}`, ); - const reactNativePath = path.dirname( - require.resolve('react-native', {paths: [process.cwd()]}), - ); - const codegenScript = path.join( - reactNativePath, - 'scripts', - 'generate-codegen-artifacts.js', - ); - - execa.sync('node', [ - codegenScript, - '-p', - options.root, - '-o', - process.cwd(), - '-t', - options.platform, - ]); - await execa('bundle', ['exec', 'pod', 'install'], { env: { RCT_NEW_ARCH_ENABLED: options?.newArchEnabled ? '1' : '0', @@ -81,8 +53,6 @@ async function runPodInstall(loader: Ora, options: RunPodInstallOptions) { await runPodInstall(loader, { shouldHandleRepoUpdate: false, newArchEnabled: options?.newArchEnabled, - platform: options.platform, - root: options.root, }); } else { loader.fail(); @@ -185,11 +155,8 @@ async function installPods(loader?: Ora, options?: PodInstallOptions) { loader.info(); await installCocoaPods(loader); } - await runPodInstall(loader, { newArchEnabled: options?.newArchEnabled, - platform: options?.platform ?? 'ios', - root: options?.root ?? process.cwd(), }); } finally { process.chdir('..'); diff --git a/packages/cli-config-apple/src/tools/pods.ts b/packages/cli-config-apple/src/tools/pods.ts index 10e6e901b..41e26d090 100644 --- a/packages/cli-config-apple/src/tools/pods.ts +++ b/packages/cli-config-apple/src/tools/pods.ts @@ -13,6 +13,7 @@ import { IOSDependencyConfig, } from '@react-native-community/cli-types'; import {ApplePlatform} from '../types'; +import runCodegen from './runCodegen'; interface ResolvePodsOptions { forceInstall?: boolean; @@ -94,11 +95,13 @@ async function install( ) { const loader = getLoader('Installing CocoaPods...'); try { + await runCodegen({ + root, + platform, + }); await installPods(loader, { skipBundleInstall: !!cachedDependenciesHash, iosFolderPath, - platform, - root, }); cacheManager.set(packageJson.name, 'dependencies', currentDependenciesHash); loader.succeed(); @@ -181,8 +184,6 @@ export default async function resolvePods( skipBundleInstall: !!cachedDependenciesHash, newArchEnabled: options?.newArchEnabled, iosFolderPath: platformFolderPath, - platform: platformName, - root, }); cacheManager.set( packageJson.name, diff --git a/packages/cli-config-apple/src/tools/runCodegen.ts b/packages/cli-config-apple/src/tools/runCodegen.ts new file mode 100644 index 000000000..1cc5f4b19 --- /dev/null +++ b/packages/cli-config-apple/src/tools/runCodegen.ts @@ -0,0 +1,35 @@ +import fs from 'fs'; +import path from 'path'; +import execa from 'execa'; + +interface CodegenOptions { + root: string; + platform: string; +} + +async function runCodegen(options: CodegenOptions): Promise { + if (fs.existsSync('build')) { + fs.rmSync('build', {recursive: true}); + } + + const reactNativePath = path.dirname( + require.resolve('react-native', {paths: [process.cwd()]}), + ); + const codegenScript = path.join( + reactNativePath, + 'scripts', + 'generate-codegen-artifacts.js', + ); + + await execa('node', [ + codegenScript, + '-p', + options.root, + '-o', + process.cwd(), + '-t', + options.platform, + ]); +} + +export default runCodegen; diff --git a/packages/cli/src/commands/init/init.ts b/packages/cli/src/commands/init/init.ts index 32739c516..1285b8413 100644 --- a/packages/cli/src/commands/init/init.ts +++ b/packages/cli/src/commands/init/init.ts @@ -41,6 +41,7 @@ import DirectoryAlreadyExistsError from './errors/DirectoryAlreadyExistsError'; import {createTemplateUri} from './version'; import {TEMPLATE_COMMUNITY_REACT_NATIVE_VERSION} from './constants'; import type {Options} from './types'; +import {runCodegen} from '@react-native-community/cli-config-apple'; const DEFAULT_VERSION = 'latest'; @@ -284,10 +285,11 @@ async function createFromTemplate({ try { if (installPodsValue === 'true') { didInstallPods = true; - await installPods(loader, { - platform: 'ios', + await runCodegen({ root: projectDirectory, + platform: 'ios', }); + await installPods(loader, {}); loader.succeed(); setEmptyHashForCachedDependencies(projectName); } else if (installPodsValue === 'undefined') { @@ -301,11 +303,11 @@ async function createFromTemplate({ didInstallPods = installCocoapods; if (installCocoapods) { - await installPods(loader, { - newArchEnabled: true, - platform: 'ios', + await runCodegen({ root: projectDirectory, + platform: 'ios', }); + await installPods(loader, {}); loader.succeed(); setEmptyHashForCachedDependencies(projectName); } From 1ffe7a1d36bc984c692c91b5a7e9102c58e7d748 Mon Sep 17 00:00:00 2001 From: szymonrybczak Date: Tue, 18 Feb 2025 18:20:46 +0100 Subject: [PATCH 3/4] fix: mock `runCodegen` fn --- packages/cli-config-apple/src/__tests__/pods.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/cli-config-apple/src/__tests__/pods.test.ts b/packages/cli-config-apple/src/__tests__/pods.test.ts index 9ba0a8112..30bcd08ee 100644 --- a/packages/cli-config-apple/src/__tests__/pods.test.ts +++ b/packages/cli-config-apple/src/__tests__/pods.test.ts @@ -16,6 +16,9 @@ jest.mock('@react-native-community/cli-tools', () => ({ }, })); jest.mock('../tools/installPods', () => jest.fn()); +jest.mock('../tools/runCodegen', () => ({ + runCodegen: jest.fn(), +})); const dependencyHash = 'd41d8cd98f00b204e9800998ecf8427e'; const packageJson = { From c4c0f54d802be940da49cea25406161449d16853 Mon Sep 17 00:00:00 2001 From: szymonrybczak Date: Tue, 18 Feb 2025 18:26:46 +0100 Subject: [PATCH 4/4] fix: mock default module instead --- packages/cli-config-apple/src/__tests__/pods.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/cli-config-apple/src/__tests__/pods.test.ts b/packages/cli-config-apple/src/__tests__/pods.test.ts index 30bcd08ee..11387bbf6 100644 --- a/packages/cli-config-apple/src/__tests__/pods.test.ts +++ b/packages/cli-config-apple/src/__tests__/pods.test.ts @@ -16,9 +16,7 @@ jest.mock('@react-native-community/cli-tools', () => ({ }, })); jest.mock('../tools/installPods', () => jest.fn()); -jest.mock('../tools/runCodegen', () => ({ - runCodegen: jest.fn(), -})); +jest.mock('../tools/runCodegen', () => jest.fn()); const dependencyHash = 'd41d8cd98f00b204e9800998ecf8427e'; const packageJson = {