xref: /expo/tools/src/Versions.ts (revision eeffdb10)
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