From 0b967dc9205102d342678ecb480661ce8beaf22c Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Fri, 24 Jul 2026 13:23:11 +0200 Subject: [PATCH] fix(android): handle corrupted autolinking cache --- packages/app/android/autolink.mjs | 24 ++++++++++++++------- packages/app/test/android/autolink.test.mts | 1 + 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/app/android/autolink.mjs b/packages/app/android/autolink.mjs index ecf3d8c8b..a206518c8 100644 --- a/packages/app/android/autolink.mjs +++ b/packages/app/android/autolink.mjs @@ -17,6 +17,8 @@ import { mkdir_p, writeJSONFile } from "../scripts/utils/filesystem.mjs"; */ /** + * Converts a dependency's name to a Gradle-valid target name. + * @note This function varies slightly from upstream because it handles more edge cases. * @see {@link https://github.com/react/react-native/blob/924fb3de9bc9328c3315316fbb796b933be5bcbe/packages/react-native-gradle-plugin/shared/src/main/kotlin/com/facebook/react/model/ModelAutolinkingDependenciesJson.kt#L17} * @param {string} name * @returns {string} @@ -90,7 +92,11 @@ async function loadConfig(json, projectRoot) { const state = getCurrentState(projectRoot); const stateFile = json.substring(0, json.length - "json".length) + "sha256"; if (fs.existsSync(stateFile) && readTextFile(stateFile) === state) { - return readJSONFile(json); + try { + return readJSONFile(json); + } catch (_) { + // Ignore; regenerate cache + } } const config = await loadContextAsync(projectRoot); @@ -108,13 +114,15 @@ async function loadConfig(json, projectRoot) { * @returns {Promise} */ async function main(projectRoot, output) { - const config = await loadConfig( - output.replace( - /[/\\]app[/\\]build[/\\]generated[/\\]rnta[/\\]/, - "/build/generated/autolinking/" - ), - projectRoot - ); + const config = output + ? await loadConfig( + output.replace( + /[/\\]app[/\\]build[/\\]generated[/\\]rnta[/\\]/, + "/build/generated/autolinking/" + ), + projectRoot + ) + : pruneDependencies(await loadContextAsync(projectRoot)); const dependencies = pickAndroidDependencies(config); if (!output) { diff --git a/packages/app/test/android/autolink.test.mts b/packages/app/test/android/autolink.test.mts index 9d376f7b5..969ffc930 100644 --- a/packages/app/test/android/autolink.test.mts +++ b/packages/app/test/android/autolink.test.mts @@ -23,6 +23,7 @@ describe("cleanDependencyName()", () => { ); equal(cleanDependencyName("@!'()*/~"), "_"); equal(cleanDependencyName("@!'(x)*/~y"), "_x_y"); + equal(cleanDependencyName("@!'(x)*/~y/z"), "_x_y_z"); }); });