@embrace-io/react-native
Version:
A React Native wrapper for the Embrace SDK
284 lines (283 loc) • 11.9 kB
JavaScript
;
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();