UNPKG

@nx/expo

Version:

The Expo Plugin for Nx contains executors and generators for managing and developing an expo application within your workspace. For example, you can directly build for different target platforms as well as generate projects and publish your code.

134 lines (133 loc) 5.92 kB
"use strict"; 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; } }