expo-updates
Version:
Fetches and manages remotely-hosted assets and updates to your app's JS bundle.
60 lines (51 loc) • 2.2 kB
text/typescript
import { getConfig } from 'expo/config';
import { Updates } from 'expo/config-plugins';
import * as Fingerprint from 'expo/fingerprint';
import { createFingerprintAsync } from './createFingerprintAsync';
import { Workflow, resolveWorkflowAsync } from './workflow';
export async function resolveRuntimeVersionAsync(
projectRoot: string,
platform: 'ios' | 'android',
fingerprintOptions: Fingerprint.Options,
otherOptions: { workflowOverride?: Workflow }
): Promise<{
runtimeVersion: string | null;
fingerprintSources: Fingerprint.FingerprintSource[] | null;
workflow: 'managed' | 'generic';
}> {
const { exp: config } = getConfig(projectRoot, {
isPublicConfig: true,
skipSDKVersionRequirement: true,
});
const workflow =
otherOptions.workflowOverride ?? (await resolveWorkflowAsync(projectRoot, platform));
const runtimeVersion = config[platform]?.runtimeVersion ?? config.runtimeVersion;
if (!runtimeVersion || typeof runtimeVersion === 'string') {
return { runtimeVersion: runtimeVersion ?? null, fingerprintSources: null, workflow };
}
if (typeof runtimeVersion !== 'object' || Array.isArray(runtimeVersion)) {
throw new Error(
`Invalid runtime version: ${JSON.stringify(runtimeVersion)}. Expected a string or an object with a "policy" key. https://docs.expo.dev/eas-update/runtime-versions`
);
}
const policy = runtimeVersion.policy;
if (policy === 'fingerprint') {
const fingerprint = await createFingerprintAsync(
projectRoot,
platform,
workflow,
fingerprintOptions
);
return { runtimeVersion: fingerprint.hash, fingerprintSources: fingerprint.sources, workflow };
}
if (workflow !== 'managed') {
throw new Error(
`You're currently using the bare workflow, where runtime version policies are not supported. You must set your runtime version manually. For example, define your runtime version as "1.0.0", not {"policy": "appVersion"} in your app config. https://docs.expo.dev/eas-update/runtime-versions`
);
}
return {
runtimeVersion: await Updates.resolveRuntimeVersionPolicyAsync(policy, config, platform),
fingerprintSources: null,
workflow,
};
}