11package com.callstack.react.brownfield.plugin
22
33import com.android.build.gradle.LibraryExtension
4+ import com.callstack.react.brownfield.exceptions.NameSpaceNotFound
45import com.callstack.react.brownfield.utils.Extension
56import org.gradle.api.Project
7+ import org.gradle.api.Task
68import org.gradle.api.file.Directory
79import org.gradle.api.tasks.Copy
10+ import java.io.File
811
912object RNSourceSets {
1013 private lateinit var project: Project
@@ -55,6 +58,43 @@ object RNSourceSets {
5558 }
5659 }
5760
61+ private fun getLibraryNameSpace (): String {
62+ val nameSpace = androidExtension.namespace
63+ return nameSpace ? : throw NameSpaceNotFound (" namespace must be defined in your android library build.gradle" )
64+ }
65+
66+ private fun patchRNEntryPoint (
67+ task : Task ,
68+ path : String ,
69+ ) {
70+ val rnEntryPointTaskName = " generateReactNativeEntryPoint"
71+
72+ /* *
73+ * If `generateReactNativeEntryPoint` task does not exist, we early return. It means
74+ * the consumer library is running on RN version < 0.80
75+ */
76+ val rnEntryPointTask = appProject.tasks.findByName(rnEntryPointTaskName) ? : return
77+
78+ task.dependsOn(rnEntryPointTask)
79+ val sourceFile = File (moduleBuildDir.toString(), " $path /com/facebook/react/ReactNativeApplicationEntryPoint.java" )
80+ task.doLast {
81+ if (sourceFile.exists()) {
82+ var content = sourceFile.readText()
83+ val nameSpace = getLibraryNameSpace()
84+
85+ /* *
86+ * We use look-ahead regex to replace any occurrences with Build.Config referenced via the old(app) package
87+ *
88+ * \b[\w.]+ → matches the old package
89+ * (?=\.BuildConfig) → only if it’s immediately followed by that suffix
90+ */
91+ val regex = Regex (""" \b[\w.]+(?=\.BuildConfig)""" )
92+ content = content.replace(regex, nameSpace)
93+ sourceFile.writeText(content)
94+ }
95+ }
96+ }
97+
5898 private fun configureTasks () {
5999 val projectName = project.name
60100 val appProjectName = appProject.name
@@ -64,6 +104,8 @@ object RNSourceSets {
64104 it.dependsOn(" :$appProjectName :generateAutolinkingPackageList" )
65105 it.from(" $appBuildDir /$path " )
66106 it.into(" $moduleBuildDir /$path " )
107+
108+ patchRNEntryPoint(it, path)
67109 }
68110
69111 androidExtension.buildTypes.forEach { buildType ->
0 commit comments