1import { Config, Versions } from '@expo/xdl'; 2 3export enum VersionsApiHost { 4 PRODUCTION = 'exp.host', 5 STAGING = 'staging.exp.host', 6} 7 8export type VersionsSchema = { 9 sdkVersions: Record<string, VersionsSdkSchema>; 10 turtleSdkVersions: { 11 android: string; 12 ios: string; 13 }; 14}; 15 16export type VersionsSdkSchema = Partial<{ 17 androidClientUrl: string; 18 androidClientVersion: string; 19 androidExpoViewUrl: string; 20 expokitNpmPackage: string; 21 expoReactNativeTag: string; 22 facebookReactNativeVersion: string; 23 facebookReactVersion: string; 24 iosClientUrl: string; 25 iosClientVersion: string; 26 iosExpoViewUrl: string; 27 packagesToInstallWhenEjecting: Record<string, string>; 28 relatedPackages: Record<string, string>; 29 releaseNoteUrl: string; 30}>; 31 32export async function getVersionsAsync( 33 apiHost: VersionsApiHost = VersionsApiHost.STAGING 34): Promise<VersionsSchema> { 35 return await runWithApiHost(apiHost, () => Versions.versionsAsync() as Promise<VersionsSchema>); 36} 37 38export async function getSdkVersionsAsync( 39 sdkVersion: string, 40 apiHost: VersionsApiHost = VersionsApiHost.STAGING 41): Promise<VersionsSdkSchema | null> { 42 const versions = await getVersionsAsync(apiHost); 43 return versions?.sdkVersions?.[sdkVersion] ?? null; 44} 45 46export async function setVersionsAsync( 47 versions: VersionsSchema, 48 apiHost: VersionsApiHost = VersionsApiHost.STAGING 49): Promise<void> { 50 return await runWithApiHost(apiHost, () => Versions.setVersionsAsync(versions)); 51} 52 53export async function modifySdkVersionsAsync( 54 sdkVersion: string, 55 modifier: (sdkVersions: VersionsSdkSchema) => VersionsSdkSchema | Promise<VersionsSdkSchema> 56): Promise<VersionsSdkSchema> { 57 const versions = await getVersionsAsync(); 58 const sdkVersions = await modifier(versions.sdkVersions[sdkVersion] ?? {}); 59 60 versions.sdkVersions[sdkVersion] = sdkVersions; 61 await setVersionsAsync(versions); 62 return sdkVersions; 63} 64 65async function runWithApiHost<T = any>( 66 apiHost: VersionsApiHost, 67 lambda: () => T | Promise<T> 68): Promise<T> { 69 const originalHost = Config.api.host; 70 Config.api.host = apiHost; 71 const result = await lambda(); 72 Config.api.host = originalHost; 73 return result; 74} 75