import { Config, Versions } from '@expo/xdl'; export enum VersionsApiHost { PRODUCTION = 'exp.host', STAGING = 'staging.exp.host', } export type VersionsSchema = { sdkVersions: Record; turtleSdkVersions: { android: string; ios: string; }; }; export type VersionsSdkSchema = Partial<{ androidClientUrl: string; androidClientVersion: string; androidExpoViewUrl: string; expokitNpmPackage: string; expoReactNativeTag: string; facebookReactNativeVersion: string; facebookReactVersion: string; iosClientUrl: string; iosClientVersion: string; iosExpoViewUrl: string; packagesToInstallWhenEjecting: Record; relatedPackages: Record; releaseNoteUrl: string; }>; export async function getVersionsAsync( apiHost: VersionsApiHost = VersionsApiHost.STAGING ): Promise { return await runWithApiHost(apiHost, () => Versions.versionsAsync() as Promise); } export async function getSdkVersionsAsync( sdkVersion: string, apiHost: VersionsApiHost = VersionsApiHost.STAGING ): Promise { const versions = await getVersionsAsync(apiHost); return versions?.sdkVersions?.[sdkVersion] ?? null; } export async function setVersionsAsync( versions: VersionsSchema, apiHost: VersionsApiHost = VersionsApiHost.STAGING ): Promise { return await runWithApiHost(apiHost, () => Versions.setVersionsAsync(versions)); } export async function modifySdkVersionsAsync( sdkVersion: string, modifier: (sdkVersions: VersionsSdkSchema) => VersionsSdkSchema | Promise ): Promise { const versions = await getVersionsAsync(); const sdkVersions = await modifier(versions.sdkVersions[sdkVersion] ?? {}); versions.sdkVersions[sdkVersion] = sdkVersions; await setVersionsAsync(versions); return sdkVersions; } async function runWithApiHost( apiHost: VersionsApiHost, lambda: () => T | Promise ): Promise { const originalHost = Config.api.host; Config.api.host = apiHost; const result = await lambda(); Config.api.host = originalHost; return result; }