/* eslint-disable @typescript-eslint/no-var-requires */ /** * Expo Config-Plugin — fügt einen Release-Signing-Block in build.gradle ein, * der key.properties aus android/key.properties liest. * * Warum Plugin statt Hand-Edit: `prebuild --clean` regeneriert build.gradle und * überschreibt manuelle Änderungen. Dieses Plugin patcht den Signing-Block nach * jedem prebuild idempotent via withAppBuildGradle. * * key.properties muss NACH prebuild in android/ abgelegt werden (nicht committen). * Keystore muss in android/app/rebreak-release.keystore liegen (nicht committen). * * Format key.properties (in android/ — wird von rootProject.file() gefunden): * storePassword= * keyPassword= * keyAlias=rebreak * storeFile=rebreak-release.keystore * * Hinweis: storeFile ist relativ zu android/app/ (Gradle-Modul-Root), also * Keystore in android/app/rebreak-release.keystore ablegen. */ const { withAppBuildGradle } = require('@expo/config-plugins'); function withReleaseSigningAndroid(config) { return withAppBuildGradle(config, (cfg) => { let gradle = cfg.modResults.contents; // Idempotenz: Plugin bereits angewandt if (gradle.includes('REBREAK_RELEASE_SIGNING')) { return cfg; } // 1. Properties-Loader vor android { Block einfügen const propertiesLoader = ` // REBREAK_RELEASE_SIGNING — injected by with-release-signing-android plugin def keystorePropertiesFile = rootProject.file("key.properties") def keystoreProperties = new Properties() if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } `; gradle = gradle.replace(/\nandroid \{/, `${propertiesLoader}\nandroid {`); // 2. Release-signingConfig in signingConfigs-Block einfügen (nach debug-Block) // Expo generiert: signingConfigs { debug { ... } } // Wir fügen release { ... } danach ein, direkt vor der schließenden } const releaseSigningConfig = ` release { if (keystorePropertiesFile.exists()) { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } }`; // Findet den signingConfigs-Block und fügt release vor der letzten } ein gradle = gradle.replace( /(signingConfigs \{[\s\S]*?)( \}\n)( buildTypes)/, `$1${releaseSigningConfig}\n }\n $3` ); // 3. Im release buildType: signingConfig.debug → signingConfig.release // Der release-Block liegt nach dem debug-Block. Wir ersetzen die zweite // Occurrence von signingConfig signingConfigs.debug (im release-Block). const parts = gradle.split('signingConfig signingConfigs.debug'); if (parts.length >= 3) { // parts[0] = vor debug-Block, parts[1] = zwischen debug und release, parts[2] = nach release gradle = parts[0] + 'signingConfig signingConfigs.debug' + parts[1] + 'signingConfig signingConfigs.release' + parts.slice(2).join('signingConfig signingConfigs.debug'); } cfg.modResults.contents = gradle; return cfg; }); } module.exports = withReleaseSigningAndroid;