UNPKG

@embrace-io/react-native

Version:
284 lines (283 loc) 11.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeEmbraceFromXcode = exports.removeEmbraceInitializerFileIos = exports.removeEmbraceConfigFileIos = exports.removeEmbraceConfigFileAndroid = exports.removeEmbraceImportAndStartFromFile = exports.removeEmbraceLinkFromFile = void 0; const wizard_1 = require("../util/wizard"); const ios_1 = require("../util/ios"); const android_1 = require("../util/android"); const EmbraceLogger_1 = require("../../src/utils/EmbraceLogger"); const patch_1 = require("./patches/patch"); const ios_2 = require("./ios"); const common_1 = require("./common"); const android_2 = require("./android"); const fs = require("fs"); const glob = require("glob"); const packageJson = require("../../../../../../package.json"); const LOGGER = new EmbraceLogger_1.default(console); const UNINSTALL_ANDROID_GRADLE_PLUGIN_DEPENDENCY = { stepName: "Removing Embrace code in build.gradle", fileName: "android/build.gradle", textsToDelete: [ { ITextToDelete: android_2.androidEmbraceGradlePluginDependencyRE, }, // Also remove the legacy embrace-swazzler classpath from projects set up before the rename { ITextToDelete: android_2.androidEmbraceLegacySwazzler, }, ], findFileFunction: () => (0, android_1.getBuildGradlePatchable)(["android", "build.gradle"]), docUrl: "", }; const UNINSTALL_ANDROID_GRADLE_PLUGIN_APPLY = { stepName: "Removing Embrace code in app/build.gradle", fileName: "app/build.gradle", textsToDelete: [ { ITextToDelete: `${android_2.androidEmbraceGradlePluginApply}\n`, }, // Also remove the legacy embrace-swazzler apply line from projects set up before the rename { ITextToDelete: `${android_2.androidEmbraceLegacySwazzlerApply}\n`, }, ], findFileFunction: () => (0, android_1.getBuildGradlePatchable)(["android", "app", "build.gradle"]), docUrl: "", }; const UNINSTALL_IOS_PODFILE = { stepName: "Removing Embrace code in Podfile", fileName: "Podfile", textsToDelete: [ { ITextToDelete: `${ios_1.EMBR_NATIVE_POD}\n`, }, ], findFileFunction: ios_1.getPodFile, docUrl: "", }; const UNINSTALL_IOS_KSCRASH_PODFILE = { stepName: "Removing KSCrash pod from Podfile", fileName: "Podfile", textsToDelete: [ { ITextToDelete: `${ios_1.EMBR_KSCRASH_MODULAR_HEADER_POD}\n`, }, ], findFileFunction: ios_1.getPodFile, docUrl: "", }; const UNLINK_EMBRACE_CODE = { gradlePluginDependency: UNINSTALL_ANDROID_GRADLE_PLUGIN_DEPENDENCY, gradlePluginApply: UNINSTALL_ANDROID_GRADLE_PLUGIN_APPLY, podFileImport: UNINSTALL_IOS_PODFILE, ksCrashPodImport: UNINSTALL_IOS_KSCRASH_PODFILE, }; const removeEmbraceLinkFromFile = (patch) => { if (UNLINK_EMBRACE_CODE[patch] === undefined) { LOGGER.warn("This language is not supported"); return false; } const { fileName, textsToDelete, findFileFunction } = UNLINK_EMBRACE_CODE[patch]; const file = findFileFunction(); if (!file) { LOGGER.warn("The file to be patched not found"); return false; } const result = textsToDelete.map(item => { const { ITextToDelete } = item; LOGGER.log(`Deleting ${ITextToDelete} from ${fileName}`); file.deleteLine(ITextToDelete); return ITextToDelete; }); const hasToPatch = result.some(item => item); if (hasToPatch) { file.patch(); } return hasToPatch; }; exports.removeEmbraceLinkFromFile = removeEmbraceLinkFromFile; const removeEmbraceImportAndStartFromFile = (patch) => { const definition = patch_1.SUPPORTED_REMOVALS[patch]; if (definition === undefined) { LOGGER.warn("This language is not supported"); return false; } const { fileName, textsToAdd, findFileFunction } = definition; const file = findFileFunction(patch, packageJson.name); if (!file) { LOGGER.warn("The file to be patched not found"); return false; } let hasToPatch = false; textsToAdd.map(item => { const { breakingLine } = item; const textToAdd = (0, patch_1.getText)(item); const toDelete = Array.isArray(textToAdd) ? textToAdd : [textToAdd]; toDelete.forEach(line => { var _a; LOGGER.log(`Deleting ${line} from ${fileName}`); const padding = (_a = file.getPaddingFromString(line)) === null || _a === void 0 ? void 0 : _a.replace(line, ""); const finalTextToDelete = (0, patch_1.getTextToAddWithBreakingLine)(`${padding}${line}`, breakingLine); file.deleteLine(finalTextToDelete); hasToPatch = true; }); }); if (hasToPatch) { file.patch(); } return hasToPatch; }; exports.removeEmbraceImportAndStartFromFile = removeEmbraceImportAndStartFromFile; const removeEmbraceConfigFileAndroid = () => __awaiter(void 0, void 0, void 0, function* () { try { const androidConfigFile = yield (0, android_1.embraceJSON)(); fs.unlinkSync(androidConfigFile.path); } catch (_) { LOGGER.error("Could not find embrace-config.json, Please refer to the docs at https://embrace.io/docs/react-native/integration/add-embrace-sdk/#manually "); } }); exports.removeEmbraceConfigFileAndroid = removeEmbraceConfigFileAndroid; const removeEmbraceConfigFileIos = () => __awaiter(void 0, void 0, void 0, function* () { try { const iosConfigFile = yield (0, ios_1.embracePlistPatchable)(); fs.unlinkSync(iosConfigFile.path); } catch (_) { // Only apps uninstalling from iOS 5.x would have this file so ignore if it's missing } }); exports.removeEmbraceConfigFileIos = removeEmbraceConfigFileIos; const removeEmbraceInitializerFileIos = () => __awaiter(void 0, void 0, void 0, function* () { try { const p = glob.sync("ios/**/EmbraceInitializer.swift")[0]; if (!p) { LOGGER.format("Could not find EmbraceInitializer.swift"); return false; } fs.unlinkSync(p); return true; } catch (_) { return false; } }); exports.removeEmbraceInitializerFileIos = removeEmbraceInitializerFileIos; const removeEmbraceFromXcode = (wizard) => __awaiter(void 0, void 0, void 0, function* () { const name = yield (0, ios_2.getIOSProjectName)(wizard); return new Promise(resolve => { (0, ios_1.xcodePatchable)(name) .then(project => { const bundlePhaseKey = project.findPhase(ios_1.BUNDLE_PHASE_REGEXP); if (!bundlePhaseKey) { LOGGER.error("Could not find bundle phase, Please refer to the docs at https://embrace.io/docs/react-native/integration/upload-symbol-files/"); } const nameWithCaseSensitive = (0, ios_1.findNameWithCaseSensitiveFromPath)(project.path, name); // Plist longer exists on iOS 6.x, keep this step to for 5.x upgrades project.removeResourceFile(nameWithCaseSensitive, `${nameWithCaseSensitive}/Embrace-Info.plist`); project.removeResourceFile(nameWithCaseSensitive, `${nameWithCaseSensitive}/EmbraceInitializer.swift`); project.findAndRemovePhase(ios_1.UPLOAD_SYMBOLS_PHASE); project.modifyPhase(bundlePhaseKey, `${ios_1.MKDIR_SOURCEMAP_DIR}\n${ios_1.EXPORT_SOURCEMAP_RN_VAR}\n`, ""); project.findAndRemovePhase(ios_1.EMBR_RUN_SCRIPT); project.patch(); resolve(project.writeSync()); }) .catch(_r => { LOGGER.error("Could not find bundle phase, Please refer to the docs at https://embrace.io/docs/react-native/integration/upload-symbol-files/"); }); }); }); exports.removeEmbraceFromXcode = removeEmbraceFromXcode; const getRemoveEmbraceFromXcodeStep = () => { return { name: "Removing Embrace in Xcode", run: (wizard) => (0, exports.removeEmbraceFromXcode)(wizard), docURL: "", }; }; const getRemoveEmbraceConfigFileAndroidStep = () => { return { name: "Removing Android Embrace Config File", run: (_wizard) => new Promise(resolve => { resolve((0, exports.removeEmbraceConfigFileAndroid)()); }), docURL: "https://embrace.io/docs/react-native/integration/add-embrace-sdk/#manually", }; }; const getRemoveEmbraceConfigFileIosStep = () => { return { name: "Removing iOS Embrace Config File", run: (_wizard) => new Promise(resolve => { resolve((0, exports.removeEmbraceConfigFileIos)()); }), docURL: "https://embrace.io/docs/react-native/integration/add-embrace-sdk/#manually", }; }; const getRemoveEmbraceInitializerIosStep = () => { return { name: "Removing iOS Embrace Initializer File", run: (_wizard) => new Promise(resolve => { resolve((0, exports.removeEmbraceInitializerFileIos)()); }), docURL: "https://embrace.io/docs/react-native/integration/add-embrace-sdk/#manually", }; }; const getUnlinkFilesStep = () => { return Object.entries(UNLINK_EMBRACE_CODE).map(([key, value]) => ({ name: value.stepName, docURL: value.docUrl, run: (_wizard) => { return new Promise((resolve, reject) => { try { resolve((0, exports.removeEmbraceLinkFromFile)(key)); } catch (e) { reject(e); } }); }, })); }; const getUnlinkImportStartFilesStep = () => { return Object.entries(patch_1.SUPPORTED_REMOVALS).map(([key, value]) => { return { name: (value === null || value === void 0 ? void 0 : value.fileName) ? `Removing Embrace code in ${value === null || value === void 0 ? void 0 : value.fileName}` : "Removing Embrace code", run: (_wizard) => new Promise((resolve, reject) => { try { resolve((0, exports.removeEmbraceImportAndStartFromFile)(key)); } catch (e) { reject(e); } }), docURL: "https://embrace.io/docs/react-native/integration/session-reporting/#starting-embrace-sdk-from-android--ios", }; }); }; const transformUninstalFunctionsToSteps = () => { const steps = getUnlinkFilesStep(); steps.push(...getUnlinkImportStartFilesStep()); steps.push(getRemoveEmbraceConfigFileAndroidStep()); steps.push(getRemoveEmbraceConfigFileIosStep()); // Plist longer exists on iOS 6.x, keep this step to for 5.x upgrades steps.push(getRemoveEmbraceInitializerIosStep()); steps.push(getRemoveEmbraceFromXcodeStep()); return steps; }; const run = () => { const wizard = new wizard_1.default(); // in case the app has a custom name for the iOS project wizard.registerField(common_1.iosProjectFolderName); transformUninstalFunctionsToSteps().forEach(step => wizard.registerStep(step)); wizard.runSteps(); }; run();