From cc881cd3e441e5c1e6e0edc52181b8813d120c14 Mon Sep 17 00:00:00 2001 From: Insik-Han Date: Mon, 6 Apr 2026 11:09:50 +0900 Subject: [PATCH 1/2] Preserve Expo-generated modulemap in replace-rncore-version.js When using Expo with use_frameworks!, Expo generates a React-use-frameworks.modulemap file inside React-Core-prebuilt. This file was lost when replaceRNCoreConfiguration replaced the directory contents, causing subsequent builds to fail. Save and restore the modulemap around the directory replacement. --- .../scripts/replace-rncore-version.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/react-native/scripts/replace-rncore-version.js b/packages/react-native/scripts/replace-rncore-version.js index 98d4798c6609..4ba70d9446f8 100644 --- a/packages/react-native/scripts/replace-rncore-version.js +++ b/packages/react-native/scripts/replace-rncore-version.js @@ -96,6 +96,18 @@ function replaceRNCoreConfiguration( ); } + // Preserve Expo-generated modulemap before replacing directories + const useFrameworksModulemapName = 'React-use-frameworks.modulemap'; + const useFrameworksModulemapPath = path.join( + finalLocation, + useFrameworksModulemapName, + ); + let savedModulemap = null; + if (fs.existsSync(useFrameworksModulemapPath)) { + console.log('Preserving', useFrameworksModulemapName); + savedModulemap = fs.readFileSync(useFrameworksModulemapPath); + } + // Delete all directories in finalLocation - not files, since we want to // keep the React-VFS.yaml file const dirs = fs @@ -132,6 +144,13 @@ function replaceRNCoreConfiguration( } } } + + // Restore Expo-generated modulemap after directory replacement + if (savedModulemap != null) { + const restoredPath = path.join(finalLocation, useFrameworksModulemapName); + fs.writeFileSync(restoredPath, savedModulemap); + console.log('Restored', useFrameworksModulemapName); + } } finally { // Clean up temp directory fs.rmSync(tmpDir, {force: true, recursive: true}); From fbc00e9f424363306ae2ac47c93a0780aa30b627 Mon Sep 17 00:00:00 2001 From: Insik-Han Date: Mon, 6 Apr 2026 11:20:18 +0900 Subject: [PATCH 2/2] Move modulemap restore into finally block Ensures the Expo-generated React-use-frameworks.modulemap is restored even when mv/cp partially fails during directory replacement. --- .../scripts/replace-rncore-version.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/react-native/scripts/replace-rncore-version.js b/packages/react-native/scripts/replace-rncore-version.js index 4ba70d9446f8..04b55201fd08 100644 --- a/packages/react-native/scripts/replace-rncore-version.js +++ b/packages/react-native/scripts/replace-rncore-version.js @@ -145,15 +145,20 @@ function replaceRNCoreConfiguration( } } - // Restore Expo-generated modulemap after directory replacement + } finally { + // Clean up temp directory + fs.rmSync(tmpDir, {force: true, recursive: true}); + + // Restore Expo-generated modulemap after directory replacement. + // Runs in finally so it is not skipped if mv/cp partially fails. if (savedModulemap != null) { - const restoredPath = path.join(finalLocation, useFrameworksModulemapName); + const restoredPath = path.join( + finalLocation, + useFrameworksModulemapName, + ); fs.writeFileSync(restoredPath, savedModulemap); console.log('Restored', useFrameworksModulemapName); } - } finally { - // Clean up temp directory - fs.rmSync(tmpDir, {force: true, recursive: true}); } }