Skip to content

Commit d7884a6

Browse files
cortinicofacebook-github-bot
authored andcommitted
RNGP - Sanitize the output of the config command (#46482)
Summary: Pull Request resolved: #46482 Fixes #46443 Fixes #46134 I'm sanitizing the output of the `config` command + I've added some more logging in case of failure. Changelog: [Android] [Fixed] - RNGP - Sanitize the output of the config command Reviewed By: cipolleschi Differential Revision: D62641979 fbshipit-source-id: c13d27a42beeb7a973c1802e7204631d49d3d09b
1 parent 3cbaddb commit d7884a6

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-4
lines changed

packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GeneratePackageListTask.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,19 @@ abstract class GeneratePackageListTask : DefaultTask() {
3030

3131
@TaskAction
3232
fun taskAction() {
33-
val model = JsonUtils.fromAutolinkingConfigJson(autolinkInputFile.get().asFile)
33+
val model =
34+
JsonUtils.fromAutolinkingConfigJson(autolinkInputFile.get().asFile)
35+
?: error(
36+
"""
37+
RNGP - Autolinking: Could not parse autolinking config file:
38+
${autolinkInputFile.get().asFile.absolutePath}
39+
40+
The file is either missing or not containing valid JSON so the build won't succeed.
41+
"""
42+
.trimIndent())
3443

3544
val packageName =
36-
model?.project?.android?.packageName
45+
model.project?.android?.packageName
3746
?: error(
3847
"RNGP - Autolinking: Could not find project.android.packageName in react-native config output! Could not autolink packages without this field.")
3948

packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/JsonUtils.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,23 @@ object JsonUtils {
2121
}
2222

2323
fun fromAutolinkingConfigJson(input: File): ModelAutolinkingConfigJson? =
24-
input.bufferedReader().use {
25-
runCatching { gsonConverter.fromJson(it, ModelAutolinkingConfigJson::class.java) }
24+
input.bufferedReader().use { reader ->
25+
runCatching {
26+
// We sanitize the output of the `config` command as it could contain debug logs
27+
// such as:
28+
//
29+
30+
// > rnc-cli config
31+
//
32+
// which will render the JSON invalid.
33+
val content =
34+
reader
35+
.readLines()
36+
.filterNot { line -> line.startsWith(">") }
37+
.joinToString("\n")
38+
.trim()
39+
gsonConverter.fromJson(content, ModelAutolinkingConfigJson::class.java)
40+
}
2641
.getOrNull()
2742
}
2843
}

packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/JsonUtilsTest.kt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,54 @@ class JsonUtilsTest {
186186
assertThat("implementation").isEqualTo(parsed.project!!.android!!.dependencyConfiguration)
187187
}
188188

189+
@Test
190+
fun fromAutolinkingConfigJson_withInfoLogs_sanitizeAndParseIt() {
191+
@Suppress("JsonStandardCompliance")
192+
val validJson =
193+
createJsonFile(
194+
"""
195+
196+
197+
> rnc-cli config
198+
199+
{
200+
"reactNativeVersion": "1000.0.0",
201+
"project": {
202+
"ios": {
203+
"sourceDir": "./packages/rn-tester",
204+
"xcodeProject": {
205+
"name": "RNTesterPods.xcworkspace",
206+
"isWorkspace": true
207+
},
208+
"automaticPodsInstallation": false
209+
},
210+
"android": {
211+
"sourceDir": "./packages/rn-tester",
212+
"appName": "RN-Tester",
213+
"packageName": "com.facebook.react.uiapp",
214+
"applicationId": "com.facebook.react.uiapp",
215+
"mainActivity": ".RNTesterActivity",
216+
"watchModeCommandParams": [
217+
"--mode HermesDebug"
218+
],
219+
"dependencyConfiguration": "implementation"
220+
}
221+
}
222+
}
223+
"""
224+
.trimIndent())
225+
val parsed = JsonUtils.fromAutolinkingConfigJson(validJson)!!
226+
227+
assertThat("./packages/rn-tester").isEqualTo(parsed.project!!.android!!.sourceDir)
228+
assertThat("RN-Tester").isEqualTo(parsed.project!!.android!!.appName)
229+
assertThat("com.facebook.react.uiapp").isEqualTo(parsed.project!!.android!!.packageName)
230+
assertThat("com.facebook.react.uiapp").isEqualTo(parsed.project!!.android!!.applicationId)
231+
assertThat(".RNTesterActivity").isEqualTo(parsed.project!!.android!!.mainActivity)
232+
assertThat("--mode HermesDebug")
233+
.isEqualTo(parsed.project!!.android!!.watchModeCommandParams!![0])
234+
assertThat("implementation").isEqualTo(parsed.project!!.android!!.dependencyConfiguration)
235+
}
236+
189237
@Test
190238
fun fromAutolinkingConfigJson_withDependenciesSpecified_canParseIt() {
191239
val validJson =

0 commit comments

Comments
 (0)