@poilabs-dev/analysis-sdk-plugin
Version:
Official Expo Config Plugin for integrating the Poilabs Analysis SDK
190 lines (160 loc) • 5.91 kB
JavaScript
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;