diff --git a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GeneratePackageListTask.kt b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GeneratePackageListTask.kt index 0d47c5131b1..36cc66caf88 100644 --- a/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GeneratePackageListTask.kt +++ b/packages/gradle-plugin/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GeneratePackageListTask.kt @@ -30,10 +30,19 @@ abstract class GeneratePackageListTask : DefaultTask() { @TaskAction fun taskAction() { - val model = JsonUtils.fromAutolinkingConfigJson(autolinkInputFile.get().asFile) + val model = + JsonUtils.fromAutolinkingConfigJson(autolinkInputFile.get().asFile) + ?: error( + """ + RNGP - Autolinking: Could not parse autolinking config file: + ${autolinkInputFile.get().asFile.absolutePath} + + The file is either missing or not containing valid JSON so the build won't succeed. + """ + .trimIndent()) val packageName = - model?.project?.android?.packageName + model.project?.android?.packageName ?: error( "RNGP - Autolinking: Could not find project.android.packageName in react-native config output! Could not autolink packages without this field.") diff --git a/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/JsonUtils.kt b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/JsonUtils.kt index 12d26f04c36..6a6eeba7b93 100644 --- a/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/JsonUtils.kt +++ b/packages/gradle-plugin/shared/src/main/kotlin/com/facebook/react/utils/JsonUtils.kt @@ -21,8 +21,23 @@ object JsonUtils { } fun fromAutolinkingConfigJson(input: File): ModelAutolinkingConfigJson? = - input.bufferedReader().use { - runCatching { gsonConverter.fromJson(it, ModelAutolinkingConfigJson::class.java) } + input.bufferedReader().use { reader -> + runCatching { + // We sanitize the output of the `config` command as it could contain debug logs + // such as: + // + // > AwesomeProject@0.0.1 npx + // > rnc-cli config + // + // which will render the JSON invalid. + val content = + reader + .readLines() + .filterNot { line -> line.startsWith(">") } + .joinToString("\n") + .trim() + gsonConverter.fromJson(content, ModelAutolinkingConfigJson::class.java) + } .getOrNull() } } diff --git a/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/JsonUtilsTest.kt b/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/JsonUtilsTest.kt index 724ac0350de..8c718fc4d3d 100644 --- a/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/JsonUtilsTest.kt +++ b/packages/gradle-plugin/shared/src/test/kotlin/com/facebook/react/utils/JsonUtilsTest.kt @@ -186,6 +186,54 @@ class JsonUtilsTest { assertThat("implementation").isEqualTo(parsed.project!!.android!!.dependencyConfiguration) } + @Test + fun fromAutolinkingConfigJson_withInfoLogs_sanitizeAndParseIt() { + @Suppress("JsonStandardCompliance") + val validJson = + createJsonFile( + """ + + > AwesomeProject@0.0.1 npx + > rnc-cli config + + { + "reactNativeVersion": "1000.0.0", + "project": { + "ios": { + "sourceDir": "./packages/rn-tester", + "xcodeProject": { + "name": "RNTesterPods.xcworkspace", + "isWorkspace": true + }, + "automaticPodsInstallation": false + }, + "android": { + "sourceDir": "./packages/rn-tester", + "appName": "RN-Tester", + "packageName": "com.facebook.react.uiapp", + "applicationId": "com.facebook.react.uiapp", + "mainActivity": ".RNTesterActivity", + "watchModeCommandParams": [ + "--mode HermesDebug" + ], + "dependencyConfiguration": "implementation" + } + } + } + """ + .trimIndent()) + val parsed = JsonUtils.fromAutolinkingConfigJson(validJson)!! + + assertThat("./packages/rn-tester").isEqualTo(parsed.project!!.android!!.sourceDir) + assertThat("RN-Tester").isEqualTo(parsed.project!!.android!!.appName) + assertThat("com.facebook.react.uiapp").isEqualTo(parsed.project!!.android!!.packageName) + assertThat("com.facebook.react.uiapp").isEqualTo(parsed.project!!.android!!.applicationId) + assertThat(".RNTesterActivity").isEqualTo(parsed.project!!.android!!.mainActivity) + assertThat("--mode HermesDebug") + .isEqualTo(parsed.project!!.android!!.watchModeCommandParams!![0]) + assertThat("implementation").isEqualTo(parsed.project!!.android!!.dependencyConfiguration) + } + @Test fun fromAutolinkingConfigJson_withDependenciesSpecified_canParseIt() { val validJson =