@dynatrace/react-native-plugin
Version:
This plugin gives you the ability to use the Dynatrace Mobile agent in your react native application.
153 lines (152 loc) • 8.13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ensureRuntimeScriptApplied = exports.copyGradleConfigFile = exports.writeGradleConfig = exports.instrumentAndroidPlatform = exports.GRADLE_APPLY_RUNTIME_SCRIPT = exports.GRADLE_APPLY_BUILDSCRIPT = exports.GRADLE_DYNATRACE_FILE = void 0;
const path_1 = require("path");
const Logger_1 = require("./Logger");
const FileOperationHelper_1 = require("./FileOperationHelper");
const PathsConstants_1 = require("./PathsConstants");
const GRADLE_CONFIG_IDENTIFIER = '// AUTO - INSERTED';
exports.GRADLE_DYNATRACE_FILE = `apply from: "./${PathsConstants_1.DYNATRACE_CONFIG_GRADLE_FILE}"`;
const GRADLE_BUILDSCRIPT_IDENTIFIER = 'buildscript';
exports.GRADLE_APPLY_BUILDSCRIPT = 'apply from: "../node_modules/@dynatrace/react-native-plugin/files/plugin.gradle", to: buildscript';
const GRADLE_REACT_NATIVE_PLUGIN = 'apply plugin: "com.facebook.react.rootproject"';
exports.GRADLE_APPLY_RUNTIME_SCRIPT = 'apply from: "../../node_modules/@dynatrace/react-native-plugin/files/plugin-runtime.gradle"';
const instrumentAndroidPlatform = (pathToGradle, remove) => {
const path = FileOperationHelper_1.default.checkIfFileExistsSync(pathToGradle);
if (!path.endsWith('.gradle')) {
throw new Error("Can't find .gradle file. gradle path must also include the gradle file!");
}
changeReactNativeBuildGradleFile(path, remove);
};
exports.instrumentAndroidPlatform = instrumentAndroidPlatform;
const removeOldDynatraceClasspath = (gradleFileContent) => {
const gradleFileContentLines = gradleFileContent.split('\n');
for (let i = 0; i < gradleFileContentLines.length; i++) {
if (gradleFileContentLines[i].indexOf('com.dynatrace.tools') > -1) {
gradleFileContentLines.splice(i, 1);
Logger_1.default.logMessageSync('Removed old Dynatrace classpath from build.gradle', Logger_1.default.INFO);
break;
}
}
return gradleFileContentLines.join('\n');
};
const changeReactNativeBuildGradleFile = (pathToGradle, remove) => {
const gradleFileContent = FileOperationHelper_1.default.readTextFromFileSync(pathToGradle);
const modifiedFileContent = removeOldDynatraceClasspath(gradleFileContent);
const gradleFileContentLines = modifiedFileContent.split('\n');
let gradlePluginFileIndex = -1;
let gradleDynatraceFileIndex = -1;
for (let i = 0; i < gradleFileContentLines.length && (gradleDynatraceFileIndex === -1 || gradlePluginFileIndex === -1); i++) {
if (gradleFileContentLines[i].indexOf('plugin.gradle') > -1) {
gradlePluginFileIndex = i;
}
else if (gradleFileContentLines[i].indexOf(PathsConstants_1.DYNATRACE_CONFIG_GRADLE_FILE) > -1) {
gradleDynatraceFileIndex = i;
}
}
let modified = false;
if (remove) {
if (gradlePluginFileIndex !== -1) {
gradleFileContentLines.splice(gradlePluginFileIndex, 1);
modified = true;
}
if (gradleDynatraceFileIndex !== -1) {
gradleFileContentLines.splice(gradleDynatraceFileIndex - (modified ? 1 : 0), 1);
modified = true;
}
if (modified) {
Logger_1.default.logMessageSync('Removed Dynatrace modifications from build.gradle: ' + pathToGradle, Logger_1.default.INFO);
}
}
else {
if (gradlePluginFileIndex === -1) {
let gradleFileReactIndex = -1;
for (let i = 0; i < gradleFileContentLines.length; i++) {
if (gradleFileContentLines[i].startsWith(GRADLE_BUILDSCRIPT_IDENTIFIER)) {
gradleFileReactIndex = i;
break;
}
}
if (gradleFileReactIndex === -1) {
throw new Error('Could not find Buildscript block in build.gradle.');
}
gradleFileContentLines.splice(gradleFileReactIndex + 1, 0, exports.GRADLE_APPLY_BUILDSCRIPT);
modified = true;
}
if (gradleDynatraceFileIndex === -1) {
let pluginLineIndex = -1;
for (let i = 0; i < gradleFileContentLines.length; i++) {
if (gradleFileContentLines[i].includes(GRADLE_REACT_NATIVE_PLUGIN)) {
pluginLineIndex = i;
break;
}
}
gradleFileContentLines.splice(pluginLineIndex !== -1 ? pluginLineIndex : gradleFileContentLines.length, 0, exports.GRADLE_DYNATRACE_FILE);
modified = true;
}
if (modified) {
Logger_1.default.logMessageSync('Added Dynatrace plugin.gradle to the build.gradle: ' + pathToGradle, Logger_1.default.INFO);
}
else {
Logger_1.default.logMessageSync('Dynatrace plugin & agent already added to build.gradle', Logger_1.default.INFO);
}
}
if (modified) {
const fullGradleFile = gradleFileContentLines.join('\n');
FileOperationHelper_1.default.writeTextToFileSync(pathToGradle, fullGradleFile);
}
};
const writeGradleConfig = (androidConfig) => {
if (androidConfig === undefined || androidConfig.config === undefined) {
Logger_1.default.logMessageSync("Can't write configuration of Android agent because it is missing!", Logger_1.default.WARNING);
return;
}
const gradleFileContent = FileOperationHelper_1.default.readTextFromFileSync(PathsConstants_1.default.getDynatraceGradleFile());
const gradleFileContentLines = removeOldGradleConfig(gradleFileContent);
let gradleFileIndex = -1;
for (let i = 0; i < gradleFileContentLines.length; i++) {
if (gradleFileContentLines[i].indexOf(GRADLE_CONFIG_IDENTIFIER) > -1) {
gradleFileIndex = i;
break;
}
}
gradleFileContentLines.splice(gradleFileIndex + 1, 0, androidConfig.config);
const fullGradleFile = gradleFileContentLines.join('\n');
FileOperationHelper_1.default.writeTextToFileSync(PathsConstants_1.default.getDynatraceGradleFile(), fullGradleFile);
Logger_1.default.logMessageSync(`Replaced old configuration with current configuration in ${PathsConstants_1.DYNATRACE_CONFIG_GRADLE_FILE}`, Logger_1.default.INFO);
};
exports.writeGradleConfig = writeGradleConfig;
const copyGradleConfigFile = (pathToGradle) => {
const gradleDirectory = (0, path_1.dirname)(pathToGradle);
FileOperationHelper_1.default.copyFileSync(PathsConstants_1.default.getDynatraceGradleFile(), (0, path_1.join)(gradleDirectory, PathsConstants_1.DYNATRACE_CONFIG_GRADLE_FILE));
};
exports.copyGradleConfigFile = copyGradleConfigFile;
const removeOldGradleConfig = (gradleFileContent) => {
const gradleFileContentLines = gradleFileContent.split('\n');
const gradleConfigIndex = [];
for (let i = 0; i < gradleFileContentLines.length && gradleConfigIndex.length < 2; i++) {
if (gradleFileContentLines[i].indexOf(GRADLE_CONFIG_IDENTIFIER) > -1) {
gradleConfigIndex.push(i);
}
}
if (gradleConfigIndex.length !== 2) {
throw new Error('Could not find identfier in internal gradle file. Please re-install.');
}
gradleFileContentLines.splice(gradleConfigIndex[0] + 1, gradleConfigIndex[1] - (gradleConfigIndex[0] + 1));
return gradleFileContentLines;
};
const ensureRuntimeScriptApplied = (pathToGradle) => {
const gradleContent = FileOperationHelper_1.default.readTextFromFileSync(pathToGradle);
const gradleLines = gradleContent.split('\n');
const alreadyApplied = gradleLines.some((line) => line.includes(exports.GRADLE_APPLY_RUNTIME_SCRIPT));
if (!alreadyApplied) {
gradleLines.push(exports.GRADLE_APPLY_RUNTIME_SCRIPT);
FileOperationHelper_1.default.writeTextToFileSync(pathToGradle, gradleLines.join('\n'));
Logger_1.default.logMessageSync(`Added runtime script to ${pathToGradle}`, Logger_1.default.INFO);
}
else {
Logger_1.default.logMessageSync(`Runtime script already present in ${pathToGradle}`, Logger_1.default.INFO);
}
};
exports.ensureRuntimeScriptApplied = ensureRuntimeScriptApplied;