Skip to content

Commit 104a227

Browse files
authored
Merge pull request #115 from callstack/feat/support-rn-entry-point
feat: add support for react-native entry point for versions starting from 0.80.0
2 parents a1824bf + 052c78a commit 104a227

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

gradle-plugins/react/brownfield/build.gradle.kts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import java.util.Properties
2-
31
plugins {
42
alias(libs.plugins.kotlinJvm)
53
`java-gradle-plugin`
@@ -124,4 +122,3 @@ tasks.javadoc {
124122
source = "8"
125123
}
126124
}
127-
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.callstack.react.brownfield.exceptions
2+
3+
class NameSpaceNotFound(message: String) :
4+
RuntimeException(message)

gradle-plugins/react/brownfield/src/main/kotlin/com/callstack/react/brownfield/plugin/RNSourceSets.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.callstack.react.brownfield.plugin
22

33
import com.android.build.gradle.LibraryExtension
4+
import com.callstack.react.brownfield.exceptions.NameSpaceNotFound
45
import com.callstack.react.brownfield.utils.Extension
56
import org.gradle.api.Project
7+
import org.gradle.api.Task
68
import org.gradle.api.file.Directory
79
import org.gradle.api.tasks.Copy
10+
import java.io.File
811

912
object 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

Comments
 (0)