react-native-test-app
Version:
react-native-test-app provides a test app for all supported platforms as a package
115 lines (104 loc) • 3.83 kB
JavaScript
// @ts-check
;
/**
* This script (and its dependencies) currently cannot be converted to ESM
* because it is consumed in `react-native.config.js`.
*/
const nodefs = require("node:fs");
const path = require("node:path");
const tty = require("node:tty");
const {
getPackageVersion,
readTextFile,
toVersionNumber,
v,
} = require("../scripts/helpers");
// Maximum value of a 32-bit integer (to ensure compatibility across language
// boundaries)
const INT_MAX = 2 ** 31 - 1;
/**
* This table is also used by `android/utils.gradle`!
*
* We have two implementations because there are currently two ways to build the
* Android app. If built via `@react-native-community/cli`, this script will be
* run and we can change Gradle version before it is executed. If it's built
* with Gradle directly, it's already too late and the best we can do is to warn
* the user.
*
* Gradle version can be found in the template:
* https://github.com/react-native-community/template/blob/main/template/android/gradle/wrapper/gradle-wrapper.properties
*
* @type {[number, [number, string], [number, string]][]}
*/
const GRADLE_VERSIONS = [
[v(0, 80, 0), [v(8, 14, 3), "8.14.3"], [INT_MAX, ""]], // 0.80: [8.14.3, *)
[v(0, 79, 0), [v(8, 13, 0), "8.13"], [INT_MAX, ""]], // 0.79: [8.13, *)
[v(0, 78, 0), [v(8, 12, 0), "8.12"], [INT_MAX, ""]], // 0.78: [8.12, *)
[v(0, 76, 0), [v(8, 11, 1), "8.11.1"], [INT_MAX, ""]], // 0.76: [8.11.1, *)
[v(0, 75, 0), [v(8, 8, 0), "8.8"], [v(8, 9, 0), "8.8"]], // 0.75: [8.8, 8.9)
[v(0, 74, 0), [v(8, 6, 0), "8.6"], [v(8, 9, 0), "8.8"]], // 0.74: [8.6, 8.9)
[v(0, 73, 0), [v(8, 3, 0), "8.3"], [v(8, 9, 0), "8.8"]], // 0.73: [8.3, 8.9)
[v(0, 72, 0), [v(8, 1, 1), "8.1.1"], [v(8, 3, 0), "8.2.1"]], // 0.72: [8.1.1, 8.3)
[0, [v(7, 5, 1), "7.6.4"], [v(8, 0, 0), "7.6.4"]], // <0.72: [7.5.1, 8.0.0)
];
/**
* Configures Gradle wrapper as necessary before the Android app is built.
* @param {string} sourceDir
*/
function configureGradleWrapper(sourceDir, fs = nodefs) {
const androidCommands = ["build-android", "run-android"];
if (
process.env["RNTA_CONFIGURE_GRADLE_WRAPPER"] === "0" ||
(process.argv.length > 1 && // Allow this script to be called directly
!process.argv.some((arg) => androidCommands.includes(arg)))
) {
return;
}
const gradleWrapperProperties = path.join(
sourceDir,
"gradle",
"wrapper",
"gradle-wrapper.properties"
);
if (!fs.existsSync(gradleWrapperProperties)) {
return;
}
const tag = tty.WriteStream.prototype.hasColors()
? "\u001B[33m\u001B[1mwarn\u001B[22m\u001B[39m"
: "warn";
try {
const props = readTextFile(gradleWrapperProperties, fs);
const re = /gradle-([.0-9]*?)-.*?\.zip/;
const m = props.match(re);
if (!m) {
return;
}
const gradleVersion = (() => {
const gradleVersion = toVersionNumber(m[1]);
const versionStr = getPackageVersion("react-native", sourceDir, fs);
const version = toVersionNumber(versionStr);
for (const [rnVersion, lower, upper] of GRADLE_VERSIONS) {
if (version >= rnVersion) {
if (gradleVersion < lower[0]) {
return lower[1];
} else if (gradleVersion >= upper[0]) {
return upper[1];
}
return undefined;
}
}
throw new Error(`Unsupported React Native version: ${version}`);
})();
if (gradleVersion) {
console.warn(tag, `Setting Gradle version ${gradleVersion}`);
fs.writeFileSync(
gradleWrapperProperties,
props.replace(re, `gradle-${gradleVersion}-bin.zip`)
);
}
} catch (_) {
console.warn(tag, "Failed to determine Gradle version");
}
}
exports.GRADLE_VERSIONS = GRADLE_VERSIONS;
exports.configureGradleWrapper = configureGradleWrapper;