1
1
package com.callstack.react.brownfield.plugin
2
2
3
3
import com.android.build.gradle.LibraryExtension
4
+ import com.callstack.react.brownfield.exceptions.NameSpaceNotFound
4
5
import com.callstack.react.brownfield.utils.Extension
5
6
import org.gradle.api.Project
7
+ import org.gradle.api.Task
6
8
import org.gradle.api.file.Directory
7
9
import org.gradle.api.tasks.Copy
10
+ import java.io.File
8
11
9
12
object RNSourceSets {
10
13
private lateinit var project: Project
@@ -55,6 +58,43 @@ object RNSourceSets {
55
58
}
56
59
}
57
60
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
+
58
98
private fun configureTasks () {
59
99
val projectName = project.name
60
100
val appProjectName = appProject.name
@@ -64,6 +104,8 @@ object RNSourceSets {
64
104
it.dependsOn(" :$appProjectName :generateAutolinkingPackageList" )
65
105
it.from(" $appBuildDir /$path " )
66
106
it.into(" $moduleBuildDir /$path " )
107
+
108
+ patchRNEntryPoint(it, path)
67
109
}
68
110
69
111
androidExtension.buildTypes.forEach { buildType ->
0 commit comments