@nx/expo
Version:
131 lines (130 loc) • 5.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getExpoDependenciesVersionsToInstall = getExpoDependenciesVersionsToInstall;
exports.isExpoV53 = isExpoV53;
exports.isExpoV54 = isExpoV54;
exports.getInstalledExpoVersion = getInstalledExpoVersion;
exports.getInstalledExpoMajorVersion = getInstalledExpoMajorVersion;
exports.getInstalledExpoVersionFromGraph = getInstalledExpoVersionFromGraph;
const devkit_1 = require("@nx/devkit");
const semver_1 = require("semver");
const versions_1 = require("./versions");
/**
* Get the appropriate dependency versions based on the installed Expo version.
* Returns v53 versions if v53 is detected, otherwise returns v54 (latest).
*/
async function getExpoDependenciesVersionsToInstall(tree) {
const sharedVersions = {
reactNativeSvgTransformer: versions_1.reactNativeSvgTransformerVersion,
reactNativeSvg: versions_1.reactNativeSvgVersion,
testingLibraryReactNative: versions_1.testingLibraryReactNativeVersion,
babelRuntime: versions_1.babelRuntimeVersion,
};
if (await isExpoV53(tree)) {
return {
expo: versions_1.expoV53Version,
expoSplashScreen: versions_1.expoV53SplashScreenVersion,
expoStatusBar: versions_1.expoV53StatusBarVersion,
expoSystemUi: versions_1.expoV53SystemUiVersion,
expoCli: versions_1.expoV53CliVersion,
babelPresetExpo: versions_1.babelPresetExpoV53Version,
expoMetroConfig: versions_1.expoV53MetroConfigVersion,
expoMetroRuntime: versions_1.expoV53MetroRuntimeVersion,
jestExpo: versions_1.jestExpoV53Version,
react: versions_1.reactV53Version,
reactDom: versions_1.reactDomV53Version,
typesReact: versions_1.typesReactV53Version,
reactNative: versions_1.reactNativeV53Version,
metro: versions_1.metroV53Version,
reactNativeWeb: versions_1.reactNativeWebV53Version,
...sharedVersions,
};
}
// Default to v54 (latest)
return {
expo: versions_1.expoV54Version,
expoSplashScreen: versions_1.expoV54SplashScreenVersion,
expoStatusBar: versions_1.expoV54StatusBarVersion,
expoSystemUi: versions_1.expoV54SystemUiVersion,
expoCli: versions_1.expoV54CliVersion,
babelPresetExpo: versions_1.babelPresetExpoV54Version,
expoMetroConfig: versions_1.expoV54MetroConfigVersion,
expoMetroRuntime: versions_1.expoV54MetroRuntimeVersion,
jestExpo: versions_1.jestExpoV54Version,
react: versions_1.reactV54Version,
reactDom: versions_1.reactDomV54Version,
typesReact: versions_1.typesReactV54Version,
reactNative: versions_1.reactNativeV54Version,
metro: versions_1.metroV54Version,
reactNativeWeb: versions_1.reactNativeWebV54Version,
...sharedVersions,
};
}
/**
* Check if the workspace is using Expo v53.
*/
async function isExpoV53(tree) {
let installedExpoVersion = await getInstalledExpoVersionFromGraph();
if (!installedExpoVersion) {
installedExpoVersion = getInstalledExpoVersion(tree);
}
if (!installedExpoVersion) {
return false; // No Expo installed, default to latest
}
return (0, semver_1.major)(installedExpoVersion) === 53;
}
/**
* Check if the workspace is using Expo v54.
*/
async function isExpoV54(tree) {
let installedExpoVersion = await getInstalledExpoVersionFromGraph();
if (!installedExpoVersion) {
installedExpoVersion = getInstalledExpoVersion(tree);
}
if (!installedExpoVersion) {
return true; // No Expo installed, default to latest (v54)
}
return (0, semver_1.major)(installedExpoVersion) === 54;
}
/**
* Get the installed Expo version from package.json.
*/
function getInstalledExpoVersion(tree) {
const installedExpoVersion = (0, devkit_1.getDependencyVersionFromPackageJson)(tree, 'expo');
if (!installedExpoVersion ||
installedExpoVersion === 'latest' ||
installedExpoVersion === 'beta') {
return null;
}
return ((0, semver_1.clean)(installedExpoVersion) ?? (0, semver_1.coerce)(installedExpoVersion)?.version ?? null);
}
/**
* Get the installed Expo major version.
*/
function getInstalledExpoMajorVersion(tree) {
const installedExpoVersion = getInstalledExpoVersion(tree);
if (!installedExpoVersion) {
return undefined;
}
const installedMajor = (0, semver_1.major)(installedExpoVersion);
if (installedMajor !== 53 && installedMajor !== 54) {
return undefined;
}
return installedMajor;
}
/**
* Get the installed Expo version from the project graph.
*/
async function getInstalledExpoVersionFromGraph() {
try {
const graph = await (0, devkit_1.createProjectGraphAsync)();
const expoDep = graph.externalNodes?.['npm:expo'];
if (!expoDep) {
return undefined;
}
return (0, semver_1.clean)(expoDep.data.version) ?? (0, semver_1.coerce)(expoDep.data.version)?.version;
}
catch {
return undefined;
}
}