@nx/expo
Version:
134 lines (133 loc) • 5.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getExpoDependenciesVersionsToInstall = getExpoDependenciesVersionsToInstall;
exports.isExpoV53 = isExpoV53;
exports.getInstalledExpoVersion = getInstalledExpoVersion;
exports.getInstalledExpoVersionFromGraph = getInstalledExpoVersionFromGraph;
const devkit_1 = require("@nx/devkit");
const semver_1 = require("semver");
const versions_1 = require("./versions");
// Version-independent deps shared by every Expo lane.
const sharedVersions = {
reactNativeSvgTransformer: versions_1.reactNativeSvgTransformerVersion,
reactNativeSvg: versions_1.reactNativeSvgVersion,
testingLibraryReactNative: versions_1.testingLibraryReactNativeVersion,
babelRuntime: versions_1.babelRuntimeVersion,
};
// Per-major Expo install lanes. 55 is the latest/default; 53 and 54 are kept
// for existing workspaces. Anything outside this window routes to 55 — the
// below-floor throw is assertSupportedExpoVersion's job, not the router's.
const expoVersionsByMajor = {
53: {
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,
reactTestRenderer: versions_1.reactTestRendererV53Version,
...sharedVersions,
},
54: {
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,
reactTestRenderer: versions_1.reactTestRendererV54Version,
...sharedVersions,
},
55: {
expo: versions_1.expoV55Version,
expoSplashScreen: versions_1.expoV55SplashScreenVersion,
expoStatusBar: versions_1.expoV55StatusBarVersion,
expoSystemUi: versions_1.expoV55SystemUiVersion,
expoCli: versions_1.expoV55CliVersion,
babelPresetExpo: versions_1.babelPresetExpoV55Version,
expoMetroConfig: versions_1.expoV55MetroConfigVersion,
expoMetroRuntime: versions_1.expoV55MetroRuntimeVersion,
jestExpo: versions_1.jestExpoV55Version,
react: versions_1.reactV55Version,
reactDom: versions_1.reactDomV55Version,
typesReact: versions_1.typesReactV55Version,
reactNative: versions_1.reactNativeV55Version,
metro: versions_1.metroV55Version,
reactNativeWeb: versions_1.reactNativeWebV55Version,
reactTestRenderer: versions_1.reactTestRendererV55Version,
...sharedVersions,
},
};
/**
* Get the appropriate dependency versions based on the installed Expo version.
* Returns v53 or v54 versions when those are detected, otherwise v55 (latest).
*/
async function getExpoDependenciesVersionsToInstall(tree) {
const installedMajor = await getInstalledExpoMajor(tree);
if (installedMajor === 53 || installedMajor === 54) {
return expoVersionsByMajor[installedMajor];
}
return expoVersionsByMajor[55];
}
/**
* Resolve the installed Expo major version. Prefers the resolved version from
* the project graph, falling back to the declared package.json version.
* Returns null when Expo isn't installed.
*/
async function getInstalledExpoMajor(tree) {
const installedExpoVersion = (await getInstalledExpoVersionFromGraph()) ?? getInstalledExpoVersion(tree);
return installedExpoVersion ? (0, semver_1.major)(installedExpoVersion) : null;
}
/**
* Check if the workspace is using Expo v53 — the only SDK that still needs the
* legacy Jest resolver. SDK 54+ use the winter-runtime mock instead.
*/
async function isExpoV53(tree) {
return (await getInstalledExpoMajor(tree)) === 53;
}
/**
* 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 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;
}
}