UNPKG

@poilabs-dev/analysis-sdk-plugin

Version:

Official Expo Config Plugin for integrating the Poilabs Analysis SDK

190 lines (160 loc) 5.91 kB
const { withAndroidManifest, withDangerousMod, withAppBuildGradle, } = require("@expo/config-plugins"); const fs = require("fs"); const path = require("path"); const ANDROID_PERMISSIONS = [ "android.permission.INTERNET", "android.permission.BLUETOOTH", "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_BACKGROUND_LOCATION", "android.permission.BLUETOOTH_CONNECT", "android.permission.BLUETOOTH_SCAN", "android.permission.FOREGROUND_SERVICE", ]; function withPoilabsManifest(config) { return withAndroidManifest(config, (mod) => { const { manifest } = mod.modResults; const permissions = manifest["uses-permission"] || []; ANDROID_PERMISSIONS.forEach((permission) => { if (!permissions.some((p) => p["$"]["android:name"] === permission)) { if (permission === "android.permission.FOREGROUND_SERVICE") { permissions.push({ $: { "android:name": permission, "android:foregroundServiceType": "location", }, }); } else { permissions.push({ $: { "android:name": permission } }); } } }); manifest["uses-permission"] = permissions; return mod; }); } function withPoilabsGradle(config, { jitpackToken }) { return withDangerousMod(config, [ "android", async (modConfig) => { const root = modConfig.modRequest.projectRoot; const buildScript = path.join(root, "android/build.gradle"); let text = fs.readFileSync(buildScript, "utf8"); const hasJitpackWithCredentials = text.includes('url "https://jitpack.io"') && text.includes("credentials { username ="); const hasPlainJitpack = text.includes("url 'https://www.jitpack.io'"); if (!hasJitpackWithCredentials) { const repo = ` jcenter() maven { url "https://jitpack.io" credentials { username = '${jitpackToken}' } }`; text = text.replace( /allprojects\s*{[\s\S]*?repositories\s*{([\s\S]*?)}/, (m, block) => block.includes("jitpack.io") ? m.replace( block, block.replace( /maven\s*{\s*url\s*['"]https:\/\/www\.jitpack\.io['"].*?}/g, "" ) ) : m.replace(block, `${block}\n${repo}`) ); } else if (hasPlainJitpack) { text = text.replace( /maven\s*{\s*url\s*['"]https:\/\/www\.jitpack\.io['"].*?}/g, "" ); } fs.writeFileSync(buildScript, text); const appGradle = path.join(root, "android/app/build.gradle"); let appText = fs.readFileSync(appGradle, "utf8"); if (!appText.includes("multiDexEnabled true")) { appText = appText.replace( /defaultConfig\s*{[^}]*\n/, (m) => `${m} multiDexEnabled true\n` ); } if (!appText.includes("androidx.multidex:multidex")) { appText = appText.replace( /dependencies\s*{[^}]*\n/, (m) => `${m} implementation 'androidx.multidex:multidex:2.0.1'\n` ); } if (!appText.includes("com.github.poiteam:Android-Analysis-SDK")) { appText = appText.replace( /dependencies\s*{[^}]*\n/, (m) => `${m} implementation('com.github.poiteam:Android-Analysis-SDK:v3.11.4') {\n exclude group: 'com.android.support'\n }\n` ); } fs.writeFileSync(appGradle, appText); return modConfig; }, ]); } function withPoilabsNativeModules(config) { return withDangerousMod(config, [ "android", async (modConfig) => { const root = modConfig.modRequest.projectRoot; const pkgName = config.android?.package || config.android?.packageName || config.slug; if (!pkgName) throw new Error("No Android package name found in app.json"); const pkgPath = pkgName.replace(/\./g, "/"); const dest = path.join(root, "android/app/src/main/java", pkgPath); if (!fs.existsSync(dest)) fs.mkdirSync(dest, { recursive: true }); const sourceDir = path.join( root, "node_modules/@poilabs-dev/analysis-sdk-plugin/src/android" ); const moduleFiles = ["PoilabsAnalysisModule.kt", "PoilabsPackage.kt"]; moduleFiles.forEach((file) => { const sourcePath = path.join(sourceDir, file); const destPath = path.join(dest, file); if (fs.existsSync(sourcePath)) { let content = fs.readFileSync(sourcePath, "utf8"); content = content.replace(/__PACKAGE_NAME__/g, pkgName); fs.writeFileSync(destPath, content, "utf8"); } else { console.warn(`Source file not found: ${sourcePath}`); } }); return modConfig; }, ]); } const withPoilabsGradleMods = (config) => { return withAppBuildGradle(config, (config) => { config.modResults.contents = config.modResults.contents.replace( /implementation\s+['"]com\.github\.poiteam:Android-Navigation-SDK:4\.4\.1['"]/, `implementation('com.github.poiteam:Android-Navigation-SDK:4.4.1') { exclude group: 'com.android.support' }` ); config.modResults.contents = config.modResults.contents.replace( /implementation\s+['"]com\.github\.poiteam:Android-Analysis-SDK:v3\.11\.4['"]/, `implementation('com.github.poiteam:Android-Analysis-SDK:v3.11.4') { exclude group: 'com.android.support' }` ); return config; }); }; function withPoilabsAndroid(config, props) { config = withPoilabsManifest(config); config = withPoilabsGradle(config, props); config = withPoilabsNativeModules(config); config = withPoilabsGradleMods(config); return config; } module.exports = withPoilabsAndroid;