@bravemobile/react-native-code-push
Version:
React Native plugin for the CodePush service
74 lines (73 loc) • 3.66 kB
JavaScript
import path from "path";
import fs from "fs";
import { EOL } from "os";
const IMPORT_CODE_PUSH = 'import com.microsoft.codepush.react.CodePush';
const RN_LEGACY_MARKER = 'object : DefaultReactNativeHost(this)';
const RN_082_MARKER = ' getDefaultReactHost(';
export function modifyMainApplicationKt(mainApplicationContent) {
const hasCodePushImport = mainApplicationContent.includes(IMPORT_CODE_PUSH);
const hasGetJSBundleFileFn = mainApplicationContent.includes('CodePush.getJSBundleFile()');
if (hasCodePushImport && hasGetJSBundleFileFn) {
console.log('log: MainApplication.kt already has CodePush initialized.');
return mainApplicationContent;
}
let updatedContent = mainApplicationContent;
if (!hasCodePushImport) {
updatedContent = mainApplicationContent.replace('import com.facebook.react.ReactApplication', `import com.facebook.react.ReactApplication${EOL}${IMPORT_CODE_PUSH}`);
}
const isExtendingDefaultReactNativeHost = mainApplicationContent.includes(RN_LEGACY_MARKER);
// RN <0.82
if (isExtendingDefaultReactNativeHost) {
if (!hasGetJSBundleFileFn) {
updatedContent = updatedContent.replace('override fun getJSMainModuleName(): String = "index"', `override fun getJSMainModuleName(): String = "index"${EOL} override fun getJSBundleFile(): String = CodePush.getJSBundleFile()`);
}
return updatedContent;
}
// RN 0.82+
const isUsingGetDefaultReactHost = mainApplicationContent.includes(RN_082_MARKER);
if (isUsingGetDefaultReactHost) {
if (!hasGetJSBundleFileFn) {
return addJsBundleFilePathArgument(updatedContent);
}
return updatedContent;
}
throw new Error('Unsupported MainApplication.kt structure.');
}
function addJsBundleFilePathArgument(mainApplicationContent) {
const packageListArgumentPattern = /(packageList\s*=\s*\n\s*PackageList\(this\)[\s\S]+?\},?\s*\n)/;
if (!packageListArgumentPattern.test(mainApplicationContent)) {
console.log('log: Could not find packageList argument while updating MainApplication.kt.');
return mainApplicationContent;
}
return mainApplicationContent.replace(packageListArgumentPattern, (match) => {
if (match.includes('jsBundleFilePath')) {
return match;
}
return `${match} jsBundleFilePath = CodePush.getJSBundleFile(),${EOL}`;
});
}
export async function initAndroid() {
console.log('log: Running Android setup...');
await applyMainApplication();
}
async function applyMainApplication() {
const mainApplicationPath = await findMainApplication();
if (!mainApplicationPath) {
console.log('log: Could not find MainApplication.kt');
return;
}
if (mainApplicationPath.endsWith('.java')) {
console.log('log: MainApplication.java is not supported. Please migrate to MainApplication.kt.');
return;
}
const mainApplicationContent = fs.readFileSync(mainApplicationPath, 'utf-8');
const newContent = modifyMainApplicationKt(mainApplicationContent);
fs.writeFileSync(mainApplicationPath, newContent);
console.log('log: Successfully updated MainApplication.kt.');
}
async function findMainApplication() {
const searchPath = path.join(process.cwd(), 'android', 'app', 'src', 'main', 'java');
const files = fs.readdirSync(searchPath, { encoding: 'utf-8', recursive: true });
const mainApplicationFile = files.find(file => file.endsWith('MainApplication.java') || file.endsWith('MainApplication.kt'));
return mainApplicationFile ? path.join(searchPath, mainApplicationFile) : null;
}